core/devices: Add P2P Wifi device and peer tracking

This only adds the new device type and simple peer list handling.
This commit is contained in:
Benjamin Berg 2018-10-10 23:30:46 +02:00 committed by Thomas Haller
parent 42e60e327f
commit 00e64d1332
16 changed files with 2539 additions and 91 deletions

View File

@ -389,30 +389,32 @@ introspection_libnmdbus_la_CPPFLAGS = $(GLIB_CFLAGS)
introspection_sources = \
introspection/org.freedesktop.NetworkManager.AccessPoint.c \
introspection/org.freedesktop.NetworkManager.AccessPoint.h \
introspection/org.freedesktop.NetworkManager.Connection.Active.c \
introspection/org.freedesktop.NetworkManager.Connection.Active.h \
introspection/org.freedesktop.NetworkManager.AgentManager.c \
introspection/org.freedesktop.NetworkManager.AgentManager.h \
introspection/org.freedesktop.NetworkManager.Checkpoint.c \
introspection/org.freedesktop.NetworkManager.Checkpoint.h \
introspection/org.freedesktop.NetworkManager.Connection.Active.c \
introspection/org.freedesktop.NetworkManager.Connection.Active.h \
introspection/org.freedesktop.NetworkManager.DHCP4Config.c \
introspection/org.freedesktop.NetworkManager.DHCP4Config.h \
introspection/org.freedesktop.NetworkManager.DHCP6Config.c \
introspection/org.freedesktop.NetworkManager.DHCP6Config.h \
introspection/org.freedesktop.NetworkManager.Device.Adsl.c \
introspection/org.freedesktop.NetworkManager.Device.Adsl.h \
introspection/org.freedesktop.NetworkManager.Device.Bluetooth.c \
introspection/org.freedesktop.NetworkManager.Device.Bluetooth.h \
introspection/org.freedesktop.NetworkManager.Device.Bond.c \
introspection/org.freedesktop.NetworkManager.Device.Bond.h \
introspection/org.freedesktop.NetworkManager.Device.Bridge.c \
introspection/org.freedesktop.NetworkManager.Device.Bridge.h \
introspection/org.freedesktop.NetworkManager.Device.Bluetooth.c \
introspection/org.freedesktop.NetworkManager.Device.Bluetooth.h \
introspection/org.freedesktop.NetworkManager.Device.Dummy.c \
introspection/org.freedesktop.NetworkManager.Device.Dummy.h \
introspection/org.freedesktop.NetworkManager.Device.Wired.c \
introspection/org.freedesktop.NetworkManager.Device.Wired.h \
introspection/org.freedesktop.NetworkManager.Device.Generic.c \
introspection/org.freedesktop.NetworkManager.Device.Generic.h \
introspection/org.freedesktop.NetworkManager.Device.Infiniband.c \
introspection/org.freedesktop.NetworkManager.Device.Infiniband.h \
introspection/org.freedesktop.NetworkManager.Device.IPTunnel.c \
introspection/org.freedesktop.NetworkManager.Device.IPTunnel.h \
introspection/org.freedesktop.NetworkManager.Device.Infiniband.c \
introspection/org.freedesktop.NetworkManager.Device.Infiniband.h \
introspection/org.freedesktop.NetworkManager.Device.Lowpan.c \
introspection/org.freedesktop.NetworkManager.Device.Lowpan.h \
introspection/org.freedesktop.NetworkManager.Device.Macsec.c \
@ -423,12 +425,14 @@ introspection_sources = \
introspection/org.freedesktop.NetworkManager.Device.Modem.h \
introspection/org.freedesktop.NetworkManager.Device.OlpcMesh.c \
introspection/org.freedesktop.NetworkManager.Device.OlpcMesh.h \
introspection/org.freedesktop.NetworkManager.Device.OvsBridge.c \
introspection/org.freedesktop.NetworkManager.Device.OvsBridge.h \
introspection/org.freedesktop.NetworkManager.Device.OvsInterface.c \
introspection/org.freedesktop.NetworkManager.Device.OvsInterface.h \
introspection/org.freedesktop.NetworkManager.Device.OvsPort.c \
introspection/org.freedesktop.NetworkManager.Device.OvsPort.h \
introspection/org.freedesktop.NetworkManager.Device.OvsBridge.c \
introspection/org.freedesktop.NetworkManager.Device.OvsBridge.h \
introspection/org.freedesktop.NetworkManager.Device.P2PWireless.c \
introspection/org.freedesktop.NetworkManager.Device.P2PWireless.h \
introspection/org.freedesktop.NetworkManager.Device.Ppp.c \
introspection/org.freedesktop.NetworkManager.Device.Ppp.h \
introspection/org.freedesktop.NetworkManager.Device.Statistics.c \
@ -443,28 +447,26 @@ introspection_sources = \
introspection/org.freedesktop.NetworkManager.Device.Vlan.h \
introspection/org.freedesktop.NetworkManager.Device.Vxlan.c \
introspection/org.freedesktop.NetworkManager.Device.Vxlan.h \
introspection/org.freedesktop.NetworkManager.Device.WireGuard.c \
introspection/org.freedesktop.NetworkManager.Device.WireGuard.h \
introspection/org.freedesktop.NetworkManager.Device.Wireless.c \
introspection/org.freedesktop.NetworkManager.Device.Wireless.h \
introspection/org.freedesktop.NetworkManager.Device.WiMax.c \
introspection/org.freedesktop.NetworkManager.Device.WiMax.h \
introspection/org.freedesktop.NetworkManager.Device.WireGuard.c \
introspection/org.freedesktop.NetworkManager.Device.WireGuard.h \
introspection/org.freedesktop.NetworkManager.Device.Wired.c \
introspection/org.freedesktop.NetworkManager.Device.Wired.h \
introspection/org.freedesktop.NetworkManager.Device.Wireless.c \
introspection/org.freedesktop.NetworkManager.Device.Wireless.h \
introspection/org.freedesktop.NetworkManager.Device.Wpan.c \
introspection/org.freedesktop.NetworkManager.Device.Wpan.h \
introspection/org.freedesktop.NetworkManager.Device.c \
introspection/org.freedesktop.NetworkManager.Device.h \
introspection/org.freedesktop.NetworkManager.DHCP4Config.c \
introspection/org.freedesktop.NetworkManager.DHCP4Config.h \
introspection/org.freedesktop.NetworkManager.DHCP6Config.c \
introspection/org.freedesktop.NetworkManager.DHCP6Config.h \
introspection/org.freedesktop.NetworkManager.DnsManager.c \
introspection/org.freedesktop.NetworkManager.DnsManager.h \
introspection/org.freedesktop.NetworkManager.IP4Config.c \
introspection/org.freedesktop.NetworkManager.IP4Config.h \
introspection/org.freedesktop.NetworkManager.IP6Config.c \
introspection/org.freedesktop.NetworkManager.IP6Config.h \
introspection/org.freedesktop.NetworkManager.c \
introspection/org.freedesktop.NetworkManager.h \
introspection/org.freedesktop.NetworkManager.P2PPeer.c \
introspection/org.freedesktop.NetworkManager.P2PPeer.h \
introspection/org.freedesktop.NetworkManager.PPP.c \
introspection/org.freedesktop.NetworkManager.PPP.h \
introspection/org.freedesktop.NetworkManager.SecretAgent.c \
@ -476,56 +478,62 @@ introspection_sources = \
introspection/org.freedesktop.NetworkManager.VPN.Connection.c \
introspection/org.freedesktop.NetworkManager.VPN.Connection.h \
introspection/org.freedesktop.NetworkManager.VPN.Plugin.c \
introspection/org.freedesktop.NetworkManager.VPN.Plugin.h
introspection/org.freedesktop.NetworkManager.VPN.Plugin.h \
introspection/org.freedesktop.NetworkManager.c \
introspection/org.freedesktop.NetworkManager.h \
$(NULL)
nodist_introspection_libnmdbus_la_SOURCES = $(introspection_sources)
DBUS_INTERFACE_DOCS = \
docs/api/dbus-org.freedesktop.NetworkManager.AccessPoint.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Connection.Active.xml \
docs/api/dbus-org.freedesktop.NetworkManager.AgentManager.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Checkpoint.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Team.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Connection.Active.xml \
docs/api/dbus-org.freedesktop.NetworkManager.DHCP4Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.DHCP6Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Wireless.xml \
docs/api/dbus-org.freedesktop.NetworkManager.xml \
docs/api/dbus-org.freedesktop.NetworkManager.VPN.Connection.xml \
docs/api/dbus-org.freedesktop.NetworkManager.SecretAgent.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.xml \
docs/api/dbus-org.freedesktop.NetworkManager.VPN.Plugin.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Adsl.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Bluetooth.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Dummy.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Vxlan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Settings.Connection.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Bond.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Bridge.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Dummy.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Generic.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.IPTunnel.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Infiniband.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Lowpan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Macsec.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Macvlan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.PPP.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Vlan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Adsl.xml \
docs/api/dbus-org.freedesktop.NetworkManager.AgentManager.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.WiMax.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Wpan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.IPTunnel.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Tun.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Bridge.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Modem.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.OlpcMesh.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.OvsBridge.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.OvsInterface.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.OvsPort.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.OvsBridge.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.P2PWireless.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Ppp.xml \
docs/api/dbus-org.freedesktop.NetworkManager.DHCP4Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Generic.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Infiniband.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Modem.xml \
docs/api/dbus-org.freedesktop.NetworkManager.IP6Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Veth.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Settings.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Wired.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.WireGuard.xml \
docs/api/dbus-org.freedesktop.NetworkManager.IP4Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Statistics.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Team.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Tun.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Veth.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Vlan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Vxlan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.WiMax.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.WireGuard.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Wired.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Wireless.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Wpan.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.xml \
docs/api/dbus-org.freedesktop.NetworkManager.DnsManager.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Device.Lowpan.xml
docs/api/dbus-org.freedesktop.NetworkManager.IP4Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.IP6Config.xml \
docs/api/dbus-org.freedesktop.NetworkManager.P2PPeer.xml \
docs/api/dbus-org.freedesktop.NetworkManager.PPP.xml \
docs/api/dbus-org.freedesktop.NetworkManager.SecretAgent.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Settings.Connection.xml \
docs/api/dbus-org.freedesktop.NetworkManager.Settings.xml \
docs/api/dbus-org.freedesktop.NetworkManager.VPN.Connection.xml \
docs/api/dbus-org.freedesktop.NetworkManager.VPN.Plugin.xml \
docs/api/dbus-org.freedesktop.NetworkManager.xml \
$(NULL)
introspection/%.c: introspection/%.xml
@$(MKDIR_P) introspection/
@ -566,6 +574,7 @@ dbusinterfaces_DATA = \
introspection/org.freedesktop.NetworkManager.Device.OvsInterface.xml \
introspection/org.freedesktop.NetworkManager.Device.OvsPort.xml \
introspection/org.freedesktop.NetworkManager.Device.OvsBridge.xml \
introspection/org.freedesktop.NetworkManager.Device.P2PWireless.xml \
introspection/org.freedesktop.NetworkManager.Device.Ppp.xml \
introspection/org.freedesktop.NetworkManager.Device.Statistics.xml \
introspection/org.freedesktop.NetworkManager.Device.Team.xml \
@ -584,6 +593,7 @@ dbusinterfaces_DATA = \
introspection/org.freedesktop.NetworkManager.IP4Config.xml \
introspection/org.freedesktop.NetworkManager.IP6Config.xml \
introspection/org.freedesktop.NetworkManager.xml \
introspection/org.freedesktop.NetworkManager.P2PPeer.xml \
introspection/org.freedesktop.NetworkManager.PPP.xml \
introspection/org.freedesktop.NetworkManager.SecretAgent.xml \
introspection/org.freedesktop.NetworkManager.Settings.Connection.xml \
@ -3240,24 +3250,30 @@ if WITH_WIFI
core_plugins += src/devices/wifi/libnm-device-plugin-wifi.la
src_devices_wifi_libnm_device_plugin_wifi_la_SOURCES = \
src/devices/wifi/nm-wifi-factory.c \
src/devices/wifi/nm-device-olpc-mesh.c \
src/devices/wifi/nm-device-olpc-mesh.h \
src/devices/wifi/nm-device-p2p-wifi.c \
src/devices/wifi/nm-device-p2p-wifi.h \
src/devices/wifi/nm-device-wifi.c \
src/devices/wifi/nm-device-wifi.h \
src/devices/wifi/nm-wifi-ap.c \
src/devices/wifi/nm-wifi-ap.h \
src/devices/wifi/nm-wifi-utils.c \
src/devices/wifi/nm-wifi-utils.h \
src/devices/wifi/nm-wifi-common.c \
src/devices/wifi/nm-wifi-common.h \
src/devices/wifi/nm-device-olpc-mesh.c \
src/devices/wifi/nm-device-olpc-mesh.h
src/devices/wifi/nm-wifi-factory.c \
src/devices/wifi/nm-wifi-p2p-peer.c \
src/devices/wifi/nm-wifi-p2p-peer.h \
src/devices/wifi/nm-wifi-utils.c \
src/devices/wifi/nm-wifi-utils.h \
$(NULL)
if WITH_IWD
src_devices_wifi_libnm_device_plugin_wifi_la_SOURCES += \
src/devices/wifi/nm-device-iwd.c \
src/devices/wifi/nm-device-iwd.h \
src/devices/wifi/nm-iwd-manager.c \
src/devices/wifi/nm-iwd-manager.h
src/devices/wifi/nm-iwd-manager.h \
$(NULL)
endif
src_devices_wifi_libnm_device_plugin_wifi_la_CPPFLAGS = $(src_cppflags_device_plugin)

View File

@ -352,6 +352,7 @@ NM_UTILS_LOOKUP_STR_DEFINE (nmc_device_reason_to_string, NMDeviceStateReason,
NM_UTILS_LOOKUP_ITEM (NM_DEVICE_STATE_REASON_IP_ADDRESS_DUPLICATE, N_("A duplicate IP address was detected")),
NM_UTILS_LOOKUP_ITEM (NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED, N_("The selected IP method is not supported")),
NM_UTILS_LOOKUP_ITEM (NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED, N_("Failed to configure SR-IOV parameters")),
NM_UTILS_LOOKUP_ITEM (NM_DEVICE_STATE_REASON_PEER_NOT_FOUND, N_("The Wi-Fi P2P peer could not be found")),
)
NM_UTILS_LOOKUP_STR_DEFINE (nm_active_connection_state_reason_to_string, NMActiveConnectionStateReason,

View File

@ -42,42 +42,43 @@ MKHTML_OPTIONS=--path="$(abs_srcdir)"
content_files = \
$(GENERATED_FILES) \
dbus-org.freedesktop.NetworkManager.AccessPoint.xml \
dbus-org.freedesktop.NetworkManager.Connection.Active.xml \
dbus-org.freedesktop.NetworkManager.Device.Team.xml \
dbus-org.freedesktop.NetworkManager.DHCP6Config.xml \
dbus-org.freedesktop.NetworkManager.Device.Wireless.xml \
dbus-org.freedesktop.NetworkManager.xml \
dbus-org.freedesktop.NetworkManager.VPN.Connection.xml \
dbus-org.freedesktop.NetworkManager.SecretAgent.xml \
dbus-org.freedesktop.NetworkManager.Device.xml \
dbus-org.freedesktop.NetworkManager.VPN.Plugin.xml \
dbus-org.freedesktop.NetworkManager.Device.Bluetooth.xml \
dbus-org.freedesktop.NetworkManager.Device.Dummy.xml \
dbus-org.freedesktop.NetworkManager.Device.Vxlan.xml \
dbus-org.freedesktop.NetworkManager.Settings.Connection.xml \
dbus-org.freedesktop.NetworkManager.Device.Bond.xml \
dbus-org.freedesktop.NetworkManager.Device.Macvlan.xml \
dbus-org.freedesktop.NetworkManager.Device.Macsec.xml \
dbus-org.freedesktop.NetworkManager.PPP.xml \
dbus-org.freedesktop.NetworkManager.Device.Vlan.xml \
dbus-org.freedesktop.NetworkManager.Device.Adsl.xml \
dbus-org.freedesktop.NetworkManager.AgentManager.xml \
dbus-org.freedesktop.NetworkManager.Device.IPTunnel.xml \
dbus-org.freedesktop.NetworkManager.Device.Tun.xml \
dbus-org.freedesktop.NetworkManager.Device.Bridge.xml \
dbus-org.freedesktop.NetworkManager.Device.OlpcMesh.xml \
dbus-org.freedesktop.NetworkManager.Connection.Active.xml \
dbus-org.freedesktop.NetworkManager.DHCP4Config.xml \
dbus-org.freedesktop.NetworkManager.DHCP6Config.xml \
dbus-org.freedesktop.NetworkManager.Device.Adsl.xml \
dbus-org.freedesktop.NetworkManager.Device.Bluetooth.xml \
dbus-org.freedesktop.NetworkManager.Device.Bond.xml \
dbus-org.freedesktop.NetworkManager.Device.Bridge.xml \
dbus-org.freedesktop.NetworkManager.Device.Dummy.xml \
dbus-org.freedesktop.NetworkManager.Device.Generic.xml \
dbus-org.freedesktop.NetworkManager.Device.IPTunnel.xml \
dbus-org.freedesktop.NetworkManager.Device.Infiniband.xml \
dbus-org.freedesktop.NetworkManager.Device.Macsec.xml \
dbus-org.freedesktop.NetworkManager.Device.Macvlan.xml \
dbus-org.freedesktop.NetworkManager.Device.Modem.xml \
dbus-org.freedesktop.NetworkManager.IP6Config.xml \
dbus-org.freedesktop.NetworkManager.Device.Veth.xml \
dbus-org.freedesktop.NetworkManager.Settings.xml \
dbus-org.freedesktop.NetworkManager.Device.Wired.xml \
dbus-org.freedesktop.NetworkManager.Device.WireGuard.xml \
dbus-org.freedesktop.NetworkManager.IP4Config.xml \
dbus-org.freedesktop.NetworkManager.Device.OlpcMesh.xml \
dbus-org.freedesktop.NetworkManager.Device.Statistics.xml \
dbus-org.freedesktop.NetworkManager.Device.Team.xml \
dbus-org.freedesktop.NetworkManager.Device.Tun.xml \
dbus-org.freedesktop.NetworkManager.Device.Veth.xml \
dbus-org.freedesktop.NetworkManager.Device.Vlan.xml \
dbus-org.freedesktop.NetworkManager.Device.Vxlan.xml \
dbus-org.freedesktop.NetworkManager.Device.WireGuard.xml \
dbus-org.freedesktop.NetworkManager.Device.P2PWireless.xml \
dbus-org.freedesktop.NetworkManager.Device.Wired.xml \
dbus-org.freedesktop.NetworkManager.Device.Wireless.xml \
dbus-org.freedesktop.NetworkManager.Device.xml \
dbus-org.freedesktop.NetworkManager.DnsManager.xml \
dbus-org.freedesktop.NetworkManager.IP4Config.xml \
dbus-org.freedesktop.NetworkManager.IP6Config.xml \
dbus-org.freedesktop.NetworkManager.PPP.xml \
dbus-org.freedesktop.NetworkManager.SecretAgent.xml \
dbus-org.freedesktop.NetworkManager.Settings.Connection.xml \
dbus-org.freedesktop.NetworkManager.Settings.xml \
dbus-org.freedesktop.NetworkManager.VPN.Connection.xml \
dbus-org.freedesktop.NetworkManager.VPN.Plugin.xml \
dbus-org.freedesktop.NetworkManager.xml \
$(top_builddir)/libnm-core/nm-dbus-types.xml \
$(top_builddir)/libnm-core/nm-vpn-dbus-types.xml \
$(top_builddir)/man/nmcli.xml \

View File

@ -206,6 +206,7 @@
<xi:include href="dbus-org.freedesktop.NetworkManager.Device.Vxlan.xml"/>
<xi:include href="dbus-org.freedesktop.NetworkManager.Device.WireGuard.xml"/>
<xi:include href="dbus-org.freedesktop.NetworkManager.Device.Wireless.xml"/>
<xi:include href="dbus-org.freedesktop.NetworkManager.Device.P2PWireless.xml"/>
<xi:include href="dbus-org.freedesktop.NetworkManager.Device.Wpan.xml"/>
<xi:include href="dbus-org.freedesktop.NetworkManager.PPP.xml"/>
</chapter>
@ -247,6 +248,12 @@
<xi:include href="dbus-org.freedesktop.NetworkManager.AccessPoint.xml"/>
</chapter>
<chapter id="ref-dbus-p2p-peers">
<title>The <literal>/org/freedesktop/NetworkManager/P2PPeer/*</literal> objects</title>
<!-- TODO: Describe the objects here -->
<xi:include href="dbus-org.freedesktop.NetworkManager.P2PPeer.xml"/>
</chapter>
<chapter id="ref-dbus-checkpoint">
<title>The <literal>/org/freedesktop/NetworkManager/Checkpoint/*</literal> objects</title>
<!-- TODO: Describe the objects here -->

View File

@ -23,6 +23,7 @@ ifaces = [
'org.freedesktop.NetworkManager.Device.OvsInterface',
'org.freedesktop.NetworkManager.Device.OvsPort',
'org.freedesktop.NetworkManager.Device.OvsBridge',
'org.freedesktop.NetworkManager.Device.P2PWireless',
'org.freedesktop.NetworkManager.Device.Ppp',
'org.freedesktop.NetworkManager.Device.Statistics',
'org.freedesktop.NetworkManager.Device.Team',
@ -42,6 +43,7 @@ ifaces = [
'org.freedesktop.NetworkManager.IP4Config',
'org.freedesktop.NetworkManager.IP6Config',
'org.freedesktop.NetworkManager',
'org.freedesktop.NetworkManager.P2PPeer',
'org.freedesktop.NetworkManager.PPP',
'org.freedesktop.NetworkManager.SecretAgent',
'org.freedesktop.NetworkManager.Settings.Connection',

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<node name="/">
<!--
org.freedesktop.NetworkManager.Device.P2PWireless:
@short_description: P2P Wi-Fi Device
-->
<interface name="org.freedesktop.NetworkManager.Device.P2PWireless">
<annotation name="org.gtk.GDBus.C.Name" value="Device_P2P_Wifi"/>
<!--
HwAddress:
The active hardware address of the device.
-->
<property name="HwAddress" type="s" access="read"/>
<!--
GroupOwner:
Whether this device is currently the group owner.
-->
<property name="GroupOwner" type="b" access="read"/>
<!--
WFDIEs:
The Wi-Fi Display information elements.
-->
<property name="WFDIEs" type="ay" access="read">
<!-- gdbus-codegen assumes that "ay" means "non-UTF-8 string" and
won't deal with '\0' bytes correctly.
-->
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="1"/>
</property>
<!--
Peers:
List of object paths of peers visible to this p2p wireless device.
-->
<property name="Peers" type="ao" access="read"/>
<!--
PeerAdded:
@peer: The object path of the newly found access point.
Emitted when a new P2P peer is found by the device.
-->
<signal name="PeerAdded">
<arg name="peer" type="o"/>
</signal>
<!--
PeerRemoved:
@peer: The object path of the P2P peer that has disappeared.
Emitted when a P2P peer disappears from view of the device.
-->
<signal name="PeerRemoved">
<arg name="peer" type="o"/>
</signal>
</interface>
</node>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<node name="/">
<!--
org.freedesktop.NetworkManager.P2PPeer:
@short_description: P2P Wi-Fi Peer
-->
<interface name="org.freedesktop.NetworkManager.P2PPeer">
<annotation name="org.gtk.GDBus.C.Name" value="P2P_Peer"/>
<!--
Flags:
Flags describing the capabilities of the access point.
Returns: <link linkend="NM80211ApFlags">NM80211ApFlags</link>
-->
<property name="Flags" type="u" access="read"/>
<!--
Manufacturer:
The manufacturer of the P2P peer.
-->
<property name="Manufacturer" type="s" access="read"/>
<!--
Model:
The model of the P2P peer.
-->
<property name="Model" type="s" access="read"/>
<!--
ModelNumber:
The model number of the P2P peer.
-->
<property name="ModelNumber" type="s" access="read"/>
<!--
Serial:
The serial number of the P2P peer.
-->
<property name="Serial" type="s" access="read"/>
<!--
Wfdies:
The Wi-Fi Display Information Elements of the P2P peer.
-->
<property name="WfdIEs" type="ay" access="read"/>
<!--
HwAddress:
The hardware address (BSSID) of the access point.
-->
<property name="HwAddress" type="s" access="read"/>
<!--
Strength:
The current signal quality of the access point, in percent.
-->
<property name="Strength" type="y" access="read"/>
<!--
LastSeen:
The timestamp (in CLOCK_BOOTTIME seconds) for the last time the access
point was found in scan results. A value of -1 means the access point has
never been found in scan results.
-->
<property name="LastSeen" type="i" access="read"/>
</interface>
</node>

View File

@ -44,6 +44,7 @@
#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
#define NM_DBUS_INTERFACE_DEVICE_ADSL NM_DBUS_INTERFACE_DEVICE ".Adsl"
#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
#define NM_DBUS_INTERFACE_DEVICE_P2P_WIRELESS NM_DBUS_INTERFACE_DEVICE ".P2PWireless"
#define NM_DBUS_INTERFACE_DEVICE_BLUETOOTH NM_DBUS_INTERFACE_DEVICE ".Bluetooth"
#define NM_DBUS_INTERFACE_DEVICE_OLPC_MESH NM_DBUS_INTERFACE_DEVICE ".OlpcMesh"
#define NM_DBUS_INTERFACE_DEVICE_OVS_INTERFACE NM_DBUS_INTERFACE_DEVICE ".OvsInterface"
@ -51,6 +52,8 @@
#define NM_DBUS_INTERFACE_DEVICE_OVS_BRIDGE NM_DBUS_INTERFACE_DEVICE ".OvsBridge"
#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
#define NM_DBUS_PATH_P2P_PEER NM_DBUS_PATH "/P2PPeer"
#define NM_DBUS_INTERFACE_P2P_PEER NM_DBUS_INTERFACE ".P2PPeer"
#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem"
#define NM_DBUS_INTERFACE_DEVICE_WIMAX NM_DBUS_INTERFACE_DEVICE ".WiMax"
#define NM_DBUS_INTERFACE_WIMAX_NSP NM_DBUS_INTERFACE ".WiMax.Nsp"
@ -563,6 +566,7 @@ typedef enum {
* @NM_DEVICE_STATE_REASON_IP_ADDRESS_DUPLICATE: a duplicate IP address was detected
* @NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED: The selected IP method is not supported
* @NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED: configuration of SR-IOV parameters failed
* @NM_DEVICE_STATE_REASON_PEER_NOT_FOUND: The Wi-Fi P2P peer could not be found
*
* Device state change reason codes
*/
@ -634,6 +638,7 @@ typedef enum {
NM_DEVICE_STATE_REASON_IP_ADDRESS_DUPLICATE = 64,
NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED = 65,
NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED = 66,
NM_DEVICE_STATE_REASON_PEER_NOT_FOUND = 67,
} NMDeviceStateReason;
/**

View File

@ -742,6 +742,7 @@ NM_UTILS_LOOKUP_STR_DEFINE (nm_device_state_reason_to_str, NMDeviceStateReason,
NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_IP_ADDRESS_DUPLICATE, "ip-address-duplicate"),
NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED, "ip-method-unsupported"),
NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED, "sriov-configuration-failed"),
NM_UTILS_LOOKUP_STR_ITEM (NM_DEVICE_STATE_REASON_PEER_NOT_FOUND, "peer-not-found"),
);
#define reason_to_string_a(reason) NM_UTILS_LOOKUP_STR_A (nm_device_state_reason_to_str, reason)

View File

@ -1,13 +1,15 @@
common_sources = files(
'nm-wifi-ap.c',
'nm-wifi-p2p-peer.c',
'nm-wifi-utils.c',
)
sources = common_sources + files(
'nm-wifi-factory.c',
'nm-wifi-common.c',
'nm-device-wifi.c',
'nm-device-olpc-mesh.c',
'nm-device-p2p-wifi.c',
'nm-device-wifi.c',
'nm-wifi-common.c',
'nm-wifi-factory.c',
)
if enable_iwd

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,56 @@
/* NetworkManager -- P2P Wi-Fi Device
*
* 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.
*
* (C) Copyright 2018 Red Hat, Inc.
*/
#ifndef __NM_DEVICE_P2P_WIFI_H__
#define __NM_DEVICE_P2P_WIFI_H__
#include "devices/nm-device.h"
#include "supplicant/nm-supplicant-interface.h"
#define NM_TYPE_DEVICE_P2P_WIFI (nm_device_p2p_wifi_get_type ())
#define NM_DEVICE_P2P_WIFI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DEVICE_P2P_WIFI, NMDeviceP2PWifi))
#define NM_DEVICE_P2P_WIFI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DEVICE_P2P_WIFI, NMDeviceP2PWifiClass))
#define NM_IS_DEVICE_P2P_WIFI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DEVICE_P2P_WIFI))
#define NM_IS_DEVICE_P2P_WIFI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_P2P_WIFI))
#define NM_DEVICE_P2P_WIFI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_P2P_WIFI, NMDeviceP2PWifiClass))
#define NM_DEVICE_P2P_WIFI_GROUP_OWNER "group-owner"
#define NM_DEVICE_P2P_WIFI_PEERS "peers"
#define NM_DEVICE_P2P_WIFI_GROUPS "groups"
#define NM_DEVICE_P2P_WIFI_WFDIES "WFDIEs"
#define NM_DEVICE_P2P_WIFI_MGMT_IFACE "mgmt-iface"
typedef struct _NMDeviceP2PWifi NMDeviceP2PWifi;
typedef struct _NMDeviceP2PWifiClass NMDeviceP2PWifiClass;
GType nm_device_p2p_wifi_get_type (void);
NMDevice* nm_device_p2p_wifi_new (NMSupplicantInterface *mgmt_iface,
const char* iface);
NMSupplicantInterface * nm_device_p2p_wifi_get_mgmt_iface (NMDeviceP2PWifi *self);
void nm_device_p2p_wifi_set_mgmt_iface (NMDeviceP2PWifi *self,
NMSupplicantInterface *iface);
void nm_device_p2p_wifi_remove (NMDeviceP2PWifi *self);
#endif /* __NM_DEVICE_P2P_WIFI_H__ */

View File

@ -0,0 +1,808 @@
/* NetworkManager -- P2P Wi-Fi Peer
*
* 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 (C) 2018 Red Hat, Inc.
*/
#include "nm-default.h"
#include "nm-wifi-p2p-peer.h"
#include <string.h>
#include <stdlib.h>
#include "nm-setting-wireless.h"
#include "nm-wifi-utils.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
#include "nm-core-internal.h"
#include "platform/nm-platform.h"
#include "devices/nm-device.h"
#include "nm-dbus-manager.h"
/*****************************************************************************/
NM_GOBJECT_PROPERTIES_DEFINE (NMWifiP2PPeer,
PROP_NAME,
PROP_MANUFACTURER,
PROP_MODEL,
PROP_MODEL_NUMBER,
PROP_SERIAL,
//PROP_PRIMARY_DEVICE_TYPE, { "PrimaryDeviceType", WPAS_DBUS_NEW_IFACE_P2P_PEER, "ay",
// "devicecapability", WPAS_DBUS_NEW_IFACE_P2P_PEER, "y",
// "groupcapability", WPAS_DBUS_NEW_IFACE_P2P_PEER, "y",
// "SecondaryDeviceTypes", WPAS_DBUS_NEW_IFACE_P2P_PEER, "aay",
// "VendorExtension", WPAS_DBUS_NEW_IFACE_P2P_PEER, "aay",
PROP_WFD_IES,
PROP_GROUPS,
PROP_HW_ADDRESS,
//PROP_MODE,
PROP_STRENGTH,
PROP_LAST_SEEN,
//PROP_MAX_BITRATE,
// One of the following (FLAGS would simply mirror/use the same as AP flags)
PROP_FLAGS,
//PROP_CONFIG_METHOD,
);
struct _NMWifiP2PPeerPrivate {
char *supplicant_path; /* D-Bus object path of this Peer from wpa_supplicant */
/* Scanned or cached values */
char * name;
char * manufacturer;
char * model;
char * model_number;
char * serial;
char * address;
GBytes * wfd_ies;
char ** groups;
guint8 strength;
NM80211ApFlags flags; /* General flags */
/* Non-scanned attributes */
gint32 last_seen; /* Timestamp when the Peer was seen lastly (obtained via nm_utils_get_monotonic_timestamp_s()) */
};
typedef struct _NMWifiP2PPeerPrivate NMWifiP2PPeerPrivate;
struct _NMWifiP2PPeerClass {
NMDBusObjectClass parent;
};
G_DEFINE_TYPE (NMWifiP2PPeer, nm_wifi_p2p_peer, NM_TYPE_DBUS_OBJECT)
#define NM_WIFI_P2P_PEER_GET_PRIVATE(self) _NM_GET_PRIVATE_PTR(self, NMWifiP2PPeer, NM_IS_WIFI_P2P_PEER)
/*****************************************************************************/
const char *
nm_wifi_p2p_peer_get_supplicant_path (NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->supplicant_path;
}
const char *
nm_wifi_p2p_peer_get_name (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->name;
}
gboolean
nm_wifi_p2p_peer_set_name (NMWifiP2PPeer *peer, const char *name)
{
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
if (g_strcmp0 (name, priv->name) == 0)
return FALSE;
g_clear_pointer (&priv->name, g_free);
if (name)
priv->name = g_strdup (name);
_notify (peer, PROP_NAME);
return TRUE;
}
const char *
nm_wifi_p2p_peer_get_manufacturer (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->manufacturer;
}
gboolean
nm_wifi_p2p_peer_set_manufacturer (NMWifiP2PPeer *peer, const char *manufacturer)
{
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
if (g_strcmp0 (manufacturer, priv->manufacturer) == 0)
return FALSE;
g_clear_pointer (&priv->manufacturer, g_free);
if (manufacturer)
priv->manufacturer = g_strdup (manufacturer);
_notify (peer, PROP_MANUFACTURER);
return TRUE;
}
const char *
nm_wifi_p2p_peer_get_model (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->model;
}
gboolean
nm_wifi_p2p_peer_set_model (NMWifiP2PPeer *peer, const char *model)
{
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
if (g_strcmp0 (model, priv->model) == 0)
return FALSE;
g_clear_pointer (&priv->model, g_free);
if (model)
priv->model = g_strdup (model);
_notify (peer, PROP_MODEL);
return TRUE;
}
const char *
nm_wifi_p2p_peer_get_model_number (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->model_number;
}
gboolean
nm_wifi_p2p_peer_set_model_number (NMWifiP2PPeer *peer, const char *model_number)
{
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
if (g_strcmp0 (model_number, priv->model_number) == 0)
return FALSE;
g_clear_pointer (&priv->model_number, g_free);
if (model_number)
priv->model_number = g_strdup (model_number);
_notify (peer, PROP_MODEL_NUMBER);
return TRUE;
}
const char *
nm_wifi_p2p_peer_get_serial (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->serial;
}
gboolean
nm_wifi_p2p_peer_set_serial (NMWifiP2PPeer *peer, const char *serial)
{
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
if (g_strcmp0 (serial, priv->serial) == 0)
return FALSE;
g_clear_pointer (&priv->serial, g_free);
if (serial)
priv->serial = g_strdup (serial);
_notify (peer, PROP_SERIAL);
return TRUE;
}
GBytes *
nm_wifi_p2p_peer_get_wfd_ies (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->wfd_ies;
}
gboolean
nm_wifi_p2p_peer_set_wfd_ies (NMWifiP2PPeer *peer, GBytes *wfd_ies)
{
NMWifiP2PPeerPrivate *priv;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
if (nm_gbytes_equal0 (priv->wfd_ies, wfd_ies))
return FALSE;
g_bytes_unref (priv->wfd_ies);
priv->wfd_ies = wfd_ies ? g_bytes_ref (wfd_ies) : NULL;
_notify (peer, PROP_WFD_IES);
return TRUE;
}
const char *const*
nm_wifi_p2p_peer_get_groups (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return (const char * const*) NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->groups;
}
static gboolean
nm_wifi_p2p_peer_set_groups (NMWifiP2PPeer *peer, const char** groups)
{
NMWifiP2PPeerPrivate *priv;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
g_return_val_if_fail (groups != NULL, FALSE);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
if (_nm_utils_strv_equal (priv->groups, (char **) groups))
return FALSE;
g_strfreev (priv->groups);
priv->groups = g_strdupv ((char**) groups);
_notify (peer, PROP_GROUPS);
return TRUE;
}
const char *
nm_wifi_p2p_peer_get_address (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NULL);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->address;
}
static gboolean
nm_wifi_p2p_peer_set_address_bin (NMWifiP2PPeer *peer, const guint8 addr[static ETH_ALEN])
{
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
if ( priv->address
&& nm_utils_hwaddr_matches (addr, ETH_ALEN, priv->address, -1))
return FALSE;
g_free (priv->address);
priv->address = nm_utils_hwaddr_ntoa (addr, ETH_ALEN);
_notify (peer, PROP_HW_ADDRESS);
return TRUE;
}
gboolean
nm_wifi_p2p_peer_set_address (NMWifiP2PPeer *peer, const char *addr)
{
guint8 addr_buf[ETH_ALEN];
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
if ( !addr
|| !nm_utils_hwaddr_aton (addr, addr_buf, sizeof (addr_buf)))
g_return_val_if_reached (FALSE);
return nm_wifi_p2p_peer_set_address_bin (peer, addr_buf);
}
gint8
nm_wifi_p2p_peer_get_strength (NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), 0);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->strength;
}
gboolean
nm_wifi_p2p_peer_set_strength (NMWifiP2PPeer *peer, const gint8 strength)
{
NMWifiP2PPeerPrivate *priv;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
if (priv->strength != strength) {
priv->strength = strength;
_notify (peer, PROP_STRENGTH);
return TRUE;
}
return FALSE;
}
NM80211ApFlags
nm_wifi_p2p_peer_get_flags (const NMWifiP2PPeer *peer)
{
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), NM_802_11_AP_FLAGS_NONE);
return NM_WIFI_P2P_PEER_GET_PRIVATE (peer)->flags;
}
static gboolean
nm_wifi_p2p_peer_set_last_seen (NMWifiP2PPeer *peer, gint32 last_seen)
{
NMWifiP2PPeerPrivate *priv;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
if (priv->last_seen != last_seen) {
priv->last_seen = last_seen;
_notify (peer, PROP_LAST_SEEN);
return TRUE;
}
return FALSE;
}
/*****************************************************************************/
gboolean
nm_wifi_p2p_peer_update_from_properties (NMWifiP2PPeer *peer,
const char *supplicant_path,
GVariant *properties)
{
NMWifiP2PPeerPrivate *priv;
const guint8 *bytes;
GVariant *v;
gsize len;
const char *s;
const char **sv;
gint32 i32;
gboolean changed = FALSE;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (peer), FALSE);
g_return_val_if_fail (properties, FALSE);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (peer);
g_object_freeze_notify (G_OBJECT (peer));
if (g_variant_lookup (properties, "level", "i", &i32))
changed |= nm_wifi_p2p_peer_set_strength (peer, nm_wifi_utils_level_to_quality (i32));
if (g_variant_lookup (properties, "DeviceName", "&s", &s))
changed |= nm_wifi_p2p_peer_set_name (peer, s);
if (g_variant_lookup (properties, "Manufacturer", "&s", &s))
changed |= nm_wifi_p2p_peer_set_manufacturer (peer, s);
if (g_variant_lookup (properties, "Model", "&s", &s))
changed |= nm_wifi_p2p_peer_set_model (peer, s);
if (g_variant_lookup (properties, "ModelNumber", "&s", &s))
changed |= nm_wifi_p2p_peer_set_model_number (peer, s);
if (g_variant_lookup (properties, "Serial", "&s", &s))
changed |= nm_wifi_p2p_peer_set_serial (peer, s);
v = g_variant_lookup_value (properties, "DeviceAddress", G_VARIANT_TYPE_BYTESTRING);
if (v) {
bytes = g_variant_get_fixed_array (v, &len, 1);
if ( len == ETH_ALEN
&& memcmp (bytes, nm_ip_addr_zero.addr_eth, ETH_ALEN) != 0
&& memcmp (bytes, (char[ETH_ALEN]) { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, ETH_ALEN) != 0)
changed |= nm_wifi_p2p_peer_set_address_bin (peer, bytes);
g_variant_unref (v);
}
/* The IEs property contains the WFD R1 subelements */
v = g_variant_lookup_value (properties, "IEs", G_VARIANT_TYPE_BYTESTRING);
if (v) {
gs_unref_bytes GBytes *b = NULL;
bytes = g_variant_get_fixed_array (v, &len, 1);
b = g_bytes_new (bytes, len);
changed |= nm_wifi_p2p_peer_set_wfd_ies (peer, b);
g_variant_unref (v);
}
v = g_variant_lookup_value (properties, "Groups", G_VARIANT_TYPE_OBJECT_PATH_ARRAY);
if (v) {
sv = g_variant_get_objv (v, NULL);
changed |= nm_wifi_p2p_peer_set_groups (peer, sv);
g_free (sv);
}
/*if (max_rate)
changed |= nm_wifi_p2p_peer_set_max_bitrate (peer, max_rate / 1000);*/
if (!priv->supplicant_path) {
priv->supplicant_path = g_strdup (supplicant_path);
changed = TRUE;
}
changed |= nm_wifi_p2p_peer_set_last_seen (peer, nm_utils_get_monotonic_timestamp_s ());
g_object_thaw_notify (G_OBJECT (peer));
return changed;
}
const char *
nm_wifi_p2p_peer_to_string (const NMWifiP2PPeer *self,
char *str_buf,
gsize buf_len,
gint32 now_s)
{
const NMWifiP2PPeerPrivate *priv;
const char *supplicant_id = "-";
const char* export_path;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (self), NULL);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (self);
if (priv->supplicant_path)
supplicant_id = strrchr (priv->supplicant_path, '/') ?: supplicant_id;
export_path = nm_dbus_object_get_path (NM_DBUS_OBJECT (self));
if (export_path)
export_path = strrchr (export_path, '/') ?: export_path;
else
export_path = "/";
g_snprintf (str_buf, buf_len,
"%17s [n:%s, m:%s, mod:%s, mod_num:%s, ser:%s] %3us sup:%s [nm:%s]",
priv->address ?: "(none)",
priv->name,
priv->manufacturer,
priv->model,
priv->model_number,
priv->serial,
priv->last_seen > 0 ? ((now_s > 0 ? now_s : nm_utils_get_monotonic_timestamp_s ()) - priv->last_seen) : -1,
supplicant_id,
export_path);
return str_buf;
}
gboolean
nm_wifi_p2p_peer_check_compatible (NMWifiP2PPeer *self,
NMConnection *connection)
{
NMWifiP2PPeerPrivate *priv;
NMSettingP2PWireless *s_p2p_wireless;
const char *hwaddr;
g_return_val_if_fail (NM_IS_WIFI_P2P_PEER (self), FALSE);
g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
priv = NM_WIFI_P2P_PEER_GET_PRIVATE (self);
s_p2p_wireless = NM_SETTING_P2P_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_P2P_WIRELESS));
if (s_p2p_wireless == NULL)
return FALSE;
hwaddr = nm_setting_p2p_wireless_get_peer (s_p2p_wireless);
if ( hwaddr
&& ( !priv->address
|| !nm_utils_hwaddr_matches (hwaddr, -1, priv->address, -1)))
return FALSE;
return TRUE;
}
/*****************************************************************************/
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
NMWifiP2PPeer *self = NM_WIFI_P2P_PEER (object);
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (self);
switch (prop_id) {
case PROP_FLAGS:
g_value_set_uint (value, priv->flags);
break;
case PROP_NAME:
g_value_set_string (value, priv->name);
break;
case PROP_MANUFACTURER:
g_value_set_string (value, priv->manufacturer);
break;
case PROP_MODEL:
g_value_set_string (value, priv->model);
break;
case PROP_MODEL_NUMBER:
g_value_set_string (value, priv->model_number);
break;
case PROP_SERIAL:
g_value_set_string (value, priv->serial);
break;
case PROP_WFD_IES:
g_value_take_variant (value, nm_utils_gbytes_to_variant_ay (priv->wfd_ies));
break;
case PROP_GROUPS:
g_value_set_variant (value,
g_variant_new_strv ( (const char*const*) priv->groups
?: NM_PTRARRAY_EMPTY (const char *),
-1));
break;
case PROP_HW_ADDRESS:
g_value_set_string (value, priv->address);
break;
case PROP_STRENGTH:
g_value_set_uchar (value, priv->strength);
break;
case PROP_LAST_SEEN:
g_value_set_int (value,
priv->last_seen > 0
? (int) nm_utils_monotonic_timestamp_as_boottime (priv->last_seen, NM_UTILS_NS_PER_SECOND)
: -1);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
/*****************************************************************************/
static void
nm_wifi_p2p_peer_init (NMWifiP2PPeer *self)
{
NMWifiP2PPeerPrivate *priv;
priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NM_TYPE_WIFI_P2P_PEER, NMWifiP2PPeerPrivate);
self->_priv = priv;
c_list_init (&self->peers_lst);
priv->flags = NM_802_11_AP_FLAGS_NONE;
priv->last_seen = -1;
}
NMWifiP2PPeer *
nm_wifi_p2p_peer_new_from_properties (const char *supplicant_path, GVariant *properties)
{
NMWifiP2PPeer *peer;
g_return_val_if_fail (supplicant_path != NULL, NULL);
g_return_val_if_fail (properties != NULL, NULL);
peer = (NMWifiP2PPeer *) g_object_new (NM_TYPE_WIFI_P2P_PEER, NULL);
nm_wifi_p2p_peer_update_from_properties (peer, supplicant_path, properties);
/* ignore peers with invalid or missing address */
if (!nm_wifi_p2p_peer_get_address (peer)) {
g_object_unref (peer);
return NULL;
}
return peer;
}
static void
finalize (GObject *object)
{
NMWifiP2PPeer *self = NM_WIFI_P2P_PEER (object);
NMWifiP2PPeerPrivate *priv = NM_WIFI_P2P_PEER_GET_PRIVATE (self);
nm_assert (!self->wifi_device);
nm_assert (c_list_is_empty (&self->peers_lst));
g_free (priv->supplicant_path);
g_free (priv->name);
g_free (priv->manufacturer);
g_free (priv->model);
g_free (priv->model_number);
g_free (priv->serial);
g_free (priv->address);
g_bytes_unref (priv->wfd_ies);
g_strfreev (priv->groups);
G_OBJECT_CLASS (nm_wifi_p2p_peer_parent_class)->finalize (object);
}
static const NMDBusInterfaceInfoExtended interface_info_p2p_peer = {
.parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT (
NM_DBUS_INTERFACE_P2P_PEER,
.properties = NM_DEFINE_GDBUS_PROPERTY_INFOS (
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Flags", "u", NM_WIFI_P2P_PEER_FLAGS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Name", "s", NM_WIFI_P2P_PEER_NAME),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Manufacturer", "s", NM_WIFI_P2P_PEER_MANUFACTURER),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Model", "s", NM_WIFI_P2P_PEER_MODEL),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("ModelNumber", "s", NM_WIFI_P2P_PEER_MODEL_NUMBER),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Serial", "s", NM_WIFI_P2P_PEER_SERIAL),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("WfdIEs", "ay", NM_WIFI_P2P_PEER_WFD_IES),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Groups", "as", NM_WIFI_P2P_PEER_GROUPS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("HwAddress", "s", NM_WIFI_P2P_PEER_HW_ADDRESS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("Strength", "y", NM_WIFI_P2P_PEER_STRENGTH),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE ("LastSeen", "i", NM_WIFI_P2P_PEER_LAST_SEEN),
),
),
.legacy_property_changed = FALSE,
};
static void
nm_wifi_p2p_peer_class_init (NMWifiP2PPeerClass *p2p_peer_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (p2p_peer_class);
NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (p2p_peer_class);
g_type_class_add_private (object_class, sizeof (NMWifiP2PPeerPrivate));
dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_P2P_PEER);
dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_p2p_peer);
object_class->get_property = get_property;
object_class->finalize = finalize;
obj_properties[PROP_FLAGS] =
g_param_spec_uint (NM_WIFI_P2P_PEER_FLAGS, "", "",
NM_802_11_AP_FLAGS_NONE,
NM_802_11_AP_FLAGS_PRIVACY,
NM_802_11_AP_FLAGS_NONE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_NAME] =
g_param_spec_string (NM_WIFI_P2P_PEER_NAME, "", "",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_MANUFACTURER] =
g_param_spec_string (NM_WIFI_P2P_PEER_MANUFACTURER, "", "",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_MODEL] =
g_param_spec_string (NM_WIFI_P2P_PEER_MODEL, "", "",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_MODEL_NUMBER] =
g_param_spec_string (NM_WIFI_P2P_PEER_MODEL_NUMBER, "", "",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_SERIAL] =
g_param_spec_string (NM_WIFI_P2P_PEER_SERIAL, "", "",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_WFD_IES] =
g_param_spec_variant (NM_WIFI_P2P_PEER_WFD_IES, "", "",
G_VARIANT_TYPE ("ay"),
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_GROUPS] =
g_param_spec_variant (NM_WIFI_P2P_PEER_GROUPS, "", "",
G_VARIANT_TYPE ("as"),
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_HW_ADDRESS] =
g_param_spec_string (NM_WIFI_P2P_PEER_HW_ADDRESS, "", "",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_STRENGTH] =
g_param_spec_uchar (NM_WIFI_P2P_PEER_STRENGTH, "", "",
0, G_MAXINT8, 0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_LAST_SEEN] =
g_param_spec_int (NM_WIFI_P2P_PEER_LAST_SEEN, "", "",
-1, G_MAXINT, -1,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
}
/*****************************************************************************/
const char **
nm_wifi_p2p_peers_get_paths (const CList *peers_lst_head)
{
NMWifiP2PPeer *peer;
const char **list;
const char *path;
gsize i, n;
n = c_list_length (peers_lst_head);
list = g_new (const char *, n + 1);
i = 0;
if (n > 0) {
c_list_for_each_entry (peer, peers_lst_head, peers_lst) {
nm_assert (i < n);
path = nm_dbus_object_get_path (NM_DBUS_OBJECT (peer));
nm_assert (path);
list[i++] = path;
}
nm_assert (i <= n);
}
list[i] = NULL;
return list;
}
NMWifiP2PPeer *
nm_wifi_p2p_peers_find_first_compatible (const CList *peers_lst_head,
NMConnection *connection)
{
NMWifiP2PPeer *peer;
g_return_val_if_fail (connection, NULL);
c_list_for_each_entry (peer, peers_lst_head, peers_lst) {
if (nm_wifi_p2p_peer_check_compatible (peer, connection))
return peer;
}
return NULL;
}
NMWifiP2PPeer *
nm_wifi_p2p_peers_find_by_supplicant_path (const CList *peers_lst_head, const char *path)
{
NMWifiP2PPeer *peer;
g_return_val_if_fail (path != NULL, NULL);
c_list_for_each_entry (peer, peers_lst_head, peers_lst) {
if (nm_streq0 (path, nm_wifi_p2p_peer_get_supplicant_path (peer)))
return peer;
}
return NULL;
}
/*****************************************************************************/
NMWifiP2PPeer *
nm_wifi_p2p_peer_lookup_for_device (NMDevice *device, const char *exported_path)
{
NMWifiP2PPeer *peer;
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
peer = (NMWifiP2PPeer *) nm_dbus_manager_lookup_object (nm_dbus_object_get_manager (NM_DBUS_OBJECT (device)),
exported_path);
if ( !peer
|| !NM_IS_WIFI_P2P_PEER (peer)
|| peer->wifi_device != device)
return NULL;
return peer;
}

View File

@ -0,0 +1,114 @@
/* NetworkManager -- P2P Wi-Fi Peer
*
* 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 (C) 2018 Red Hat, Inc.
*/
#ifndef __NM_WIFI_P2P_PEER_H__
#define __NM_WIFI_P2P_PEER_H__
#include "nm-dbus-object.h"
#include "nm-dbus-interface.h"
#include "nm-connection.h"
#define NM_TYPE_WIFI_P2P_PEER (nm_wifi_p2p_peer_get_type ())
#define NM_WIFI_P2P_PEER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_WIFI_P2P_PEER, NMWifiP2PPeer))
#define NM_WIFI_P2P_PEER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_WIFI_P2P_PEER, NMWifiP2PPeerClass))
#define NM_IS_WIFI_P2P_PEER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_WIFI_P2P_PEER))
#define NM_IS_WIFI_P2P_PEER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_WIFI_P2P_PEER))
#define NM_WIFI_P2P_PEER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_WIFI_P2P_PEER, NMWifiP2PPeerClass))
#define NM_WIFI_P2P_PEER_FLAGS "flags"
#define NM_WIFI_P2P_PEER_NAME "name"
#define NM_WIFI_P2P_PEER_MANUFACTURER "manufacturer"
#define NM_WIFI_P2P_PEER_MODEL "model"
#define NM_WIFI_P2P_PEER_MODEL_NUMBER "model-number"
#define NM_WIFI_P2P_PEER_SERIAL "serial"
#define NM_WIFI_P2P_PEER_WFD_IES "wfd-ies"
#define NM_WIFI_P2P_PEER_GROUPS "groups"
#define NM_WIFI_P2P_PEER_HW_ADDRESS "hw-address"
#define NM_WIFI_P2P_PEER_STRENGTH "strength"
#define NM_WIFI_P2P_PEER_LAST_SEEN "last-seen"
typedef struct {
NMDBusObject parent;
NMDevice *wifi_device;
CList peers_lst;
struct _NMWifiP2PPeerPrivate *_priv;
} NMWifiP2PPeer;
typedef struct _NMWifiP2PPeerClass NMWifiP2PPeerClass;
GType nm_wifi_p2p_peer_get_type (void);
NMWifiP2PPeer * nm_wifi_p2p_peer_new_from_properties (const char *supplicant_path,
GVariant *properties);
gboolean nm_wifi_p2p_peer_update_from_properties (NMWifiP2PPeer *peer,
const char *supplicant_path,
GVariant *properties);
gboolean nm_wifi_p2p_peer_check_compatible (NMWifiP2PPeer *self,
NMConnection *connection);
const char * nm_wifi_p2p_peer_get_supplicant_path (NMWifiP2PPeer *peer);
const char * nm_wifi_p2p_peer_get_name (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_name (NMWifiP2PPeer *peer,
const char *name);
const char * nm_wifi_p2p_peer_get_manufacturer (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_manufacturer (NMWifiP2PPeer *peer,
const char *manufacturer);
const char * nm_wifi_p2p_peer_get_model (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_model (NMWifiP2PPeer *peer,
const char *model);
const char * nm_wifi_p2p_peer_get_model_number (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_model_number (NMWifiP2PPeer *peer,
const char *number);
const char * nm_wifi_p2p_peer_get_serial (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_serial (NMWifiP2PPeer *peer,
const char *serial);
GBytes * nm_wifi_p2p_peer_get_wfd_ies (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_wfd_ies (NMWifiP2PPeer *peer,
GBytes *bytes);
const char *const*nm_wifi_p2p_peer_get_groups (const NMWifiP2PPeer *peer);
const char * nm_wifi_p2p_peer_get_address (const NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_address (NMWifiP2PPeer *peer,
const char *addr);
gint8 nm_wifi_p2p_peer_get_strength (NMWifiP2PPeer *peer);
gboolean nm_wifi_p2p_peer_set_strength (NMWifiP2PPeer *peer,
gint8 strength);
NM80211ApFlags nm_wifi_p2p_peer_get_flags (const NMWifiP2PPeer *self);
const char *nm_wifi_p2p_peer_to_string (const NMWifiP2PPeer *self,
char *str_buf,
gsize buf_len,
gint32 now_s);
const char **nm_wifi_p2p_peers_get_paths (const CList *peers_lst_head);
NMWifiP2PPeer *nm_wifi_p2p_peers_find_first_compatible (const CList *peers_lst_head,
NMConnection *connection);
NMWifiP2PPeer *nm_wifi_p2p_peers_find_by_supplicant_path (const CList *peers_lst_head, const char *path);
NMWifiP2PPeer *nm_wifi_p2p_peer_lookup_for_device (NMDevice *device, const char *exported_path);
#endif /* __NM_WIFI_P2P_PEER_H__ */

View File

@ -152,6 +152,7 @@ typedef enum {
NM_LINK_TYPE_WIMAX,
NM_LINK_TYPE_WPAN,
NM_LINK_TYPE_6LOWPAN,
NM_LINK_TYPE_P2P_WIFI,
/* Software types */
NM_LINK_TYPE_BNEP = 0x10000, /* Bluetooth Ethernet emulation */

View File

@ -84,6 +84,8 @@
send_interface="org.freedesktop.NetworkManager.WiMax.Nsp"/>
<allow send_destination="org.freedesktop.NetworkManager"
send_interface="org.freedesktop.NetworkManager.AccessPoint"/>
<allow send_destination="org.freedesktop.NetworkManager"
send_interface="org.freedesktop.NetworkManager.P2PPeer"/>
<!-- Devices (read-only, no security required) -->
<allow send_destination="org.freedesktop.NetworkManager"
@ -92,6 +94,8 @@
<!-- Devices (read/write, secured with PolicyKit) -->
<allow send_destination="org.freedesktop.NetworkManager"
send_interface="org.freedesktop.NetworkManager.Device.Wireless"/>
<allow send_destination="org.freedesktop.NetworkManager"
send_interface="org.freedesktop.NetworkManager.Device.P2PWireless"/>
<allow send_destination="org.freedesktop.NetworkManager"
send_interface="org.freedesktop.NetworkManager.Device"/>