summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Berg <bberg@redhat.com>2018-10-18 11:06:10 +0200
committerThomas Haller <thaller@redhat.com>2019-01-27 23:45:12 +0100
commitadb8338408cd3d9696bc9dad7206f7848cef5ef4 (patch)
tree1a918ac31f62e1733ae81d47bebb904e8aa18cd7
parent959886892aa35d159d886cfddbbc856bf07bce6d (diff)
downloadNetworkManager-adb8338408cd3d9696bc9dad7206f7848cef5ef4.tar.gz
libnm: Add class to handle P2P peers
This adds the introspection data and P2P peer handling to libnm. To be usable the P2P device handling is also needed.
-rw-r--r--Makefile.am2
-rw-r--r--docs/libnm/libnm-docs.xml1
-rw-r--r--libnm/NetworkManager.h1
-rw-r--r--libnm/libnm.ver12
-rw-r--r--libnm/meson.build2
-rw-r--r--libnm/nm-client.c3
-rw-r--r--libnm/nm-p2p-peer.c550
-rw-r--r--libnm/nm-p2p-peer.h101
-rw-r--r--libnm/nm-types.h1
9 files changed, 673 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
index 1b7289c011..e43ed6bb96 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1057,6 +1057,7 @@ libnm_lib_h_pub_real = \
libnm/nm-dhcp-config.h \
libnm/nm-ip-config.h \
libnm/nm-object.h \
+ libnm/nm-p2p-peer.h \
libnm/nm-remote-connection.h \
libnm/nm-secret-agent-old.h \
libnm/nm-types.h \
@@ -1122,6 +1123,7 @@ libnm_lib_c_real = \
libnm/nm-ip6-config.c \
libnm/nm-manager.c \
libnm/nm-object.c \
+ libnm/nm-p2p-peer.c \
libnm/nm-remote-connection.c \
libnm/nm-remote-settings.c \
libnm/nm-secret-agent-old.c \
diff --git a/docs/libnm/libnm-docs.xml b/docs/libnm/libnm-docs.xml
index df5d9bab31..b164d3f375 100644
--- a/docs/libnm/libnm-docs.xml
+++ b/docs/libnm/libnm-docs.xml
@@ -274,6 +274,7 @@ print ("NetworkManager version " + client.get_version())]]></programlisting></in
<xi:include href="xml/nm-active-connection.xml"/>
<xi:include href="xml/nm-vpn-connection.xml"/>
<xi:include href="xml/nm-access-point.xml"/>
+ <xi:include href="xml/nm-p2p-peer.xml"/>
<xi:include href="xml/nm-wimax-nsp.xml"/>
<xi:include href="xml/nm-ip-config.xml"/>
<xi:include href="xml/nm-dhcp-config.xml"/>
diff --git a/libnm/NetworkManager.h b/libnm/NetworkManager.h
index 30ec7905a2..8c5f3c782c 100644
--- a/libnm/NetworkManager.h
+++ b/libnm/NetworkManager.h
@@ -60,6 +60,7 @@
#include "nm-enum-types.h"
#include "nm-ip-config.h"
#include "nm-object.h"
+#include "nm-p2p-peer.h"
#include "nm-remote-connection.h"
#include "nm-setting-6lowpan.h"
#include "nm-setting-8021x.h"
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index b30e47af7d..66bf8d6e08 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1450,6 +1450,18 @@ global:
nm_client_add_and_activate_connection2;
nm_client_add_and_activate_connection2_finish;
nm_device_get_connectivity;
+ nm_p2p_peer_connection_valid;
+ nm_p2p_peer_filter_connections;
+ nm_p2p_peer_get_flags;
+ nm_p2p_peer_get_hw_address;
+ nm_p2p_peer_get_last_seen;
+ nm_p2p_peer_get_manufacturer;
+ nm_p2p_peer_get_model;
+ nm_p2p_peer_get_model_number;
+ nm_p2p_peer_get_name;
+ nm_p2p_peer_get_serial;
+ nm_p2p_peer_get_strength;
+ nm_p2p_peer_get_type;
nm_setting_p2p_wireless_get_peer;
nm_setting_p2p_wireless_get_type;
nm_setting_p2p_wireless_get_wps_method;
diff --git a/libnm/meson.build b/libnm/meson.build
index 2e44a6a49b..dc674447b5 100644
--- a/libnm/meson.build
+++ b/libnm/meson.build
@@ -62,6 +62,7 @@ libnm_headers = files(
'nm-dhcp-config.h',
'nm-ip-config.h',
'nm-object.h',
+ 'nm-p2p-peer.h',
'nm-remote-connection.h',
'nm-secret-agent-old.h',
'nm-types.h',
@@ -132,6 +133,7 @@ libnm_sources = files(
'nm-ip6-config.c',
'nm-manager.c',
'nm-object.c',
+ 'nm-p2p-peer.c',
'nm-remote-connection.c',
'nm-remote-settings.c',
'nm-secret-agent-old.c',
diff --git a/libnm/nm-client.c b/libnm/nm-client.c
index e2522229bc..c9f919d412 100644
--- a/libnm/nm-client.c
+++ b/libnm/nm-client.c
@@ -83,6 +83,7 @@
#include "nm-ip4-config.h"
#include "nm-ip6-config.h"
#include "nm-manager.h"
+#include "nm-p2p-peer.h"
#include "nm-remote-connection.h"
#include "nm-remote-settings.h"
#include "nm-vpn-connection.h"
@@ -2715,6 +2716,8 @@ obj_nm_for_gdbus_object (NMClient *self, GDBusObject *object, GDBusObjectManager
type = NM_TYPE_IP4_CONFIG;
else if (strcmp (ifname, NM_DBUS_INTERFACE_IP6_CONFIG) == 0)
type = NM_TYPE_IP6_CONFIG;
+ else if (strcmp (ifname, NM_DBUS_INTERFACE_P2P_PEER) == 0)
+ type = NM_TYPE_P2P_PEER;
else if (strcmp (ifname, NM_DBUS_INTERFACE_SETTINGS_CONNECTION) == 0)
type = NM_TYPE_REMOTE_CONNECTION;
else if (strcmp (ifname, NM_DBUS_INTERFACE_SETTINGS) == 0)
diff --git a/libnm/nm-p2p-peer.c b/libnm/nm-p2p-peer.c
new file mode 100644
index 0000000000..67e0392de4
--- /dev/null
+++ b/libnm/nm-p2p-peer.c
@@ -0,0 +1,550 @@
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2007 - 2008 Novell, Inc.
+ * Copyright 2007 - 2018 Red Hat, Inc.
+ */
+
+#include "nm-default.h"
+
+#include "nm-p2p-peer.h"
+
+#include <string.h>
+
+#include "nm-connection.h"
+#include "nm-setting-connection.h"
+#include "nm-setting-p2p-wireless.h"
+#include "nm-utils.h"
+
+#include "nm-dbus-interface.h"
+#include "nm-object-private.h"
+
+G_DEFINE_TYPE (NMP2PPeer, nm_p2p_peer, NM_TYPE_OBJECT)
+
+#define NM_P2P_PEER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_P2P_PEER, NMP2PPeerPrivate))
+
+typedef struct {
+ NM80211ApFlags flags;
+
+ char *name;
+ char *manufacturer;
+ char *model;
+ char *model_number;
+ char *serial;
+
+ char *hw_address;
+
+ guint8 strength;
+ int last_seen;
+} NMP2PPeerPrivate;
+
+enum {
+ PROP_0,
+ PROP_FLAGS,
+ PROP_NAME,
+ PROP_MANUFACTURER,
+ PROP_MODEL,
+ PROP_MODEL_NUMBER,
+ PROP_SERIAL,
+ PROP_WFDIES,
+ PROP_HW_ADDRESS,
+ PROP_STRENGTH,
+ PROP_LAST_SEEN,
+
+ LAST_PROP
+};
+
+/**
+ * nm_p2p_peer_get_flags:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the flags of the P2P peer.
+ *
+ * Returns: the flags
+ *
+ * Since: 1.16
+ **/
+NM80211ApFlags
+nm_p2p_peer_get_flags (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NM_802_11_AP_FLAGS_NONE);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->flags;
+}
+
+/**
+ * nm_p2p_peer_get_name:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the name of the P2P peer.
+ *
+ * Returns: the name
+ *
+ * Since: 1.16
+ **/
+const char *
+nm_p2p_peer_get_name (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NULL);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->name;
+}
+
+/**
+ * nm_p2p_peer_get_manufacturer:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the manufacturer of the P2P peer.
+ *
+ * Returns: the manufacturer
+ *
+ * Since: 1.16
+ **/
+const char *
+nm_p2p_peer_get_manufacturer (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NULL);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->manufacturer;
+}
+
+/**
+ * nm_p2p_peer_get_model:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the model of the P2P peer.
+ *
+ * Returns: the model
+ *
+ * Since: 1.16
+ **/
+const char *
+nm_p2p_peer_get_model (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NULL);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->model;
+}
+
+/**
+ * nm_p2p_peer_get_model_number:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the model number of the P2P peer.
+ *
+ * Returns: the model number
+ *
+ * Since: 1.16
+ **/
+const char *
+nm_p2p_peer_get_model_number (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NULL);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->model_number;
+}
+
+/**
+ * nm_p2p_peer_get_serial:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the serial number of the P2P peer.
+ *
+ * Returns: the serial number
+ *
+ * Since: 1.16
+ **/
+const char *
+nm_p2p_peer_get_serial (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NULL);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->serial;
+}
+
+/**
+ * nm_p2p_peer_get_hw_address:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the hardware address of the P2P peer.
+ *
+ * Returns: the hardware adress
+ *
+ * Since: 1.16
+ **/
+const char *
+nm_p2p_peer_get_hw_address (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), NULL);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->hw_address;
+}
+
+/**
+ * nm_p2p_peer_get_strength:
+ * @peer: a #NMP2PPeer
+ *
+ * Gets the current signal strength of the P2P peer as a percentage.
+ *
+ * Returns: the signal strength (0 to 100)
+ *
+ * Since: 1.16
+ **/
+guint8
+nm_p2p_peer_get_strength (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), 0);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->strength;
+}
+
+/**
+ * nm_p2p_peer_get_last_seen:
+ * @peer: a #NMP2PPeer
+ *
+ * Returns the timestamp (in CLOCK_BOOTTIME seconds) for the last time the
+ * P2P peer was seen. A value of -1 means the P2P peer has never been seen.
+ *
+ * Returns: the last seen time in seconds
+ *
+ * Since: 1.16
+ **/
+int
+nm_p2p_peer_get_last_seen (NMP2PPeer *peer)
+{
+ g_return_val_if_fail (NM_IS_P2P_PEER (peer), -1);
+
+ return NM_P2P_PEER_GET_PRIVATE (peer)->last_seen;
+}
+
+/**
+ * nm_p2p_peer_connection_valid:
+ * @peer: an #NMP2PPeer to validate @connection against
+ * @connection: an #NMConnection to validate against @peer
+ *
+ * Validates a given connection against a given Wi-Fi P2P peer to ensure that
+ * the connection may be activated with that peer. The connection must match the
+ * @peer's address and in the future possibly other attributes.
+ *
+ * Returns: %TRUE if the connection may be activated with this Wi-Fi P2P Peer,
+ * %FALSE if it cannot be.
+ *
+ * Since: 1.16
+ **/
+gboolean
+nm_p2p_peer_connection_valid (NMP2PPeer *peer, NMConnection *connection)
+{
+ NMSettingConnection *s_con;
+ NMSettingP2PWireless *s_p2p_wifi;
+ const char *ctype;
+ const char *hw_address;
+ const char *setting_peer;
+
+ s_con = nm_connection_get_setting_connection (connection);
+ if (!s_con)
+ return FALSE;
+
+ ctype = nm_setting_connection_get_connection_type (s_con);
+ if (!ctype || !nm_streq (ctype, NM_SETTING_P2P_WIRELESS_SETTING_NAME))
+ return FALSE;
+
+ s_p2p_wifi = (NMSettingP2PWireless*) nm_connection_get_setting (connection, NM_TYPE_SETTING_P2P_WIRELESS);
+ if (!s_p2p_wifi)
+ return FALSE;
+
+ /* HW Address check */
+ hw_address = nm_p2p_peer_get_hw_address (peer);
+ if (!hw_address)
+ return FALSE;
+ setting_peer = nm_setting_p2p_wireless_get_peer (s_p2p_wifi);
+ if ( !setting_peer
+ || g_strcmp0 (hw_address, setting_peer))
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * nm_p2p_peer_filter_connections:
+ * @peer: an #NMP2PPeer to filter connections for
+ * @connections: (element-type NMConnection): an array of #NMConnections to
+ * filter
+ *
+ * Filters a given array of connections for a given #NMP2PPeer object and
+ * returns connections which may be activated with the P2P peer. Any
+ * returned connections will match the @peers's HW address and in the future
+ * possibly other attributes.
+ *
+ * To obtain the list of connections that are compatible with this P2P peer,
+ * use nm_client_get_connections() and then filter the returned list for a given
+ * #NMDevice using nm_device_filter_connections() and finally filter that list
+ * with this function.
+ *
+ * Returns: (transfer container) (element-type NMConnection): an array of
+ * #NMConnections that could be activated with the given @peer. The array should
+ * be freed with g_ptr_array_unref() when it is no longer required.
+ *
+ * Since: 1.16
+ **/
+GPtrArray *
+nm_p2p_peer_filter_connections (NMP2PPeer *peer, const GPtrArray *connections)
+{
+ GPtrArray *filtered;
+ int i;
+
+ filtered = g_ptr_array_new_with_free_func (g_object_unref);
+ for (i = 0; i < connections->len; i++) {
+ NMConnection *candidate = connections->pdata[i];
+
+ if (nm_p2p_peer_connection_valid (peer, candidate))
+ g_ptr_array_add (filtered, g_object_ref (candidate));
+ }
+
+ return filtered;
+}
+
+/*****************************************************************************/
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NMP2PPeer *peer = NM_P2P_PEER (object);
+
+ switch (prop_id) {
+ case PROP_FLAGS:
+ g_value_set_flags (value, nm_p2p_peer_get_flags (peer));
+ break;
+ case PROP_NAME:
+ g_value_set_string (value, nm_p2p_peer_get_name (peer));
+ break;
+ case PROP_MANUFACTURER:
+ g_value_set_string (value, nm_p2p_peer_get_manufacturer (peer));
+ break;
+ case PROP_MODEL:
+ g_value_set_string (value, nm_p2p_peer_get_model (peer));
+ break;
+ case PROP_MODEL_NUMBER:
+ g_value_set_string (value, nm_p2p_peer_get_model_number (peer));
+ break;
+ case PROP_SERIAL:
+ g_value_set_string (value, nm_p2p_peer_get_serial (peer));
+ break;
+ case PROP_HW_ADDRESS:
+ g_value_set_string (value, nm_p2p_peer_get_hw_address (peer));
+ break;
+ case PROP_STRENGTH:
+ g_value_set_uchar (value, nm_p2p_peer_get_strength (peer));
+ break;
+ case PROP_LAST_SEEN:
+ g_value_set_int (value, nm_p2p_peer_get_last_seen (peer));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+nm_p2p_peer_init (NMP2PPeer *peer)
+{
+ NM_P2P_PEER_GET_PRIVATE (peer)->last_seen = -1;
+}
+
+static void
+finalize (GObject *object)
+{
+ NMP2PPeerPrivate *priv = NM_P2P_PEER_GET_PRIVATE (object);
+
+ g_free (priv->name);
+ g_free (priv->manufacturer);
+ g_free (priv->model);
+ g_free (priv->model_number);
+ g_free (priv->serial);
+
+ G_OBJECT_CLASS (nm_p2p_peer_parent_class)->finalize (object);
+}
+
+static void
+init_dbus (NMObject *object)
+{
+ NMP2PPeerPrivate *priv = NM_P2P_PEER_GET_PRIVATE (object);
+ const NMPropertiesInfo property_info[] = {
+ { NM_P2P_PEER_FLAGS, &priv->flags },
+ { NM_P2P_PEER_NAME, &priv->name },
+ { NM_P2P_PEER_MANUFACTURER, &priv->manufacturer },
+ { NM_P2P_PEER_MODEL, &priv->model },
+ { NM_P2P_PEER_MODEL_NUMBER, &priv->model_number },
+ { NM_P2P_PEER_SERIAL, &priv->serial },
+ { NM_P2P_PEER_HW_ADDRESS, &priv->hw_address },
+ { NM_P2P_PEER_STRENGTH, &priv->strength },
+ { NM_P2P_PEER_LAST_SEEN, &priv->last_seen },
+ { NULL },
+ };
+
+ NM_OBJECT_CLASS (nm_p2p_peer_parent_class)->init_dbus (object);
+
+ _nm_object_register_properties (object,
+ NM_DBUS_INTERFACE_P2P_PEER,
+ property_info);
+}
+
+static void
+nm_p2p_peer_class_init (NMP2PPeerClass *peer_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (peer_class);
+ NMObjectClass *nm_object_class = NM_OBJECT_CLASS (peer_class);
+
+ g_type_class_add_private (peer_class, sizeof (NMP2PPeerPrivate));
+
+ /* virtual methods */
+ object_class->get_property = get_property;
+ object_class->finalize = finalize;
+
+ nm_object_class->init_dbus = init_dbus;
+
+ /* properties */
+
+ /**
+ * NMP2PPeer:flags:
+ *
+ * The flags of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_FLAGS,
+ g_param_spec_flags (NM_P2P_PEER_FLAGS, "", "",
+ NM_TYPE_802_11_AP_FLAGS,
+ NM_802_11_AP_FLAGS_NONE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:name:
+ *
+ * The name of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_NAME,
+ g_param_spec_string (NM_P2P_PEER_NAME, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:manufacturer:
+ *
+ * The manufacturer of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_MANUFACTURER,
+ g_param_spec_string (NM_P2P_PEER_MANUFACTURER, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:model:
+ *
+ * The model of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_MODEL,
+ g_param_spec_string (NM_P2P_PEER_MODEL, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:model-number:
+ *
+ * The hardware address of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_MODEL_NUMBER,
+ g_param_spec_string (NM_P2P_PEER_MODEL_NUMBER, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:serial:
+ *
+ * The serial number of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_SERIAL,
+ g_param_spec_string (NM_P2P_PEER_SERIAL, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:hw-address:
+ *
+ * The hardware address of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_HW_ADDRESS,
+ g_param_spec_string (NM_P2P_PEER_HW_ADDRESS, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:strength:
+ *
+ * The current signal strength of the P2P peer.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_STRENGTH,
+ g_param_spec_uchar (NM_P2P_PEER_STRENGTH, "", "",
+ 0, G_MAXUINT8, 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMP2PPeer:last-seen:
+ *
+ * The timestamp (in CLOCK_BOOTTIME seconds) for the last time the
+ * P2P peer was found. A value of -1 means the peer has never been seen.
+ *
+ * Since: 1.16
+ **/
+ g_object_class_install_property
+ (object_class, PROP_LAST_SEEN,
+ g_param_spec_int (NM_P2P_PEER_LAST_SEEN, "", "",
+ -1, G_MAXINT, -1,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+}
diff --git a/libnm/nm-p2p-peer.h b/libnm/nm-p2p-peer.h
new file mode 100644
index 0000000000..881f83abdf
--- /dev/null
+++ b/libnm/nm-p2p-peer.h
@@ -0,0 +1,101 @@
+/*
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2007 - 2008 Novell, Inc.
+ * Copyright 2007 - 2011 Red Hat, Inc.
+ */
+
+#ifndef __NM_P2P_PEER_H__
+#define __NM_P2P_PEER_H__
+
+#if !defined (__NETWORKMANAGER_H_INSIDE__) && !defined (NETWORKMANAGER_COMPILATION)
+#error "Only <NetworkManager.h> can be included directly."
+#endif
+
+#include "nm-object.h"
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_P2P_PEER (nm_p2p_peer_get_type ())
+#define NM_P2P_PEER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_P2P_PEER, NMP2PPeer))
+#define NM_P2P_PEER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_P2P_PEER, NMP2PPeerClass))
+#define NM_IS_P2P_PEER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_P2P_PEER))
+#define NM_IS_P2P_PEER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_P2P_PEER))
+#define NM_P2P_PEER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_P2P_PEER, NMP2PPeerClass))
+
+#define NM_P2P_PEER_FLAGS "flags"
+#define NM_P2P_PEER_NAME "name"
+#define NM_P2P_PEER_MANUFACTURER "manufacturer"
+#define NM_P2P_PEER_MODEL "model"
+#define NM_P2P_PEER_MODEL_NUMBER "model-number"
+#define NM_P2P_PEER_SERIAL "serial"
+#define NM_P2P_PEER_WFDIES "WFDIEs"
+#define NM_P2P_PEER_HW_ADDRESS "hw-address"
+#define NM_P2P_PEER_STRENGTH "strength"
+#define NM_P2P_PEER_LAST_SEEN "last-seen"
+
+/**
+ * NMP2PPeer:
+ */
+NM_AVAILABLE_IN_1_16
+struct _NMP2PPeer {
+ NMObject parent;
+};
+
+NM_AVAILABLE_IN_1_16
+typedef struct {
+ NMObjectClass parent;
+
+ /*< private >*/
+ gpointer padding[4];
+} NMP2PPeerClass;
+
+NM_AVAILABLE_IN_1_16
+GType nm_p2p_peer_get_type (void);
+
+NM_AVAILABLE_IN_1_16
+NM80211ApFlags nm_p2p_peer_get_flags (NMP2PPeer *peer);
+
+NM_AVAILABLE_IN_1_16
+const char * nm_p2p_peer_get_name (NMP2PPeer *peer);
+NM_AVAILABLE_IN_1_16
+const char * nm_p2p_peer_get_manufacturer (NMP2PPeer *peer);
+NM_AVAILABLE_IN_1_16
+const char * nm_p2p_peer_get_model (NMP2PPeer *peer);
+NM_AVAILABLE_IN_1_16
+const char * nm_p2p_peer_get_model_number (NMP2PPeer *peer);
+NM_AVAILABLE_IN_1_16
+const char * nm_p2p_peer_get_serial (NMP2PPeer *peer);
+
+NM_AVAILABLE_IN_1_16
+const char * nm_p2p_peer_get_hw_address (NMP2PPeer *peer);
+
+NM_AVAILABLE_IN_1_16
+guint8 nm_p2p_peer_get_strength (NMP2PPeer *peer);
+NM_AVAILABLE_IN_1_16
+int nm_p2p_peer_get_last_seen (NMP2PPeer *peer);
+
+NM_AVAILABLE_IN_1_16
+GPtrArray * nm_p2p_peer_filter_connections (NMP2PPeer *peer,
+ const GPtrArray *connections);
+
+NM_AVAILABLE_IN_1_16
+gboolean nm_p2p_peer_connection_valid (NMP2PPeer *peer,
+ NMConnection *connection);
+
+G_END_DECLS
+
+#endif /* __NM_P2P_PEER_H__ */
diff --git a/libnm/nm-types.h b/libnm/nm-types.h
index bb77e642df..97415cbf3f 100644
--- a/libnm/nm-types.h
+++ b/libnm/nm-types.h
@@ -59,6 +59,7 @@ typedef struct _NMDeviceWireGuard NMDeviceWireGuard;
typedef struct _NMDeviceWpan NMDeviceWpan;
typedef struct _NMDhcpConfig NMDhcpConfig;
typedef struct _NMIPConfig NMIPConfig;
+typedef struct _NMP2PPeer NMP2PPeer;
typedef struct _NMObject NMObject;
typedef struct _NMRemoteConnection NMRemoteConnection;
typedef struct _NMVpnConnection NMVpnConnection;