|
Packit Service |
87a54e |
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
Packit |
5756e2 |
/*
|
|
Packit |
5756e2 |
* Copyright (C) 2018 Red Hat, Inc.
|
|
Packit |
5756e2 |
*/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#include "nm-default.h"
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#include "nm-device-wifi-p2p.h"
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#include <sys/socket.h>
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#include "supplicant/nm-supplicant-manager.h"
|
|
Packit |
5756e2 |
#include "supplicant/nm-supplicant-interface.h"
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#include "NetworkManagerUtils.h"
|
|
Packit |
5756e2 |
#include "devices/nm-device-private.h"
|
|
Packit |
5756e2 |
#include "nm-act-request.h"
|
|
Packit |
5756e2 |
#include "nm-core-internal.h"
|
|
Packit |
5756e2 |
#include "nm-glib-aux/nm-ref-string.h"
|
|
Packit |
5756e2 |
#include "nm-ip4-config.h"
|
|
Packit |
5756e2 |
#include "nm-manager.h"
|
|
Packit |
5756e2 |
#include "nm-manager.h"
|
|
Packit |
5756e2 |
#include "nm-setting-wifi-p2p.h"
|
|
Packit |
5756e2 |
#include "nm-utils.h"
|
|
Packit |
5756e2 |
#include "nm-wifi-p2p-peer.h"
|
|
Packit |
5756e2 |
#include "platform/nm-platform.h"
|
|
Packit |
5756e2 |
#include "platform/nmp-object.h"
|
|
Packit |
5756e2 |
#include "settings/nm-settings.h"
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
#define _NMLOG_DEVICE_TYPE NMDeviceWifiP2P
|
|
Packit |
5756e2 |
#include "devices/nm-device-logging.h"
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
NM_GOBJECT_PROPERTIES_DEFINE(NMDeviceWifiP2P, PROP_PEERS, );
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
typedef struct {
|
|
Packit Service |
a1bd4f |
NMSupplicantManager *sup_mgr;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* NOTE: In theory management and group ifaces could be identical. However,
|
|
Packit Service |
a1bd4f |
* in practice, this cannot happen currently as NMDeviceWifiP2P is only
|
|
Packit Service |
a1bd4f |
* created for existing non-P2P interfaces.
|
|
Packit Service |
a1bd4f |
* (i.e. a single standalone P2P interface is not supported at this point)
|
|
Packit Service |
a1bd4f |
*/
|
|
Packit Service |
a1bd4f |
NMSupplicantInterface *mgmt_iface;
|
|
Packit Service |
a1bd4f |
NMSupplicantInterface *group_iface;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
CList peers_lst_head;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
guint find_peer_timeout_id;
|
|
Packit Service |
a1bd4f |
guint sup_timeout_id;
|
|
Packit Service |
a1bd4f |
guint peer_dump_id;
|
|
Packit Service |
a1bd4f |
guint peer_missing_id;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
bool is_waiting_for_supplicant : 1;
|
|
Packit |
5756e2 |
} NMDeviceWifiP2PPrivate;
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
struct _NMDeviceWifiP2P {
|
|
Packit Service |
a1bd4f |
NMDevice parent;
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate _priv;
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
struct _NMDeviceWifiP2PClass {
|
|
Packit Service |
a1bd4f |
NMDeviceClass parent;
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
G_DEFINE_TYPE(NMDeviceWifiP2P, nm_device_wifi_p2p, NM_TYPE_DEVICE)
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
#define NM_DEVICE_WIFI_P2P_GET_PRIVATE(self) \
|
|
Packit Service |
a1bd4f |
_NM_GET_PRIVATE(self, NMDeviceWifiP2P, NM_IS_DEVICE_WIFI_P2P, NMDevice)
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static const NMDBusInterfaceInfoExtended interface_info_device_wifi_p2p;
|
|
Packit Service |
a1bd4f |
static const GDBusSignalInfo nm_signal_info_wifi_p2p_peer_added;
|
|
Packit Service |
a1bd4f |
static const GDBusSignalInfo nm_signal_info_wifi_p2p_peer_removed;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
static void supplicant_group_interface_release(NMDeviceWifiP2P *self);
|
|
Packit Service |
a1bd4f |
static void supplicant_interfaces_release(NMDeviceWifiP2P *self, gboolean set_is_waiting);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
_peer_dump(NMDeviceWifiP2P * self,
|
|
Packit Service |
a1bd4f |
NMLogLevel log_level,
|
|
Packit Service |
a1bd4f |
const NMWifiP2PPeer *peer,
|
|
Packit Service |
a1bd4f |
const char * prefix,
|
|
Packit Service |
a1bd4f |
gint32 now_s)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
char buf[1024];
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_NMLOG(log_level,
|
|
Packit Service |
a1bd4f |
LOGD_WIFI_SCAN,
|
|
Packit Service |
a1bd4f |
"wifi-peer: %-7s %s",
|
|
Packit Service |
a1bd4f |
prefix,
|
|
Packit Service |
a1bd4f |
nm_wifi_p2p_peer_to_string(peer, buf, sizeof(buf), now_s));
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
peer_list_dump(gpointer user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->peer_dump_id = 0;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (_LOGD_ENABLED(LOGD_WIFI_SCAN)) {
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer *peer;
|
|
Packit Service |
a1bd4f |
gint32 now_s = nm_utils_get_monotonic_timestamp_sec();
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_WIFI_SCAN, "P2P Peers: [now:%u]", now_s);
|
|
Packit Service |
a1bd4f |
c_list_for_each_entry (peer, &priv->peers_lst_head, peers_lst)
|
|
Packit Service |
a1bd4f |
_peer_dump(self, LOGL_DEBUG, peer, "dump", now_s);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
return G_SOURCE_REMOVE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
schedule_peer_list_dump(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!priv->peer_dump_id && _LOGD_ENABLED(LOGD_WIFI_SCAN))
|
|
Packit Service |
a1bd4f |
priv->peer_dump_id = g_timeout_add_seconds(1, peer_list_dump, self);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(NMDeviceWifiP2P *self, gboolean is_waiting)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (priv->is_waiting_for_supplicant == (!!is_waiting))
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->is_waiting_for_supplicant = is_waiting;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (is_waiting)
|
|
Packit Service |
a1bd4f |
nm_device_add_pending_action(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
NM_PENDING_ACTION_WAITING_FOR_SUPPLICANT,
|
|
Packit Service |
a1bd4f |
TRUE);
|
|
Packit Service |
a1bd4f |
else
|
|
Packit Service |
a1bd4f |
nm_device_remove_pending_action(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
NM_PENDING_ACTION_WAITING_FOR_SUPPLICANT,
|
|
Packit Service |
a1bd4f |
TRUE);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
check_connection_peer_joined(NMDeviceWifiP2P *device)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(device);
|
|
Packit Service |
a1bd4f |
NMConnection * conn = nm_device_get_applied_connection(NM_DEVICE(device));
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer;
|
|
Packit Service |
a1bd4f |
const char * group;
|
|
Packit Service |
a1bd4f |
const char *const * groups;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (!conn || !priv->group_iface)
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* Comparing the object path found on the group_iface with the peers
|
|
Packit Service |
a1bd4f |
* found on the mgmt_iface is legal. */
|
|
Packit Service |
a1bd4f |
group = nm_supplicant_interface_get_p2p_group_path(priv->group_iface);
|
|
Packit Service |
a1bd4f |
if (!group)
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* NOTE: We currently only support connections to a specific peer */
|
|
Packit Service |
a1bd4f |
peer = nm_wifi_p2p_peers_find_first_compatible(&priv->peers_lst_head, conn);
|
|
Packit Service |
a1bd4f |
if (!peer)
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
groups = nm_wifi_p2p_peer_get_groups(peer);
|
|
Packit Service |
a1bd4f |
if (!groups || !g_strv_contains(groups, group))
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
return TRUE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
disconnect_on_connection_peer_missing_cb(gpointer user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDevice * device = NM_DEVICE(user_data);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_LOGW(LOGD_WIFI, "Peer requested in connection is missing for too long, failing connection.");
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->peer_missing_id = 0;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_device_state_changed(device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_PEER_NOT_FOUND);
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
update_disconnect_on_connection_peer_missing(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
NMDeviceState state;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
state = nm_device_get_state(NM_DEVICE(self));
|
|
Packit Service |
a1bd4f |
if (state < NM_DEVICE_STATE_IP_CONFIG || state > NM_DEVICE_STATE_ACTIVATED) {
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->peer_missing_id);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (check_connection_peer_joined(self)) {
|
|
Packit Service |
a1bd4f |
if (nm_clear_g_source(&priv->peer_missing_id))
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_WIFI, "Peer requested in connection is joined, removing timeout");
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (priv->peer_missing_id == 0) {
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_WIFI, "Peer requested in connection is missing, adding timeout");
|
|
Packit Service |
a1bd4f |
priv->peer_missing_id =
|
|
Packit Service |
a1bd4f |
g_timeout_add_seconds(5, disconnect_on_connection_peer_missing_cb, self);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
is_available(NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate * priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
NMSupplicantInterfaceState supplicant_state;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!priv->mgmt_iface)
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_state = nm_supplicant_interface_get_state(priv->mgmt_iface);
|
|
Packit Service |
a1bd4f |
return nm_supplicant_interface_state_is_operational(supplicant_state);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
check_connection_compatible(NMDevice *device, NMConnection *connection, GError **error)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
if (!NM_DEVICE_CLASS(nm_device_wifi_p2p_parent_class)
|
|
Packit Service |
a1bd4f |
->check_connection_compatible(device, connection, error))
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* TODO: Allow limitting the interface using the HW-address? */
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* We don't need to check anything else here. The P2P device will only
|
|
Packit Service |
a1bd4f |
* exists if we are able to establish a P2P connection, and there should
|
|
Packit Service |
a1bd4f |
* be no further restrictions necessary.
|
|
Packit Service |
a1bd4f |
*/
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
return TRUE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
complete_connection(NMDevice * device,
|
|
Packit Service |
a1bd4f |
NMConnection * connection,
|
|
Packit Service |
a1bd4f |
const char * specific_object,
|
|
Packit Service |
a1bd4f |
NMConnection *const *existing_connections,
|
|
Packit Service |
a1bd4f |
GError ** error)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
gs_free char * setting_name = NULL;
|
|
Packit Service |
a1bd4f |
NMSettingWifiP2P *s_wifi_p2p;
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer;
|
|
Packit Service |
a1bd4f |
const char * setting_peer;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
s_wifi_p2p =
|
|
Packit Service |
a1bd4f |
NM_SETTING_WIFI_P2P(nm_connection_get_setting(connection, NM_TYPE_SETTING_WIFI_P2P));
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (!specific_object) {
|
|
Packit Service |
a1bd4f |
/* If not given a specific object, we need at minimum a peer address */
|
|
Packit Service |
a1bd4f |
if (!s_wifi_p2p) {
|
|
Packit Service |
a1bd4f |
g_set_error(error,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_INVALID_CONNECTION,
|
|
Packit Service |
a1bd4f |
"A '%s' setting is required if no Peer path was given",
|
|
Packit Service |
a1bd4f |
NM_SETTING_WIFI_P2P_SETTING_NAME);
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
setting_peer = nm_setting_wifi_p2p_get_peer(s_wifi_p2p);
|
|
Packit Service |
a1bd4f |
if (!setting_peer) {
|
|
Packit Service |
a1bd4f |
g_set_error(error,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_INVALID_CONNECTION,
|
|
Packit Service |
a1bd4f |
"A '%s' setting with a valid Peer is required if no Peer path was given",
|
|
Packit Service |
a1bd4f |
NM_SETTING_WIFI_P2P_SETTING_NAME);
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
} else {
|
|
Packit Service |
a1bd4f |
peer = nm_wifi_p2p_peer_lookup_for_device(NM_DEVICE(self), specific_object);
|
|
Packit Service |
a1bd4f |
if (!peer) {
|
|
Packit Service |
a1bd4f |
g_set_error(error,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_SPECIFIC_OBJECT_NOT_FOUND,
|
|
Packit Service |
a1bd4f |
"The P2P peer %s is unknown",
|
|
Packit Service |
a1bd4f |
specific_object);
|
|
Packit Service |
a1bd4f |
return FALSE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
setting_peer = nm_wifi_p2p_peer_get_address(peer);
|
|
Packit Service |
a1bd4f |
g_return_val_if_fail(setting_peer, FALSE);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* Add a Wi-Fi P2P setting if one doesn't exist yet */
|
|
Packit Service |
a1bd4f |
if (!s_wifi_p2p) {
|
|
Packit Service |
a1bd4f |
s_wifi_p2p = NM_SETTING_WIFI_P2P(nm_setting_wifi_p2p_new());
|
|
Packit Service |
a1bd4f |
nm_connection_add_setting(connection, NM_SETTING(s_wifi_p2p));
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
g_object_set(G_OBJECT(s_wifi_p2p), NM_SETTING_WIFI_P2P_PEER, setting_peer, NULL);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
setting_name = g_strdup_printf("Wi-Fi P2P Peer %s", setting_peer);
|
|
Packit Service |
a1bd4f |
nm_utils_complete_generic(nm_device_get_platform(device),
|
|
Packit Service |
a1bd4f |
connection,
|
|
Packit Service |
a1bd4f |
NM_SETTING_WIFI_P2P_SETTING_NAME,
|
|
Packit Service |
a1bd4f |
existing_connections,
|
|
Packit Service |
a1bd4f |
setting_name,
|
|
Packit Service |
a1bd4f |
setting_name,
|
|
Packit Service |
a1bd4f |
NULL,
|
|
Packit Service |
a1bd4f |
NULL,
|
|
Packit Service |
a1bd4f |
TRUE);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
return TRUE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*
|
|
Packit |
5756e2 |
* supplicant_find_timeout_cb
|
|
Packit |
5756e2 |
*
|
|
Packit |
5756e2 |
* Called when the supplicant has been unable to find the peer we want to connect to.
|
|
Packit |
5756e2 |
*/
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
supplicant_find_timeout_cb(gpointer user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDevice * device = NM_DEVICE(user_data);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->find_peer_timeout_id = 0;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_cancel_connect(priv->mgmt_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (nm_device_is_activating(device)) {
|
|
Packit Service |
a1bd4f |
_LOGW(LOGD_DEVICE | LOGD_WIFI,
|
|
Packit Service |
a1bd4f |
"Activation: (wifi-p2p) could not find peer, failing activation");
|
|
Packit Service |
a1bd4f |
nm_device_state_changed(device,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_FAILED,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_PEER_NOT_FOUND);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
return G_SOURCE_REMOVE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static NMActStageReturn
|
|
Packit Service |
a1bd4f |
act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
NMConnection * connection;
|
|
Packit Service |
a1bd4f |
NMSettingWifiP2P * s_wifi_p2p;
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (!priv->mgmt_iface) {
|
|
Packit Service |
a1bd4f |
NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
|
|
Packit Service |
a1bd4f |
return NM_ACT_STAGE_RETURN_FAILURE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
connection = nm_device_get_applied_connection(NM_DEVICE(self));
|
|
Packit Service |
a1bd4f |
g_return_val_if_fail(connection, NM_ACT_STAGE_RETURN_FAILURE);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
s_wifi_p2p =
|
|
Packit Service |
a1bd4f |
NM_SETTING_WIFI_P2P(nm_connection_get_setting(connection, NM_TYPE_SETTING_WIFI_P2P));
|
|
Packit Service |
a1bd4f |
g_return_val_if_fail(s_wifi_p2p, NM_ACT_STAGE_RETURN_FAILURE);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
peer = nm_wifi_p2p_peers_find_first_compatible(&priv->peers_lst_head, connection);
|
|
Packit Service |
a1bd4f |
if (!peer) {
|
|
Packit Service |
a1bd4f |
/* Set up a timeout on the find attempt and run a find for the same period of time */
|
|
Packit Service |
a1bd4f |
if (priv->find_peer_timeout_id == 0) {
|
|
Packit Service |
a1bd4f |
priv->find_peer_timeout_id =
|
|
Packit Service |
a1bd4f |
g_timeout_add_seconds(10, supplicant_find_timeout_cb, self);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_start_find(priv->mgmt_iface, 10);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
return NM_ACT_STAGE_RETURN_POSTPONE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
return NM_ACT_STAGE_RETURN_SUCCESS;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*
|
|
Packit |
5756e2 |
* supplicant_connection_timeout_cb
|
|
Packit |
5756e2 |
*
|
|
Packit |
5756e2 |
* Called when the supplicant has been unable to connect to a peer
|
|
Packit |
5756e2 |
* within a specified period of time.
|
|
Packit |
5756e2 |
*/
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
supplicant_connection_timeout_cb(gpointer user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDevice * device = NM_DEVICE(user_data);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->sup_timeout_id = 0;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_cancel_connect(priv->mgmt_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (nm_device_is_activating(device)) {
|
|
Packit Service |
a1bd4f |
_LOGW(LOGD_DEVICE | LOGD_WIFI,
|
|
Packit Service |
a1bd4f |
"Activation: (wifi-p2p) connecting took too long, failing activation");
|
|
Packit Service |
a1bd4f |
nm_device_state_changed(device,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_FAILED,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
return G_SOURCE_REMOVE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static NMActStageReturn
|
|
Packit Service |
a1bd4f |
act_stage2_config(NMDevice *device, NMDeviceStateReason *out_failure_reason)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
NMConnection * connection;
|
|
Packit Service |
a1bd4f |
NMSettingWifiP2P * s_wifi_p2p;
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer;
|
|
Packit Service |
a1bd4f |
GBytes * wfd_ies;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (nm_clear_g_source(&priv->find_peer_timeout_id))
|
|
Packit Service |
a1bd4f |
nm_assert_not_reached();
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (!priv->mgmt_iface) {
|
|
Packit Service |
a1bd4f |
NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
|
|
Packit Service |
a1bd4f |
return NM_ACT_STAGE_RETURN_FAILURE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
connection = nm_device_get_applied_connection(device);
|
|
Packit Service |
a1bd4f |
g_return_val_if_fail(connection, NM_ACT_STAGE_RETURN_FAILURE);
|
|
Packit Service |
a1bd4f |
nm_assert(
|
|
Packit Service |
a1bd4f |
NM_IS_SETTING_WIFI_P2P(nm_connection_get_setting(connection, NM_TYPE_SETTING_WIFI_P2P)));
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* The prepare stage ensures that the peer has been found */
|
|
Packit Service |
a1bd4f |
peer = nm_wifi_p2p_peers_find_first_compatible(&priv->peers_lst_head, connection);
|
|
Packit Service |
a1bd4f |
if (!peer) {
|
|
Packit Service |
a1bd4f |
NM_SET_OUT(out_failure_reason, NM_DEVICE_STATE_REASON_PEER_NOT_FOUND);
|
|
Packit Service |
a1bd4f |
return NM_ACT_STAGE_RETURN_FAILURE;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* Set the WFD IEs before trying to establish the connection. */
|
|
Packit Service |
a1bd4f |
s_wifi_p2p =
|
|
Packit Service |
a1bd4f |
NM_SETTING_WIFI_P2P(nm_connection_get_setting(connection, NM_TYPE_SETTING_WIFI_P2P));
|
|
Packit Service |
a1bd4f |
wfd_ies = nm_setting_wifi_p2p_get_wfd_ies(s_wifi_p2p);
|
|
Packit Service |
a1bd4f |
nm_supplicant_manager_set_wfd_ies(priv->sup_mgr, wfd_ies);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* TODO: Grab secrets if we don't have them yet! */
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* TODO: Fix "pbc" being hardcoded here! */
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_connect(priv->mgmt_iface,
|
|
Packit Service |
a1bd4f |
nm_wifi_p2p_peer_get_supplicant_path(peer),
|
|
Packit Service |
a1bd4f |
"pbc",
|
|
Packit Service |
a1bd4f |
NULL);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* Set up a timeout on the connect attempt */
|
|
Packit Service |
a1bd4f |
if (priv->sup_timeout_id == 0) {
|
|
Packit Service |
a1bd4f |
priv->sup_timeout_id = g_timeout_add_seconds(45, supplicant_connection_timeout_cb, self);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* We'll get stage3 started when the P2P group has been started */
|
|
Packit Service |
a1bd4f |
return NM_ACT_STAGE_RETURN_POSTPONE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
emit_signal_p2p_peer_add_remove(NMDeviceWifiP2P *device,
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer,
|
|
Packit Service |
a1bd4f |
gboolean is_added /* or else is_removed */)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
nm_dbus_object_emit_signal(NM_DBUS_OBJECT(device),
|
|
Packit Service |
a1bd4f |
&interface_info_device_wifi_p2p,
|
|
Packit Service |
a1bd4f |
is_added ? &nm_signal_info_wifi_p2p_peer_added
|
|
Packit Service |
a1bd4f |
: &nm_signal_info_wifi_p2p_peer_removed,
|
|
Packit Service |
a1bd4f |
"(o)",
|
|
Packit Service |
a1bd4f |
nm_dbus_object_get_path(NM_DBUS_OBJECT(peer)));
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
peer_add_remove(NMDeviceWifiP2P *self,
|
|
Packit Service |
a1bd4f |
gboolean is_adding, /* or else removing */
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer,
|
|
Packit Service |
a1bd4f |
gboolean recheck_available_connections)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDevice * device = NM_DEVICE(self);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (is_adding) {
|
|
Packit Service |
a1bd4f |
g_object_ref(peer);
|
|
Packit Service |
a1bd4f |
peer->wifi_device = device;
|
|
Packit Service |
a1bd4f |
c_list_link_tail(&priv->peers_lst_head, &peer->peers_lst);
|
|
Packit Service |
a1bd4f |
nm_dbus_object_export(NM_DBUS_OBJECT(peer));
|
|
Packit Service |
a1bd4f |
_peer_dump(self, LOGL_DEBUG, peer, "added", 0);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
emit_signal_p2p_peer_add_remove(self, peer, TRUE);
|
|
Packit Service |
a1bd4f |
} else {
|
|
Packit Service |
a1bd4f |
peer->wifi_device = NULL;
|
|
Packit Service |
a1bd4f |
c_list_unlink(&peer->peers_lst);
|
|
Packit Service |
a1bd4f |
_peer_dump(self, LOGL_DEBUG, peer, "removed", 0);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
_notify(self, PROP_PEERS);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (!is_adding) {
|
|
Packit Service |
a1bd4f |
emit_signal_p2p_peer_add_remove(self, peer, FALSE);
|
|
Packit Service |
a1bd4f |
nm_dbus_object_clear_and_unexport(&peer);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (is_adding) {
|
|
Packit Service |
a1bd4f |
/* If we are in prepare state, then we are currently runnign a find
|
|
Packit Service |
a1bd4f |
* to search for the requested peer. */
|
|
Packit Service |
a1bd4f |
if (priv->find_peer_timeout_id != 0) {
|
|
Packit Service |
a1bd4f |
NMConnection *connection;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
nm_assert(nm_device_get_state(device) == NM_DEVICE_STATE_PREPARE);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
connection = nm_device_get_applied_connection(device);
|
|
Packit Service |
a1bd4f |
nm_assert(NM_IS_CONNECTION(connection));
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
peer = nm_wifi_p2p_peers_find_first_compatible(&priv->peers_lst_head, connection);
|
|
Packit Service |
a1bd4f |
if (peer) {
|
|
Packit Service |
a1bd4f |
/* A peer for the connection was found, cancel the timeout and go to configure state. */
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->find_peer_timeout_id);
|
|
Packit Service |
a1bd4f |
nm_device_activate_schedule_stage1_device_prepare(device, FALSE);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* TODO: We may want to re-check auto-activation here, otherwise it will never work. */
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
update_disconnect_on_connection_peer_missing(self);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
remove_all_peers(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * peer;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (c_list_is_empty(&priv->peers_lst_head))
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
while ((peer = c_list_first_entry(&priv->peers_lst_head, NMWifiP2PPeer, peers_lst)))
|
|
Packit Service |
a1bd4f |
peer_add_remove(self, FALSE, peer, FALSE);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_device_recheck_available_connections(NM_DEVICE(self));
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static NMActStageReturn
|
|
Packit Service |
a1bd4f |
act_stage3_ip_config_start(NMDevice * device,
|
|
Packit Service |
a1bd4f |
int addr_family,
|
|
Packit Service |
a1bd4f |
gpointer * out_config,
|
|
Packit Service |
a1bd4f |
NMDeviceStateReason *out_failure_reason)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
gboolean indicate_addressing_running;
|
|
Packit Service |
a1bd4f |
NMConnection *connection;
|
|
Packit Service |
a1bd4f |
const char * method;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
connection = nm_device_get_applied_connection(device);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
method = nm_utils_get_ip_config_method(connection, addr_family);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (addr_family == AF_INET)
|
|
Packit Service |
a1bd4f |
indicate_addressing_running = NM_IN_STRSET(method, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
|
|
Packit Service |
a1bd4f |
else {
|
|
Packit Service |
a1bd4f |
indicate_addressing_running = NM_IN_STRSET(method,
|
|
Packit Service |
a1bd4f |
NM_SETTING_IP6_CONFIG_METHOD_AUTO,
|
|
Packit Service |
a1bd4f |
NM_SETTING_IP6_CONFIG_METHOD_DHCP);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (indicate_addressing_running)
|
|
Packit Service |
a1bd4f |
nm_platform_wifi_indicate_addressing_running(nm_device_get_platform(device),
|
|
Packit Service |
a1bd4f |
nm_device_get_ip_ifindex(device),
|
|
Packit Service |
a1bd4f |
TRUE);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
return NM_DEVICE_CLASS(nm_device_wifi_p2p_parent_class)
|
|
Packit Service |
a1bd4f |
->act_stage3_ip_config_start(device, addr_family, out_config, out_failure_reason);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
deactivate(NMDevice *device)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
int ifindex = nm_device_get_ip_ifindex(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->find_peer_timeout_id);
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->sup_timeout_id);
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->peer_missing_id);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (priv->mgmt_iface)
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_cancel_connect(priv->mgmt_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (priv->group_iface)
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_disconnect(priv->group_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* Clear any critical protocol notification in the Wi-Fi stack */
|
|
Packit Service |
a1bd4f |
if (ifindex > 0)
|
|
Packit Service |
a1bd4f |
nm_platform_wifi_indicate_addressing_running(nm_device_get_platform(device),
|
|
Packit Service |
a1bd4f |
ifindex,
|
|
Packit Service |
a1bd4f |
FALSE);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static guint32
|
|
Packit Service |
a1bd4f |
get_configured_mtu(NMDevice *device, NMDeviceMtuSource *out_source, gboolean *out_force)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
*out_source = NM_DEVICE_MTU_SOURCE_NONE;
|
|
Packit Service |
a1bd4f |
return 0;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static const char *
|
|
Packit Service |
a1bd4f |
get_auto_ip_config_method(NMDevice *device, int addr_family)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* Override the AUTO method to mean shared if we are group owner. */
|
|
Packit Service |
a1bd4f |
if (priv->group_iface && nm_supplicant_interface_get_p2p_group_owner(priv->group_iface)) {
|
|
Packit Service |
a1bd4f |
if (addr_family == AF_INET)
|
|
Packit Service |
a1bd4f |
return NM_SETTING_IP4_CONFIG_METHOD_SHARED;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (addr_family == AF_INET6)
|
|
Packit Service |
a1bd4f |
return NM_SETTING_IP6_CONFIG_METHOD_SHARED;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
return NULL;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static gboolean
|
|
Packit Service |
a1bd4f |
unmanaged_on_quit(NMDevice *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
return TRUE;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_iface_state_cb(NMSupplicantInterface *iface,
|
|
Packit Service |
a1bd4f |
int new_state_i,
|
|
Packit Service |
a1bd4f |
int old_state_i,
|
|
Packit Service |
a1bd4f |
int disconnect_reason,
|
|
Packit Service |
a1bd4f |
gpointer user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit Service |
a1bd4f |
NMDevice * device = NM_DEVICE(self);
|
|
Packit Service |
a1bd4f |
NMSupplicantInterfaceState new_state = new_state_i;
|
|
Packit Service |
a1bd4f |
NMSupplicantInterfaceState old_state = old_state_i;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
_LOGI(LOGD_DEVICE | LOGD_WIFI,
|
|
Packit Service |
a1bd4f |
"supplicant management interface state: %s -> %s",
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_state_to_string(old_state),
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_state_to_string(new_state));
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (new_state == NM_SUPPLICANT_INTERFACE_STATE_DOWN) {
|
|
Packit Service |
a1bd4f |
supplicant_interfaces_release(self, TRUE);
|
|
Packit Service |
a1bd4f |
nm_device_queue_recheck_available(device,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (old_state == NM_SUPPLICANT_INTERFACE_STATE_STARTING) {
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_WIFI, "supplicant ready");
|
|
Packit Service |
a1bd4f |
nm_device_queue_recheck_available(device,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self, FALSE);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_iface_peer_changed_cb(NMSupplicantInterface *iface,
|
|
Packit Service |
a1bd4f |
NMSupplicantPeerInfo * peer_info,
|
|
Packit Service |
a1bd4f |
gboolean is_present,
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
NMWifiP2PPeer * found_peer;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
found_peer =
|
|
Packit Service |
a1bd4f |
nm_wifi_p2p_peers_find_by_supplicant_path(&priv->peers_lst_head, peer_info->peer_path->str);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!is_present) {
|
|
Packit Service |
a1bd4f |
if (!found_peer)
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
peer_add_remove(self, FALSE, found_peer, TRUE);
|
|
Packit Service |
a1bd4f |
goto out;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (found_peer) {
|
|
Packit Service |
a1bd4f |
if (!nm_wifi_p2p_peer_update_from_properties(found_peer, peer_info))
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
update_disconnect_on_connection_peer_missing(self);
|
|
Packit Service |
a1bd4f |
_peer_dump(self, LOGL_DEBUG, found_peer, "updated", 0);
|
|
Packit Service |
a1bd4f |
} else {
|
|
Packit Service |
a1bd4f |
gs_unref_object NMWifiP2PPeer *peer = NULL;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
peer = nm_wifi_p2p_peer_new_from_properties(peer_info);
|
|
Packit Service |
a1bd4f |
peer_add_remove(self, TRUE, peer, TRUE);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
out:
|
|
Packit Service |
a1bd4f |
schedule_peer_list_dump(self);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
check_group_iface_ready(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!priv->group_iface)
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!nm_supplicant_interface_state_is_operational(
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_get_state(priv->group_iface)))
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!nm_supplicant_interface_get_p2p_group_joined(priv->group_iface))
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->sup_timeout_id);
|
|
Packit Service |
a1bd4f |
update_disconnect_on_connection_peer_missing(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_device_activate_schedule_stage3_ip_config_start(NM_DEVICE(self));
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_group_iface_is_ready(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_WIFI, "P2P Group supplicant ready");
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!nm_device_set_ip_iface(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_get_ifname(priv->group_iface))) {
|
|
Packit Service |
a1bd4f |
nm_device_state_changed(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_FAILED,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self, FALSE);
|
|
Packit Service |
a1bd4f |
check_group_iface_ready(self);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_group_iface_state_cb(NMSupplicantInterface *iface,
|
|
Packit Service |
a1bd4f |
int new_state_i,
|
|
Packit Service |
a1bd4f |
int old_state_i,
|
|
Packit Service |
a1bd4f |
int disconnect_reason,
|
|
Packit Service |
a1bd4f |
gpointer user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit Service |
a1bd4f |
NMSupplicantInterfaceState new_state = new_state_i;
|
|
Packit Service |
a1bd4f |
NMSupplicantInterfaceState old_state = old_state_i;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
_LOGI(LOGD_DEVICE | LOGD_WIFI,
|
|
Packit Service |
a1bd4f |
"P2P Group supplicant interface state: %s -> %s",
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_state_to_string(old_state),
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_state_to_string(new_state));
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (new_state == NM_SUPPLICANT_INTERFACE_STATE_DOWN) {
|
|
Packit Service |
a1bd4f |
supplicant_group_interface_release(self);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
nm_device_state_changed(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_DISCONNECTED,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (old_state == NM_SUPPLICANT_INTERFACE_STATE_STARTING) {
|
|
Packit Service |
a1bd4f |
supplicant_group_iface_is_ready(self);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_group_iface_group_finished_cb(NMSupplicantInterface *iface,
|
|
Packit Service |
a1bd4f |
const char * iface_path,
|
|
Packit Service |
a1bd4f |
void * user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P *self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_group_interface_release(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_device_state_changed(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_DISCONNECTED,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_iface_group_joined_updated_cb(NMSupplicantInterface *iface,
|
|
Packit Service |
a1bd4f |
GParamSpec * pspec,
|
|
Packit Service |
a1bd4f |
void * user_data)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P *self = NM_DEVICE_WIFI_P2P(user_data);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
check_group_iface_ready(self);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_iface_group_started_cb(NMSupplicantInterface *iface,
|
|
Packit Service |
a1bd4f |
NMSupplicantInterface *group_iface,
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate * priv;
|
|
Packit Service |
a1bd4f |
NMSupplicantInterfaceState state;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_return_if_fail(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!nm_device_is_activating(NM_DEVICE(self))) {
|
|
Packit Service |
a1bd4f |
_LOGW(LOGD_DEVICE | LOGD_WIFI,
|
|
Packit Service |
a1bd4f |
"P2P: WPA supplicant notified a group start but we are not trying to connect! "
|
|
Packit Service |
a1bd4f |
"Ignoring the event.");
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_group_interface_release(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->group_iface = g_object_ref(group_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* We need to wait for the interface to be ready and the group
|
|
Packit Service |
a1bd4f |
* information to be resolved. */
|
|
Packit Service |
a1bd4f |
g_signal_connect(priv->group_iface,
|
|
Packit Service |
a1bd4f |
"notify::" NM_SUPPLICANT_INTERFACE_P2P_GROUP_JOINED,
|
|
Packit Service |
a1bd4f |
G_CALLBACK(supplicant_iface_group_joined_updated_cb),
|
|
Packit Service |
a1bd4f |
self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_signal_connect(priv->group_iface,
|
|
Packit Service |
a1bd4f |
NM_SUPPLICANT_INTERFACE_STATE,
|
|
Packit Service |
a1bd4f |
G_CALLBACK(supplicant_group_iface_state_cb),
|
|
Packit Service |
a1bd4f |
self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_signal_connect(priv->group_iface,
|
|
Packit Service |
a1bd4f |
NM_SUPPLICANT_INTERFACE_GROUP_FINISHED,
|
|
Packit Service |
a1bd4f |
G_CALLBACK(supplicant_group_iface_group_finished_cb),
|
|
Packit Service |
a1bd4f |
self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
state = nm_supplicant_interface_get_state(priv->group_iface);
|
|
Packit Service |
a1bd4f |
if (state == NM_SUPPLICANT_INTERFACE_STATE_STARTING) {
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self, TRUE);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_group_iface_is_ready(self);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_group_interface_release(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!priv->group_iface)
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_signal_handlers_disconnect_by_data(priv->group_iface, self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_disconnect(priv->group_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_clear_object(&priv->group_iface);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
supplicant_interfaces_release(NMDeviceWifiP2P *self, gboolean set_is_waiting)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->peer_dump_id);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
remove_all_peers(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (priv->mgmt_iface) {
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_DEVICE | LOGD_WIFI, "P2P: Releasing WPA supplicant interface.");
|
|
Packit Service |
a1bd4f |
nm_supplicant_manager_set_wfd_ies(priv->sup_mgr, NULL);
|
|
Packit Service |
a1bd4f |
g_signal_handlers_disconnect_by_data(priv->mgmt_iface, self);
|
|
Packit Service |
a1bd4f |
g_clear_object(&priv->mgmt_iface);
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->find_peer_timeout_id);
|
|
Packit Service |
a1bd4f |
nm_clear_g_source(&priv->sup_timeout_id);
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_group_interface_release(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (set_is_waiting)
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self, TRUE);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
device_state_changed(NMDevice * device,
|
|
Packit Service |
a1bd4f |
NMDeviceState new_state,
|
|
Packit Service |
a1bd4f |
NMDeviceState old_state,
|
|
Packit Service |
a1bd4f |
NMDeviceStateReason reason)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(device);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
update_disconnect_on_connection_peer_missing(self);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (new_state <= NM_DEVICE_STATE_UNAVAILABLE) {
|
|
Packit Service |
a1bd4f |
/* Clean up the supplicant interface because in these states the
|
|
Packit Service |
a1bd4f |
* device cannot be used.
|
|
Packit Service |
a1bd4f |
* Do not clean up for the UNMANAGED to UNAVAILABLE transition which
|
|
Packit Service |
a1bd4f |
* will happen during initialization.
|
|
Packit Service |
a1bd4f |
*/
|
|
Packit Service |
a1bd4f |
if (priv->mgmt_iface && old_state > new_state)
|
|
Packit Service |
a1bd4f |
supplicant_interfaces_release(self, TRUE);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
/* TODO: More cleanup needed? */
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
switch (new_state) {
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_UNMANAGED:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_UNAVAILABLE:
|
|
Packit Service |
a1bd4f |
if (!priv->mgmt_iface
|
|
Packit Service |
a1bd4f |
|| !nm_supplicant_interface_state_is_operational(
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_get_state(priv->mgmt_iface)))
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self, TRUE);
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_NEED_AUTH:
|
|
Packit Service |
a1bd4f |
/* Disconnect? */
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_IP_CHECK:
|
|
Packit Service |
a1bd4f |
/* Clear any critical protocol notification in the wifi stack */
|
|
Packit Service |
a1bd4f |
nm_platform_wifi_indicate_addressing_running(nm_device_get_platform(device),
|
|
Packit Service |
a1bd4f |
nm_device_get_ip_ifindex(device),
|
|
Packit Service |
a1bd4f |
FALSE);
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_ACTIVATED:
|
|
Packit Service |
a1bd4f |
//activation_success_handler (device);
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_FAILED:
|
|
Packit Service |
a1bd4f |
/* Clear any critical protocol notification in the wifi stack.
|
|
Packit Service |
a1bd4f |
* At this point the IP device may have been removed already. */
|
|
Packit Service |
a1bd4f |
nm_supplicant_manager_set_wfd_ies(priv->sup_mgr, NULL);
|
|
Packit Service |
a1bd4f |
if (nm_device_get_ip_ifindex(device) > 0)
|
|
Packit Service |
a1bd4f |
nm_platform_wifi_indicate_addressing_running(nm_device_get_platform(device),
|
|
Packit Service |
a1bd4f |
nm_device_get_ip_ifindex(device),
|
|
Packit Service |
a1bd4f |
FALSE);
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
case NM_DEVICE_STATE_DISCONNECTED:
|
|
Packit Service |
a1bd4f |
nm_supplicant_manager_set_wfd_ies(priv->sup_mgr, NULL);
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
default:
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
impl_device_wifi_p2p_start_find(NMDBusObject * obj,
|
|
Packit Service |
a1bd4f |
const NMDBusInterfaceInfoExtended *interface_info,
|
|
Packit Service |
a1bd4f |
const NMDBusMethodInfoExtended * method_info,
|
|
Packit Service |
a1bd4f |
GDBusConnection * connection,
|
|
Packit Service |
a1bd4f |
const char * sender,
|
|
Packit Service |
a1bd4f |
GDBusMethodInvocation * invocation,
|
|
Packit Service |
a1bd4f |
GVariant * parameters)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(obj);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
gs_unref_variant GVariant *options = NULL;
|
|
Packit Service |
a1bd4f |
const char * opts_key;
|
|
Packit Service |
a1bd4f |
GVariant * opts_val;
|
|
Packit Service |
a1bd4f |
GVariantIter iter;
|
|
Packit Service |
a1bd4f |
gint32 timeout = 30;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
g_variant_get(parameters, "(@a{sv})", &options);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
g_variant_iter_init(&iter, options);
|
|
Packit Service |
a1bd4f |
while (g_variant_iter_next(&iter, "{&sv}", &opts_key, &opts_val)) {
|
|
Packit Service |
a1bd4f |
_nm_unused gs_unref_variant GVariant *opts_val_free = opts_val;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (nm_streq(opts_key, "timeout")) {
|
|
Packit Service |
a1bd4f |
if (!g_variant_is_of_type(opts_val, G_VARIANT_TYPE_INT32)) {
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_error_literal(
|
|
Packit Service |
a1bd4f |
invocation,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_INVALID_ARGUMENT,
|
|
Packit Service |
a1bd4f |
"\"timeout\" must be an integer \"i\"");
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
timeout = g_variant_get_int32(opts_val);
|
|
Packit Service |
a1bd4f |
if (timeout <= 0 || timeout > 600) {
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_error_literal(
|
|
Packit Service |
a1bd4f |
invocation,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_NOT_ALLOWED,
|
|
Packit Service |
a1bd4f |
"The timeout for a find operation needs to be in the range of 1-600s.");
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
continue;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_error(invocation,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_INVALID_ARGUMENT,
|
|
Packit Service |
a1bd4f |
"Unsupported options key \"%s\"",
|
|
Packit Service |
a1bd4f |
opts_key);
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
if (!priv->mgmt_iface) {
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_error_literal(
|
|
Packit Service |
a1bd4f |
invocation,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_NOT_ACTIVE,
|
|
Packit Service |
a1bd4f |
"WPA Supplicant management interface is currently unavailable.");
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_start_find(priv->mgmt_iface, timeout);
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_value(invocation, NULL);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
impl_device_wifi_p2p_stop_find(NMDBusObject * obj,
|
|
Packit Service |
a1bd4f |
const NMDBusInterfaceInfoExtended *interface_info,
|
|
Packit Service |
a1bd4f |
const NMDBusMethodInfoExtended * method_info,
|
|
Packit Service |
a1bd4f |
GDBusConnection * connection,
|
|
Packit Service |
a1bd4f |
const char * sender,
|
|
Packit Service |
a1bd4f |
GDBusMethodInvocation * invocation,
|
|
Packit Service |
a1bd4f |
GVariant * parameters)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(obj);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!priv->mgmt_iface) {
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_error_literal(
|
|
Packit Service |
a1bd4f |
invocation,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_ERROR_NOT_ACTIVE,
|
|
Packit Service |
a1bd4f |
"WPA Supplicant management interface is currently unavailable.");
|
|
Packit Service |
a1bd4f |
return;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_p2p_stop_find(priv->mgmt_iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_dbus_method_invocation_return_value(invocation, NULL);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
NMSupplicantInterface *
|
|
Packit Service |
a1bd4f |
nm_device_wifi_p2p_get_mgmt_iface(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
g_return_val_if_fail(NM_IS_DEVICE_WIFI_P2P(self), NULL);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
return NM_DEVICE_WIFI_P2P_GET_PRIVATE(self)->mgmt_iface;
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
void
|
|
Packit Service |
a1bd4f |
nm_device_wifi_p2p_set_mgmt_iface(NMDeviceWifiP2P *self, NMSupplicantInterface *iface)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_return_if_fail(NM_IS_DEVICE_WIFI_P2P(self));
|
|
Packit Service |
a1bd4f |
g_return_if_fail(!iface || NM_IS_SUPPLICANT_INTERFACE(iface));
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (priv->mgmt_iface == iface)
|
|
Packit Service |
a1bd4f |
goto done;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_interfaces_release(self, FALSE);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
if (!iface)
|
|
Packit Service |
a1bd4f |
goto done;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_LOGD(LOGD_DEVICE | LOGD_WIFI,
|
|
Packit Service |
a1bd4f |
"P2P: WPA supplicant management interface changed to %s.",
|
|
Packit Service |
a1bd4f |
nm_ref_string_get_str(nm_supplicant_interface_get_object_path(iface)));
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->mgmt_iface = g_object_ref(iface);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_signal_connect(priv->mgmt_iface,
|
|
Packit Service |
a1bd4f |
NM_SUPPLICANT_INTERFACE_STATE,
|
|
Packit Service |
a1bd4f |
G_CALLBACK(supplicant_iface_state_cb),
|
|
Packit Service |
a1bd4f |
self);
|
|
Packit Service |
a1bd4f |
g_signal_connect(priv->mgmt_iface,
|
|
Packit Service |
a1bd4f |
NM_SUPPLICANT_INTERFACE_PEER_CHANGED,
|
|
Packit Service |
a1bd4f |
G_CALLBACK(supplicant_iface_peer_changed_cb),
|
|
Packit Service |
a1bd4f |
self);
|
|
Packit Service |
a1bd4f |
g_signal_connect(priv->mgmt_iface,
|
|
Packit Service |
a1bd4f |
NM_SUPPLICANT_INTERFACE_GROUP_STARTED,
|
|
Packit Service |
a1bd4f |
G_CALLBACK(supplicant_iface_group_started_cb),
|
|
Packit Service |
a1bd4f |
self);
|
|
Packit |
5756e2 |
done:
|
|
Packit Service |
a1bd4f |
nm_device_queue_recheck_available(NM_DEVICE(self),
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self,
|
|
Packit Service |
a1bd4f |
!priv->mgmt_iface
|
|
Packit Service |
a1bd4f |
|| !nm_supplicant_interface_state_is_operational(
|
|
Packit Service |
a1bd4f |
nm_supplicant_interface_get_state(priv->mgmt_iface)));
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
void
|
|
Packit Service |
a1bd4f |
nm_device_wifi_p2p_remove(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
g_signal_emit_by_name(self, NM_DEVICE_REMOVED);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static const char *
|
|
Packit Service |
a1bd4f |
get_type_description(NMDevice *device)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
return "wifi-p2p";
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
static const GDBusSignalInfo nm_signal_info_wifi_p2p_peer_added = NM_DEFINE_GDBUS_SIGNAL_INFO_INIT(
|
|
Packit Service |
a1bd4f |
"PeerAdded",
|
|
Packit Service |
a1bd4f |
.args = NM_DEFINE_GDBUS_ARG_INFOS(NM_DEFINE_GDBUS_ARG_INFO("peer", "o"), ), );
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
static const GDBusSignalInfo nm_signal_info_wifi_p2p_peer_removed =
|
|
Packit Service |
a1bd4f |
NM_DEFINE_GDBUS_SIGNAL_INFO_INIT(
|
|
Packit Service |
a1bd4f |
"PeerRemoved",
|
|
Packit Service |
a1bd4f |
.args = NM_DEFINE_GDBUS_ARG_INFOS(NM_DEFINE_GDBUS_ARG_INFO("peer", "o"), ), );
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static const NMDBusInterfaceInfoExtended interface_info_device_wifi_p2p = {
|
|
Packit Service |
a1bd4f |
.parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT(
|
|
Packit Service |
a1bd4f |
NM_DBUS_INTERFACE_DEVICE_WIFI_P2P,
|
|
Packit Service |
a1bd4f |
.methods = NM_DEFINE_GDBUS_METHOD_INFOS(
|
|
Packit Service |
a1bd4f |
NM_DEFINE_DBUS_METHOD_INFO_EXTENDED(
|
|
Packit Service |
a1bd4f |
NM_DEFINE_GDBUS_METHOD_INFO_INIT(
|
|
Packit Service |
a1bd4f |
"StartFind",
|
|
Packit Service |
a1bd4f |
.in_args = NM_DEFINE_GDBUS_ARG_INFOS(
|
|
Packit Service |
a1bd4f |
NM_DEFINE_GDBUS_ARG_INFO("options", "a{sv}"), ), ),
|
|
Packit Service |
a1bd4f |
.handle = impl_device_wifi_p2p_start_find, ),
|
|
Packit Service |
a1bd4f |
NM_DEFINE_DBUS_METHOD_INFO_EXTENDED(NM_DEFINE_GDBUS_METHOD_INFO_INIT("StopFind", ),
|
|
Packit Service |
a1bd4f |
.handle = impl_device_wifi_p2p_stop_find, ), ),
|
|
Packit Service |
a1bd4f |
.signals = NM_DEFINE_GDBUS_SIGNAL_INFOS(&nm_signal_info_wifi_p2p_peer_added,
|
|
Packit Service |
a1bd4f |
&nm_signal_info_wifi_p2p_peer_removed, ),
|
|
Packit Service |
a1bd4f |
.properties = NM_DEFINE_GDBUS_PROPERTY_INFOS(
|
|
Packit Service |
a1bd4f |
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE("HwAddress", "s", NM_DEVICE_HW_ADDRESS),
|
|
Packit Service |
a1bd4f |
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE("Peers",
|
|
Packit Service |
a1bd4f |
"ao",
|
|
Packit Service |
a1bd4f |
NM_DEVICE_WIFI_P2P_PEERS), ), ),
|
|
Packit Service |
a1bd4f |
.legacy_property_changed = FALSE,
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(object);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit Service |
a1bd4f |
const char ** list;
|
|
Packit Service |
a1bd4f |
|
|
Packit Service |
a1bd4f |
switch (prop_id) {
|
|
Packit Service |
a1bd4f |
case PROP_PEERS:
|
|
Packit Service |
a1bd4f |
list = nm_wifi_p2p_peers_get_paths(&priv->peers_lst_head);
|
|
Packit Service |
a1bd4f |
g_value_take_boxed(value, nm_utils_strv_make_deep_copied(list));
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
default:
|
|
Packit Service |
a1bd4f |
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
|
|
Packit Service |
a1bd4f |
break;
|
|
Packit Service |
a1bd4f |
}
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*****************************************************************************/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
nm_device_wifi_p2p_init(NMDeviceWifiP2P *self)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(self);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
c_list_init(&priv->peers_lst_head);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
priv->sup_mgr = g_object_ref(nm_supplicant_manager_get());
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
constructed(GObject *object)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P *self = NM_DEVICE_WIFI_P2P(object);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
G_OBJECT_CLASS(nm_device_wifi_p2p_parent_class)->constructed(object);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
_set_is_waiting_for_supplicant(self, TRUE);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
NMDeviceWifiP2P *
|
|
Packit Service |
a1bd4f |
nm_device_wifi_p2p_new(const char *iface)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
return g_object_new(NM_TYPE_DEVICE_WIFI_P2P,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_IFACE,
|
|
Packit Service |
a1bd4f |
iface,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_TYPE_DESC,
|
|
Packit Service |
a1bd4f |
"802.11 Wi-Fi P2P",
|
|
Packit Service |
a1bd4f |
NM_DEVICE_DEVICE_TYPE,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_TYPE_WIFI_P2P,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_LINK_TYPE,
|
|
Packit Service |
a1bd4f |
NM_LINK_TYPE_WIFI,
|
|
Packit Service |
a1bd4f |
NM_DEVICE_RFKILL_TYPE,
|
|
Packit Service |
a1bd4f |
RFKILL_TYPE_WLAN,
|
|
Packit Service |
a1bd4f |
NULL);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
dispose(GObject *object)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * self = NM_DEVICE_WIFI_P2P(object);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(object);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_clear_object(&priv->sup_mgr);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
supplicant_interfaces_release(self, FALSE);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
G_OBJECT_CLASS(nm_device_wifi_p2p_parent_class)->dispose(object);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
finalize(GObject *object)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2P * peer = NM_DEVICE_WIFI_P2P(object);
|
|
Packit Service |
a1bd4f |
NMDeviceWifiP2PPrivate *priv = NM_DEVICE_WIFI_P2P_GET_PRIVATE(peer);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
nm_assert(c_list_is_empty(&priv->peers_lst_head));
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
G_OBJECT_CLASS(nm_device_wifi_p2p_parent_class)->finalize(object);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static void
|
|
Packit Service |
a1bd4f |
nm_device_wifi_p2p_class_init(NMDeviceWifiP2PClass *klass)
|
|
Packit |
5756e2 |
{
|
|
Packit Service |
a1bd4f |
GObjectClass * object_class = G_OBJECT_CLASS(klass);
|
|
Packit Service |
a1bd4f |
NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS(klass);
|
|
Packit Service |
a1bd4f |
NMDeviceClass * device_class = NM_DEVICE_CLASS(klass);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
object_class->constructed = constructed;
|
|
Packit Service |
a1bd4f |
object_class->get_property = get_property;
|
|
Packit Service |
a1bd4f |
object_class->dispose = dispose;
|
|
Packit Service |
a1bd4f |
object_class->finalize = finalize;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS(&interface_info_device_wifi_p2p);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
device_class->connection_type_supported = NM_SETTING_WIFI_P2P_SETTING_NAME;
|
|
Packit Service |
a1bd4f |
device_class->connection_type_check_compatible = NM_SETTING_WIFI_P2P_SETTING_NAME;
|
|
Packit Service |
a1bd4f |
device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES(NM_LINK_TYPE_WIFI_P2P);
|
|
Packit Service |
a1bd4f |
device_class->get_type_description = get_type_description;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
/* Do we need compatibility checking or is the default good enough? */
|
|
Packit Service |
a1bd4f |
device_class->is_available = is_available;
|
|
Packit Service |
a1bd4f |
device_class->check_connection_compatible = check_connection_compatible;
|
|
Packit Service |
a1bd4f |
device_class->complete_connection = complete_connection;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
device_class->act_stage1_prepare = act_stage1_prepare;
|
|
Packit Service |
a1bd4f |
device_class->act_stage2_config = act_stage2_config;
|
|
Packit Service |
a1bd4f |
device_class->get_configured_mtu = get_configured_mtu;
|
|
Packit Service |
a1bd4f |
device_class->get_auto_ip_config_method = get_auto_ip_config_method;
|
|
Packit Service |
a1bd4f |
device_class->act_stage3_ip_config_start = act_stage3_ip_config_start;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
device_class->deactivate = deactivate;
|
|
Packit Service |
a1bd4f |
device_class->unmanaged_on_quit = unmanaged_on_quit;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
device_class->state_changed = device_state_changed;
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
obj_properties[PROP_PEERS] = g_param_spec_boxed(NM_DEVICE_WIFI_P2P_PEERS,
|
|
Packit Service |
a1bd4f |
"",
|
|
Packit Service |
a1bd4f |
"",
|
|
Packit Service |
a1bd4f |
G_TYPE_STRV,
|
|
Packit Service |
a1bd4f |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
|
Packit |
5756e2 |
|
|
Packit Service |
a1bd4f |
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
|
|
Packit |
5756e2 |
}
|