summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2015-07-14 19:38:58 +0200
committerMichael Biebl <biebl@debian.org>2015-07-14 19:38:58 +0200
commit50a58f0fabd8a34c1b6108a107e08abe3c1ccd24 (patch)
tree6790165f39daee79e2b6c6617483320613493367
parentf408e27bccfacf347605a8d98649975a68f38a17 (diff)
Imported Upstream version 1.0.4upstream/1.0.4
-rw-r--r--Makefile.am4
-rw-r--r--Makefile.in8
-rw-r--r--NEWS63
-rwxr-xr-xautogen.sh2
-rwxr-xr-xbuild-aux/tap-driver.sh651
-rwxr-xr-xbuild-aux/test-driver148
-rw-r--r--callouts/77-nm-olpc-mesh.rules6
-rw-r--r--callouts/Makefile.am6
-rw-r--r--callouts/Makefile.in44
-rw-r--r--callouts/nm-dispatcher-utils.c2
-rw-r--r--callouts/nm-dispatcher.c29
-rw-r--r--callouts/tests/Makefile.in437
-rw-r--r--clients/Makefile.in2
-rw-r--r--clients/cli/Makefile.in2
-rw-r--r--clients/cli/common.c6
-rw-r--r--clients/cli/connections.c466
-rw-r--r--clients/cli/devices.c352
-rw-r--r--clients/cli/nmcli-completion8
-rw-r--r--clients/cli/settings-docs.c7
-rw-r--r--clients/cli/settings.c857
-rw-r--r--clients/cli/settings.h8
-rw-r--r--clients/cli/utils.c37
-rw-r--r--clients/cli/utils.h5
-rw-r--r--clients/common/nm-secret-agent-simple.c6
-rw-r--r--clients/tui/Makefile.in2
-rw-r--r--clients/tui/newt/Makefile.in2
-rw-r--r--config.h.in12
-rwxr-xr-xconfigure361
-rw-r--r--configure.ac109
-rw-r--r--data/85-nm-unmanaged.rules34
-rw-r--r--data/Makefile.am7
-rw-r--r--data/Makefile.in51
-rw-r--r--docs/Makefile.in2
-rw-r--r--docs/api/Makefile.in58
-rw-r--r--docs/api/html/NetworkManager.devhelp21
-rw-r--r--docs/api/html/index.html7
-rw-r--r--docs/api/html/ix01.html7
-rw-r--r--docs/api/html/license.html7
-rw-r--r--docs/api/html/ref-dbus.html7
-rw-r--r--docs/api/html/ref-migrating.html7
-rw-r--r--docs/api/html/ref-settings.html17
-rw-r--r--docs/api/html/secrets-flags.html7
-rw-r--r--docs/api/html/spec.html10
-rw-r--r--docs/api/html/style.css15
-rw-r--r--docs/api/settings-spec.xml5
-rw-r--r--docs/api/spec.html10
-rw-r--r--docs/api/tmpl/NetworkManager-unused.sgml0
-rw-r--r--docs/api/version.xml2
-rw-r--r--docs/libnm-glib/Makefile.in58
-rw-r--r--docs/libnm-glib/html/NMAccessPoint.html62
-rw-r--r--docs/libnm-glib/html/NMActiveConnection.html114
-rw-r--r--docs/libnm-glib/html/NMClient.html221
-rw-r--r--docs/libnm-glib/html/NMDHCP4Config.html15
-rw-r--r--docs/libnm-glib/html/NMDHCP6Config.html15
-rw-r--r--docs/libnm-glib/html/NMDevice.html206
-rw-r--r--docs/libnm-glib/html/NMDeviceAdsl.html17
-rw-r--r--docs/libnm-glib/html/NMDeviceBond.html30
-rw-r--r--docs/libnm-glib/html/NMDeviceBridge.html44
-rw-r--r--docs/libnm-glib/html/NMDeviceBt.html27
-rw-r--r--docs/libnm-glib/html/NMDeviceEthernet.html32
-rw-r--r--docs/libnm-glib/html/NMDeviceGeneric.html28
-rw-r--r--docs/libnm-glib/html/NMDeviceInfiniband.html22
-rw-r--r--docs/libnm-glib/html/NMDeviceModem.html26
-rw-r--r--docs/libnm-glib/html/NMDeviceOlpcMesh.html26
-rw-r--r--docs/libnm-glib/html/NMDeviceTeam.html36
-rw-r--r--docs/libnm-glib/html/NMDeviceVlan.html35
-rw-r--r--docs/libnm-glib/html/NMDeviceWifi.html107
-rw-r--r--docs/libnm-glib/html/NMDeviceWimax.html118
-rw-r--r--docs/libnm-glib/html/NMIP4Config.html46
-rw-r--r--docs/libnm-glib/html/NMIP6Config.html58
-rw-r--r--docs/libnm-glib/html/NMObject.html56
-rw-r--r--docs/libnm-glib/html/NMRemoteConnection.html87
-rw-r--r--docs/libnm-glib/html/NMRemoteSettings.html53
-rw-r--r--docs/libnm-glib/html/NMSecretAgent.html84
-rw-r--r--docs/libnm-glib/html/NMVPNConnection.html19
-rw-r--r--docs/libnm-glib/html/NMWimaxNsp.html25
-rw-r--r--docs/libnm-glib/html/annotation-glossary.html11
-rw-r--r--docs/libnm-glib/html/api-index-full.html7
-rw-r--r--docs/libnm-glib/html/ch02.html7
-rw-r--r--docs/libnm-glib/html/index.html7
-rw-r--r--docs/libnm-glib/html/index.sgml125
-rw-r--r--docs/libnm-glib/html/libnm-glib-NMVPNPlugin.html51
-rw-r--r--docs/libnm-glib/html/libnm-glib-NMVpnPluginUiWidget.html85
-rw-r--r--docs/libnm-glib/html/libnm-glib-nm-types.html10
-rw-r--r--docs/libnm-glib/html/libnm-glib-nm-vpn-plugin-utils.html11
-rw-r--r--docs/libnm-glib/html/libnm-glib.devhelp2124
-rw-r--r--docs/libnm-glib/html/object-tree.html7
-rw-r--r--docs/libnm-glib/html/ref-overview.html7
-rw-r--r--docs/libnm-glib/html/style.css15
-rw-r--r--docs/libnm-glib/tmpl/libnm-glib-unused.sgml0
-rw-r--r--docs/libnm-glib/tmpl/nm-access-point.sgml214
-rw-r--r--docs/libnm-glib/tmpl/nm-active-connection.sgml274
-rw-r--r--docs/libnm-glib/tmpl/nm-client.sgml552
-rw-r--r--docs/libnm-glib/tmpl/nm-device-adsl.sgml75
-rw-r--r--docs/libnm-glib/tmpl/nm-device-bond.sgml108
-rw-r--r--docs/libnm-glib/tmpl/nm-device-bridge.sgml108
-rw-r--r--docs/libnm-glib/tmpl/nm-device-bt.sgml110
-rw-r--r--docs/libnm-glib/tmpl/nm-device-ethernet.sgml125
-rw-r--r--docs/libnm-glib/tmpl/nm-device-generic.sgml82
-rw-r--r--docs/libnm-glib/tmpl/nm-device-infiniband.sgml93
-rw-r--r--docs/libnm-glib/tmpl/nm-device-modem.sgml82
-rw-r--r--docs/libnm-glib/tmpl/nm-device-olpc-mesh.sgml107
-rw-r--r--docs/libnm-glib/tmpl/nm-device-team.sgml108
-rw-r--r--docs/libnm-glib/tmpl/nm-device-vlan.sgml126
-rw-r--r--docs/libnm-glib/tmpl/nm-device-wifi.sgml205
-rw-r--r--docs/libnm-glib/tmpl/nm-device-wimax.sgml199
-rw-r--r--docs/libnm-glib/tmpl/nm-device.sgml562
-rw-r--r--docs/libnm-glib/tmpl/nm-dhcp4-config.sgml60
-rw-r--r--docs/libnm-glib/tmpl/nm-dhcp6-config.sgml60
-rw-r--r--docs/libnm-glib/tmpl/nm-glib-enum-types.sgml24
-rw-r--r--docs/libnm-glib/tmpl/nm-ip4-config.sgml146
-rw-r--r--docs/libnm-glib/tmpl/nm-ip6-config.sgml149
-rw-r--r--docs/libnm-glib/tmpl/nm-object.sgml80
-rw-r--r--docs/libnm-glib/tmpl/nm-remote-connection.sgml172
-rw-r--r--docs/libnm-glib/tmpl/nm-remote-settings.sgml251
-rw-r--r--docs/libnm-glib/tmpl/nm-secret-agent.sgml203
-rw-r--r--docs/libnm-glib/tmpl/nm-types.sgml24
-rw-r--r--docs/libnm-glib/tmpl/nm-vpn-connection.sgml66
-rw-r--r--docs/libnm-glib/tmpl/nm-vpn-enum-types.sgml24
-rw-r--r--docs/libnm-glib/tmpl/nm-vpn-plugin-ui-interface.sgml178
-rw-r--r--docs/libnm-glib/tmpl/nm-vpn-plugin-utils.sgml46
-rw-r--r--docs/libnm-glib/tmpl/nm-vpn-plugin.sgml155
-rw-r--r--docs/libnm-glib/tmpl/nm-wimax-nsp.sgml112
-rw-r--r--docs/libnm-glib/version.xml2
-rw-r--r--docs/libnm-util/Makefile.in58
-rw-r--r--docs/libnm-util/html/NMConnection.html59
-rw-r--r--docs/libnm-util/html/NMSetting.html31
-rw-r--r--docs/libnm-util/html/NMSetting8021x.html358
-rw-r--r--docs/libnm-util/html/NMSettingAdsl.html58
-rw-r--r--docs/libnm-util/html/NMSettingBluetooth.html23
-rw-r--r--docs/libnm-util/html/NMSettingBond.html70
-rw-r--r--docs/libnm-util/html/NMSettingBridge.html94
-rw-r--r--docs/libnm-util/html/NMSettingBridgePort.html47
-rw-r--r--docs/libnm-util/html/NMSettingCdma.html39
-rw-r--r--docs/libnm-util/html/NMSettingConnection.html82
-rw-r--r--docs/libnm-util/html/NMSettingDcb.html204
-rw-r--r--docs/libnm-util/html/NMSettingGeneric.html18
-rw-r--r--docs/libnm-util/html/NMSettingGsm.html98
-rw-r--r--docs/libnm-util/html/NMSettingIP4Config.html167
-rw-r--r--docs/libnm-util/html/NMSettingIP6Config.html164
-rw-r--r--docs/libnm-util/html/NMSettingInfiniband.html47
-rw-r--r--docs/libnm-util/html/NMSettingOlpcMesh.html52
-rw-r--r--docs/libnm-util/html/NMSettingPPP.html123
-rw-r--r--docs/libnm-util/html/NMSettingPPPOE.html35
-rw-r--r--docs/libnm-util/html/NMSettingSerial.html41
-rw-r--r--docs/libnm-util/html/NMSettingTeam.html33
-rw-r--r--docs/libnm-util/html/NMSettingTeamPort.html26
-rw-r--r--docs/libnm-util/html/NMSettingVPN.html52
-rw-r--r--docs/libnm-util/html/NMSettingVlan.html66
-rw-r--r--docs/libnm-util/html/NMSettingWimax.html26
-rw-r--r--docs/libnm-util/html/NMSettingWired.html111
-rw-r--r--docs/libnm-util/html/NMSettingWireless.html137
-rw-r--r--docs/libnm-util/html/NMSettingWirelessSecurity.html147
-rw-r--r--docs/libnm-util/html/annotation-glossary.html9
-rw-r--r--docs/libnm-util/html/api-index-full.html7
-rw-r--r--docs/libnm-util/html/ch01.html7
-rw-r--r--docs/libnm-util/html/index.html7
-rw-r--r--docs/libnm-util/html/index.sgml364
-rw-r--r--docs/libnm-util/html/libnm-util-NetworkManager.html112
-rw-r--r--docs/libnm-util/html/libnm-util-NetworkManagerVPN.html126
-rw-r--r--docs/libnm-util/html/libnm-util-nm-utils.html92
-rw-r--r--docs/libnm-util/html/libnm-util.devhelp2364
-rw-r--r--docs/libnm-util/html/object-tree.html7
-rw-r--r--docs/libnm-util/html/style.css15
-rw-r--r--docs/libnm-util/tmpl/NetworkManager.sgml539
-rw-r--r--docs/libnm-util/tmpl/NetworkManagerVPN.sgml484
-rw-r--r--docs/libnm-util/tmpl/libnm-util-unused.sgml0
-rw-r--r--docs/libnm-util/tmpl/nm-connection.sgml663
-rw-r--r--docs/libnm-util/tmpl/nm-setting-8021x.sgml943
-rw-r--r--docs/libnm-util/tmpl/nm-setting-adsl.sgml212
-rw-r--r--docs/libnm-util/tmpl/nm-setting-bluetooth.sgml112
-rw-r--r--docs/libnm-util/tmpl/nm-setting-bond.sgml276
-rw-r--r--docs/libnm-util/tmpl/nm-setting-bridge-port.sgml113
-rw-r--r--docs/libnm-util/tmpl/nm-setting-bridge.sgml193
-rw-r--r--docs/libnm-util/tmpl/nm-setting-cdma.sgml130
-rw-r--r--docs/libnm-util/tmpl/nm-setting-connection.sgml451
-rw-r--r--docs/libnm-util/tmpl/nm-setting-dcb.sgml395
-rw-r--r--docs/libnm-util/tmpl/nm-setting-generic.sgml65
-rw-r--r--docs/libnm-util/tmpl/nm-setting-gsm.sgml283
-rw-r--r--docs/libnm-util/tmpl/nm-setting-infiniband.sgml145
-rw-r--r--docs/libnm-util/tmpl/nm-setting-ip4-config.sgml711
-rw-r--r--docs/libnm-util/tmpl/nm-setting-ip6-config.sgml712
-rw-r--r--docs/libnm-util/tmpl/nm-setting-olpc-mesh.sgml113
-rw-r--r--docs/libnm-util/tmpl/nm-setting-ppp.sgml354
-rw-r--r--docs/libnm-util/tmpl/nm-setting-pppoe.sgml130
-rw-r--r--docs/libnm-util/tmpl/nm-setting-serial.sgml146
-rw-r--r--docs/libnm-util/tmpl/nm-setting-team-port.sgml81
-rw-r--r--docs/libnm-util/tmpl/nm-setting-team.sgml97
-rw-r--r--docs/libnm-util/tmpl/nm-setting-vlan.sgml249
-rw-r--r--docs/libnm-util/tmpl/nm-setting-vpn.sgml235
-rw-r--r--docs/libnm-util/tmpl/nm-setting-wimax.sgml97
-rw-r--r--docs/libnm-util/tmpl/nm-setting-wired.sgml349
-rw-r--r--docs/libnm-util/tmpl/nm-setting-wireless-security.sgml476
-rw-r--r--docs/libnm-util/tmpl/nm-setting-wireless.sgml402
-rw-r--r--docs/libnm-util/tmpl/nm-setting.sgml327
-rw-r--r--docs/libnm-util/tmpl/nm-utils-enum-types.sgml24
-rw-r--r--docs/libnm-util/tmpl/nm-utils.sgml562
-rw-r--r--docs/libnm-util/version.xml2
-rw-r--r--docs/libnm/Makefile.in58
-rw-r--r--docs/libnm/html/NMAccessPoint.html60
-rw-r--r--docs/libnm/html/NMActiveConnection.html79
-rw-r--r--docs/libnm/html/NMClient.html280
-rw-r--r--docs/libnm/html/NMDevice.html176
-rw-r--r--docs/libnm/html/NMDeviceAdsl.html14
-rw-r--r--docs/libnm/html/NMDeviceBond.html24
-rw-r--r--docs/libnm/html/NMDeviceBridge.html24
-rw-r--r--docs/libnm/html/NMDeviceBt.html24
-rw-r--r--docs/libnm/html/NMDeviceEthernet.html29
-rw-r--r--docs/libnm/html/NMDeviceGeneric.html19
-rw-r--r--docs/libnm/html/NMDeviceInfiniband.html19
-rw-r--r--docs/libnm/html/NMDeviceModem.html23
-rw-r--r--docs/libnm/html/NMDeviceOlpcMesh.html23
-rw-r--r--docs/libnm/html/NMDeviceTeam.html24
-rw-r--r--docs/libnm/html/NMDeviceVlan.html28
-rw-r--r--docs/libnm/html/NMDeviceWifi.html101
-rw-r--r--docs/libnm/html/NMDeviceWimax.html114
-rw-r--r--docs/libnm/html/NMDhcpConfig.html21
-rw-r--r--docs/libnm/html/NMIPConfig.html44
-rw-r--r--docs/libnm/html/NMObject.html20
-rw-r--r--docs/libnm/html/NMRemoteConnection.html37
-rw-r--r--docs/libnm/html/NMSecretAgentOld.html51
-rw-r--r--docs/libnm/html/NMSetting.html25
-rw-r--r--docs/libnm/html/NMSetting8021x.html362
-rw-r--r--docs/libnm/html/NMSettingAdsl.html55
-rw-r--r--docs/libnm/html/NMSettingBluetooth.html20
-rw-r--r--docs/libnm/html/NMSettingBond.html53
-rw-r--r--docs/libnm/html/NMSettingBridge.html48
-rw-r--r--docs/libnm/html/NMSettingBridgePort.html26
-rw-r--r--docs/libnm/html/NMSettingCdma.html36
-rw-r--r--docs/libnm/html/NMSettingConnection.html206
-rw-r--r--docs/libnm/html/NMSettingDcb.html124
-rw-r--r--docs/libnm/html/NMSettingGeneric.html9
-rw-r--r--docs/libnm/html/NMSettingGsm.html75
-rw-r--r--docs/libnm/html/NMSettingIP4Config.html15
-rw-r--r--docs/libnm/html/NMSettingIP6Config.html24
-rw-r--r--docs/libnm/html/NMSettingIPConfig.html156
-rw-r--r--docs/libnm/html/NMSettingInfiniband.html45
-rw-r--r--docs/libnm/html/NMSettingOlpcMesh.html38
-rw-r--r--docs/libnm/html/NMSettingPpp.html120
-rw-r--r--docs/libnm/html/NMSettingPppoe.html32
-rw-r--r--docs/libnm/html/NMSettingSerial.html37
-rw-r--r--docs/libnm/html/NMSettingTeam.html17
-rw-r--r--docs/libnm/html/NMSettingTeamPort.html17
-rw-r--r--docs/libnm/html/NMSettingVlan.html50
-rw-r--r--docs/libnm/html/NMSettingVpn.html51
-rw-r--r--docs/libnm/html/NMSettingWimax.html23
-rw-r--r--docs/libnm/html/NMSettingWired.html96
-rw-r--r--docs/libnm/html/NMSettingWireless.html112
-rw-r--r--docs/libnm/html/NMSettingWirelessSecurity.html138
-rw-r--r--docs/libnm/html/NMSimpleConnection.html9
-rw-r--r--docs/libnm/html/NMVpnConnection.html19
-rw-r--r--docs/libnm/html/NMVpnEditor.html57
-rw-r--r--docs/libnm/html/NMWimaxNsp.html25
-rw-r--r--docs/libnm/html/annotation-glossary.html9
-rw-r--r--docs/libnm/html/api-index-full.html126
-rw-r--r--docs/libnm/html/ch02.html7
-rw-r--r--docs/libnm/html/ch03.html7
-rw-r--r--docs/libnm/html/ch04.html7
-rw-r--r--docs/libnm/html/ch05.html7
-rw-r--r--docs/libnm/html/ch06.html7
-rw-r--r--docs/libnm/html/index.html7
-rw-r--r--docs/libnm/html/index.sgml350
-rw-r--r--docs/libnm/html/libnm-NMConnection.html29
-rw-r--r--docs/libnm/html/libnm-nm-dbus-interface.html104
-rw-r--r--docs/libnm/html/libnm-nm-errors.html73
-rw-r--r--docs/libnm/html/libnm-nm-utils.html52
-rw-r--r--docs/libnm/html/libnm-nm-version.html74
-rw-r--r--docs/libnm/html/libnm-nm-vpn-dbus-interface.html126
-rw-r--r--docs/libnm/html/libnm.devhelp2350
-rw-r--r--docs/libnm/html/object-tree.html8
-rw-r--r--docs/libnm/html/ref-overview.html7
-rw-r--r--docs/libnm/html/style.css15
-rw-r--r--docs/libnm/libnm-sections.txt38
-rw-r--r--docs/libnm/libnm.types1
-rw-r--r--docs/libnm/tmpl/libnm-unused.sgml0
-rw-r--r--docs/libnm/tmpl/nm-access-point.sgml195
-rw-r--r--docs/libnm/tmpl/nm-active-connection.sgml264
-rw-r--r--docs/libnm/tmpl/nm-client.sgml798
-rw-r--r--docs/libnm/tmpl/nm-connection.sgml573
-rw-r--r--docs/libnm/tmpl/nm-core-enum-types.sgml24
-rw-r--r--docs/libnm/tmpl/nm-dbus-interface.sgml552
-rw-r--r--docs/libnm/tmpl/nm-device-adsl.sgml40
-rw-r--r--docs/libnm/tmpl/nm-device-bond.sgml72
-rw-r--r--docs/libnm/tmpl/nm-device-bridge.sgml72
-rw-r--r--docs/libnm/tmpl/nm-device-bt.sgml72
-rw-r--r--docs/libnm/tmpl/nm-device-ethernet.sgml88
-rw-r--r--docs/libnm/tmpl/nm-device-generic.sgml47
-rw-r--r--docs/libnm/tmpl/nm-device-infiniband.sgml56
-rw-r--r--docs/libnm/tmpl/nm-device-modem.sgml56
-rw-r--r--docs/libnm/tmpl/nm-device-olpc-mesh.sgml72
-rw-r--r--docs/libnm/tmpl/nm-device-team.sgml72
-rw-r--r--docs/libnm/tmpl/nm-device-vlan.sgml88
-rw-r--r--docs/libnm/tmpl/nm-device-wifi.sgml179
-rw-r--r--docs/libnm/tmpl/nm-device-wimax.sgml162
-rw-r--r--docs/libnm/tmpl/nm-device.sgml553
-rw-r--r--docs/libnm/tmpl/nm-dhcp-config.sgml66
-rw-r--r--docs/libnm/tmpl/nm-enum-types.sgml24
-rw-r--r--docs/libnm/tmpl/nm-errors.sgml263
-rw-r--r--docs/libnm/tmpl/nm-ip-config.sgml152
-rw-r--r--docs/libnm/tmpl/nm-object.sgml47
-rw-r--r--docs/libnm/tmpl/nm-remote-connection.sgml206
-rw-r--r--docs/libnm/tmpl/nm-secret-agent-old.sgml197
-rw-r--r--docs/libnm/tmpl/nm-setting-8021x.sgml918
-rw-r--r--docs/libnm/tmpl/nm-setting-adsl.sgml187
-rw-r--r--docs/libnm/tmpl/nm-setting-bluetooth.sgml86
-rw-r--r--docs/libnm/tmpl/nm-setting-bond.sgml233
-rw-r--r--docs/libnm/tmpl/nm-setting-bridge-port.sgml88
-rw-r--r--docs/libnm/tmpl/nm-setting-bridge.sgml152
-rw-r--r--docs/libnm/tmpl/nm-setting-cdma.sgml104
-rw-r--r--docs/libnm/tmpl/nm-setting-connection.sgml466
-rw-r--r--docs/libnm/tmpl/nm-setting-dcb.sgml370
-rw-r--r--docs/libnm/tmpl/nm-setting-generic.sgml40
-rw-r--r--docs/libnm/tmpl/nm-setting-gsm.sgml184
-rw-r--r--docs/libnm/tmpl/nm-setting-infiniband.sgml129
-rw-r--r--docs/libnm/tmpl/nm-setting-ip-config.sgml781
-rw-r--r--docs/libnm/tmpl/nm-setting-ip4-config.sgml91
-rw-r--r--docs/libnm/tmpl/nm-setting-ip6-config.sgml108
-rw-r--r--docs/libnm/tmpl/nm-setting-olpc-mesh.sgml88
-rw-r--r--docs/libnm/tmpl/nm-setting-ppp.sgml328
-rw-r--r--docs/libnm/tmpl/nm-setting-pppoe.sgml104
-rw-r--r--docs/libnm/tmpl/nm-setting-serial.sgml129
-rw-r--r--docs/libnm/tmpl/nm-setting-team-port.sgml56
-rw-r--r--docs/libnm/tmpl/nm-setting-team.sgml56
-rw-r--r--docs/libnm/tmpl/nm-setting-vlan.sgml207
-rw-r--r--docs/libnm/tmpl/nm-setting-vpn.sgml210
-rw-r--r--docs/libnm/tmpl/nm-setting-wimax.sgml72
-rw-r--r--docs/libnm/tmpl/nm-setting-wired.sgml324
-rw-r--r--docs/libnm/tmpl/nm-setting-wireless-security.sgml447
-rw-r--r--docs/libnm/tmpl/nm-setting-wireless.sgml359
-rw-r--r--docs/libnm/tmpl/nm-setting.sgml238
-rw-r--r--docs/libnm/tmpl/nm-simple-connection.sgml52
-rw-r--r--docs/libnm/tmpl/nm-utils.sgml578
-rw-r--r--docs/libnm/tmpl/nm-version.sgml158
-rw-r--r--docs/libnm/tmpl/nm-vpn-connection.sgml56
-rw-r--r--docs/libnm/tmpl/nm-vpn-dbus-interface.sgml484
-rw-r--r--docs/libnm/tmpl/nm-vpn-editor-plugin.sgml169
-rw-r--r--docs/libnm/tmpl/nm-wimax-nsp.sgml102
-rw-r--r--docs/libnm/version.xml2
-rw-r--r--examples/C/Makefile.in2
-rw-r--r--examples/C/glib/Makefile.in2
-rw-r--r--examples/C/qt/Makefile.in2
-rw-r--r--examples/Makefile.in2
-rw-r--r--examples/dispatcher/Makefile.in2
-rw-r--r--examples/python/Makefile.in2
-rw-r--r--examples/python/dbus/Makefile.in2
-rw-r--r--examples/python/gi/Makefile.in2
-rw-r--r--examples/ruby/Makefile.in2
-rw-r--r--examples/shell/Makefile.in2
-rw-r--r--gtk-doc.make58
-rw-r--r--include/Makefile.am2
-rw-r--r--include/Makefile.in4
-rw-r--r--include/nm-glib-compat.h87
-rw-r--r--include/nm-macros-internal.h (renamed from include/nm-utils-internal.h)78
-rw-r--r--include/nm-test-utils.h123
-rw-r--r--introspection/Makefile.in2
-rw-r--r--introspection/nm-device.xml15
-rw-r--r--libnm-core/Makefile.in61
-rw-r--r--libnm-core/Makefile.libnm-core5
-rw-r--r--libnm-core/nm-core-enum-types.c22
-rw-r--r--libnm-core/nm-core-enum-types.h2
-rw-r--r--libnm-core/nm-core-internal.h23
-rw-r--r--libnm-core/nm-dbus-interface.h4
-rw-r--r--libnm-core/nm-keyfile-internal.h171
-rw-r--r--libnm-core/nm-keyfile-reader.c1659
-rw-r--r--libnm-core/nm-keyfile-utils.c342
-rw-r--r--libnm-core/nm-keyfile-utils.h79
-rw-r--r--libnm-core/nm-keyfile-writer.c751
-rw-r--r--libnm-core/nm-setting-8021x.c214
-rw-r--r--libnm-core/nm-setting-8021x.h2
-rw-r--r--libnm-core/nm-setting-connection.c65
-rw-r--r--libnm-core/nm-setting-connection.h23
-rw-r--r--libnm-core/nm-setting-ip6-config.c10
-rw-r--r--libnm-core/nm-setting-private.h2
-rw-r--r--libnm-core/nm-setting-wireless-security.c12
-rw-r--r--libnm-core/nm-setting-wireless.c4
-rw-r--r--libnm-core/nm-setting.c18
-rw-r--r--libnm-core/nm-utils-private.h6
-rw-r--r--libnm-core/nm-utils.c286
-rw-r--r--libnm-core/nm-version.h14
-rw-r--r--libnm-core/nm-version.h.in12
-rw-r--r--libnm-core/tests/Makefile.am35
-rw-r--r--libnm-core/tests/Makefile.in539
-rw-r--r--libnm-core/tests/certs/test-ca-cert.pem27
-rw-r--r--libnm-core/tests/certs/test-key-and-cert.pem118
-rw-r--r--libnm-core/tests/test-general.c414
-rw-r--r--libnm-core/tests/test-keyfile.c534
-rw-r--r--libnm-core/tests/test-secrets.c42
-rw-r--r--libnm-core/tests/test-setting-8021x.c6
-rw-r--r--libnm-core/tests/test-settings-defaults.c25
-rw-r--r--libnm-glib/Makefile.in2
-rw-r--r--libnm-glib/nm-client.c10
-rw-r--r--libnm-glib/nm-remote-settings.c11
-rw-r--r--libnm-glib/tests/Makefile.am2
-rw-r--r--libnm-glib/tests/Makefile.in446
-rwxr-xr-xlibnm-glib/tests/libnm-glib-test-launch.sh8
-rw-r--r--libnm-util/Makefile.in2
-rw-r--r--libnm-util/NetworkManager.h4
-rw-r--r--libnm-util/nm-setting-8021x.c86
-rw-r--r--libnm-util/nm-setting.c8
-rw-r--r--libnm-util/nm-utils.c2
-rw-r--r--libnm-util/tests/Makefile.in472
-rw-r--r--libnm-util/tests/test-general.c171
-rw-r--r--libnm-util/tests/test-secrets.c42
-rw-r--r--libnm-util/tests/test-settings-defaults.c29
-rw-r--r--libnm/Makefile.in7
-rw-r--r--libnm/libnm.ver7
-rw-r--r--libnm/nm-dbus-helpers.c7
-rw-r--r--libnm/nm-device.c3
-rw-r--r--libnm/nm-ifcfg-rh-docs.xml2
-rw-r--r--libnm/nm-property-docs.xml5
-rw-r--r--libnm/nm-remote-connection.c5
-rw-r--r--libnm/nm-secret-agent-old.c1
-rw-r--r--libnm/nm-setting-docs.xml5
-rw-r--r--libnm/nm-vpn-plugin-old.c12
-rw-r--r--libnm/tests/Makefile.am2
-rw-r--r--libnm/tests/Makefile.in453
-rwxr-xr-xlibnm/tests/libnm-test-launch.sh8
-rw-r--r--m4/ax_lib_readline.m42
-rw-r--r--m4/compiler_warnings.m42
-rw-r--r--man/Makefile.in2
-rw-r--r--man/NetworkManager.815
-rw-r--r--man/NetworkManager.conf.5222
-rw-r--r--man/NetworkManager.conf.xml.in224
-rw-r--r--man/nm-settings-ifcfg-rh.516
-rw-r--r--man/nm-settings-ifcfg-rh.xml4
-rw-r--r--man/nm-settings-keyfile.56
-rw-r--r--man/nm-settings-keyfile.xml2
-rw-r--r--man/nm-settings.520
-rw-r--r--man/nm-settings.xml7
-rw-r--r--man/nmcli.1.in11
-rw-r--r--po/POTFILES.in2
-rw-r--r--po/pl.po2319
-rw-r--r--policy/Makefile.in2
-rw-r--r--src/Makefile.am30
-rw-r--r--src/Makefile.in232
-rw-r--r--src/NetworkManagerUtils.c810
-rw-r--r--src/NetworkManagerUtils.h65
-rw-r--r--src/devices/adsl/Makefile.in2
-rw-r--r--src/devices/adsl/nm-atm-manager.c11
-rw-r--r--src/devices/adsl/nm-device-adsl.c12
-rw-r--r--src/devices/bluetooth/Makefile.in2
-rw-r--r--src/devices/bluetooth/nm-bluez-device.c9
-rw-r--r--src/devices/bluetooth/nm-bluez-manager.c22
-rw-r--r--src/devices/bluetooth/nm-device-bt.c66
-rw-r--r--src/devices/nm-device-bond.c89
-rw-r--r--src/devices/nm-device-bridge.c73
-rw-r--r--src/devices/nm-device-ethernet.c256
-rw-r--r--src/devices/nm-device-factory.c532
-rw-r--r--src/devices/nm-device-factory.h124
-rw-r--r--src/devices/nm-device-generic.c15
-rw-r--r--src/devices/nm-device-gre.c22
-rw-r--r--src/devices/nm-device-infiniband.c123
-rw-r--r--src/devices/nm-device-macvlan.c22
-rw-r--r--src/devices/nm-device-private.h3
-rw-r--r--src/devices/nm-device-tun.c17
-rw-r--r--src/devices/nm-device-veth.c35
-rw-r--r--src/devices/nm-device-vlan.c348
-rw-r--r--src/devices/nm-device-vxlan.c24
-rw-r--r--src/devices/nm-device.c1934
-rw-r--r--src/devices/nm-device.h43
-rw-r--r--src/devices/team/Makefile.in2
-rw-r--r--src/devices/team/nm-device-team.c67
-rw-r--r--src/devices/team/nm-team-factory.c21
-rw-r--r--src/devices/wifi/Makefile.in2
-rw-r--r--src/devices/wifi/nm-device-olpc-mesh.c23
-rw-r--r--src/devices/wifi/nm-device-wifi.c234
-rw-r--r--src/devices/wifi/nm-wifi-ap.c244
-rw-r--r--src/devices/wifi/nm-wifi-ap.h2
-rw-r--r--src/devices/wifi/nm-wifi-factory.c17
-rw-r--r--src/devices/wifi/tests/Makefile.in437
-rw-r--r--src/devices/wimax/Makefile.in2
-rw-r--r--src/devices/wimax/nm-wimax-factory.c14
-rw-r--r--src/devices/wimax/nm-wimax-util.h2
-rw-r--r--src/devices/wwan/Makefile.in2
-rw-r--r--src/devices/wwan/nm-device-modem.c31
-rw-r--r--src/devices/wwan/nm-modem.c9
-rw-r--r--src/devices/wwan/nm-wwan-factory.c19
-rw-r--r--src/dhcp-manager/Makefile.in2
-rw-r--r--src/dhcp-manager/nm-dhcp-client.c15
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient-utils.c2
-rw-r--r--src/dhcp-manager/nm-dhcp-dhclient.c17
-rw-r--r--src/dhcp-manager/nm-dhcp-dhcpcd.c17
-rw-r--r--src/dhcp-manager/nm-dhcp-listener.c14
-rw-r--r--src/dhcp-manager/systemd-dhcp/nm-sd-adapt.h14
-rw-r--r--src/dhcp-manager/tests/Makefile.in444
-rw-r--r--src/dhcp-manager/tests/test-dhcp-dhclient.c2
-rw-r--r--src/dns-manager/nm-dns-manager.c159
-rw-r--r--src/dns-manager/nm-dns-plugin.c19
-rw-r--r--src/dnsmasq-manager/nm-dnsmasq-manager.c21
-rw-r--r--src/dnsmasq-manager/tests/Makefile.in437
-rw-r--r--src/main-utils.c123
-rw-r--r--src/main-utils.h10
-rw-r--r--src/main.c51
-rw-r--r--src/nm-activation-request.c13
-rw-r--r--src/nm-active-connection.c5
-rw-r--r--src/nm-auth-subject.c2
-rw-r--r--src/nm-config-data.c744
-rw-r--r--src/nm-config-data.h132
-rw-r--r--src/nm-config.c1191
-rw-r--r--src/nm-config.h88
-rw-r--r--src/nm-connectivity.c299
-rw-r--r--src/nm-connectivity.h6
-rw-r--r--src/nm-dbus-manager.c3
-rw-r--r--src/nm-dcb.c9
-rw-r--r--src/nm-default-route-manager.c209
-rw-r--r--src/nm-default-route-manager.h4
-rw-r--r--src/nm-dispatcher.c2
-rw-r--r--src/nm-enum-types.c193
-rw-r--r--src/nm-enum-types.h14
-rw-r--r--src/nm-iface-helper.c53
-rw-r--r--src/nm-ip4-config.c318
-rw-r--r--src/nm-ip4-config.h3
-rw-r--r--src/nm-ip6-config.c219
-rw-r--r--src/nm-ip6-config.h3
-rw-r--r--src/nm-logging.h2
-rw-r--r--src/nm-manager.c1053
-rw-r--r--src/nm-multi-index.c441
-rw-r--r--src/nm-multi-index.h109
-rw-r--r--src/nm-policy.c2
-rw-r--r--src/nm-posix-signals.c62
-rw-r--r--src/nm-posix-signals.h36
-rw-r--r--src/nm-route-manager.c1214
-rw-r--r--src/nm-route-manager.h53
-rw-r--r--src/nm-types.h25
-rw-r--r--src/org.freedesktop.NetworkManager.conf2
-rw-r--r--src/platform/Makefile.in2
-rw-r--r--src/platform/nm-fake-platform.c651
-rw-r--r--src/platform/nm-linux-platform.c4949
-rw-r--r--src/platform/nm-linux-platform.h4
-rw-r--r--src/platform/nm-platform-utils.c436
-rw-r--r--src/platform/nm-platform-utils.h66
-rw-r--r--src/platform/nm-platform.c2093
-rw-r--r--src/platform/nm-platform.h445
-rw-r--r--src/platform/nmp-object.c1924
-rw-r--r--src/platform/nmp-object.h361
-rw-r--r--src/platform/tests/Makefile.am26
-rw-r--r--src/platform/tests/Makefile.in545
-rw-r--r--src/platform/tests/dump.c33
-rw-r--r--src/platform/tests/platform.c119
-rw-r--r--src/platform/tests/test-address.c108
-rw-r--r--src/platform/tests/test-cleanup.c48
-rw-r--r--src/platform/tests/test-common.c201
-rw-r--r--src/platform/tests/test-common.h23
-rw-r--r--src/platform/tests/test-general.c67
-rw-r--r--src/platform/tests/test-link.c435
-rw-r--r--src/platform/tests/test-nmp-object.c425
-rw-r--r--src/platform/tests/test-route.c131
-rw-r--r--src/platform/wifi/wifi-utils.c9
-rw-r--r--src/platform/wifi/wifi-utils.h2
-rw-r--r--src/ppp-manager/Makefile.in2
-rw-r--r--src/ppp-manager/nm-ppp-manager.c23
-rw-r--r--src/rdisc/Makefile.in2
-rw-r--r--src/rdisc/nm-lndp-rdisc.c2
-rw-r--r--src/rdisc/nm-rdisc.c34
-rw-r--r--src/rdisc/nm-rdisc.h2
-rw-r--r--src/rdisc/tests/Makefile.in437
-rw-r--r--src/rdisc/tests/test-rdisc-fake.c4
-rw-r--r--src/rdisc/tests/test-rdisc-linux.c2
-rw-r--r--src/settings/nm-settings-connection.c8
-rw-r--r--src/settings/nm-settings.c65
-rw-r--r--src/settings/nm-settings.h2
-rw-r--r--src/settings/plugins/Makefile.in2
-rw-r--r--src/settings/plugins/example/Makefile.in2
-rw-r--r--src/settings/plugins/example/plugin.c2
-rw-r--r--src/settings/plugins/ibft/Makefile.in2
-rw-r--r--src/settings/plugins/ibft/reader.c46
-rw-r--r--src/settings/plugins/ibft/tests/Makefile.in437
-rw-r--r--src/settings/plugins/ifcfg-rh/Makefile.in2
-rw-r--r--src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c15
-rw-r--r--src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.h3
-rw-r--r--src/settings/plugins/ifcfg-rh/plugin.c59
-rw-r--r--src/settings/plugins/ifcfg-rh/reader.c48
-rw-r--r--src/settings/plugins/ifcfg-rh/reader.h3
-rw-r--r--src/settings/plugins/ifcfg-rh/shvar.c78
-rw-r--r--src/settings/plugins/ifcfg-rh/shvar.h6
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/Makefile.in447
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.in2
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils.c35
-rw-r--r--src/settings/plugins/ifcfg-rh/utils.c144
-rw-r--r--src/settings/plugins/ifcfg-rh/utils.h3
-rw-r--r--src/settings/plugins/ifcfg-rh/writer.c28
-rw-r--r--src/settings/plugins/ifcfg-suse/Makefile.in2
-rw-r--r--src/settings/plugins/ifnet/Makefile.in2
-rw-r--r--src/settings/plugins/ifnet/connection_parser.c8
-rw-r--r--src/settings/plugins/ifnet/net_parser.c4
-rw-r--r--src/settings/plugins/ifnet/net_parser.h1
-rw-r--r--src/settings/plugins/ifnet/plugin.c27
-rw-r--r--src/settings/plugins/ifnet/tests/Makefile.in2
-rw-r--r--src/settings/plugins/ifnet/tests/test_all.c2
-rw-r--r--src/settings/plugins/ifupdown/Makefile.in2
-rw-r--r--src/settings/plugins/ifupdown/plugin.c27
-rw-r--r--src/settings/plugins/ifupdown/tests/Makefile.in437
-rw-r--r--src/settings/plugins/keyfile/Makefile.in2
-rw-r--r--src/settings/plugins/keyfile/common.h2
-rw-r--r--src/settings/plugins/keyfile/plugin.c40
-rw-r--r--src/settings/plugins/keyfile/reader.c1349
-rw-r--r--src/settings/plugins/keyfile/tests/Makefile.in440
-rw-r--r--src/settings/plugins/keyfile/tests/keyfiles/Makefile.in2
-rw-r--r--src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Blob4
-rw-r--r--src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Old6
-rw-r--r--src/settings/plugins/keyfile/tests/test-keyfile.c108
-rw-r--r--src/settings/plugins/keyfile/utils.c223
-rw-r--r--src/settings/plugins/keyfile/utils.h51
-rw-r--r--src/settings/plugins/keyfile/writer.c807
-rw-r--r--src/settings/plugins/keyfile/writer.h1
-rw-r--r--src/supplicant-manager/nm-call-store.c119
-rw-r--r--src/supplicant-manager/nm-call-store.h41
-rw-r--r--src/supplicant-manager/nm-supplicant-config.c155
-rw-r--r--src/supplicant-manager/nm-supplicant-config.h2
-rw-r--r--src/supplicant-manager/nm-supplicant-interface.c1496
-rw-r--r--src/supplicant-manager/nm-supplicant-interface.h6
-rw-r--r--src/supplicant-manager/nm-supplicant-manager.c263
-rw-r--r--src/supplicant-manager/nm-supplicant-manager.h9
-rw-r--r--src/supplicant-manager/nm-supplicant-types.h4
-rw-r--r--src/supplicant-manager/tests/Makefile.in437
-rw-r--r--src/supplicant-manager/tests/test-supplicant-config.c233
-rw-r--r--src/tests/Makefile.am32
-rw-r--r--src/tests/Makefile.in618
-rw-r--r--src/tests/config/Makefile.in437
-rw-r--r--src/tests/config/NetworkManager.conf68
-rw-r--r--src/tests/config/conf.d/00-overrides.conf46
-rw-r--r--src/tests/config/conf.d/10-more.conf29
-rw-r--r--src/tests/config/conf.d/90-last.conf3
-rw-r--r--src/tests/config/nm-test-device.c2
-rw-r--r--src/tests/config/test-config.c253
-rw-r--r--src/tests/test-general-with-expect.c459
-rw-r--r--src/tests/test-general.c281
-rw-r--r--src/tests/test-ip4-config.c8
-rw-r--r--src/tests/test-route-manager.c917
-rw-r--r--src/vpn-manager/nm-vpn-connection.c131
-rw-r--r--src/vpn-manager/nm-vpn-service.c17
-rw-r--r--tools/Makefile.in2
-rwxr-xr-xtools/run-test-valgrind.sh54
-rwxr-xr-xtools/test-networkmanager-service.py2
-rw-r--r--valgrind.suppressions60
-rw-r--r--vapi/Makefile.in2
636 files changed, 42203 insertions, 49592 deletions
diff --git a/Makefile.am b/Makefile.am
index 18bb6c68c..7f66e4ff7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -36,7 +36,7 @@ DISTCHECK_CONFIGURE_FLAGS = \
--enable-tests=yes \
--with-valgrind=no \
--enable-gtk-doc \
- --enable-more-warnings=yes \
+ --enable-more-warnings=error \
--with-udev-dir=$$dc_install_base/lib/udev \
--with-wext=no \
--enable-ifcfg-rh \
@@ -59,8 +59,6 @@ DISTCLEANFILES = intltool-extract intltool-merge intltool-update
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = NetworkManager.pc
-ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
-
CLEANFILES = cscope.in.out cscope.out cscope.po.out
cscope:
diff --git a/Makefile.in b/Makefile.in
index 9214d6f0e..e409d1c71 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -212,6 +212,7 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/NetworkManager.pc.in \
$(top_srcdir)/build-aux/install-sh \
$(top_srcdir)/build-aux/ltmain.sh \
$(top_srcdir)/build-aux/missing \
+ $(top_srcdir)/build-aux/tap-driver.sh \
$(top_srcdir)/initscript/Arch/networkmanager.in \
$(top_srcdir)/initscript/Debian/NetworkManager.in \
$(top_srcdir)/initscript/Mandriva/networkmanager.in \
@@ -221,7 +222,7 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/NetworkManager.pc.in \
$(top_srcdir)/initscript/linexa/networkmanager.in ABOUT-NLS \
AUTHORS COPYING ChangeLog INSTALL NEWS README TODO \
build-aux/compile build-aux/config.guess \
- build-aux/config.rpath build-aux/config.sub build-aux/depcomp \
+ build-aux/config.rpath build-aux/config.sub \
build-aux/install-sh build-aux/ltmain.sh build-aux/missing
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
@@ -269,6 +270,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -382,6 +384,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -559,7 +562,7 @@ DISTCHECK_CONFIGURE_FLAGS = \
--enable-tests=yes \
--with-valgrind=no \
--enable-gtk-doc \
- --enable-more-warnings=yes \
+ --enable-more-warnings=error \
--with-udev-dir=$$dc_install_base/lib/udev \
--with-wext=no \
--enable-ifcfg-rh \
@@ -570,7 +573,6 @@ DISTCHECK_CONFIGURE_FLAGS = \
DISTCLEANFILES = intltool-extract intltool-merge intltool-update
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = NetworkManager.pc
-ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
CLEANFILES = cscope.in.out cscope.out cscope.po.out
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
diff --git a/NEWS b/NEWS
index 72e53f8e0..0c201660f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,67 @@
===============================================
+NetworkManager-1.0.4
+Overview of changes since NetworkManager-1.0.2
+===============================================
+
+This is a new stable release of NetworkManager. Notable changes include:
+
+* The MTU setting from an IPv6 neighbor discovery Router Advertisements is
+ now ignored if applying it would result in invalid configuration.
+
+* Some configuration options can now be changed without restarting the
+ daemon. Notably, this applies to 'dns', 'connectivity' and
+ 'ignore-carrier' settings.
+
+* The connection activation was made more robust. If an active connection
+ is reactivated, the device it's active on takes precedence. If an attempt
+ is made to activate a connection on a different device than it is active on,
+ the activation proceeds removing the connection from the active device.
+
+* The device specifiers in configuration files now support negation via
+ 'except:' match.
+
+* Devices that only have IPv6 link-local address are no longer assumed to
+ be connected.
+
+* nmcli now provides hints and tab-completion for enumeration properties.
+
+* If the IPv6 interface tokens are set they are honored when creating an
+ interface identifier for IPv6 addressing.
+
+* NetworkManager now maintains correct routing configuration when multiple
+ interfaces are connected to the same network.
+
+* The management of devices can now be controlled with udev rules. The veth
+ devices as well as the virtual Ethernet devices of various
+ virtualization tools (VMWare, VirtualBox, Parallels Workstation) are
+ now ignored by default.
+
+* The IPv6 privacy extensions are now enabled by default and handling of
+ the ip6-privacy sysctl has been improved.
+
+* Activating a Bond, Bridge or Team device can now optionally activate the
+ slave connections as well. The behavior is controlled with
+ 'connection.autoconnect-slaves' property.
+
+* The platform support code has been refactored, resulting in better
+ scalability in large configurations.
+
+* Changes to network interfaces configuration done outside NetworkManager
+ are now picked up and exposed to the user via NetworkManager API and tools.
+
+* A connection can now optionally leave externally configured default route
+ in place instead of overriding it. The behavior is controlled with
+ 'ipv4.never-default' and 'ipv6.never-default' properties.
+
+* Multiple crasher and memory leak bugs in the daemon were fixed.
+
+* Multiple bugs that could cause the client tools to hang or crash were fixed.
+
+* nmcli allows multiple devices for 'nmcli device disconnect/delete'.
+
+* Firewall zone is added to firewalld for device-based VPN connections too.
+
+===============================================
NetworkManager-1.0.2
Overview of changes since NetworkManager-1.0
===============================================
diff --git a/autogen.sh b/autogen.sh
index 141bcf120..5ec9a5aa8 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -28,5 +28,5 @@ AUTOPOINT='intltoolize --automake --copy' autoreconf --force --install --verbose
cd $olddir
if test -z "$NOCONFIGURE"; then
- exec $srcdir/configure --enable-maintainer-mode "$@"
+ exec $srcdir/configure --enable-maintainer-mode --enable-more-warnings=error "$@"
fi
diff --git a/build-aux/tap-driver.sh b/build-aux/tap-driver.sh
new file mode 100755
index 000000000..4254e2b3d
--- /dev/null
+++ b/build-aux/tap-driver.sh
@@ -0,0 +1,651 @@
+#! /bin/sh
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+scriptversion=2013-12-23.17; # UTC
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+me=tap-driver.sh
+
+fatal ()
+{
+ echo "$me: fatal: $*" >&2
+ exit 1
+}
+
+usage_error ()
+{
+ echo "$me: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH
+ [--expect-failure={yes|no}] [--color-tests={yes|no}]
+ [--enable-hard-errors={yes|no}] [--ignore-exit]
+ [--diagnostic-string=STRING] [--merge|--no-merge]
+ [--comments|--no-comments] [--] TEST-COMMAND
+The '--test-name', '-log-file' and '--trs-file' options are mandatory.
+END
+}
+
+# TODO: better error handling in option parsing (in particular, ensure
+# TODO: $log_file, $trs_file and $test_name are defined).
+test_name= # Used for reporting.
+log_file= # Where to save the result and output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=0
+color_tests=0
+merge=0
+ignore_exit=0
+comments=0
+diag_string='#'
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "$me $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) shift;; # No-op.
+ --merge) merge=1;;
+ --no-merge) merge=0;;
+ --ignore-exit) ignore_exit=1;;
+ --comments) comments=1;;
+ --no-comments) comments=0;;
+ --diagnostic-string) diag_string=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ esac
+ shift
+done
+
+test $# -gt 0 || usage_error "missing test command"
+
+case $expect_failure in
+ yes) expect_failure=1;;
+ *) expect_failure=0;;
+esac
+
+if test $color_tests = yes; then
+ init_colors='
+ color_map["red"]="" # Red.
+ color_map["grn"]="" # Green.
+ color_map["lgn"]="" # Light green.
+ color_map["blu"]="" # Blue.
+ color_map["mgn"]="" # Magenta.
+ color_map["std"]="" # No color.
+ color_for_result["ERROR"] = "mgn"
+ color_for_result["PASS"] = "grn"
+ color_for_result["XPASS"] = "red"
+ color_for_result["FAIL"] = "red"
+ color_for_result["XFAIL"] = "lgn"
+ color_for_result["SKIP"] = "blu"'
+else
+ init_colors=''
+fi
+
+# :; is there to work around a bug in bash 3.2 (and earlier) which
+# does not always set '$?' properly on redirection failure.
+# See the Autoconf manual for more details.
+:;{
+ (
+ # Ignore common signals (in this subshell only!), to avoid potential
+ # problems with Korn shells. Some Korn shells are known to propagate
+ # to themselves signals that have killed a child process they were
+ # waiting for; this is done at least for SIGINT (and usually only for
+ # it, in truth). Without the `trap' below, such a behaviour could
+ # cause a premature exit in the current subshell, e.g., in case the
+ # test command it runs gets terminated by a SIGINT. Thus, the awk
+ # script we are piping into would never seen the exit status it
+ # expects on its last input line (which is displayed below by the
+ # last `echo $?' statement), and would thus die reporting an internal
+ # error.
+ # For more information, see the Autoconf manual and the threads:
+ # <http://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
+ # <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html>
+ trap : 1 3 2 13 15
+ if test $merge -gt 0; then
+ exec 2>&1
+ else
+ exec 2>&3
+ fi
+ "$@"
+ echo $?
+ ) | LC_ALL=C ${AM_TAP_AWK-awk} \
+ -v me="$me" \
+ -v test_script_name="$test_name" \
+ -v log_file="$log_file" \
+ -v trs_file="$trs_file" \
+ -v expect_failure="$expect_failure" \
+ -v merge="$merge" \
+ -v ignore_exit="$ignore_exit" \
+ -v comments="$comments" \
+ -v diag_string="$diag_string" \
+'
+# TODO: the usages of "cat >&3" below could be optimized when using
+# GNU awk, and/on on systems that supports /dev/fd/.
+
+# Implementation note: in what follows, `result_obj` will be an
+# associative array that (partly) simulates a TAP result object
+# from the `TAP::Parser` perl module.
+
+## ----------- ##
+## FUNCTIONS ##
+## ----------- ##
+
+function fatal(msg)
+{
+ print me ": " msg | "cat >&2"
+ exit 1
+}
+
+function abort(where)
+{
+ fatal("internal error " where)
+}
+
+# Convert a boolean to a "yes"/"no" string.
+function yn(bool)
+{
+ return bool ? "yes" : "no";
+}
+
+function add_test_result(result)
+{
+ if (!test_results_index)
+ test_results_index = 0
+ test_results_list[test_results_index] = result
+ test_results_index += 1
+ test_results_seen[result] = 1;
+}
+
+# Whether the test script should be re-run by "make recheck".
+function must_recheck()
+{
+ for (k in test_results_seen)
+ if (k != "XFAIL" && k != "PASS" && k != "SKIP")
+ return 1
+ return 0
+}
+
+# Whether the content of the log file associated to this test should
+# be copied into the "global" test-suite.log.
+function copy_in_global_log()
+{
+ for (k in test_results_seen)
+ if (k != "PASS")
+ return 1
+ return 0
+}
+
+function get_global_test_result()
+{
+ if ("ERROR" in test_results_seen)
+ return "ERROR"
+ if ("FAIL" in test_results_seen || "XPASS" in test_results_seen)
+ return "FAIL"
+ all_skipped = 1
+ for (k in test_results_seen)
+ if (k != "SKIP")
+ all_skipped = 0
+ if (all_skipped)
+ return "SKIP"
+ return "PASS";
+}
+
+function stringify_result_obj(result_obj)
+{
+ if (result_obj["is_unplanned"] || result_obj["number"] != testno)
+ return "ERROR"
+
+ if (plan_seen == LATE_PLAN)
+ return "ERROR"
+
+ if (result_obj["directive"] == "TODO")
+ return result_obj["is_ok"] ? "XPASS" : "XFAIL"
+
+ if (result_obj["directive"] == "SKIP")
+ return result_obj["is_ok"] ? "SKIP" : COOKED_FAIL;
+
+ if (length(result_obj["directive"]))
+ abort("in function stringify_result_obj()")
+
+ return result_obj["is_ok"] ? COOKED_PASS : COOKED_FAIL
+}
+
+function decorate_result(result)
+{
+ color_name = color_for_result[result]
+ if (color_name)
+ return color_map[color_name] "" result "" color_map["std"]
+ # If we are not using colorized output, or if we do not know how
+ # to colorize the given result, we should return it unchanged.
+ return result
+}
+
+function report(result, details)
+{
+ if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/)
+ {
+ msg = ": " test_script_name
+ add_test_result(result)
+ }
+ else if (result == "#")
+ {
+ msg = " " test_script_name ":"
+ }
+ else
+ {
+ abort("in function report()")
+ }
+ if (length(details))
+ msg = msg " " details
+ # Output on console might be colorized.
+ print decorate_result(result) msg
+ # Log the result in the log file too, to help debugging (this is
+ # especially true when said result is a TAP error or "Bail out!").
+ print result msg | "cat >&3";
+}
+
+function testsuite_error(error_message)
+{
+ report("ERROR", "- " error_message)
+}
+
+function handle_tap_result()
+{
+ details = result_obj["number"];
+ if (length(result_obj["description"]))
+ details = details " " result_obj["description"]
+
+ if (plan_seen == LATE_PLAN)
+ {
+ details = details " # AFTER LATE PLAN";
+ }
+ else if (result_obj["is_unplanned"])
+ {
+ details = details " # UNPLANNED";
+ }
+ else if (result_obj["number"] != testno)
+ {
+ details = sprintf("%s # OUT-OF-ORDER (expecting %d)",
+ details, testno);
+ }
+ else if (result_obj["directive"])
+ {
+ details = details " # " result_obj["directive"];
+ if (length(result_obj["explanation"]))
+ details = details " " result_obj["explanation"]
+ }
+
+ report(stringify_result_obj(result_obj), details)
+}
+
+# `skip_reason` should be empty whenever planned > 0.
+function handle_tap_plan(planned, skip_reason)
+{
+ planned += 0 # Avoid getting confused if, say, `planned` is "00"
+ if (length(skip_reason) && planned > 0)
+ abort("in function handle_tap_plan()")
+ if (plan_seen)
+ {
+ # Error, only one plan per stream is acceptable.
+ testsuite_error("multiple test plans")
+ return;
+ }
+ planned_tests = planned
+ # The TAP plan can come before or after *all* the TAP results; we speak
+ # respectively of an "early" or a "late" plan. If we see the plan line
+ # after at least one TAP result has been seen, assume we have a late
+ # plan; in this case, any further test result seen after the plan will
+ # be flagged as an error.
+ plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN)
+ # If testno > 0, we have an error ("too many tests run") that will be
+ # automatically dealt with later, so do not worry about it here. If
+ # $plan_seen is true, we have an error due to a repeated plan, and that
+ # has already been dealt with above. Otherwise, we have a valid "plan
+ # with SKIP" specification, and should report it as a particular kind
+ # of SKIP result.
+ if (planned == 0 && testno == 0)
+ {
+ if (length(skip_reason))
+ skip_reason = "- " skip_reason;
+ report("SKIP", skip_reason);
+ }
+}
+
+function extract_tap_comment(line)
+{
+ if (index(line, diag_string) == 1)
+ {
+ # Strip leading `diag_string` from `line`.
+ line = substr(line, length(diag_string) + 1)
+ # And strip any leading and trailing whitespace left.
+ sub("^[ \t]*", "", line)
+ sub("[ \t]*$", "", line)
+ # Return what is left (if any).
+ return line;
+ }
+ return "";
+}
+
+# When this function is called, we know that line is a TAP result line,
+# so that it matches the (perl) RE "^(not )?ok\b".
+function setup_result_obj(line)
+{
+ # Get the result, and remove it from the line.
+ result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0)
+ sub("^(not )?ok[ \t]*", "", line)
+
+ # If the result has an explicit number, get it and strip it; otherwise,
+ # automatically assing the next progresive number to it.
+ if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/)
+ {
+ match(line, "^[0-9]+")
+ # The final `+ 0` is to normalize numbers with leading zeros.
+ result_obj["number"] = substr(line, 1, RLENGTH) + 0
+ line = substr(line, RLENGTH + 1)
+ }
+ else
+ {
+ result_obj["number"] = testno
+ }
+
+ if (plan_seen == LATE_PLAN)
+ # No further test results are acceptable after a "late" TAP plan
+ # has been seen.
+ result_obj["is_unplanned"] = 1
+ else if (plan_seen && testno > planned_tests)
+ result_obj["is_unplanned"] = 1
+ else
+ result_obj["is_unplanned"] = 0
+
+ # Strip trailing and leading whitespace.
+ sub("^[ \t]*", "", line)
+ sub("[ \t]*$", "", line)
+
+ # This will have to be corrected if we have a "TODO"/"SKIP" directive.
+ result_obj["description"] = line
+ result_obj["directive"] = ""
+ result_obj["explanation"] = ""
+
+ if (index(line, "#") == 0)
+ return # No possible directive, nothing more to do.
+
+ # Directives are case-insensitive.
+ rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*"
+
+ # See whether we have the directive, and if yes, where.
+ pos = match(line, rx "$")
+ if (!pos)
+ pos = match(line, rx "[^a-zA-Z0-9_]")
+
+ # If there was no TAP directive, we have nothing more to do.
+ if (!pos)
+ return
+
+ # Let`s now see if the TAP directive has been escaped. For example:
+ # escaped: ok \# SKIP
+ # not escaped: ok \\# SKIP
+ # escaped: ok \\\\\# SKIP
+ # not escaped: ok \ # SKIP
+ if (substr(line, pos, 1) == "#")
+ {
+ bslash_count = 0
+ for (i = pos; i > 1 && substr(line, i - 1, 1) == "\\"; i--)
+ bslash_count += 1
+ if (bslash_count % 2)
+ return # Directive was escaped.
+ }
+
+ # Strip the directive and its explanation (if any) from the test
+ # description.
+ result_obj["description"] = substr(line, 1, pos - 1)
+ # Now remove the test description from the line, that has been dealt
+ # with already.
+ line = substr(line, pos)
+ # Strip the directive, and save its value (normalized to upper case).
+ sub("^[ \t]*#[ \t]*", "", line)
+ result_obj["directive"] = toupper(substr(line, 1, 4))
+ line = substr(line, 5)
+ # Now get the explanation for the directive (if any), with leading
+ # and trailing whitespace removed.
+ sub("^[ \t]*", "", line)
+ sub("[ \t]*$", "", line)
+ result_obj["explanation"] = line
+}
+
+function get_test_exit_message(status)
+{
+ if (status == 0)
+ return ""
+ if (status !~ /^[1-9][0-9]*$/)
+ abort("getting exit status")
+ if (status < 127)
+ exit_details = ""
+ else if (status == 127)
+ exit_details = " (command not found?)"
+ else if (status >= 128 && status <= 255)
+ exit_details = sprintf(" (terminated by signal %d?)", status - 128)
+ else if (status > 256 && status <= 384)
+ # We used to report an "abnormal termination" here, but some Korn
+ # shells, when a child process die due to signal number n, can leave
+ # in $? an exit status of 256+n instead of the more standard 128+n.
+ # Apparently, both behaviours are allowed by POSIX (2008), so be
+ # prepared to handle them both. See also Austing Group report ID
+ # 0000051 <http://www.austingroupbugs.net/view.php?id=51>
+ exit_details = sprintf(" (terminated by signal %d?)", status - 256)
+ else
+ # Never seen in practice.
+ exit_details = " (abnormal termination)"
+ return sprintf("exited with status %d%s", status, exit_details)
+}
+
+function write_test_results()
+{
+ print ":global-test-result: " get_global_test_result() > trs_file
+ print ":recheck: " yn(must_recheck()) > trs_file
+ print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file
+ for (i = 0; i < test_results_index; i += 1)
+ print ":test-result: " test_results_list[i] > trs_file
+ close(trs_file);
+}
+
+BEGIN {
+
+## ------- ##
+## SETUP ##
+## ------- ##
+
+'"$init_colors"'
+
+# Properly initialized once the TAP plan is seen.
+planned_tests = 0
+
+COOKED_PASS = expect_failure ? "XPASS": "PASS";
+COOKED_FAIL = expect_failure ? "XFAIL": "FAIL";
+
+# Enumeration-like constants to remember which kind of plan (if any)
+# has been seen. It is important that NO_PLAN evaluates "false" as
+# a boolean.
+NO_PLAN = 0
+EARLY_PLAN = 1
+LATE_PLAN = 2
+
+testno = 0 # Number of test results seen so far.
+bailed_out = 0 # Whether a "Bail out!" directive has been seen.
+
+# Whether the TAP plan has been seen or not, and if yes, which kind
+# it is ("early" is seen before any test result, "late" otherwise).
+plan_seen = NO_PLAN
+
+## --------- ##
+## PARSING ##
+## --------- ##
+
+is_first_read = 1
+
+while (1)
+ {
+ # Involutions required so that we are able to read the exit status
+ # from the last input line.
+ st = getline
+ if (st < 0) # I/O error.
+ fatal("I/O error while reading from input stream")
+ else if (st == 0) # End-of-input
+ {
+ if (is_first_read)
+ abort("in input loop: only one input line")
+ break
+ }
+ if (is_first_read)
+ {
+ is_first_read = 0
+ nextline = $0
+ continue
+ }
+ else
+ {
+ curline = nextline
+ nextline = $0
+ $0 = curline
+ }
+ # Copy any input line verbatim into the log file.
+ print | "cat >&3"
+ # Parsing of TAP input should stop after a "Bail out!" directive.
+ if (bailed_out)
+ continue
+
+ # TAP test result.
+ if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/)
+ {
+ testno += 1
+ setup_result_obj($0)
+ handle_tap_result()
+ }
+ # TAP plan (normal or "SKIP" without explanation).
+ else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/)
+ {
+ # The next two lines will put the number of planned tests in $0.
+ sub("^1\\.\\.", "")
+ sub("[^0-9]*$", "")
+ handle_tap_plan($0, "")
+ continue
+ }
+ # TAP "SKIP" plan, with an explanation.
+ else if ($0 ~ /^1\.\.0+[ \t]*#/)
+ {
+ # The next lines will put the skip explanation in $0, stripping
+ # any leading and trailing whitespace. This is a little more
+ # tricky in truth, since we want to also strip a potential leading
+ # "SKIP" string from the message.
+ sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "")
+ sub("[ \t]*$", "");
+ handle_tap_plan(0, $0)
+ }
+ # "Bail out!" magic.
+ # Older versions of prove and TAP::Harness (e.g., 3.17) did not
+ # recognize a "Bail out!" directive when preceded by leading
+ # whitespace, but more modern versions (e.g., 3.23) do. So we
+ # emulate the latter, "more modern" behaviour.
+ else if ($0 ~ /^[ \t]*Bail out!/)
+ {
+ bailed_out = 1
+ # Get the bailout message (if any), with leading and trailing
+ # whitespace stripped. The message remains stored in `$0`.
+ sub("^[ \t]*Bail out![ \t]*", "");
+ sub("[ \t]*$", "");
+ # Format the error message for the
+ bailout_message = "Bail out!"
+ if (length($0))
+ bailout_message = bailout_message " " $0
+ testsuite_error(bailout_message)
+ }
+ # Maybe we have too look for dianogtic comments too.
+ else if (comments != 0)
+ {
+ comment = extract_tap_comment($0);
+ if (length(comment))
+ report("#", comment);
+ }
+ }
+
+## -------- ##
+## FINISH ##
+## -------- ##
+
+# A "Bail out!" directive should cause us to ignore any following TAP
+# error, as well as a non-zero exit status from the TAP producer.
+if (!bailed_out)
+ {
+ if (!plan_seen)
+ {
+ testsuite_error("missing test plan")
+ }
+ else if (planned_tests != testno)
+ {
+ bad_amount = testno > planned_tests ? "many" : "few"
+ testsuite_error(sprintf("too %s tests run (expected %d, got %d)",
+ bad_amount, planned_tests, testno))
+ }
+ if (!ignore_exit)
+ {
+ # Fetch exit status from the last line.
+ exit_message = get_test_exit_message(nextline)
+ if (exit_message)
+ testsuite_error(exit_message)
+ }
+ }
+
+write_test_results()
+
+exit 0
+
+} # End of "BEGIN" block.
+'
+
+# TODO: document that we consume the file descriptor 3 :-(
+} 3>"$log_file"
+
+test $? -eq 0 || fatal "I/O or internal error"
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/test-driver b/build-aux/test-driver
new file mode 100755
index 000000000..8e575b017
--- /dev/null
+++ b/build-aux/test-driver
@@ -0,0 +1,148 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2013-07-13.22; # UTC
+
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+ echo "$0: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+ [--expect-failure={yes|no}] [--color-tests={yes|no}]
+ [--enable-hard-errors={yes|no}] [--]
+ TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+test_name= # Used for reporting.
+log_file= # Where to save the output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "test-driver $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ *) break;;
+ esac
+ shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file" = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+ usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+ usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+ red='' # Red.
+ grn='' # Green.
+ lgn='' # Light green.
+ blu='' # Blue.
+ mgn='' # Magenta.
+ std='' # No color.
+else
+ red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+ tweaked_estatus=1
+else
+ tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/callouts/77-nm-olpc-mesh.rules b/callouts/77-nm-olpc-mesh.rules
deleted file mode 100644
index a1a1554c2..000000000
--- a/callouts/77-nm-olpc-mesh.rules
+++ /dev/null
@@ -1,6 +0,0 @@
-# do not edit this file, it will be overwritten on update
-
-# The fact that this device is driven by libertas is not currently exposed
-# in the sysfs tree..?
-KERNEL=="msh*", SUBSYSTEM=="net", DRIVERS=="usb", ATTRS{idVendor}=="1286", ATTRS{idProduct}=="2001", ENV{ID_NM_OLPC_MESH}="1"
-
diff --git a/callouts/Makefile.am b/callouts/Makefile.am
index f682579e9..cc38e01a8 100644
--- a/callouts/Makefile.am
+++ b/callouts/Makefile.am
@@ -87,11 +87,6 @@ libtest_dispatcher_envp_la_LIBADD = \
$(GLIB_LIBS)
-if WITH_UDEV_DIR
-udevrulesdir = $(UDEV_DIR)/rules.d
-udevrules_DATA = 77-nm-olpc-mesh.rules
-endif
-
dbusactivationdir = $(datadir)/dbus-1/system-services
dbusactivation_in_files = org.freedesktop.nm_dispatcher.service.in
dbusactivation_DATA = $(dbusactivation_in_files:.service.in=.service)
@@ -115,7 +110,6 @@ CLEANFILES = $(nodist_libnmdbus_dispatcher_la_SOURCES) $(dbusactivation_DATA)
EXTRA_DIST = \
$(dbusservice_DATA) \
- $(udevrules_DATA) \
$(dbusactivation_in_files) \
nm-dispatcher.xml
diff --git a/callouts/Makefile.in b/callouts/Makefile.in
index 7e5c1f87c..cada1e2a8 100644
--- a/callouts/Makefile.in
+++ b/callouts/Makefile.in
@@ -132,8 +132,7 @@ am_libtest_dispatcher_envp_la_OBJECTS = \
libtest_dispatcher_envp_la_OBJECTS = \
$(am_libtest_dispatcher_envp_la_OBJECTS)
am__installdirs = "$(DESTDIR)$(libexecdir)" \
- "$(DESTDIR)$(dbusactivationdir)" "$(DESTDIR)$(dbusservicedir)" \
- "$(DESTDIR)$(udevrulesdir)"
+ "$(DESTDIR)$(dbusactivationdir)" "$(DESTDIR)$(dbusservicedir)"
PROGRAMS = $(libexec_PROGRAMS)
am_nm_avahi_autoipd_action_OBJECTS = \
nm-avahi-autoipd-action.$(OBJEXT)
@@ -225,7 +224,7 @@ am__uninstall_files_from_dir = { \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
-DATA = $(dbusactivation_DATA) $(dbusservice_DATA) $(udevrules_DATA)
+DATA = $(dbusactivation_DATA) $(dbusservice_DATA)
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
am__recursive_targets = \
@@ -286,6 +285,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -399,6 +399,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -607,8 +608,6 @@ libtest_dispatcher_envp_la_LIBADD = \
$(top_builddir)/libnm/libnm.la \
$(GLIB_LIBS)
-@WITH_UDEV_DIR_TRUE@udevrulesdir = $(UDEV_DIR)/rules.d
-@WITH_UDEV_DIR_TRUE@udevrules_DATA = 77-nm-olpc-mesh.rules
dbusactivationdir = $(datadir)/dbus-1/system-services
dbusactivation_in_files = org.freedesktop.nm_dispatcher.service.in
dbusactivation_DATA = $(dbusactivation_in_files:.service.in=.service)
@@ -622,7 +621,6 @@ dispatcherdir = $(sysconfdir)/NetworkManager/dispatcher.d
CLEANFILES = $(nodist_libnmdbus_dispatcher_la_SOURCES) $(dbusactivation_DATA)
EXTRA_DIST = \
$(dbusservice_DATA) \
- $(udevrules_DATA) \
$(dbusactivation_in_files) \
nm-dispatcher.xml
@@ -829,27 +827,6 @@ uninstall-dbusserviceDATA:
@list='$(dbusservice_DATA)'; test -n "$(dbusservicedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(dbusservicedir)'; $(am__uninstall_files_from_dir)
-install-udevrulesDATA: $(udevrules_DATA)
- @$(NORMAL_INSTALL)
- @list='$(udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \
- if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(udevrulesdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(udevrulesdir)" || exit 1; \
- fi; \
- for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- echo "$$d$$p"; \
- done | $(am__base_list) | \
- while read files; do \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(udevrulesdir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(udevrulesdir)" || exit $$?; \
- done
-
-uninstall-udevrulesDATA:
- @$(NORMAL_UNINSTALL)
- @list='$(udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \
- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(udevrulesdir)'; $(am__uninstall_files_from_dir)
# This directory's subdirectories are mostly independent; you can cd
# into them and run 'make' without going through this Makefile.
@@ -1011,7 +988,7 @@ check: $(BUILT_SOURCES)
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
installdirs: installdirs-recursive
installdirs-am:
- for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(dbusactivationdir)" "$(DESTDIR)$(dbusservicedir)" "$(DESTDIR)$(udevrulesdir)"; do \
+ for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(dbusactivationdir)" "$(DESTDIR)$(dbusservicedir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: $(BUILT_SOURCES)
@@ -1070,8 +1047,7 @@ info: info-recursive
info-am:
-install-data-am: install-dbusactivationDATA install-dbusserviceDATA \
- install-udevrulesDATA
+install-data-am: install-dbusactivationDATA install-dbusserviceDATA
@$(NORMAL_INSTALL)
$(MAKE) $(AM_MAKEFLAGS) install-data-hook
install-dvi: install-dvi-recursive
@@ -1119,7 +1095,7 @@ ps: ps-recursive
ps-am:
uninstall-am: uninstall-dbusactivationDATA uninstall-dbusserviceDATA \
- uninstall-libexecPROGRAMS uninstall-udevrulesDATA
+ uninstall-libexecPROGRAMS
.MAKE: $(am__recursive_targets) all check install install-am \
install-data-am install-strip
@@ -1135,13 +1111,13 @@ uninstall-am: uninstall-dbusactivationDATA uninstall-dbusserviceDATA \
install-exec install-exec-am install-html install-html-am \
install-info install-info-am install-libexecPROGRAMS \
install-man install-pdf install-pdf-am install-ps \
- install-ps-am install-strip install-udevrulesDATA installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs installdirs-am maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags tags-am uninstall uninstall-am \
uninstall-dbusactivationDATA uninstall-dbusserviceDATA \
- uninstall-libexecPROGRAMS uninstall-udevrulesDATA
+ uninstall-libexecPROGRAMS
.PRECIOUS: Makefile
diff --git a/callouts/nm-dispatcher-utils.c b/callouts/nm-dispatcher-utils.c
index d8a8e8d87..e7a6f6a2e 100644
--- a/callouts/nm-dispatcher-utils.c
+++ b/callouts/nm-dispatcher-utils.c
@@ -377,7 +377,7 @@ nm_dispatcher_utils_construct_envp (const char *action,
return NULL;
}
g_variant_unref (value);
- g_variant_lookup (device_props, NMD_DEVICE_PROPS_IP_INTERFACE, "&s", &ip_iface);
+ (void) g_variant_lookup (device_props, NMD_DEVICE_PROPS_IP_INTERFACE, "&s", &ip_iface);
}
/* Device type */
diff --git a/callouts/nm-dispatcher.c b/callouts/nm-dispatcher.c
index 0cd2531dd..09eb0d3a3 100644
--- a/callouts/nm-dispatcher.c
+++ b/callouts/nm-dispatcher.c
@@ -294,9 +294,12 @@ script_timeout_cb (gpointer user_data)
g_warning ("Script '%s' took too long; killing it.", script->script);
- if (kill (script->pid, 0) == 0)
- kill (script->pid, SIGKILL);
- (void) waitpid (script->pid, NULL, 0);
+ kill (script->pid, SIGKILL);
+again:
+ if (waitpid (script->pid, NULL, 0) == -1) {
+ if (errno == EINTR)
+ goto again;
+ }
script->error = g_strdup_printf ("Script '%s' timed out.", script->script);
script->result = DISPATCH_RESULT_TIMEOUT;
@@ -361,15 +364,6 @@ check_filename (const char *file_name)
return TRUE;
}
-static void
-child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- /* Give child a different process group to ensure signal separation. */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-}
-
#define SCRIPT_TIMEOUT 600 /* 10 minutes */
static void
@@ -387,7 +381,7 @@ dispatch_one_script (Request *request)
if (request->debug)
g_message ("Running script '%s'", script->script);
- if (g_spawn_async ("/", argv, request->envp, G_SPAWN_DO_NOT_REAP_CHILD, child_setup, request, &script->pid, &error)) {
+ if (g_spawn_async ("/", argv, request->envp, G_SPAWN_DO_NOT_REAP_CHILD, NULL, request, &script->pid, &error)) {
request->script_watch_id = g_child_watch_add (script->pid, (GChildWatchFunc) script_watch_cb, script);
request->script_timeout_id = g_timeout_add_seconds (SCRIPT_TIMEOUT, script_timeout_cb, script);
} else {
@@ -555,8 +549,13 @@ on_name_lost (GDBusConnection *connection,
gpointer user_data)
{
if (!connection) {
- g_warning ("Could not get the system bus. Make sure the message bus daemon is running!");
- exit (1);
+ if (!ever_acquired_name) {
+ g_warning ("Could not get the system bus. Make sure the message bus daemon is running!");
+ exit (1);
+ } else {
+ g_message ("System bus stopped. Exiting");
+ exit (0);
+ }
} else if (!ever_acquired_name) {
g_warning ("Could not acquire the " NM_DISPATCHER_DBUS_SERVICE " service.");
exit (1);
diff --git a/callouts/tests/Makefile.in b/callouts/tests/Makefile.in
index bd3241cee..f02c47dda 100644
--- a/callouts/tests/Makefile.in
+++ b/callouts/tests/Makefile.in
@@ -208,13 +208,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -328,6 +511,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -503,7 +687,7 @@ EXTRA_DIST = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -634,98 +818,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-dispatcher-envp.log: test-dispatcher-envp$(EXEEXT)
+ @p='test-dispatcher-envp$(EXEEXT)'; \
+ b='test-dispatcher-envp'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -782,6 +1036,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -877,7 +1134,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/clients/Makefile.in b/clients/Makefile.in
index b3fa0d99a..2d750714c 100644
--- a/clients/Makefile.in
+++ b/clients/Makefile.in
@@ -231,6 +231,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -344,6 +345,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/clients/cli/Makefile.in b/clients/cli/Makefile.in
index 657f00ff9..34315101f 100644
--- a/clients/cli/Makefile.in
+++ b/clients/cli/Makefile.in
@@ -206,6 +206,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -319,6 +320,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/clients/cli/common.c b/clients/cli/common.c
index a47c32e83..97d0bb940 100644
--- a/clients/cli/common.c
+++ b/clients/cli/common.c
@@ -708,6 +708,12 @@ nmc_device_reason_to_string (NMDeviceStateReason reason)
case NM_DEVICE_STATE_REASON_NEW_ACTIVATION:
return _("New connection activation was enqueued");
+ case NM_DEVICE_STATE_REASON_PARENT_CHANGED:
+ return _("The device's parent changed");
+
+ case NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED:
+ return _("The device parent's management changed");
+
default:
/* TRANSLATORS: Unknown reason for a device state change (NMDeviceStateReason) */
return _("Unknown");
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 9206d9dac..8d138bdf1 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -49,7 +49,8 @@
#define PROMPT_BOND_MASTER _("Bond master: ")
#define PROMPT_TEAM_MASTER _("Team master: ")
#define PROMPT_BRIDGE_MASTER _("Bridge master: ")
-#define PROMPT_CONNECTION _("Connection (name, UUID, or path): ")
+#define PROMPT_CONNECTION _("Connection (name, UUID, or path): ")
+#define PROMPT_CONNECTIONS _("Connection(s) (name, UUID, or path): ")
static const char *nmc_known_vpns[] =
{ "openvpn", "vpnc", "pptp", "openconnect", "openswan", "libreswan",
@@ -237,6 +238,7 @@ typedef struct {
char *con_type;
NMConnection *connection;
NMSetting *setting;
+ const char *property;
} TabCompletionInfo;
static TabCompletionInfo nmc_tab_completion = {NULL, NULL, NULL, NULL};
@@ -1567,6 +1569,7 @@ find_device_for_connection (NmCli *nmc,
int i, j;
g_return_val_if_fail (nmc != NULL, FALSE);
+ g_return_val_if_fail (iface || ap || nsp, FALSE);
g_return_val_if_fail (device != NULL && *device == NULL, FALSE);
g_return_val_if_fail (spec_object != NULL && *spec_object == NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@@ -1726,7 +1729,7 @@ device_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
nm_object_get_path (NM_OBJECT (active)));
quit ();
} else if ( ac_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATING
- && state == NM_DEVICE_STATE_IP_CONFIG) {
+ && state >= NM_DEVICE_STATE_IP_CONFIG) {
if (nmc->print_output == NMC_PRINT_PRETTY)
nmc_terminal_erase_line ();
g_print (_("Connection successfully activated (master waiting for slaves) (D-Bus active path: %s)\n"),
@@ -2052,7 +2055,7 @@ nmc_activate_connection (NmCli *nmc,
g_return_val_if_fail (nmc != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- if (connection) {
+ if (connection && (ifname || ap || nsp)) {
device_found = find_device_for_connection (nmc, connection, ifname, ap, nsp, &device, &spec_object, &local);
/* Virtual connection may not have their interfaces created yet */
@@ -2070,7 +2073,7 @@ nmc_activate_connection (NmCli *nmc,
_("unknown device '%s'."), ifname);
return FALSE;
}
- } else {
+ } else if (!connection) {
g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_NOT_FOUND,
_("neither a valid connection nor device given"));
return FALSE;
@@ -2239,25 +2242,26 @@ typedef struct {
NmCli *nmc;
GSList *queue;
guint timeout_id;
-} DeactivateConnectionInfo;
+} ConnectionCbInfo;
-static void deactivate_connection_info_finish (DeactivateConnectionInfo *info,
- NMActiveConnection *active);
+static void connection_cb_info_finish (ConnectionCbInfo *info,
+ gpointer connection);
-static gboolean
-down_timeout_cb (gpointer user_data)
+static void
+connection_removed_cb (NMClient *client, NMConnection *connection, ConnectionCbInfo *info)
{
- DeactivateConnectionInfo *info = user_data;
-
- timeout_cb (info->nmc);
- deactivate_connection_info_finish (info, NULL);
- return G_SOURCE_REMOVE;
+ if (!g_slist_find (info->queue, connection))
+ return;
+ g_print (_("Connection '%s' (%s) successfully deleted.\n"),
+ nm_connection_get_id (connection),
+ nm_connection_get_uuid (connection));
+ connection_cb_info_finish (info, connection);
}
static void
down_active_connection_state_cb (NMActiveConnection *active,
GParamSpec *pspec,
- DeactivateConnectionInfo *info)
+ ConnectionCbInfo *info)
{
if (nm_active_connection_get_state (active) < NM_ACTIVE_CONNECTION_STATE_DEACTIVATED)
return;
@@ -2267,7 +2271,20 @@ down_active_connection_state_cb (NMActiveConnection *active,
g_print (_("Connection '%s' successfully deactivated (D-Bus active path: %s)\n"),
nm_active_connection_get_id (active), nm_object_get_path (NM_OBJECT (active)));
- deactivate_connection_info_finish (info, active);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (active),
+ down_active_connection_state_cb,
+ info);
+ connection_cb_info_finish (info, active);
+}
+
+static gboolean
+connection_op_timeout_cb (gpointer user_data)
+{
+ ConnectionCbInfo *info = user_data;
+
+ timeout_cb (info->nmc);
+ connection_cb_info_finish (info, NULL);
+ return G_SOURCE_REMOVE;
}
static void
@@ -2279,15 +2296,11 @@ destroy_queue_element (gpointer data)
}
static void
-deactivate_connection_info_finish (DeactivateConnectionInfo *info,
- NMActiveConnection *active)
-{
- if (active) {
- info->queue = g_slist_remove (info->queue, active);
- g_signal_handlers_disconnect_by_func (active,
- down_active_connection_state_cb,
- info);
- g_object_unref (active);
+connection_cb_info_finish (ConnectionCbInfo *info, gpointer connection)
+{
+ if (connection) {
+ info->queue = g_slist_remove (info->queue, connection);
+ g_object_unref (G_OBJECT (connection));
} else {
g_slist_free_full (info->queue, destroy_queue_element);
info->queue = NULL;
@@ -2298,7 +2311,8 @@ deactivate_connection_info_finish (DeactivateConnectionInfo *info,
if (info->timeout_id)
g_source_remove (info->timeout_id);
- g_slice_free (DeactivateConnectionInfo, info);
+ g_signal_handlers_disconnect_by_func (info->nmc->client, connection_removed_cb, info);
+ g_slice_free (ConnectionCbInfo, info);
quit ();
}
@@ -2306,7 +2320,7 @@ static NMCResultCode
do_connection_down (NmCli *nmc, int argc, char **argv)
{
NMActiveConnection *active;
- DeactivateConnectionInfo *info = NULL;
+ ConnectionCbInfo *info = NULL;
const GPtrArray *active_cons;
GSList *queue = NULL, *iter;
char *line = NULL;
@@ -2315,10 +2329,13 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
int arg_num = argc;
int idx = 0;
+ if (nmc->timeout == -1)
+ nmc->timeout = 10;
+
if (argc == 0) {
if (nmc->ask) {
- line = nmc_readline (PROMPT_CONNECTION);
- nmc_string_to_arg_array (line, "", &arg_arr, &arg_num);
+ line = nmc_readline (PROMPT_CONNECTIONS);
+ nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
g_free (line);
arg_ptr = arg_arr;
}
@@ -2329,9 +2346,6 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
}
}
- if (nmc->timeout == -1)
- nmc->timeout = 10;
-
/* Get active connections */
active_cons = nm_client_get_active_connections (nmc->client);
while (arg_num > 0) {
@@ -2351,9 +2365,13 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
}
active = find_active_connection (active_cons, nmc->connections, selector, *arg_ptr, &idx);
- if (active)
- queue = g_slist_prepend (queue, active);
- else {
+ if (active) {
+ /* Check if the connection is unique. */
+ /* Calling down for the same connection repeatedly would result in
+ * NM responding for the last D-Bus call only and we would stall. */
+ if (!g_slist_find (queue, active))
+ queue = g_slist_prepend (queue, g_object_ref (active));
+ } else {
g_printerr (_("Error: '%s' is not an active connection.\n"), *arg_ptr);
g_string_printf (nmc->return_text, _("Error: not all active connections found."));
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
@@ -2368,27 +2386,25 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto error;
}
-
queue = g_slist_reverse (queue);
if (nmc->timeout > 0) {
nmc->should_wait = TRUE;
- info = g_slice_new0 (DeactivateConnectionInfo);
+ info = g_slice_new0 (ConnectionCbInfo);
info->nmc = nmc;
- info->timeout_id = g_timeout_add_seconds (nmc->timeout, down_timeout_cb, info);
+ info->queue = queue;
+ info->timeout_id = g_timeout_add_seconds (nmc->timeout, connection_op_timeout_cb, info);
}
for (iter = queue; iter; iter = g_slist_next (iter)) {
active = iter->data;
- if (info) {
- info->queue = g_slist_prepend (info->queue, g_object_ref (active));
+ if (info)
g_signal_connect (active,
"notify::" NM_ACTIVE_CONNECTION_STATE,
G_CALLBACK (down_active_connection_state_cb),
info);
- }
/* Now deactivate the connection */
nm_client_deactivate_connection (nmc->client, active, NULL, NULL);
@@ -2396,7 +2412,6 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
error:
g_strfreev (arg_arr);
- g_slist_free (queue);
return nmc->return_value;
}
@@ -2862,7 +2877,7 @@ check_valid_enumeration (char **str,
} else {
char *options;
- options = nmc_util_strv_for_display (strings);
+ options = nmc_util_strv_for_display (strings, TRUE);
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
_("Error: '%s': '%s' is not a valid %s %s."),
what, *str, what_desc, options);
@@ -5732,7 +5747,6 @@ uuid_display_hook (char **array, int len, int max_len)
int i, max = 0;
char *tmp;
const char *id;
-
for (i = 1; i <= len; i++) {
con = nmc_find_connection (nmc_tab_completion.nmc->connections, "uuid", array[i], NULL);
id = con ? nm_connection_get_id (con) : NULL;
@@ -6087,48 +6101,105 @@ should_complete_cmd (const char *line, int end, const char *cmd,
return ret;
}
-static char *
-extract_property_name (const char *prompt, const char *line)
+/*
+ * extract_setting_and_property:
+ * prompt: (in) (allow-none): prompt string, or NULL
+ * line: (in) (allow-none): line, or NULL
+ * setting: (out) (transfer full) (array zero-terminated=1):
+ * return location for setting name
+ * property: (out) (transfer full) (array zero-terminated=1):
+ * return location for property name
+ *
+ * Extract setting and property names from prompt and/or line.
+ */
+static void
+extract_setting_and_property (const char *prompt, const char *line,
+ char **setting, char **property)
{
char *prop = NULL;
+ char *sett = NULL;
- /* If prompt is set take the property name from it, else extract it from line */
- if (!prompt) {
- const char *p1;
- size_t num;
- p1 = strchr (line, '.');
- if (p1) {
- p1++;
- } else {
- size_t n1, n2, n3;
- n1 = strspn (line, " \t");
- n2 = strcspn (line+n1, " \t\0") + n1;
- n3 = strspn (line+n2, " \t") + n2;
- p1 = line + n3;
- }
- num = strcspn (p1, " \t\0");
- prop = g_strndup (p1, num);
- } else {
- const char *p1, *dot;
- size_t num;
+ if (prompt) {
+ /* prompt looks like this:
+ "nmcli 802-1x>" or "nmcli 802-1x.pac-file>" */
+ const char *p1, *p2, *dot;
+ size_t num1, num2;
p1 = strchr (prompt, ' ');
- /* prompt looks like this: "nmcli 802-1x>" or "nmcli 802-1x.pac-file>" */
if (p1) {
- dot = strchr (p1 + 1, '.');
- p1 = dot ? dot + 1 : p1;
- num = strcspn (p1, ">");
- prop = g_strndup (p1, num);
+ dot = strchr (++p1, '.');
+ if (dot) {
+ p2 = dot + 1;
+ num1 = strcspn (p1, ".");
+ num2 = strcspn (p2, ">");
+ sett = num1 > 0 ? g_strndup (p1, num1) : NULL;
+ prop = num2 > 0 ? g_strndup (p2, num2) : NULL;
+ } else {
+ num1 = strcspn (p1, ">");
+ sett = num1 > 0 ? g_strndup (p1, num1) : NULL;
+ }
}
}
- return prop;
+ if (line) {
+ /* line looks like this:
+ " set 802-1x.pac-file ..." or " set pac-file ..." */
+ const char *p1, *p2, *dot;
+ size_t n1, n2, n3, n4;
+ size_t num1, num2, len;
+ n1 = strspn (line, " \t"); /* white-space */
+ n2 = strcspn (line+n1, " \t\0") + n1; /* command */
+ n3 = strspn (line+n2, " \t") + n2; /* white-space */
+ n4 = strcspn (line+n3, " \t\0") + n3; /* setting/property */
+ p1 = line + n3;
+ len = n4 - n3;
+
+ dot = strchr (p1, '.');
+ if (dot && dot < p1 + len) {
+ p2 = dot + 1;
+ num1 = strcspn (p1, ".");
+ num2 = len > num1 + 1 ? len - num1 - 1 : 0;
+ sett = num1 > 0 ? g_strndup (p1, num1) : sett;
+ prop = num2 > 0 ? g_strndup (p2, num2) : prop;
+ } else {
+ if (!prop)
+ prop = len > 0 ? g_strndup (p1, len) : NULL;
+ }
+ }
+
+ if (setting)
+ *setting = sett;
+ else
+ g_free (sett);
+ if (property)
+ *property = prop;
+ else
+ g_free (prop);
}
static gboolean
-should_complete_files (const char *prompt, const char *line)
+_get_and_check_property (const char *prompt,
+ const char *line,
+ const char **array,
+ const char **array_multi,
+ gboolean *multi)
{
char *prop;
gboolean found = FALSE;
+
+ extract_setting_and_property (prompt, line, NULL, &prop);
+ if (prop) {
+ if (array)
+ found = !!nmc_string_is_valid (prop, array, NULL);
+ if (array_multi && multi)
+ *multi = !!nmc_string_is_valid (prop, array_multi, NULL);
+ g_free (prop);
+ }
+ return found;
+}
+
+static gboolean
+should_complete_files (const char *prompt, const char *line)
+{
const char *file_properties[] = {
/* '802-1x' properties */
"ca-cert",
@@ -6144,32 +6215,86 @@ should_complete_files (const char *prompt, const char *line)
"config",
NULL
};
-
- prop = extract_property_name (prompt, line);
- if (prop) {
- found = !!nmc_string_is_valid (prop, file_properties, NULL);
- g_free (prop);
- }
- return found;
+ return _get_and_check_property (prompt, line, file_properties, NULL, NULL);
}
static gboolean
should_complete_vpn_uuids (const char *prompt, const char *line)
{
- char *prop;
- gboolean found = FALSE;
const char *uuid_properties[] = {
/* 'connection' properties */
"secondaries",
NULL
};
+ return _get_and_check_property (prompt, line, uuid_properties, NULL, NULL);
+}
- prop = extract_property_name (prompt, line);
- if (prop) {
- found = !!nmc_string_is_valid (prop, uuid_properties, NULL);
- g_free (prop);
- }
- return found;
+static char *is_property_valid (NMSetting *setting, const char *property, GError **error);
+static const char **
+get_allowed_property_values (void)
+{
+ const NameItem *valid_settings_arr;
+ const char *setting_name;
+ NMSetting *setting = NULL;
+ char *property = NULL;
+ char *sett = NULL, *prop = NULL;
+ const char **avals = NULL;
+
+ extract_setting_and_property (rl_prompt, rl_line_buffer, &sett, &prop);
+ if (sett) {
+ valid_settings_arr = get_valid_settings_array (nmc_tab_completion.con_type);
+ setting_name = check_valid_name (sett, valid_settings_arr, NULL);
+ setting = nmc_setting_new_for_name (setting_name);
+ } else
+ setting = nmc_tab_completion.setting ? g_object_ref (nmc_tab_completion.setting) : NULL;
+
+ if (setting && prop)
+ property = is_property_valid (setting, prop, NULL);
+ else
+ property = g_strdup (nmc_tab_completion.property);
+
+ if (setting && property)
+ avals = nmc_setting_get_property_allowed_values (setting, property);
+
+ g_free (sett);
+ g_free (prop);
+ if (setting)
+ g_object_unref (setting);
+ g_free (property);
+ return avals;
+}
+
+static gboolean
+should_complete_property_values (const char *prompt, const char *line, gboolean *multi)
+{
+ /* properties allowing multiple values */
+ const char *multi_props[] = {
+ /* '802-1x' properties */
+ NM_SETTING_802_1X_EAP,
+ /* '802-11-wireless-security' properties */
+ NM_SETTING_WIRELESS_SECURITY_PROTO,
+ NM_SETTING_WIRELESS_SECURITY_PAIRWISE,
+ NM_SETTING_WIRELESS_SECURITY_GROUP,
+ /* 'bond' properties */
+ NM_SETTING_BOND_OPTIONS,
+ /* 'ethernet' properties */
+ NM_SETTING_WIRED_S390_OPTIONS,
+ NULL
+ };
+ _get_and_check_property (prompt, line, NULL, multi_props, multi);
+ return get_allowed_property_values () != NULL;
+}
+
+static char *
+gen_property_values (const char *text, int state)
+{
+ char *ret = NULL;
+ const char **avals;
+
+ avals = get_allowed_property_values ();
+ if (avals)
+ ret = nmc_rl_gen_func_basic (text, state, avals);
+ return ret;
}
/* from readline */
@@ -6239,6 +6364,7 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
if (!strchr (prompt_tmp, '.')) {
int level = g_str_has_prefix (prompt_tmp, "nmcli>") ? 0 : 1;
const char *dot = strchr (line, '.');
+ gboolean multi;
/* Main menu - level 0,1 */
if (start == n1)
@@ -6259,9 +6385,12 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
} else if (num >= 3) {
if (num == 3 && should_complete_files (NULL, line))
rl_attempted_completion_over = 0;
- if (should_complete_vpn_uuids (NULL, line)) {
+ else if (should_complete_vpn_uuids (NULL, line)) {
rl_completion_display_matches_hook = uuid_display_hook;
generator_func = gen_vpn_uuids;
+ } else if ( should_complete_property_values (NULL, line, &multi)
+ && (num == 3 || multi)) {
+ generator_func = gen_property_values;
}
}
} else if ( ( should_complete_cmd (line, end, "remove", &num, NULL)
@@ -6296,6 +6425,8 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
if (start == n1)
generator_func = gen_nmcli_cmds_submenu;
else {
+ gboolean multi;
+
if ( should_complete_cmd (line, end, "add", &num, NULL)
|| should_complete_cmd (line, end, "set", &num, NULL)) {
if (num <= 2 && should_complete_files (prompt_tmp, line))
@@ -6303,6 +6434,9 @@ nmcli_editor_tab_completion (const char *text, int start, int end)
else if (should_complete_vpn_uuids (prompt_tmp, line)) {
rl_completion_display_matches_hook = uuid_display_hook;
generator_func = gen_vpn_uuids;
+ } else if ( should_complete_property_values (prompt_tmp, NULL, &multi)
+ && (num <= 2 || multi)) {
+ generator_func = gen_property_values;
}
}
if (should_complete_cmd (line, end, "print", &num, NULL) && num <= 2)
@@ -7016,6 +7150,9 @@ property_edit_submenu (NmCli *nmc,
gboolean temp_changes;
gboolean removed;
+ /* Set global variable for use in TAB completion */
+ nmc_tab_completion.property = prop_name;
+
prompt = nmc_colorize (nmc->editor_prompt_color, "nmcli %s.%s> ",
nm_setting_get_name (curr_setting), prop_name);
@@ -7047,9 +7184,16 @@ property_edit_submenu (NmCli *nmc,
* ADD adds the new value(s)
* single values: : both SET and ADD sets the new value
*/
- if (!cmd_property_arg)
+ if (!cmd_property_arg) {
+ const char **avals = nmc_setting_get_property_allowed_values (curr_setting, prop_name);
+ if (avals) {
+ char *avals_str = nmc_util_strv_for_display (avals, FALSE);
+ g_print (_("Allowed values for '%s' property: %s\n"),
+ prop_name, avals_str);
+ g_free (avals_str);
+ }
prop_val_user = nmc_readline (_("Enter '%s' value: "), prop_name);
- else
+ } else
prop_val_user = g_strdup (cmd_property_arg);
/* nmc_setting_set_property() only adds new value, thus we have to
@@ -7078,7 +7222,7 @@ property_edit_submenu (NmCli *nmc,
case NMC_EDITOR_SUB_CMD_CHANGE:
rl_startup_hook = nmc_rl_set_deftext;
- nmc_rl_pre_input_deftext = nmc_setting_get_property_out2in (curr_setting, prop_name, NULL);
+ nmc_rl_pre_input_deftext = nmc_setting_get_property_parsable (curr_setting, prop_name, NULL);
prop_val_user = nmc_readline (_("Edit '%s' value: "), prop_name);
nmc_property_get_gvalue (curr_setting, prop_name, &prop_g_value);
@@ -7144,6 +7288,8 @@ property_edit_submenu (NmCli *nmc,
break;
case NMC_EDITOR_SUB_CMD_BACK:
+ /* Set global variable for use in TAB completion */
+ nmc_tab_completion.property = NULL;
cmd_property_loop = FALSE;
break;
@@ -7456,7 +7602,7 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
if (menu_ctx.level == 1) {
const char *prop_name;
char *prop_val_user = NULL;
- const char *avals;
+ const char **avals;
GError *tmp_err = NULL;
prop_name = ask_check_property (cmd_arg,
@@ -7466,9 +7612,12 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
break;
avals = nmc_setting_get_property_allowed_values (menu_ctx.curr_setting, prop_name);
- if (avals)
- g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals);
-
+ if (avals) {
+ char *avals_str = nmc_util_strv_for_display (avals, FALSE);
+ g_print (_("Allowed values for '%s' property: %s\n"),
+ prop_name, avals_str);
+ g_free (avals_str);
+ }
prop_val_user = nmc_readline (_("Enter '%s' value: "), prop_name);
/* Set property value */
@@ -7520,10 +7669,13 @@ editor_menu_main (NmCli *nmc, NMConnection *connection, const char *connection_t
/* Ask for value */
if (!cmd_arg_v) {
- const char *avals = nmc_setting_get_property_allowed_values (ss, prop_name);
- if (avals)
- g_print (_("Allowed values for '%s' property: %s\n"), prop_name, avals);
-
+ const char **avals = nmc_setting_get_property_allowed_values (ss, prop_name);
+ if (avals) {
+ char *avals_str = nmc_util_strv_for_display (avals, FALSE);
+ g_print (_("Allowed values for '%s' property: %s\n"),
+ prop_name, avals_str);
+ g_free (avals_str);
+ }
cmd_arg_v = nmc_readline (_("Enter '%s' value: "), prop_name);
}
@@ -8646,52 +8798,44 @@ finish:
return nmc->return_value;
}
-
-typedef struct {
- NmCli *nmc;
- int counter;
-} DeleteStateInfo;
-
static void
delete_cb (GObject *con, GAsyncResult *result, gpointer user_data)
{
- DeleteStateInfo *info = (DeleteStateInfo *) user_data;
+ ConnectionCbInfo *info = (ConnectionCbInfo *) user_data;
GError *error = NULL;
if (!nm_remote_connection_delete_finish (NM_REMOTE_CONNECTION (con), result, &error)) {
- g_string_printf (info->nmc->return_text, _("Error: Connection deletion failed: %s"),
- error->message);
+ g_string_printf (info->nmc->return_text, _("Error: not all connections deleted."));
+ g_printerr (_("Error: Connection deletion failed: %s"),
+ error->message);
g_error_free (error);
info->nmc->return_value = NMC_RESULT_ERROR_CON_DEL;
- }
-
- info->counter--;
- if (info->counter == 0) {
- g_free (info);
- quit ();
+ connection_cb_info_finish (info, con);
+ } else {
+ if (info->nmc->nowait_flag)
+ connection_cb_info_finish (info, con);
}
}
static NMCResultCode
do_connection_delete (NmCli *nmc, int argc, char **argv)
{
- NMConnection *connection = NULL;
- DeleteStateInfo *del_info = NULL;
- char *line = NULL;
+ NMConnection *connection;
+ ConnectionCbInfo *info = NULL;
+ GSList *queue = NULL, *iter;
char **arg_arr = NULL;
char **arg_ptr = argv;
int arg_num = argc;
GString *invalid_cons = NULL;
- gboolean del_info_free = FALSE;
int pos = 0;
- nmc->return_value = NMC_RESULT_SUCCESS;
- nmc->should_wait = FALSE;
+ if (nmc->timeout == -1)
+ nmc->timeout = 10;
if (argc == 0) {
if (nmc->ask) {
- line = nmc_readline (PROMPT_CONNECTION);
- nmc_string_to_arg_array (line, "", &arg_arr, &arg_num);
+ char *line = nmc_readline (PROMPT_CONNECTIONS);
+ nmc_string_to_arg_array (line, NULL, TRUE, &arg_arr, &arg_num);
g_free (line);
arg_ptr = arg_arr;
}
@@ -8702,11 +8846,6 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
}
}
- del_info = g_malloc0 (sizeof (DeleteStateInfo));
- del_info->nmc = nmc;
- del_info->counter = 0;
- del_info_free = TRUE;
-
while (arg_num > 0) {
const char *selector = NULL;
@@ -8722,43 +8861,50 @@ do_connection_delete (NmCli *nmc, int argc, char **argv)
}
connection = nmc_find_connection (nmc->connections, selector, *arg_ptr, &pos);
- if (!connection) {
- if (nmc->print_output != NMC_PRINT_TERSE)
- g_print (_("Error: unknown connection: %s\n"), *arg_ptr);
-
+ if (connection) {
+ /* Check if the connection is unique. */
+ /* Calling delete for the same connection repeatedly would result in
+ * NM responding for the last D-Bus call only and we would stall. */
+ if (!g_slist_find (queue, connection))
+ queue = g_slist_prepend (queue, g_object_ref (connection));
+ } else {
+ g_printerr (_("Error: unknown connection '%s'\n"), *arg_ptr);
+ g_string_printf (nmc->return_text, _("Error: not all active connections found."));
+ nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
if (!invalid_cons)
invalid_cons = g_string_new (NULL);
g_string_append_printf (invalid_cons, "'%s', ", *arg_ptr);
+ }
- /* take the next argument and continue */
+ /* Take next argument (if there's no other connection of the same name) */
+ if (!pos)
next_arg (&arg_num, &arg_ptr);
- continue;
- }
+ }
- /* We need to wait a bit so that nmcli's permissions can be checked.
- * We will exit when D-Bus return (error) messages are received.
- */
- nmc->should_wait = TRUE;
+ if (!queue) {
+ g_string_printf (nmc->return_text, _("Error: no connection provided."));
+ nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+ goto finish;
+ }
+ queue = g_slist_reverse (queue);
- /* del_info deallocation is handled in delete_cb() */
- del_info_free = FALSE;
+ info = g_slice_new0 (ConnectionCbInfo);
+ info->nmc = nmc;
+ info->queue = queue;
+ info->timeout_id = g_timeout_add_seconds (nmc->timeout, connection_op_timeout_cb, info);
- del_info->counter++;
+ nmc->nowait_flag = (nmc->timeout == 0);
+ nmc->should_wait = TRUE;
- /* Delete the connection */
- nm_remote_connection_delete_async (NM_REMOTE_CONNECTION (connection),
- NULL, delete_cb, del_info);
+ g_signal_connect (nmc->client, NM_CLIENT_CONNECTION_REMOVED,
+ G_CALLBACK (connection_removed_cb), info);
- /* Take next argument (if there's no other connection of the same name) */
- if (!pos)
- next_arg (&arg_num, &arg_ptr);
- }
+ /* Now delete the connections */
+ for (iter = queue; iter; iter = g_slist_next (iter))
+ nm_remote_connection_delete_async (NM_REMOTE_CONNECTION (iter->data),
+ NULL, delete_cb, info);
finish:
- if (del_info_free)
- g_free (del_info);
- g_strfreev (arg_arr);
-
if (invalid_cons) {
g_string_truncate (invalid_cons, invalid_cons->len-2); /* truncate trailing ", " */
g_string_printf (nmc->return_text, _("Error: cannot delete unknown connection(s): %s."),
@@ -8766,6 +8912,7 @@ finish:
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
g_string_free (invalid_cons, TRUE);
}
+ g_strfreev (arg_arr);
return nmc->return_value;
}
@@ -8881,7 +9028,7 @@ gen_func_connection_names (const char *text, int state)
for (i = 0; i < nm_cli.connections->len; i++) {
NMConnection *con = NM_CONNECTION (nm_cli.connections->pdata[i]);
const char *id = nm_connection_get_id (con);
- connections[i++] = id;
+ connections[i] = id;
}
connections[i] = NULL;
@@ -8900,14 +9047,17 @@ nmcli_con_tab_completion (const char *text, int start, int end)
/* Disable readline's default filename completion */
rl_attempted_completion_over = 1;
- /* Disable appending space after completion */
- rl_completion_append_character = '\0';
+ if (g_strcmp0 (rl_prompt, PROMPT_CONNECTION) == 0) {
+ /* Disable appending space after completion */
+ rl_completion_append_character = '\0';
- if (!is_single_word (rl_line_buffer))
- return NULL;
+ if (!is_single_word (rl_line_buffer))
+ return NULL;
- if (g_strcmp0 (rl_prompt, PROMPT_CONNECTION) == 0)
generator_func = gen_func_connection_names;
+ } else if (g_strcmp0 (rl_prompt, PROMPT_CONNECTIONS) == 0) {
+ generator_func = gen_func_connection_names;
+ }
if (generator_func)
match_array = rl_completion_matches (text, generator_func);
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index 1633f0ce5..979c59063 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -35,7 +35,8 @@
#include "devices.h"
/* define some prompts */
-#define PROMPT_INTERFACE _("Interface: ")
+#define PROMPT_INTERFACE _("Interface: ")
+#define PROMPT_INTERFACES _("Interface(s): ")
/* Available fields for 'device status' */
static NmcOutputField nmc_fields_dev_status[] = {
@@ -270,8 +271,8 @@ usage (void)
" status\n\n"
" show [<ifname>]\n\n"
" connect <ifname>\n\n"
- " disconnect <ifname>\n\n"
- " delete <ifname>\n\n"
+ " disconnect <ifname> ...\n\n"
+ " delete <ifname> ...\n\n"
" wifi [list [ifname <ifname>] [bssid <BSSID>]]\n\n"
" wifi connect <(B)SSID> [password <password>] [wep-key-type key|phrase] [ifname <ifname>]\n"
" [bssid <BSSID>] [name <name>] [private yes|no]\n\n"
@@ -325,9 +326,9 @@ usage_device_disconnect (void)
{
g_printerr (_("Usage: nmcli device disconnect { ARGUMENTS | help }\n"
"\n"
- "ARGUMENTS := <ifname>\n"
+ "ARGUMENTS := <ifname> ...\n"
"\n"
- "Disconnect the device.\n"
+ "Disconnect devices.\n"
"The command disconnects the device and prevents it from auto-activating\n"
"further connections without user/manual intervention.\n\n"));
}
@@ -337,10 +338,10 @@ usage_device_delete (void)
{
g_printerr (_("Usage: nmcli device delete { ARGUMENTS | help }\n"
"\n"
- "ARGUMENTS := <ifname>\n"
+ "ARGUMENTS := <ifname> ...\n"
"\n"
- "Deletes the software device.\n"
- "The command removes the interface. It only works for software devices\n"
+ "Delete the software devices.\n"
+ "The command removes the interfaces. It only works for software devices\n"
"(like bonds, bridges, etc.). Hardware devices cannot be deleted by the\n"
"command.\n\n"));
}
@@ -1638,28 +1639,85 @@ error:
return nmc->return_value;
}
+typedef struct {
+ NmCli *nmc;
+ GSList *queue;
+ guint timeout_id;
+ gboolean cmd_disconnect;
+} DeviceCbInfo;
+
+static void device_cb_info_finish (DeviceCbInfo *info, NMDevice *device);
+
+static gboolean
+device_op_timeout_cb (gpointer user_data)
+{
+ DeviceCbInfo *info = user_data;
+
+ timeout_cb (info->nmc);
+ device_cb_info_finish (info, NULL);
+ return G_SOURCE_REMOVE;
+}
+
static void
-disconnect_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
+device_removed_cb (NMClient *client, NMDevice *device, DeviceCbInfo *info)
{
- NMDeviceState state;
+ /* Success: device has been removed.
+ * It can also happen when disconnecting a software device.
+ */
+ if (!g_slist_find (info->queue, device))
+ return;
- state = nm_device_get_state (device);
+ if (info->cmd_disconnect)
+ g_print (_("Device '%s' successfully disconnected.\n"),
+ nm_device_get_iface (device));
+ else
+ g_print (_("Device '%s' successfully removed.\n"),
+ nm_device_get_iface (device));
+ device_cb_info_finish (info, device);
+}
- if (state <= NM_DEVICE_STATE_DISCONNECTED) {
- g_signal_handlers_disconnect_by_data (device, user_data);
+static void
+disconnect_state_cb (NMDevice *device, GParamSpec *pspec, DeviceCbInfo *info)
+{
+ if (!g_slist_find (info->queue, device))
+ return;
+
+ if (nm_device_get_state (device) <= NM_DEVICE_STATE_DISCONNECTED) {
g_print (_("Device '%s' successfully disconnected.\n"),
nm_device_get_iface (device));
- quit ();
+ device_cb_info_finish (info, device);
}
}
static void
-device_removed_cb (NMClient *client, NMDevice *device, gpointer user_data)
+destroy_queue_element (gpointer data)
{
- /* Success: device has been removed. It happens when disconnecting a software device. */
- g_signal_handlers_disconnect_by_data (client, user_data);
- g_print (_("Device '%s' successfully disconnected.\n"),
- nm_device_get_iface (device));
+ g_signal_handlers_disconnect_matched (data, G_SIGNAL_MATCH_FUNC, 0, 0, 0,
+ disconnect_state_cb, NULL);
+ g_object_unref (data);
+}
+
+static void
+device_cb_info_finish (DeviceCbInfo *info, NMDevice *device)
+{
+ if (device) {
+ GSList *elem = g_slist_find (info->queue, device);
+ if (!elem)
+ return;
+ info->queue = g_slist_delete_link (info->queue, elem);
+ destroy_queue_element (device);
+ } else {
+ g_slist_free_full (info->queue, destroy_queue_element);
+ info->queue = NULL;
+ }
+
+ if (info->queue)
+ return;
+
+ if (info->timeout_id)
+ g_source_remove (info->timeout_id);
+ g_signal_handlers_disconnect_by_func (info->nmc->client, device_removed_cb, info);
+ g_slice_free (DeviceCbInfo, info);
quit ();
}
@@ -1667,18 +1725,20 @@ static void
disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
{
NMDevice *device = NM_DEVICE (object);
- NmCli *nmc = (NmCli *) user_data;
+ DeviceCbInfo *info = (DeviceCbInfo *) user_data;
+ NmCli *nmc = info->nmc;
NMDeviceState state;
GError *error = NULL;
if (!nm_device_disconnect_finish (device, result, &error)) {
- g_string_printf (nmc->return_text, _("Error: Device '%s' (%s) disconnecting failed: %s"),
- nm_device_get_iface (device),
- nm_object_get_path (NM_OBJECT (device)),
- error->message);
+ g_string_printf (nmc->return_text, _("Error: not all devices disconnected."));
+ g_printerr (_("Error: Device '%s' (%s) disconnecting failed: %s\n"),
+ nm_device_get_iface (device),
+ nm_object_get_path (NM_OBJECT (device)),
+ error->message);
g_error_free (error);
nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT;
- quit ();
+ device_cb_info_finish (info, device);
} else {
state = nm_device_get_state (device);
@@ -1687,16 +1747,11 @@ disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
if (state <= NM_DEVICE_STATE_DISCONNECTED) {
if (nmc->print_output == NMC_PRINT_PRETTY)
nmc_terminal_erase_line ();
- g_print (_("Device '%s' has been disconnected.\n"), nm_device_get_iface (device));
+ g_print (_("Device '%s' successfully disconnected.\n"),
+ nm_device_get_iface (device));
}
- quit ();
- } else {
- g_signal_connect (device, "notify::state", G_CALLBACK (disconnect_state_cb), nmc);
- g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED, G_CALLBACK (device_removed_cb), nmc);
- /* Start timer not to loop forever if "notify::state" signal is not issued */
- g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc);
+ device_cb_info_finish (info, device);
}
-
}
}
@@ -1704,9 +1759,12 @@ static NMCResultCode
do_device_disconnect (NmCli *nmc, int argc, char **argv)
{
NMDevice **devices;
- NMDevice *device = NULL;
- const char *ifname = NULL;
- char *ifname_ask = NULL;
+ NMDevice *device;
+ DeviceCbInfo *info = NULL;
+ GSList *queue = NULL, *iter;
+ char **arg_arr = NULL;
+ char **arg_ptr = argv;
+ int arg_num = argc;
int i;
/* Set default timeout for disconnect operation. */
@@ -1714,59 +1772,78 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
nmc->timeout = 10;
if (argc == 0) {
- if (nmc->ask)
- ifname = ifname_ask = nmc_readline (PROMPT_INTERFACE);
-
- if (!ifname_ask) {
+ if (nmc->ask) {
+ char *line = nmc_readline (PROMPT_INTERFACES);
+ nmc_string_to_arg_array (line, NULL, FALSE, &arg_arr, &arg_num);
+ g_free (line);
+ arg_ptr = arg_arr;
+ }
+ if (arg_num == 0) {
g_string_printf (nmc->return_text, _("Error: No interface specified."));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto error;
}
- } else {
- ifname = *argv;
- }
-
- if (!ifname) {
- g_string_printf (nmc->return_text, _("Error: No interface specified."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
- }
-
- if (next_arg (&argc, &argv) == 0) {
- g_string_printf (nmc->return_text, _("Error: extra argument not allowed: '%s'."), *argv);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
}
devices = get_devices_sorted (nmc->client);
- for (i = 0; devices[i]; i++) {
- NMDevice *candidate = devices[i];
- const char *dev_iface = nm_device_get_iface (candidate);
+ while (arg_num > 0) {
+ device = NULL;
+ for (i = 0; devices[i]; i++) {
+ if (!g_strcmp0 (nm_device_get_iface (devices[i]), *arg_ptr)) {
+ device = devices[i];
+ break;
+ }
+ }
- if (!g_strcmp0 (dev_iface, ifname))
- device = candidate;
+ if (device) {
+ if (!g_slist_find (queue, device))
+ queue = g_slist_prepend (queue, device);
+ else
+ g_printerr (_("Warning: argument '%s' is duplicated.\n"), *arg_ptr);
+ } else {
+ g_printerr (_("Error: Device '%s' not found.\n"), *arg_ptr);
+ g_string_printf (nmc->return_text, _("Error: not all devices found."));
+ nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+ }
+
+ /* Take next argument */
+ next_arg (&arg_num, &arg_ptr);
}
g_free (devices);
- if (!device) {
- g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname);
+ if (!queue) {
+ g_string_printf (nmc->return_text, _("Error: no valid device provided."));
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto error;
}
+ queue = g_slist_reverse (queue);
+
+ info = g_slice_new0 (DeviceCbInfo);
+ info->nmc = nmc;
+ info->cmd_disconnect = TRUE;
+ if (nmc->timeout > 0)
+ info->timeout_id = g_timeout_add_seconds (nmc->timeout, device_op_timeout_cb, info);
+
+ g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED,
+ G_CALLBACK (device_removed_cb), info);
- /*
- * Use nowait_flag instead of should_wait, because exiting has to be postponed
- * till disconnect_device_cb() is called, giving NM time to check our permissions.
- */
nmc->nowait_flag = (nmc->timeout == 0);
nmc->should_wait = TRUE;
- nm_device_disconnect_async (device, NULL, disconnect_device_cb, nmc);
- /* Start progress indication */
- if (nmc->print_output == NMC_PRINT_PRETTY)
- progress_id = g_timeout_add (120, progress_cb, device);
+ for (iter = queue; iter; iter = g_slist_next (iter)) {
+ device = iter->data;
+
+ info->queue = g_slist_prepend (info->queue, g_object_ref (device));
+ g_signal_connect (device, "notify::" NM_DEVICE_STATE,
+ G_CALLBACK (disconnect_state_cb), info);
+
+ /* Now disconnect the device */
+ nm_device_disconnect_async (device, NULL, disconnect_device_cb, info);
+ }
error:
+ g_strfreev (arg_arr);
+ g_slist_free (queue);
return nmc->return_value;
}
@@ -1774,27 +1851,35 @@ static void
delete_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
{
NMDevice *device = NM_DEVICE (object);
- NmCli *nmc = (NmCli *) user_data;
+ DeviceCbInfo *info = (DeviceCbInfo *) user_data;
+ NmCli *nmc = info->nmc;
GError *error = NULL;
if (!nm_device_delete_finish (device, result, &error)) {
- g_string_printf (nmc->return_text, _("Error: Device '%s' (%s) deletion failed: %s"),
- nm_device_get_iface (device),
- nm_object_get_path (NM_OBJECT (device)),
- error->message);
+ g_string_printf (nmc->return_text, _("Error: not all devices deleted."));
+ g_printerr (_("Error: Device '%s' (%s) deletion failed: %s\n"),
+ nm_device_get_iface (device),
+ nm_object_get_path (NM_OBJECT (device)),
+ error->message);
g_error_free (error);
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+ device_cb_info_finish (info, device);
+ } else {
+ if (nmc->nowait_flag)
+ device_cb_info_finish (info, device);
}
- quit ();
}
static NMCResultCode
do_device_delete (NmCli *nmc, int argc, char **argv)
{
NMDevice **devices;
- NMDevice *device = NULL;
- const char *ifname = NULL;
- char *ifname_ask = NULL;
+ NMDevice *device;
+ DeviceCbInfo *info = NULL;
+ GSList *queue = NULL, *iter;
+ char **arg_arr = NULL;
+ char **arg_ptr = argv;
+ int arg_num = argc;
int i;
/* Set default timeout for delete operation. */
@@ -1802,64 +1887,82 @@ do_device_delete (NmCli *nmc, int argc, char **argv)
nmc->timeout = 10;
if (argc == 0) {
- if (nmc->ask)
- ifname = ifname_ask = nmc_readline (PROMPT_INTERFACE);
-
- if (!ifname_ask) {
+ if (nmc->ask) {
+ char *line = nmc_readline (PROMPT_INTERFACES);
+ nmc_string_to_arg_array (line, NULL, FALSE, &arg_arr, &arg_num);
+ g_free (line);
+ arg_ptr = arg_arr;
+ }
+ if (arg_num == 0) {
g_string_printf (nmc->return_text, _("Error: No interface specified."));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
goto error;
}
- } else
- ifname = *argv;
-
- if (!ifname) {
- g_string_printf (nmc->return_text, _("Error: No interface specified."));
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
- }
-
- if (next_arg (&argc, &argv) == 0) {
- g_string_printf (nmc->return_text, _("Error: extra argument not allowed: '%s'."), *argv);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
}
devices = get_devices_sorted (nmc->client);
- for (i = 0; devices[i]; i++) {
- NMDevice *candidate = devices[i];
- const char *dev_iface = nm_device_get_iface (candidate);
+ while (arg_num > 0) {
+ device = NULL;
+ for (i = 0; devices[i]; i++) {
+ if (!g_strcmp0 (nm_device_get_iface (devices[i]), *arg_ptr)) {
+ device = devices[i];
+ break;
+ }
+ }
- if (!g_strcmp0 (dev_iface, ifname))
- device = candidate;
+ if (device) {
+ if (!g_slist_find (queue, device)) {
+ if (nm_device_is_software (device))
+ queue = g_slist_prepend (queue, device);
+ else {
+ g_printerr (_("Error: Device '%s' is a hardware device. It can't be deleted.\n"),
+ *arg_ptr);
+ g_string_printf (nmc->return_text, _("Error: not all devices valid."));
+ nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+ }
+ } else
+ g_printerr (_("Warning: argument '%s' is duplicated.\n"), *arg_ptr);
+ } else {
+ g_printerr (_("Error: Device '%s' not found.\n"), *arg_ptr);
+ g_string_printf (nmc->return_text, _("Error: not all devices found."));
+ nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
+ }
+
+ /* Take next argument */
+ next_arg (&arg_num, &arg_ptr);
}
g_free (devices);
- if (!device) {
- g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname);
+ if (!queue) {
+ g_string_printf (nmc->return_text, _("Error: no valid device provided."));
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
goto error;
}
+ queue = g_slist_reverse (queue);
- if (!nm_device_is_software (device)) {
- g_string_printf (nmc->return_text, _("Error: Device '%s' is a hardware device. It can't be deleted."), ifname);
- nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
- goto error;
- }
+ info = g_slice_new0 (DeviceCbInfo);
+ info->nmc = nmc;
+ if (nmc->timeout > 0)
+ info->timeout_id = g_timeout_add_seconds (nmc->timeout, device_op_timeout_cb, info);
+
+ g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED,
+ G_CALLBACK (device_removed_cb), info);
- /*
- * Use nowait_flag instead of should_wait, because exiting has to be postponed
- * till delete_device_cb() is called, giving NM time to check our permissions.
- */
nmc->nowait_flag = (nmc->timeout == 0);
nmc->should_wait = TRUE;
- nm_device_delete_async (device, NULL, delete_device_cb, nmc);
- /* Start progress indication */
- if (nmc->print_output == NMC_PRINT_PRETTY)
- progress_id = g_timeout_add (120, progress_cb, device);
+ for (iter = queue; iter; iter = g_slist_next (iter)) {
+ device = iter->data;
+
+ info->queue = g_slist_prepend (info->queue, g_object_ref (device));
+
+ /* Now delete the device */
+ nm_device_delete_async (device, NULL, delete_device_cb, info);
+ }
error:
+ g_strfreev (arg_arr);
+ g_slist_free (queue);
return nmc->return_value;
}
@@ -2789,7 +2892,7 @@ extern NmCli nm_cli;
static char *
gen_func_ifnames (const char *text, int state)
{
- int i, j = 0;
+ int i;
const GPtrArray *devices;
const char **ifnames;
char *ret;
@@ -2803,9 +2906,9 @@ gen_func_ifnames (const char *text, int state)
for (i = 0; i < devices->len; i++) {
NMDevice *dev = g_ptr_array_index (devices, i);
const char *ifname = nm_device_get_iface (dev);
- ifnames[j++] = ifname;
+ ifnames[i] = ifname;
}
- ifnames[j] = NULL;
+ ifnames[i] = NULL;
ret = nmc_rl_gen_func_basic (text, state, ifnames);
@@ -2822,14 +2925,17 @@ nmcli_device_tab_completion (const char *text, int start, int end)
/* Disable readline's default filename completion */
rl_attempted_completion_over = 1;
- /* Disable appending space after completion */
- rl_completion_append_character = '\0';
+ if (g_strcmp0 (rl_prompt, PROMPT_INTERFACE) == 0) {
+ /* Disable appending space after completion */
+ rl_completion_append_character = '\0';
- if (!is_single_word (rl_line_buffer))
- return NULL;
+ if (!is_single_word (rl_line_buffer))
+ return NULL;
- if (g_strcmp0 (rl_prompt, PROMPT_INTERFACE) == 0)
generator_func = gen_func_ifnames;
+ } else if (g_strcmp0 (rl_prompt, PROMPT_INTERFACES) == 0) {
+ generator_func = gen_func_ifnames;
+ }
if (generator_func)
match_array = rl_completion_matches (text, generator_func);
diff --git a/clients/cli/nmcli-completion b/clients/cli/nmcli-completion
index dce20d138..38d7e5857 100644
--- a/clients/cli/nmcli-completion
+++ b/clients/cli/nmcli-completion
@@ -1218,10 +1218,14 @@ _nmcli()
fi
;;
sh|sho|show| \
- c|co|con|conn|conne|connec|connect| \
+ c|co|con|conn|conne|connec|connect)
+ if [[ ${#words[@]} -eq 3 ]]; then
+ _nmcli_compl_COMMAND_nl "${words[2]}" "$(_nmcli_dev_status DEVICE)"
+ fi
+ ;;
d|di|dis|disc|disco|discon|disconn|disconne|disconnec|disconnect| \
de|del|dele|delet|delete)
- if [[ ${#words[@]} -eq 3 ]]; then
+ if [[ ${#words[@]} -ge 3 ]]; then
_nmcli_compl_COMMAND_nl "${words[2]}" "$(_nmcli_dev_status DEVICE)"
fi
;;
diff --git a/clients/cli/settings-docs.c b/clients/cli/settings-docs.c
index 1edfddb5c..2ed41cb86 100644
--- a/clients/cli/settings-docs.c
+++ b/clients/cli/settings-docs.c
@@ -83,7 +83,7 @@ NmcPropertyDesc setting_802_1x[] = {
{ "private-key-password", "The password used to decrypt the private key specified in the \"private-key\" property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key." },
{ "private-key-password-flags", "Flags indicating how to handle the \"private-key-password\" property." },
{ "subject-match", "Substring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed." },
- { "system-ca-certs", "When TRUE, overrides the \"ca-path\" and \"phase2-ca-path\" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the \"ca-cert\" and \"phase2-ca-cert\" properties." },
+ { "system-ca-certs", "When TRUE, overrides the \"ca-path\" and \"phase2-ca-path\" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the \"ca-cert\" and \"phase2-ca-cert\" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides \"ca-cert\" and \"phase2-ca-cert\" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant)." },
};
NmcPropertyDesc setting_802_3_ethernet[] = {
@@ -152,6 +152,7 @@ NmcPropertyDesc setting_cdma[] = {
NmcPropertyDesc setting_connection[] = {
{ "autoconnect", "Whether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection." },
{ "autoconnect-priority", "The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority." },
+ { "autoconnect-slaves", "Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0." },
{ "gateway-ping-timeout", "If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping." },
{ "id", "A human readable unique identifier for the connection, like \"Work Wi-Fi\" or \"T-Mobile 3G\"." },
{ "interface-name", "The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface." },
@@ -239,7 +240,7 @@ NmcPropertyDesc setting_ipv6[] = {
{ "gateway", "The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set." },
{ "ignore-auto-dns", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used." },
{ "ignore-auto-routes", "When \"method\" is set to \"auto\" and this property to TRUE, automatically configured routes are ignored and only routes specified in the \"routes\" property, if any, are used." },
- { "ip6-privacy", "Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses)." },
+ { "ip6-privacy", "Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to \"-1\" (unknown) means fallback to global configuration \"ipv6.ip6-privacy\". If also global configuration is unspecified or set to \"-1\", fallback to read \"/proc/sys/net/ipv6/conf/default/use_tempaddr\"." },
{ "may-fail", "If TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully." },
{ "method", "IP configuration method. NMSettingIP4Config and NMSettingIP6Config both support \"auto\", \"manual\", and \"link-local\". See the subclass-specific documentation for other values. In general, for the \"auto\" method, properties such as \"dns\" and \"routes\" specify information that is added on to the information returned from automatic configuration. The \"ignore-auto-routes\" and \"ignore-auto-dns\" properties modify this behavior. For methods that imply no upstream network, such as \"shared\" or \"link-local\", these properties must be empty." },
{ "name", "The setting's name, which uniquely identifies the setting within the connection. Each setting type has a name unique to that type, for example \"ppp\" or \"wireless\" or \"wired\"." },
@@ -341,7 +342,7 @@ NmcSettingDesc all_settings[] = {
{ "bridge", setting_bridge, 8 },
{ "bridge-port", setting_bridge_port, 4 },
{ "cdma", setting_cdma, 5 },
- { "connection", setting_connection, 15 },
+ { "connection", setting_connection, 16 },
{ "dcb", setting_dcb, 16 },
{ "generic", setting_generic, 1 },
{ "gsm", setting_gsm, 10 },
diff --git a/clients/cli/settings.c b/clients/cli/settings.c
index 09916954a..66e6f6224 100644
--- a/clients/cli/settings.c
+++ b/clients/cli/settings.c
@@ -29,10 +29,16 @@
#include "common.h"
#include "settings.h"
#include "nm-glib-compat.h"
+#include "nm-macros-internal.h"
/* Forward declarations */
static char *wep_key_type_to_string (NMWepKeyType type);
+typedef enum {
+ NMC_PROPERTY_GET_PRETTY,
+ NMC_PROPERTY_GET_PARSABLE,
+} NmcPropertyGetType;
+
/* Helper macro to define fields */
#define SETTING_FIELD(setting, width) { setting, N_(setting), width, NULL, FALSE, FALSE, 0 }
@@ -51,8 +57,9 @@ NmcOutputField nmc_fields_setting_connection[] = {
SETTING_FIELD (NM_SETTING_CONNECTION_ZONE, 10), /* 10 */
SETTING_FIELD (NM_SETTING_CONNECTION_MASTER, 20), /* 11 */
SETTING_FIELD (NM_SETTING_CONNECTION_SLAVE_TYPE, 20), /* 12 */
- SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES, 40), /* 13 */
- SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, 30), /* 14 */
+ SETTING_FIELD (NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES, 13), /* 13 */
+ SETTING_FIELD (NM_SETTING_CONNECTION_SECONDARIES, 40), /* 14 */
+ SETTING_FIELD (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, 30), /* 15 */
{NULL, NULL, 0, NULL, FALSE, FALSE, 0}
};
#define NMC_FIELDS_SETTING_CONNECTION_ALL "name"","\
@@ -68,6 +75,7 @@ NmcOutputField nmc_fields_setting_connection[] = {
NM_SETTING_CONNECTION_ZONE","\
NM_SETTING_CONNECTION_MASTER","\
NM_SETTING_CONNECTION_SLAVE_TYPE","\
+ NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES","\
NM_SETTING_CONNECTION_SECONDARIES","\
NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT
#define NMC_FIELDS_SETTING_CONNECTION_COMMON NMC_FIELDS_SETTING_CONNECTION_ALL
@@ -743,8 +751,11 @@ vlan_priorities_to_string (NMSettingVlan *s_vlan, NMVlanPriorityMap map)
}
static char *
-ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy)
+ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy, NmcPropertyGetType get_type)
{
+ if (get_type == NMC_PROPERTY_GET_PARSABLE)
+ return g_strdup_printf ("%d", ip6_privacy);
+
switch (ip6_privacy) {
case NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED:
return g_strdup_printf (_("%d (disabled)"), ip6_privacy);
@@ -758,15 +769,35 @@ ip6_privacy_to_string (NMSettingIP6ConfigPrivacy ip6_privacy)
}
static char *
-secret_flags_to_string (guint32 flags)
+autoconnect_slaves_to_string (NMSettingConnectionAutoconnectSlaves autoconnect_slaves, NmcPropertyGetType get_type)
+{
+ if (get_type == NMC_PROPERTY_GET_PARSABLE)
+ return g_strdup_printf ("%d", (int) autoconnect_slaves);
+
+ switch (autoconnect_slaves) {
+ case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO:
+ return g_strdup_printf (_("%d (no)"), autoconnect_slaves);
+ case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES:
+ return g_strdup_printf (_("%d (yes)"), autoconnect_slaves);
+ case NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT:
+ default:
+ return g_strdup_printf (_("%d (default)"), autoconnect_slaves);
+ }
+}
+
+static char *
+secret_flags_to_string (guint32 flags, NmcPropertyGetType get_type)
{
GString *flag_str;
+ if (get_type == NMC_PROPERTY_GET_PARSABLE)
+ return g_strdup_printf ("%u", flags);
+
if (flags == 0)
return g_strdup (_("0 (none)"));
flag_str = g_string_new (NULL);
- g_string_printf (flag_str, "%d (", flags);
+ g_string_printf (flag_str, "%u (", flags);
if (flags & NM_SETTING_SECRET_FLAG_AGENT_OWNED)
g_string_append (flag_str, _("agent-owned, "));
@@ -800,7 +831,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
/* === property get functions === */
#define DEFINE_GETTER(func_name, property_name) \
static char * \
- func_name (NMSetting *setting) \
+ func_name (NMSetting *setting, NmcPropertyGetType get_type) \
{ \
char *s; \
GValue val = G_VALUE_INIT; \
@@ -813,7 +844,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
#define DEFINE_SECRET_FLAGS_GETTER(func_name, property_name) \
static char * \
- func_name (NMSetting *setting) \
+ func_name (NMSetting *setting, NmcPropertyGetType get_type) \
{ \
guint v; \
GValue val = G_VALUE_INIT; \
@@ -821,7 +852,7 @@ vpn_data_item (const char *key, const char *value, gpointer user_data)
g_object_get_property (G_OBJECT (setting), property_name, &val); \
v = g_value_get_uint (&val); \
g_value_unset (&val); \
- return secret_flags_to_string (v); \
+ return secret_flags_to_string (v, get_type); \
}
/* --- NM_SETTING_802_1X_SETTING_NAME property get functions --- */
@@ -852,7 +883,7 @@ DEFINE_SECRET_FLAGS_GETTER (nmc_property_802_1X_get_pin_flags, NM_SETTING_802_1X
DEFINE_GETTER (nmc_property_802_1X_get_system_ca_certs, NM_SETTING_802_1X_SYSTEM_CA_CERTS)
static char *
-nmc_property_802_1X_get_ca_cert (NMSetting *setting)
+nmc_property_802_1X_get_ca_cert (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
NMSetting8021xCKScheme scheme;
@@ -868,7 +899,7 @@ nmc_property_802_1X_get_ca_cert (NMSetting *setting)
}
static char *
-nmc_property_802_1X_get_client_cert (NMSetting *setting)
+nmc_property_802_1X_get_client_cert (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
NMSetting8021xCKScheme scheme;
@@ -884,7 +915,7 @@ nmc_property_802_1X_get_client_cert (NMSetting *setting)
}
static char *
-nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting)
+nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
NMSetting8021xCKScheme scheme;
@@ -900,7 +931,7 @@ nmc_property_802_1X_get_phase2_ca_cert (NMSetting *setting)
}
static char *
-nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting)
+nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
NMSetting8021xCKScheme scheme;
@@ -916,14 +947,14 @@ nmc_property_802_1X_get_phase2_client_cert (NMSetting *setting)
}
static char *
-nmc_property_802_1X_get_password_raw (NMSetting *setting)
+nmc_property_802_1X_get_password_raw (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
return bytes_to_string (nm_setting_802_1x_get_password_raw (s_8021X));
}
static char *
-nmc_property_802_1X_get_private_key (NMSetting *setting)
+nmc_property_802_1X_get_private_key (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
NMSetting8021xCKScheme scheme;
@@ -939,7 +970,7 @@ nmc_property_802_1X_get_private_key (NMSetting *setting)
}
static char *
-nmc_property_802_1X_get_phase2_private_key (NMSetting *setting)
+nmc_property_802_1X_get_phase2_private_key (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
NMSetting8021xCKScheme scheme;
@@ -968,7 +999,7 @@ DEFINE_GETTER (nmc_property_bluetooth_get_bdaddr, NM_SETTING_BLUETOOTH_BDADDR)
DEFINE_GETTER (nmc_property_bluetooth_get_type, NM_SETTING_BLUETOOTH_TYPE)
static char *
-nmc_property_bond_get_options (NMSetting *setting)
+nmc_property_bond_get_options (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingBond *s_bond = NM_SETTING_BOND (setting);
GString *bond_options_s;
@@ -1024,7 +1055,7 @@ DEFINE_GETTER (nmc_property_connection_get_timestamp, NM_SETTING_CONNECTION_TIME
DEFINE_GETTER (nmc_property_connection_get_read_only, NM_SETTING_CONNECTION_READ_ONLY)
static char *
-nmc_property_connection_get_permissions (NMSetting *setting)
+nmc_property_connection_get_permissions (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingConnection *s_con = NM_SETTING_CONNECTION (setting);
GString *perm = NULL;
@@ -1046,6 +1077,14 @@ nmc_property_connection_get_permissions (NMSetting *setting)
DEFINE_GETTER (nmc_property_connection_get_zone, NM_SETTING_CONNECTION_ZONE)
DEFINE_GETTER (nmc_property_connection_get_master, NM_SETTING_CONNECTION_MASTER)
DEFINE_GETTER (nmc_property_connection_get_slave_type, NM_SETTING_CONNECTION_SLAVE_TYPE)
+
+static char *
+nmc_property_connection_get_autoconnect_slaves (NMSetting *setting, NmcPropertyGetType get_type)
+{
+ NMSettingConnection *s_con = NM_SETTING_CONNECTION (setting);
+ return autoconnect_slaves_to_string (nm_setting_connection_get_autoconnect_slaves (s_con), get_type);
+}
+
DEFINE_GETTER (nmc_property_connection_get_secondaries, NM_SETTING_CONNECTION_SECONDARIES)
DEFINE_GETTER (nmc_property_connection_get_gateway_ping_timeout, NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT)
@@ -1080,7 +1119,7 @@ dcb_flags_to_string (NMSettingDcbFlags flags)
#define DEFINE_DCB_FLAGS_GETTER(func_name, property_name) \
static char * \
- func_name (NMSetting *setting) \
+ func_name (NMSetting *setting, NmcPropertyGetType get_type) \
{ \
guint v; \
GValue val = G_VALUE_INIT; \
@@ -1099,7 +1138,7 @@ dcb_app_priority_to_string (gint priority)
#define DEFINE_DCB_APP_PRIORITY_GETTER(func_name, property_name) \
static char * \
- func_name (NMSetting *setting) \
+ func_name (NMSetting *setting, NmcPropertyGetType get_type) \
{ \
int v; \
GValue val = G_VALUE_INIT; \
@@ -1112,7 +1151,7 @@ dcb_app_priority_to_string (gint priority)
#define DEFINE_DCB_BOOL_GETTER(func_name, getter_func_name) \
static char * \
- func_name (NMSetting *setting) \
+ func_name (NMSetting *setting, NmcPropertyGetType get_type) \
{ \
NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \
GString *str; \
@@ -1134,7 +1173,7 @@ dcb_app_priority_to_string (gint priority)
#define DEFINE_DCB_UINT_GETTER(func_name, getter_func_name) \
static char * \
- func_name (NMSetting *setting) \
+ func_name (NMSetting *setting, NmcPropertyGetType get_type) \
{ \
NMSettingDcb *s_dcb = NM_SETTING_DCB (setting); \
GString *str; \
@@ -1184,7 +1223,7 @@ DEFINE_GETTER (nmc_property_ib_get_mac_address, NM_SETTING_INFINIBAND_MAC_ADDRES
DEFINE_GETTER (nmc_property_ib_get_transport_mode, NM_SETTING_INFINIBAND_TRANSPORT_MODE)
static char *
-nmc_property_ib_get_mtu (NMSetting *setting)
+nmc_property_ib_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting);
int mtu;
@@ -1197,7 +1236,7 @@ nmc_property_ib_get_mtu (NMSetting *setting)
}
static char *
-nmc_property_ib_get_p_key (NMSetting *setting)
+nmc_property_ib_get_p_key (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingInfiniband *s_infiniband = NM_SETTING_INFINIBAND (setting);
int p_key;
@@ -1217,7 +1256,7 @@ DEFINE_GETTER (nmc_property_ipv4_get_dns, NM_SETTING_IP_CONFIG_DNS)
DEFINE_GETTER (nmc_property_ipv4_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH)
static char *
-nmc_property_ip_get_addresses (NMSetting *setting)
+nmc_property_ip_get_addresses (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting);
GString *printable;
@@ -1242,42 +1281,62 @@ nmc_property_ip_get_addresses (NMSetting *setting)
}
static char *
-nmc_property_ipv4_get_routes (NMSetting *setting)
+nmc_property_ipvx_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
{
- NMSettingIPConfig *s_ip4 = NM_SETTING_IP_CONFIG (setting);
+ NMSettingIPConfig *s_ip = NM_SETTING_IP_CONFIG (setting);
GString *printable;
guint32 num_routes, i;
NMIPRoute *route;
printable = g_string_new (NULL);
- num_routes = nm_setting_ip_config_get_num_routes (s_ip4);
+ num_routes = nm_setting_ip_config_get_num_routes (s_ip);
for (i = 0; i < num_routes; i++) {
- route = nm_setting_ip_config_get_route (s_ip4, i);
+ route = nm_setting_ip_config_get_route (s_ip, i);
- if (printable->len > 0)
- g_string_append (printable, "; ");
+ if (get_type == NMC_PROPERTY_GET_PARSABLE) {
+ if (printable->len > 0)
+ g_string_append (printable, ", ");
- g_string_append (printable, "{ ");
+ g_string_append_printf (printable, "%s/%u",
+ nm_ip_route_get_dest (route),
+ nm_ip_route_get_prefix (route));
- g_string_append_printf (printable, "ip = %s/%u",
- nm_ip_route_get_dest (route),
- nm_ip_route_get_prefix (route));
+ if (nm_ip_route_get_next_hop (route))
+ g_string_append_printf (printable, " %s", nm_ip_route_get_next_hop (route));
+ if (nm_ip_route_get_metric (route) != -1)
+ g_string_append_printf (printable, " %u", (guint32) nm_ip_route_get_metric (route));
+ } else {
+ if (printable->len > 0)
+ g_string_append (printable, "; ");
- if (nm_ip_route_get_next_hop (route)) {
- g_string_append_printf (printable, ", nh = %s",
- nm_ip_route_get_next_hop (route));
- }
+ g_string_append (printable, "{ ");
- if (nm_ip_route_get_metric (route) != -1)
- g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route));
+ g_string_append_printf (printable, "ip = %s/%u",
+ nm_ip_route_get_dest (route),
+ nm_ip_route_get_prefix (route));
- g_string_append (printable, " }");
+ if (nm_ip_route_get_next_hop (route)) {
+ g_string_append_printf (printable, ", nh = %s",
+ nm_ip_route_get_next_hop (route));
+ }
+
+ if (nm_ip_route_get_metric (route) != -1)
+ g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route));
+
+ g_string_append (printable, " }");
+ }
}
return g_string_free (printable, FALSE);
}
+static char *
+nmc_property_ipv4_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
+{
+ return nmc_property_ipvx_get_routes (setting, get_type);
+}
+
DEFINE_GETTER (nmc_property_ipv4_get_gateway, NM_SETTING_IP_CONFIG_GATEWAY)
DEFINE_GETTER (nmc_property_ipv4_get_route_metric, NM_SETTING_IP_CONFIG_ROUTE_METRIC)
DEFINE_GETTER (nmc_property_ipv4_get_ignore_auto_routes, NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES)
@@ -1294,40 +1353,9 @@ DEFINE_GETTER (nmc_property_ipv6_get_dns, NM_SETTING_IP_CONFIG_DNS)
DEFINE_GETTER (nmc_property_ipv6_get_dns_search, NM_SETTING_IP_CONFIG_DNS_SEARCH)
static char *
-nmc_property_ipv6_get_routes (NMSetting *setting)
+nmc_property_ipv6_get_routes (NMSetting *setting, NmcPropertyGetType get_type)
{
- NMSettingIPConfig *s_ip6 = NM_SETTING_IP_CONFIG (setting);
- GString *printable;
- guint32 num_routes, i;
- NMIPRoute *route;
-
- printable = g_string_new (NULL);
-
- num_routes = nm_setting_ip_config_get_num_routes (s_ip6);
- for (i = 0; i < num_routes; i++) {
- route = nm_setting_ip_config_get_route (s_ip6, i);
-
- if (printable->len > 0)
- g_string_append (printable, "; ");
-
- g_string_append (printable, "{ ");
-
- g_string_append_printf (printable, "ip = %s/%u",
- nm_ip_route_get_dest (route),
- nm_ip_route_get_prefix (route));
-
- if (nm_ip_route_get_next_hop (route)) {
- g_string_append_printf (printable, ", nh = %s",
- nm_ip_route_get_next_hop (route));
- }
-
- if (nm_ip_route_get_metric (route) != -1)
- g_string_append_printf (printable, ", mt = %u", (guint32) nm_ip_route_get_metric (route));
-
- g_string_append (printable, " }");
- }
-
- return g_string_free (printable, FALSE);
+ return nmc_property_ipvx_get_routes (setting, get_type);
}
DEFINE_GETTER (nmc_property_ipv6_get_gateway, NM_SETTING_IP_CONFIG_GATEWAY)
@@ -1340,10 +1368,10 @@ DEFINE_GETTER (nmc_property_ipv6_get_dhcp_send_hostname, NM_SETTING_IP_CONFIG_DH
DEFINE_GETTER (nmc_property_ipv6_get_dhcp_hostname, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME)
static char *
-nmc_property_ipv6_get_ip6_privacy (NMSetting *setting)
+nmc_property_ipv6_get_ip6_privacy (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingIP6Config *s_ip6 = NM_SETTING_IP6_CONFIG (setting);
- return ip6_privacy_to_string (nm_setting_ip6_config_get_ip6_privacy (s_ip6));
+ return ip6_privacy_to_string (nm_setting_ip6_config_get_ip6_privacy (s_ip6), get_type);
}
/* --- NM_SETTING_OLPC_MESH_SETTING_NAME property get functions --- */
@@ -1351,7 +1379,7 @@ DEFINE_GETTER (nmc_property_olpc_get_channel, NM_SETTING_OLPC_MESH_CHANNEL)
DEFINE_GETTER (nmc_property_olpc_get_anycast_address, NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS)
static char *
-nmc_property_olpc_get_ssid (NMSetting *setting)
+nmc_property_olpc_get_ssid (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingOlpcMesh *s_olpc_mesh = NM_SETTING_OLPC_MESH (setting);
GBytes *ssid;
@@ -1404,21 +1432,21 @@ DEFINE_GETTER (nmc_property_vlan_get_id, NM_SETTING_VLAN_ID)
static char *
-nmc_property_vlan_get_flags (NMSetting *setting)
+nmc_property_vlan_get_flags (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
return vlan_flags_to_string (nm_setting_vlan_get_flags (s_vlan));
}
static char *
-nmc_property_vlan_get_ingress_priority_map (NMSetting *setting)
+nmc_property_vlan_get_ingress_priority_map (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
return vlan_priorities_to_string (s_vlan, NM_VLAN_INGRESS_MAP);
}
static char *
-nmc_property_vlan_get_egress_priority_map (NMSetting *setting)
+nmc_property_vlan_get_egress_priority_map (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingVlan *s_vlan = NM_SETTING_VLAN (setting);
return vlan_priorities_to_string (s_vlan, NM_VLAN_EGRESS_MAP);
@@ -1429,7 +1457,7 @@ DEFINE_GETTER (nmc_property_vpn_get_service_type, NM_SETTING_VPN_SERVICE_TYPE)
DEFINE_GETTER (nmc_property_vpn_get_user_name, NM_SETTING_VPN_USER_NAME)
static char *
-nmc_property_vpn_get_data (NMSetting *setting)
+nmc_property_vpn_get_data (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingVpn *s_vpn = NM_SETTING_VPN (setting);
GString *data_item_str;
@@ -1441,7 +1469,7 @@ nmc_property_vpn_get_data (NMSetting *setting)
}
static char *
-nmc_property_vpn_get_secrets (NMSetting *setting)
+nmc_property_vpn_get_secrets (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingVpn *s_vpn = NM_SETTING_VPN (setting);
GString *secret_str;
@@ -1471,7 +1499,7 @@ DEFINE_GETTER (nmc_property_wired_get_s390_nettype, NM_SETTING_WIRED_S390_NETTYP
DEFINE_GETTER (nmc_property_wired_get_s390_options, NM_SETTING_WIRED_S390_OPTIONS)
static char *
-nmc_property_wired_get_mtu (NMSetting *setting)
+nmc_property_wired_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWired *s_wired = NM_SETTING_WIRED (setting);
int mtu;
@@ -1497,7 +1525,7 @@ DEFINE_GETTER (nmc_property_wireless_get_seen_bssids, NM_SETTING_WIRELESS_SEEN_B
DEFINE_GETTER (nmc_property_wireless_get_hidden, NM_SETTING_WIRELESS_HIDDEN)
static char *
-nmc_property_wireless_get_ssid (NMSetting *setting)
+nmc_property_wireless_get_ssid (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
GBytes *ssid;
@@ -1513,7 +1541,7 @@ nmc_property_wireless_get_ssid (NMSetting *setting)
}
static char *
-nmc_property_wireless_get_mtu (NMSetting *setting)
+nmc_property_wireless_get_mtu (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWireless *s_wireless = NM_SETTING_WIRELESS (setting);
int mtu;
@@ -1540,35 +1568,35 @@ DEFINE_GETTER (nmc_property_wifi_sec_get_leap_password, NM_SETTING_WIRELESS_SECU
DEFINE_SECRET_FLAGS_GETTER (nmc_property_wifi_sec_get_leap_password_flags, NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS)
static char *
-nmc_property_wifi_sec_get_wep_key0 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key0 (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 0));
}
static char *
-nmc_property_wifi_sec_get_wep_key1 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key1 (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 1));
}
static char *
-nmc_property_wifi_sec_get_wep_key2 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key2 (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 2));
}
static char *
-nmc_property_wifi_sec_get_wep_key3 (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key3 (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
return g_strdup (nm_setting_wireless_security_get_wep_key (s_wireless_sec, 3));
}
static char *
-nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting)
+nmc_property_wifi_sec_get_wep_key_type (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingWirelessSecurity *s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (setting);
return wep_key_type_to_string (nm_setting_wireless_security_get_wep_key_type (s_wireless_sec));
@@ -1601,20 +1629,23 @@ register_nmcli_value_transforms (void)
/* Main hash table storing function pointer for manipulating properties */
static GHashTable *nmc_properties = NULL;
-typedef char * (*NmcPropertyGetFunc) (NMSetting *);
-typedef gboolean (*NmcPropertySetFunc) (NMSetting *, const char *, const char *, GError **);
-typedef gboolean (*NmcPropertyRemoveFunc) (NMSetting *, const char *, const char *, guint32, GError **);
-typedef const char * (*NmcPropertyDescribeFunc) (NMSetting *, const char *);
-typedef const char * (*NmcPropertyValuesFunc) (NMSetting *, const char *);
-typedef char * (*NmcPropertyOut2InFunc) (const char *);
+typedef char * (*NmcPropertyGetFunc) (NMSetting *, NmcPropertyGetType);
+typedef gboolean (*NmcPropertySetFunc) (NMSetting *, const char *, const char *, GError **);
+typedef gboolean (*NmcPropertyRemoveFunc) (NMSetting *, const char *, const char *, guint32, GError **);
+typedef const char * (*NmcPropertyDescribeFunc) (NMSetting *, const char *);
+typedef const char ** (*NmcPropertyValuesFunc) (NMSetting *, const char *);
typedef struct {
- NmcPropertyGetFunc get_func; /* func getting property values */
- NmcPropertySetFunc set_func; /* func adding/setting property values */
- NmcPropertyRemoveFunc remove_func; /* func removing items from container options */
- NmcPropertyDescribeFunc describe_func; /* func returning property description */
- NmcPropertyValuesFunc values_func; /* func returning allowed property values */
- NmcPropertyOut2InFunc out2in_func; /* func converting property values from output to input format */
+ /* The order of the fields is important as they correspond
+ * to the order as _nmc_add_prop_funcs() passes the arguments. */
+#define NmcPropertyFuncsFields \
+ NmcPropertyGetFunc get_func; /* func getting property values */ \
+ NmcPropertySetFunc set_func; /* func adding/setting property values */ \
+ NmcPropertyRemoveFunc remove_func; /* func removing items from container options */ \
+ NmcPropertyDescribeFunc describe_func; /* func returning property description */ \
+ NmcPropertyValuesFunc values_func; /* func returning allowed property values */ \
+ ;
+ NmcPropertyFuncsFields
} NmcPropertyFuncs;
/*
@@ -2151,13 +2182,10 @@ check_and_set_string (NMSetting *setting,
}
#define DEFINE_ALLOWED_VAL_FUNC(def_func, valid_values) \
- static const char * \
+ static const char ** \
def_func (NMSetting *setting, const char *prop) \
{ \
- static char *values = NULL; \
- if (G_UNLIKELY (values == NULL)) \
- values = g_strjoinv (", ", (char **) valid_values); \
- return values; \
+ return valid_values; \
}
/* --- generic property setter functions --- */
@@ -2243,6 +2271,22 @@ nmc_property_set_bool (NMSetting *setting, const char *prop, const char *val, GE
}
static gboolean
+nmc_property_set_trilean (NMSetting *setting, const char *prop, const char *val, GError **error)
+{
+ long int val_int;
+
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ if (!nmc_string_to_int (val, TRUE, -1, 1, &val_int)) {
+ g_set_error (error, 1, 0, _("'%s' is not a valid value; use -1, 0 or 1"), val);
+ return FALSE;
+ }
+
+ g_object_set (setting, prop, val_int, NULL);
+ return TRUE;
+}
+
+static gboolean
nmc_property_set_ssid (NMSetting *setting, const char *prop, const char *val, GError **error)
{
GBytes *ssid;
@@ -2412,17 +2456,6 @@ done:
return TRUE; \
}
-static char *
-nmc_property_out2in_cut_paren (const char *out_format)
-{
- const char *p;
- size_t n;
-
- p = strstr (out_format, " (");
- n = p ? p - out_format : strlen (out_format);
- return g_strndup (out_format, n);
-}
-
/* --- NM_SETTING_CONNECTION_SETTING_NAME property setter functions --- */
#if 0
/*
@@ -2672,13 +2705,12 @@ nmc_property_connection_describe_secondaries (NMSetting *setting, const char *pr
static gboolean \
def_func (NMSetting *setting, const char *prop, const char *val, GError **error) \
{ \
- const char *SCHEME_PATH = "file://"; \
char *val_strip = g_strstrip (g_strdup (val)); \
char *p = val_strip; \
gboolean success; \
\
- if (strncmp (val_strip, SCHEME_PATH, strlen (SCHEME_PATH)) == 0) \
- p += strlen (SCHEME_PATH); \
+ if (strncmp (val_strip, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) == 0) \
+ p += STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH); \
\
success = set_func (NM_SETTING_802_1X (setting), \
p, \
@@ -2694,14 +2726,13 @@ nmc_property_connection_describe_secondaries (NMSetting *setting, const char *pr
def_func (NMSetting *setting, const char *prop, const char *val, GError **error) \
{ \
char **strv = NULL; \
- const char *SCHEME_PATH = "file://"; \
char *val_strip = g_strstrip (g_strdup (val)); \
char *p = val_strip; \
const char *path, *password; \
gboolean success; \
\
- if (strncmp (val_strip, SCHEME_PATH, strlen (SCHEME_PATH)) == 0) \
- p += strlen (SCHEME_PATH); \
+ if (strncmp (val_strip, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) == 0) \
+ p += STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH); \
\
strv = nmc_strsplit_set (p, " \t,", 2); \
path = strv[0]; \
@@ -2728,13 +2759,14 @@ nmc_property_connection_describe_secondaries (NMSetting *setting, const char *pr
}
/* 'eap' */
+static const char *valid_eap[] = { "leap", "md5", "tls", "peap", "ttls", "sim", "fast", "pwd", NULL };
+
DEFINE_SETTER_STR_LIST_MULTI (check_and_add_802_1X_eap,
NM_SETTING_802_1X,
nm_setting_802_1x_add_eap_method)
static gboolean
nmc_property_802_1X_set_eap (NMSetting *setting, const char *prop, const char *val, GError **error)
{
- const char *valid_eap[] = { "leap", "md5", "tls", "peap", "ttls", "sim", "fast", "pwd", NULL };
return check_and_add_802_1X_eap (setting, prop, val, valid_eap, error);
}
@@ -2756,6 +2788,8 @@ DEFINE_REMOVER_INDEX_OR_VALUE (nmc_property_802_1X_remove_eap,
nm_setting_802_1x_remove_eap_method,
_validate_and_remove_eap_method)
+DEFINE_ALLOWED_VAL_FUNC (nmc_property_802_1X_allowed_eap, valid_eap)
+
/* 'ca-cert' */
DEFINE_SETTER_CERT (nmc_property_802_1X_set_ca_cert, nm_setting_802_1x_set_ca_cert)
@@ -3056,17 +3090,10 @@ nmc_property_bond_describe_options (NMSetting *setting, const char *prop)
return desc;
}
-static const char *
+static const char **
nmc_property_bond_allowed_options (NMSetting *setting, const char *prop)
{
- const char **valid_options;
- static char *allowed_vals = NULL;
-
- if (G_UNLIKELY (allowed_vals == NULL)) {
- valid_options = nm_setting_bond_get_valid_options (NM_SETTING_BOND (setting));
- allowed_vals = g_strjoinv (", ", (char **) valid_options);
- }
- return allowed_vals;
+ return nm_setting_bond_get_valid_options (NM_SETTING_BOND (setting));
}
/* --- NM_SETTING_INFINIBAND_SETTING_NAME property setter functions --- */
@@ -3426,37 +3453,6 @@ nmc_property_ipv4_describe_routes (NMSetting *setting, const char *prop)
" 10.1.2.0/24\n");
}
-static char *
-nmc_property_out2in_routes (const char *out_format)
-{
- GRegex *regex;
- GString *str;
- char **strv;
- int i;
-
- str = g_string_sized_new (128);
- regex = g_regex_new ("\\{ dst = ([^/]+)/([^,]+), nh = ([^,]+), mt = ([^ ]+) \\}", 0, 0, NULL);
-
- strv = g_regex_split (regex, out_format, 0);
- for (i = 1; strv && strv[i] && strv[i+1] && strv[i+2] && strv[i+3]; i=i+5) {
- g_string_append (str, strv[i]); /* IP */
- g_string_append_c (str, '/');
- g_string_append (str, strv[i+1]); /* prefix */
- g_string_append_c (str, ' ');
- g_string_append (str, strv[i+2]); /* next hop */
- g_string_append_c (str, ' ');
- g_string_append (str, strv[i+3]); /* metric */
- g_string_append (str, ", ");
- }
- if (str->len > 0)
- g_string_truncate (str, str->len - 2);
-
- g_strfreev (strv);
- g_regex_unref (regex);
-
- return g_string_free (str, FALSE);
-}
-
/* --- NM_SETTING_IP6_CONFIG_SETTING_NAME property setter functions --- */
/* 'method' */
static const char *ipv6_valid_methods[] = {
@@ -3774,7 +3770,7 @@ nmc_property_olpc_set_channel (NMSetting *setting, const char *prop, const char
/* --- NM_SETTING_SERIAL_SETTING_NAME property setter functions --- */
static char *
-nmc_property_serial_get_parity (NMSetting *setting)
+nmc_property_serial_get_parity (NMSetting *setting, NmcPropertyGetType get_type)
{
NMSettingSerial *s_serial = NM_SETTING_SERIAL (setting);
@@ -4093,17 +4089,10 @@ DEFINE_REMOVER_OPTION (nmc_property_wired_remove_option_s390_options,
NM_SETTING_WIRED,
nm_setting_wired_remove_s390_option)
-static const char *
+static const char **
nmc_property_wired_allowed_s390_options (NMSetting *setting, const char *prop)
{
- const char **valid_options;
- static char *allowed_vals = NULL;
-
- if (G_UNLIKELY (allowed_vals == NULL)) {
- valid_options = nm_setting_wired_get_valid_s390_options (NM_SETTING_WIRED (setting));
- allowed_vals = g_strjoinv (", ", (char **) valid_options);
- }
- return allowed_vals;
+ return nm_setting_wired_get_valid_s390_options (NM_SETTING_WIRED (setting));
}
static const char *
@@ -4723,29 +4712,36 @@ DEFINE_ALLOWED_VAL_FUNC (nmc_property_dcb_allowed_app_fcoe_modes, _dcb_valid_fco
/*----------------------------------------------------------------------------*/
-static void
-nmc_add_prop_funcs (char *key,
- NmcPropertyGetFunc get_func,
- NmcPropertySetFunc set_func,
- NmcPropertyRemoveFunc remove_func,
- NmcPropertyDescribeFunc describe_func,
- NmcPropertyValuesFunc values_func,
- NmcPropertyOut2InFunc out2in_func)
+static inline void
+_nmc_add_prop_funcs (const char *key,
+ const NmcPropertyFuncs *item_init)
{
- NmcPropertyFuncs *item = g_malloc0 (sizeof (NmcPropertyFuncs));
- item->get_func = get_func;
- item->set_func = set_func;
- item->remove_func = remove_func;
- item->describe_func = describe_func;
- item->values_func = values_func;
- item->out2in_func = out2in_func;
+ NmcPropertyFuncs *item;
- g_hash_table_insert (nmc_properties, key, item);
+ item = g_malloc (sizeof (NmcPropertyFuncs));
+ *item = *item_init;
+ g_hash_table_insert (nmc_properties, (gpointer) key, item);
}
+#define nmc_add_prop_funcs(key, ...) \
+ G_STMT_START { \
+ struct { \
+ NmcPropertyFuncsFields; \
+ /* The _dummy field is here so that the last argument can be always
+ * NULL. That means every call to nmc_add_prop_funcs() below ends
+ * with a separate line "NULL);". */ \
+ gpointer _dummy; \
+ } _item_init = { \
+ __VA_ARGS__ \
+ };\
+ \
+ nm_assert (_item_init._dummy == NULL); \
+ _nmc_add_prop_funcs ("" key, (NmcPropertyFuncs *) &_item_init); \
+ } G_STMT_END
+
/* concatenate setting name and property name */
-#define GLUE(A,B) (g_strconcat ((NM_SETTING_##A##_SETTING_NAME),(NM_SETTING_##A##_##B), NULL))
-#define GLUE_IP(A,B) (g_strconcat ((NM_SETTING_IP##A##_CONFIG_SETTING_NAME),(NM_SETTING_IP_CONFIG_##B), NULL))
+#define GLUE(A,B) "" NM_SETTING_##A##_SETTING_NAME "" NM_SETTING_##A##_##B ""
+#define GLUE_IP(A,B) "" NM_SETTING_IP##A##_CONFIG_SETTING_NAME "" NM_SETTING_IP_CONFIG_##B ""
void
nmc_properties_init (void)
@@ -4754,7 +4750,7 @@ nmc_properties_init (void)
return;
/* create properties hash table */
- nmc_properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ nmc_properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
/* Add editable properties for NM_SETTING_802_1X_SETTING_NAME */
nmc_add_prop_funcs (GLUE (802_1X, EAP),
@@ -4762,7 +4758,7 @@ nmc_properties_init (void)
nmc_property_802_1X_set_eap,
nmc_property_802_1X_remove_eap,
NULL,
- NULL,
+ nmc_property_802_1X_allowed_eap,
NULL);
nmc_add_prop_funcs (GLUE (802_1X, IDENTITY),
nmc_property_802_1X_get_identity,
@@ -4903,7 +4899,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (802_1X, PASSWORD_RAW),
nmc_property_802_1X_get_password_raw,
nmc_property_802_1X_set_password_raw,
@@ -4917,7 +4913,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (802_1X, PRIVATE_KEY),
nmc_property_802_1X_get_private_key,
nmc_property_802_1X_set_private_key,
@@ -4938,7 +4934,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (802_1X, PHASE2_PRIVATE_KEY),
nmc_property_802_1X_get_phase2_private_key,
nmc_property_802_1X_set_phase2_private_key,
@@ -4959,7 +4955,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (802_1X, PIN),
nmc_property_802_1X_get_pin,
nmc_property_set_string,
@@ -4973,7 +4969,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (802_1X, SYSTEM_CA_CERTS),
nmc_property_802_1X_get_system_ca_certs,
nmc_property_set_bool,
@@ -5003,7 +4999,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (ADSL, PROTOCOL),
nmc_property_adsl_get_protocol,
nmc_property_adsl_set_protocol,
@@ -5160,7 +5156,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
/* Add editable properties for NM_SETTING_CONNECTION_SETTING_NAME */
nmc_add_prop_funcs (GLUE (CONNECTION, ID),
@@ -5247,6 +5243,13 @@ nmc_properties_init (void)
NULL,
nmc_property_con_allowed_slave_type,
NULL);
+ nmc_add_prop_funcs (GLUE (CONNECTION, AUTOCONNECT_SLAVES),
+ nmc_property_connection_get_autoconnect_slaves,
+ nmc_property_set_trilean,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
nmc_add_prop_funcs (GLUE (CONNECTION, SECONDARIES),
nmc_property_connection_get_secondaries,
nmc_property_connection_set_secondaries,
@@ -5397,7 +5400,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (GSM, APN),
nmc_property_gsm_get_apn,
nmc_property_set_string,
@@ -5425,7 +5428,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (GSM, HOME_ONLY),
nmc_property_gsm_get_home_only,
nmc_property_set_bool,
@@ -5513,7 +5516,7 @@ nmc_properties_init (void)
nmc_property_ipv4_remove_routes,
nmc_property_ipv4_describe_routes,
NULL,
- nmc_property_out2in_routes);
+ NULL);
nmc_add_prop_funcs (GLUE_IP (4, ROUTE_METRIC),
nmc_property_ipv4_get_route_metric,
nmc_property_set_int64,
@@ -5613,7 +5616,7 @@ nmc_properties_init (void)
nmc_property_ipv6_remove_routes,
nmc_property_ipv6_describe_routes,
NULL,
- nmc_property_out2in_routes);
+ NULL);
nmc_add_prop_funcs (GLUE_IP (6, ROUTE_METRIC),
nmc_property_ipv6_get_route_metric,
nmc_property_set_int64,
@@ -5655,7 +5658,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE_IP (6, DHCP_SEND_HOSTNAME),
nmc_property_ipv6_get_dhcp_send_hostname,
nmc_property_set_bool,
@@ -5850,7 +5853,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
/* Add editable properties for NM_SETTING_SERIAL_SETTING_NAME */
nmc_add_prop_funcs (GLUE (SERIAL, BAUD),
@@ -6257,7 +6260,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, WEP_KEY_TYPE),
nmc_property_wifi_sec_get_wep_key_type,
nmc_property_wifi_set_wep_key_type,
@@ -6278,7 +6281,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
nmc_add_prop_funcs (GLUE (WIRELESS_SECURITY, LEAP_PASSWORD),
nmc_property_wifi_sec_get_leap_password,
nmc_property_set_string,
@@ -6292,7 +6295,7 @@ nmc_properties_init (void)
NULL,
NULL,
NULL,
- nmc_property_out2in_cut_paren);
+ NULL);
}
void
@@ -6305,21 +6308,21 @@ nmc_properties_cleanup ()
static const NmcPropertyFuncs *
nmc_properties_find (const char *s_name, const char *p_name)
{
- NmcPropertyFuncs *item = NULL;
char *key;
+ gsize p_l, s_l;
- /* FIXME: maybe it's better to init it globally */
nmc_properties_init ();
- key = g_strdup_printf ("%s%s", s_name, p_name);
- item = (NmcPropertyFuncs *) g_hash_table_lookup (nmc_properties, key);
- g_free (key);
-
- return item;
+ s_l = strlen (s_name);
+ p_l = strlen (p_name);
+ key = g_alloca (s_l + p_l + 1);
+ memcpy (&key[ 0], s_name, s_l);
+ memcpy (&key[s_l], p_name, p_l + 1);
+ return (NmcPropertyFuncs *) g_hash_table_lookup (nmc_properties, key);
}
static char *
-get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError **error)
+get_property_val (NMSetting *setting, const char *prop, NmcPropertyGetType get_type, GError **error)
{
const NmcPropertyFuncs *item;
@@ -6327,15 +6330,8 @@ get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
item = nmc_properties_find (nm_setting_get_name (setting), prop);
- if (item && item->get_func) {
- char *prop_val = item->get_func (setting);
- if (convert && item->out2in_func) {
- char *converted = item->out2in_func (prop_val);
- g_free (prop_val);
- return converted;
- } else
- return prop_val;
- }
+ if (item && item->get_func)
+ return item->get_func (setting, get_type);
g_set_error_literal (error, 1, 0, _("don't know how to get the property value"));
return NULL;
@@ -6351,17 +6347,17 @@ get_property_val (NMSetting *setting, const char *prop, gboolean convert, GError
char *
nmc_setting_get_property (NMSetting *setting, const char *prop, GError **error)
{
- return get_property_val (setting, prop, FALSE, error);
+ return get_property_val (setting, prop, NMC_PROPERTY_GET_PRETTY, error);
}
/*
- * The same as nmc_setting_get_property(), but in addition converts
- * usual output format into a simpler one, used as input in the editor.
+ * Similar to nmc_setting_get_property(), but returns the property in a string
+ * format that can be parsed via nmc_setting_set_property().
*/
char *
-nmc_setting_get_property_out2in (NMSetting *setting, const char *prop, GError **error)
+nmc_setting_get_property_parsable (NMSetting *setting, const char *prop, GError **error)
{
- return get_property_val (setting, prop, TRUE, error);
+ return get_property_val (setting, prop, NMC_PROPERTY_GET_PARSABLE, error);
}
/*
@@ -6496,7 +6492,7 @@ nmc_setting_get_valid_properties (NMSetting *setting)
/*
* Return allowed values for 'prop' as a string.
*/
-const char *
+const char **
nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop)
{
@@ -6593,7 +6589,7 @@ nmc_property_set_gvalue (NMSetting *setting, const char *prop, GValue *value)
/*----------------------------------------------------------------------------*/
#define GET_SECRET(show, setting, func) \
- (show ? func (setting) : g_strdup (_("<hidden>")))
+ (show ? func (setting, NMC_PROPERTY_GET_PRETTY) : g_strdup (_("<hidden>")))
static gboolean
setting_connection_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboolean secrets)
@@ -6613,20 +6609,21 @@ setting_connection_details (NMSetting *setting, NmCli *nmc, const char *one_pro
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_connection_get_id (setting));
- set_val_str (arr, 2, nmc_property_connection_get_uuid (setting));
- set_val_str (arr, 3, nmc_property_connection_get_interface_name (setting));
- set_val_str (arr, 4, nmc_property_connection_get_type (setting));
- set_val_str (arr, 5, nmc_property_connection_get_autoconnect (setting));
- set_val_str (arr, 6, nmc_property_connection_get_autoconnect_priority (setting));
- set_val_str (arr, 7, nmc_property_connection_get_timestamp (setting));
- set_val_str (arr, 8, nmc_property_connection_get_read_only (setting));
- set_val_str (arr, 9, nmc_property_connection_get_permissions (setting));
- set_val_str (arr, 10, nmc_property_connection_get_zone (setting));
- set_val_str (arr, 11, nmc_property_connection_get_master (setting));
- set_val_str (arr, 12, nmc_property_connection_get_slave_type (setting));
- set_val_str (arr, 13, nmc_property_connection_get_secondaries (setting));
- set_val_str (arr, 14, nmc_property_connection_get_gateway_ping_timeout (setting));
+ set_val_str (arr, 1, nmc_property_connection_get_id (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_connection_get_uuid (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_connection_get_interface_name (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_connection_get_type (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_connection_get_autoconnect (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_connection_get_autoconnect_priority (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_connection_get_timestamp (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_connection_get_read_only (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_connection_get_permissions (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_connection_get_zone (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_connection_get_master (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_connection_get_slave_type (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_connection_get_autoconnect_slaves (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 14, nmc_property_connection_get_secondaries (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 15, nmc_property_connection_get_gateway_ping_timeout (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6652,17 +6649,17 @@ setting_wired_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gb
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_wired_get_port (setting));
- set_val_str (arr, 2, nmc_property_wired_get_speed (setting));
- set_val_str (arr, 3, nmc_property_wired_get_duplex (setting));
- set_val_str (arr, 4, nmc_property_wired_get_auto_negotiate (setting));
- set_val_str (arr, 5, nmc_property_wired_get_mac_address (setting));
- set_val_str (arr, 6, nmc_property_wired_get_cloned_mac_address (setting));
- set_val_str (arr, 7, nmc_property_wired_get_mac_address_blacklist (setting));
- set_val_str (arr, 8, nmc_property_wired_get_mtu (setting));
- set_val_str (arr, 9, nmc_property_wired_get_s390_subchannels (setting));
- set_val_str (arr, 10, nmc_property_wired_get_s390_nettype (setting));
- set_val_str (arr, 11, nmc_property_wired_get_s390_options (setting));
+ set_val_str (arr, 1, nmc_property_wired_get_port (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_wired_get_speed (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_wired_get_duplex (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_wired_get_auto_negotiate (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_wired_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_wired_get_cloned_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_wired_get_mac_address_blacklist (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_wired_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_wired_get_s390_subchannels (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_wired_get_s390_nettype (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_wired_get_s390_options (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6688,38 +6685,38 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc, const char *one_prop, g
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_802_1X_get_eap (setting));
- set_val_str (arr, 2, nmc_property_802_1X_get_identity (setting));
- set_val_str (arr, 3, nmc_property_802_1X_get_anonymous_identity (setting));
- set_val_str (arr, 4, nmc_property_802_1X_get_pac_file (setting));
- set_val_str (arr, 5, nmc_property_802_1X_get_ca_cert (setting));
- set_val_str (arr, 6, nmc_property_802_1X_get_ca_path (setting));
- set_val_str (arr, 7, nmc_property_802_1X_get_subject_match (setting));
- set_val_str (arr, 8, nmc_property_802_1X_get_altsubject_matches (setting));
- set_val_str (arr, 9, nmc_property_802_1X_get_client_cert (setting));
- set_val_str (arr, 10, nmc_property_802_1X_get_phase1_peapver (setting));
- set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peaplabel (setting));
- set_val_str (arr, 12, nmc_property_802_1X_get_phase1_fast_provisioning (setting));
- set_val_str (arr, 13, nmc_property_802_1X_get_phase2_auth (setting));
- set_val_str (arr, 14, nmc_property_802_1X_get_phase2_autheap (setting));
- set_val_str (arr, 15, nmc_property_802_1X_get_phase2_ca_cert (setting));
- set_val_str (arr, 16, nmc_property_802_1X_get_phase2_ca_path (setting));
- set_val_str (arr, 17, nmc_property_802_1X_get_phase2_subject_match (setting));
- set_val_str (arr, 18, nmc_property_802_1X_get_phase2_altsubject_matches (setting));
- set_val_str (arr, 19, nmc_property_802_1X_get_phase2_client_cert (setting));
+ set_val_str (arr, 1, nmc_property_802_1X_get_eap (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_802_1X_get_identity (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_802_1X_get_anonymous_identity (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_802_1X_get_pac_file (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_802_1X_get_ca_cert (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_802_1X_get_ca_path (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_802_1X_get_subject_match (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_802_1X_get_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_802_1X_get_client_cert (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_802_1X_get_phase1_peapver (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_802_1X_get_phase1_peaplabel (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_802_1X_get_phase1_fast_provisioning (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_802_1X_get_phase2_auth (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 14, nmc_property_802_1X_get_phase2_autheap (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 15, nmc_property_802_1X_get_phase2_ca_cert (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 16, nmc_property_802_1X_get_phase2_ca_path (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 17, nmc_property_802_1X_get_phase2_subject_match (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 18, nmc_property_802_1X_get_phase2_altsubject_matches (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 19, nmc_property_802_1X_get_phase2_client_cert (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 20, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password));
- set_val_str (arr, 21, nmc_property_802_1X_get_password_flags (setting));
+ set_val_str (arr, 21, nmc_property_802_1X_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 22, GET_SECRET (secrets, setting, nmc_property_802_1X_get_password_raw));
- set_val_str (arr, 23, nmc_property_802_1X_get_password_raw_flags (setting));
- set_val_str (arr, 24, nmc_property_802_1X_get_private_key (setting));
+ set_val_str (arr, 23, nmc_property_802_1X_get_password_raw_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 24, nmc_property_802_1X_get_private_key (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 25, GET_SECRET (secrets, setting, nmc_property_802_1X_get_private_key_password));
- set_val_str (arr, 26, nmc_property_802_1X_get_private_key_password_flags (setting));
- set_val_str (arr, 27, nmc_property_802_1X_get_phase2_private_key (setting));
+ set_val_str (arr, 26, nmc_property_802_1X_get_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 27, nmc_property_802_1X_get_phase2_private_key (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 28, GET_SECRET (secrets, setting, nmc_property_802_1X_get_phase2_private_key_password));
- set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key_password_flags (setting));
+ set_val_str (arr, 29, nmc_property_802_1X_get_phase2_private_key_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 30, GET_SECRET (secrets, setting, nmc_property_802_1X_get_pin));
- set_val_str (arr, 31, nmc_property_802_1X_get_pin_flags (setting));
- set_val_str (arr, 32, nmc_property_802_1X_get_system_ca_certs (setting));
+ set_val_str (arr, 31, nmc_property_802_1X_get_pin_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 32, nmc_property_802_1X_get_system_ca_certs (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6745,19 +6742,19 @@ setting_wireless_details (NMSetting *setting, NmCli *nmc, const char *one_prop,
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_wireless_get_ssid (setting));
- set_val_str (arr, 2, nmc_property_wireless_get_mode (setting));
- set_val_str (arr, 3, nmc_property_wireless_get_band (setting));
- set_val_str (arr, 4, nmc_property_wireless_get_channel (setting));
- set_val_str (arr, 5, nmc_property_wireless_get_bssid (setting));
- set_val_str (arr, 6, nmc_property_wireless_get_rate (setting));
- set_val_str (arr, 7, nmc_property_wireless_get_tx_power (setting));
- set_val_str (arr, 8, nmc_property_wireless_get_mac_address (setting));
- set_val_str (arr, 9, nmc_property_wireless_get_cloned_mac_address (setting));
- set_val_str (arr, 10, nmc_property_wireless_get_mac_address_blacklist (setting));
- set_val_str (arr, 11, nmc_property_wireless_get_mtu (setting));
- set_val_str (arr, 12, nmc_property_wireless_get_seen_bssids (setting));
- set_val_str (arr, 13, nmc_property_wireless_get_hidden (setting));
+ set_val_str (arr, 1, nmc_property_wireless_get_ssid (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_wireless_get_mode (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_wireless_get_band (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_wireless_get_channel (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_wireless_get_bssid (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_wireless_get_rate (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_wireless_get_tx_power (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_wireless_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_wireless_get_cloned_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_wireless_get_mac_address_blacklist (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_wireless_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_wireless_get_seen_bssids (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_wireless_get_hidden (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6783,23 +6780,23 @@ setting_wireless_security_details (NMSetting *setting, NmCli *nmc, const char *o
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_wifi_sec_get_key_mgmt (setting));
- set_val_str (arr, 2, nmc_property_wifi_sec_get_wep_tx_keyidx (setting));
- set_val_str (arr, 3, nmc_property_wifi_sec_get_auth_alg (setting));
- set_val_str (arr, 4, nmc_property_wifi_sec_get_proto (setting));
- set_val_str (arr, 5, nmc_property_wifi_sec_get_pairwise (setting));
- set_val_str (arr, 6, nmc_property_wifi_sec_get_group (setting));
- set_val_str (arr, 7, nmc_property_wifi_sec_get_leap_username (setting));
+ set_val_str (arr, 1, nmc_property_wifi_sec_get_key_mgmt (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_wifi_sec_get_wep_tx_keyidx (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_wifi_sec_get_auth_alg (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_wifi_sec_get_proto (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_wifi_sec_get_pairwise (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_wifi_sec_get_group (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_wifi_sec_get_leap_username (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 8, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key0));
set_val_str (arr, 9, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key1));
set_val_str (arr, 10, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key2));
set_val_str (arr, 11, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_wep_key3));
- set_val_str (arr, 12, nmc_property_wifi_sec_get_wep_key_flags (setting));
- set_val_str (arr, 13, nmc_property_wifi_sec_get_wep_key_type (setting));
+ set_val_str (arr, 12, nmc_property_wifi_sec_get_wep_key_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_wifi_sec_get_wep_key_type (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 14, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_psk));
- set_val_str (arr, 15, nmc_property_wifi_sec_get_psk_flags (setting));
+ set_val_str (arr, 15, nmc_property_wifi_sec_get_psk_flags (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 16, GET_SECRET (secrets, setting, nmc_property_wifi_sec_get_leap_password));
- set_val_str (arr, 17, nmc_property_wifi_sec_get_leap_password_flags (setting));
+ set_val_str (arr, 17, nmc_property_wifi_sec_get_leap_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6825,20 +6822,20 @@ setting_ip4_config_details (NMSetting *setting, NmCli *nmc, const char *one_pro
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_ipv4_get_method (setting));
- set_val_str (arr, 2, nmc_property_ipv4_get_dns (setting));
- set_val_str (arr, 3, nmc_property_ipv4_get_dns_search (setting));
- set_val_str (arr, 4, nmc_property_ip_get_addresses (setting));
- set_val_str (arr, 5, nmc_property_ipv4_get_gateway (setting));
- set_val_str (arr, 6, nmc_property_ipv4_get_routes (setting));
- set_val_str (arr, 7, nmc_property_ipv4_get_route_metric (setting));
- set_val_str (arr, 8, nmc_property_ipv4_get_ignore_auto_routes (setting));
- set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_dns (setting));
- set_val_str (arr, 10, nmc_property_ipv4_get_dhcp_client_id (setting));
- set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_send_hostname (setting));
- set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_hostname (setting));
- set_val_str (arr, 13, nmc_property_ipv4_get_never_default (setting));
- set_val_str (arr, 14, nmc_property_ipv4_get_may_fail (setting));
+ set_val_str (arr, 1, nmc_property_ipv4_get_method (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_ipv4_get_dns (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_ipv4_get_dns_search (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_ipv4_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_ipv4_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_ipv4_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_ipv4_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_ipv4_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_ipv4_get_dhcp_client_id (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_ipv4_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_ipv4_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_ipv4_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 14, nmc_property_ipv4_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6864,20 +6861,20 @@ setting_ip6_config_details (NMSetting *setting, NmCli *nmc, const char *one_pro
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_ipv6_get_method (setting));
- set_val_str (arr, 2, nmc_property_ipv6_get_dns (setting));
- set_val_str (arr, 3, nmc_property_ipv6_get_dns_search (setting));
- set_val_str (arr, 4, nmc_property_ip_get_addresses (setting));
- set_val_str (arr, 5, nmc_property_ipv6_get_gateway (setting));
- set_val_str (arr, 6, nmc_property_ipv6_get_routes (setting));
- set_val_str (arr, 7, nmc_property_ipv6_get_route_metric (setting));
- set_val_str (arr, 8, nmc_property_ipv6_get_ignore_auto_routes (setting));
- set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_dns (setting));
- set_val_str (arr, 10, nmc_property_ipv6_get_never_default (setting));
- set_val_str (arr, 11, nmc_property_ipv6_get_may_fail (setting));
- set_val_str (arr, 12, nmc_property_ipv6_get_ip6_privacy (setting));
- set_val_str (arr, 13, nmc_property_ipv6_get_dhcp_send_hostname (setting));
- set_val_str (arr, 14, nmc_property_ipv6_get_dhcp_hostname (setting));
+ set_val_str (arr, 1, nmc_property_ipv6_get_method (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_ipv6_get_dns (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_ipv6_get_dns_search (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_ip_get_addresses (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_ipv6_get_gateway (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_ipv6_get_routes (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_ipv6_get_route_metric (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_ipv6_get_ignore_auto_routes (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_ipv6_get_ignore_auto_dns (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_ipv6_get_never_default (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_ipv6_get_may_fail (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_ipv6_get_ip6_privacy (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_ipv6_get_dhcp_send_hostname (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 14, nmc_property_ipv6_get_dhcp_hostname (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6903,11 +6900,11 @@ setting_serial_details (NMSetting *setting, NmCli *nmc, const char *one_prop, g
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_serial_get_baud (setting));
- set_val_str (arr, 2, nmc_property_serial_get_bits (setting));
- set_val_str (arr, 3, nmc_property_serial_get_parity (setting));
- set_val_str (arr, 4, nmc_property_serial_get_stopbits (setting));
- set_val_str (arr, 5, nmc_property_serial_get_send_delay (setting));
+ set_val_str (arr, 1, nmc_property_serial_get_baud (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_serial_get_bits (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_serial_get_parity (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_serial_get_stopbits (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_serial_get_send_delay (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6933,24 +6930,24 @@ setting_ppp_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_ppp_get_noauth (setting));
- set_val_str (arr, 2, nmc_property_ppp_get_refuse_eap (setting));
- set_val_str (arr, 3, nmc_property_ppp_get_refuse_pap (setting));
- set_val_str (arr, 4, nmc_property_ppp_get_refuse_chap (setting));
- set_val_str (arr, 5, nmc_property_ppp_get_refuse_mschap (setting));
- set_val_str (arr, 6, nmc_property_ppp_get_refuse_mschapv2 (setting));
- set_val_str (arr, 7, nmc_property_ppp_get_nobsdcomp (setting));
- set_val_str (arr, 8, nmc_property_ppp_get_nodeflate (setting));
- set_val_str (arr, 9, nmc_property_ppp_get_no_vj_comp (setting));
- set_val_str (arr, 10, nmc_property_ppp_get_require_mppe (setting));
- set_val_str (arr, 11, nmc_property_ppp_get_require_mppe_128 (setting));
- set_val_str (arr, 12, nmc_property_ppp_get_mppe_stateful (setting));
- set_val_str (arr, 13, nmc_property_ppp_get_crtscts (setting));
- set_val_str (arr, 14, nmc_property_ppp_get_baud (setting));
- set_val_str (arr, 15, nmc_property_ppp_get_mru (setting));
- set_val_str (arr, 16, nmc_property_ppp_get_mtu (setting));
- set_val_str (arr, 17, nmc_property_ppp_get_lcp_echo_failure (setting));
- set_val_str (arr, 18, nmc_property_ppp_get_lcp_echo_interval (setting));
+ set_val_str (arr, 1, nmc_property_ppp_get_noauth (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_ppp_get_refuse_eap (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_ppp_get_refuse_pap (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_ppp_get_refuse_chap (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_ppp_get_refuse_mschap (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_ppp_get_refuse_mschapv2 (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_ppp_get_nobsdcomp (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_ppp_get_nodeflate (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_ppp_get_no_vj_comp (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_ppp_get_require_mppe (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_ppp_get_require_mppe_128 (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_ppp_get_mppe_stateful (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_ppp_get_crtscts (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 14, nmc_property_ppp_get_baud (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 15, nmc_property_ppp_get_mru (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 16, nmc_property_ppp_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 17, nmc_property_ppp_get_lcp_echo_failure (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 18, nmc_property_ppp_get_lcp_echo_interval (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -6976,10 +6973,10 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gb
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_pppoe_get_service (setting));
- set_val_str (arr, 2, nmc_property_pppoe_get_username (setting));
+ set_val_str (arr, 1, nmc_property_pppoe_get_service (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_pppoe_get_username (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_pppoe_get_password));
- set_val_str (arr, 4, nmc_property_pppoe_get_password_flags (setting));
+ set_val_str (arr, 4, nmc_property_pppoe_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7005,15 +7002,15 @@ setting_gsm_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_gsm_get_number (setting));
- set_val_str (arr, 2, nmc_property_gsm_get_username (setting));
+ set_val_str (arr, 1, nmc_property_gsm_get_number (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_gsm_get_username (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_gsm_get_password));
- set_val_str (arr, 4, nmc_property_gsm_get_password_flags (setting));
- set_val_str (arr, 5, nmc_property_gsm_get_apn (setting));
- set_val_str (arr, 6, nmc_property_gsm_get_network_id (setting));
+ set_val_str (arr, 4, nmc_property_gsm_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_gsm_get_apn (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_gsm_get_network_id (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 7, GET_SECRET (secrets, setting, nmc_property_gsm_get_pin));
- set_val_str (arr, 8, nmc_property_gsm_get_pin_flags (setting));
- set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting));
+ set_val_str (arr, 8, nmc_property_gsm_get_pin_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_gsm_get_home_only (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7039,10 +7036,10 @@ setting_cdma_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_cdma_get_number (setting));
- set_val_str (arr, 2, nmc_property_cdma_get_username (setting));
+ set_val_str (arr, 1, nmc_property_cdma_get_number (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_cdma_get_username (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 3, GET_SECRET (secrets, setting, nmc_property_cdma_get_password));
- set_val_str (arr, 4, nmc_property_cdma_get_password_flags (setting));
+ set_val_str (arr, 4, nmc_property_cdma_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7068,8 +7065,8 @@ setting_bluetooth_details (NMSetting *setting, NmCli *nmc, const char *one_prop
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_bluetooth_get_bdaddr (setting));
- set_val_str (arr, 2, nmc_property_bluetooth_get_type (setting));
+ set_val_str (arr, 1, nmc_property_bluetooth_get_bdaddr (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_bluetooth_get_type (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7095,9 +7092,9 @@ setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc, const char *one_prop
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_olpc_get_ssid (setting));
- set_val_str (arr, 2, nmc_property_olpc_get_channel (setting));
- set_val_str (arr, 3, nmc_property_olpc_get_anycast_address (setting));
+ set_val_str (arr, 1, nmc_property_olpc_get_ssid (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_olpc_get_channel (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_olpc_get_anycast_address (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7123,11 +7120,11 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_vpn_get_service_type (setting));
- set_val_str (arr, 2, nmc_property_vpn_get_user_name (setting));
- set_val_str (arr, 3, nmc_property_vpn_get_data (setting));
+ set_val_str (arr, 1, nmc_property_vpn_get_service_type (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_vpn_get_user_name (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_vpn_get_data (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 4, GET_SECRET (secrets, setting, nmc_property_vpn_get_secrets));
- set_val_str (arr, 5, nmc_property_vpn_get_persistent (setting));
+ set_val_str (arr, 5, nmc_property_vpn_get_persistent (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7153,8 +7150,8 @@ setting_wimax_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gb
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_wimax_get_mac_address (setting));
- set_val_str (arr, 2, nmc_property_wimax_get_network_name (setting));
+ set_val_str (arr, 1, nmc_property_wimax_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_wimax_get_network_name (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7180,11 +7177,11 @@ setting_infiniband_details (NMSetting *setting, NmCli *nmc, const char *one_pro
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_ib_get_mac_address (setting));
- set_val_str (arr, 2, nmc_property_ib_get_mtu (setting));
- set_val_str (arr, 3, nmc_property_ib_get_transport_mode (setting));
- set_val_str (arr, 4, nmc_property_ib_get_p_key (setting));
- set_val_str (arr, 5, nmc_property_ib_get_parent (setting));
+ set_val_str (arr, 1, nmc_property_ib_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_ib_get_mtu (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_ib_get_transport_mode (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_ib_get_p_key (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_ib_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7210,7 +7207,7 @@ setting_bond_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_bond_get_options (setting));
+ set_val_str (arr, 1, nmc_property_bond_get_options (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7236,11 +7233,11 @@ setting_vlan_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_vlan_get_parent (setting));
- set_val_str (arr, 2, nmc_property_vlan_get_id (setting));
- set_val_str (arr, 3, nmc_property_vlan_get_flags (setting));
- set_val_str (arr, 4, nmc_property_vlan_get_ingress_priority_map (setting));
- set_val_str (arr, 5, nmc_property_vlan_get_egress_priority_map (setting));
+ set_val_str (arr, 1, nmc_property_vlan_get_parent (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_vlan_get_id (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_vlan_get_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_vlan_get_ingress_priority_map (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_vlan_get_egress_priority_map (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7266,13 +7263,13 @@ setting_adsl_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_adsl_get_username (setting));
+ set_val_str (arr, 1, nmc_property_adsl_get_username (setting, NMC_PROPERTY_GET_PRETTY));
set_val_str (arr, 2, GET_SECRET (secrets, setting, nmc_property_adsl_get_password));
- set_val_str (arr, 3, nmc_property_adsl_get_password_flags (setting));
- set_val_str (arr, 4, nmc_property_adsl_get_protocol (setting));
- set_val_str (arr, 5, nmc_property_adsl_get_encapsulation (setting));
- set_val_str (arr, 6, nmc_property_adsl_get_vpi (setting));
- set_val_str (arr, 7, nmc_property_adsl_get_vci (setting));
+ set_val_str (arr, 3, nmc_property_adsl_get_password_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_adsl_get_protocol (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_adsl_get_encapsulation (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_adsl_get_vpi (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_adsl_get_vci (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7298,13 +7295,13 @@ setting_bridge_details (NMSetting *setting, NmCli *nmc, const char *one_prop, g
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_bridge_get_mac_address (setting));
- set_val_str (arr, 2, nmc_property_bridge_get_stp (setting));
- set_val_str (arr, 3, nmc_property_bridge_get_priority (setting));
- set_val_str (arr, 4, nmc_property_bridge_get_forward_delay (setting));
- set_val_str (arr, 5, nmc_property_bridge_get_hello_time (setting));
- set_val_str (arr, 6, nmc_property_bridge_get_max_age (setting));
- set_val_str (arr, 7, nmc_property_bridge_get_ageing_time (setting));
+ set_val_str (arr, 1, nmc_property_bridge_get_mac_address (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_bridge_get_stp (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_bridge_get_priority (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_bridge_get_forward_delay (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_bridge_get_hello_time (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_bridge_get_max_age (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_bridge_get_ageing_time (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7330,9 +7327,9 @@ setting_bridge_port_details (NMSetting *setting, NmCli *nmc, const char *one_pr
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_bridge_port_get_priority (setting));
- set_val_str (arr, 2, nmc_property_bridge_port_get_path_cost (setting));
- set_val_str (arr, 3, nmc_property_bridge_port_get_hairpin_mode (setting));
+ set_val_str (arr, 1, nmc_property_bridge_port_get_priority (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_bridge_port_get_path_cost (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_bridge_port_get_hairpin_mode (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7358,7 +7355,7 @@ setting_team_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gbo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_team_get_config (setting));
+ set_val_str (arr, 1, nmc_property_team_get_config (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7384,7 +7381,7 @@ setting_team_port_details (NMSetting *setting, NmCli *nmc, const char *one_prop
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_team_port_get_config (setting));
+ set_val_str (arr, 1, nmc_property_team_port_get_config (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
@@ -7410,21 +7407,21 @@ setting_dcb_details (NMSetting *setting, NmCli *nmc, const char *one_prop, gboo
arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_SECTION_PREFIX);
set_val_str (arr, 0, g_strdup (nm_setting_get_name (setting)));
- set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting));
- set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting));
- set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting));
- set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting));
- set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting));
- set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting));
- set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting));
- set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting));
- set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting));
- set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting));
- set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting));
- set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting));
- set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting));
- set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting));
- set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting));
+ set_val_str (arr, 1, nmc_property_dcb_get_app_fcoe_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 2, nmc_property_dcb_get_app_fcoe_priority (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 3, nmc_property_dcb_get_app_fcoe_mode (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 4, nmc_property_dcb_get_app_iscsi_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 5, nmc_property_dcb_get_app_iscsi_priority (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 6, nmc_property_dcb_get_app_fip_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 7, nmc_property_dcb_get_app_fip_priority (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 8, nmc_property_dcb_get_pfc_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 9, nmc_property_dcb_get_pfc (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 10, nmc_property_dcb_get_pg_flags (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 11, nmc_property_dcb_get_pg_group_id (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 12, nmc_property_dcb_get_pg_group_bandwidth (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 13, nmc_property_dcb_get_pg_bandwidth (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 14, nmc_property_dcb_get_pg_strict (setting, NMC_PROPERTY_GET_PRETTY));
+ set_val_str (arr, 15, nmc_property_dcb_get_pg_traffic_class (setting, NMC_PROPERTY_GET_PRETTY));
g_ptr_array_add (nmc->output_data, arr);
print_data (nmc); /* Print all data */
diff --git a/clients/cli/settings.h b/clients/cli/settings.h
index 3c4c814fd..bab00ee90 100644
--- a/clients/cli/settings.h
+++ b/clients/cli/settings.h
@@ -37,13 +37,13 @@ void nmc_setting_connection_connect_handlers (NMSettingConnection *setting, NMCo
char **nmc_setting_get_valid_properties (NMSetting *setting);
char *nmc_setting_get_property_desc (NMSetting *setting, const char *prop);
-const char *nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop);
+const char **nmc_setting_get_property_allowed_values (NMSetting *setting, const char *prop);
char *nmc_setting_get_property (NMSetting *setting,
const char *prop,
GError **error);
-char *nmc_setting_get_property_out2in (NMSetting *setting,
- const char *prop,
- GError **error);
+char *nmc_setting_get_property_parsable (NMSetting *setting,
+ const char *prop,
+ GError **error);
gboolean nmc_setting_set_property (NMSetting *setting,
const char *prop,
const char *val,
diff --git a/clients/cli/utils.c b/clients/cli/utils.c
index 60cf9f93f..dfd002edc 100644
--- a/clients/cli/utils.c
+++ b/clients/cli/utils.c
@@ -454,17 +454,34 @@ nmc_get_user_input (const char *ask_str)
* Split string in 'line' according to 'delim' to (argument) array.
*/
int
-nmc_string_to_arg_array (const char *line, const char *delim, char ***argv, int *argc)
+nmc_string_to_arg_array (const char *line, const char *delim, gboolean unquote,
+ char ***argv, int *argc)
{
- int i = 0;
char **arr;
- arr = g_strsplit_set (line ? line : "", delim ? delim : " \t", 0);
- while (arr && arr[i])
- i++;
+ arr = nmc_strsplit_set (line ? line : "", delim ? delim : " \t", 0);
+
+ if (unquote) {
+ int i = 0;
+ char *s;
+ size_t l;
+ const char *quotes = "\"'";
+
+ while (arr && arr[i]) {
+ s = arr[i];
+ l = strlen (s);
+ if (l >= 2) {
+ if (strchr (quotes, s[0]) && s[l-1] == s[0]) {
+ memmove (s, s+1, l-2);
+ s[l-2] = '\0';
+ }
+ }
+ i++;
+ }
+ }
- *argc = i;
*argv = arr;
+ *argc = g_strv_length (arr);
return 0;
}
@@ -544,20 +561,22 @@ nmc_util_strv_to_slist (char **strv)
* Returns: a newly allocated string. Caller must free it with g_free().
*/
char *
-nmc_util_strv_for_display (const char **strv)
+nmc_util_strv_for_display (const char **strv, gboolean brackets)
{
GString *result;
guint i = 0;
result = g_string_sized_new (150);
- g_string_append_c (result, '[');
+ if (brackets)
+ g_string_append_c (result, '[');
while (strv && strv[i]) {
if (result->len > 1)
g_string_append (result, ", ");
g_string_append (result, strv[i]);
i++;
}
- g_string_append_c (result, ']');
+ if (brackets)
+ g_string_append_c (result, ']');
return g_string_free (result, FALSE);
}
diff --git a/clients/cli/utils.h b/clients/cli/utils.h
index fc43b0ed9..77e697af6 100644
--- a/clients/cli/utils.h
+++ b/clients/cli/utils.h
@@ -69,10 +69,11 @@ void nmc_terminal_show_progress (const char *str);
const char *nmc_term_color_sequence (NmcTermColor color);
char *nmc_colorize (NmcTermColor color, const char * fmt, ...);
char *nmc_get_user_input (const char *ask_str);
-int nmc_string_to_arg_array (const char *line, const char *delim, char ***argv, int *argc);
+int nmc_string_to_arg_array (const char *line, const char *delim, gboolean unquote,
+ char ***argv, int *argc);
const char *nmc_string_is_valid (const char *input, const char **allowed, GError **error);
GSList *nmc_util_strv_to_slist (char **strv);
-char * nmc_util_strv_for_display (const char **strv);
+char * nmc_util_strv_for_display (const char **strv, gboolean brackets);
char **nmc_strsplit_set (const char *str, const char *delimiter, int max_tokens);
int nmc_string_screen_width (const char *start, const char *end);
void set_val_str (NmcOutputField fields_array[], guint32 index, char *value);
diff --git a/clients/common/nm-secret-agent-simple.c b/clients/common/nm-secret-agent-simple.c
index 80022a4dc..8eddb4400 100644
--- a/clients/common/nm-secret-agent-simple.c
+++ b/clients/common/nm-secret-agent-simple.c
@@ -122,10 +122,10 @@ static gboolean
strv_has (gchar **haystack,
gchar *needle)
{
- gchar *iter;
+ gchar **iter;
- for (iter = *haystack; iter; iter++) {
- if (g_strcmp0 (iter, needle) == 0)
+ for (iter = haystack; iter && *iter; iter++) {
+ if (g_strcmp0 (*iter, needle) == 0)
return TRUE;
}
diff --git a/clients/tui/Makefile.in b/clients/tui/Makefile.in
index 4283a754a..331461a7e 100644
--- a/clients/tui/Makefile.in
+++ b/clients/tui/Makefile.in
@@ -297,6 +297,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -410,6 +411,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/clients/tui/newt/Makefile.in b/clients/tui/newt/Makefile.in
index 1a510bb7f..96131a7d0 100644
--- a/clients/tui/newt/Makefile.in
+++ b/clients/tui/newt/Makefile.in
@@ -201,6 +201,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -314,6 +315,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/config.h.in b/config.h.in
index 3783b1602..689a497ea 100644
--- a/config.h.in
+++ b/config.h.in
@@ -66,6 +66,9 @@
/* Define if libnl has rtnl_link_inet6_get_addr_gen_mode() */
#undef HAVE_LIBNL_INET6_ADDR_GEN_MODE
+/* Define if libnl has rtnl_link_inet6_get_token() */
+#undef HAVE_LIBNL_INET6_TOKEN
+
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
@@ -145,6 +148,12 @@
/* git commit id of the original source code version */
#undef NM_GIT_SHA
+/* Define if more asserts are enabled */
+#undef NM_MORE_ASSERTS
+
+/* Define if more asserts are enabled */
+#undef NM_MORE_LOGGING
+
/* Name of package */
#undef PACKAGE
@@ -236,6 +245,9 @@
/* Define if you have Teamd control support */
#undef WITH_TEAMDCTL
+/* Define if you have Wi-Fi support */
+#undef WITH_WIFI
+
/* Define if you have WiMAX support */
#undef WITH_WIMAX
diff --git a/configure b/configure
index 53d73d47c..363895c29 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for NetworkManager 1.0.2.
+# Generated by GNU Autoconf 2.69 for NetworkManager 1.0.4.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=NetworkManager>.
#
@@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='NetworkManager'
PACKAGE_TARNAME='NetworkManager'
-PACKAGE_VERSION='1.0.2'
-PACKAGE_STRING='NetworkManager 1.0.2'
+PACKAGE_VERSION='1.0.4'
+PACKAGE_STRING='NetworkManager 1.0.4'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=NetworkManager'
PACKAGE_URL=''
@@ -791,6 +791,8 @@ INTROSPECTION_COMPILER
INTROSPECTION_SCANNER
GUDEV_LIBS
GUDEV_CFLAGS
+AM_TESTS_FD_REDIRECT
+LOG_DRIVER
GLIB_LIBS
GLIB_CFLAGS
HAVE_DBUS_GLIB_100_FALSE
@@ -806,6 +808,8 @@ LIBDL
LIBM
WITH_WEXT_FALSE
WITH_WEXT_TRUE
+WITH_WIFI_FALSE
+WITH_WIFI_TRUE
GNOME_CODE_COVERAGE_RULES
CODE_COVERAGE_LDFLAGS
CODE_COVERAGE_CFLAGS
@@ -1029,6 +1033,7 @@ enable_ifnet
with_config_plugins_default
enable_code_coverage
with_dist_version
+enable_wifi
with_wext
enable_introspection
enable_qt
@@ -1062,11 +1067,14 @@ with_libsoup
enable_concheck
with_nmtui
enable_more_warnings
+enable_more_asserts
+enable_more_logging
enable_lto
enable_vala
enable_tests
with_valgrind
with_tests
+with_valgrind_suppressions
with_html_dir
enable_gtk_doc
enable_gtk_doc_html
@@ -1672,7 +1680,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures NetworkManager 1.0.2 to adapt to many kinds of systems.
+\`configure' configures NetworkManager 1.0.4 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1742,7 +1750,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of NetworkManager 1.0.2:";;
+ short | recursive ) echo "Configuration of NetworkManager 1.0.4:";;
esac
cat <<\_ACEOF
@@ -1773,6 +1781,7 @@ Optional Features:
--enable-ifupdown enable ifupdown configuration plugin (Debian/Ubuntu)
--enable-ifnet enable ifnet configuration plugin (Gentoo)
--enable-code-coverage Whether to enable code coverage support
+ --enable-wifi enable Wi-Fi support
--enable-introspection=[no/auto/yes]
Enable introspection for this build
--enable-qt enable Qt examples
@@ -1789,6 +1798,8 @@ Optional Features:
--enable-bluez5-dun enable Bluez5 DUN support
--enable-concheck enable connectivity checking support
--enable-more-warnings Possible values: no/yes/error
+ --enable-more-asserts Enable more assertions for debugging (default: no)
+ --enable-more-logging Enable more debug logging (default: no)
--enable-lto Enable Link Time Optimization for smaller size
(default: no)
--enable-vala=[no/auto/yes]
@@ -1863,6 +1874,8 @@ Optional Packages:
--with-valgrind=yes|no|path
Use valgrind to memory-check the tests (default: no)
--with-tests Build NetworkManager tests (deprecated)
+ --with-valgrind-suppressions=path
+ Use specific valgrind suppression file
--with-html-dir=PATH path to installed docs
Some influential environment variables:
@@ -2019,7 +2032,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-NetworkManager configure 1.0.2
+NetworkManager configure 1.0.4
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2563,7 +2576,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by NetworkManager $as_me 1.0.2, which was
+It was created by NetworkManager $as_me 1.0.4, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3433,7 +3446,7 @@ fi
# Define the identity of the package.
PACKAGE='NetworkManager'
- VERSION='1.0.2'
+ VERSION='1.0.4'
cat >>confdefs.h <<_ACEOF
@@ -16718,9 +16731,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
NM_MAJOR_VERSION=1
NM_MINOR_VERSION=0
-NM_MICRO_VERSION=2
-NM_VERSION=1.0.2
-NM_GIT_SHA=4e6481cb733611543d22e06831db63b0e23af3f9
+NM_MICRO_VERSION=4
+NM_VERSION=1.0.4
+NM_GIT_SHA=f27429138ff951309556c30c67e2f34e7ed29281
@@ -19923,15 +19936,45 @@ _ACEOF
fi
+# Check whether --enable-wifi was given.
+if test "${enable_wifi+set}" = set; then :
+ enableval=$enable_wifi;
+fi
+
+if test "${enable_wifi}" != "no"; then
+ enable_wifi='yes'
+
+$as_echo "#define WITH_WIFI 1" >>confdefs.h
+
+else
+
+$as_echo "#define WITH_WIFI 0" >>confdefs.h
+
+fi
+ if test "${enable_wifi}" = "yes"; then
+ WITH_WIFI_TRUE=
+ WITH_WIFI_FALSE='#'
+else
+ WITH_WIFI_TRUE='#'
+ WITH_WIFI_FALSE=
+fi
+
+
# Check whether --with-wext was given.
if test "${with_wext+set}" = set; then :
withval=$with_wext; ac_with_wext=$withval
else
- ac_with_wext="yes"
+ ac_with_wext="$enable_wifi"
fi
+if test "$ac_with_wext" != 'no'; then
+ ac_with_wext='yes'
+fi
if test x"$ac_with_wext" = x"yes"; then
+ if test "$enable_wifi" != "yes"; then
+ as_fn_error $? "Enabling WEXT support and disabling Wi-Fi makes no sense" "$LINENO" 5
+ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Linux kernel WEXT headers" >&5
$as_echo_n "checking Linux kernel WEXT headers... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -20012,17 +20055,18 @@ if test "$ac_have_nl80211" = no; then
as_fn_error $? "Linux kernel development header linux/nl80211.h not installed or not functional" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Linux kernel nl80211 Critical Protocol Start/Stop" >&5
+if test "$with_wifi" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking Linux kernel nl80211 Critical Protocol Start/Stop" >&5
$as_echo_n "checking Linux kernel nl80211 Critical Protocol Start/Stop... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifndef __user
- #define __user
- #endif
- #include <sys/types.h>
- #include <linux/types.h>
- #include <sys/socket.h>
- #include <linux/nl80211.h>
+ #define __user
+ #endif
+ #include <sys/types.h>
+ #include <linux/types.h>
+ #include <sys/socket.h>
+ #include <linux/nl80211.h>
int
main ()
{
@@ -20037,8 +20081,11 @@ else
ac_have_nl80211_critproto=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_have_nl80211_critproto" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_have_nl80211_critproto" >&5
$as_echo "$ac_have_nl80211_critproto" >&6; }
+else
+ ac_have_nl80211_critproto='no'
+fi
if test "$ac_have_nl80211_critproto" = yes; then
$as_echo "#define HAVE_NL80211_CRITICAL_PROTOCOL_CMDS 1" >>confdefs.h
@@ -20622,6 +20669,65 @@ if test -n "$GLIB_CFLAGS"; then
pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 >= 2.37.6 gmodule-2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-unix-2.0 >= 2.37.6 gmodule-2.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "gio-unix-2.0 >= 2.37.6 gmodule-2.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$GLIB_LIBS"; then
+ pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 >= 2.37.6 gmodule-2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-unix-2.0 >= 2.37.6 gmodule-2.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "gio-unix-2.0 >= 2.37.6 gmodule-2.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gio-unix-2.0 >= 2.37.6 gmodule-2.0" 2>&1`
+ else
+ GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gio-unix-2.0 >= 2.37.6 gmodule-2.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GLIB_PKG_ERRORS" >&5
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
+$as_echo_n "checking for GLIB... " >&6; }
+
+if test -n "$GLIB_CFLAGS"; then
+ pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 >= 2.32 gmodule-2.0\""; } >&5
($PKG_CONFIG --exists --print-errors "gio-unix-2.0 >= 2.32 gmodule-2.0") 2>&5
ac_status=$?
@@ -20704,6 +20810,114 @@ else
$as_echo "yes" >&6; }
fi
+ LOG_DRIVER='$(top_srcdir)/build-aux/test-driver'
+
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
+$as_echo_n "checking for GLIB... " >&6; }
+
+if test -n "$GLIB_CFLAGS"; then
+ pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 >= 2.32 gmodule-2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-unix-2.0 >= 2.32 gmodule-2.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "gio-unix-2.0 >= 2.32 gmodule-2.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$GLIB_LIBS"; then
+ pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 >= 2.32 gmodule-2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gio-unix-2.0 >= 2.32 gmodule-2.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "gio-unix-2.0 >= 2.32 gmodule-2.0" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gio-unix-2.0 >= 2.32 gmodule-2.0" 2>&1`
+ else
+ GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gio-unix-2.0 >= 2.32 gmodule-2.0" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GLIB_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (gio-unix-2.0 >= 2.32 gmodule-2.0) were not met:
+
+$GLIB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GLIB_CFLAGS
+and GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GLIB_CFLAGS
+and GLIB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+ GLIB_LIBS=$pkg_cv_GLIB_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+ LOG_DRIVER='$(top_srcdir)/build-aux/test-driver'
+
+else
+ GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+ GLIB_LIBS=$pkg_cv_GLIB_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ LOG_DRIVER='$(top_srcdir)/build-aux/tap-driver.sh'
+,
+ AM_TESTS_FD_REDIRECT='--tap'
+
+fi
GLIB_CFLAGS="$GLIB_CFLAGS -DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32 -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_32"
@@ -22077,6 +22291,55 @@ $as_echo "#define HAVE_KERNEL_INET6_ADDR_GEN_MODE 0" >>confdefs.h
fi
+# IPv6 tokenized identifiers support in libnl
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rtnl_link_inet6_get_token in -lnl-route-3" >&5
+$as_echo_n "checking for rtnl_link_inet6_get_token in -lnl-route-3... " >&6; }
+if ${ac_cv_lib_nl_route_3_rtnl_link_inet6_get_token+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl-route-3 $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char rtnl_link_inet6_get_token ();
+int
+main ()
+{
+return rtnl_link_inet6_get_token ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nl_route_3_rtnl_link_inet6_get_token=yes
+else
+ ac_cv_lib_nl_route_3_rtnl_link_inet6_get_token=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nl_route_3_rtnl_link_inet6_get_token" >&5
+$as_echo "$ac_cv_lib_nl_route_3_rtnl_link_inet6_get_token" >&6; }
+if test "x$ac_cv_lib_nl_route_3_rtnl_link_inet6_get_token" = xyes; then :
+ ac_have_ipv6_token="1"
+else
+ ac_have_ipv6_token="0"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBNL_INET6_TOKEN $ac_have_ipv6_token
+_ACEOF
+
+
# uuid library
pkg_failed=no
@@ -22227,7 +22490,7 @@ fi
$as_echo "$ax_cv_lib_readline" >&6; }
if test -z "$ax_cv_lib_readline"; then
- as_fn_error $? "readline library with terminfo support is required (one of ncurses, curses, or termcap)" "$LINENO" 5
+ as_fn_error $? "readline library with terminfo support is required (one of readline, edit, or editline, AND one of ncurses, curses, or termcap)" "$LINENO" 5
fi
ORIG_LIBS="$LIBS"
@@ -23524,11 +23787,11 @@ done
test -n "$with_dhcpcd" || with_dhcpcd="no"
if test "$with_dhcpcd" != "no"; then
- if ! $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd 456789\."; then
+ if ! $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd [456789]\."; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot use dhcpcd, version 4.x or higher is required" >&5
$as_echo "$as_me: WARNING: Cannot use dhcpcd, version 4.x or higher is required" >&2;}
with_dhcpcd=no
- elif $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd 6789\."; then
+ elif $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd [6789]\."; then
$as_echo "#define DHCPCD_SUPPORTS_IPV6 1" >>confdefs.h
@@ -24202,7 +24465,7 @@ fi
if test "${enable_more_warnings+set}" = set; then :
enableval=$enable_more_warnings; set_more_warnings="$enableval"
else
- set_more_warnings=error
+ set_more_warnings=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for more warnings" >&5
@@ -24532,6 +24795,28 @@ $as_echo "no" >&6; }
fi
+# Check whether --enable-more-asserts was given.
+if test "${enable_more_asserts+set}" = set; then :
+ enableval=$enable_more_asserts;
+fi
+
+if test "${enable_more_asserts}" = "yes"; then
+
+$as_echo "#define NM_MORE_ASSERTS 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-more-logging was given.
+if test "${enable_more_logging+set}" = set; then :
+ enableval=$enable_more_logging;
+fi
+
+if test "${enable_more_logging}" = "yes"; then
+
+$as_echo "#define NM_MORE_LOGGING 1" >>confdefs.h
+
+fi
+
# Check whether --enable-lto was given.
if test "${enable_lto+set}" = set; then :
enableval=$enable_lto;
@@ -24884,8 +25169,21 @@ else
REQUIRE_ROOT_TESTS_FALSE=
fi
+
+# Check whether --with-valgrind-suppressions was given.
+if test "${with_valgrind_suppressions+set}" = set; then :
+ withval=$with_valgrind_suppressions;
+fi
+
+if test "$with_valgrind" == no; then
+ with_valgrind_suppressions=
+else
+ if test "$with_valgrind_suppressions" == ""; then
+ with_valgrind_suppressions='$(top_srcdir)/valgrind.suppressions'
+ fi
+fi
if test "$with_valgrind" != "no"; then :
- VALGRIND_RULES='TESTS_ENVIRONMENT = "$(top_srcdir)/tools/run-test-valgrind.sh" "$(LIBTOOL)" "$(with_valgrind)" "$(top_srcdir)/valgrind.suppressions"'
+ VALGRIND_RULES='LOG_COMPILER = "$(top_srcdir)/tools/run-test-valgrind.sh" "$(LIBTOOL)" "$(with_valgrind)" '"$with_valgrind_suppressions"
fi
if test "${with_valgrind}" != "no"; then
@@ -25572,6 +25870,10 @@ if test -z "${CODE_COVERAGE_ENABLED_TRUE}" && test -z "${CODE_COVERAGE_ENABLED_F
as_fn_error $? "conditional \"CODE_COVERAGE_ENABLED\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${WITH_WIFI_TRUE}" && test -z "${WITH_WIFI_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_WIFI\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${WITH_WEXT_TRUE}" && test -z "${WITH_WEXT_FALSE}"; then
as_fn_error $? "conditional \"WITH_WEXT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -26113,7 +26415,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by NetworkManager $as_me 1.0.2, which was
+This file was extended by NetworkManager $as_me 1.0.4, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -26179,7 +26481,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-NetworkManager config.status 1.0.2
+NetworkManager config.status 1.0.4
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -28625,6 +28927,7 @@ echo
echo "Features:"
echo " wext: $ac_with_wext"
+echo " wifi: $enable_wifi"
echo " wimax: $enable_wimax"
echo " ppp: $enable_ppp"
echo " modemmanager-1: $with_modem_manager_1"
@@ -28654,7 +28957,7 @@ echo
echo "Miscellaneous:"
echo " documentation: $enable_gtk_doc"
echo " tests: $enable_tests"
-echo " valgrind: $with_valgrind"
+echo " valgrind: $with_valgrind $with_valgrind_suppressions"
echo " code coverage: $enable_code_coverage"
echo " LTO: $enable_lto"
echo
diff --git a/configure.ac b/configure.ac
index 68dff7a82..381b6215d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@ AC_PREREQ([2.63])
dnl The NM version number
m4_define([nm_major_version], [1])
m4_define([nm_minor_version], [0])
-m4_define([nm_micro_version], [2])
+m4_define([nm_micro_version], [4])
m4_define([nm_version],
[nm_major_version.nm_minor_version.nm_micro_version])
m4_define([nm_git_sha], [m4_esyscmd([ ( [ -d ./.git/ ] && [ "$(readlink -f ./.git/)" = "$(readlink -f "$(git rev-parse --git-dir 2>/dev/null)" 2>/dev/null)" ] && git rev-parse --verify -q HEAD 2>/dev/null ) || true ])])
@@ -15,21 +15,9 @@ AC_INIT([NetworkManager], [nm_version],
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([build-aux])
+AC_REQUIRE_AUX_FILE([tap-driver.sh])
-dnl Initialize automake. automake < 1.12 didn't have serial-tests and
-dnl gives an error if it sees this, but for automake >= 1.13
-dnl serial-tests is required so we have to include it. Solution is to
-dnl test for the version of automake (by running an external command)
-dnl and provide it if necessary. Note we have to do this entirely using
-dnl m4 macros since automake queries this macro by running
-dnl 'autoconf --trace ...'.
-m4_define([serial_tests], [
- m4_esyscmd([automake --version |
- head -1 |
- awk '{split ($NF,a,"."); if (a[1] == 1 && a[2] >= 12) { print "serial-tests" }}'
- ])
-])
-AM_INIT_AUTOMAKE(1.11 serial_tests tar-ustar no-dist-gzip dist-bzip2 -Wno-portability) dnl NB: Do not [quote] this parameter.
+AM_INIT_AUTOMAKE(1.12 tar-ustar no-dist-gzip dist-bzip2 -Wno-portability) dnl NB: Do not [quote] this parameter.
AM_MAINTAINER_MODE([enable])
AM_SILENT_RULES([yes])
@@ -145,11 +133,26 @@ if ! test x"$ac_distver" = x""; then
AC_DEFINE_UNQUOTED(NM_DIST_VERSION, "$ac_distver", [Define the distribution version string])
fi
+AC_ARG_ENABLE(wifi, AS_HELP_STRING([--enable-wifi], [enable Wi-Fi support]))
+if test "${enable_wifi}" != "no"; then
+ enable_wifi='yes'
+ AC_DEFINE(WITH_WIFI, 1, [Define if you have Wi-Fi support])
+else
+ AC_DEFINE(WITH_WIFI, 0, [Define if you have Wi-Fi support])
+fi
+AM_CONDITIONAL(WITH_WIFI, test "${enable_wifi}" = "yes")
+
dnl
dnl Default to using WEXT but allow it to be disabled
dnl
-AC_ARG_WITH(wext, AS_HELP_STRING([--with-wext=yes], [Enable or disable Linux Wireless Extensions]), ac_with_wext=$withval, ac_with_wext="yes")
+AC_ARG_WITH(wext, AS_HELP_STRING([--with-wext=yes], [Enable or disable Linux Wireless Extensions]), ac_with_wext=$withval, ac_with_wext="$enable_wifi")
+if test "$ac_with_wext" != 'no'; then
+ ac_with_wext='yes'
+fi
if test x"$ac_with_wext" = x"yes"; then
+ if test "$enable_wifi" != "yes"; then
+ AC_MSG_ERROR(Enabling WEXT support and disabling Wi-Fi makes no sense)
+ fi
AC_MSG_CHECKING([Linux kernel WEXT headers])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
@@ -193,20 +196,24 @@ if test "$ac_have_nl80211" = no; then
AC_MSG_ERROR(Linux kernel development header linux/nl80211.h not installed or not functional)
fi
-AC_MSG_CHECKING([Linux kernel nl80211 Critical Protocol Start/Stop])
-AC_COMPILE_IFELSE(
- [AC_LANG_PROGRAM(
- [[#ifndef __user
- #define __user
- #endif
- #include <sys/types.h>
- #include <linux/types.h>
- #include <sys/socket.h>
- #include <linux/nl80211.h>]],
- [[unsigned int a = NL80211_CMD_CRIT_PROTOCOL_START; a++;]])],
- [ac_have_nl80211_critproto=yes],
- [ac_have_nl80211_critproto=no])
-AC_MSG_RESULT($ac_have_nl80211_critproto)
+if test "$with_wifi" = "yes"; then
+ AC_MSG_CHECKING([Linux kernel nl80211 Critical Protocol Start/Stop])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#ifndef __user
+ #define __user
+ #endif
+ #include <sys/types.h>
+ #include <linux/types.h>
+ #include <sys/socket.h>
+ #include <linux/nl80211.h>]],
+ [[unsigned int a = NL80211_CMD_CRIT_PROTOCOL_START; a++;]])],
+ [ac_have_nl80211_critproto=yes],
+ [ac_have_nl80211_critproto=no])
+ AC_MSG_RESULT($ac_have_nl80211_critproto)
+else
+ ac_have_nl80211_critproto='no'
+fi
if test "$ac_have_nl80211_critproto" = yes; then
AC_DEFINE(HAVE_NL80211_CRITICAL_PROTOCOL_CMDS, 1, [Define if nl80211 has critical protocol support])
else
@@ -267,7 +274,11 @@ else
fi
AM_CONDITIONAL(HAVE_DBUS_GLIB_100, test "${have_dbus_glib_100}" = "yes")
-PKG_CHECK_MODULES(GLIB, gio-unix-2.0 >= 2.32 gmodule-2.0)
+PKG_CHECK_MODULES(GLIB, [gio-unix-2.0 >= 2.37.6 gmodule-2.0],
+ [AC_SUBST(LOG_DRIVER, '$(top_srcdir)/build-aux/tap-driver.sh'),
+ AC_SUBST(AM_TESTS_FD_REDIRECT, '--tap')],
+ [PKG_CHECK_MODULES(GLIB, gio-unix-2.0 >= 2.32 gmodule-2.0)
+ AC_SUBST(LOG_DRIVER, '$(top_srcdir)/build-aux/test-driver')])
dnl GLIB_VERSION_MIN_REQUIRED should match the version above.
dnl GLIB_VERSION_MAX_ALLOWED should be set to the same version;
@@ -428,6 +439,13 @@ else
AC_DEFINE(HAVE_KERNEL_INET6_ADDR_GEN_MODE, 0, [Define if the kernel has IN6_ADDR_GEN_MODE_*])
fi
+# IPv6 tokenized identifiers support in libnl
+AC_CHECK_LIB([nl-route-3], [rtnl_link_inet6_get_token],
+ ac_have_ipv6_token="1",
+ ac_have_ipv6_token="0")
+AC_DEFINE_UNQUOTED(HAVE_LIBNL_INET6_TOKEN,
+ $ac_have_ipv6_token, [Define if libnl has rtnl_link_inet6_get_token()])
+
# uuid library
PKG_CHECK_MODULES(UUID, uuid)
AC_SUBST(UUID_CFLAGS)
@@ -685,10 +703,10 @@ fi
if test "$with_dhcpcd" = "yes"; then
AC_PATH_PROGS(with_dhcpcd, dhcpcd, no, /sbin:/usr/sbin:/usr/local/sbin)
if test "$with_dhcpcd" != "no"; then
- if ! $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd [456789]\."; then
+ if ! $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd [[456789]]\."; then
AC_MSG_WARN([Cannot use dhcpcd, version 4.x or higher is required])
with_dhcpcd=no
- elif $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd [6789]\."; then
+ elif $with_dhcpcd --version 2>&1 | grep -q "^dhcpcd [[6789]]\."; then
AC_DEFINE(DHCPCD_SUPPORTS_IPV6, 1, [Define if dhcpcd supports IPv6 (6.x+)])
fi
fi
@@ -821,6 +839,18 @@ AM_CONDITIONAL(BUILD_NMTUI, test "$build_nmtui" = yes)
NM_COMPILER_WARNINGS
+AC_ARG_ENABLE(more-asserts,
+ AS_HELP_STRING([--enable-more-asserts], [Enable more assertions for debugging (default: no)]))
+if test "${enable_more_asserts}" = "yes"; then
+ AC_DEFINE(NM_MORE_ASSERTS, [1], [Define if more asserts are enabled])
+fi
+
+AC_ARG_ENABLE(more-logging,
+ AS_HELP_STRING([--enable-more-logging], [Enable more debug logging (default: no)]))
+if test "${enable_more_logging}" = "yes"; then
+ AC_DEFINE(NM_MORE_LOGGING, [1], [Define if more asserts are enabled])
+fi
+
AC_ARG_ENABLE(lto, AS_HELP_STRING([--enable-lto], [Enable Link Time Optimization for smaller size (default: no)]))
if (test "${enable_lto}" = "yes"); then
CFLAGS="-flto $CFLAGS"
@@ -852,8 +882,16 @@ AS_IF([test "$with_valgrind" == "yes"],
# Add conditionals and substitutions
AM_CONDITIONAL(ENABLE_TESTS, test "$enable_tests" != "no")
AM_CONDITIONAL(REQUIRE_ROOT_TESTS, test "$enable_tests" == "root")
+AC_ARG_WITH(valgrind-suppressions, AS_HELP_STRING([--with-valgrind-suppressions=path], [Use specific valgrind suppression file]))
+if test "$with_valgrind" == no; then
+ with_valgrind_suppressions=
+else
+ if test "$with_valgrind_suppressions" == ""; then
+ with_valgrind_suppressions='$(top_srcdir)/valgrind.suppressions'
+ fi
+fi
AS_IF([test "$with_valgrind" != "no"],
- AC_SUBST(VALGRIND_RULES, 'TESTS_ENVIRONMENT = "$(top_srcdir)/tools/run-test-valgrind.sh" "$(LIBTOOL)" "$(with_valgrind)" "$(top_srcdir)/valgrind.suppressions"'),
+ AC_SUBST(VALGRIND_RULES, 'LOG_COMPILER = "$(top_srcdir)/tools/run-test-valgrind.sh" "$(LIBTOOL)" "$(with_valgrind)" '"$with_valgrind_suppressions"),
AC_SUBST(VALGRIND_RULES, []))
AM_CONDITIONAL(WITH_VALGRIND, test "${with_valgrind}" != "no")
@@ -1048,6 +1086,7 @@ echo
echo "Features:"
echo " wext: $ac_with_wext"
+echo " wifi: $enable_wifi"
echo " wimax: $enable_wimax"
echo " ppp: $enable_ppp"
echo " modemmanager-1: $with_modem_manager_1"
@@ -1077,7 +1116,7 @@ echo
echo "Miscellaneous:"
echo " documentation: $enable_gtk_doc"
echo " tests: $enable_tests"
-echo " valgrind: $with_valgrind"
+echo " valgrind: $with_valgrind $with_valgrind_suppressions"
echo " code coverage: $enable_code_coverage"
echo " LTO: $enable_lto"
echo
diff --git a/data/85-nm-unmanaged.rules b/data/85-nm-unmanaged.rules
new file mode 100644
index 000000000..aefab5c46
--- /dev/null
+++ b/data/85-nm-unmanaged.rules
@@ -0,0 +1,34 @@
+# Do not modify this file, it will get overwriten on updates.
+# To override or extend the rules place a file in /etc/udev/rules.d
+
+SUBSYSTEM!="net", GOTO="nm_unmanaged_end"
+
+# Determine ID_NET_DRIVER if there's no ID_NET_DRIVER or DRIVERS (old udev?)
+ENV{ID_NET_DRIVER}=="?*", GOTO="nm_unmanaged_driver"
+DRIVERS=="?*", GOTO="nm_unmanaged_driver"
+PROGRAM="/bin/sh -c '/usr/sbin/ethtool -i $env{INTERFACE} |/bin/sed -n s/^driver:\ //p'", RESULT=="?*", ENV{ID_NET_DRIVER}="%c"
+LABEL="nm_unmanaged_driver"
+
+# VirtualBox host networking. Out-of-tree driver that looks like an ordinary
+# Ethernet. No parent device (lives in /virtual/), no support for ethtool
+# to identify the driver, MAC address defaults to 08:00:27:, but can be
+# changed. Interface name will have to do, it's always vboxnet*.
+ENV{INTERFACE}=="vboxnet[0-9]*", ENV{NM_UNMANAGED}="1"
+
+# VMWare host networking. Out-of-tree driver that looks like an ordinary
+# Ethernet. No parent device (lives in /virtual/), no support for
+# ethtool to identify the driver. They have their own MAC prefix that
+# can not be changed.
+PROGRAM="/bin/cat %S%p/address", RESULT=="00:50:56:*", ENV{INTERFACE}=="vmnet[0-9]*", ENV{NM_UNMANAGED}="1"
+
+# Parallels Workstation host networking. Out-of-tree driver that looks like
+# an ordinary Ethernet. No parent device (lives in /virtual/), no support for
+# ethtool to identify the driver and the interface name is too generic.
+# However, they have their own MAC prefix that can not be changed.
+PROGRAM="/bin/cat %S%p/address", RESULT=="00:1c:42:*", ENV{INTERFACE}=="vnic[0-9]*", ENV{NM_UNMANAGED}="1"
+
+# Virtual Ethernet device pair. Often used to communicate with a peer interface
+# in another net namespace and managed by libvirt, Docker or the like.
+ENV{ID_NET_DRIVER}=="veth", ENV{NM_UNMANAGED}="1"
+
+LABEL="nm_unmanaged_end"
diff --git a/data/Makefile.am b/data/Makefile.am
index e91361a71..64ff33763 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -34,6 +34,12 @@ endif
examplesdir = $(docdir)/examples
examples_DATA = server.conf
+if WITH_UDEV_DIR
+udevrulesdir = $(UDEV_DIR)/rules.d
+udevrules_DATA = \
+ 85-nm-unmanaged.rules
+endif
+
server.conf: server.conf.in
$(edit) $< >$@
@@ -51,6 +57,7 @@ EXTRA_DIST = \
NetworkManager-wait-online-systemd-pre200.service.in \
NetworkManager-dispatcher.service.in \
org.freedesktop.NetworkManager.service.in \
+ 85-nm-unmanaged.rules \
server.conf.in
CLEANFILES = \
diff --git a/data/Makefile.in b/data/Makefile.in
index 51aaa3a3a..89a0749ba 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -157,8 +157,10 @@ am__uninstall_files_from_dir = { \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(servicedir)" \
- "$(DESTDIR)$(systemdsystemunitdir)"
-DATA = $(examples_DATA) $(service_DATA) $(systemdsystemunit_DATA)
+ "$(DESTDIR)$(systemdsystemunitdir)" \
+ "$(DESTDIR)$(udevrulesdir)"
+DATA = $(examples_DATA) $(service_DATA) $(systemdsystemunit_DATA) \
+ $(udevrules_DATA)
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
am__DIST_COMMON = $(srcdir)/Makefile.in
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -166,6 +168,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -279,6 +282,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -432,6 +436,10 @@ with_valgrind = @with_valgrind@
@HAVE_SYSTEMD_TRUE@service_DATA = $(service_in_files:.service.in=.service)
examplesdir = $(docdir)/examples
examples_DATA = server.conf
+@WITH_UDEV_DIR_TRUE@udevrulesdir = $(UDEV_DIR)/rules.d
+@WITH_UDEV_DIR_TRUE@udevrules_DATA = \
+@WITH_UDEV_DIR_TRUE@ 85-nm-unmanaged.rules
+
edit = sed \
-e 's|@bindir[@]|$(bindir)|g' \
-e 's|@sbindir[@]|$(sbindir)|g' \
@@ -446,6 +454,7 @@ EXTRA_DIST = \
NetworkManager-wait-online-systemd-pre200.service.in \
NetworkManager-dispatcher.service.in \
org.freedesktop.NetworkManager.service.in \
+ 85-nm-unmanaged.rules \
server.conf.in
CLEANFILES = \
@@ -556,6 +565,27 @@ uninstall-systemdsystemunitDATA:
@list='$(systemdsystemunit_DATA)'; test -n "$(systemdsystemunitdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(systemdsystemunitdir)'; $(am__uninstall_files_from_dir)
+install-udevrulesDATA: $(udevrules_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(udevrulesdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(udevrulesdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(udevrulesdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(udevrulesdir)" || exit $$?; \
+ done
+
+uninstall-udevrulesDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(udevrulesdir)'; $(am__uninstall_files_from_dir)
tags TAGS:
ctags CTAGS:
@@ -597,7 +627,7 @@ check-am: all-am
check: check-am
all-am: Makefile $(DATA)
installdirs:
- for dir in "$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(servicedir)" "$(DESTDIR)$(systemdsystemunitdir)"; do \
+ for dir in "$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(servicedir)" "$(DESTDIR)$(systemdsystemunitdir)" "$(DESTDIR)$(udevrulesdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
@@ -653,7 +683,7 @@ info: info-am
info-am:
install-data-am: install-examplesDATA install-serviceDATA \
- install-systemdsystemunitDATA
+ install-systemdsystemunitDATA install-udevrulesDATA
install-dvi: install-dvi-am
@@ -698,7 +728,7 @@ ps: ps-am
ps-am:
uninstall-am: uninstall-examplesDATA uninstall-serviceDATA \
- uninstall-systemdsystemunitDATA
+ uninstall-systemdsystemunitDATA uninstall-udevrulesDATA
.MAKE: install-am install-strip
@@ -711,11 +741,12 @@ uninstall-am: uninstall-examplesDATA uninstall-serviceDATA \
install-html-am install-info install-info-am install-man \
install-pdf install-pdf-am install-ps install-ps-am \
install-serviceDATA install-strip \
- install-systemdsystemunitDATA installcheck installcheck-am \
- installdirs maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
- ps ps-am tags-am uninstall uninstall-am uninstall-examplesDATA \
- uninstall-serviceDATA uninstall-systemdsystemunitDATA
+ install-systemdsystemunitDATA install-udevrulesDATA \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-examplesDATA uninstall-serviceDATA \
+ uninstall-systemdsystemunitDATA uninstall-udevrulesDATA
.PRECIOUS: Makefile
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 367eedba2..6d65e5960 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -195,6 +195,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -308,6 +309,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/docs/api/Makefile.in b/docs/api/Makefile.in
index 162643b5e..891f0402a 100644
--- a/docs/api/Makefile.in
+++ b/docs/api/Makefile.in
@@ -145,6 +145,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -258,6 +259,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -455,6 +457,7 @@ GPATH = $(srcdir)
TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
SETUP_FILES = \
$(content_files) \
+ $(expand_content_files) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE)-sections.txt \
$(DOC_MODULE)-overrides.txt
@@ -463,9 +466,9 @@ SETUP_FILES = \
####################################
EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in \
settings-spec.xsl $(GENERATED_FILES)
-DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
@@ -501,11 +504,6 @@ GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V))
GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects";
-#### templates ####
-GTK_DOC_V_TMPL = $(GTK_DOC_V_TMPL_$(V))
-GTK_DOC_V_TMPL_ = $(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY))
-GTK_DOC_V_TMPL_0 = @echo " DOC Rebuilding template files";
-
#### xml ####
GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V))
GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
@@ -755,18 +753,15 @@ $(REPORT_FILES): sgml-build.stamp
setup-build.stamp:
-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
if test "x$$files" != "x" ; then \
for file in $$files ; do \
- destdir=`dirname $(abs_builddir)/$$file` ;\
+ destdir=`dirname $(abs_builddir)/$$file`; \
test -d "$$destdir" || mkdir -p "$$destdir"; \
test -f $(abs_srcdir)/$$file && \
cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -pR $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
$(AM_V_at)touch setup-build.stamp
@@ -779,7 +774,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
scanobj_options=""; \
gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
scanobj_options="--verbose"; \
fi; \
@@ -796,23 +791,8 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -pR $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- $(AM_V_at)touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
- -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+ $(GTK_DOC_V_XML)_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
done ; \
@@ -822,17 +802,17 @@ sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(
sgml.stamp: sgml-build.stamp
@true
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
mkhtml_options=""; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkhtml_options="$$mkhtml_options --verbose"; \
fi; \
fi; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
fi; \
cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -848,11 +828,11 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
$(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
$(AM_V_at)touch html-build.stamp
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
mkpdf_options=""; \
gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkpdf_options="$$mkpdf_options --verbose"; \
fi; \
@@ -877,13 +857,15 @@ clean-local:
@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
rm -f $(DOC_MODULE).types; \
fi
+ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+ rm -f $(DOC_MODULE)-sections.txt; \
+ fi
distclean-local:
@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
+ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
fi
maintainer-clean-local:
@@ -930,9 +912,7 @@ uninstall-local:
@HAVE_GTK_DOC_FALSE@ @false
dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
diff --git a/docs/api/html/NetworkManager.devhelp2 b/docs/api/html/NetworkManager.devhelp2
index 794217266..112d96868 100644
--- a/docs/api/html/NetworkManager.devhelp2
+++ b/docs/api/html/NetworkManager.devhelp2
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<book xmlns="http://www.devhelp.net/book" title="NetworkManager D-Bus Reference Manual" link="index.html" author="" name="NetworkManager" version="2" language="c">
<chapters>
<sub name="D-Bus API Reference" link="ref-dbus.html"/>
diff --git a/docs/api/html/index.html b/docs/api/html/index.html
index b227e2eee..c2c59933b 100644
--- a/docs/api/html/index.html
+++ b/docs/api/html/index.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="next" href="ref-dbus.html" title="D-Bus API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -14,7 +14,7 @@
<div class="titlepage">
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">NetworkManager D-Bus Reference Manual</p></th></tr></table></div>
-<div><p class="releaseinfo">Version 1.0.2
+<div><p class="releaseinfo">Version 1.0.4
</p></div>
<div><p class="copyright">Copyright © 2012 The NetworkManager Authors</p></div>
<div><div class="legalnotice">
@@ -72,7 +72,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/ix01.html b/docs/api/html/ix01.html
index d2c5a3872..54a8424f3 100644
--- a/docs/api/html/ix01.html
+++ b/docs/api/html/ix01.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>NetworkManager D-Bus Reference Manual: Index</title>
+<title>Index: NetworkManager D-Bus Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="up" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="prev" href="ref-migrating.html" title="Migrating from NetworkManager 0.8 to NetworkManager 0.9">
<link rel="next" href="license.html" title="Appendix A. License">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -25,7 +25,6 @@
<div class="index"></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/license.html b/docs/api/html/license.html
index bd0637818..b7944bba6 100644
--- a/docs/api/html/license.html
+++ b/docs/api/html/license.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>NetworkManager D-Bus Reference Manual: Appendix A. License</title>
+<title>Appendix A. License: NetworkManager D-Bus Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="up" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="prev" href="ix01.html" title="Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -379,7 +379,6 @@ Public License instead of this License.
</p>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/ref-dbus.html b/docs/api/html/ref-dbus.html
index 8bc3817f8..8a0b56c7d 100644
--- a/docs/api/html/ref-dbus.html
+++ b/docs/api/html/ref-dbus.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>NetworkManager D-Bus Reference Manual: D-Bus API Reference</title>
+<title>D-Bus API Reference: NetworkManager D-Bus Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="up" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="prev" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="next" href="ref-settings.html" title="Network Configuration Setting Specification">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -29,7 +29,6 @@
<a class="ulink" href="spec.html" target="_top">spec.html</a>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/ref-migrating.html b/docs/api/html/ref-migrating.html
index 02fcb5884..34f90ebbe 100644
--- a/docs/api/html/ref-migrating.html
+++ b/docs/api/html/ref-migrating.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>NetworkManager D-Bus Reference Manual: Migrating from NetworkManager 0.8 to NetworkManager 0.9</title>
+<title>Migrating from NetworkManager 0.8 to NetworkManager 0.9: NetworkManager D-Bus Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="up" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="prev" href="secrets-flags.html" title="Secret flag types">
<link rel="next" href="ix01.html" title="Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -535,7 +535,6 @@
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/ref-settings.html b/docs/api/html/ref-settings.html
index 6fca6945d..10405a35e 100644
--- a/docs/api/html/ref-settings.html
+++ b/docs/api/html/ref-settings.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>NetworkManager D-Bus Reference Manual: Network Configuration Setting Specification</title>
+<title>Network Configuration Setting Specification: NetworkManager D-Bus Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="up" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="prev" href="ref-dbus.html" title="D-Bus API Reference">
<link rel="next" href="secrets-flags.html" title="Secret flag types">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -248,7 +248,7 @@
<td><pre class="screen">system-ca-certs</pre></td>
<td><pre class="screen">boolean</pre></td>
<td><pre class="screen">FALSE</pre></td>
-<td>When TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties.</td>
+<td>When TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides "ca-cert" and "phase2-ca-cert" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).</td>
</tr>
</tbody>
</table></div>
@@ -595,6 +595,12 @@
<td>The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority.</td>
</tr>
<tr>
+<td><pre class="screen">autoconnect-slaves</pre></td>
+<td><pre class="screen">NMSettingConnectionAutoconnectSlaves (int32)</pre></td>
+<td><pre class="screen"></pre></td>
+<td>Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0.</td>
+</tr>
+<tr>
<td><pre class="screen">gateway-ping-timeout</pre></td>
<td><pre class="screen">uint32</pre></td>
<td><pre class="screen">0</pre></td>
@@ -1148,7 +1154,7 @@
<td><pre class="screen">ip6-privacy</pre></td>
<td><pre class="screen">NMSettingIP6ConfigPrivacy (int32)</pre></td>
<td><pre class="screen"></pre></td>
-<td>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses).</td>
+<td>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to "-1" (unknown) means fallback to global configuration "ipv6.ip6-privacy". If also global configuration is unspecified or set to "-1", fallback to read "/proc/sys/net/ipv6/conf/default/use_tempaddr".</td>
</tr>
<tr>
<td><pre class="screen">may-fail</pre></td>
@@ -2039,7 +2045,6 @@
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/secrets-flags.html b/docs/api/html/secrets-flags.html
index 2b27c7f89..bb727419d 100644
--- a/docs/api/html/secrets-flags.html
+++ b/docs/api/html/secrets-flags.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>NetworkManager D-Bus Reference Manual: Secret flag types</title>
+<title>Secret flag types: NetworkManager D-Bus Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="NetworkManager D-Bus Reference Manual">
<link rel="up" href="ref-settings.html" title="Network Configuration Setting Specification">
<link rel="prev" href="ref-settings.html" title="Network Configuration Setting Specification">
<link rel="next" href="ref-migrating.html" title="Migrating from NetworkManager 0.8 to NetworkManager 0.9">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -58,7 +58,6 @@
</p>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/api/html/spec.html b/docs/api/html/spec.html
index f7992202d..bcd634dd7 100644
--- a/docs/api/html/spec.html
+++ b/docs/api/html/spec.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ascii" /><title>NetworkManager D-Bus Interface Specification version 1.0.2</title><style type="text/css">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ascii" /><title>NetworkManager D-Bus Interface Specification version 1.0.4</title><style type="text/css">
body {
font-family: sans-serif;
@@ -97,7 +97,7 @@
margin-right: 4em;
}
- </style></head><body><h1 class="topbox">NetworkManager D-Bus Interface Specification</h1><h2>Version 1.0.2</h2><div>Copyright (C) 2008 - 2011 Red Hat, Inc.</div><div>Copyright (C) 2008 - 2009 Novell, Inc.</div><div class="license">
+ </style></head><body><h1 class="topbox">NetworkManager D-Bus Interface Specification</h1><h2>Version 1.0.4</h2><div>Copyright (C) 2008 - 2011 Red Hat, Inc.</div><div>Copyright (C) 2008 - 2009 Novell, Inc.</div><div class="license">
<p>This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
@@ -811,6 +811,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</
Modem now ready and available.
</dd><dt><code>NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT = 59</code></dt><dd>
The SIM PIN was incorrect.
+ </dd><dt><code>NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60</code></dt><dd>
+ A new connection activation was enqueued.
+ </dd><dt><code>NM_DEVICE_STATE_REASON_PARENT_CHANGED = 61</code></dt><dd>
+ The device's parent changed.
+ </dd><dt><code>NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED = 62</code></dt><dd>
+ The device parent's management changed.
</dd></dl><h2>Sets of flags:</h2><h3 xmlns=""><a name="type-NM_DEVICE_CAP" id="type-NM_DEVICE_CAP">NM_DEVICE_CAP</a></h3><dl><dt><code>NM_DEVICE_CAP_NONE = 0x0</code></dt><dd>Null capability.</dd><dt><code>NM_DEVICE_CAP_NM_SUPPORTED = 0x1</code></dt><dd>The device is supported by NetworkManager.</dd><dt><code>NM_DEVICE_CAP_CARRIER_DETECT = 0x2</code></dt><dd>The device supports carrier detection.</dd></dl><h2>Structure types:</h2><div class="struct"><h3><a name="type-NM_DEVICE_STATE_REASON_STRUCT" id="type-NM_DEVICE_STATE_REASON_STRUCT">NM_DEVICE_STATE_REASON_STRUCT</a> - (
u: state, u: reason
)
diff --git a/docs/api/html/style.css b/docs/api/html/style.css
index c141ddd29..367542097 100644
--- a/docs/api/html/style.css
+++ b/docs/api/html/style.css
@@ -60,7 +60,7 @@ a:hover
div.informaltable table
{
border-collapse: separate;
- border-spacing: 1em 0.5em;
+ border-spacing: 1em 0.3em;
border: none;
}
@@ -148,6 +148,8 @@ div.table table th
h4
{
color: #555753;
+ margin-top: 1em;
+ margin-bottom: 1em;
}
hr
@@ -166,17 +168,16 @@ dl.toc dt
padding-bottom: 0.25em;
}
-dl.toc > dd > dl > dt
+dl.toc > dt
{
padding-top: 0.25em;
padding-bottom: 0.25em;
+ font-weight: bold;
}
-dl.toc > dt
+dl.toc > dl
{
- padding-top: 1em;
padding-bottom: 0.5em;
- font-weight: bold;
}
.parameter
@@ -346,7 +347,9 @@ acronym,abbr
}
@media screen {
- sup a.footnote
+ /* these have a <sup> as a first child, but since there are no parent selectors
+ * we can't use that. */
+ a.footnote
{
position: relative;
top: 0em ! important;
diff --git a/docs/api/settings-spec.xml b/docs/api/settings-spec.xml
index abf8fde1e..f1b507fe0 100644
--- a/docs/api/settings-spec.xml
+++ b/docs/api/settings-spec.xml
@@ -34,7 +34,7 @@
<row><entry><screen>private-key-password</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>The password used to decrypt the private key specified in the "private-key" property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key.</entry></row>
<row><entry><screen>private-key-password-flags</screen></entry><entry><screen>NMSettingSecretFlags (uint32)</screen></entry><entry><screen/></entry><entry>Flags indicating how to handle the "private-key-password" property.</entry></row>
<row><entry><screen>subject-match</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>Substring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed.</entry></row>
- <row><entry><screen>system-ca-certs</screen></entry><entry><screen>boolean</screen></entry><entry><screen>FALSE</screen></entry><entry>When TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties.</entry></row>
+ <row><entry><screen>system-ca-certs</screen></entry><entry><screen>boolean</screen></entry><entry><screen>FALSE</screen></entry><entry>When TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides "ca-cert" and "phase2-ca-cert" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).</entry></row>
</tbody></tgroup></table></para>
<para><table><title>adsl setting</title><tgroup cols="4"><thead><row><entry>Key Name</entry><entry>Value Type</entry><entry>Default Value</entry><entry>Value Description</entry></row></thead><tbody>
<row><entry><screen>encapsulation</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>Encapsulation of ADSL connection. Can be "vcmux" or "llc".</entry></row>
@@ -83,6 +83,7 @@
<para><table><title>connection setting</title><tgroup cols="4"><thead><row><entry>Key Name</entry><entry>Value Type</entry><entry>Default Value</entry><entry>Value Description</entry></row></thead><tbody>
<row><entry><screen>autoconnect</screen></entry><entry><screen>boolean</screen></entry><entry><screen>TRUE</screen></entry><entry>Whether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection.</entry></row>
<row><entry><screen>autoconnect-priority</screen></entry><entry><screen>int32</screen></entry><entry><screen>0</screen></entry><entry>The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority.</entry></row>
+ <row><entry><screen>autoconnect-slaves</screen></entry><entry><screen>NMSettingConnectionAutoconnectSlaves (int32)</screen></entry><entry><screen/></entry><entry>Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0.</entry></row>
<row><entry><screen>gateway-ping-timeout</screen></entry><entry><screen>uint32</screen></entry><entry><screen>0</screen></entry><entry>If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping.</entry></row>
<row><entry><screen>id</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>A human readable unique identifier for the connection, like "Work Wi-Fi" or "T-Mobile 3G".</entry></row>
<row><entry><screen>interface-name</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface.</entry></row>
@@ -167,7 +168,7 @@
<row><entry><screen>gateway</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>The gateway associated with this configuration. This is only meaningful if "addresses" is also set.</entry></row>
<row><entry><screen>ignore-auto-dns</screen></entry><entry><screen>boolean</screen></entry><entry><screen>FALSE</screen></entry><entry>When "method" is set to "auto" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the "dns" and "dns-search" properties, if any, are used.</entry></row>
<row><entry><screen>ignore-auto-routes</screen></entry><entry><screen>boolean</screen></entry><entry><screen>FALSE</screen></entry><entry>When "method" is set to "auto" and this property to TRUE, automatically configured routes are ignored and only routes specified in the "routes" property, if any, are used.</entry></row>
- <row><entry><screen>ip6-privacy</screen></entry><entry><screen>NMSettingIP6ConfigPrivacy (int32)</screen></entry><entry><screen/></entry><entry>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses).</entry></row>
+ <row><entry><screen>ip6-privacy</screen></entry><entry><screen>NMSettingIP6ConfigPrivacy (int32)</screen></entry><entry><screen/></entry><entry>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to "-1" (unknown) means fallback to global configuration "ipv6.ip6-privacy". If also global configuration is unspecified or set to "-1", fallback to read "/proc/sys/net/ipv6/conf/default/use_tempaddr".</entry></row>
<row><entry><screen>may-fail</screen></entry><entry><screen>boolean</screen></entry><entry><screen>TRUE</screen></entry><entry>If TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully.</entry></row>
<row><entry><screen>method</screen></entry><entry><screen>string</screen></entry><entry><screen/></entry><entry>IP configuration method. NMSettingIP4Config and NMSettingIP6Config both support "auto", "manual", and "link-local". See the subclass-specific documentation for other values. In general, for the "auto" method, properties such as "dns" and "routes" specify information that is added on to the information returned from automatic configuration. The "ignore-auto-routes" and "ignore-auto-dns" properties modify this behavior. For methods that imply no upstream network, such as "shared" or "link-local", these properties must be empty.</entry></row>
<row><entry><screen>name</screen></entry><entry><screen>string</screen></entry><entry><screen>ipv6</screen></entry><entry>The setting's name, which uniquely identifies the setting within the connection. Each setting type has a name unique to that type, for example "ppp" or "wireless" or "wired".</entry></row>
diff --git a/docs/api/spec.html b/docs/api/spec.html
index f7992202d..bcd634dd7 100644
--- a/docs/api/spec.html
+++ b/docs/api/spec.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ascii" /><title>NetworkManager D-Bus Interface Specification version 1.0.2</title><style type="text/css">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ascii" /><title>NetworkManager D-Bus Interface Specification version 1.0.4</title><style type="text/css">
body {
font-family: sans-serif;
@@ -97,7 +97,7 @@
margin-right: 4em;
}
- </style></head><body><h1 class="topbox">NetworkManager D-Bus Interface Specification</h1><h2>Version 1.0.2</h2><div>Copyright (C) 2008 - 2011 Red Hat, Inc.</div><div>Copyright (C) 2008 - 2009 Novell, Inc.</div><div class="license">
+ </style></head><body><h1 class="topbox">NetworkManager D-Bus Interface Specification</h1><h2>Version 1.0.4</h2><div>Copyright (C) 2008 - 2011 Red Hat, Inc.</div><div>Copyright (C) 2008 - 2009 Novell, Inc.</div><div class="license">
<p>This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
@@ -811,6 +811,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</
Modem now ready and available.
</dd><dt><code>NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT = 59</code></dt><dd>
The SIM PIN was incorrect.
+ </dd><dt><code>NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60</code></dt><dd>
+ A new connection activation was enqueued.
+ </dd><dt><code>NM_DEVICE_STATE_REASON_PARENT_CHANGED = 61</code></dt><dd>
+ The device's parent changed.
+ </dd><dt><code>NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED = 62</code></dt><dd>
+ The device parent's management changed.
</dd></dl><h2>Sets of flags:</h2><h3 xmlns=""><a name="type-NM_DEVICE_CAP" id="type-NM_DEVICE_CAP">NM_DEVICE_CAP</a></h3><dl><dt><code>NM_DEVICE_CAP_NONE = 0x0</code></dt><dd>Null capability.</dd><dt><code>NM_DEVICE_CAP_NM_SUPPORTED = 0x1</code></dt><dd>The device is supported by NetworkManager.</dd><dt><code>NM_DEVICE_CAP_CARRIER_DETECT = 0x2</code></dt><dd>The device supports carrier detection.</dd></dl><h2>Structure types:</h2><div class="struct"><h3><a name="type-NM_DEVICE_STATE_REASON_STRUCT" id="type-NM_DEVICE_STATE_REASON_STRUCT">NM_DEVICE_STATE_REASON_STRUCT</a> - (
u: state, u: reason
)
diff --git a/docs/api/tmpl/NetworkManager-unused.sgml b/docs/api/tmpl/NetworkManager-unused.sgml
deleted file mode 100644
index e69de29bb..000000000
--- a/docs/api/tmpl/NetworkManager-unused.sgml
+++ /dev/null
diff --git a/docs/api/version.xml b/docs/api/version.xml
index 6d7de6e6a..ee90284c2 100644
--- a/docs/api/version.xml
+++ b/docs/api/version.xml
@@ -1 +1 @@
-1.0.2
+1.0.4
diff --git a/docs/libnm-glib/Makefile.in b/docs/libnm-glib/Makefile.in
index 796e69f20..8c0dbdcee 100644
--- a/docs/libnm-glib/Makefile.in
+++ b/docs/libnm-glib/Makefile.in
@@ -142,6 +142,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -255,6 +256,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -480,6 +482,7 @@ GPATH = $(srcdir)
TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
SETUP_FILES = \
$(content_files) \
+ $(expand_content_files) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE)-sections.txt \
$(DOC_MODULE)-overrides.txt
@@ -487,9 +490,9 @@ SETUP_FILES = \
# include common portion ...
EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
-DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
@@ -524,11 +527,6 @@ GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V))
GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects";
-#### templates ####
-GTK_DOC_V_TMPL = $(GTK_DOC_V_TMPL_$(V))
-GTK_DOC_V_TMPL_ = $(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY))
-GTK_DOC_V_TMPL_0 = @echo " DOC Rebuilding template files";
-
#### xml ####
GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V))
GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
@@ -765,18 +763,15 @@ $(REPORT_FILES): sgml-build.stamp
setup-build.stamp:
-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
if test "x$$files" != "x" ; then \
for file in $$files ; do \
- destdir=`dirname $(abs_builddir)/$$file` ;\
+ destdir=`dirname $(abs_builddir)/$$file`; \
test -d "$$destdir" || mkdir -p "$$destdir"; \
test -f $(abs_srcdir)/$$file && \
cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -pR $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
$(AM_V_at)touch setup-build.stamp
@@ -789,7 +784,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
scanobj_options=""; \
gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
scanobj_options="--verbose"; \
fi; \
@@ -806,23 +801,8 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -pR $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- $(AM_V_at)touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
- -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+ $(GTK_DOC_V_XML)_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
done ; \
@@ -832,17 +812,17 @@ sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(
sgml.stamp: sgml-build.stamp
@true
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
mkhtml_options=""; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkhtml_options="$$mkhtml_options --verbose"; \
fi; \
fi; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
fi; \
cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -858,11 +838,11 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
$(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
$(AM_V_at)touch html-build.stamp
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
mkpdf_options=""; \
gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkpdf_options="$$mkpdf_options --verbose"; \
fi; \
@@ -887,13 +867,15 @@ clean-local:
@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
rm -f $(DOC_MODULE).types; \
fi
+ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+ rm -f $(DOC_MODULE)-sections.txt; \
+ fi
distclean-local:
@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
+ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
fi
maintainer-clean-local:
@@ -940,9 +922,7 @@ uninstall-local:
@HAVE_GTK_DOC_FALSE@ @false
dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
diff --git a/docs/libnm-glib/html/NMAccessPoint.html b/docs/libnm-glib/html/NMAccessPoint.html
index e0e5660a2..9182a27a7 100644
--- a/docs/libnm-glib/html/NMAccessPoint.html
+++ b/docs/libnm-glib/html/NMAccessPoint.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMAccessPoint</title>
+<title>NMAccessPoint: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMWimaxNsp.html" title="NMWimaxNsp">
<link rel="next" href="NMIP4Config.html" title="NMIP4Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -270,8 +270,6 @@
</div>
<div class="refsect1">
<a name="NMAccessPoint.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMAccessPoint.functions_details"></a><h2>Functions</h2>
@@ -333,7 +331,6 @@ nm_access_point_get_flags (<em class="parameter"><code><a class="link" href="NMA
<div class="refsect3">
<a name="id-1.3.19.8.3.6"></a><h4>Returns</h4>
<p> the flags</p>
-<p></p>
</div>
</div>
<hr>
@@ -360,7 +357,6 @@ nm_access_point_get_wpa_flags (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.3.19.8.4.6"></a><h4>Returns</h4>
<p> the WPA flags</p>
-<p></p>
</div>
</div>
<hr>
@@ -388,7 +384,6 @@ point.</p>
<div class="refsect3">
<a name="id-1.3.19.8.5.6"></a><h4>Returns</h4>
<p> the RSN flags</p>
-<p></p>
</div>
</div>
<hr>
@@ -416,7 +411,6 @@ nm_access_point_get_ssid (<em class="parameter"><code><a class="link" href="NMAc
<a name="id-1.3.19.8.6.6"></a><h4>Returns</h4>
<p> the <span class="type">GByteArray</span> containing the SSID. This is the internal copy used by the
access point, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -444,7 +438,6 @@ nm_access_point_get_bssid (<em class="parameter"><code><a class="link" href="NMA
<a name="id-1.3.19.8.7.6"></a><h4>Returns</h4>
<p> the BSSID of the access point. This is an internal string and must
not be modified or freed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -471,7 +464,6 @@ nm_access_point_get_frequency (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.3.19.8.8.6"></a><h4>Returns</h4>
<p> the frequency</p>
-<p></p>
</div>
</div>
<hr>
@@ -498,7 +490,6 @@ nm_access_point_get_mode (<em class="parameter"><code><a class="link" href="NMAc
<div class="refsect3">
<a name="id-1.3.19.8.9.6"></a><h4>Returns</h4>
<p> the mode</p>
-<p></p>
</div>
</div>
<hr>
@@ -525,7 +516,6 @@ nm_access_point_get_max_bitrate (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.3.19.8.10.6"></a><h4>Returns</h4>
<p> the maximum bit rate (kbit/s)</p>
-<p></p>
</div>
</div>
<hr>
@@ -552,7 +542,6 @@ nm_access_point_get_strength (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.3.19.8.11.6"></a><h4>Returns</h4>
<p> the signal strength</p>
-<p></p>
</div>
</div>
<hr>
@@ -643,7 +632,6 @@ against</p></td>
<a name="id-1.3.19.8.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this Wi-Fi AP,
<code class="literal">FALSE</code> if it cannot be.</p>
-<p></p>
</div>
</div>
<hr>
@@ -675,7 +663,6 @@ nm_access_point_get_hw_address (<em class="parameter"><code><a class="link" href
<a name="id-1.3.19.8.14.7"></a><h4>Returns</h4>
<p> the hardware address of the access point. This is the internal string used by the
access point and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -685,80 +672,60 @@ access point and must not be modified.</p>
<a name="NM-ACCESS-POINT-FLAGS:CAPS"></a><h3>NM_ACCESS_POINT_FLAGS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_FLAGS "flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-WPA-FLAGS:CAPS"></a><h3>NM_ACCESS_POINT_WPA_FLAGS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_WPA_FLAGS "wpa-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-RSN-FLAGS:CAPS"></a><h3>NM_ACCESS_POINT_RSN_FLAGS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_RSN_FLAGS "rsn-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-SSID:CAPS"></a><h3>NM_ACCESS_POINT_SSID</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_SSID "ssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-BSSID:CAPS"></a><h3>NM_ACCESS_POINT_BSSID</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_BSSID "bssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-FREQUENCY:CAPS"></a><h3>NM_ACCESS_POINT_FREQUENCY</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_FREQUENCY "frequency"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-MODE:CAPS"></a><h3>NM_ACCESS_POINT_MODE</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-MAX-BITRATE:CAPS"></a><h3>NM_ACCESS_POINT_MAX_BITRATE</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_MAX_BITRATE "max-bitrate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-STRENGTH:CAPS"></a><h3>NM_ACCESS_POINT_STRENGTH</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_STRENGTH "strength"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-HW-ADDRESS:CAPS"></a><h3>NM_ACCESS_POINT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -766,7 +733,7 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--bssid"></a><h3>The <code class="literal">“bssid”</code> property</h3>
<pre class="programlisting"> “bssid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The BSSID of the access point.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -774,7 +741,7 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--flags"></a><h3>The <code class="literal">“flags”</code> property</h3>
<pre class="programlisting"> “flags” <span class="type">guint</span></pre>
-<p></p>
+<p>The flags of the access point.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 1</p>
<p>Default value: 0</p>
@@ -783,7 +750,7 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--frequency"></a><h3>The <code class="literal">“frequency”</code> property</h3>
<pre class="programlisting"> “frequency” <span class="type">guint</span></pre>
-<p></p>
+<p>The frequency of the access point.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 10000</p>
<p>Default value: 0</p>
@@ -792,7 +759,7 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware address of the access point.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -800,7 +767,7 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--max-bitrate"></a><h3>The <code class="literal">“max-bitrate”</code> property</h3>
<pre class="programlisting"> “max-bitrate” <span class="type">guint</span></pre>
-<p></p>
+<p>The maximum bit rate of the access point in kbit/s.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -808,7 +775,9 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
<pre class="programlisting"> “mode” <span class="type">guint</span></pre>
-<p></p>
+<p>The mode of the access point; either "infrastructure" (a central
+coordinator of the wireless network allowing clients to connect) or
+"ad-hoc" (a network with no central controller).</p>
<p>Flags: Read</p>
<p>Allowed values: [1,2]</p>
<p>Default value: 2</p>
@@ -817,7 +786,7 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--rsn-flags"></a><h3>The <code class="literal">“rsn-flags”</code> property</h3>
<pre class="programlisting"> “rsn-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>The RSN flags of the access point.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -825,14 +794,14 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--ssid"></a><h3>The <code class="literal">“ssid”</code> property</h3>
<pre class="programlisting"> “ssid” <span class="type">NMSsid</span> *</pre>
-<p></p>
+<p>The SSID of the access point.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMAccessPoint--strength"></a><h3>The <code class="literal">“strength”</code> property</h3>
<pre class="programlisting"> “strength” <span class="type">guchar</span></pre>
-<p></p>
+<p>The current signal strength of the access point.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -840,14 +809,13 @@ access point and must not be modified.</p>
<div class="refsect2">
<a name="NMAccessPoint--wpa-flags"></a><h3>The <code class="literal">“wpa-flags”</code> property</h3>
<pre class="programlisting"> “wpa-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>The WPA flags of the access point.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMActiveConnection.html b/docs/libnm-glib/html/NMActiveConnection.html
index d5f1b381f..51037dca3 100644
--- a/docs/libnm-glib/html/NMActiveConnection.html
+++ b/docs/libnm-glib/html/NMActiveConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMActiveConnection</title>
+<title>NMActiveConnection: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMClient.html" title="NMClient">
<link rel="next" href="NMDevice.html" title="NMDevice">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -344,8 +344,6 @@
</div>
<div class="refsect1">
<a name="NMActiveConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMActiveConnection.functions_details"></a><h2>Functions</h2>
@@ -411,7 +409,6 @@ nm_active_connection_get_connection (<em class="parameter"><code><a class="link"
<p> the object path of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> which this <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>
is an active instance of. This is the internal string used by the
connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -439,9 +436,8 @@ nm_active_connection_get_id (<em class="parameter"><code><a class="link" href="N
<a name="id-1.3.3.8.4.6"></a><h4>Returns</h4>
<p> the ID of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> that backs the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -468,7 +464,6 @@ nm_active_connection_get_uuid (<em class="parameter"><code><a class="link" href=
<a name="id-1.3.3.8.5.6"></a><h4>Returns</h4>
<p> the UUID of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> that backs the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -497,9 +492,8 @@ nm_active_connection_get_connection_type
<a name="id-1.3.3.8.6.6"></a><h4>Returns</h4>
<p> the type of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> that backs the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -527,7 +521,6 @@ nm_active_connection_get_specific_object
<a name="id-1.3.3.8.7.6"></a><h4>Returns</h4>
<p> the specific object's DBus path. This is the internal string used by the
connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -582,7 +575,6 @@ nm_active_connection_get_state (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.3.3.8.9.6"></a><h4>Returns</h4>
<p> the state</p>
-<p></p>
</div>
</div>
<hr>
@@ -610,7 +602,6 @@ nm_active_connection_get_master (<em class="parameter"><code><a class="link" hre
<a name="id-1.3.3.8.10.6"></a><h4>Returns</h4>
<p> the path of the master <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> of the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -638,7 +629,6 @@ the default IPv4 route and DNS information).</p>
<div class="refsect3">
<a name="id-1.3.3.8.11.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the active connection is the default IPv4 connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -665,11 +655,11 @@ nm_active_connection_get_ip4_config (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.3.8.12.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMIP4Config.html" title="NMIP4Config"><span class="type">NMIP4Config</span></a>, or <code class="literal">NULL</code> if the
-connection is not in the <code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code>
+connection is not in the <a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS"><code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code></a>
state. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -697,10 +687,10 @@ nm_active_connection_get_dhcp4_config (<em class="parameter"><code><a class="lin
<a name="id-1.3.3.8.13.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMDHCP4Config.html" title="NMDHCP4Config"><span class="type">NMDHCP4Config</span></a>, or <code class="literal">NULL</code> if the
connection does not use DHCP, or is not in the
-<code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code> state. </p>
+<a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS"><code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code></a> state. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -727,7 +717,6 @@ the default IPv6 route and DNS information).</p>
<div class="refsect3">
<a name="id-1.3.3.8.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the active connection is the default IPv6 connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -754,11 +743,11 @@ nm_active_connection_get_ip6_config (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.3.8.15.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMIP6Config.html" title="NMIP6Config"><span class="type">NMIP6Config</span></a>, or <code class="literal">NULL</code> if the
-connection is not in the <code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code>
+connection is not in the <a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS"><code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code></a>
state. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -786,10 +775,10 @@ nm_active_connection_get_dhcp6_config (<em class="parameter"><code><a class="lin
<a name="id-1.3.3.8.16.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMDHCP6Config.html" title="NMDHCP6Config"><span class="type">NMDHCP6Config</span></a>, or <code class="literal">NULL</code> if the
connection does not use DHCPv6, or is not in the
-<code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code> state. </p>
+<a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS"><code class="literal">NM_ACTIVE_CONNECTION_STATE_ACTIVATED</code></a> state. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -815,9 +804,8 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.3.3.8.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the active connection is a VPN connection</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -826,120 +814,90 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<a name="NM-ACTIVE-CONNECTION-CONNECTION:CAPS"></a><h3>NM_ACTIVE_CONNECTION_CONNECTION</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_CONNECTION "connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-ID:CAPS"></a><h3>NM_ACTIVE_CONNECTION_ID</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_ID "id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-UUID:CAPS"></a><h3>NM_ACTIVE_CONNECTION_UUID</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_UUID "uuid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-TYPE:CAPS"></a><h3>NM_ACTIVE_CONNECTION_TYPE</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_TYPE "type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-SPECIFIC-OBJECT:CAPS"></a><h3>NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT "specific-object"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DEVICES:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DEVICES</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DEVICES "devices"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-STATE:CAPS"></a><h3>NM_ACTIVE_CONNECTION_STATE</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DEFAULT:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DEFAULT</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DEFAULT "default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-IP4-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DHCP4-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DHCP4_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DEFAULT6:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DEFAULT6</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DEFAULT6 "default6"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-IP6-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_IP6_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_IP6_CONFIG "ip6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DHCP6-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DHCP6_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DHCP6_CONFIG "dhcp6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-VPN:CAPS"></a><h3>NM_ACTIVE_CONNECTION_VPN</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_VPN "vpn"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-MASTER:CAPS"></a><h3>NM_ACTIVE_CONNECTION_MASTER</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_MASTER "master"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -947,7 +905,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--connection"></a><h3>The <code class="literal">“connection”</code> property</h3>
<pre class="programlisting"> “connection” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The connection's path of the active connection.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -955,7 +913,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--default"></a><h3>The <code class="literal">“default”</code> property</h3>
<pre class="programlisting"> “default” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the active connection is the default IPv4 one.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -963,7 +921,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--default6"></a><h3>The <code class="literal">“default6”</code> property</h3>
<pre class="programlisting"> “default6” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the active connection is the default IPv6 one.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -971,55 +929,54 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--devices"></a><h3>The <code class="literal">“devices”</code> property</h3>
<pre class="programlisting"> “devices” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--dhcp4-config"></a><h3>The <code class="literal">“dhcp4-config”</code> property</h3>
<pre class="programlisting"> “dhcp4-config” <a class="link" href="NMDHCP4Config.html" title="NMDHCP4Config"><span class="type">NMDHCP4Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMDHCP4Config.html" title="NMDHCP4Config"><span class="type">NMDHCP4Config</span></a> of the connection.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--dhcp6-config"></a><h3>The <code class="literal">“dhcp6-config”</code> property</h3>
<pre class="programlisting"> “dhcp6-config” <a class="link" href="NMDHCP6Config.html" title="NMDHCP6Config"><span class="type">NMDHCP6Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMDHCP6Config.html" title="NMDHCP6Config"><span class="type">NMDHCP6Config</span></a> of the connection.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--id"></a><h3>The <code class="literal">“id”</code> property</h3>
<pre class="programlisting"> “id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active connection's ID</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--ip4-config"></a><h3>The <code class="literal">“ip4-config”</code> property</h3>
<pre class="programlisting"> “ip4-config” <a class="link" href="NMIP4Config.html" title="NMIP4Config"><span class="type">NMIP4Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMIP4Config.html" title="NMIP4Config"><span class="type">NMIP4Config</span></a> of the connection.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--ip6-config"></a><h3>The <code class="literal">“ip6-config”</code> property</h3>
<pre class="programlisting"> “ip6-config” <a class="link" href="NMIP6Config.html" title="NMIP6Config"><span class="type">NMIP6Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMIP6Config.html" title="NMIP6Config"><span class="type">NMIP6Config</span></a> of the connection.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--master"></a><h3>The <code class="literal">“master”</code> property</h3>
<pre class="programlisting"> “master” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The path of the master device if one exists.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -1027,7 +984,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--specific-object"></a><h3>The <code class="literal">“specific-object”</code> property</h3>
<pre class="programlisting"> “specific-object” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The specific object's path of the active connection.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -1035,7 +992,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--state"></a><h3>The <code class="literal">“state”</code> property</h3>
<pre class="programlisting"> “state” <span class="type">guint</span></pre>
-<p></p>
+<p>The state of the active connection.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 3</p>
<p>Default value: 0</p>
@@ -1044,16 +1001,16 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--type"></a><h3>The <code class="literal">“type”</code> property</h3>
<pre class="programlisting"> “type” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active connection's type</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--uuid"></a><h3>The <code class="literal">“uuid”</code> property</h3>
<pre class="programlisting"> “uuid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active connection's UUID</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -1061,15 +1018,14 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--vpn"></a><h3>The <code class="literal">“vpn”</code> property</h3>
<pre class="programlisting"> “vpn” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the active connection is a VPN connection.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMClient.html b/docs/libnm-glib/html/NMClient.html
index 23eca511c..1f0d4ae2b 100644
--- a/docs/libnm-glib/html/NMClient.html
+++ b/docs/libnm-glib/html/NMClient.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMClient</title>
+<title>NMClient: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="ch02.html" title="libnm-glib API Reference">
<link rel="next" href="NMActiveConnection.html" title="NMActiveConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -570,8 +570,6 @@
</div>
<div class="refsect1">
<a name="NMClient.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMClient.functions_details"></a><h2>Functions</h2>
@@ -583,9 +581,8 @@ nm_client_error_quark (<em class="parameter"><code><span class="type">void</span
<div class="refsect3">
<a name="id-1.3.2.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -602,7 +599,6 @@ control them. To access and modify network configuration data, use the
<div class="refsect3">
<a name="id-1.3.2.9.3.7"></a><h4>Returns</h4>
<p> a new <a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> or NULL on an error</p>
-<p></p>
</div>
</div>
<hr>
@@ -681,7 +677,6 @@ nm_client_new_finish (<em class="parameter"><code><span class="type">GAsyncResul
<div class="refsect3">
<a name="id-1.3.2.9.5.6"></a><h4>Returns</h4>
<p> a new <a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a>, or <code class="literal">NULL</code> on error</p>
-<p></p>
</div>
</div>
<hr>
@@ -796,8 +791,6 @@ or <code class="literal">NULL</code> if none is found. </p>
<em class="parameter"><code><a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *active_connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -885,8 +878,6 @@ details of the newly added connection. </p></td>
<em class="parameter"><code>const <span class="type">char</span> *new_connection_path</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1014,7 +1005,6 @@ nm_client_networking_get_enabled (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.3.2.9.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if networking is enabled, <code class="literal">FALSE</code> if networking is disabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1073,7 +1063,6 @@ nm_client_wireless_get_enabled (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.3.2.9.16.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if wireless is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1131,7 +1120,6 @@ nm_client_wireless_hardware_get_enabled
<div class="refsect3">
<a name="id-1.3.2.9.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the wireless hardware is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1158,7 +1146,6 @@ nm_client_wwan_get_enabled (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.2.9.19.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if WWAN is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1215,7 +1202,6 @@ nm_client_wwan_hardware_get_enabled (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.2.9.21.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the WWAN hardware is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1242,7 +1228,6 @@ nm_client_wimax_get_enabled (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.3.2.9.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if WiMAX is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1299,7 +1284,6 @@ nm_client_wimax_hardware_get_enabled (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.3.2.9.24.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the WiMAX hardware is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1326,7 +1310,6 @@ nm_client_get_version (<em class="parameter"><code><a class="link" href="NMClien
<div class="refsect3">
<a name="id-1.3.2.9.25.6"></a><h4>Returns</h4>
<p> string with the version</p>
-<p></p>
</div>
</div>
<hr>
@@ -1353,7 +1336,6 @@ nm_client_get_state (<em class="parameter"><code><a class="link" href="NMClient.
<div class="refsect3">
<a name="id-1.3.2.9.26.6"></a><h4>Returns</h4>
<p> the current <a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NMState"><code class="literal">NMState</code></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1381,9 +1363,8 @@ connections at startup.</p>
<div class="refsect3">
<a name="id-1.3.2.9.27.6"></a><h4>Returns</h4>
<p> whether the daemon is still starting up</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1409,7 +1390,6 @@ nm_client_get_manager_running (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.3.2.9.28.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the daemon is running</p>
-<p></p>
</div>
</div>
<hr>
@@ -1504,7 +1484,6 @@ client can or cannot perform the action the permission represents</p>
<div class="refsect3">
<a name="id-1.3.2.9.31.6"></a><h4>Returns</h4>
<p> the permission's result, one of <a class="link" href="NMClient.html#NMClientPermissionResult" title="enum NMClientPermissionResult"><span class="type">NMClientPermissionResult</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1552,9 +1531,8 @@ a list of domains separated by ",". </p></td>
<div class="refsect3">
<a name="id-1.3.2.9.32.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> otherwise</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1601,9 +1579,8 @@ domains separated by ",". (<code class="literal">NULL</code> or an empty string
<div class="refsect3">
<a name="id-1.3.2.9.33.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> otherwise</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1632,9 +1609,8 @@ connectivity state first before returning any information.</p>
<div class="refsect3">
<a name="id-1.3.2.9.34.6"></a><h4>Returns</h4>
<p> the current connectivity state</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
@@ -1678,9 +1654,8 @@ if you do not want to block.</p>
<div class="refsect3">
<a name="id-1.3.2.9.35.7"></a><h4>Returns</h4>
<p> the (new) current connectivity state</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
@@ -1728,7 +1703,7 @@ re-checking, and <a class="link" href="NMClient.html#nm-client-check-connectivit
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
@@ -1769,9 +1744,8 @@ call.</p>
<div class="refsect3">
<a name="id-1.3.2.9.37.6"></a><h4>Returns</h4>
<p> the (new) current connectivity state</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
@@ -1808,7 +1782,7 @@ non-NetworkManager-recognized device, this will return <code class="literal">NUL
any. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
@@ -1839,7 +1813,7 @@ currently-activating connection that is expected to become the new
any. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
</div>
<div class="refsect1">
@@ -1848,128 +1822,96 @@ any. </p>
<a name="NM-CLIENT-VERSION:CAPS"></a><h3>NM_CLIENT_VERSION</h3>
<pre class="programlisting">#define NM_CLIENT_VERSION "version"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-STATE:CAPS"></a><h3>NM_CLIENT_STATE</h3>
<pre class="programlisting">#define NM_CLIENT_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-STARTUP:CAPS"></a><h3>NM_CLIENT_STARTUP</h3>
<pre class="programlisting">#define NM_CLIENT_STARTUP "startup"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-MANAGER-RUNNING:CAPS"></a><h3>NM_CLIENT_MANAGER_RUNNING</h3>
<pre class="programlisting">#define NM_CLIENT_MANAGER_RUNNING "manager-running"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-NETWORKING-ENABLED:CAPS"></a><h3>NM_CLIENT_NETWORKING_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_NETWORKING_ENABLED "networking-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIRELESS-ENABLED:CAPS"></a><h3>NM_CLIENT_WIRELESS_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIRELESS_ENABLED "wireless-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIRELESS-HARDWARE-ENABLED:CAPS"></a><h3>NM_CLIENT_WIRELESS_HARDWARE_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIRELESS_HARDWARE_ENABLED "wireless-hardware-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WWAN-ENABLED:CAPS"></a><h3>NM_CLIENT_WWAN_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WWAN_ENABLED "wwan-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WWAN-HARDWARE-ENABLED:CAPS"></a><h3>NM_CLIENT_WWAN_HARDWARE_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WWAN_HARDWARE_ENABLED "wwan-hardware-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIMAX-ENABLED:CAPS"></a><h3>NM_CLIENT_WIMAX_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIMAX_ENABLED "wimax-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIMAX-HARDWARE-ENABLED:CAPS"></a><h3>NM_CLIENT_WIMAX_HARDWARE_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIMAX_HARDWARE_ENABLED "wimax-hardware-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-ACTIVE-CONNECTIONS:CAPS"></a><h3>NM_CLIENT_ACTIVE_CONNECTIONS</h3>
<pre class="programlisting">#define NM_CLIENT_ACTIVE_CONNECTIONS "active-connections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-CONNECTIVITY:CAPS"></a><h3>NM_CLIENT_CONNECTIVITY</h3>
<pre class="programlisting">#define NM_CLIENT_CONNECTIVITY "connectivity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-PRIMARY-CONNECTION:CAPS"></a><h3>NM_CLIENT_PRIMARY_CONNECTION</h3>
<pre class="programlisting">#define NM_CLIENT_PRIMARY_CONNECTION "primary-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-ACTIVATING-CONNECTION:CAPS"></a><h3>NM_CLIENT_ACTIVATING_CONNECTION</h3>
<pre class="programlisting">#define NM_CLIENT_ACTIVATING_CONNECTION "activating-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-DEVICES:CAPS"></a><h3>NM_CLIENT_DEVICES</h3>
<pre class="programlisting">#define NM_CLIENT_DEVICES "devices"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2176,8 +2118,6 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<a name="NM-CLIENT-ERROR:CAPS"></a><h3>NM_CLIENT_ERROR</h3>
<pre class="programlisting">#define NM_CLIENT_ERROR nm_client_error_quark ()
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -2185,40 +2125,42 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--activating-connection"></a><h3>The <code class="literal">“activating-connection”</code> property</h3>
<pre class="programlisting"> “activating-connection” <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> of the activating connection that is
+likely to become the new <a class="link" href="NMClient.html#NMClient--primary-connection" title="The “primary-connection” property"><span class="type">“primary-connection”</span></a>.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--active-connections"></a><h3>The <code class="literal">“active-connections”</code> property</h3>
<pre class="programlisting"> “active-connections” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>The active connections.
+Type: GLib.PtrArray</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--connectivity"></a><h3>The <code class="literal">“connectivity”</code> property</h3>
<pre class="programlisting"> “connectivity” <span class="type">guint</span></pre>
-<p></p>
+<p>The network connectivity state.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 4</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--devices"></a><h3>The <code class="literal">“devices”</code> property</h3>
<pre class="programlisting"> “devices” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>List of known network devices.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--manager-running"></a><h3>The <code class="literal">“manager-running”</code> property</h3>
<pre class="programlisting"> “manager-running” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the daemon is running.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2226,7 +2168,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--networking-enabled"></a><h3>The <code class="literal">“networking-enabled”</code> property</h3>
<pre class="programlisting"> “networking-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether networking is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: TRUE</p>
</div>
@@ -2234,24 +2176,25 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--primary-connection"></a><h3>The <code class="literal">“primary-connection”</code> property</h3>
<pre class="programlisting"> “primary-connection” <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> of the device with the default route;
+see <a class="link" href="NMClient.html#nm-client-get-primary-connection" title="nm_client_get_primary_connection ()"><code class="function">nm_client_get_primary_connection()</code></a> for more details.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--startup"></a><h3>The <code class="literal">“startup”</code> property</h3>
<pre class="programlisting"> “startup” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the daemon is still starting up.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--state"></a><h3>The <code class="literal">“state”</code> property</h3>
<pre class="programlisting"> “state” <span class="type">guint</span></pre>
-<p></p>
+<p>The current daemon state.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 70</p>
<p>Default value: 0</p>
@@ -2260,7 +2203,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--version"></a><h3>The <code class="literal">“version”</code> property</h3>
<pre class="programlisting"> “version” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The NetworkManager version.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2268,7 +2211,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wimax-enabled"></a><h3>The <code class="literal">“wimax-enabled”</code> property</h3>
<pre class="programlisting"> “wimax-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether WiMAX functionality is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -2276,7 +2219,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wimax-hardware-enabled"></a><h3>The <code class="literal">“wimax-hardware-enabled”</code> property</h3>
<pre class="programlisting"> “wimax-hardware-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the WiMAX hardware is enabled.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2284,7 +2227,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wireless-enabled"></a><h3>The <code class="literal">“wireless-enabled”</code> property</h3>
<pre class="programlisting"> “wireless-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether wireless is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -2292,7 +2235,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wireless-hardware-enabled"></a><h3>The <code class="literal">“wireless-hardware-enabled”</code> property</h3>
<pre class="programlisting"> “wireless-hardware-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the wireless hardware is enabled.</p>
<p>Flags: Read</p>
<p>Default value: TRUE</p>
</div>
@@ -2300,7 +2243,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wwan-enabled"></a><h3>The <code class="literal">“wwan-enabled”</code> property</h3>
<pre class="programlisting"> “wwan-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether WWAN functionality is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -2308,7 +2251,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wwan-hardware-enabled"></a><h3>The <code class="literal">“wwan-hardware-enabled”</code> property</h3>
<pre class="programlisting"> “wwan-hardware-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the WWAN hardware is enabled.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2321,6 +2264,34 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
user_function (<a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> *client,
<span class="type">GObject</span> *device,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> is added.</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the client that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p> the new device. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Override the parsed C type with given type."><span class="acronym">type</span></acronym> NMDevice]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -2330,6 +2301,34 @@ user_function (<a class="link" href="NMClient.html" title="NMClient"><span class
user_function (<a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> *client,
<span class="type">GObject</span> *device,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> is removed.</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the client that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p> the removed device. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Override the parsed C type with given type."><span class="acronym">type</span></acronym> NMDevice]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -2340,12 +2339,44 @@ user_function (<a class="link" href="NMClient.html" title="NMClient"><span class
<span class="type">guint</span> permission,
<span class="type">guint</span> result,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a permission has changed</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.4.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the client that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>permission</p></td>
+<td class="parameter_description"><p>a permission from <a class="link" href="NMClient.html#NMClientPermission" title="enum NMClientPermission"><span class="type">NMClientPermission</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>result</p></td>
+<td class="parameter_description"><p>the permission's result, one of <a class="link" href="NMClient.html#NMClientPermissionResult" title="enum NMClientPermissionResult"><span class="type">NMClientPermissionResult</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDHCP4Config.html b/docs/libnm-glib/html/NMDHCP4Config.html
index c400cc6a6..87c74fef5 100644
--- a/docs/libnm-glib/html/NMDHCP4Config.html
+++ b/docs/libnm-glib/html/NMDHCP4Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDHCP4Config</title>
+<title>NMDHCP4Config: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMIP6Config.html" title="NMIP6Config">
<link rel="next" href="NMDHCP6Config.html" title="NMDHCP6Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -105,8 +105,6 @@
</div>
<div class="refsect1">
<a name="NMDHCP4Config.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDHCP4Config.functions_details"></a><h2>Functions</h2>
@@ -205,7 +203,6 @@ nm_dhcp4_config_get_one_option (<em class="parameter"><code><a class="link" href
<a name="id-1.3.22.8.4.6"></a><h4>Returns</h4>
<p> the configuration option's value. This is the internal string used by the
configuration, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -215,8 +212,6 @@ configuration, and must not be modified.</p>
<a name="NM-DHCP4-CONFIG-OPTIONS:CAPS"></a><h3>NM_DHCP4_CONFIG_OPTIONS</h3>
<pre class="programlisting">#define NM_DHCP4_CONFIG_OPTIONS "options"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -224,13 +219,13 @@ configuration, and must not be modified.</p>
<div class="refsect2">
<a name="NMDHCP4Config--options"></a><h3>The <code class="literal">“options”</code> property</h3>
<pre class="programlisting"> “options” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>The <span class="type">GHashTable</span> containing options of the configuration.</p>
+<p>Type: GLib.HashTable(utf8,GObject.Value)</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDHCP6Config.html b/docs/libnm-glib/html/NMDHCP6Config.html
index c50a23df8..7b322c5ef 100644
--- a/docs/libnm-glib/html/NMDHCP6Config.html
+++ b/docs/libnm-glib/html/NMDHCP6Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDHCP6Config</title>
+<title>NMDHCP6Config: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDHCP4Config.html" title="NMDHCP4Config">
<link rel="next" href="NMObject.html" title="NMObject">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -105,8 +105,6 @@
</div>
<div class="refsect1">
<a name="NMDHCP6Config.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDHCP6Config.functions_details"></a><h2>Functions</h2>
@@ -205,7 +203,6 @@ nm_dhcp6_config_get_one_option (<em class="parameter"><code><a class="link" href
<a name="id-1.3.23.8.4.6"></a><h4>Returns</h4>
<p> the configuration option's value. This is the internal string used by the
configuration, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -215,8 +212,6 @@ configuration, and must not be modified.</p>
<a name="NM-DHCP6-CONFIG-OPTIONS:CAPS"></a><h3>NM_DHCP6_CONFIG_OPTIONS</h3>
<pre class="programlisting">#define NM_DHCP6_CONFIG_OPTIONS "options"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -224,13 +219,13 @@ configuration, and must not be modified.</p>
<div class="refsect2">
<a name="NMDHCP6Config--options"></a><h3>The <code class="literal">“options”</code> property</h3>
<pre class="programlisting"> “options” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>The <span class="type">GHashTable</span> containing options of the configuration.</p>
+<p>Type: GLib.HashTable(utf8,GObject.Value)</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDevice.html b/docs/libnm-glib/html/NMDevice.html
index 2d5281c82..79f87a5de 100644
--- a/docs/libnm-glib/html/NMDevice.html
+++ b/docs/libnm-glib/html/NMDevice.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDevice</title>
+<title>NMDevice: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMActiveConnection.html" title="NMActiveConnection">
<link rel="next" href="NMDeviceEthernet.html" title="NMDeviceEthernet">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -634,8 +634,6 @@
</div>
<div class="refsect1">
<a name="NMDevice.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDevice.functions_details"></a><h2>Functions</h2>
@@ -647,9 +645,8 @@ nm_device_error_quark (<em class="parameter"><code><span class="type">void</span
<div class="refsect3">
<a name="id-1.3.4.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -711,7 +708,6 @@ nm_device_get_iface (<em class="parameter"><code><a class="link" href="NMDevice.
<a name="id-1.3.4.9.4.6"></a><h4>Returns</h4>
<p> the interface of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -740,7 +736,6 @@ when the device is in the ACTIVATED state.</p>
<a name="id-1.3.4.9.5.6"></a><h4>Returns</h4>
<p> the IP traffic interface of the device. This is the internal string
used by the device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -767,7 +762,6 @@ nm_device_get_device_type (<em class="parameter"><code><a class="link" href="NMD
<div class="refsect3">
<a name="id-1.3.4.9.6.6"></a><h4>Returns</h4>
<p> the device type</p>
-<p></p>
</div>
</div>
<hr>
@@ -796,7 +790,6 @@ nm_device_get_udi (<em class="parameter"><code><a class="link" href="NMDevice.ht
<p> the Unique Device Identifier of the device. This identifier may be
used to gather more information about the device from various operating
system services like udev or sysfs.</p>
-<p></p>
</div>
</div>
<hr>
@@ -824,7 +817,6 @@ nm_device_get_driver (<em class="parameter"><code><a class="link" href="NMDevice
<a name="id-1.3.4.9.8.6"></a><h4>Returns</h4>
<p> the driver of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -852,7 +844,6 @@ nm_device_get_driver_version (<em class="parameter"><code><a class="link" href="
<a name="id-1.3.4.9.9.6"></a><h4>Returns</h4>
<p> the version of the device driver. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -880,7 +871,6 @@ nm_device_get_firmware_version (<em class="parameter"><code><a class="link" href
<a name="id-1.3.4.9.10.6"></a><h4>Returns</h4>
<p> the firmware version of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -910,9 +900,8 @@ nm_device_get_type_description (<em class="parameter"><code><a class="link" href
<a name="id-1.3.4.9.11.6"></a><h4>Returns</h4>
<p> the type description of the device. This is the internal
string used by the device, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -940,9 +929,8 @@ nm_device_get_hw_address (<em class="parameter"><code><a class="link" href="NMDe
<a name="id-1.3.4.9.12.6"></a><h4>Returns</h4>
<p> the current MAC of the device, or <code class="literal">NULL</code>.
This is the internal string used by the device, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -968,7 +956,6 @@ nm_device_get_capabilities (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.4.9.13.6"></a><h4>Returns</h4>
<p> the capabilities</p>
-<p></p>
</div>
</div>
<hr>
@@ -995,7 +982,6 @@ nm_device_get_managed (<em class="parameter"><code><a class="link" href="NMDevic
<div class="refsect3">
<a name="id-1.3.4.9.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device is managed by NetworkManager</p>
-<p></p>
</div>
</div>
<hr>
@@ -1022,7 +1008,6 @@ nm_device_get_autoconnect (<em class="parameter"><code><a class="link" href="NMD
<div class="refsect3">
<a name="id-1.3.4.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device is allowed to be autoconnected</p>
-<p></p>
</div>
</div>
<hr>
@@ -1081,7 +1066,6 @@ to be missing.</p>
<a name="id-1.3.4.9.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if firmware required for the device's operation is likely
to be missing.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1230,7 +1214,6 @@ nm_device_get_state (<em class="parameter"><code><a class="link" href="NMDevice.
<div class="refsect3">
<a name="id-1.3.4.9.22.6"></a><h4>Returns</h4>
<p> the current device state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1267,7 +1250,6 @@ the state (<em class="parameter"><code>reason</code></em>
<div class="refsect3">
<a name="id-1.3.4.9.23.6"></a><h4>Returns</h4>
<p> the current device state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1328,7 +1310,7 @@ containing <a href="NMRemoteConnection.html"><span class="type">NMRemoteConnecti
the connection, and must not be modified. </p>
<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> NMRemoteConnection]</span></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1359,9 +1341,8 @@ ports on a single physical port. (Eg, NPAR / SR-IOV.)</p>
<p> the physical port ID of the device, or <code class="literal">NULL</code> if the port
ID is unknown. This is the internal string used by the device and
must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1387,9 +1368,8 @@ nm_device_get_mtu (<em class="parameter"><code><a class="link" href="NMDevice.ht
<div class="refsect3">
<a name="id-1.3.4.9.27.6"></a><h4>Returns</h4>
<p> the MTU of the device.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1416,9 +1396,8 @@ nm_device_is_software (<em class="parameter"><code><a class="link" href="NMDevic
<a name="id-1.3.4.9.28.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>device</code></em>
is a software device, <code class="literal">FALSE</code> if it is a hardware device.</p>
-<p></p>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -1445,7 +1424,6 @@ nm_device_get_product (<em class="parameter"><code><a class="link" href="NMDevic
<a name="id-1.3.4.9.29.6"></a><h4>Returns</h4>
<p> the product name of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1473,7 +1451,6 @@ nm_device_get_vendor (<em class="parameter"><code><a class="link" href="NMDevice
<a name="id-1.3.4.9.30.6"></a><h4>Returns</h4>
<p> the vendor name of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1503,9 +1480,8 @@ nm_device_get_description (<em class="parameter"><code><a class="link" href="NMD
<p> a description of <em class="parameter"><code>device</code></em>
. If either the vendor or the
product name is unknown, this returns the interface name.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1544,7 +1520,7 @@ devices in <em class="parameter"><code>devices</code></em>
<p> the device names. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1553,8 +1529,6 @@ devices in <em class="parameter"><code>devices</code></em>
<span class="c_punctuation">(</span>*NMDeviceCallbackFn<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> *device</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1633,7 +1607,7 @@ operation completes. </p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -1726,7 +1700,6 @@ against</p></td>
<a name="id-1.3.4.9.37.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this device, <code class="literal">FALSE</code>
if is incompatible with the device's capabilities and characteristics.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1780,7 +1753,6 @@ against</p></td>
<a name="id-1.3.4.9.38.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this device, <code class="literal">FALSE</code>
if is incompatible with the device's capabilities and characteristics.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1810,9 +1782,8 @@ that can be used on <em class="parameter"><code>device</code></em>
<a name="id-1.3.4.9.39.6"></a><h4>Returns</h4>
<p> <em class="parameter"><code>device</code></em>
's associated <a href="https://developer.gnome.org/libnm-util/0.9/NMSetting.html"><span class="type">NMSetting</span></a> type</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1822,8 +1793,6 @@ that can be used on <em class="parameter"><code>device</code></em>
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
<div class="warning"><p><code class="literal">NMDeviceDeactivateFn</code> is deprecated and should not be used in newly-written code.</p></div>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1863,192 +1832,144 @@ that can be used on <em class="parameter"><code>device</code></em>
<a name="NM-DEVICE-ERROR:CAPS"></a><h3>NM_DEVICE_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_ERROR nm_device_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DEVICE-TYPE:CAPS"></a><h3>NM_DEVICE_DEVICE_TYPE</h3>
<pre class="programlisting">#define NM_DEVICE_DEVICE_TYPE "device-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-UDI:CAPS"></a><h3>NM_DEVICE_UDI</h3>
<pre class="programlisting">#define NM_DEVICE_UDI "udi"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-INTERFACE:CAPS"></a><h3>NM_DEVICE_INTERFACE</h3>
<pre class="programlisting">#define NM_DEVICE_INTERFACE "interface"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-IP-INTERFACE:CAPS"></a><h3>NM_DEVICE_IP_INTERFACE</h3>
<pre class="programlisting">#define NM_DEVICE_IP_INTERFACE "ip-interface"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DRIVER:CAPS"></a><h3>NM_DEVICE_DRIVER</h3>
<pre class="programlisting">#define NM_DEVICE_DRIVER "driver"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DRIVER-VERSION:CAPS"></a><h3>NM_DEVICE_DRIVER_VERSION</h3>
<pre class="programlisting">#define NM_DEVICE_DRIVER_VERSION "driver-version"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-FIRMWARE-VERSION:CAPS"></a><h3>NM_DEVICE_FIRMWARE_VERSION</h3>
<pre class="programlisting">#define NM_DEVICE_FIRMWARE_VERSION "firmware-version"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_CAPABILITIES "capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MANAGED:CAPS"></a><h3>NM_DEVICE_MANAGED</h3>
<pre class="programlisting">#define NM_DEVICE_MANAGED "managed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-AUTOCONNECT:CAPS"></a><h3>NM_DEVICE_AUTOCONNECT</h3>
<pre class="programlisting">#define NM_DEVICE_AUTOCONNECT "autoconnect"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-FIRMWARE-MISSING:CAPS"></a><h3>NM_DEVICE_FIRMWARE_MISSING</h3>
<pre class="programlisting">#define NM_DEVICE_FIRMWARE_MISSING "firmware-missing"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-IP4-CONFIG:CAPS"></a><h3>NM_DEVICE_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_IP4_CONFIG "ip4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DHCP4-CONFIG:CAPS"></a><h3>NM_DEVICE_DHCP4_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_DHCP4_CONFIG "dhcp4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-IP6-CONFIG:CAPS"></a><h3>NM_DEVICE_IP6_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_IP6_CONFIG "ip6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DHCP6-CONFIG:CAPS"></a><h3>NM_DEVICE_DHCP6_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_DHCP6_CONFIG "dhcp6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-STATE:CAPS"></a><h3>NM_DEVICE_STATE</h3>
<pre class="programlisting">#define NM_DEVICE_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-STATE-REASON:CAPS"></a><h3>NM_DEVICE_STATE_REASON</h3>
<pre class="programlisting">#define NM_DEVICE_STATE_REASON "state-reason"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ACTIVE-CONNECTION:CAPS"></a><h3>NM_DEVICE_ACTIVE_CONNECTION</h3>
<pre class="programlisting">#define NM_DEVICE_ACTIVE_CONNECTION "active-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-AVAILABLE-CONNECTIONS:CAPS"></a><h3>NM_DEVICE_AVAILABLE_CONNECTIONS</h3>
<pre class="programlisting">#define NM_DEVICE_AVAILABLE_CONNECTIONS "available-connections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VENDOR:CAPS"></a><h3>NM_DEVICE_VENDOR</h3>
<pre class="programlisting">#define NM_DEVICE_VENDOR "vendor"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-PRODUCT:CAPS"></a><h3>NM_DEVICE_PRODUCT</h3>
<pre class="programlisting">#define NM_DEVICE_PRODUCT "product"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-PHYSICAL-PORT-ID:CAPS"></a><h3>NM_DEVICE_PHYSICAL_PORT_ID</h3>
<pre class="programlisting">#define NM_DEVICE_PHYSICAL_PORT_ID "physical-port-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MTU:CAPS"></a><h3>NM_DEVICE_MTU</h3>
<pre class="programlisting">#define NM_DEVICE_MTU "mtu"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -2056,14 +1977,14 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--active-connection"></a><h3>The <code class="literal">“active-connection”</code> property</h3>
<pre class="programlisting"> “active-connection” <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> object that "owns" this device during activation.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--autoconnect"></a><h3>The <code class="literal">“autoconnect”</code> property</h3>
<pre class="programlisting"> “autoconnect” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device can auto-activate a connection.</p>
<p>Flags: Read / Write</p>
<p>Default value: TRUE</p>
</div>
@@ -2071,15 +1992,15 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--available-connections"></a><h3>The <code class="literal">“available-connections”</code> property</h3>
<pre class="programlisting"> “available-connections” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>The available connections (<a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a>) of the device</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--capabilities"></a><h3>The <code class="literal">“capabilities”</code> property</h3>
<pre class="programlisting"> “capabilities” <span class="type">guint</span></pre>
-<p></p>
+<p>The capabilities of the device.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -2087,7 +2008,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--device-type"></a><h3>The <code class="literal">“device-type”</code> property</h3>
<pre class="programlisting"> “device-type” <span class="type">guint</span></pre>
-<p></p>
+<p>The numeric type of the device.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -2095,21 +2016,21 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--dhcp4-config"></a><h3>The <code class="literal">“dhcp4-config”</code> property</h3>
<pre class="programlisting"> “dhcp4-config” <a class="link" href="NMDHCP4Config.html" title="NMDHCP4Config"><span class="type">NMDHCP4Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMDHCP4Config.html" title="NMDHCP4Config"><span class="type">NMDHCP4Config</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--dhcp6-config"></a><h3>The <code class="literal">“dhcp6-config”</code> property</h3>
<pre class="programlisting"> “dhcp6-config” <a class="link" href="NMDHCP6Config.html" title="NMDHCP6Config"><span class="type">NMDHCP6Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMDHCP6Config.html" title="NMDHCP6Config"><span class="type">NMDHCP6Config</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--driver"></a><h3>The <code class="literal">“driver”</code> property</h3>
<pre class="programlisting"> “driver” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The driver of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2117,7 +2038,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--driver-version"></a><h3>The <code class="literal">“driver-version”</code> property</h3>
<pre class="programlisting"> “driver-version” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The version of the device driver.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2125,7 +2046,8 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--firmware-missing"></a><h3>The <code class="literal">“firmware-missing”</code> property</h3>
<pre class="programlisting"> “firmware-missing” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <code class="literal">TRUE</code> indicates the device is likely missing firmware required
+for its operation.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2133,7 +2055,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--firmware-version"></a><h3>The <code class="literal">“firmware-version”</code> property</h3>
<pre class="programlisting"> “firmware-version” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The firmware version of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2141,7 +2063,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--interface"></a><h3>The <code class="literal">“interface”</code> property</h3>
<pre class="programlisting"> “interface” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The interface of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2149,7 +2071,8 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--ip-interface"></a><h3>The <code class="literal">“ip-interface”</code> property</h3>
<pre class="programlisting"> “ip-interface” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IP interface of the device which should be used for all IP-related
+operations like addressing and routing.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2157,21 +2080,21 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--ip4-config"></a><h3>The <code class="literal">“ip4-config”</code> property</h3>
<pre class="programlisting"> “ip4-config” <a class="link" href="NMIP4Config.html" title="NMIP4Config"><span class="type">NMIP4Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMIP4Config.html" title="NMIP4Config"><span class="type">NMIP4Config</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--ip6-config"></a><h3>The <code class="literal">“ip6-config”</code> property</h3>
<pre class="programlisting"> “ip6-config” <a class="link" href="NMIP6Config.html" title="NMIP6Config"><span class="type">NMIP6Config</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMIP6Config.html" title="NMIP6Config"><span class="type">NMIP6Config</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--managed"></a><h3>The <code class="literal">“managed”</code> property</h3>
<pre class="programlisting"> “managed” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device is managed by NetworkManager.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2179,25 +2102,26 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>The MTU of the device.</p>
<p>Flags: Read</p>
<p>Default value: 1500</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--physical-port-id"></a><h3>The <code class="literal">“physical-port-id”</code> property</h3>
<pre class="programlisting"> “physical-port-id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The physical port ID of the device. (See
+<a class="link" href="NMDevice.html#nm-device-get-physical-port-id" title="nm_device_get_physical_port_id ()"><code class="function">nm_device_get_physical_port_id()</code></a>.)</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--product"></a><h3>The <code class="literal">“product”</code> property</h3>
<pre class="programlisting"> “product” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The product string of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2205,7 +2129,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--state"></a><h3>The <code class="literal">“state”</code> property</h3>
<pre class="programlisting"> “state” <span class="type">guint</span></pre>
-<p></p>
+<p>The state of the device.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -2213,14 +2137,19 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--state-reason"></a><h3>The <code class="literal">“state-reason”</code> property</h3>
<pre class="programlisting"> “state-reason” <span class="type">GValueArray_guint+guint_*</span></pre>
-<p></p>
+<p>The state and reason of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--udi"></a><h3>The <code class="literal">“udi”</code> property</h3>
<pre class="programlisting"> “udi” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>An operating-system specific device hardware identifier; this is not
+unique to a specific hardware device across reboots or hotplugs. It
+is an opaque string which for some device types (Bluetooth, Modem)
+contains an identifier provided by the underlying hardware service daemon
+such as Bluez or ModemManager, and clients can use this property to
+request more information about the device from those services.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2228,7 +2157,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--vendor"></a><h3>The <code class="literal">“vendor”</code> property</h3>
<pre class="programlisting"> “vendor” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The vendor string of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2243,12 +2172,49 @@ user_function (<a class="link" href="NMDevice.html" title="NMDevice"><span class
<span class="type">guint</span> old_state,
<span class="type">guint</span> reason,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies the state change of a <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a>.</p>
+<div class="refsect3">
+<a name="id-1.3.4.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p>the device object that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>new_state</p></td>
+<td class="parameter_description"><p>the new state of the device</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>old_state</p></td>
+<td class="parameter_description"><p>the previous state of the device</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>reason</p></td>
+<td class="parameter_description"><p>the reason describing the state change</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceAdsl.html b/docs/libnm-glib/html/NMDeviceAdsl.html
index 404fb121a..3f1084756 100644
--- a/docs/libnm-glib/html/NMDeviceAdsl.html
+++ b/docs/libnm-glib/html/NMDeviceAdsl.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceAdsl</title>
+<title>NMDeviceAdsl: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceWimax.html" title="NMDeviceWimax">
<link rel="next" href="NMDeviceBond.html" title="NMDeviceBond">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -116,8 +116,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceAdsl.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceAdsl.functions_details"></a><h2>Functions</h2>
@@ -129,7 +127,6 @@ nm_device_adsl_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.3.10.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceAdsl.html" title="NMDeviceAdsl"><span class="type">NMDeviceAdsl</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -191,7 +188,6 @@ nm_device_adsl_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.10.8.4.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
</div>
@@ -238,16 +234,12 @@ nm_device_adsl_get_carrier (<em class="parameter"><code><a class="link" href="NM
<a name="NM-DEVICE-ADSL-ERROR:CAPS"></a><h3>NM_DEVICE_ADSL_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_ADSL_ERROR nm_device_adsl_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ADSL-CARRIER:CAPS"></a><h3>NM_DEVICE_ADSL_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_ADSL_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -255,14 +247,13 @@ nm_device_adsl_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceAdsl--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceBond.html b/docs/libnm-glib/html/NMDeviceBond.html
index c79364a96..7659084c5 100644
--- a/docs/libnm-glib/html/NMDeviceBond.html
+++ b/docs/libnm-glib/html/NMDeviceBond.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceBond</title>
+<title>NMDeviceBond: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceAdsl.html" title="NMDeviceAdsl">
<link rel="next" href="NMDeviceBridge.html" title="NMDeviceBridge">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -152,8 +152,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceBond.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceBond.functions_details"></a><h2>Functions</h2>
@@ -165,7 +163,6 @@ nm_device_bond_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.3.11.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceBond.html" title="NMDeviceBond"><span class="type">NMDeviceBond</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -228,7 +225,6 @@ nm_device_bond_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.3.11.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -255,7 +251,6 @@ nm_device_bond_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.11.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
<hr>
@@ -288,7 +283,7 @@ nm_device_bond_get_slaves (<em class="parameter"><code><a class="link" href="NMD
copy used by the device, and must not be modified. </p>
<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> NMDevice]</span></p>
</div>
-<p class="since">Since 0.9.6.4</p>
+<p class="since">Since: 0.9.6.4</p>
</div>
</div>
<div class="refsect1">
@@ -341,32 +336,24 @@ copy used by the device, and must not be modified. </p>
<a name="NM-DEVICE-BOND-ERROR:CAPS"></a><h3>NM_DEVICE_BOND_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_ERROR nm_device_bond_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BOND-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_BOND_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BOND-CARRIER:CAPS"></a><h3>NM_DEVICE_BOND_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BOND-SLAVES:CAPS"></a><h3>NM_DEVICE_BOND_SLAVES</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_SLAVES "slaves"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -374,7 +361,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBond--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -382,7 +369,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBond--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -390,14 +377,13 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBond--slaves"></a><h3>The <code class="literal">“slaves”</code> property</h3>
<pre class="programlisting"> “slaves” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>The devices (<a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a>) slaved to the bond device.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceBridge.html b/docs/libnm-glib/html/NMDeviceBridge.html
index 192be7337..f0af6d6ab 100644
--- a/docs/libnm-glib/html/NMDeviceBridge.html
+++ b/docs/libnm-glib/html/NMDeviceBridge.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceBridge</title>
+<title>NMDeviceBridge: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceBond.html" title="NMDeviceBond">
<link rel="next" href="NMDeviceTeam.html" title="NMDeviceTeam">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -152,8 +152,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceBridge.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceBridge.functions_details"></a><h2>Functions</h2>
@@ -165,9 +163,8 @@ nm_device_bridge_error_quark (<em class="parameter"><code><span class="type">voi
<div class="refsect3">
<a name="id-1.3.12.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceBridge.html" title="NMDeviceBridge"><span class="type">NMDeviceBridge</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -203,7 +200,7 @@ nm_device_bridge_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/ht
<p> a new device. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -230,9 +227,8 @@ nm_device_bridge_get_hw_address (<em class="parameter"><code><a class="link" hre
<a name="id-1.3.12.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -258,9 +254,8 @@ nm_device_bridge_get_carrier (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.3.12.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -292,7 +287,7 @@ nm_device_bridge_get_slaves (<em class="parameter"><code><a class="link" href="N
copy used by the device, and must not be modified. </p>
<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> NMDevice]</span></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
<div class="refsect1">
@@ -339,39 +334,31 @@ copy used by the device, and must not be modified. </p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BRIDGE-ERROR:CAPS"></a><h3>NM_DEVICE_BRIDGE_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_ERROR nm_device_bridge_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BRIDGE-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_BRIDGE_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BRIDGE-CARRIER:CAPS"></a><h3>NM_DEVICE_BRIDGE_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BRIDGE-SLAVES:CAPS"></a><h3>NM_DEVICE_BRIDGE_SLAVES</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_SLAVES "slaves"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -379,32 +366,31 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBridge--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceBridge--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceBridge--slaves"></a><h3>The <code class="literal">“slaves”</code> property</h3>
<pre class="programlisting"> “slaves” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>The devices (<a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a>) slaved to the bridge device.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceBt.html b/docs/libnm-glib/html/NMDeviceBt.html
index 816f671df..8a0df6b05 100644
--- a/docs/libnm-glib/html/NMDeviceBt.html
+++ b/docs/libnm-glib/html/NMDeviceBt.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceBt</title>
+<title>NMDeviceBt: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceModem.html" title="NMDeviceModem">
<link rel="next" href="NMDeviceWimax.html" title="NMDeviceWimax">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -152,8 +152,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceBt.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceBt.functions_details"></a><h2>Functions</h2>
@@ -165,7 +163,6 @@ nm_device_bt_error_quark (<em class="parameter"><code><span class="type">void</s
<div class="refsect3">
<a name="id-1.3.8.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceBt.html" title="NMDeviceBt"><span class="type">NMDeviceBt</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -228,7 +225,6 @@ nm_device_bt_get_hw_address (<em class="parameter"><code><a class="link" href="N
<a name="id-1.3.8.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -255,7 +251,6 @@ nm_device_bt_get_name (<em class="parameter"><code><a class="link" href="NMDevic
<div class="refsect3">
<a name="id-1.3.8.8.5.6"></a><h4>Returns</h4>
<p> the name of the device</p>
-<p></p>
</div>
</div>
<hr>
@@ -282,7 +277,6 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.3.8.8.6.6"></a><h4>Returns</h4>
<p> a combination of <a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NMBluetoothCapabilities"><span class="type">NMBluetoothCapabilities</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -350,32 +344,24 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<a name="NM-DEVICE-BT-ERROR:CAPS"></a><h3>NM_DEVICE_BT_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_BT_ERROR nm_device_bt_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BT-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_BT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_BT_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BT-NAME:CAPS"></a><h3>NM_DEVICE_BT_NAME</h3>
<pre class="programlisting">#define NM_DEVICE_BT_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BT-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_BT_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_BT_CAPABILITIES "bt-capabilities"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -383,7 +369,7 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMDeviceBt--bt-capabilities"></a><h3>The <code class="literal">“bt-capabilities”</code> property</h3>
<pre class="programlisting"> “bt-capabilities” <span class="type">guint</span></pre>
-<p></p>
+<p>The device's bluetooth capabilities, a combination of <a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManager.html#NMBluetoothCapabilities"><span class="type">NMBluetoothCapabilities</span></a>.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -391,7 +377,7 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMDeviceBt--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -399,14 +385,13 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMDeviceBt--name"></a><h3>The <code class="literal">“name”</code> property</h3>
<pre class="programlisting"> “name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the bluetooth device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceEthernet.html b/docs/libnm-glib/html/NMDeviceEthernet.html
index 86f4898cf..655a0441b 100644
--- a/docs/libnm-glib/html/NMDeviceEthernet.html
+++ b/docs/libnm-glib/html/NMDeviceEthernet.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceEthernet</title>
+<title>NMDeviceEthernet: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDevice.html" title="NMDevice">
<link rel="next" href="NMDeviceWifi.html" title="NMDeviceWifi">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -169,8 +169,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceEthernet.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceEthernet.functions_details"></a><h2>Functions</h2>
@@ -182,7 +180,6 @@ nm_device_ethernet_error_quark (<em class="parameter"><code><span class="type">v
<div class="refsect3">
<a name="id-1.3.5.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceEthernet.html" title="NMDeviceEthernet"><span class="type">NMDeviceEthernet</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -245,7 +242,6 @@ nm_device_ethernet_get_hw_address (<em class="parameter"><code><a class="link" h
<a name="id-1.3.5.8.4.6"></a><h4>Returns</h4>
<p> the active hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -274,7 +270,6 @@ nm_device_ethernet_get_permanent_hw_address
<a name="id-1.3.5.8.5.6"></a><h4>Returns</h4>
<p> the permanent hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -301,7 +296,6 @@ nm_device_ethernet_get_speed (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.3.5.8.6.6"></a><h4>Returns</h4>
<p> the speed of the device</p>
-<p></p>
</div>
</div>
<hr>
@@ -328,7 +322,6 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.3.5.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
</div>
@@ -389,40 +382,30 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<a name="NM-DEVICE-ETHERNET-ERROR:CAPS"></a><h3>NM_DEVICE_ETHERNET_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_ERROR nm_device_ethernet_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_ETHERNET_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-PERMANENT-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS "perm-hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-SPEED:CAPS"></a><h3>NM_DEVICE_ETHERNET_SPEED</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_SPEED "speed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-CARRIER:CAPS"></a><h3>NM_DEVICE_ETHERNET_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -430,7 +413,7 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -438,7 +421,7 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -446,7 +429,7 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--perm-hw-address"></a><h3>The <code class="literal">“perm-hw-address”</code> property</h3>
<pre class="programlisting"> “perm-hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The permanent hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -454,14 +437,13 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--speed"></a><h3>The <code class="literal">“speed”</code> property</h3>
<pre class="programlisting"> “speed” <span class="type">guint</span></pre>
-<p></p>
+<p>The speed of the device.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceGeneric.html b/docs/libnm-glib/html/NMDeviceGeneric.html
index e663d8d72..58b7c9ca8 100644
--- a/docs/libnm-glib/html/NMDeviceGeneric.html
+++ b/docs/libnm-glib/html/NMDeviceGeneric.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceGeneric</title>
+<title>NMDeviceGeneric: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceTeam.html" title="NMDeviceTeam">
<link rel="next" href="NMDeviceInfiniband.html" title="NMDeviceInfiniband">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -128,8 +128,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceGeneric.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceGeneric.functions_details"></a><h2>Functions</h2>
@@ -141,9 +139,8 @@ nm_device_generic_error_quark (<em class="parameter"><code><span class="type">vo
<div class="refsect3">
<a name="id-1.3.14.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceGeneric.html" title="NMDeviceGeneric"><span class="type">NMDeviceGeneric</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -179,7 +176,7 @@ nm_device_generic_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/h
<p> a new device. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -206,9 +203,8 @@ nm_device_generic_get_hw_address (<em class="parameter"><code><a class="link" hr
<a name="id-1.3.14.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -254,24 +250,18 @@ device, and must not be modified.</p>
<a name="NM-DEVICE-GENERIC-ERROR:CAPS"></a><h3>NM_DEVICE_GENERIC_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_GENERIC_ERROR nm_device_generic_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-GENERIC-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_GENERIC_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_GENERIC_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-GENERIC-TYPE-DESCRIPTION:CAPS"></a><h3>NM_DEVICE_GENERIC_TYPE_DESCRIPTION</h3>
<pre class="programlisting">#define NM_DEVICE_GENERIC_TYPE_DESCRIPTION "type-description"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -279,7 +269,7 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMDeviceGeneric--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -287,14 +277,14 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMDeviceGeneric--type-description"></a><h3>The <code class="literal">“type-description”</code> property</h3>
<pre class="programlisting"> “type-description” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>A description of the specific type of device this is, or <code class="literal">NULL</code>
+if not known.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceInfiniband.html b/docs/libnm-glib/html/NMDeviceInfiniband.html
index 48b6c887a..bb9523d5f 100644
--- a/docs/libnm-glib/html/NMDeviceInfiniband.html
+++ b/docs/libnm-glib/html/NMDeviceInfiniband.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceInfiniband</title>
+<title>NMDeviceInfiniband: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceGeneric.html" title="NMDeviceGeneric">
<link rel="next" href="NMDeviceVlan.html" title="NMDeviceVlan">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -135,8 +135,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceInfiniband.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceInfiniband.functions_details"></a><h2>Functions</h2>
@@ -148,7 +146,6 @@ nm_device_infiniband_error_quark (<em class="parameter"><code><span class="type"
<div class="refsect3">
<a name="id-1.3.15.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceInfiniband.html" title="NMDeviceInfiniband"><span class="type">NMDeviceInfiniband</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -211,7 +208,6 @@ nm_device_infiniband_get_hw_address (<em class="parameter"><code><a class="link"
<a name="id-1.3.15.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -238,7 +234,6 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.3.15.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
</div>
@@ -299,24 +294,18 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<a name="NM-DEVICE-INFINIBAND-ERROR:CAPS"></a><h3>NM_DEVICE_INFINIBAND_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_INFINIBAND_ERROR nm_device_infiniband_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-INFINIBAND-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_INFINIBAND_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_INFINIBAND_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-INFINIBAND-CARRIER:CAPS"></a><h3>NM_DEVICE_INFINIBAND_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_INFINIBAND_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -324,7 +313,7 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMDeviceInfiniband--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -332,14 +321,13 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMDeviceInfiniband--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceModem.html b/docs/libnm-glib/html/NMDeviceModem.html
index 2503475b6..15fe2aa1d 100644
--- a/docs/libnm-glib/html/NMDeviceModem.html
+++ b/docs/libnm-glib/html/NMDeviceModem.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceModem</title>
+<title>NMDeviceModem: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceWifi.html" title="NMDeviceWifi">
<link rel="next" href="NMDeviceBt.html" title="NMDeviceBt">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -127,8 +127,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceModem.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceModem.functions_details"></a><h2>Functions</h2>
@@ -140,7 +138,6 @@ nm_device_modem_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.3.7.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceModem.html" title="NMDeviceModem"><span class="type">NMDeviceModem</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -170,7 +167,6 @@ may require a firmware reload or reinitialization.</p>
<div class="refsect3">
<a name="id-1.3.7.8.3.6"></a><h4>Returns</h4>
<p> the generic access technology families the modem supports</p>
-<p></p>
</div>
</div>
<hr>
@@ -201,7 +197,6 @@ represents the network types the modem can immediately connect to.</p>
<a name="id-1.3.7.8.4.6"></a><h4>Returns</h4>
<p> the generic access technology families the modem supports without
a firmware reload or other reinitialization</p>
-<p></p>
</div>
</div>
</div>
@@ -255,24 +250,18 @@ a firmware reload or other reinitialization</p>
<a name="NM-DEVICE-MODEM-ERROR:CAPS"></a><h3>NM_DEVICE_MODEM_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_MODEM_ERROR nm_device_modem_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MODEM-MODEM-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_MODEM_MODEM_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_MODEM_MODEM_CAPABILITIES "modem-capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MODEM-CURRENT-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_MODEM_CURRENT_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_MODEM_CURRENT_CAPABILITIES "current-capabilities"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -280,7 +269,8 @@ a firmware reload or other reinitialization</p>
<div class="refsect2">
<a name="NMDeviceModem--current-capabilities"></a><h3>The <code class="literal">“current-capabilities”</code> property</h3>
<pre class="programlisting"> “current-capabilities” <span class="type">guint</span></pre>
-<p></p>
+<p>The generic family of access technologies the modem currently supports
+without a firmware reload or reinitialization.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -288,14 +278,16 @@ a firmware reload or other reinitialization</p>
<div class="refsect2">
<a name="NMDeviceModem--modem-capabilities"></a><h3>The <code class="literal">“modem-capabilities”</code> property</h3>
<pre class="programlisting"> “modem-capabilities” <span class="type">guint</span></pre>
-<p></p>
+<p>The generic family of access technologies the modem supports. Not all
+capabilities are available at the same time however; some modems require
+a firmware reload or other reinitialization to switch between eg
+CDMA/EVDO and GSM/UMTS.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceOlpcMesh.html b/docs/libnm-glib/html/NMDeviceOlpcMesh.html
index a505af82c..c48c4e369 100644
--- a/docs/libnm-glib/html/NMDeviceOlpcMesh.html
+++ b/docs/libnm-glib/html/NMDeviceOlpcMesh.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceOlpcMesh</title>
+<title>NMDeviceOlpcMesh: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceVlan.html" title="NMDeviceVlan">
<link rel="next" href="NMWimaxNsp.html" title="NMWimaxNsp">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -153,8 +153,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceOlpcMesh.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceOlpcMesh.functions_details"></a><h2>Functions</h2>
@@ -166,7 +164,6 @@ nm_device_olpc_mesh_error_quark (<em class="parameter"><code><span class="type">
<div class="refsect3">
<a name="id-1.3.17.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceOlpcMesh.html" title="NMDeviceOlpcMesh"><span class="type">NMDeviceOlpcMesh</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -229,7 +226,6 @@ nm_device_olpc_mesh_get_hw_address (<em class="parameter"><code><a class="link"
<a name="id-1.3.17.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -284,7 +280,6 @@ nm_device_olpc_mesh_get_active_channel
<div class="refsect3">
<a name="id-1.3.17.8.6.6"></a><h4>Returns</h4>
<p> active channel of the device</p>
-<p></p>
</div>
</div>
</div>
@@ -331,32 +326,24 @@ nm_device_olpc_mesh_get_active_channel
<a name="NM-DEVICE-OLPC-MESH-ERROR:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_ERROR nm_device_olpc_mesh_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-OLPC-MESH-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-OLPC-MESH-COMPANION:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_COMPANION</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_COMPANION "companion"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-OLPC-MESH-ACTIVE-CHANNEL:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL "active-channel"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -364,7 +351,7 @@ nm_device_olpc_mesh_get_active_channel
<div class="refsect2">
<a name="NMDeviceOlpcMesh--active-channel"></a><h3>The <code class="literal">“active-channel”</code> property</h3>
<pre class="programlisting"> “active-channel” <span class="type">guint</span></pre>
-<p></p>
+<p>The device's active channel.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -372,21 +359,20 @@ nm_device_olpc_mesh_get_active_channel
<div class="refsect2">
<a name="NMDeviceOlpcMesh--companion"></a><h3>The <code class="literal">“companion”</code> property</h3>
<pre class="programlisting"> “companion” <a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *</pre>
-<p></p>
+<p>The companion device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceOlpcMesh--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceTeam.html b/docs/libnm-glib/html/NMDeviceTeam.html
index 0b07f9eb9..2195f9aa6 100644
--- a/docs/libnm-glib/html/NMDeviceTeam.html
+++ b/docs/libnm-glib/html/NMDeviceTeam.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceTeam</title>
+<title>NMDeviceTeam: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceBridge.html" title="NMDeviceBridge">
<link rel="next" href="NMDeviceGeneric.html" title="NMDeviceGeneric">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -152,8 +152,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceTeam.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceTeam.functions_details"></a><h2>Functions</h2>
@@ -165,9 +163,8 @@ nm_device_team_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.3.13.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceTeam.html" title="NMDeviceTeam"><span class="type">NMDeviceTeam</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -203,7 +200,7 @@ nm_device_team_new (<em class="parameter"><code><a href="/usr/share/gtk-doc/html
<p> a new device. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -230,9 +227,8 @@ nm_device_team_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.3.13.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -258,9 +254,8 @@ nm_device_team_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.13.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -292,7 +287,7 @@ nm_device_team_get_slaves (<em class="parameter"><code><a class="link" href="NMD
copy used by the device, and must not be modified. </p>
<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> NMDevice]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -345,32 +340,24 @@ copy used by the device, and must not be modified. </p>
<a name="NM-DEVICE-TEAM-ERROR:CAPS"></a><h3>NM_DEVICE_TEAM_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_ERROR nm_device_team_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-TEAM-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_TEAM_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-TEAM-CARRIER:CAPS"></a><h3>NM_DEVICE_TEAM_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-TEAM-SLAVES:CAPS"></a><h3>NM_DEVICE_TEAM_SLAVES</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_SLAVES "slaves"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -378,7 +365,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceTeam--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -386,7 +373,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceTeam--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -394,13 +381,12 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceTeam--slaves"></a><h3>The <code class="literal">“slaves”</code> property</h3>
<pre class="programlisting"> “slaves” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>The devices (<a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a>) enslaved to the team device.</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceVlan.html b/docs/libnm-glib/html/NMDeviceVlan.html
index e28b1978c..51c89f0d9 100644
--- a/docs/libnm-glib/html/NMDeviceVlan.html
+++ b/docs/libnm-glib/html/NMDeviceVlan.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceVlan</title>
+<title>NMDeviceVlan: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceInfiniband.html" title="NMDeviceInfiniband">
<link rel="next" href="NMDeviceOlpcMesh.html" title="NMDeviceOlpcMesh">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -170,8 +170,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceVlan.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceVlan.functions_details"></a><h2>Functions</h2>
@@ -183,7 +181,6 @@ nm_device_vlan_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.3.16.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceVlan.html" title="NMDeviceVlan"><span class="type">NMDeviceVlan</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -246,7 +243,6 @@ nm_device_vlan_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.3.16.8.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -273,7 +269,6 @@ nm_device_vlan_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.16.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
<hr>
@@ -301,7 +296,7 @@ nm_device_vlan_get_parent (<em class="parameter"><code><a class="link" href="NMD
<p> the device's parent device. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -326,7 +321,6 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.16.8.7.5"></a><h4>Returns</h4>
<p> the device's VLAN ID</p>
-<p></p>
</div>
</div>
</div>
@@ -394,40 +388,30 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<a name="NM-DEVICE-VLAN-ERROR:CAPS"></a><h3>NM_DEVICE_VLAN_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_ERROR nm_device_vlan_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_VLAN_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-CARRIER:CAPS"></a><h3>NM_DEVICE_VLAN_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-PARENT:CAPS"></a><h3>NM_DEVICE_VLAN_PARENT</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_PARENT "parent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-VLAN-ID:CAPS"></a><h3>NM_DEVICE_VLAN_VLAN_ID</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_VLAN_ID "vlan-id"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -435,7 +419,7 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceVlan--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -443,7 +427,7 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceVlan--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -451,15 +435,15 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceVlan--parent"></a><h3>The <code class="literal">“parent”</code> property</h3>
<pre class="programlisting"> “parent” <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> *</pre>
-<p></p>
+<p>The devices's parent device.</p>
<p>Flags: Read</p>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceVlan--vlan-id"></a><h3>The <code class="literal">“vlan-id”</code> property</h3>
<pre class="programlisting"> “vlan-id” <span class="type">guint</span></pre>
-<p></p>
+<p>The device's VLAN ID.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 4095</p>
<p>Default value: 0</p>
@@ -467,7 +451,6 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceWifi.html b/docs/libnm-glib/html/NMDeviceWifi.html
index fb153226c..d739d92a7 100644
--- a/docs/libnm-glib/html/NMDeviceWifi.html
+++ b/docs/libnm-glib/html/NMDeviceWifi.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceWifi</title>
+<title>NMDeviceWifi: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceEthernet.html" title="NMDeviceEthernet">
<link rel="next" href="NMDeviceModem.html" title="NMDeviceModem">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -268,8 +268,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceWifi.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceWifi.functions_details"></a><h2>Functions</h2>
@@ -281,7 +279,6 @@ nm_device_wifi_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.3.6.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -344,7 +341,6 @@ nm_device_wifi_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.3.6.9.4.6"></a><h4>Returns</h4>
<p> the actual hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -373,7 +369,6 @@ nm_device_wifi_get_permanent_hw_address
<a name="id-1.3.6.9.5.6"></a><h4>Returns</h4>
<p> the permanent hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -400,7 +395,6 @@ nm_device_wifi_get_mode (<em class="parameter"><code><a class="link" href="NMDev
<div class="refsect3">
<a name="id-1.3.6.9.6.6"></a><h4>Returns</h4>
<p> the mode</p>
-<p></p>
</div>
</div>
<hr>
@@ -427,7 +421,6 @@ nm_device_wifi_get_bitrate (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.6.9.7.6"></a><h4>Returns</h4>
<p> the bit rate (kbit/s)</p>
-<p></p>
</div>
</div>
<hr>
@@ -454,7 +447,6 @@ nm_device_wifi_get_capabilities (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.3.6.9.8.6"></a><h4>Returns</h4>
<p> the capabilities</p>
-<p></p>
</div>
</div>
<hr>
@@ -557,8 +549,6 @@ The returned array is owned by the client and should not be modified. </p>
<span class="c_punctuation">(</span>*NMDeviceWifiRequestScanFn<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *device</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -597,7 +587,7 @@ to get available access points.</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
<div class="refsect1">
@@ -673,64 +663,48 @@ required by the connection</p>
<a name="NM-DEVICE-WIFI-ERROR:CAPS"></a><h3>NM_DEVICE_WIFI_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_ERROR nm_device_wifi_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_WIFI_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-PERMANENT-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS "perm-hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-MODE:CAPS"></a><h3>NM_DEVICE_WIFI_MODE</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-BITRATE:CAPS"></a><h3>NM_DEVICE_WIFI_BITRATE</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_BITRATE "bitrate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-ACTIVE-ACCESS-POINT:CAPS"></a><h3>NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT "active-access-point"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_WIFI_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_CAPABILITIES "wireless-capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-ACCESS-POINTS:CAPS"></a><h3>NM_DEVICE_WIFI_ACCESS_POINTS</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_ACCESS_POINTS "access-points"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -738,22 +712,22 @@ required by the connection</p>
<div class="refsect2">
<a name="NMDeviceWifi--access-points"></a><h3>The <code class="literal">“access-points”</code> property</h3>
<pre class="programlisting"> “access-points” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>List of all Wi-Fi access points the device can see.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWifi--active-access-point"></a><h3>The <code class="literal">“active-access-point”</code> property</h3>
<pre class="programlisting"> “active-access-point” <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> *</pre>
-<p></p>
+<p>The active <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWifi--bitrate"></a><h3>The <code class="literal">“bitrate”</code> property</h3>
<pre class="programlisting"> “bitrate” <span class="type">guint</span></pre>
-<p></p>
+<p>The bit rate of the device in kbit/s.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -761,7 +735,7 @@ required by the connection</p>
<div class="refsect2">
<a name="NMDeviceWifi--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -769,7 +743,7 @@ required by the connection</p>
<div class="refsect2">
<a name="NMDeviceWifi--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
<pre class="programlisting"> “mode” <span class="type">guint</span></pre>
-<p></p>
+<p>The mode of the device.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 3</p>
<p>Default value: 2</p>
@@ -778,7 +752,7 @@ required by the connection</p>
<div class="refsect2">
<a name="NMDeviceWifi--perm-hw-address"></a><h3>The <code class="literal">“perm-hw-address”</code> property</h3>
<pre class="programlisting"> “perm-hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -786,7 +760,7 @@ required by the connection</p>
<div class="refsect2">
<a name="NMDeviceWifi--wireless-capabilities"></a><h3>The <code class="literal">“wireless-capabilities”</code> property</h3>
<pre class="programlisting"> “wireless-capabilities” <span class="type">guint</span></pre>
-<p></p>
+<p>The wireless capabilities of the device.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -799,6 +773,34 @@ required by the connection</p>
user_function (<a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *device,
<span class="type">GObject</span> *ap,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> is added to the Wi-Fi device.</p>
+<div class="refsect3">
+<a name="id-1.3.6.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p>the Wi-Fi device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ap</p></td>
+<td class="parameter_description"><p>the new access point</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -808,12 +810,39 @@ user_function (<a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><sp
user_function (<a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *device,
<span class="type">GObject</span> *ap,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> is removed from the Wi-Fi device.</p>
+<div class="refsect3">
+<a name="id-1.3.6.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p>the Wi-Fi device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ap</p></td>
+<td class="parameter_description"><p>the removed access point</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMDeviceWimax.html b/docs/libnm-glib/html/NMDeviceWimax.html
index 911ec29b4..3ec917bc1 100644
--- a/docs/libnm-glib/html/NMDeviceWimax.html
+++ b/docs/libnm-glib/html/NMDeviceWimax.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMDeviceWimax</title>
+<title>NMDeviceWimax: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceBt.html" title="NMDeviceBt">
<link rel="next" href="NMDeviceAdsl.html" title="NMDeviceAdsl">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -269,8 +269,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceWimax.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceWimax.functions_details"></a><h2>Functions</h2>
@@ -282,7 +280,6 @@ nm_device_wimax_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.3.9.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><span class="type">NMDeviceWimax</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -345,7 +342,6 @@ nm_device_wimax_get_hw_address (<em class="parameter"><code><a class="link" href
<a name="id-1.3.9.9.4.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -465,7 +461,6 @@ device is not connected.</p>
<div class="refsect3">
<a name="id-1.3.9.9.8.6"></a><h4>Returns</h4>
<p> the center frequency in KHz, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -495,7 +490,6 @@ device is not connected.</p>
<div class="refsect3">
<a name="id-1.3.9.9.9.6"></a><h4>Returns</h4>
<p> the RSSI in dBm, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -524,7 +518,6 @@ meaning when the device is not connected.</p>
<div class="refsect3">
<a name="id-1.3.9.9.10.6"></a><h4>Returns</h4>
<p> the CINR in dB, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -553,7 +546,6 @@ nm_device_wimax_get_tx_power (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.3.9.9.11.6"></a><h4>Returns</h4>
<p> the TX power in dBm, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -580,7 +572,6 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect3">
<a name="id-1.3.9.9.12.6"></a><h4>Returns</h4>
<p> the ID of the serving Base Station, or <code class="literal">NULL</code></p>
-<p></p>
</div>
</div>
</div>
@@ -641,72 +632,54 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<a name="NM-DEVICE-WIMAX-ERROR:CAPS"></a><h3>NM_DEVICE_WIMAX_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_ERROR nm_device_wimax_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_WIMAX_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-ACTIVE-NSP:CAPS"></a><h3>NM_DEVICE_WIMAX_ACTIVE_NSP</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_ACTIVE_NSP "active-nsp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-CENTER-FREQUENCY:CAPS"></a><h3>NM_DEVICE_WIMAX_CENTER_FREQUENCY</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_CENTER_FREQUENCY "center-frequency"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-RSSI:CAPS"></a><h3>NM_DEVICE_WIMAX_RSSI</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_RSSI "rssi"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-CINR:CAPS"></a><h3>NM_DEVICE_WIMAX_CINR</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_CINR "cinr"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-TX-POWER:CAPS"></a><h3>NM_DEVICE_WIMAX_TX_POWER</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_TX_POWER "tx-power"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-BSID:CAPS"></a><h3>NM_DEVICE_WIMAX_BSID</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_BSID "bsid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-NSPS:CAPS"></a><h3>NM_DEVICE_WIMAX_NSPS</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_NSPS "nsps"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -714,14 +687,15 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--active-nsp"></a><h3>The <code class="literal">“active-nsp”</code> property</h3>
<pre class="programlisting"> “active-nsp” <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> *</pre>
-<p></p>
+<p>The active <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWimax--bsid"></a><h3>The <code class="literal">“bsid”</code> property</h3>
<pre class="programlisting"> “bsid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The ID of the serving base station as received from the network. Has
+no meaning when the device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -729,7 +703,9 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--center-frequency"></a><h3>The <code class="literal">“center-frequency”</code> property</h3>
<pre class="programlisting"> “center-frequency” <span class="type">guint</span></pre>
-<p></p>
+<p>The center frequency (in KHz) of the radio channel the device is using to
+communicate with the network when connected. Has no meaning when the
+device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -737,7 +713,9 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--cinr"></a><h3>The <code class="literal">“cinr”</code> property</h3>
<pre class="programlisting"> “cinr” <span class="type">gint</span></pre>
-<p></p>
+<p>CINR (Carrier to Interference + Noise Ratio) of the current radio link
+in dB. CINR is a more accurate measure of radio link quality. Has no
+meaning when the device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -745,7 +723,7 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -753,15 +731,18 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--nsps"></a><h3>The <code class="literal">“nsps”</code> property</h3>
<pre class="programlisting"> “nsps” <span class="type">NMObjectArray</span> *</pre>
-<p></p>
+<p>List of all WiMAX Network Service Providers the device can see.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWimax--rssi"></a><h3>The <code class="literal">“rssi”</code> property</h3>
<pre class="programlisting"> “rssi” <span class="type">gint</span></pre>
-<p></p>
+<p>RSSI of the current radio link in dBm. This value indicates how strong
+the raw received RF signal from the base station is, but does not
+indicate the overall quality of the radio link. Has no meaning when the
+device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -769,7 +750,9 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--tx-power"></a><h3>The <code class="literal">“tx-power”</code> property</h3>
<pre class="programlisting"> “tx-power” <span class="type">gint</span></pre>
-<p></p>
+<p>Average power of the last burst transmitted by the device, in units of
+0.5 dBm. i.e. a TxPower of -11 represents an actual device TX power of
+-5.5 dBm. Has no meaning when the device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -782,6 +765,34 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
user_function (<a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><span class="type">NMDeviceWimax</span></a> *self,
<span class="type">GObject</span> *nsp,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> is added to the wimax device.</p>
+<div class="refsect3">
+<a name="id-1.3.9.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>self</p></td>
+<td class="parameter_description"><p>the wimax device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nsp</p></td>
+<td class="parameter_description"><p>the new NSP</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -791,12 +802,39 @@ user_function (<a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><
user_function (<a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><span class="type">NMDeviceWimax</span></a> *self,
<span class="type">GObject</span> *nsp,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> is removed from the wimax device.</p>
+<div class="refsect3">
+<a name="id-1.3.9.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>self</p></td>
+<td class="parameter_description"><p>the wimax device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nsp</p></td>
+<td class="parameter_description"><p>the removed NSP</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMIP4Config.html b/docs/libnm-glib/html/NMIP4Config.html
index fec85cac3..b7b318e12 100644
--- a/docs/libnm-glib/html/NMIP4Config.html
+++ b/docs/libnm-glib/html/NMIP4Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMIP4Config</title>
+<title>NMIP4Config: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMAccessPoint.html" title="NMAccessPoint">
<link rel="next" href="NMIP6Config.html" title="NMIP6Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -201,8 +201,6 @@
</div>
<div class="refsect1">
<a name="NMIP4Config.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMIP4Config.functions_details"></a><h2>Functions</h2>
@@ -264,9 +262,8 @@ nm_ip4_config_get_gateway (<em class="parameter"><code><a class="link" href="NMI
<div class="refsect3">
<a name="id-1.3.20.8.3.6"></a><h4>Returns</h4>
<p> the IP4 address of the gateway.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -409,7 +406,7 @@ nm_ip4_config_get_searches (<em class="parameter"><code><a class="link" href="NM
internal copy used by the configuration, and must not be modified. </p>
<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -447,56 +444,42 @@ modified. </p>
<a name="NM-IP4-CONFIG-GATEWAY:CAPS"></a><h3>NM_IP4_CONFIG_GATEWAY</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_GATEWAY "gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP4-CONFIG-ADDRESSES:CAPS"></a><h3>NM_IP4_CONFIG_ADDRESSES</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_ADDRESSES "addresses"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP4-CONFIG-ROUTES:CAPS"></a><h3>NM_IP4_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP4-CONFIG-NAMESERVERS:CAPS"></a><h3>NM_IP4_CONFIG_NAMESERVERS</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP4-CONFIG-DOMAINS:CAPS"></a><h3>NM_IP4_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP4-CONFIG-SEARCHES:CAPS"></a><h3>NM_IP4_CONFIG_SEARCHES</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_SEARCHES "searches"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP4-CONFIG-WINS-SERVERS:CAPS"></a><h3>NM_IP4_CONFIG_WINS_SERVERS</h3>
<pre class="programlisting">#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -504,58 +487,57 @@ modified. </p>
<div class="refsect2">
<a name="NMIP4Config--addresses"></a><h3>The <code class="literal">“addresses”</code> property</h3>
<pre class="programlisting"> “addresses” <span class="type">gpointer</span></pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing <a href="https://developer.gnome.org/libnm-util/0.9/NMSettingIP4Config.html#NMIP4Address"><span class="type">NMIP4Address</span></a>es of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP4Config--domains"></a><h3>The <code class="literal">“domains”</code> property</h3>
<pre class="programlisting"> “domains” <span class="type">NMStringArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing domain strings of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP4Config--gateway"></a><h3>The <code class="literal">“gateway”</code> property</h3>
<pre class="programlisting"> “gateway” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IP4 gateway address of the configuration as string.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP4Config--nameservers"></a><h3>The <code class="literal">“nameservers”</code> property</h3>
<pre class="programlisting"> “nameservers” <span class="type">NMUintArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GArray</span> containing name servers (<span class="type">guint32s</span>) of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP4Config--routes"></a><h3>The <code class="literal">“routes”</code> property</h3>
<pre class="programlisting"> “routes” <span class="type">gpointer</span></pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing <span class="type">NMSettingIP4Routes</span> of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP4Config--searches"></a><h3>The <code class="literal">“searches”</code> property</h3>
<pre class="programlisting"> “searches” <span class="type">NMStringArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing dns search strings of the configuration.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP4Config--wins-servers"></a><h3>The <code class="literal">“wins-servers”</code> property</h3>
<pre class="programlisting"> “wins-servers” <span class="type">NMUintArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GArray</span> containing WINS servers (<span class="type">guint32s</span>) of the configuration.</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMIP6Config.html b/docs/libnm-glib/html/NMIP6Config.html
index 83f5f473e..ed97f3e50 100644
--- a/docs/libnm-glib/html/NMIP6Config.html
+++ b/docs/libnm-glib/html/NMIP6Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMIP6Config</title>
+<title>NMIP6Config: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMIP4Config.html" title="NMIP4Config">
<link rel="next" href="NMDHCP4Config.html" title="NMDHCP4Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -201,8 +201,6 @@
</div>
<div class="refsect1">
<a name="NMIP6Config.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMIP6Config.functions_details"></a><h2>Functions</h2>
@@ -264,9 +262,8 @@ nm_ip6_config_get_gateway (<em class="parameter"><code><a class="link" href="NMI
<div class="refsect3">
<a name="id-1.3.21.8.3.6"></a><h4>Returns</h4>
<p> the IPv6 gateway of the configuration.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -350,9 +347,8 @@ nm_ip6_config_get_num_nameservers (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.3.21.8.6.6"></a><h4>Returns</h4>
<p> the number of domain name servers</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -390,7 +386,7 @@ nm_ip6_config_get_nameserver (<em class="parameter"><code><a class="link" href="
. </p>
<p><span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> fixed-size=16][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> guint8][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -398,8 +394,9 @@ nm_ip6_config_get_nameserver (<em class="parameter"><code><a class="link" href="
<pre class="programlisting">const <span class="returnvalue">GSList</span> *
nm_ip6_config_get_nameservers (<em class="parameter"><code><a class="link" href="NMIP6Config.html" title="NMIP6Config"><span class="type">NMIP6Config</span></a> *config</code></em>);</pre>
<p>Gets the domain name servers (DNS).</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.3.21.8.8.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.8.8.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -414,11 +411,10 @@ nm_ip6_config_get_nameservers (<em class="parameter"><code><a class="link" href=
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.8.8.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.8.8.7"></a><h4>Returns</h4>
<p> a <span class="type">GSList</span> containing elements of type 'struct in6_addr' which
contain the addresses of nameservers of the configuration. This is the
internal copy used by the configuration and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -476,7 +472,7 @@ nm_ip6_config_get_searches (<em class="parameter"><code><a class="link" href="NM
This is the internal copy used by the configuration, and must not be modified. </p>
<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -485,48 +481,36 @@ This is the internal copy used by the configuration, and must not be modified. <
<a name="NM-IP6-CONFIG-GATEWAY:CAPS"></a><h3>NM_IP6_CONFIG_GATEWAY</h3>
<pre class="programlisting">#define NM_IP6_CONFIG_GATEWAY "gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP6-CONFIG-ADDRESSES:CAPS"></a><h3>NM_IP6_CONFIG_ADDRESSES</h3>
<pre class="programlisting">#define NM_IP6_CONFIG_ADDRESSES "addresses"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP6-CONFIG-ROUTES:CAPS"></a><h3>NM_IP6_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_IP6_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP6-CONFIG-NAMESERVERS:CAPS"></a><h3>NM_IP6_CONFIG_NAMESERVERS</h3>
<pre class="programlisting">#define NM_IP6_CONFIG_NAMESERVERS "nameservers"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP6-CONFIG-DOMAINS:CAPS"></a><h3>NM_IP6_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_IP6_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP6-CONFIG-SEARCHES:CAPS"></a><h3>NM_IP6_CONFIG_SEARCHES</h3>
<pre class="programlisting">#define NM_IP6_CONFIG_SEARCHES "searches"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -534,51 +518,55 @@ This is the internal copy used by the configuration, and must not be modified. <
<div class="refsect2">
<a name="NMIP6Config--addresses"></a><h3>The <code class="literal">“addresses”</code> property</h3>
<pre class="programlisting"> “addresses” <span class="type">NMIP6AddressObjectArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing the IPv6 addresses; use
+<a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-nm-utils.html#nm-utils-ip6-addresses-from-gvalue"><code class="function">nm_utils_ip6_addresses_from_gvalue()</code></a> to return a <span class="type">GSList</span> of
+<span class="type">NMSettingIP6Address</span> objects that is more usable than the raw data.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP6Config--domains"></a><h3>The <code class="literal">“domains”</code> property</h3>
<pre class="programlisting"> “domains” <span class="type">NMStringArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing domain strings of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP6Config--gateway"></a><h3>The <code class="literal">“gateway”</code> property</h3>
<pre class="programlisting"> “gateway” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IPv6 gateway as string</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP6Config--nameservers"></a><h3>The <code class="literal">“nameservers”</code> property</h3>
<pre class="programlisting"> “nameservers” <span class="type">NMIP6AddressArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing elements of type 'struct ip6_addr' which
+contain the addresses of nameservers of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP6Config--routes"></a><h3>The <code class="literal">“routes”</code> property</h3>
<pre class="programlisting"> “routes” <span class="type">NMIP6RouteObjectArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing the IPv6 routes; use
+<a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-nm-utils.html#nm-utils-ip6-routes-from-gvalue"><code class="function">nm_utils_ip6_routes_from_gvalue()</code></a> to return a <span class="type">GSList</span> of
+<span class="type">NMSettingIP6Address</span> objects that is more usable than the raw data.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIP6Config--searches"></a><h3>The <code class="literal">“searches”</code> property</h3>
<pre class="programlisting"> “searches” <span class="type">NMStringArray</span> *</pre>
-<p></p>
+<p>The <span class="type">GPtrArray</span> containing dns search strings of the configuration.</p>
<p>Flags: Read</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMObject.html b/docs/libnm-glib/html/NMObject.html
index 9cc58a6f0..296e0b0c7 100644
--- a/docs/libnm-glib/html/NMObject.html
+++ b/docs/libnm-glib/html/NMObject.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMObject</title>
+<title>NMObject: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDHCP6Config.html" title="NMDHCP6Config">
<link rel="next" href="NMRemoteConnection.html" title="NMRemoteConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -151,8 +151,6 @@
</div>
<div class="refsect1">
<a name="NMObject.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMObject.functions_details"></a><h2>Functions</h2>
@@ -164,7 +162,6 @@ nm_object_error_quark (<em class="parameter"><code><span class="type">void</span
<div class="refsect3">
<a name="id-1.3.24.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMObject.html" title="NMObject"><span class="type">NMObject</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -219,7 +216,6 @@ nm_object_get_path (<em class="parameter"><code><a class="link" href="NMObject.h
<a name="id-1.3.24.9.4.6"></a><h4>Returns</h4>
<p> the object's path. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -260,24 +256,18 @@ device, and must not be modified.</p>
<a name="NM-OBJECT-ERROR:CAPS"></a><h3>NM_OBJECT_ERROR</h3>
<pre class="programlisting">#define NM_OBJECT_ERROR nm_object_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-OBJECT-DBUS-CONNECTION:CAPS"></a><h3>NM_OBJECT_DBUS_CONNECTION</h3>
<pre class="programlisting">#define NM_OBJECT_DBUS_CONNECTION "dbus-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-OBJECT-DBUS-PATH:CAPS"></a><h3>NM_OBJECT_DBUS_PATH</h3>
<pre class="programlisting">#define NM_OBJECT_DBUS_PATH "dbus-path"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -285,14 +275,12 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMObject--dbus-connection"></a><h3>The <code class="literal">“dbus-connection”</code> property</h3>
<pre class="programlisting"> “dbus-connection” <a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="type">DBusGConnection</span></a> *</pre>
-<p></p>
<p>Flags: Read / Write / Construct Only</p>
</div>
<hr>
<div class="refsect2">
<a name="NMObject--dbus-path"></a><h3>The <code class="literal">“dbus-path”</code> property</h3>
<pre class="programlisting"> “dbus-path” <span class="type">gchar</span> *</pre>
-<p></p>
<p>Flags: Read / Write / Construct Only</p>
<p>Default value: NULL</p>
</div>
@@ -306,12 +294,48 @@ user_function (<a class="link" href="NMObject.html" title="NMObject"><span class
<span class="type">gpointer</span> error,
<span class="type">gpointer</span> failed_path,
<span class="type">gpointer</span> user_data)</pre>
+<p>Indicates that an error occured while creating an <a class="link" href="NMObject.html" title="NMObject"><span class="type">NMObject</span></a> object
+during property handling of <em class="parameter"><code>master_object</code></em>
+.</p>
+<p>Note: Be aware that the signal is private for libnm-glib's internal
+ use.</p>
+<div class="refsect3">
+<a name="id-1.3.24.12.2.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>master_object</p></td>
+<td class="parameter_description"><p>the object that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>error</p></td>
+<td class="parameter_description"><p>the error that occured while creating object</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>failed_path</p></td>
+<td class="parameter_description"><p>object path of the failed object</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMRemoteConnection.html b/docs/libnm-glib/html/NMRemoteConnection.html
index 64cd71542..c099c3dfb 100644
--- a/docs/libnm-glib/html/NMRemoteConnection.html
+++ b/docs/libnm-glib/html/NMRemoteConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMRemoteConnection</title>
+<title>NMRemoteConnection: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMObject.html" title="NMObject">
<link rel="next" href="NMRemoteSettings.html" title="NMRemoteSettings">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -235,8 +235,6 @@
</div>
<div class="refsect1">
<a name="NMRemoteConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMRemoteConnection.functions_details"></a><h2>Functions</h2>
@@ -244,8 +242,6 @@
<a name="NM-REMOTE-CONNECTION-ERROR:CAPS"></a><h3>NM_REMOTE_CONNECTION_ERROR</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_ERROR (nm_remote_connection_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -256,7 +252,6 @@ nm_remote_connection_error_quark (<em class="parameter"><code><span class="type"
<div class="refsect3">
<a name="id-1.3.25.9.3.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -373,7 +368,6 @@ nm_remote_connection_new (<em class="parameter"><code><a href="/usr/share/gtk-do
<div class="refsect3">
<a name="id-1.3.25.9.6.6"></a><h4>Returns</h4>
<p> the new remote connection object on success, or <code class="literal">NULL</code> on failure</p>
-<p></p>
</div>
</div>
<hr>
@@ -456,7 +450,7 @@ commit completes. </p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -496,7 +490,7 @@ save completes. </p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -604,9 +598,8 @@ nm_remote_connection_get_unsaved (<em class="parameter"><code><a class="link" hr
<p> <code class="literal">TRUE</code> if the remote connection contains changes that have not
been saved to disk, <code class="literal">FALSE</code> if the connection is the same as its on-disk
representation.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -645,40 +638,30 @@ representation.</p>
<a name="NM-REMOTE-CONNECTION-UNSAVED:CAPS"></a><h3>NM_REMOTE_CONNECTION_UNSAVED</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_UNSAVED "unsaved"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-CONNECTION-UPDATED:CAPS"></a><h3>NM_REMOTE_CONNECTION_UPDATED</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_UPDATED "updated"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-CONNECTION-REMOVED:CAPS"></a><h3>NM_REMOTE_CONNECTION_REMOVED</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_REMOVED "removed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NMRemoteConnectionCommitFunc"></a><h3>NMRemoteConnectionCommitFunc</h3>
<pre class="programlisting">typedef NMRemoteConnectionResultFunc NMRemoteConnectionCommitFunc;
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NMRemoteConnectionDeleteFunc"></a><h3>NMRemoteConnectionDeleteFunc</h3>
<pre class="programlisting">typedef NMRemoteConnectionResultFunc NMRemoteConnectionDeleteFunc;
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -686,21 +669,19 @@ representation.</p>
<div class="refsect2">
<a name="NMRemoteConnection--bus"></a><h3>The <code class="literal">“bus”</code> property</h3>
<pre class="programlisting"> “bus” <a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="type">DBusGConnection</span></a> *</pre>
-<p></p>
+<p>The <a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="type">DBusGConnection</span></a> that the <a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> is connected to.</p>
<p>Flags: Write / Construct Only</p>
</div>
<hr>
<div class="refsect2">
<a name="NMRemoteConnection--dbus-connection"></a><h3>The <code class="literal">“dbus-connection”</code> property</h3>
<pre class="programlisting"> “dbus-connection” <a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="type">DBusGConnection</span></a> *</pre>
-<p></p>
<p>Flags: Write / Construct Only</p>
</div>
<hr>
<div class="refsect2">
<a name="NMRemoteConnection--dbus-path"></a><h3>The <code class="literal">“dbus-path”</code> property</h3>
<pre class="programlisting"> “dbus-path” <span class="type">gchar</span> *</pre>
-<p></p>
<p>Flags: Write / Construct Only</p>
<p>Default value: NULL</p>
</div>
@@ -708,10 +689,11 @@ representation.</p>
<div class="refsect2">
<a name="NMRemoteConnection--unsaved"></a><h3>The <code class="literal">“unsaved”</code> property</h3>
<pre class="programlisting"> “unsaved” <span class="type">gboolean</span></pre>
-<p></p>
+<p><code class="literal">TRUE</code> if the remote connection contains changes that have not been saved
+to disk, <code class="literal">FALSE</code> if the connection is the same as its on-disk representation.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -721,6 +703,30 @@ representation.</p>
<pre class="programlisting"><span class="returnvalue">void</span>
user_function (<a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> *connection,
<span class="type">gpointer</span> user_data)</pre>
+<p>This signal is emitted when a connection is either deleted or becomes
+invisible to the current user.</p>
+<div class="refsect3">
+<a name="id-1.3.25.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>connection</p></td>
+<td class="parameter_description"><p>a <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -729,6 +735,30 @@ user_function (<a class="link" href="NMRemoteConnection.html" title="NMRemoteCon
<pre class="programlisting"><span class="returnvalue">void</span>
user_function (<a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> *connection,
<span class="type">gpointer</span> user_data)</pre>
+<p>This signal is emitted when a connection changes, and it is
+still visible to the user.</p>
+<div class="refsect3">
+<a name="id-1.3.25.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>connection</p></td>
+<td class="parameter_description"><p>a <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -743,7 +773,6 @@ user_function (<a class="link" href="NMRemoteConnection.html" title="NMRemoteCon
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMRemoteSettings.html b/docs/libnm-glib/html/NMRemoteSettings.html
index 7f333eb54..10d37ade1 100644
--- a/docs/libnm-glib/html/NMRemoteSettings.html
+++ b/docs/libnm-glib/html/NMRemoteSettings.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMRemoteSettings</title>
+<title>NMRemoteSettings: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMRemoteConnection.html" title="NMRemoteConnection">
<link rel="next" href="libnm-glib-nm-types.html" title="nm-types">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -435,7 +435,6 @@ nm_remote_settings_error_quark (<em class="parameter"><code><span class="type">v
<div class="refsect3">
<a name="id-1.3.26.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMRemoteSettings.html" title="NMRemoteSettings"><span class="type">NMRemoteSettings</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -446,8 +445,6 @@ nm_remote_settings_error_quark (<em class="parameter"><code><span class="type">v
<em class="parameter"><code><a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -458,8 +455,6 @@ nm_remote_settings_error_quark (<em class="parameter"><code><span class="type">v
<em class="parameter"><code><span class="type">char</span> **failures</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -468,8 +463,6 @@ nm_remote_settings_error_quark (<em class="parameter"><code><span class="type">v
<span class="c_punctuation">(</span>*NMRemoteSettingsSaveHostnameFunc<span class="c_punctuation">)</span> (<em class="parameter"><code><a class="link" href="NMRemoteSettings.html" title="NMRemoteSettings"><span class="type">NMRemoteSettings</span></a> *settings</code></em>,
<em class="parameter"><code><span class="type">GError</span> *error</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -498,7 +491,6 @@ want to avoid that.</p>
<div class="refsect3">
<a name="id-1.3.26.9.6.7"></a><h4>Returns</h4>
<p> the new remote settings object on success, or <code class="literal">NULL</code> on failure</p>
-<p></p>
</div>
</div>
<hr>
@@ -580,7 +572,6 @@ nm_remote_settings_new_finish (<em class="parameter"><code><span class="type">GA
<div class="refsect3">
<a name="id-1.3.26.9.8.6"></a><h4>Returns</h4>
<p> a new <a class="link" href="NMRemoteSettings.html" title="NMRemoteSettings"><span class="type">NMRemoteSettings</span></a> object, or <code class="literal">NULL</code> on error</p>
-<p></p>
</div>
</div>
<hr>
@@ -651,7 +642,7 @@ nm_remote_settings_get_connection_by_id
matching object was found. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -786,7 +777,6 @@ added, not the object itself</p></td>
<div class="refsect3">
<a name="id-1.3.26.9.13.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the request was successful, <code class="literal">FALSE</code> if it failed</p>
-<p></p>
</div>
</div>
<hr>
@@ -839,9 +829,8 @@ added, not the object itself</p></td>
<div class="refsect3">
<a name="id-1.3.26.9.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the request was successful, <code class="literal">FALSE</code> if it failed</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -901,9 +890,8 @@ filenames that failed to load. </p></td>
<p> <code class="literal">TRUE</code> if NetworkManager at least tried to load <em class="parameter"><code>filenames</code></em>
,
<code class="literal">FALSE</code> if an error occurred (eg, permission denied).</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -939,9 +927,8 @@ the in-memory state matches the on-disk state.</p>
<div class="refsect3">
<a name="id-1.3.26.9.16.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on failure</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -991,7 +978,6 @@ hostname operation completes. </p></td>
<div class="refsect3">
<a name="id-1.3.26.9.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the request was successful, <code class="literal">FALSE</code> if it failed</p>
-<p></p>
</div>
</div>
</div>
@@ -1049,56 +1035,42 @@ hostname operation completes. </p></td>
<a name="NM-REMOTE-SETTINGS-ERROR:CAPS"></a><h3>NM_REMOTE_SETTINGS_ERROR</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_ERROR nm_remote_settings_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-SETTINGS-BUS:CAPS"></a><h3>NM_REMOTE_SETTINGS_BUS</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_BUS "bus"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-SETTINGS-SERVICE-RUNNING:CAPS"></a><h3>NM_REMOTE_SETTINGS_SERVICE_RUNNING</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_SERVICE_RUNNING "service-running"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-SETTINGS-HOSTNAME:CAPS"></a><h3>NM_REMOTE_SETTINGS_HOSTNAME</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_HOSTNAME "hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-SETTINGS-CAN-MODIFY:CAPS"></a><h3>NM_REMOTE_SETTINGS_CAN_MODIFY</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_CAN_MODIFY "can-modify"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-SETTINGS-NEW-CONNECTION:CAPS"></a><h3>NM_REMOTE_SETTINGS_NEW_CONNECTION</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_NEW_CONNECTION "new-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-SETTINGS-CONNECTIONS-READ:CAPS"></a><h3>NM_REMOTE_SETTINGS_CONNECTIONS_READ</h3>
<pre class="programlisting">#define NM_REMOTE_SETTINGS_CONNECTIONS_READ "connections-read"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1106,14 +1078,15 @@ hostname operation completes. </p></td>
<div class="refsect2">
<a name="NMRemoteSettings--bus"></a><h3>The <code class="literal">“bus”</code> property</h3>
<pre class="programlisting"> “bus” <a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="type">DBusGConnection</span></a> *</pre>
-<p></p>
+<p>The <a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="type">DBusGConnection</span></a> that the <a class="link" href="NMRemoteSettings.html" title="NMRemoteSettings"><span class="type">NMRemoteSettings</span></a> is connected to. Defaults
+to the system bus if not specified.</p>
<p>Flags: Read / Write / Construct Only</p>
</div>
<hr>
<div class="refsect2">
<a name="NMRemoteSettings--can-modify"></a><h3>The <code class="literal">“can-modify”</code> property</h3>
<pre class="programlisting"> “can-modify” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, adding and modifying connections is supported.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -1121,7 +1094,8 @@ hostname operation completes. </p></td>
<div class="refsect2">
<a name="NMRemoteSettings--hostname"></a><h3>The <code class="literal">“hostname”</code> property</h3>
<pre class="programlisting"> “hostname” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The machine hostname stored in persistent configuration. This can be
+modified by calling <a class="link" href="NMRemoteSettings.html#nm-remote-settings-save-hostname" title="nm_remote_settings_save_hostname ()"><code class="function">nm_remote_settings_save_hostname()</code></a>.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -1129,7 +1103,7 @@ hostname operation completes. </p></td>
<div class="refsect2">
<a name="NMRemoteSettings--service-running"></a><h3>The <code class="literal">“service-running”</code> property</h3>
<pre class="programlisting"> “service-running” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the settings service is running.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -1159,7 +1133,6 @@ user_function (<a class="link" href="NMRemoteSettings.html" title="NMRemoteSetti
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMSecretAgent.html b/docs/libnm-glib/html/NMSecretAgent.html
index 367c64503..8acd02c17 100644
--- a/docs/libnm-glib/html/NMSecretAgent.html
+++ b/docs/libnm-glib/html/NMSecretAgent.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMSecretAgent</title>
+<title>NMSecretAgent: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="libnm-glib-nm-types.html" title="nm-types">
<link rel="next" href="NMVPNConnection.html" title="NMVPNConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -228,8 +228,6 @@
</div>
<div class="refsect1">
<a name="NMSecretAgent.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMSecretAgent.functions_details"></a><h2>Functions</h2>
@@ -237,20 +235,12 @@
<a name="NM-SECRET-AGENT-ERROR:CAPS"></a><h3>NM_SECRET_AGENT_ERROR</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_ERROR (nm_secret_agent_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="nm-secret-agent-error-quark"></a><h3>nm_secret_agent_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_secret_agent_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.28.9.3.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -299,7 +289,7 @@ something like this:</p>
<span class="normal"> <a href="https://developer.gnome.org/libnm-util/0.9/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-PSK:CAPS">NM_SETTING_WIRELESS_SECURITY_PSK</a></span><span class="symbol">,</span><span class="normal"> </span><span class="string">"my really cool PSK"</span><span class="symbol">,</span>
<span class="normal"> NULL</span><span class="symbol">);</span>
<span class="function"><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html#nm-connection-add-setting">nm_connection_add_setting</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">secrets</span><span class="symbol">,</span><span class="normal"> </span><span class="function">NM_SETTING</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">s_wsec</span><span class="symbol">));</span>
-<span class="normal">secrets_hash </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html#nm-connection-to-hash">nm_connection_to_hash</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">secrets</span><span class="symbol">,</span><span class="normal"> NM_SETTING_HASH_FLAG_ALL</span><span class="symbol">);</span>
+<span class="normal">secrets_hash </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html#nm-connection-to-hash">nm_connection_to_hash</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">secrets</span><span class="symbol">,</span><span class="normal"> <a href="https://developer.gnome.org/libnm-util/0.9/NMSetting.html#NM-SETTING-HASH-FLAG-ALL:CAPS">NM_SETTING_HASH_FLAG_ALL</a></span><span class="symbol">);</span>
<span class="symbol">(</span><span class="normal">call the NMSecretAgentGetSecretsFunc </span><span class="usertype">with</span><span class="normal"> secrets_hash</span><span class="symbol">)</span>
@@ -482,7 +472,6 @@ asynchronous operation and its success or failure is indicated via the
<p> a new <code class="literal">TRUE</code> if registration was successfully requested (this does
not mean registration itself was successful), <code class="literal">FALSE</code> if registration was not
successfully requested.</p>
-<p></p>
</div>
</div>
<hr>
@@ -511,7 +500,6 @@ store secrets on behalf of this user.</p>
<div class="refsect3">
<a name="id-1.3.28.9.8.6"></a><h4>Returns</h4>
<p> a new <code class="literal">TRUE</code> if unregistration was successful, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -537,7 +525,6 @@ nm_secret_agent_get_registered (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.3.28.9.9.5"></a><h4>Returns</h4>
<p> a <code class="literal">TRUE</code> if the agent is registered, <code class="literal">FALSE</code> if it is not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -807,7 +794,7 @@ authentication dialogs.</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -869,40 +856,30 @@ results or carrier changes.</p>
<a name="NM-SECRET-AGENT-IDENTIFIER:CAPS"></a><h3>NM_SECRET_AGENT_IDENTIFIER</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_IDENTIFIER "identifier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-AUTO-REGISTER:CAPS"></a><h3>NM_SECRET_AGENT_AUTO_REGISTER</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_AUTO_REGISTER "auto-register"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-REGISTERED:CAPS"></a><h3>NM_SECRET_AGENT_REGISTERED</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_REGISTERED "registered"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-CAPABILITIES:CAPS"></a><h3>NM_SECRET_AGENT_CAPABILITIES</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_CAPABILITIES "capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-REGISTRATION-RESULT:CAPS"></a><h3>NM_SECRET_AGENT_REGISTRATION_RESULT</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_REGISTRATION_RESULT "registration-result"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -910,7 +887,13 @@ results or carrier changes.</p>
<div class="refsect2">
<a name="NMSecretAgent--auto-register"></a><h3>The <code class="literal">“auto-register”</code> property</h3>
<pre class="programlisting"> “auto-register” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If TRUE, the agent will attempt to automatically register itself after
+it is created (via an idle handler) and to re-register itself if
+NetworkManager restarts. If FALSE, the agent does not automatically
+register with NetworkManager, and <a class="link" href="NMSecretAgent.html#nm-secret-agent-register" title="nm_secret_agent_register ()"><code class="function">nm_secret_agent_register()</code></a> must be
+called. If 'auto-register' is TRUE, calling <a class="link" href="NMSecretAgent.html#nm-secret-agent-unregister" title="nm_secret_agent_unregister ()"><code class="function">nm_secret_agent_unregister()</code></a>
+will suppress auto-registration until <a class="link" href="NMSecretAgent.html#nm-secret-agent-register" title="nm_secret_agent_register ()"><code class="function">nm_secret_agent_register()</code></a> is
+called, which re-enables auto-registration.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -918,14 +901,20 @@ results or carrier changes.</p>
<div class="refsect2">
<a name="NMSecretAgent--capabilities"></a><h3>The <code class="literal">“capabilities”</code> property</h3>
<pre class="programlisting"> “capabilities” <a class="link" href="NMSecretAgent.html#NMSecretAgentCapabilities" title="enum NMSecretAgentCapabilities"><span class="type">NMSecretAgentCapabilities</span></a></pre>
-<p></p>
+<p>A bitfield of <a class="link" href="NMSecretAgent.html#NMSecretAgentCapabilities" title="enum NMSecretAgentCapabilities"><code class="literal">NMSecretAgentCapabilities</code></a>.</p>
<p>Flags: Read / Write / Construct</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSecretAgent--identifier"></a><h3>The <code class="literal">“identifier”</code> property</h3>
<pre class="programlisting"> “identifier” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Identifies this agent; only one agent in each user session may use the
+same identifier. Identifier formatting follows the same rules as
+D-Bus bus names with the exception that the ':' character is not
+allowed. The valid set of characters is "A-Z[0-9]_-." and the
+identifier is limited in length to 255 characters with a minimum
+of 3 characters. An example valid identifier is 'org.gnome.nm-applet'
+(without quotes).</p>
<p>Flags: Read / Write / Construct Only</p>
<p>Default value: NULL</p>
</div>
@@ -933,7 +922,7 @@ results or carrier changes.</p>
<div class="refsect2">
<a name="NMSecretAgent--registered"></a><h3>The <code class="literal">“registered”</code> property</h3>
<pre class="programlisting"> “registered” <span class="type">gboolean</span></pre>
-<p></p>
+<p><code class="literal">TRUE</code> if the agent is registered with NetworkManager, <code class="literal">FALSE</code> if not.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -946,12 +935,41 @@ results or carrier changes.</p>
user_function (<a class="link" href="NMSecretAgent.html" title="NMSecretAgent"><span class="type">NMSecretAgent</span></a> *agent,
<span class="type">gpointer</span> error,
<span class="type">gpointer</span> user_data)</pre>
+<p>Indicates the result of a registration request; if <em class="parameter"><code>error</code></em>
+ is NULL the
+request was successful.</p>
+<div class="refsect3">
+<a name="id-1.3.28.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>agent</p></td>
+<td class="parameter_description"><p>the agent that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>error</p></td>
+<td class="parameter_description"><p>the error, if any, that occured while registering</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMVPNConnection.html b/docs/libnm-glib/html/NMVPNConnection.html
index c74274ea2..7562a5191 100644
--- a/docs/libnm-glib/html/NMVPNConnection.html
+++ b/docs/libnm-glib/html/NMVPNConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMVPNConnection</title>
+<title>NMVPNConnection: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMSecretAgent.html" title="NMSecretAgent">
<link rel="next" href="libnm-glib-NMVPNPlugin.html" title="NMVPNPlugin">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -135,8 +135,6 @@
</div>
<div class="refsect1">
<a name="NMVPNConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMVPNConnection.functions_details"></a><h2>Functions</h2>
@@ -198,7 +196,6 @@ nm_vpn_connection_get_vpn_state (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.3.29.9.3.6"></a><h4>Returns</h4>
<p> the VPN state of the active VPN connection.</p>
-<p></p>
</div>
</div>
<hr>
@@ -226,7 +223,6 @@ nm_vpn_connection_get_banner (<em class="parameter"><code><a class="link" href="
<a name="id-1.3.29.9.4.6"></a><h4>Returns</h4>
<p> the VPN login banner of the VPN connection. This is the internal
string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -236,16 +232,12 @@ string used by the connection, and must not be modified.</p>
<a name="NM-VPN-CONNECTION-VPN-STATE:CAPS"></a><h3>NM_VPN_CONNECTION_VPN_STATE</h3>
<pre class="programlisting">#define NM_VPN_CONNECTION_VPN_STATE "vpn-state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-CONNECTION-BANNER:CAPS"></a><h3>NM_VPN_CONNECTION_BANNER</h3>
<pre class="programlisting">#define NM_VPN_CONNECTION_BANNER "banner"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -253,7 +245,7 @@ string used by the connection, and must not be modified.</p>
<div class="refsect2">
<a name="NMVPNConnection--banner"></a><h3>The <code class="literal">“banner”</code> property</h3>
<pre class="programlisting"> “banner” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The VPN login banner of the active VPN connection.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -261,7 +253,7 @@ string used by the connection, and must not be modified.</p>
<div class="refsect2">
<a name="NMVPNConnection--vpn-state"></a><h3>The <code class="literal">“vpn-state”</code> property</h3>
<pre class="programlisting"> “vpn-state” <span class="type">guint</span></pre>
-<p></p>
+<p>The VPN state of the active VPN connection.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -281,7 +273,6 @@ user_function (<a class="link" href="NMVPNConnection.html" title="NMVPNConnectio
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/NMWimaxNsp.html b/docs/libnm-glib/html/NMWimaxNsp.html
index a83434a58..91cdbfeed 100644
--- a/docs/libnm-glib/html/NMWimaxNsp.html
+++ b/docs/libnm-glib/html/NMWimaxNsp.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMWimaxNsp</title>
+<title>NMWimaxNsp: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMDeviceOlpcMesh.html" title="NMDeviceOlpcMesh">
<link rel="next" href="NMAccessPoint.html" title="NMAccessPoint">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -155,8 +155,6 @@
</div>
<div class="refsect1">
<a name="NMWimaxNsp.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMWimaxNsp.functions_details"></a><h2>Functions</h2>
@@ -218,7 +216,6 @@ nm_wimax_nsp_get_name (<em class="parameter"><code><a class="link" href="NMWimax
<div class="refsect3">
<a name="id-1.3.18.8.3.6"></a><h4>Returns</h4>
<p> the name</p>
-<p></p>
</div>
</div>
<hr>
@@ -245,7 +242,6 @@ nm_wimax_nsp_get_signal_quality (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.3.18.8.4.6"></a><h4>Returns</h4>
<p> the signal quality</p>
-<p></p>
</div>
</div>
<hr>
@@ -272,7 +268,6 @@ nm_wimax_nsp_get_network_type (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.3.18.8.5.6"></a><h4>Returns</h4>
<p> the network type</p>
-<p></p>
</div>
</div>
<hr>
@@ -357,7 +352,6 @@ against</p></td>
<a name="id-1.3.18.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this WiMAX NSP,
<code class="literal">FALSE</code> if it cannot be.</p>
-<p></p>
</div>
</div>
</div>
@@ -367,24 +361,18 @@ against</p></td>
<a name="NM-WIMAX-NSP-NAME:CAPS"></a><h3>NM_WIMAX_NSP_NAME</h3>
<pre class="programlisting">#define NM_WIMAX_NSP_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-WIMAX-NSP-SIGNAL-QUALITY:CAPS"></a><h3>NM_WIMAX_NSP_SIGNAL_QUALITY</h3>
<pre class="programlisting">#define NM_WIMAX_NSP_SIGNAL_QUALITY "signal-quality"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-WIMAX-NSP-NETWORK-TYPE:CAPS"></a><h3>NM_WIMAX_NSP_NETWORK_TYPE</h3>
<pre class="programlisting">#define NM_WIMAX_NSP_NETWORK_TYPE "network-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -437,7 +425,7 @@ against</p></td>
<div class="refsect2">
<a name="NMWimaxNsp--name"></a><h3>The <code class="literal">“name”</code> property</h3>
<pre class="programlisting"> “name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the WiMAX NSP.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -445,7 +433,7 @@ against</p></td>
<div class="refsect2">
<a name="NMWimaxNsp--network-type"></a><h3>The <code class="literal">“network-type”</code> property</h3>
<pre class="programlisting"> “network-type” <span class="type">guint</span></pre>
-<p></p>
+<p>The network type of the WiMAX NSP.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -453,7 +441,7 @@ against</p></td>
<div class="refsect2">
<a name="NMWimaxNsp--signal-quality"></a><h3>The <code class="literal">“signal-quality”</code> property</h3>
<pre class="programlisting"> “signal-quality” <span class="type">guint</span></pre>
-<p></p>
+<p>The signal quality of the WiMAX NSP.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 100</p>
<p>Default value: 0</p>
@@ -461,7 +449,6 @@ against</p></td>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/annotation-glossary.html b/docs/libnm-glib/html/annotation-glossary.html
index 03f6d2633..52e56c4d0 100644
--- a/docs/libnm-glib/html/annotation-glossary.html
+++ b/docs/libnm-glib/html/annotation-glossary.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: Annotation Glossary</title>
+<title>Annotation Glossary: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="index.html" title="libnm-glib Reference Manual">
<link rel="prev" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -48,6 +48,8 @@
<a name="glsS"></a><h3 class="title">S</h3>
<dt><span class="glossterm"><a name="annotation-glossterm-scope%20async"></a>scope async</span></dt>
<dd class="glossdef"><p>The callback is valid until first called.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-skip"></a>skip</span></dt>
+<dd class="glossdef"><p>Exposed in C code, not necessarily available in other languages.</p></dd>
<a name="glsT"></a><h3 class="title">T</h3>
<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt>
<dd class="glossdef"><p>Free data container after the code is done.</p></dd>
@@ -55,9 +57,10 @@
<dd class="glossdef"><p>Free data after the code is done.</p></dd>
<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20none"></a>transfer none</span></dt>
<dd class="glossdef"><p>Don't free data after the code is done.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-type"></a>type</span></dt>
+<dd class="glossdef"><p>Override the parsed C type with given type.</p></dd>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/api-index-full.html b/docs/libnm-glib/html/api-index-full.html
index 59052d846..1f09388cc 100644
--- a/docs/libnm-glib/html/api-index-full.html
+++ b/docs/libnm-glib/html/api-index-full.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: API Index</title>
+<title>API Index: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="index.html" title="libnm-glib Reference Manual">
<link rel="prev" href="object-tree.html" title="Object Hierarchy">
<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -2573,7 +2573,6 @@
<dd></dd>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/ch02.html b/docs/libnm-glib/html/ch02.html
index 80d259a79..18b6b1ab6 100644
--- a/docs/libnm-glib/html/ch02.html
+++ b/docs/libnm-glib/html/ch02.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: libnm-glib API Reference</title>
+<title>libnm-glib API Reference: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="index.html" title="libnm-glib Reference Manual">
<link rel="prev" href="ref-overview.html" title="Object Overview">
<link rel="next" href="NMClient.html" title="NMClient">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -119,7 +119,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/index.html b/docs/libnm-glib/html/index.html
index fb5c1c38a..bec4797cf 100644
--- a/docs/libnm-glib/html/index.html
+++ b/docs/libnm-glib/html/index.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="next" href="ref-overview.html" title="Object Overview">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">libnm-glib Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for libnm-glib 1.0.2
+ for libnm-glib 1.0.4
The latest version of this documentation can be found on-line at
<a class="ulink" href="https://developer.gnome.org/libnm-glib/0.9/" target="_top">https://developer.gnome.org/libnm-glib/0.9/</a>.
@@ -150,7 +150,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/index.sgml b/docs/libnm-glib/html/index.sgml
index 7e4129177..5b020fd0b 100644
--- a/docs/libnm-glib/html/index.sgml
+++ b/docs/libnm-glib/html/index.sgml
@@ -63,8 +63,27 @@
<ANCHOR id="NM-CLIENT-ACTIVATING-CONNECTION:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-ACTIVATING-CONNECTION:CAPS">
<ANCHOR id="NM-CLIENT-DEVICES:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-DEVICES:CAPS">
<ANCHOR id="NMClientPermission" href="libnm-glib/NMClient.html#NMClientPermission">
+<ANCHOR id="NM-CLIENT-PERMISSION-NONE:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-NONE:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-NETWORK:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-NETWORK:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIFI:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIFI:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-WWAN:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WWAN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIMAX:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIMAX:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SLEEP-WAKE:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-SLEEP-WAKE:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-NETWORK-CONTROL:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-NETWORK-CONTROL:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-WIFI-SHARE-PROTECTED:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-PROTECTED:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-WIFI-SHARE-OPEN:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-OPEN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SETTINGS-MODIFY-SYSTEM:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-SYSTEM:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SETTINGS-MODIFY-OWN:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-OWN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SETTINGS-MODIFY-HOSTNAME:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-HOSTNAME:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-LAST:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-LAST:CAPS">
<ANCHOR id="NMClientPermissionResult" href="libnm-glib/NMClient.html#NMClientPermissionResult">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-UNKNOWN:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-RESULT-UNKNOWN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-YES:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-RESULT-YES:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-AUTH:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-RESULT-AUTH:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-NO:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-PERMISSION-RESULT-NO:CAPS">
<ANCHOR id="NMClientError" href="libnm-glib/NMClient.html#NMClientError">
+<ANCHOR id="NM-CLIENT-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-CLIENT-ERROR-MANAGER-NOT-RUNNING:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-ERROR-MANAGER-NOT-RUNNING:CAPS">
<ANCHOR id="NM-CLIENT-ERROR:CAPS" href="libnm-glib/NMClient.html#NM-CLIENT-ERROR:CAPS">
<ANCHOR id="NMClient.property-details" href="libnm-glib/NMClient.html#NMClient.property-details">
<ANCHOR id="NMClient--activating-connection" href="libnm-glib/NMClient.html#NMClient--activating-connection">
@@ -191,6 +210,8 @@
<ANCHOR id="NMDeviceDeactivateFn" href="libnm-glib/NMDevice.html#NMDeviceDeactivateFn">
<ANCHOR id="NMDevice.other_details" href="libnm-glib/NMDevice.html#NMDevice.other_details">
<ANCHOR id="NMDeviceError" href="libnm-glib/NMDevice.html#NMDeviceError">
+<ANCHOR id="NM-DEVICE-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDevice.html#NM-DEVICE-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-INTERFACE-MISMATCH:CAPS" href="libnm-glib/NMDevice.html#NM-DEVICE-ERROR-INTERFACE-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-ERROR:CAPS" href="libnm-glib/NMDevice.html#NM-DEVICE-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-DEVICE-TYPE:CAPS" href="libnm-glib/NMDevice.html#NM-DEVICE-DEVICE-TYPE:CAPS">
<ANCHOR id="NM-DEVICE-UDI:CAPS" href="libnm-glib/NMDevice.html#NM-DEVICE-UDI:CAPS">
@@ -256,6 +277,11 @@
<ANCHOR id="nm-device-ethernet-get-carrier" href="libnm-glib/NMDeviceEthernet.html#nm-device-ethernet-get-carrier">
<ANCHOR id="NMDeviceEthernet.other_details" href="libnm-glib/NMDeviceEthernet.html#NMDeviceEthernet.other_details">
<ANCHOR id="NMDeviceEthernetError" href="libnm-glib/NMDeviceEthernet.html#NMDeviceEthernetError">
+<ANCHOR id="NM-DEVICE-ETHERNET-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-ETHERNET-ERROR-NOT-ETHERNET-CONNECTION:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-NOT-ETHERNET-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-ETHERNET-ERROR-INVALID-ETHERNET-CONNECTION:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-INVALID-ETHERNET-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-ETHERNET-ERROR-INVALID-DEVICE-MAC:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-INVALID-DEVICE-MAC:CAPS">
+<ANCHOR id="NM-DEVICE-ETHERNET-ERROR-MAC-MISMATCH:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-MAC-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-ETHERNET-ERROR:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-ETHERNET-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-ETHERNET-PERMANENT-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceEthernet.html#NM-DEVICE-ETHERNET-PERMANENT-HW-ADDRESS:CAPS">
@@ -288,6 +314,13 @@
<ANCHOR id="nm-device-wifi-request-scan-simple" href="libnm-glib/NMDeviceWifi.html#nm-device-wifi-request-scan-simple">
<ANCHOR id="NMDeviceWifi.other_details" href="libnm-glib/NMDeviceWifi.html#NMDeviceWifi.other_details">
<ANCHOR id="NMDeviceWifiError" href="libnm-glib/NMDeviceWifi.html#NMDeviceWifiError">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-NOT-WIFI-CONNECTION:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-NOT-WIFI-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-INVALID-WIFI-CONNECTION:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-INVALID-WIFI-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-INVALID-DEVICE-MAC:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-INVALID-DEVICE-MAC:CAPS">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-MAC-MISMATCH:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-MAC-MISMATCH:CAPS">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-MISSING-DEVICE-WPA-CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-MISSING-DEVICE-WPA-CAPS">
+<ANCHOR id="NM-DEVICE-WIFI-ERROR-MISSING-DEVICE-RSN-CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-MISSING-DEVICE-RSN-CAPS">
<ANCHOR id="NM-DEVICE-WIFI-ERROR:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-WIFI-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-WIFI-PERMANENT-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceWifi.html#NM-DEVICE-WIFI-PERMANENT-HW-ADDRESS:CAPS">
@@ -319,6 +352,10 @@
<ANCHOR id="nm-device-modem-get-current-capabilities" href="libnm-glib/NMDeviceModem.html#nm-device-modem-get-current-capabilities">
<ANCHOR id="NMDeviceModem.other_details" href="libnm-glib/NMDeviceModem.html#NMDeviceModem.other_details">
<ANCHOR id="NMDeviceModemError" href="libnm-glib/NMDeviceModem.html#NMDeviceModemError">
+<ANCHOR id="NM-DEVICE-MODEM-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-ERROR-NOT-MODEM-CONNECTION:CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-NOT-MODEM-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-ERROR-INVALID-MODEM-CONNECTION:CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-INVALID-MODEM-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-ERROR-MISSING-DEVICE-CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-MISSING-DEVICE-CAPS">
<ANCHOR id="NM-DEVICE-MODEM-ERROR:CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-MODEM-MODEM-CAPABILITIES:CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-MODEM-CAPABILITIES:CAPS">
<ANCHOR id="NM-DEVICE-MODEM-CURRENT-CAPABILITIES:CAPS" href="libnm-glib/NMDeviceModem.html#NM-DEVICE-MODEM-CURRENT-CAPABILITIES:CAPS">
@@ -339,6 +376,12 @@
<ANCHOR id="nm-device-bt-get-capabilities" href="libnm-glib/NMDeviceBt.html#nm-device-bt-get-capabilities">
<ANCHOR id="NMDeviceBt.other_details" href="libnm-glib/NMDeviceBt.html#NMDeviceBt.other_details">
<ANCHOR id="NMDeviceBtError" href="libnm-glib/NMDeviceBt.html#NMDeviceBtError">
+<ANCHOR id="NM-DEVICE-BT-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-BT-ERROR-NOT-BT-CONNECTION:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR-NOT-BT-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-BT-ERROR-INVALID-BT-CONNECTION:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR-INVALID-BT-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-BT-ERROR-INVALID-DEVICE-MAC:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR-INVALID-DEVICE-MAC:CAPS">
+<ANCHOR id="NM-DEVICE-BT-ERROR-MAC-MISMATCH:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR-MAC-MISMATCH:CAPS">
+<ANCHOR id="NM-DEVICE-BT-ERROR-MISSING-DEVICE-CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR-MISSING-DEVICE-CAPS">
<ANCHOR id="NM-DEVICE-BT-ERROR:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-BT-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-BT-NAME:CAPS" href="libnm-glib/NMDeviceBt.html#NM-DEVICE-BT-NAME:CAPS">
@@ -368,6 +411,11 @@
<ANCHOR id="nm-device-wimax-get-bsid" href="libnm-glib/NMDeviceWimax.html#nm-device-wimax-get-bsid">
<ANCHOR id="NMDeviceWimax.other_details" href="libnm-glib/NMDeviceWimax.html#NMDeviceWimax.other_details">
<ANCHOR id="NMDeviceWimaxError" href="libnm-glib/NMDeviceWimax.html#NMDeviceWimaxError">
+<ANCHOR id="NM-DEVICE-WIMAX-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-WIMAX-ERROR-NOT-WIMAX-CONNECTION:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-NOT-WIMAX-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-WIMAX-ERROR-INVALID-WIMAX-CONNECTION:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-INVALID-WIMAX-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-WIMAX-ERROR-INVALID-DEVICE-MAC:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-INVALID-DEVICE-MAC:CAPS">
+<ANCHOR id="NM-DEVICE-WIMAX-ERROR-MAC-MISMATCH:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-MAC-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-WIMAX-ERROR:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-WIMAX-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-WIMAX-ACTIVE-NSP:CAPS" href="libnm-glib/NMDeviceWimax.html#NM-DEVICE-WIMAX-ACTIVE-NSP:CAPS">
@@ -401,6 +449,9 @@
<ANCHOR id="nm-device-adsl-get-carrier" href="libnm-glib/NMDeviceAdsl.html#nm-device-adsl-get-carrier">
<ANCHOR id="NMDeviceAdsl.other_details" href="libnm-glib/NMDeviceAdsl.html#NMDeviceAdsl.other_details">
<ANCHOR id="NMDeviceAdslError" href="libnm-glib/NMDeviceAdsl.html#NMDeviceAdslError">
+<ANCHOR id="NM-DEVICE-ADSL-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-ADSL-ERROR-NOT-ADSL-CONNECTION:CAPS" href="libnm-glib/NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR-NOT-ADSL-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-ADSL-ERROR-INVALID-ADSL-CONNECTION:CAPS" href="libnm-glib/NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR-INVALID-ADSL-CONNECTION:CAPS">
<ANCHOR id="NM-DEVICE-ADSL-ERROR:CAPS" href="libnm-glib/NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-ADSL-CARRIER:CAPS" href="libnm-glib/NMDeviceAdsl.html#NM-DEVICE-ADSL-CARRIER:CAPS">
<ANCHOR id="NMDeviceAdsl.property-details" href="libnm-glib/NMDeviceAdsl.html#NMDeviceAdsl.property-details">
@@ -419,6 +470,10 @@
<ANCHOR id="nm-device-bond-get-slaves" href="libnm-glib/NMDeviceBond.html#nm-device-bond-get-slaves">
<ANCHOR id="NMDeviceBond.other_details" href="libnm-glib/NMDeviceBond.html#NMDeviceBond.other_details">
<ANCHOR id="NMDeviceBondError" href="libnm-glib/NMDeviceBond.html#NMDeviceBondError">
+<ANCHOR id="NM-DEVICE-BOND-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-BOND-ERROR-NOT-BOND-CONNECTION:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-ERROR-NOT-BOND-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-BOND-ERROR-INVALID-BOND-CONNECTION:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-ERROR-INVALID-BOND-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-BOND-ERROR-INTERFACE-MISMATCH:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-ERROR-INTERFACE-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-BOND-ERROR:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-BOND-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-BOND-CARRIER:CAPS" href="libnm-glib/NMDeviceBond.html#NM-DEVICE-BOND-CARRIER:CAPS">
@@ -441,6 +496,10 @@
<ANCHOR id="nm-device-bridge-get-slaves" href="libnm-glib/NMDeviceBridge.html#nm-device-bridge-get-slaves">
<ANCHOR id="NMDeviceBridge.other_details" href="libnm-glib/NMDeviceBridge.html#NMDeviceBridge.other_details">
<ANCHOR id="NMDeviceBridgeError" href="libnm-glib/NMDeviceBridge.html#NMDeviceBridgeError">
+<ANCHOR id="NM-DEVICE-BRIDGE-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-BRIDGE-ERROR-NOT-BRIDGE-CONNECTION:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-NOT-BRIDGE-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-BRIDGE-ERROR-INVALID-BRIDGE-CONNECTION:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-INVALID-BRIDGE-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-BRIDGE-ERROR-INTERFACE-MISMATCH:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-INTERFACE-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-BRIDGE-ERROR:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-BRIDGE-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-BRIDGE-CARRIER:CAPS" href="libnm-glib/NMDeviceBridge.html#NM-DEVICE-BRIDGE-CARRIER:CAPS">
@@ -463,6 +522,10 @@
<ANCHOR id="nm-device-team-get-slaves" href="libnm-glib/NMDeviceTeam.html#nm-device-team-get-slaves">
<ANCHOR id="NMDeviceTeam.other_details" href="libnm-glib/NMDeviceTeam.html#NMDeviceTeam.other_details">
<ANCHOR id="NMDeviceTeamError" href="libnm-glib/NMDeviceTeam.html#NMDeviceTeamError">
+<ANCHOR id="NM-DEVICE-TEAM-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-TEAM-ERROR-NOT-TEAM-CONNECTION:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-NOT-TEAM-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-TEAM-ERROR-INVALID-TEAM-CONNECTION:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-INVALID-TEAM-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-TEAM-ERROR-INTERFACE-MISMATCH:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-INTERFACE-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-TEAM-ERROR:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-TEAM-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-TEAM-CARRIER:CAPS" href="libnm-glib/NMDeviceTeam.html#NM-DEVICE-TEAM-CARRIER:CAPS">
@@ -483,6 +546,9 @@
<ANCHOR id="nm-device-generic-get-hw-address" href="libnm-glib/NMDeviceGeneric.html#nm-device-generic-get-hw-address">
<ANCHOR id="NMDeviceGeneric.other_details" href="libnm-glib/NMDeviceGeneric.html#NMDeviceGeneric.other_details">
<ANCHOR id="NMDeviceGenericError" href="libnm-glib/NMDeviceGeneric.html#NMDeviceGenericError">
+<ANCHOR id="NM-DEVICE-GENERIC-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-GENERIC-ERROR-NOT-GENERIC-CONNECTION:CAPS" href="libnm-glib/NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR-NOT-GENERIC-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-GENERIC-ERROR-MISSING-INTERFACE-NAME:CAPS" href="libnm-glib/NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR-MISSING-INTERFACE-NAME:CAPS">
<ANCHOR id="NM-DEVICE-GENERIC-ERROR:CAPS" href="libnm-glib/NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-GENERIC-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceGeneric.html#NM-DEVICE-GENERIC-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-GENERIC-TYPE-DESCRIPTION:CAPS" href="libnm-glib/NMDeviceGeneric.html#NM-DEVICE-GENERIC-TYPE-DESCRIPTION:CAPS">
@@ -502,6 +568,11 @@
<ANCHOR id="nm-device-infiniband-get-carrier" href="libnm-glib/NMDeviceInfiniband.html#nm-device-infiniband-get-carrier">
<ANCHOR id="NMDeviceInfiniband.other_details" href="libnm-glib/NMDeviceInfiniband.html#NMDeviceInfiniband.other_details">
<ANCHOR id="NMDeviceInfinibandError" href="libnm-glib/NMDeviceInfiniband.html#NMDeviceInfinibandError">
+<ANCHOR id="NM-DEVICE-INFINIBAND-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-INFINIBAND-ERROR-NOT-INFINIBAND-CONNECTION:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-NOT-INFINIBAND-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-INFINIBAND-ERROR-INVALID-INFINIBAND-CONNECTION:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-INVALID-INFINIBAND-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-INFINIBAND-ERROR-INVALID-DEVICE-MAC:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-INVALID-DEVICE-MAC:CAPS">
+<ANCHOR id="NM-DEVICE-INFINIBAND-ERROR-MAC-MISMATCH:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-MAC-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-INFINIBAND-ERROR:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-INFINIBAND-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-INFINIBAND-CARRIER:CAPS" href="libnm-glib/NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-CARRIER:CAPS">
@@ -523,6 +594,12 @@
<ANCHOR id="nm-device-vlan-get-vlan-id" href="libnm-glib/NMDeviceVlan.html#nm-device-vlan-get-vlan-id">
<ANCHOR id="NMDeviceVlan.other_details" href="libnm-glib/NMDeviceVlan.html#NMDeviceVlan.other_details">
<ANCHOR id="NMDeviceVlanError" href="libnm-glib/NMDeviceVlan.html#NMDeviceVlanError">
+<ANCHOR id="NM-DEVICE-VLAN-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-VLAN-ERROR-NOT-VLAN-CONNECTION:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-NOT-VLAN-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-VLAN-ERROR-INVALID-VLAN-CONNECTION:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-INVALID-VLAN-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-VLAN-ERROR-ID-MISMATCH:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-ID-MISMATCH:CAPS">
+<ANCHOR id="NM-DEVICE-VLAN-ERROR-INTERFACE-MISMATCH:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-INTERFACE-MISMATCH:CAPS">
+<ANCHOR id="NM-DEVICE-VLAN-ERROR-MAC-MISMATCH:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-MAC-MISMATCH:CAPS">
<ANCHOR id="NM-DEVICE-VLAN-ERROR:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-VLAN-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-VLAN-CARRIER:CAPS" href="libnm-glib/NMDeviceVlan.html#NM-DEVICE-VLAN-CARRIER:CAPS">
@@ -547,6 +624,9 @@
<ANCHOR id="nm-device-olpc-mesh-get-active-channel" href="libnm-glib/NMDeviceOlpcMesh.html#nm-device-olpc-mesh-get-active-channel">
<ANCHOR id="NMDeviceOlpcMesh.other_details" href="libnm-glib/NMDeviceOlpcMesh.html#NMDeviceOlpcMesh.other_details">
<ANCHOR id="NMDeviceOlpcMeshError" href="libnm-glib/NMDeviceOlpcMesh.html#NMDeviceOlpcMeshError">
+<ANCHOR id="NM-DEVICE-OLPC-MESH-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-OLPC-MESH-ERROR-NOT-OLPC-MESH-CONNECTION:CAPS" href="libnm-glib/NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR-NOT-OLPC-MESH-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-OLPC-MESH-ERROR-INVALID-OLPC-MESH-CONNECTION:CAPS" href="libnm-glib/NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR-INVALID-OLPC-MESH-CONNECTION:CAPS">
<ANCHOR id="NM-DEVICE-OLPC-MESH-ERROR:CAPS" href="libnm-glib/NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR:CAPS">
<ANCHOR id="NM-DEVICE-OLPC-MESH-HW-ADDRESS:CAPS" href="libnm-glib/NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-HW-ADDRESS:CAPS">
<ANCHOR id="NM-DEVICE-OLPC-MESH-COMPANION:CAPS" href="libnm-glib/NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-COMPANION:CAPS">
@@ -573,6 +653,10 @@
<ANCHOR id="NM-WIMAX-NSP-SIGNAL-QUALITY:CAPS" href="libnm-glib/NMWimaxNsp.html#NM-WIMAX-NSP-SIGNAL-QUALITY:CAPS">
<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE:CAPS" href="libnm-glib/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE:CAPS">
<ANCHOR id="NMWimaxNspNetworkType" href="libnm-glib/NMWimaxNsp.html#NMWimaxNspNetworkType">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-UNKNOWN:CAPS" href="libnm-glib/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-HOME:CAPS" href="libnm-glib/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-HOME:CAPS">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-PARTNER:CAPS" href="libnm-glib/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-PARTNER:CAPS">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-ROAMING-PARTNER:CAPS" href="libnm-glib/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-ROAMING-PARTNER:CAPS">
<ANCHOR id="NMWimaxNsp.property-details" href="libnm-glib/NMWimaxNsp.html#NMWimaxNsp.property-details">
<ANCHOR id="NMWimaxNsp--name" href="libnm-glib/NMWimaxNsp.html#NMWimaxNsp--name">
<ANCHOR id="NMWimaxNsp--network-type" href="libnm-glib/NMWimaxNsp.html#NMWimaxNsp--network-type">
@@ -721,6 +805,8 @@
<ANCHOR id="nm-object-get-path" href="libnm-glib/NMObject.html#nm-object-get-path">
<ANCHOR id="NMObject.other_details" href="libnm-glib/NMObject.html#NMObject.other_details">
<ANCHOR id="NMObjectError" href="libnm-glib/NMObject.html#NMObjectError">
+<ANCHOR id="NM-OBJECT-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMObject.html#NM-OBJECT-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-OBJECT-ERROR-OBJECT-CREATION-FAILURE:CAPS" href="libnm-glib/NMObject.html#NM-OBJECT-ERROR-OBJECT-CREATION-FAILURE:CAPS">
<ANCHOR id="NM-OBJECT-ERROR:CAPS" href="libnm-glib/NMObject.html#NM-OBJECT-ERROR:CAPS">
<ANCHOR id="NM-OBJECT-DBUS-CONNECTION:CAPS" href="libnm-glib/NMObject.html#NM-OBJECT-DBUS-CONNECTION:CAPS">
<ANCHOR id="NM-OBJECT-DBUS-PATH:CAPS" href="libnm-glib/NMObject.html#NM-OBJECT-DBUS-PATH:CAPS">
@@ -750,6 +836,8 @@
<ANCHOR id="nm-remote-connection-get-unsaved" href="libnm-glib/NMRemoteConnection.html#nm-remote-connection-get-unsaved">
<ANCHOR id="NMRemoteConnection.other_details" href="libnm-glib/NMRemoteConnection.html#NMRemoteConnection.other_details">
<ANCHOR id="NMRemoteConnectionError" href="libnm-glib/NMRemoteConnection.html#NMRemoteConnectionError">
+<ANCHOR id="NM-REMOTE-CONNECTION-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMRemoteConnection.html#NM-REMOTE-CONNECTION-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-REMOTE-CONNECTION-ERROR-DISCONNECTED:CAPS" href="libnm-glib/NMRemoteConnection.html#NM-REMOTE-CONNECTION-ERROR-DISCONNECTED:CAPS">
<ANCHOR id="NM-REMOTE-CONNECTION-UNSAVED:CAPS" href="libnm-glib/NMRemoteConnection.html#NM-REMOTE-CONNECTION-UNSAVED:CAPS">
<ANCHOR id="NM-REMOTE-CONNECTION-UPDATED:CAPS" href="libnm-glib/NMRemoteConnection.html#NM-REMOTE-CONNECTION-UPDATED:CAPS">
<ANCHOR id="NM-REMOTE-CONNECTION-REMOVED:CAPS" href="libnm-glib/NMRemoteConnection.html#NM-REMOTE-CONNECTION-REMOVED:CAPS">
@@ -790,6 +878,10 @@
<ANCHOR id="nm-remote-settings-save-hostname" href="libnm-glib/NMRemoteSettings.html#nm-remote-settings-save-hostname">
<ANCHOR id="NMRemoteSettings.other_details" href="libnm-glib/NMRemoteSettings.html#NMRemoteSettings.other_details">
<ANCHOR id="NMRemoteSettingsError" href="libnm-glib/NMRemoteSettings.html#NMRemoteSettingsError">
+<ANCHOR id="NM-REMOTE-SETTINGS-ERROR-UNKNOWN:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-REMOTE-SETTINGS-ERROR-CONNECTION-REMOVED:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-CONNECTION-REMOVED:CAPS">
+<ANCHOR id="NM-REMOTE-SETTINGS-ERROR-CONNECTION-UNAVAILABLE:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-CONNECTION-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-REMOTE-SETTINGS-ERROR-SERVICE-UNAVAILABLE:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-SERVICE-UNAVAILABLE:CAPS">
<ANCHOR id="NM-REMOTE-SETTINGS-ERROR:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR:CAPS">
<ANCHOR id="NM-REMOTE-SETTINGS-BUS:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-BUS:CAPS">
<ANCHOR id="NM-REMOTE-SETTINGS-SERVICE-RUNNING:CAPS" href="libnm-glib/NMRemoteSettings.html#NM-REMOTE-SETTINGS-SERVICE-RUNNING:CAPS">
@@ -831,8 +923,21 @@
<ANCHOR id="nm-secret-agent-delete-secrets" href="libnm-glib/NMSecretAgent.html#nm-secret-agent-delete-secrets">
<ANCHOR id="NMSecretAgent.other_details" href="libnm-glib/NMSecretAgent.html#NMSecretAgent.other_details">
<ANCHOR id="NMSecretAgentError" href="libnm-glib/NMSecretAgent.html#NMSecretAgentError">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-NOT-AUTHORIZED:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-ERROR-NOT-AUTHORIZED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-INVALID-CONNECTION:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-ERROR-INVALID-CONNECTION:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-USER-CANCELED:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-ERROR-USER-CANCELED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-AGENT-CANCELED:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-ERROR-AGENT-CANCELED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-INTERNAL-ERROR:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-ERROR-INTERNAL-ERROR:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-NO-SECRETS:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-ERROR-NO-SECRETS:CAPS">
<ANCHOR id="NMSecretAgentCapabilities" href="libnm-glib/NMSecretAgent.html#NMSecretAgentCapabilities">
+<ANCHOR id="NM-SECRET-AGENT-CAPABILITY-NONE:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-CAPABILITY-VPN-HINTS:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-CAPABILITY-VPN-HINTS:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-CAPABILITY-LAST:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-CAPABILITY-LAST:CAPS">
<ANCHOR id="NMSecretAgentGetSecretsFlags" href="libnm-glib/NMSecretAgent.html#NMSecretAgentGetSecretsFlags">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-NONE:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-NONE:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-ALLOW-INTERACTION:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-ALLOW-INTERACTION:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-REQUEST-NEW:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-REQUEST-NEW:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-USER-REQUESTED:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-USER-REQUESTED:CAPS">
<ANCHOR id="NM-SECRET-AGENT-IDENTIFIER:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-IDENTIFIER:CAPS">
<ANCHOR id="NM-SECRET-AGENT-AUTO-REGISTER:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-AUTO-REGISTER:CAPS">
<ANCHOR id="NM-SECRET-AGENT-REGISTERED:CAPS" href="libnm-glib/NMSecretAgent.html#NM-SECRET-AGENT-REGISTERED:CAPS">
@@ -884,6 +989,16 @@
<ANCHOR id="NM-VPN-PLUGIN-DBUS-SERVICE-NAME:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-DBUS-SERVICE-NAME:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-STATE:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-STATE:CAPS">
<ANCHOR id="NMVPNPluginError" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NMVPNPluginError">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-GENERAL:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-GENERAL:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-STARTING-IN-PROGRESS:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-STARTING-IN-PROGRESS:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-ALREADY-STARTED:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-ALREADY-STARTED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-STOPPING-IN-PROGRESS:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-STOPPING-IN-PROGRESS:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-ALREADY-STOPPED:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-ALREADY-STOPPED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-WRONG-STATE:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-WRONG-STATE:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-BAD-ARGUMENTS:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-BAD-ARGUMENTS:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-LAUNCH-FAILED:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-LAUNCH-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-CONNECTION-INVALID:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-CONNECTION-INVALID:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-INTERACTIVE-NOT-SUPPORTED:CAPS" href="libnm-glib/libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-INTERACTIVE-NOT-SUPPORTED:CAPS">
<ANCHOR id="libnm-glib-NMVpnPluginUiWidget" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html">
<ANCHOR id="libnm-glib-NMVpnPluginUiWidget.functions" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#libnm-glib-NMVpnPluginUiWidget.functions">
<ANCHOR id="libnm-glib-NMVpnPluginUiWidget.other" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#libnm-glib-NMVpnPluginUiWidget.other">
@@ -902,10 +1017,18 @@
<ANCHOR id="nm-vpn-plugin-ui-widget-interface-save-secrets" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#nm-vpn-plugin-ui-widget-interface-save-secrets">
<ANCHOR id="libnm-glib-NMVpnPluginUiWidget.other_details" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#libnm-glib-NMVpnPluginUiWidget.other_details">
<ANCHOR id="NMVpnPluginUiCapability" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NMVpnPluginUiCapability">
+<ANCHOR id="NM-VPN-PLUGIN-UI-CAPABILITY-NONE:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-UI-CAPABILITY-IMPORT:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-IMPORT:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-UI-CAPABILITY-EXPORT:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-EXPORT:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-UI-CAPABILITY-IPV6:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-IPV6:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-NAME:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-NAME:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-DESC:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-DESC:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-SERVICE:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-SERVICE:CAPS">
<ANCHOR id="NMVpnPluginUiInterfaceProp" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NMVpnPluginUiInterfaceProp">
+<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-PROP-FIRST:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-FIRST:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-PROP-NAME:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-NAME:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-PROP-DESC:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-DESC:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-UI-INTERFACE-PROP-SERVICE:CAPS" href="libnm-glib/libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-SERVICE:CAPS">
<ANCHOR id="libnm-glib-nm-vpn-plugin-utils" href="libnm-glib/libnm-glib-nm-vpn-plugin-utils.html">
<ANCHOR id="libnm-glib-nm-vpn-plugin-utils.functions" href="libnm-glib/libnm-glib-nm-vpn-plugin-utils.html#libnm-glib-nm-vpn-plugin-utils.functions">
<ANCHOR id="libnm-glib-nm-vpn-plugin-utils.description" href="libnm-glib/libnm-glib-nm-vpn-plugin-utils.html#libnm-glib-nm-vpn-plugin-utils.description">
@@ -919,6 +1042,8 @@
<ANCHOR id="annotation-glossterm-element-type" href="libnm-glib/annotation-glossary.html#annotation-glossterm-element-type">
<ANCHOR id="annotation-glossterm-out" href="libnm-glib/annotation-glossary.html#annotation-glossterm-out">
<ANCHOR id="annotation-glossterm-scope async" href="libnm-glib/annotation-glossary.html#annotation-glossterm-scope async">
+<ANCHOR id="annotation-glossterm-skip" href="libnm-glib/annotation-glossary.html#annotation-glossterm-skip">
<ANCHOR id="annotation-glossterm-transfer container" href="libnm-glib/annotation-glossary.html#annotation-glossterm-transfer container">
<ANCHOR id="annotation-glossterm-transfer full" href="libnm-glib/annotation-glossary.html#annotation-glossterm-transfer full">
<ANCHOR id="annotation-glossterm-transfer none" href="libnm-glib/annotation-glossary.html#annotation-glossterm-transfer none">
+<ANCHOR id="annotation-glossterm-type" href="libnm-glib/annotation-glossary.html#annotation-glossterm-type">
diff --git a/docs/libnm-glib/html/libnm-glib-NMVPNPlugin.html b/docs/libnm-glib/html/libnm-glib-NMVPNPlugin.html
index b64ade5b0..e0523b6fa 100644
--- a/docs/libnm-glib/html/libnm-glib-NMVPNPlugin.html
+++ b/docs/libnm-glib/html/libnm-glib-NMVPNPlugin.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMVPNPlugin</title>
+<title>NMVPNPlugin: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMVPNConnection.html" title="NMVPNConnection">
<link rel="next" href="libnm-glib-NMVpnPluginUiWidget.html" title="NMVpnPluginUiWidget">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -155,8 +155,6 @@
</div>
<div class="refsect1">
<a name="libnm-glib-NMVPNPlugin.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-glib-NMVPNPlugin.functions_details"></a><h2>Functions</h2>
@@ -164,36 +162,18 @@
<a name="nm-vpn-plugin-error-quark"></a><h3>nm_vpn_plugin_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_vpn_plugin_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.30.6.2.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-vpn-plugin-get-connection"></a><h3>nm_vpn_plugin_get_connection ()</h3>
<pre class="programlisting"><a href="/usr/share/gtk-doc/html/dbus-glib/dbus-glib-DBusGConnection.html#DBusGConnection"><span class="returnvalue">DBusGConnection</span></a> *
nm_vpn_plugin_get_connection (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.30.6.3.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-vpn-plugin-get-state"></a><h3>nm_vpn_plugin_get_state ()</h3>
<pre class="programlisting"><a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManagerVPN.html#NMVPNServiceState"><span class="returnvalue">NMVPNServiceState</span></a>
nm_vpn_plugin_get_state (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.30.6.4.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -201,8 +181,6 @@ nm_vpn_plugin_get_state (<em class="parameter"><code><span class="type">NMVPNPlu
<pre class="programlisting"><span class="returnvalue">void</span>
nm_vpn_plugin_set_state (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManagerVPN.html#NMVPNServiceState"><span class="type">NMVPNServiceState</span></a> state</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -243,7 +221,7 @@ information to complete the request.</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -251,8 +229,6 @@ information to complete the request.</p>
<pre class="programlisting"><span class="returnvalue">void</span>
nm_vpn_plugin_set_login_banner (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code>const <span class="type">char</span> *banner</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -260,8 +236,6 @@ nm_vpn_plugin_set_login_banner (<em class="parameter"><code><span class="type">N
<pre class="programlisting"><span class="returnvalue">void</span>
nm_vpn_plugin_failure (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/libnm-util-NetworkManagerVPN.html#NMVPNPluginFailure"><span class="type">NMVPNPluginFailure</span></a> reason</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -269,8 +243,6 @@ nm_vpn_plugin_failure (<em class="parameter"><code><span class="type">NMVPNPlugi
<pre class="programlisting"><span class="returnvalue">void</span>
nm_vpn_plugin_set_config (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code><span class="type">GHashTable</span> *config</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -278,8 +250,6 @@ nm_vpn_plugin_set_config (<em class="parameter"><code><span class="type">NMVPNPl
<pre class="programlisting"><span class="returnvalue">void</span>
nm_vpn_plugin_set_ip4_config (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code><span class="type">GHashTable</span> *ip4_config</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -287,8 +257,6 @@ nm_vpn_plugin_set_ip4_config (<em class="parameter"><code><span class="type">NMV
<pre class="programlisting"><span class="returnvalue">void</span>
nm_vpn_plugin_set_ip6_config (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code><span class="type">GHashTable</span> *ip6_config</code></em>);</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -296,12 +264,6 @@ nm_vpn_plugin_set_ip6_config (<em class="parameter"><code><span class="type">NMV
<pre class="programlisting"><span class="returnvalue">gboolean</span>
nm_vpn_plugin_disconnect (<em class="parameter"><code><span class="type">NMVPNPlugin</span> *plugin</code></em>,
<em class="parameter"><code><span class="type">GError</span> **err</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.30.6.12.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
</div>
<div class="refsect1">
@@ -310,16 +272,12 @@ nm_vpn_plugin_disconnect (<em class="parameter"><code><span class="type">NMVPNPl
<a name="NM-VPN-PLUGIN-DBUS-SERVICE-NAME:CAPS"></a><h3>NM_VPN_PLUGIN_DBUS_SERVICE_NAME</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_DBUS_SERVICE_NAME "service-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-STATE:CAPS"></a><h3>NM_VPN_PLUGIN_STATE</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -423,7 +381,6 @@ nm_vpn_plugin_disconnect (<em class="parameter"><code><span class="type">NMVPNPl
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/libnm-glib-NMVpnPluginUiWidget.html b/docs/libnm-glib/html/libnm-glib-NMVpnPluginUiWidget.html
index 95d750611..e4630fed3 100644
--- a/docs/libnm-glib/html/libnm-glib-NMVpnPluginUiWidget.html
+++ b/docs/libnm-glib/html/libnm-glib-NMVpnPluginUiWidget.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: NMVpnPluginUiWidget</title>
+<title>NMVpnPluginUiWidget: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="libnm-glib-NMVPNPlugin.html" title="NMVPNPlugin">
<link rel="next" href="libnm-glib-nm-vpn-plugin-utils.html" title="nm-vpn-plugin-utils">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -163,8 +163,6 @@
</div>
<div class="refsect1">
<a name="libnm-glib-NMVpnPluginUiWidget.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-glib-NMVpnPluginUiWidget.functions_details"></a><h2>Functions</h2>
@@ -172,24 +170,12 @@
<a name="NMVpnPluginUiFactory"></a><h3>NMVpnPluginUiFactory ()</h3>
<pre class="programlisting"><span class="returnvalue">NMVpnPluginUiInterface</span> *
<span class="c_punctuation">(</span>*NMVpnPluginUiFactory<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.2.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-vpn-plugin-ui-factory"></a><h3>nm_vpn_plugin_ui_factory ()</h3>
<pre class="programlisting"><span class="returnvalue">NMVpnPluginUiInterface</span> *
nm_vpn_plugin_ui_factory (<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.3.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -198,12 +184,6 @@ nm_vpn_plugin_ui_factory (<em class="parameter"><code><span class="type">GError<
nm_vpn_plugin_ui_interface_ui_factory (<em class="parameter"><code><span class="type">NMVpnPluginUiInterface</span> *iface</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.4.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -211,12 +191,6 @@ nm_vpn_plugin_ui_interface_ui_factory (<em class="parameter"><code><span class="
<pre class="programlisting"><span class="returnvalue">guint32</span>
nm_vpn_plugin_ui_interface_get_capabilities
(<em class="parameter"><code><span class="type">NMVpnPluginUiInterface</span> *iface</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.5.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -225,12 +199,6 @@ nm_vpn_plugin_ui_interface_get_capabilities
nm_vpn_plugin_ui_interface_import (<em class="parameter"><code><span class="type">NMVpnPluginUiInterface</span> *iface</code></em>,
<em class="parameter"><code>const <span class="type">char</span> *path</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.6.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -240,12 +208,6 @@ nm_vpn_plugin_ui_interface_export (<em class="parameter"><code><span class="type
<em class="parameter"><code>const <span class="type">char</span> *path</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.7.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -254,12 +216,6 @@ nm_vpn_plugin_ui_interface_export (<em class="parameter"><code><span class="type
nm_vpn_plugin_ui_interface_get_suggested_name
(<em class="parameter"><code><span class="type">NMVpnPluginUiInterface</span> *iface</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.8.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -270,12 +226,6 @@ nm_vpn_plugin_ui_interface_delete_connection
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
<div class="warning"><p><code class="literal">nm_vpn_plugin_ui_interface_delete_connection</code> is deprecated and should not be used in newly-written code.</p></div>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.9.6"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -283,12 +233,6 @@ nm_vpn_plugin_ui_interface_delete_connection
<pre class="programlisting"><span class="returnvalue">GObject</span> *
nm_vpn_plugin_ui_widget_interface_get_widget
(<em class="parameter"><code><span class="type">NMVpnPluginUiWidgetInterface</span> *iface</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.10.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -298,12 +242,6 @@ nm_vpn_plugin_ui_widget_interface_update_connection
(<em class="parameter"><code><span class="type">NMVpnPluginUiWidgetInterface</span> *iface</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.11.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -314,12 +252,6 @@ nm_vpn_plugin_ui_widget_interface_save_secrets
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
<div class="warning"><p><code class="literal">nm_vpn_plugin_ui_widget_interface_save_secrets</code> is deprecated and should not be used in newly-written code.</p></div>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.31.6.12.6"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
</div>
<div class="refsect1">
@@ -373,24 +305,18 @@ nm_vpn_plugin_ui_widget_interface_save_secrets
<a name="NM-VPN-PLUGIN-UI-INTERFACE-NAME:CAPS"></a><h3>NM_VPN_PLUGIN_UI_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_UI_INTERFACE_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-UI-INTERFACE-DESC:CAPS"></a><h3>NM_VPN_PLUGIN_UI_INTERFACE_DESC</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_UI_INTERFACE_DESC "desc"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-UI-INTERFACE-SERVICE:CAPS"></a><h3>NM_VPN_PLUGIN_UI_INTERFACE_SERVICE</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_UI_INTERFACE_SERVICE "service"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -408,8 +334,8 @@ information to UI programs.</p>
<tbody>
<tr>
<td class="enum_member_name"><p><a name="NM-VPN-PLUGIN-UI-INTERFACE-PROP-FIRST:CAPS"></a>NM_VPN_PLUGIN_UI_INTERFACE_PROP_FIRST</p></td>
-<td class="enum_member_description"> </td>
-<td class="enum_member_annotations"> </td>
+<td> </td>
+<td> </td>
</tr>
<tr>
<td class="enum_member_name"><p><a name="NM-VPN-PLUGIN-UI-INTERFACE-PROP-NAME:CAPS"></a>NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME</p></td>
@@ -441,7 +367,6 @@ plugin's VPN service daemon</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/libnm-glib-nm-types.html b/docs/libnm-glib/html/libnm-glib-nm-types.html
index c8ee10a37..9c3dce354 100644
--- a/docs/libnm-glib/html/libnm-glib-nm-types.html
+++ b/docs/libnm-glib/html/libnm-glib-nm-types.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: nm-types</title>
+<title>nm-types: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="NMRemoteSettings.html" title="NMRemoteSettings">
<link rel="next" href="NMSecretAgent.html" title="NMSecretAgent">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -33,18 +33,16 @@
</tr></table></div>
<div class="refsect1">
<a name="libnm-glib-nm-types.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-glib-nm-types.functions_details"></a><h2>Functions</h2>
+<p></p>
</div>
<div class="refsect1">
<a name="libnm-glib-nm-types.other_details"></a><h2>Types and Values</h2>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/libnm-glib-nm-vpn-plugin-utils.html b/docs/libnm-glib/html/libnm-glib-nm-vpn-plugin-utils.html
index 0a53334e7..b03e59876 100644
--- a/docs/libnm-glib/html/libnm-glib-nm-vpn-plugin-utils.html
+++ b/docs/libnm-glib/html/libnm-glib-nm-vpn-plugin-utils.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: nm-vpn-plugin-utils</title>
+<title>nm-vpn-plugin-utils: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="ch02.html" title="libnm-glib API Reference">
<link rel="prev" href="libnm-glib-NMVpnPluginUiWidget.html" title="NMVpnPluginUiWidget">
<link rel="next" href="object-tree.html" title="Object Hierarchy">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -60,8 +60,6 @@
</div>
<div class="refsect1">
<a name="libnm-glib-nm-vpn-plugin-utils.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-glib-nm-vpn-plugin-utils.functions_details"></a><h2>Functions</h2>
@@ -105,7 +103,6 @@ an applet when the applet calls the authentication dialog of the VPN plugin.</p>
<div class="refsect3">
<a name="id-1.3.32.5.2.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if reading values was successful, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -151,7 +148,6 @@ item in <em class="parameter"><code>data</code></em>
<a name="id-1.3.32.5.3.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the flag data item was found and successfully converted
to flags, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
</div>
@@ -160,7 +156,6 @@ to flags, <code class="literal">FALSE</code> if not</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/libnm-glib.devhelp2 b/docs/libnm-glib/html/libnm-glib.devhelp2
index 8c4d82028..00b0f0756 100644
--- a/docs/libnm-glib/html/libnm-glib.devhelp2
+++ b/docs/libnm-glib/html/libnm-glib.devhelp2
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<book xmlns="http://www.devhelp.net/book" title="libnm-glib Reference Manual" link="index.html" author="" name="libnm-glib" version="2" language="c">
<chapters>
<sub name="Object Overview" link="ref-overview.html"/>
@@ -672,5 +671,128 @@
<keyword type="enum" name="enum NMVpnPluginUiInterfaceProp" link="libnm-glib-NMVpnPluginUiWidget.html#NMVpnPluginUiInterfaceProp"/>
<keyword type="function" name="nm_vpn_plugin_utils_read_vpn_details ()" link="libnm-glib-nm-vpn-plugin-utils.html#nm-vpn-plugin-utils-read-vpn-details"/>
<keyword type="function" name="nm_vpn_plugin_utils_get_secret_flags ()" link="libnm-glib-nm-vpn-plugin-utils.html#nm-vpn-plugin-utils-get-secret-flags"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_NONE" link="NMClient.html#NM-CLIENT-PERMISSION-NONE:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-NETWORK:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIFI:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WWAN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIMAX:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SLEEP_WAKE" link="NMClient.html#NM-CLIENT-PERMISSION-SLEEP-WAKE:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_NETWORK_CONTROL" link="NMClient.html#NM-CLIENT-PERMISSION-NETWORK-CONTROL:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED" link="NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-PROTECTED:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN" link="NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-OPEN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM" link="NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-SYSTEM:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN" link="NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-OWN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME" link="NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-HOSTNAME:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_LAST" link="NMClient.html#NM-CLIENT-PERMISSION-LAST:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_UNKNOWN" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_YES" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-YES:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_AUTH" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-AUTH:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_NO" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-NO:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_ERROR_UNKNOWN" link="NMClient.html#NM-CLIENT-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_ERROR_MANAGER_NOT_RUNNING" link="NMClient.html#NM-CLIENT-ERROR-MANAGER-NOT-RUNNING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_UNKNOWN" link="NMDevice.html#NM-DEVICE-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_INTERFACE_MISMATCH" link="NMDevice.html#NM-DEVICE-ERROR-INTERFACE-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ETHERNET_ERROR_UNKNOWN" link="NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ETHERNET_ERROR_NOT_ETHERNET_CONNECTION" link="NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-NOT-ETHERNET-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ETHERNET_ERROR_INVALID_ETHERNET_CONNECTION" link="NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-INVALID-ETHERNET-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ETHERNET_ERROR_INVALID_DEVICE_MAC" link="NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-INVALID-DEVICE-MAC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ETHERNET_ERROR_MAC_MISMATCH" link="NMDeviceEthernet.html#NM-DEVICE-ETHERNET-ERROR-MAC-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_UNKNOWN" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_NOT_WIFI_CONNECTION" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-NOT-WIFI-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_INVALID_WIFI_CONNECTION" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-INVALID-WIFI-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_INVALID_DEVICE_MAC" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-INVALID-DEVICE-MAC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_MAC_MISMATCH" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-MAC-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_WPA_CAPS" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-MISSING-DEVICE-WPA-CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_RSN_CAPS" link="NMDeviceWifi.html#NM-DEVICE-WIFI-ERROR-MISSING-DEVICE-RSN-CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_ERROR_UNKNOWN" link="NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_ERROR_NOT_MODEM_CONNECTION" link="NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-NOT-MODEM-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_ERROR_INVALID_MODEM_CONNECTION" link="NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-INVALID-MODEM-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_ERROR_MISSING_DEVICE_CAPS" link="NMDeviceModem.html#NM-DEVICE-MODEM-ERROR-MISSING-DEVICE-CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BT_ERROR_UNKNOWN" link="NMDeviceBt.html#NM-DEVICE-BT-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BT_ERROR_NOT_BT_CONNECTION" link="NMDeviceBt.html#NM-DEVICE-BT-ERROR-NOT-BT-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BT_ERROR_INVALID_BT_CONNECTION" link="NMDeviceBt.html#NM-DEVICE-BT-ERROR-INVALID-BT-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BT_ERROR_INVALID_DEVICE_MAC" link="NMDeviceBt.html#NM-DEVICE-BT-ERROR-INVALID-DEVICE-MAC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BT_ERROR_MAC_MISMATCH" link="NMDeviceBt.html#NM-DEVICE-BT-ERROR-MAC-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BT_ERROR_MISSING_DEVICE_CAPS" link="NMDeviceBt.html#NM-DEVICE-BT-ERROR-MISSING-DEVICE-CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIMAX_ERROR_UNKNOWN" link="NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIMAX_ERROR_NOT_WIMAX_CONNECTION" link="NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-NOT-WIMAX-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIMAX_ERROR_INVALID_WIMAX_CONNECTION" link="NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-INVALID-WIMAX-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIMAX_ERROR_INVALID_DEVICE_MAC" link="NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-INVALID-DEVICE-MAC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_WIMAX_ERROR_MAC_MISMATCH" link="NMDeviceWimax.html#NM-DEVICE-WIMAX-ERROR-MAC-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ADSL_ERROR_UNKNOWN" link="NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ADSL_ERROR_NOT_ADSL_CONNECTION" link="NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR-NOT-ADSL-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ADSL_ERROR_INVALID_ADSL_CONNECTION" link="NMDeviceAdsl.html#NM-DEVICE-ADSL-ERROR-INVALID-ADSL-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BOND_ERROR_UNKNOWN" link="NMDeviceBond.html#NM-DEVICE-BOND-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BOND_ERROR_NOT_BOND_CONNECTION" link="NMDeviceBond.html#NM-DEVICE-BOND-ERROR-NOT-BOND-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BOND_ERROR_INVALID_BOND_CONNECTION" link="NMDeviceBond.html#NM-DEVICE-BOND-ERROR-INVALID-BOND-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BOND_ERROR_INTERFACE_MISMATCH" link="NMDeviceBond.html#NM-DEVICE-BOND-ERROR-INTERFACE-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BRIDGE_ERROR_UNKNOWN" link="NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BRIDGE_ERROR_NOT_BRIDGE_CONNECTION" link="NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-NOT-BRIDGE-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BRIDGE_ERROR_INVALID_BRIDGE_CONNECTION" link="NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-INVALID-BRIDGE-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_BRIDGE_ERROR_INTERFACE_MISMATCH" link="NMDeviceBridge.html#NM-DEVICE-BRIDGE-ERROR-INTERFACE-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TEAM_ERROR_UNKNOWN" link="NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TEAM_ERROR_NOT_TEAM_CONNECTION" link="NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-NOT-TEAM-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TEAM_ERROR_INVALID_TEAM_CONNECTION" link="NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-INVALID-TEAM-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TEAM_ERROR_INTERFACE_MISMATCH" link="NMDeviceTeam.html#NM-DEVICE-TEAM-ERROR-INTERFACE-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_GENERIC_ERROR_UNKNOWN" link="NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_GENERIC_ERROR_NOT_GENERIC_CONNECTION" link="NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR-NOT-GENERIC-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_GENERIC_ERROR_MISSING_INTERFACE_NAME" link="NMDeviceGeneric.html#NM-DEVICE-GENERIC-ERROR-MISSING-INTERFACE-NAME:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_INFINIBAND_ERROR_UNKNOWN" link="NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_INFINIBAND_ERROR_NOT_INFINIBAND_CONNECTION" link="NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-NOT-INFINIBAND-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_INFINIBAND_ERROR_INVALID_INFINIBAND_CONNECTION" link="NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-INVALID-INFINIBAND-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_INFINIBAND_ERROR_INVALID_DEVICE_MAC" link="NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-INVALID-DEVICE-MAC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_INFINIBAND_ERROR_MAC_MISMATCH" link="NMDeviceInfiniband.html#NM-DEVICE-INFINIBAND-ERROR-MAC-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_VLAN_ERROR_UNKNOWN" link="NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_VLAN_ERROR_NOT_VLAN_CONNECTION" link="NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-NOT-VLAN-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_VLAN_ERROR_INVALID_VLAN_CONNECTION" link="NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-INVALID-VLAN-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_VLAN_ERROR_ID_MISMATCH" link="NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-ID-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_VLAN_ERROR_INTERFACE_MISMATCH" link="NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-INTERFACE-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_VLAN_ERROR_MAC_MISMATCH" link="NMDeviceVlan.html#NM-DEVICE-VLAN-ERROR-MAC-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_OLPC_MESH_ERROR_UNKNOWN" link="NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_OLPC_MESH_ERROR_NOT_OLPC_MESH_CONNECTION" link="NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR-NOT-OLPC-MESH-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_OLPC_MESH_ERROR_INVALID_OLPC_MESH_CONNECTION" link="NMDeviceOlpcMesh.html#NM-DEVICE-OLPC-MESH-ERROR-INVALID-OLPC-MESH-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_HOME" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-HOME:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_PARTNER" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-PARTNER:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-ROAMING-PARTNER:CAPS"/>
+ <keyword type="constant" name="NM_OBJECT_ERROR_UNKNOWN" link="NMObject.html#NM-OBJECT-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_OBJECT_ERROR_OBJECT_CREATION_FAILURE" link="NMObject.html#NM-OBJECT-ERROR-OBJECT-CREATION-FAILURE:CAPS"/>
+ <keyword type="constant" name="NM_REMOTE_CONNECTION_ERROR_UNKNOWN" link="NMRemoteConnection.html#NM-REMOTE-CONNECTION-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_REMOTE_CONNECTION_ERROR_DISCONNECTED" link="NMRemoteConnection.html#NM-REMOTE-CONNECTION-ERROR-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_REMOTE_SETTINGS_ERROR_UNKNOWN" link="NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_REMOTE_SETTINGS_ERROR_CONNECTION_REMOVED" link="NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-CONNECTION-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_REMOTE_SETTINGS_ERROR_CONNECTION_UNAVAILABLE" link="NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-CONNECTION-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_REMOTE_SETTINGS_ERROR_SERVICE_UNAVAILABLE" link="NMRemoteSettings.html#NM-REMOTE-SETTINGS-ERROR-SERVICE-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED" link="NMSecretAgent.html#NM-SECRET-AGENT-ERROR-NOT-AUTHORIZED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_INVALID_CONNECTION" link="NMSecretAgent.html#NM-SECRET-AGENT-ERROR-INVALID-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_USER_CANCELED" link="NMSecretAgent.html#NM-SECRET-AGENT-ERROR-USER-CANCELED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_AGENT_CANCELED" link="NMSecretAgent.html#NM-SECRET-AGENT-ERROR-AGENT-CANCELED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_INTERNAL_ERROR" link="NMSecretAgent.html#NM-SECRET-AGENT-ERROR-INTERNAL-ERROR:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_NO_SECRETS" link="NMSecretAgent.html#NM-SECRET-AGENT-ERROR-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_CAPABILITY_NONE" link="NMSecretAgent.html#NM-SECRET-AGENT-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_CAPABILITY_VPN_HINTS" link="NMSecretAgent.html#NM-SECRET-AGENT-CAPABILITY-VPN-HINTS:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_CAPABILITY_LAST" link="NMSecretAgent.html#NM-SECRET-AGENT-CAPABILITY-LAST:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE" link="NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION" link="NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-ALLOW-INTERACTION:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW" link="NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-REQUEST-NEW:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED" link="NMSecretAgent.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-USER-REQUESTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_GENERAL" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-GENERAL:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_STARTING_IN_PROGRESS" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-STARTING-IN-PROGRESS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_ALREADY_STARTED" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-ALREADY-STARTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-STOPPING-IN-PROGRESS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-ALREADY-STOPPED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_WRONG_STATE" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-WRONG-STATE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-BAD-ARGUMENTS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-LAUNCH-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-CONNECTION-INVALID:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED" link="libnm-glib-NMVPNPlugin.html#NM-VPN-PLUGIN-ERROR-INTERACTIVE-NOT-SUPPORTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_CAPABILITY_NONE" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-IMPORT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-EXPORT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_CAPABILITY_IPV6" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-CAPABILITY-IPV6:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_INTERFACE_PROP_FIRST" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-FIRST:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-NAME:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_INTERFACE_PROP_DESC" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-DESC:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_UI_INTERFACE_PROP_SERVICE" link="libnm-glib-NMVpnPluginUiWidget.html#NM-VPN-PLUGIN-UI-INTERFACE-PROP-SERVICE:CAPS"/>
</functions>
</book>
diff --git a/docs/libnm-glib/html/object-tree.html b/docs/libnm-glib/html/object-tree.html
index 500f78d4f..c6ea92978 100644
--- a/docs/libnm-glib/html/object-tree.html
+++ b/docs/libnm-glib/html/object-tree.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: Object Hierarchy</title>
+<title>Object Hierarchy: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="index.html" title="libnm-glib Reference Manual">
<link rel="prev" href="libnm-glib-nm-vpn-plugin-utils.html" title="nm-vpn-plugin-utils">
<link rel="next" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -55,7 +55,6 @@
</pre>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/ref-overview.html b/docs/libnm-glib/html/ref-overview.html
index d3a8c5166..fcd4ec992 100644
--- a/docs/libnm-glib/html/ref-overview.html
+++ b/docs/libnm-glib/html/ref-overview.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-glib Reference Manual: Object Overview</title>
+<title>Object Overview: libnm-glib Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-glib Reference Manual">
<link rel="up" href="index.html" title="libnm-glib Reference Manual">
<link rel="prev" href="index.html" title="libnm-glib Reference Manual">
<link rel="next" href="ch02.html" title="libnm-glib API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -41,7 +41,6 @@
</p>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-glib/html/style.css b/docs/libnm-glib/html/style.css
index c141ddd29..367542097 100644
--- a/docs/libnm-glib/html/style.css
+++ b/docs/libnm-glib/html/style.css
@@ -60,7 +60,7 @@ a:hover
div.informaltable table
{
border-collapse: separate;
- border-spacing: 1em 0.5em;
+ border-spacing: 1em 0.3em;
border: none;
}
@@ -148,6 +148,8 @@ div.table table th
h4
{
color: #555753;
+ margin-top: 1em;
+ margin-bottom: 1em;
}
hr
@@ -166,17 +168,16 @@ dl.toc dt
padding-bottom: 0.25em;
}
-dl.toc > dd > dl > dt
+dl.toc > dt
{
padding-top: 0.25em;
padding-bottom: 0.25em;
+ font-weight: bold;
}
-dl.toc > dt
+dl.toc > dl
{
- padding-top: 1em;
padding-bottom: 0.5em;
- font-weight: bold;
}
.parameter
@@ -346,7 +347,9 @@ acronym,abbr
}
@media screen {
- sup a.footnote
+ /* these have a <sup> as a first child, but since there are no parent selectors
+ * we can't use that. */
+ a.footnote
{
position: relative;
top: 0em ! important;
diff --git a/docs/libnm-glib/tmpl/libnm-glib-unused.sgml b/docs/libnm-glib/tmpl/libnm-glib-unused.sgml
deleted file mode 100644
index e69de29bb..000000000
--- a/docs/libnm-glib/tmpl/libnm-glib-unused.sgml
+++ /dev/null
diff --git a/docs/libnm-glib/tmpl/nm-access-point.sgml b/docs/libnm-glib/tmpl/nm-access-point.sgml
deleted file mode 100644
index 2a2ecb1cd..000000000
--- a/docs/libnm-glib/tmpl/nm-access-point.sgml
+++ /dev/null
@@ -1,214 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMAccessPoint
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_WPA_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_RSN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_SSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_BSSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_FREQUENCY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_MAX_BITRATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_STRENGTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_access_point_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_flags ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_wpa_flags ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_rsn_flags ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_ssid ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_bssid ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_frequency ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_mode ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_max_bitrate ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_strength ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_filter_connections ##### -->
-<para>
-
-</para>
-
-@ap:
-@connections:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_connection_valid ##### -->
-<para>
-
-</para>
-
-@ap:
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_hw_address ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-active-connection.sgml b/docs/libnm-glib/tmpl/nm-active-connection.sgml
deleted file mode 100644
index 8b52c8256..000000000
--- a/docs/libnm-glib/tmpl/nm-active-connection.sgml
+++ /dev/null
@@ -1,274 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMActiveConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_UUID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DEVICES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DHCP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DEFAULT6 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_IP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DHCP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_VPN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_MASTER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_active_connection_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_connection ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_id ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_uuid ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_connection_type ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_specific_object ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_devices ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_state ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_master ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_default ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_ip4_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_dhcp4_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_default6 ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_ip6_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_dhcp6_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_vpn ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-client.sgml b/docs/libnm-glib/tmpl/nm-client.sgml
deleted file mode 100644
index cb1adf09d..000000000
--- a/docs/libnm-glib/tmpl/nm-client.sgml
+++ /dev/null
@@ -1,552 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMClient
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_CLIENT_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_STARTUP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_MANAGER_RUNNING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_NETWORKING_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIRELESS_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIRELESS_HARDWARE_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WWAN_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WWAN_HARDWARE_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIMAX_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIMAX_HARDWARE_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_ACTIVE_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_CONNECTIVITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_PRIMARY_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_ACTIVATING_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_DEVICES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMClientPermission ##### -->
-<para>
-
-</para>
-
-@NM_CLIENT_PERMISSION_NONE:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX:
-@NM_CLIENT_PERMISSION_SLEEP_WAKE:
-@NM_CLIENT_PERMISSION_NETWORK_CONTROL:
-@NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED:
-@NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN:
-@NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM:
-@NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN:
-@NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME:
-@NM_CLIENT_PERMISSION_LAST:
-
-<!-- ##### ENUM NMClientPermissionResult ##### -->
-<para>
-
-</para>
-
-@NM_CLIENT_PERMISSION_RESULT_UNKNOWN:
-@NM_CLIENT_PERMISSION_RESULT_YES:
-@NM_CLIENT_PERMISSION_RESULT_AUTH:
-@NM_CLIENT_PERMISSION_RESULT_NO:
-
-<!-- ##### ENUM NMClientError ##### -->
-<para>
-
-</para>
-
-@NM_CLIENT_ERROR_UNKNOWN:
-@NM_CLIENT_ERROR_MANAGER_NOT_RUNNING:
-
-<!-- ##### MACRO NM_CLIENT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_client_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_new_async ##### -->
-<para>
-
-</para>
-
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_new_finish ##### -->
-<para>
-
-</para>
-
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_devices ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_device_by_path ##### -->
-<para>
-
-</para>
-
-@client:
-@object_path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_device_by_iface ##### -->
-<para>
-
-</para>
-
-@client:
-@iface:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMClientActivateFn ##### -->
-<para>
-
-</para>
-
-@client:
-@active_connection:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_activate_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@connection:
-@device:
-@specific_object:
-@callback:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMClientAddActivateFn ##### -->
-<para>
-
-</para>
-
-@client:
-@connection:
-@new_connection_path:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_add_and_activate_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@partial:
-@device:
-@specific_object:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_deactivate_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@active:
-
-
-<!-- ##### FUNCTION nm_client_networking_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_networking_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wireless_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wireless_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wireless_hardware_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wwan_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wwan_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wwan_hardware_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wimax_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wimax_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wimax_hardware_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_version ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_state ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_startup ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_manager_running ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_active_connections ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_sleep ##### -->
-<para>
-
-</para>
-
-@client:
-@sleep_:
-
-
-<!-- ##### FUNCTION nm_client_get_permission_result ##### -->
-<para>
-
-</para>
-
-@client:
-@permission:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_logging ##### -->
-<para>
-
-</para>
-
-@client:
-@level:
-@domains:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_set_logging ##### -->
-<para>
-
-</para>
-
-@client:
-@level:
-@domains:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_connectivity ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_check_connectivity ##### -->
-<para>
-
-</para>
-
-@client:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_check_connectivity_async ##### -->
-<para>
-
-</para>
-
-@client:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_check_connectivity_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_primary_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_activating_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-adsl.sgml b/docs/libnm-glib/tmpl/nm-device-adsl.sgml
deleted file mode 100644
index 1c7e14c2f..000000000
--- a/docs/libnm-glib/tmpl/nm-device-adsl.sgml
+++ /dev/null
@@ -1,75 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceAdsl
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceAdslError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_ADSL_ERROR_UNKNOWN:
-@NM_DEVICE_ADSL_ERROR_NOT_ADSL_CONNECTION:
-@NM_DEVICE_ADSL_ERROR_INVALID_ADSL_CONNECTION:
-
-<!-- ##### MACRO NM_DEVICE_ADSL_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_adsl_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_ADSL_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_adsl_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_adsl_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-bond.sgml b/docs/libnm-glib/tmpl/nm-device-bond.sgml
deleted file mode 100644
index 3270d9951..000000000
--- a/docs/libnm-glib/tmpl/nm-device-bond.sgml
+++ /dev/null
@@ -1,108 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceBond
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceBondError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_BOND_ERROR_UNKNOWN:
-@NM_DEVICE_BOND_ERROR_NOT_BOND_CONNECTION:
-@NM_DEVICE_BOND_ERROR_INVALID_BOND_CONNECTION:
-@NM_DEVICE_BOND_ERROR_INTERFACE_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_BOND_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bond_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_BOND_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BOND_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BOND_SLAVES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bond_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bond_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bond_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bond_get_slaves ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-bridge.sgml b/docs/libnm-glib/tmpl/nm-device-bridge.sgml
deleted file mode 100644
index 650945771..000000000
--- a/docs/libnm-glib/tmpl/nm-device-bridge.sgml
+++ /dev/null
@@ -1,108 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceBridge
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceBridgeError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_BRIDGE_ERROR_UNKNOWN:
-@NM_DEVICE_BRIDGE_ERROR_NOT_BRIDGE_CONNECTION:
-@NM_DEVICE_BRIDGE_ERROR_INVALID_BRIDGE_CONNECTION:
-@NM_DEVICE_BRIDGE_ERROR_INTERFACE_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bridge_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_SLAVES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bridge_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bridge_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bridge_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bridge_get_slaves ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-bt.sgml b/docs/libnm-glib/tmpl/nm-device-bt.sgml
deleted file mode 100644
index 44a6f6923..000000000
--- a/docs/libnm-glib/tmpl/nm-device-bt.sgml
+++ /dev/null
@@ -1,110 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceBt
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceBtError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_BT_ERROR_UNKNOWN:
-@NM_DEVICE_BT_ERROR_NOT_BT_CONNECTION:
-@NM_DEVICE_BT_ERROR_INVALID_BT_CONNECTION:
-@NM_DEVICE_BT_ERROR_INVALID_DEVICE_MAC:
-@NM_DEVICE_BT_ERROR_MAC_MISMATCH:
-@NM_DEVICE_BT_ERROR_MISSING_DEVICE_CAPS:
-
-<!-- ##### MACRO NM_DEVICE_BT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bt_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_BT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BT_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BT_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bt_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bt_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bt_get_name ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bt_get_capabilities ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-ethernet.sgml b/docs/libnm-glib/tmpl/nm-device-ethernet.sgml
deleted file mode 100644
index 4d97c1890..000000000
--- a/docs/libnm-glib/tmpl/nm-device-ethernet.sgml
+++ /dev/null
@@ -1,125 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceEthernet
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceEthernetError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_ETHERNET_ERROR_UNKNOWN:
-@NM_DEVICE_ETHERNET_ERROR_NOT_ETHERNET_CONNECTION:
-@NM_DEVICE_ETHERNET_ERROR_INVALID_ETHERNET_CONNECTION:
-@NM_DEVICE_ETHERNET_ERROR_INVALID_DEVICE_MAC:
-@NM_DEVICE_ETHERNET_ERROR_MAC_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_ethernet_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_SPEED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_ethernet_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_permanent_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_speed ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-generic.sgml b/docs/libnm-glib/tmpl/nm-device-generic.sgml
deleted file mode 100644
index c20500bfd..000000000
--- a/docs/libnm-glib/tmpl/nm-device-generic.sgml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceGeneric
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceGenericError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_GENERIC_ERROR_UNKNOWN:
-@NM_DEVICE_GENERIC_ERROR_NOT_GENERIC_CONNECTION:
-@NM_DEVICE_GENERIC_ERROR_MISSING_INTERFACE_NAME:
-
-<!-- ##### MACRO NM_DEVICE_GENERIC_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_generic_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_GENERIC_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_GENERIC_TYPE_DESCRIPTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_generic_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_generic_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-infiniband.sgml b/docs/libnm-glib/tmpl/nm-device-infiniband.sgml
deleted file mode 100644
index 73a3f3c4e..000000000
--- a/docs/libnm-glib/tmpl/nm-device-infiniband.sgml
+++ /dev/null
@@ -1,93 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceInfiniband
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceInfinibandError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_INFINIBAND_ERROR_UNKNOWN:
-@NM_DEVICE_INFINIBAND_ERROR_NOT_INFINIBAND_CONNECTION:
-@NM_DEVICE_INFINIBAND_ERROR_INVALID_INFINIBAND_CONNECTION:
-@NM_DEVICE_INFINIBAND_ERROR_INVALID_DEVICE_MAC:
-@NM_DEVICE_INFINIBAND_ERROR_MAC_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_INFINIBAND_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_infiniband_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_INFINIBAND_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_INFINIBAND_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_infiniband_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_infiniband_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_infiniband_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-modem.sgml b/docs/libnm-glib/tmpl/nm-device-modem.sgml
deleted file mode 100644
index 007c3b42f..000000000
--- a/docs/libnm-glib/tmpl/nm-device-modem.sgml
+++ /dev/null
@@ -1,82 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceModem
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceModemError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_MODEM_ERROR_UNKNOWN:
-@NM_DEVICE_MODEM_ERROR_NOT_MODEM_CONNECTION:
-@NM_DEVICE_MODEM_ERROR_INVALID_MODEM_CONNECTION:
-@NM_DEVICE_MODEM_ERROR_MISSING_DEVICE_CAPS:
-
-<!-- ##### MACRO NM_DEVICE_MODEM_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_modem_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_MODEM_MODEM_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_MODEM_CURRENT_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_modem_get_modem_capabilities ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_modem_get_current_capabilities ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-olpc-mesh.sgml b/docs/libnm-glib/tmpl/nm-device-olpc-mesh.sgml
deleted file mode 100644
index c8cccb2f5..000000000
--- a/docs/libnm-glib/tmpl/nm-device-olpc-mesh.sgml
+++ /dev/null
@@ -1,107 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceOlpcMesh
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceOlpcMeshError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_OLPC_MESH_ERROR_UNKNOWN:
-@NM_DEVICE_OLPC_MESH_ERROR_NOT_OLPC_MESH_CONNECTION:
-@NM_DEVICE_OLPC_MESH_ERROR_INVALID_OLPC_MESH_CONNECTION:
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_COMPANION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_get_companion ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_get_active_channel ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-team.sgml b/docs/libnm-glib/tmpl/nm-device-team.sgml
deleted file mode 100644
index abf5ab692..000000000
--- a/docs/libnm-glib/tmpl/nm-device-team.sgml
+++ /dev/null
@@ -1,108 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceTeam
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceTeamError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_TEAM_ERROR_UNKNOWN:
-@NM_DEVICE_TEAM_ERROR_NOT_TEAM_CONNECTION:
-@NM_DEVICE_TEAM_ERROR_INVALID_TEAM_CONNECTION:
-@NM_DEVICE_TEAM_ERROR_INTERFACE_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_TEAM_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_team_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_TEAM_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_TEAM_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_TEAM_SLAVES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_team_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_team_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_team_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_team_get_slaves ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-vlan.sgml b/docs/libnm-glib/tmpl/nm-device-vlan.sgml
deleted file mode 100644
index 5397d2045..000000000
--- a/docs/libnm-glib/tmpl/nm-device-vlan.sgml
+++ /dev/null
@@ -1,126 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceVlan
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceVlanError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_VLAN_ERROR_UNKNOWN:
-@NM_DEVICE_VLAN_ERROR_NOT_VLAN_CONNECTION:
-@NM_DEVICE_VLAN_ERROR_INVALID_VLAN_CONNECTION:
-@NM_DEVICE_VLAN_ERROR_ID_MISMATCH:
-@NM_DEVICE_VLAN_ERROR_INTERFACE_MISMATCH:
-@NM_DEVICE_VLAN_ERROR_MAC_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_VLAN_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_vlan_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_PARENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_VLAN_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_vlan_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_parent ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_vlan_id ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-wifi.sgml b/docs/libnm-glib/tmpl/nm-device-wifi.sgml
deleted file mode 100644
index b694b8221..000000000
--- a/docs/libnm-glib/tmpl/nm-device-wifi.sgml
+++ /dev/null
@@ -1,205 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceWifi
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceWifiError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_WIFI_ERROR_UNKNOWN:
-@NM_DEVICE_WIFI_ERROR_NOT_WIFI_CONNECTION:
-@NM_DEVICE_WIFI_ERROR_INVALID_WIFI_CONNECTION:
-@NM_DEVICE_WIFI_ERROR_INVALID_DEVICE_MAC:
-@NM_DEVICE_WIFI_ERROR_MAC_MISMATCH:
-@NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_WPA_CAPS:
-@NM_DEVICE_WIFI_ERROR_MISSING_DEVICE_RSN_CAPS:
-
-<!-- ##### MACRO NM_DEVICE_WIFI_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_wifi_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_BITRATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_ACCESS_POINTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_wifi_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_permanent_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_mode ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_bitrate ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_capabilities ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_active_access_point ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_access_point_by_path ##### -->
-<para>
-
-</para>
-
-@device:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_access_points ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMDeviceWifiRequestScanFn ##### -->
-<para>
-
-</para>
-
-@device:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_wifi_request_scan_simple ##### -->
-<para>
-
-</para>
-
-@device:
-@callback:
-@user_data:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device-wimax.sgml b/docs/libnm-glib/tmpl/nm-device-wimax.sgml
deleted file mode 100644
index acf1ab913..000000000
--- a/docs/libnm-glib/tmpl/nm-device-wimax.sgml
+++ /dev/null
@@ -1,199 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceWimax
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceWimaxError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_WIMAX_ERROR_UNKNOWN:
-@NM_DEVICE_WIMAX_ERROR_NOT_WIMAX_CONNECTION:
-@NM_DEVICE_WIMAX_ERROR_INVALID_WIMAX_CONNECTION:
-@NM_DEVICE_WIMAX_ERROR_INVALID_DEVICE_MAC:
-@NM_DEVICE_WIMAX_ERROR_MAC_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_wimax_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_ACTIVE_NSP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_CENTER_FREQUENCY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_RSSI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_CINR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_TX_POWER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_BSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_NSPS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_wimax_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_hw_address ##### -->
-<para>
-
-</para>
-
-@wimax:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_active_nsp ##### -->
-<para>
-
-</para>
-
-@wimax:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_nsp_by_path ##### -->
-<para>
-
-</para>
-
-@wimax:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_nsps ##### -->
-<para>
-
-</para>
-
-@wimax:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_center_frequency ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_rssi ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_cinr ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_tx_power ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_bsid ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-device.sgml b/docs/libnm-glib/tmpl/nm-device.sgml
deleted file mode 100644
index ef5443e18..000000000
--- a/docs/libnm-glib/tmpl/nm-device.sgml
+++ /dev/null
@@ -1,562 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDevice
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMDeviceError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_ERROR_UNKNOWN:
-@NM_DEVICE_ERROR_INTERFACE_MISMATCH:
-
-<!-- ##### MACRO NM_DEVICE_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_DEVICE_DEVICE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_UDI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_IP_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DRIVER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DRIVER_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_FIRMWARE_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_MANAGED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_AUTOCONNECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_FIRMWARE_MISSING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DHCP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_IP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DHCP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_STATE_REASON ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ACTIVE_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_AVAILABLE_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VENDOR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_PRODUCT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_PHYSICAL_PORT_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_iface ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_ip_iface ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_device_type ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_udi ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_driver ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_driver_version ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_firmware_version ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_type_description ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_capabilities ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_managed ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_autoconnect ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_set_autoconnect ##### -->
-<para>
-
-</para>
-
-@device:
-@autoconnect:
-
-
-<!-- ##### FUNCTION nm_device_get_firmware_missing ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_ip4_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_dhcp4_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_ip6_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_dhcp6_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_state ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_state_reason ##### -->
-<para>
-
-</para>
-
-@device:
-@reason:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_active_connection ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_available_connections ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_physical_port_id ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_mtu ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_is_software ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_product ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_vendor ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_description ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_disambiguate_names ##### -->
-<para>
-
-</para>
-
-@devices:
-@num_devices:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMDeviceCallbackFn ##### -->
-<para>
-
-</para>
-
-@device:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_disconnect ##### -->
-<para>
-
-</para>
-
-@device:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_delete ##### -->
-<para>
-
-</para>
-
-@device:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_filter_connections ##### -->
-<para>
-
-</para>
-
-@device:
-@connections:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_connection_valid ##### -->
-<para>
-
-</para>
-
-@device:
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_connection_compatible ##### -->
-<para>
-
-</para>
-
-@device:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_setting_type ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMDeviceDeactivateFn ##### -->
-<para>
-
-</para>
-
-@device:
-@error:
-@user_data:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-dhcp4-config.sgml b/docs/libnm-glib/tmpl/nm-dhcp4-config.sgml
deleted file mode 100644
index 4f3d86024..000000000
--- a/docs/libnm-glib/tmpl/nm-dhcp4-config.sgml
+++ /dev/null
@@ -1,60 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDHCP4Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DHCP4_CONFIG_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_dhcp4_config_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@object_path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_dhcp4_config_get_options ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_dhcp4_config_get_one_option ##### -->
-<para>
-
-</para>
-
-@config:
-@option:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-dhcp6-config.sgml b/docs/libnm-glib/tmpl/nm-dhcp6-config.sgml
deleted file mode 100644
index 7679b7d9f..000000000
--- a/docs/libnm-glib/tmpl/nm-dhcp6-config.sgml
+++ /dev/null
@@ -1,60 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDHCP6Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DHCP6_CONFIG_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_dhcp6_config_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@object_path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_dhcp6_config_get_options ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_dhcp6_config_get_one_option ##### -->
-<para>
-
-</para>
-
-@config:
-@option:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-glib-enum-types.sgml b/docs/libnm-glib/tmpl/nm-glib-enum-types.sgml
deleted file mode 100644
index b81a00af4..000000000
--- a/docs/libnm-glib/tmpl/nm-glib-enum-types.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-glib-enum-types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/docs/libnm-glib/tmpl/nm-ip4-config.sgml b/docs/libnm-glib/tmpl/nm-ip4-config.sgml
deleted file mode 100644
index 6b5f91f37..000000000
--- a/docs/libnm-glib/tmpl/nm-ip4-config.sgml
+++ /dev/null
@@ -1,146 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMIP4Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_ADDRESSES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_NAMESERVERS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_SEARCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP4_CONFIG_WINS_SERVERS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_ip4_config_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@object_path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_gateway ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_addresses ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_routes ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_nameservers ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_domains ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_searches ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_config_get_wins_servers ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-ip6-config.sgml b/docs/libnm-glib/tmpl/nm-ip6-config.sgml
deleted file mode 100644
index f0a95e528..000000000
--- a/docs/libnm-glib/tmpl/nm-ip6-config.sgml
+++ /dev/null
@@ -1,149 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMIP6Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_IP6_CONFIG_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP6_CONFIG_ADDRESSES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP6_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP6_CONFIG_NAMESERVERS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP6_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP6_CONFIG_SEARCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_ip6_config_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@object_path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_gateway ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_addresses ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_routes ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_num_nameservers ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_nameserver ##### -->
-<para>
-
-</para>
-
-@config:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_nameservers ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_domains ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_config_get_searches ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-object.sgml b/docs/libnm-glib/tmpl/nm-object.sgml
deleted file mode 100644
index 7d99e2c0d..000000000
--- a/docs/libnm-glib/tmpl/nm-object.sgml
+++ /dev/null
@@ -1,80 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMObject
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMObjectError ##### -->
-<para>
-
-</para>
-
-@NM_OBJECT_ERROR_UNKNOWN:
-@NM_OBJECT_ERROR_OBJECT_CREATION_FAILURE:
-
-<!-- ##### MACRO NM_OBJECT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_object_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_OBJECT_DBUS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_OBJECT_DBUS_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_object_get_connection ##### -->
-<para>
-
-</para>
-
-@object:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_object_get_path ##### -->
-<para>
-
-</para>
-
-@object:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-remote-connection.sgml b/docs/libnm-glib/tmpl/nm-remote-connection.sgml
deleted file mode 100644
index f20ef6806..000000000
--- a/docs/libnm-glib/tmpl/nm-remote-connection.sgml
+++ /dev/null
@@ -1,172 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMRemoteConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMRemoteConnectionError ##### -->
-<para>
-
-</para>
-
-@NM_REMOTE_CONNECTION_ERROR_UNKNOWN:
-@NM_REMOTE_CONNECTION_ERROR_DISCONNECTED:
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_remote_connection_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_UNSAVED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_UPDATED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_REMOVED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### USER_FUNCTION NMRemoteConnectionResultFunc ##### -->
-<para>
-
-</para>
-
-@connection:
-@error:
-@user_data:
-
-
-<!-- ##### TYPEDEF NMRemoteConnectionCommitFunc ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### TYPEDEF NMRemoteConnectionDeleteFunc ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### USER_FUNCTION NMRemoteConnectionGetSecretsFunc ##### -->
-<para>
-
-</para>
-
-@connection:
-@secrets:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_new ##### -->
-<para>
-
-</para>
-
-@bus:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_commit_changes ##### -->
-<para>
-
-</para>
-
-@connection:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_commit_changes_unsaved ##### -->
-<para>
-
-</para>
-
-@connection:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_save ##### -->
-<para>
-
-</para>
-
-@connection:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_delete ##### -->
-<para>
-
-</para>
-
-@connection:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_name:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_unsaved ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-remote-settings.sgml b/docs/libnm-glib/tmpl/nm-remote-settings.sgml
deleted file mode 100644
index 4500e38f9..000000000
--- a/docs/libnm-glib/tmpl/nm-remote-settings.sgml
+++ /dev/null
@@ -1,251 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMRemoteSettings
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMRemoteSettingsError ##### -->
-<para>
-
-</para>
-
-@NM_REMOTE_SETTINGS_ERROR_UNKNOWN:
-@NM_REMOTE_SETTINGS_ERROR_CONNECTION_REMOVED:
-@NM_REMOTE_SETTINGS_ERROR_CONNECTION_UNAVAILABLE:
-@NM_REMOTE_SETTINGS_ERROR_SERVICE_UNAVAILABLE:
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_remote_settings_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_BUS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_SERVICE_RUNNING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_CAN_MODIFY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_NEW_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_SETTINGS_CONNECTIONS_READ ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### USER_FUNCTION NMRemoteSettingsAddConnectionFunc ##### -->
-<para>
-
-</para>
-
-@settings:
-@connection:
-@error:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMRemoteSettingsLoadConnectionsFunc ##### -->
-<para>
-
-</para>
-
-@settings:
-@failures:
-@error:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMRemoteSettingsSaveHostnameFunc ##### -->
-<para>
-
-</para>
-
-@settings:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_settings_new ##### -->
-<para>
-
-</para>
-
-@bus:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_new_async ##### -->
-<para>
-
-</para>
-
-@bus:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_settings_new_finish ##### -->
-<para>
-
-</para>
-
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_list_connections ##### -->
-<para>
-
-</para>
-
-@settings:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_get_connection_by_id ##### -->
-<para>
-
-</para>
-
-@settings:
-@id:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_get_connection_by_path ##### -->
-<para>
-
-</para>
-
-@settings:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_get_connection_by_uuid ##### -->
-<para>
-
-</para>
-
-@settings:
-@uuid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_add_connection ##### -->
-<para>
-
-</para>
-
-@settings:
-@connection:
-@callback:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_add_connection_unsaved ##### -->
-<para>
-
-</para>
-
-@settings:
-@connection:
-@callback:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_load_connections ##### -->
-<para>
-
-</para>
-
-@settings:
-@filenames:
-@failures:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_reload_connections ##### -->
-<para>
-
-</para>
-
-@settings:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_settings_save_hostname ##### -->
-<para>
-
-</para>
-
-@settings:
-@hostname:
-@callback:
-@user_data:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-secret-agent.sgml b/docs/libnm-glib/tmpl/nm-secret-agent.sgml
deleted file mode 100644
index 72f5a5738..000000000
--- a/docs/libnm-glib/tmpl/nm-secret-agent.sgml
+++ /dev/null
@@ -1,203 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSecretAgent
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_secret_agent_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### ENUM NMSecretAgentError ##### -->
-<para>
-
-</para>
-
-@NM_SECRET_AGENT_ERROR_NOT_AUTHORIZED:
-@NM_SECRET_AGENT_ERROR_INVALID_CONNECTION:
-@NM_SECRET_AGENT_ERROR_USER_CANCELED:
-@NM_SECRET_AGENT_ERROR_AGENT_CANCELED:
-@NM_SECRET_AGENT_ERROR_INTERNAL_ERROR:
-@NM_SECRET_AGENT_ERROR_NO_SECRETS:
-
-<!-- ##### ENUM NMSecretAgentCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_SECRET_AGENT_CAPABILITY_NONE:
-@NM_SECRET_AGENT_CAPABILITY_VPN_HINTS:
-@NM_SECRET_AGENT_CAPABILITY_LAST:
-
-<!-- ##### ENUM NMSecretAgentGetSecretsFlags ##### -->
-<para>
-
-</para>
-
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED:
-
-<!-- ##### MACRO NM_SECRET_AGENT_IDENTIFIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_AUTO_REGISTER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_REGISTERED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_REGISTRATION_RESULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### USER_FUNCTION NMSecretAgentGetSecretsFunc ##### -->
-<para>
-
-</para>
-
-@agent:
-@connection:
-@secrets:
-@error:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMSecretAgentSaveSecretsFunc ##### -->
-<para>
-
-</para>
-
-@agent:
-@connection:
-@error:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMSecretAgentDeleteSecretsFunc ##### -->
-<para>
-
-</para>
-
-@agent:
-@connection:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_register ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_unregister ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_get_registered ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_get_secrets ##### -->
-<para>
-
-</para>
-
-@self:
-@connection:
-@setting_name:
-@hints:
-@flags:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_save_secrets ##### -->
-<para>
-
-</para>
-
-@self:
-@connection:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_delete_secrets ##### -->
-<para>
-
-</para>
-
-@self:
-@connection:
-@callback:
-@user_data:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-types.sgml b/docs/libnm-glib/tmpl/nm-types.sgml
deleted file mode 100644
index 18babb0f0..000000000
--- a/docs/libnm-glib/tmpl/nm-types.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/docs/libnm-glib/tmpl/nm-vpn-connection.sgml b/docs/libnm-glib/tmpl/nm-vpn-connection.sgml
deleted file mode 100644
index 39d5ecc10..000000000
--- a/docs/libnm-glib/tmpl/nm-vpn-connection.sgml
+++ /dev/null
@@ -1,66 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMVPNConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_VPN_CONNECTION_VPN_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_CONNECTION_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_vpn_connection_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_connection_get_vpn_state ##### -->
-<para>
-
-</para>
-
-@vpn:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_connection_get_banner ##### -->
-<para>
-
-</para>
-
-@vpn:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-vpn-enum-types.sgml b/docs/libnm-glib/tmpl/nm-vpn-enum-types.sgml
deleted file mode 100644
index 0f800cacc..000000000
--- a/docs/libnm-glib/tmpl/nm-vpn-enum-types.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-vpn-enum-types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/docs/libnm-glib/tmpl/nm-vpn-plugin-ui-interface.sgml b/docs/libnm-glib/tmpl/nm-vpn-plugin-ui-interface.sgml
deleted file mode 100644
index 1f6635b82..000000000
--- a/docs/libnm-glib/tmpl/nm-vpn-plugin-ui-interface.sgml
+++ /dev/null
@@ -1,178 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMVpnPluginUiWidget
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### USER_FUNCTION NMVpnPluginUiFactory ##### -->
-<para>
-
-</para>
-
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_factory ##### -->
-<para>
-
-</para>
-
-@error:
-@Returns:
-
-
-<!-- ##### ENUM NMVpnPluginUiCapability ##### -->
-<para>
-
-</para>
-
-@NM_VPN_PLUGIN_UI_CAPABILITY_NONE:
-@NM_VPN_PLUGIN_UI_CAPABILITY_IMPORT:
-@NM_VPN_PLUGIN_UI_CAPABILITY_EXPORT:
-@NM_VPN_PLUGIN_UI_CAPABILITY_IPV6:
-
-<!-- ##### MACRO NM_VPN_PLUGIN_UI_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_UI_INTERFACE_DESC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_UI_INTERFACE_SERVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVpnPluginUiInterfaceProp ##### -->
-<para>
-
-</para>
-
-@NM_VPN_PLUGIN_UI_INTERFACE_PROP_FIRST:
-@NM_VPN_PLUGIN_UI_INTERFACE_PROP_NAME:
-@NM_VPN_PLUGIN_UI_INTERFACE_PROP_DESC:
-@NM_VPN_PLUGIN_UI_INTERFACE_PROP_SERVICE:
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_interface_ui_factory ##### -->
-<para>
-
-</para>
-
-@iface:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_interface_get_capabilities ##### -->
-<para>
-
-</para>
-
-@iface:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_interface_import ##### -->
-<para>
-
-</para>
-
-@iface:
-@path:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_interface_export ##### -->
-<para>
-
-</para>
-
-@iface:
-@path:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_interface_get_suggested_name ##### -->
-<para>
-
-</para>
-
-@iface:
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_interface_delete_connection ##### -->
-<para>
-
-</para>
-
-@iface:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_widget_interface_get_widget ##### -->
-<para>
-
-</para>
-
-@iface:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_widget_interface_update_connection ##### -->
-<para>
-
-</para>
-
-@iface:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_ui_widget_interface_save_secrets ##### -->
-<para>
-
-</para>
-
-@iface:
-@connection:
-@error:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-vpn-plugin-utils.sgml b/docs/libnm-glib/tmpl/nm-vpn-plugin-utils.sgml
deleted file mode 100644
index 3a6536da7..000000000
--- a/docs/libnm-glib/tmpl/nm-vpn-plugin-utils.sgml
+++ /dev/null
@@ -1,46 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-vpn-plugin-utils
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_utils_read_vpn_details ##### -->
-<para>
-
-</para>
-
-@fd:
-@out_data:
-@out_secrets:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_utils_get_secret_flags ##### -->
-<para>
-
-</para>
-
-@data:
-@secret_name:
-@out_flags:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-vpn-plugin.sgml b/docs/libnm-glib/tmpl/nm-vpn-plugin.sgml
deleted file mode 100644
index 4f002dfec..000000000
--- a/docs/libnm-glib/tmpl/nm-vpn-plugin.sgml
+++ /dev/null
@@ -1,155 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMVPNPlugin
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_DBUS_SERVICE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVPNPluginError ##### -->
-<para>
-
-</para>
-
-@NM_VPN_PLUGIN_ERROR_GENERAL:
-@NM_VPN_PLUGIN_ERROR_STARTING_IN_PROGRESS:
-@NM_VPN_PLUGIN_ERROR_ALREADY_STARTED:
-@NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS:
-@NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED:
-@NM_VPN_PLUGIN_ERROR_WRONG_STATE:
-@NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS:
-@NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED:
-@NM_VPN_PLUGIN_ERROR_CONNECTION_INVALID:
-@NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED:
-
-<!-- ##### FUNCTION nm_vpn_plugin_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_get_connection ##### -->
-<para>
-
-</para>
-
-@plugin:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_get_state ##### -->
-<para>
-
-</para>
-
-@plugin:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_set_state ##### -->
-<para>
-
-</para>
-
-@plugin:
-@state:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_secrets_required ##### -->
-<para>
-
-</para>
-
-@plugin:
-@message:
-@hints:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_set_login_banner ##### -->
-<para>
-
-</para>
-
-@plugin:
-@banner:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_failure ##### -->
-<para>
-
-</para>
-
-@plugin:
-@reason:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_set_config ##### -->
-<para>
-
-</para>
-
-@plugin:
-@config:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_set_ip4_config ##### -->
-<para>
-
-</para>
-
-@plugin:
-@ip4_config:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_set_ip6_config ##### -->
-<para>
-
-</para>
-
-@plugin:
-@ip6_config:
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_disconnect ##### -->
-<para>
-
-</para>
-
-@plugin:
-@err:
-@Returns:
-
-
diff --git a/docs/libnm-glib/tmpl/nm-wimax-nsp.sgml b/docs/libnm-glib/tmpl/nm-wimax-nsp.sgml
deleted file mode 100644
index 8add56d43..000000000
--- a/docs/libnm-glib/tmpl/nm-wimax-nsp.sgml
+++ /dev/null
@@ -1,112 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMWimaxNsp
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_WIMAX_NSP_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_WIMAX_NSP_SIGNAL_QUALITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_WIMAX_NSP_NETWORK_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMWimaxNspNetworkType ##### -->
-<para>
-
-</para>
-
-@NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN:
-@NM_WIMAX_NSP_NETWORK_TYPE_HOME:
-@NM_WIMAX_NSP_NETWORK_TYPE_PARTNER:
-@NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER:
-
-<!-- ##### FUNCTION nm_wimax_nsp_new ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_get_name ##### -->
-<para>
-
-</para>
-
-@nsp:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_get_signal_quality ##### -->
-<para>
-
-</para>
-
-@nsp:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_get_network_type ##### -->
-<para>
-
-</para>
-
-@nsp:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_filter_connections ##### -->
-<para>
-
-</para>
-
-@nsp:
-@connections:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_connection_valid ##### -->
-<para>
-
-</para>
-
-@nsp:
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm-glib/version.xml b/docs/libnm-glib/version.xml
index 6d7de6e6a..ee90284c2 100644
--- a/docs/libnm-glib/version.xml
+++ b/docs/libnm-glib/version.xml
@@ -1 +1 @@
-1.0.2
+1.0.4
diff --git a/docs/libnm-util/Makefile.in b/docs/libnm-util/Makefile.in
index db9c82eb0..1d2ea506d 100644
--- a/docs/libnm-util/Makefile.in
+++ b/docs/libnm-util/Makefile.in
@@ -142,6 +142,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -255,6 +256,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -478,6 +480,7 @@ GPATH = $(srcdir)
TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
SETUP_FILES = \
$(content_files) \
+ $(expand_content_files) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE)-sections.txt \
$(DOC_MODULE)-overrides.txt
@@ -485,9 +488,9 @@ SETUP_FILES = \
# include common portion ...
EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
-DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
@@ -522,11 +525,6 @@ GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V))
GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects";
-#### templates ####
-GTK_DOC_V_TMPL = $(GTK_DOC_V_TMPL_$(V))
-GTK_DOC_V_TMPL_ = $(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY))
-GTK_DOC_V_TMPL_0 = @echo " DOC Rebuilding template files";
-
#### xml ####
GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V))
GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
@@ -763,18 +761,15 @@ $(REPORT_FILES): sgml-build.stamp
setup-build.stamp:
-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
if test "x$$files" != "x" ; then \
for file in $$files ; do \
- destdir=`dirname $(abs_builddir)/$$file` ;\
+ destdir=`dirname $(abs_builddir)/$$file`; \
test -d "$$destdir" || mkdir -p "$$destdir"; \
test -f $(abs_srcdir)/$$file && \
cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -pR $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
$(AM_V_at)touch setup-build.stamp
@@ -787,7 +782,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
scanobj_options=""; \
gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
scanobj_options="--verbose"; \
fi; \
@@ -804,23 +799,8 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -pR $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- $(AM_V_at)touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
- -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+ $(GTK_DOC_V_XML)_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
done ; \
@@ -830,17 +810,17 @@ sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(
sgml.stamp: sgml-build.stamp
@true
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
mkhtml_options=""; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkhtml_options="$$mkhtml_options --verbose"; \
fi; \
fi; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
fi; \
cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -856,11 +836,11 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
$(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
$(AM_V_at)touch html-build.stamp
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
mkpdf_options=""; \
gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkpdf_options="$$mkpdf_options --verbose"; \
fi; \
@@ -885,13 +865,15 @@ clean-local:
@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
rm -f $(DOC_MODULE).types; \
fi
+ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+ rm -f $(DOC_MODULE)-sections.txt; \
+ fi
distclean-local:
@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
+ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
fi
maintainer-clean-local:
@@ -938,9 +920,7 @@ uninstall-local:
@HAVE_GTK_DOC_FALSE@ @false
dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
diff --git a/docs/libnm-util/html/NMConnection.html b/docs/libnm-util/html/NMConnection.html
index 5c288a090..3ef46ffb5 100644
--- a/docs/libnm-util/html/NMConnection.html
+++ b/docs/libnm-util/html/NMConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMConnection</title>
+<title>NMConnection: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="ch01.html" title="libnm-util API Reference">
<link rel="next" href="NMSetting.html" title="NMSetting">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -633,7 +633,6 @@ nm_connection_error_quark (<em class="parameter"><code><span class="type">void</
<div class="refsect3">
<a name="id-1.2.2.10.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMConnection.html" title="NMConnection"><span class="type">NMConnection</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -645,7 +644,6 @@ nm_connection_new (<em class="parameter"><code><span class="type">void</span></c
<div class="refsect3">
<a name="id-1.2.2.10.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMConnection.html" title="NMConnection"><span class="type">NMConnection</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -684,7 +682,6 @@ the connection. </p></td>
<p> the new <a class="link" href="NMConnection.html" title="NMConnection"><span class="type">NMConnection</span></a> object, populated with settings created
from the values in the hash table, or <code class="literal">NULL</code> if the connection failed to
validate</p>
-<p></p>
</div>
</div>
<hr>
@@ -918,7 +915,6 @@ nm_connection_replace_settings (<em class="parameter"><code><a class="link" href
<a name="id-1.2.2.10.11.5"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the settings were valid and added to the connection, <code class="literal">FALSE</code>
if they were not</p>
-<p></p>
</div>
</div>
<hr>
@@ -965,9 +961,8 @@ with</p></td>
<a name="id-1.2.2.10.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the settings were valid and added to the connection, <code class="literal">FALSE</code>
if they were not</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1009,7 +1004,6 @@ each flag's behavior.</p>
<div class="refsect3">
<a name="id-1.2.2.10.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the comparison succeeds, <code class="literal">FALSE</code> if it does not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1065,7 +1059,6 @@ differ mapped to one or more of <a class="link" href="NMSetting.html#NMSettingDi
<a name="id-1.2.2.10.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connections contain the same values, <code class="literal">FALSE</code> if they do
not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1108,7 +1101,6 @@ setting and which property failed validation, and how it failed validation.</p>
<div class="refsect3">
<a name="id-1.2.2.10.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is valid, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1167,9 +1159,8 @@ why the connection is invalid, if the function returns an error.</p></td>
<div class="refsect3">
<a name="id-1.2.2.10.16.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is valid, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -1212,7 +1203,6 @@ elements. </p></td>
<a name="id-1.2.2.10.17.6"></a><h4>Returns</h4>
<p> the setting name of the <a class="link" href="NMSetting.html" title="NMSetting"><span class="type">NMSetting</span></a> object which has invalid or
missing secrets</p>
-<p></p>
</div>
</div>
<hr>
@@ -1332,7 +1322,6 @@ string:<span class="type">GValue</span> of setting property names and secrets of
<a name="id-1.2.2.10.20.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secrets were successfully updated, <code class="literal">FALSE</code> if the update
failed (tried to update secrets for a setting that doesn't exist, etc)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1393,7 +1382,6 @@ nm_connection_get_path (<em class="parameter"><code><a class="link" href="NMConn
<a name="id-1.2.2.10.22.6"></a><h4>Returns</h4>
<p> the D-Bus path of the connection, previously set by a call to
<a class="link" href="NMConnection.html#nm-connection-set-path" title="nm_connection_set_path ()"><code class="function">nm_connection_set_path()</code></a>.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1423,7 +1411,6 @@ connection types, this function will return <code class="literal">NULL</code>.</
<div class="refsect3">
<a name="id-1.2.2.10.23.6"></a><h4>Returns</h4>
<p> Name of the kernel interface or <code class="literal">NULL</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -1454,9 +1441,8 @@ NetworkManager, this is the name of the created interface.</p>
<div class="refsect3">
<a name="id-1.2.2.10.24.7"></a><h4>Returns</h4>
<p> Name of the kernel interface or <code class="literal">NULL</code></p>
-<p></p>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -1496,7 +1482,6 @@ property of the connection and matches that against <em class="parameter"><code>
<a name="id-1.2.2.10.25.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is of the given <em class="parameter"><code>type</code></em>
, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1628,7 +1613,6 @@ nm_connection_lookup_setting_type (<em class="parameter"><code>const <span class
<div class="refsect3">
<a name="id-1.2.2.10.29.6"></a><h4>Returns</h4>
<p> the <span class="type">GType</span> of the setting's class</p>
-<p></p>
</div>
</div>
<hr>
@@ -1657,7 +1641,6 @@ Useful for figuring out which setting a returned error is for.</p>
<div class="refsect3">
<a name="id-1.2.2.10.30.6"></a><h4>Returns</h4>
<p> the <span class="type">GType</span> of the setting's class</p>
-<p></p>
</div>
</div>
<hr>
@@ -1684,7 +1667,6 @@ nm_connection_get_uuid (<em class="parameter"><code><a class="link" href="NMConn
<div class="refsect3">
<a name="id-1.2.2.10.31.6"></a><h4>Returns</h4>
<p> the UUID from the connection's 'connection' setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1711,7 +1693,6 @@ nm_connection_get_id (<em class="parameter"><code><a class="link" href="NMConnec
<div class="refsect3">
<a name="id-1.2.2.10.32.6"></a><h4>Returns</h4>
<p> the ID from the connection's 'connection' setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1738,9 +1719,8 @@ nm_connection_get_connection_type (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.2.10.33.6"></a><h4>Returns</h4>
<p> the type from the connection's 'connection' setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1775,7 +1755,7 @@ or <code class="literal">NULL</code> if <em class="parameter"><code>connection</
is not a virtual connection type. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1884,7 +1864,7 @@ nm_connection_get_setting_team (<em class="parameter"><code><a class="link" href
<p> an <a class="link" href="NMSettingTeam.html" title="NMSettingTeam"><span class="type">NMSettingTeam</span></a> if the connection contains one, otherwise <code class="literal">NULL</code>. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1912,7 +1892,7 @@ nm_connection_get_setting_team_port (<em class="parameter"><code><a class="link"
<p> an <a class="link" href="NMSettingTeamPort.html" title="NMSettingTeamPort"><span class="type">NMSettingTeamPort</span></a> if the connection contains one, otherwise <code class="literal">NULL</code>. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2048,7 +2028,7 @@ nm_connection_get_setting_dcb (<em class="parameter"><code><a class="link" href=
<p> an <a class="link" href="NMSettingDcb.html" title="NMSettingDcb"><span class="type">NMSettingDcb</span></a> if the connection contains one, otherwise NULL. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2076,7 +2056,7 @@ nm_connection_get_setting_generic (<em class="parameter"><code><a class="link" h
<p> an <a class="link" href="NMSettingGeneric.html" title="NMSettingGeneric"><span class="type">NMSettingGeneric</span></a> if the connection contains one, otherwise NULL. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2491,32 +2471,24 @@ nm_connection_get_setting_vlan (<em class="parameter"><code><a class="link" href
<a name="NM-CONNECTION-SECRETS-UPDATED:CAPS"></a><h3>NM_CONNECTION_SECRETS_UPDATED</h3>
<pre class="programlisting">#define NM_CONNECTION_SECRETS_UPDATED "secrets-updated"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-SECRETS-CLEARED:CAPS"></a><h3>NM_CONNECTION_SECRETS_CLEARED</h3>
<pre class="programlisting">#define NM_CONNECTION_SECRETS_CLEARED "secrets-cleared"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-CHANGED:CAPS"></a><h3>NM_CONNECTION_CHANGED</h3>
<pre class="programlisting">#define NM_CONNECTION_CHANGED "changed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-PATH:CAPS"></a><h3>NM_CONNECTION_PATH</h3>
<pre class="programlisting">#define NM_CONNECTION_PATH "path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2582,16 +2554,12 @@ nm_connection_get_setting_vlan (<em class="parameter"><code><a class="link" href
<a name="NM-CONNECTION-NORMALIZE-PARAM-IP6-CONFIG-METHOD:CAPS"></a><h3>NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD</h3>
<pre class="programlisting">#define NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD "ip6-config-method"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-ERROR:CAPS"></a><h3>NM_CONNECTION_ERROR</h3>
<pre class="programlisting">#define NM_CONNECTION_ERROR nm_connection_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2645,7 +2613,7 @@ or when settings are added or removed.</p>
</table></div>
</div>
<p>Flags: Run First</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2721,7 +2689,6 @@ updated</p></td>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSetting.html b/docs/libnm-util/html/NMSetting.html
index 140fac6af..3ce896838 100644
--- a/docs/libnm-util/html/NMSetting.html
+++ b/docs/libnm-util/html/NMSetting.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSetting</title>
+<title>NMSetting: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMConnection.html" title="NMConnection">
<link rel="next" href="NMSettingConnection.html" title="NMSettingConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -331,7 +331,6 @@ nm_setting_error_quark (<em class="parameter"><code><span class="type">void</spa
<div class="refsect3">
<a name="id-1.2.3.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for NMSetting errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -339,32 +338,24 @@ nm_setting_error_quark (<em class="parameter"><code><span class="type">void</spa
<a name="NM-SETTING-PARAM-SERIALIZE:CAPS"></a><h3>NM_SETTING_PARAM_SERIALIZE</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_SERIALIZE (1 &lt;&lt; (0 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PARAM-REQUIRED:CAPS"></a><h3>NM_SETTING_PARAM_REQUIRED</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_REQUIRED (1 &lt;&lt; (1 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PARAM-SECRET:CAPS"></a><h3>NM_SETTING_PARAM_SECRET</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_SECRET (1 &lt;&lt; (2 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PARAM-FUZZY-IGNORE:CAPS"></a><h3>NM_SETTING_PARAM_FUZZY_IGNORE</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_FUZZY_IGNORE (1 &lt;&lt; (3 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -409,7 +400,6 @@ nm_setting_error_quark (<em class="parameter"><code><span class="type">void</spa
<div class="refsect3">
<a name="id-1.2.3.9.7.5"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> to clear the secret, <code class="literal">FALSE</code> to not clear the secret</p>
-<p></p>
</div>
</div>
<hr>
@@ -537,7 +527,6 @@ string to GValue mapping of properties that apply to the setting. </p></td>
<a name="id-1.2.3.9.10.6"></a><h4>Returns</h4>
<p> a new <a class="link" href="NMSetting.html" title="NMSetting"><span class="type">NMSetting</span></a> object populated with the properties from the
hash table, or <code class="literal">NULL</code> on failure</p>
-<p></p>
</div>
</div>
<hr>
@@ -593,7 +582,6 @@ nm_setting_get_name (<em class="parameter"><code><a class="link" href="NMSetting
<a name="id-1.2.3.9.12.6"></a><h4>Returns</h4>
<p> a string containing the type name of the <a class="link" href="NMSetting.html" title="NMSetting"><span class="type">NMSetting</span></a> object,
like 'ppp' or 'wireless' or 'wired'.</p>
-<p></p>
</div>
</div>
<hr>
@@ -640,7 +628,6 @@ came. </p></td>
<div class="refsect3">
<a name="id-1.2.3.9.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the setting is valid, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -683,7 +670,6 @@ for a description of each flag's behavior.</p>
<div class="refsect3">
<a name="id-1.2.3.9.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the comparison succeeds, <code class="literal">FALSE</code> if it does not</p>
-<p></p>
</div>
</div>
<hr>
@@ -746,7 +732,6 @@ in and the settings differ, a new one is created and returned. </p></td>
<div class="refsect3">
<a name="id-1.2.3.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the settings contain the same values, <code class="literal">FALSE</code> if they do not</p>
-<p></p>
</div>
</div>
<hr>
@@ -815,7 +800,6 @@ output format is not guaranteed to be stable and may change at any time.</p>
<p> an allocated string containing a textual representation of the
setting's properties and values (including secrets!), which the caller should
free with <code class="function">g_free()</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -955,7 +939,6 @@ string to <span class="type">GValue</span> of setting property names and secrets
<a name="id-1.2.3.9.21.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secrets were successfully updated, <code class="literal">FALSE</code> on failure to
update one or more of the secrets.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1004,7 +987,6 @@ handle that secret.</p>
<a name="id-1.2.3.9.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success (if the given secret name was a valid property of
this setting, and if that property is secret), <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1053,7 +1035,6 @@ handle that secret.</p>
<a name="id-1.2.3.9.23.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success (if the given secret name was a valid property of
this setting, and if that property is secret), <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1082,7 +1063,6 @@ needs to use if specified in the settings.</p>
<a name="id-1.2.3.9.24.6"></a><h4>Returns</h4>
<p> Name of the virtual interface or <code class="literal">NULL</code> if the setting does not
support this feature</p>
-<p></p>
</div>
</div>
</div>
@@ -1141,16 +1121,12 @@ support this feature</p>
<a name="NM-SETTING-ERROR:CAPS"></a><h3>NM_SETTING_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_ERROR nm_setting_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-NAME:CAPS"></a><h3>NM_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1423,7 +1399,6 @@ example "ppp" or "wireless" or "wired".</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSetting8021x.html b/docs/libnm-util/html/NMSetting8021x.html
index ba9dbe105..05d9516ce 100644
--- a/docs/libnm-util/html/NMSetting8021x.html
+++ b/docs/libnm-util/html/NMSetting8021x.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSetting8021x</title>
+<title>NMSetting8021x: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingDcb.html" title="NMSettingDcb">
<link rel="next" href="NMSettingIP4Config.html" title="NMSettingIP4Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -968,7 +968,6 @@ nm_setting_802_1x_error_quark (<em class="parameter"><code><span class="type">vo
<div class="refsect3">
<a name="id-1.2.24.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSetting8021x.html" title="NMSetting8021x"><span class="type">NMSetting8021x</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -980,7 +979,6 @@ nm_setting_802_1x_new (<em class="parameter"><code><span class="type">void</span
<div class="refsect3">
<a name="id-1.2.24.9.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSetting8021x.html" title="NMSetting8021x"><span class="type">NMSetting8021x</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -1011,7 +1009,6 @@ allowed EAP methods.</p>
<div class="refsect3">
<a name="id-1.2.24.9.4.6"></a><h4>Returns</h4>
<p> the number of allowed EAP methods</p>
-<p></p>
</div>
</div>
<hr>
@@ -1048,7 +1045,6 @@ nm_setting_802_1x_get_eap_method (<em class="parameter"><code><a class="link" hr
<a name="id-1.2.24.9.5.6"></a><h4>Returns</h4>
<p> the name of the allowed EAP method at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1086,7 +1082,6 @@ allowed EAP methods.</p>
<a name="id-1.2.24.9.6.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the EAP method was successfully added, <code class="literal">FALSE</code> if it was
not a valid method or if it was already allowed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1153,9 +1148,8 @@ nm_setting_802_1x_remove_eap_method_by_value
<div class="refsect3">
<a name="id-1.2.24.9.8.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the EAP method was founs and removed, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1204,7 +1198,6 @@ authenticate the user. Often this is a username or login name.</p>
<div class="refsect3">
<a name="id-1.2.24.9.10.6"></a><h4>Returns</h4>
<p> the user identifier</p>
-<p></p>
</div>
</div>
<hr>
@@ -1235,7 +1228,6 @@ a secure form, if applicable for that EAP method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.11.6"></a><h4>Returns</h4>
<p> the anonymous identifier</p>
-<p></p>
</div>
</div>
<hr>
@@ -1262,7 +1254,6 @@ nm_setting_802_1x_get_pac_file (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.24.9.12.6"></a><h4>Returns</h4>
<p> the PAC file</p>
-<p></p>
</div>
</div>
<hr>
@@ -1294,7 +1285,6 @@ of these properties.</p>
<div class="refsect3">
<a name="id-1.2.24.9.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if a system CA certificate path should be used, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1325,7 +1315,6 @@ certificates for verifying the network to client.</p>
<div class="refsect3">
<a name="id-1.2.24.9.14.6"></a><h4>Returns</h4>
<p> the CA certificate directory path</p>
-<p></p>
</div>
</div>
<hr>
@@ -1356,7 +1345,6 @@ to add more CA certificates for verifying the network to client.</p>
<div class="refsect3">
<a name="id-1.2.24.9.15.6"></a><h4>Returns</h4>
<p> the "phase 2" CA certificate directory path</p>
-<p></p>
</div>
</div>
<hr>
@@ -1385,7 +1373,6 @@ if <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CA
<div class="refsect3">
<a name="id-1.2.24.9.16.6"></a><h4>Returns</h4>
<p> scheme used to store the CA certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1417,7 +1404,6 @@ of the network cannot be confirmed by the client.</p>
<div class="refsect3">
<a name="id-1.2.24.9.17.6"></a><h4>Returns</h4>
<p> the CA certificate data</p>
-<p></p>
</div>
</div>
<hr>
@@ -1449,7 +1435,6 @@ of the network cannot be confirmed by the client.</p>
<div class="refsect3">
<a name="id-1.2.24.9.18.6"></a><h4>Returns</h4>
<p> path to the CA certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -1510,7 +1495,6 @@ clears the CA certificate.</p></td>
<div class="refsect3">
<a name="id-1.2.24.9.19.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -1539,7 +1523,6 @@ nm_setting_802_1x_get_subject_match (<em class="parameter"><code><a class="link"
substring to be matched against the subject of the authentication
server certificate, or <code class="literal">NULL</code> no subject verification is to be
performed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1568,7 +1551,6 @@ nm_setting_802_1x_get_num_altsubject_matches
<div class="refsect3">
<a name="id-1.2.24.9.21.6"></a><h4>Returns</h4>
<p> the number of altsubject-matches entries.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1606,7 +1588,6 @@ nm_setting_802_1x_get_altsubject_match
<a name="id-1.2.24.9.22.6"></a><h4>Returns</h4>
<p> the altSubjectName match at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1645,7 +1626,6 @@ server is not verified.</p>
<a name="id-1.2.24.9.23.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the alternative subject name match was
successfully added, <code class="literal">FALSE</code> if it was already allowed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1714,9 +1694,8 @@ nm_setting_802_1x_remove_altsubject_match_by_value
<a name="id-1.2.24.9.25.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the alternative subject name match was found and removed,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1768,7 +1747,6 @@ if <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CA
<div class="refsect3">
<a name="id-1.2.24.9.27.6"></a><h4>Returns</h4>
<p> scheme used to store the client certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1798,7 +1776,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.28.6"></a><h4>Returns</h4>
<p> the client certificate data</p>
-<p></p>
</div>
</div>
<hr>
@@ -1828,7 +1805,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.29.6"></a><h4>Returns</h4>
<p> path to the client certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -1893,7 +1869,6 @@ clears the client certificate.</p></td>
<div class="refsect3">
<a name="id-1.2.24.9.30.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -1921,7 +1896,6 @@ nm_setting_802_1x_get_phase1_peapver (<em class="parameter"><code><a class="link
<p> the "phase 1" PEAP version to be used when authenticating with
EAP-PEAP as contained in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase1-peapver" title="The “phase1-peapver” property"><span class="type">“phase1-peapver”</span></a> property. Valid
values are <code class="literal">NULL</code> (unset), "0" (PEAP version 0), and "1" (PEAP version 1).</p>
-<p></p>
</div>
</div>
<hr>
@@ -1952,7 +1926,6 @@ used when authenticating with EAP-PEAP, as contained in the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase1-peaplabel" title="The “phase1-peaplabel” property"><span class="type">“phase1-peaplabel”</span></a> property. Valid values are <code class="literal">NULL</code> (unset),
"0" (use old-style label), and "1" (use new-style label). See the
wpa_supplicant documentation for more details.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1981,7 +1954,6 @@ nm_setting_802_1x_get_phase1_fast_provisioning
<p> whether "phase 1" PEAP fast provisioning should be used, as specified
by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase1-fast-provisioning" title="The “phase1-fast-provisioning” property"><span class="type">“phase1-fast-provisioning”</span></a> property. See the
wpa_supplicant documentation for more details.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2008,7 +1980,6 @@ nm_setting_802_1x_get_phase2_auth (<em class="parameter"><code><a class="link" h
<a name="id-1.2.24.9.34.5"></a><h4>Returns</h4>
<p> the "phase 2" non-EAP (ex MD5) allowed authentication method as
specified by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2035,7 +2006,6 @@ nm_setting_802_1x_get_phase2_autheap (<em class="parameter"><code><a class="link
<a name="id-1.2.24.9.35.5"></a><h4>Returns</h4>
<p> the "phase 2" EAP-based (ex TLS) allowed authentication method as
specified by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2066,7 +2036,6 @@ use <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-get-ca-cert-path
<div class="refsect3">
<a name="id-1.2.24.9.36.6"></a><h4>Returns</h4>
<p> scheme used to store the "phase 2" CA certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -2099,7 +2068,6 @@ of the network cannot be confirmed by the client.</p>
<div class="refsect3">
<a name="id-1.2.24.9.37.6"></a><h4>Returns</h4>
<p> the "phase 2" CA certificate data</p>
-<p></p>
</div>
</div>
<hr>
@@ -2132,7 +2100,6 @@ of the network cannot be confirmed by the client.</p>
<div class="refsect3">
<a name="id-1.2.24.9.38.6"></a><h4>Returns</h4>
<p> path to the "phase 2" CA certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -2193,7 +2160,6 @@ clears the "phase2" CA certificate.</p></td>
<div class="refsect3">
<a name="id-1.2.24.9.39.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -2223,7 +2189,6 @@ nm_setting_802_1x_get_phase2_subject_match
the substring to be matched against the subject of the "phase 2"
authentication server certificate, or <code class="literal">NULL</code> no subject verification
is to be performed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2252,7 +2217,6 @@ nm_setting_802_1x_get_num_phase2_altsubject_matches
<div class="refsect3">
<a name="id-1.2.24.9.41.6"></a><h4>Returns</h4>
<p> the number of phase2-altsubject-matches entries.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2290,7 +2254,6 @@ nm_setting_802_1x_get_phase2_altsubject_match
<a name="id-1.2.24.9.42.6"></a><h4>Returns</h4>
<p> the "phase 2" altSubjectName match at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2330,7 +2293,6 @@ connection</p></td>
<a name="id-1.2.24.9.43.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the "phase 2" alternative subject name match was
successfully added, <code class="literal">FALSE</code> if it was already allowed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2399,9 +2361,8 @@ nm_setting_802_1x_remove_phase2_altsubject_match_by_value
<a name="id-1.2.24.9.45.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the alternative subject name match for "phase 2" was found and removed,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2455,7 +2416,6 @@ returned scheme is <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-C
<div class="refsect3">
<a name="id-1.2.24.9.47.6"></a><h4>Returns</h4>
<p> scheme used to store the "phase 2" client certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -2485,7 +2445,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.48.6"></a><h4>Returns</h4>
<p> the "phase 2" client certificate data</p>
-<p></p>
</div>
</div>
<hr>
@@ -2515,7 +2474,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.49.6"></a><h4>Returns</h4>
<p> path to the "phase 2" client certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -2581,7 +2539,6 @@ clears the "phase2" client certificate.</p></td>
<div class="refsect3">
<a name="id-1.2.24.9.50.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -2608,7 +2565,6 @@ nm_setting_802_1x_get_password (<em class="parameter"><code><a class="link" href
<a name="id-1.2.24.9.51.5"></a><h4>Returns</h4>
<p> the password used by the authentication method, if any, as specified
by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -2634,7 +2590,6 @@ nm_setting_802_1x_get_password_flags (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.24.9.52.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2662,7 +2617,6 @@ nm_setting_802_1x_get_password_raw (<em class="parameter"><code><a class="link"
<p> the password used by the authentication method as a
UTF-8-encoded array of bytes, as specified by the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -2690,7 +2644,6 @@ nm_setting_802_1x_get_password_raw_flags
<a name="id-1.2.24.9.54.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2717,7 +2670,6 @@ nm_setting_802_1x_get_pin (<em class="parameter"><code><a class="link" href="NMS
<a name="id-1.2.24.9.55.5"></a><h4>Returns</h4>
<p> the PIN used by the authentication method, if any, as specified
by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--pin" title="The “pin” property"><span class="type">“pin”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -2744,7 +2696,6 @@ nm_setting_802_1x_get_pin_flags (<em class="parameter"><code><a class="link" hre
<a name="id-1.2.24.9.56.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--pin" title="The “pin” property"><span class="type">“pin”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2776,7 +2727,6 @@ nm_setting_802_1x_get_private_key_scheme
<div class="refsect3">
<a name="id-1.2.24.9.57.6"></a><h4>Returns</h4>
<p> scheme used to store the private key (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -2809,7 +2759,6 @@ keys should always be encrypted with a private key password.</p>
<div class="refsect3">
<a name="id-1.2.24.9.58.7"></a><h4>Returns</h4>
<p> the private key data</p>
-<p></p>
</div>
</div>
<hr>
@@ -2839,7 +2788,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.59.6"></a><h4>Returns</h4>
<p> path to the private key file</p>
-<p></p>
</div>
</div>
<hr>
@@ -2927,7 +2875,6 @@ an error is returned.</p></td>
<div class="refsect3">
<a name="id-1.2.24.9.60.9"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -2956,7 +2903,6 @@ nm_setting_802_1x_get_private_key_password
<p> the private key password used to decrypt the private key if
previously set with <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-private-key" title="nm_setting_802_1x_set_private_key ()"><code class="function">nm_setting_802_1x_set_private_key()</code></a>, or the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2984,7 +2930,6 @@ nm_setting_802_1x_get_private_key_password_flags
<a name="id-1.2.24.9.62.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -3012,7 +2957,6 @@ nm_setting_802_1x_get_private_key_format
<a name="id-1.2.24.9.63.5"></a><h4>Returns</h4>
<p> the data format of the private key data stored in the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key" title="The “private-key” property"><span class="type">“private-key”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -3044,7 +2988,6 @@ scheme is <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-
<div class="refsect3">
<a name="id-1.2.24.9.64.6"></a><h4>Returns</h4>
<p> scheme used to store the "phase 2" private key (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -3077,7 +3020,6 @@ keys should always be encrypted with a private key password.</p>
<div class="refsect3">
<a name="id-1.2.24.9.65.7"></a><h4>Returns</h4>
<p> the "phase 2" private key data</p>
-<p></p>
</div>
</div>
<hr>
@@ -3107,7 +3049,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.2.24.9.66.6"></a><h4>Returns</h4>
<p> path to the "phase 2" private key file</p>
-<p></p>
</div>
</div>
<hr>
@@ -3197,7 +3138,6 @@ an error is returned.</p></td>
<div class="refsect3">
<a name="id-1.2.24.9.67.9"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -3226,7 +3166,6 @@ nm_setting_802_1x_get_phase2_private_key_password
<p> the private key password used to decrypt the private key if
previously set with <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-private-key" title="nm_setting_802_1x_set_phase2_private_key ()"><code class="function">nm_setting_802_1x_set_phase2_private_key()</code></a> or the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -3254,7 +3193,6 @@ nm_setting_802_1x_get_phase2_private_key_password_flags
<a name="id-1.2.24.9.69.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -3282,7 +3220,6 @@ nm_setting_802_1x_get_phase2_private_key_format
<a name="id-1.2.24.9.70.5"></a><h4>Returns</h4>
<p> the data format of the "phase 2" private key data stored in the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key" title="The “phase2-private-key” property"><span class="type">“phase2-private-key”</span></a> property</p>
-<p></p>
</div>
</div>
</div>
@@ -3383,8 +3320,6 @@ to a file containing the certificate or key data</p>
<a name="NM-SETTING-802-1X-SETTING-NAME:CAPS"></a><h3>NM_SETTING_802_1X_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_SETTING_NAME "802-1x"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -3429,264 +3364,198 @@ required</p>
<a name="NM-SETTING-802-1X-ERROR:CAPS"></a><h3>NM_SETTING_802_1X_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_ERROR nm_setting_802_1x_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-EAP:CAPS"></a><h3>NM_SETTING_802_1X_EAP</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_EAP "eap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-IDENTITY:CAPS"></a><h3>NM_SETTING_802_1X_IDENTITY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_IDENTITY "identity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-ANONYMOUS-IDENTITY:CAPS"></a><h3>NM_SETTING_802_1X_ANONYMOUS_IDENTITY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_ANONYMOUS_IDENTITY "anonymous-identity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PAC-FILE:CAPS"></a><h3>NM_SETTING_802_1X_PAC_FILE</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PAC_FILE "pac-file"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-CA-CERT:CAPS"></a><h3>NM_SETTING_802_1X_CA_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_CA_CERT "ca-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-CA-PATH:CAPS"></a><h3>NM_SETTING_802_1X_CA_PATH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_CA_PATH "ca-path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-SUBJECT-MATCH:CAPS"></a><h3>NM_SETTING_802_1X_SUBJECT_MATCH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_SUBJECT_MATCH "subject-match"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-ALTSUBJECT-MATCHES:CAPS"></a><h3>NM_SETTING_802_1X_ALTSUBJECT_MATCHES</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_ALTSUBJECT_MATCHES "altsubject-matches"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-CLIENT-CERT:CAPS"></a><h3>NM_SETTING_802_1X_CLIENT_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_CLIENT_CERT "client-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE1-PEAPVER:CAPS"></a><h3>NM_SETTING_802_1X_PHASE1_PEAPVER</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE1_PEAPVER "phase1-peapver"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE1-PEAPLABEL:CAPS"></a><h3>NM_SETTING_802_1X_PHASE1_PEAPLABEL</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE1_PEAPLABEL "phase1-peaplabel"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE1-FAST-PROVISIONING:CAPS"></a><h3>NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING "phase1-fast-provisioning"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-AUTH:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_AUTH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_AUTH "phase2-auth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-AUTHEAP:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_AUTHEAP</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_AUTHEAP "phase2-autheap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-CA-CERT:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_CA_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_CA_CERT "phase2-ca-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-CA-PATH:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_CA_PATH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_CA_PATH "phase2-ca-path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-SUBJECT-MATCH:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH "phase2-subject-match"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-ALTSUBJECT-MATCHES:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES "phase2-altsubject-matches"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-CLIENT-CERT:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_CLIENT_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_CLIENT_CERT "phase2-client-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD-RAW:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD_RAW</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD_RAW "password-raw"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD-RAW-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD_RAW_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD_RAW_FLAGS "password-raw-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PRIVATE-KEY:CAPS"></a><h3>NM_SETTING_802_1X_PRIVATE_KEY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PRIVATE_KEY "private-key"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PRIVATE-KEY-PASSWORD:CAPS"></a><h3>NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD "private-key-password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PRIVATE-KEY-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS "private-key-password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-PRIVATE-KEY:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_PRIVATE_KEY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY "phase2-private-key"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-PRIVATE-KEY-PASSWORD:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD "phase2-private-key-password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-PRIVATE-KEY-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS "phase2-private-key-password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PIN:CAPS"></a><h3>NM_SETTING_802_1X_PIN</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PIN "pin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PIN-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PIN_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PIN_FLAGS "pin-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-SYSTEM-CA-CERTS:CAPS"></a><h3>NM_SETTING_802_1X_SYSTEM_CA_CERTS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_SYSTEM_CA_CERTS "system-ca-certs"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -3694,14 +3563,18 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--altsubject-matches"></a><h3>The <code class="literal">“altsubject-matches”</code> property</h3>
<pre class="programlisting"> “altsubject-matches” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>List of strings to be matched against the altSubjectName of the
+certificate presented by the authentication server. If the list is empty,
+no verification of the server certificate's altSubjectName is performed.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--anonymous-identity"></a><h3>The <code class="literal">“anonymous-identity”</code> property</h3>
<pre class="programlisting"> “anonymous-identity” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Anonymous identity string for EAP authentication methods. Used as the
+unencrypted identity with EAP types that support different tunneled
+identity like EAP-TTLS.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3709,14 +3582,27 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--ca-cert"></a><h3>The <code class="literal">“ca-cert”</code> property</h3>
<pre class="programlisting"> “ca-cert” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Contains the CA certificate if used by the EAP method specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte. This
+property can be unset even if the EAP method supports CA certificates,
+but this allows man-in-the-middle attacks and is NOT recommended.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-ca-cert" title="nm_setting_802_1x_set_ca_cert ()"><code class="function">nm_setting_802_1x_set_ca_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--ca-path"></a><h3>The <code class="literal">“ca-path”</code> property</h3>
<pre class="programlisting"> “ca-path” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded path to a directory containing PEM or DER formatted
+certificates to be added to the verification chain in addition to the
+certificate specified in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-cert" title="The “ca-cert” property"><span class="type">“ca-cert”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3724,21 +3610,35 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--client-cert"></a><h3>The <code class="literal">“client-cert”</code> property</h3>
<pre class="programlisting"> “client-cert” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Contains the client certificate if used by the EAP method specified in
+the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-client-cert" title="nm_setting_802_1x_set_client_cert ()"><code class="function">nm_setting_802_1x_set_client_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--eap"></a><h3>The <code class="literal">“eap”</code> property</h3>
<pre class="programlisting"> “eap” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>The allowed EAP method to be used when authenticating to the network with
+802.1x. Valid methods are: "leap", "md5", "tls", "peap", "ttls", "pwd",
+and "fast". Each method requires different configuration using the
+properties of this setting; refer to wpa_supplicant documentation for the
+allowed combinations.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--identity"></a><h3>The <code class="literal">“identity”</code> property</h3>
<pre class="programlisting"> “identity” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Identity string for EAP authentication methods. Often the user's user or
+login name.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3746,7 +3646,7 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--pac-file"></a><h3>The <code class="literal">“pac-file”</code> property</h3>
<pre class="programlisting"> “pac-file” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded file path containing PAC for EAP-FAST.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3754,7 +3654,9 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded password used for EAP authentication methods. If both the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property and the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a>
+property are specified, <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> is preferred.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3762,7 +3664,7 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -3771,14 +3673,17 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--password-raw"></a><h3>The <code class="literal">“password-raw”</code> property</h3>
<pre class="programlisting"> “password-raw” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Password used for EAP authentication methods, given as a byte array to
+allow passwords in other encodings than UTF-8 to be used. If both the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property and the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a>
+property are specified, <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> is preferred.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--password-raw-flags"></a><h3>The <code class="literal">“password-raw-flags”</code> property</h3>
<pre class="programlisting"> “password-raw-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -3787,7 +3692,12 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase1-fast-provisioning"></a><h3>The <code class="literal">“phase1-fast-provisioning”</code> property</h3>
<pre class="programlisting"> “phase1-fast-provisioning” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Enables or disables in-line provisioning of EAP-FAST credentials when
+FAST is specified as the EAP method in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property.
+Recognized values are "0" (disabled), "1" (allow unauthenticated
+provisioning), "2" (allow authenticated provisioning), and "3" (allow
+both authenticated and unauthenticated provisioning). See the
+wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3795,7 +3705,10 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase1-peaplabel"></a><h3>The <code class="literal">“phase1-peaplabel”</code> property</h3>
<pre class="programlisting"> “phase1-peaplabel” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Forces use of the new PEAP label during key derivation. Some RADIUS
+servers may require forcing the new PEAP label to interoperate with
+PEAPv1. Set to "1" to force use of the new PEAP label. See the
+wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3803,7 +3716,12 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase1-peapver"></a><h3>The <code class="literal">“phase1-peapver”</code> property</h3>
<pre class="programlisting"> “phase1-peapver” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Forces which PEAP version is used when PEAP is set as the EAP method in
+the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property. When unset, the version reported by
+the server will be used. Sometimes when using older RADIUS servers, it
+is necessary to force the client to use a particular PEAP version. To do
+so, this property may be set to "0" or "1" to force that specific PEAP
+version.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3811,14 +3729,22 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-altsubject-matches"></a><h3>The <code class="literal">“phase2-altsubject-matches”</code> property</h3>
<pre class="programlisting"> “phase2-altsubject-matches” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>List of strings to be matched against the altSubjectName of the
+certificate presented by the authentication server during the inner
+"phase 2" authentication. If the list is empty, no verification of the
+server certificate's altSubjectName is performed.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-auth"></a><h3>The <code class="literal">“phase2-auth”</code> property</h3>
<pre class="programlisting"> “phase2-auth” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Specifies the allowed "phase 2" inner non-EAP authentication methods when
+an EAP method that uses an inner TLS tunnel is specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property. Recognized non-EAP "phase 2" methods are
+"pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5", and "tls".
+Each "phase 2" inner method requires specific parameters for successful
+authentication; see the wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3826,7 +3752,12 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-autheap"></a><h3>The <code class="literal">“phase2-autheap”</code> property</h3>
<pre class="programlisting"> “phase2-autheap” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Specifies the allowed "phase 2" inner EAP-based authentication methods
+when an EAP method that uses an inner TLS tunnel is specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property. Recognized EAP-based "phase 2" methods are
+"md5", "mschapv2", "otp", "gtc", and "tls". Each "phase 2" inner method
+requires specific parameters for successful authentication; see the
+wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3834,14 +3765,28 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-ca-cert"></a><h3>The <code class="literal">“phase2-ca-cert”</code> property</h3>
<pre class="programlisting"> “phase2-ca-cert” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Contains the "phase 2" CA certificate if used by the EAP method specified
+in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> or <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a>
+properties.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte. This
+property can be unset even if the EAP method supports CA certificates,
+but this allows man-in-the-middle attacks and is NOT recommended.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-ca-cert" title="nm_setting_802_1x_set_phase2_ca_cert ()"><code class="function">nm_setting_802_1x_set_phase2_ca_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-ca-path"></a><h3>The <code class="literal">“phase2-ca-path”</code> property</h3>
<pre class="programlisting"> “phase2-ca-path” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded path to a directory containing PEM or DER formatted
+certificates to be added to the verification chain in addition to the
+certificate specified in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-cert" title="The “phase2-ca-cert” property"><span class="type">“phase2-ca-cert”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3849,21 +3794,56 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-client-cert"></a><h3>The <code class="literal">“phase2-client-cert”</code> property</h3>
<pre class="programlisting"> “phase2-client-cert” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Contains the "phase 2" client certificate if used by the EAP method
+specified in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> or
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a> properties.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte. This
+property can be unset even if the EAP method supports CA certificates,
+but this allows man-in-the-middle attacks and is NOT recommended.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-client-cert" title="nm_setting_802_1x_set_phase2_client_cert ()"><code class="function">nm_setting_802_1x_set_phase2_client_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-private-key"></a><h3>The <code class="literal">“phase2-private-key”</code> property</h3>
<pre class="programlisting"> “phase2-private-key” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Contains the "phase 2" inner private key when the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> or <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a> property is
+set to "tls".</p>
+<p>Key data is specified using a "scheme"; two are currently supported: blob
+and path. When using the blob scheme and private keys, this property
+should be set to the key's encrypted PEM encoded data. When using private
+keys with the path scheme, this property should be set to the full UTF-8
+encoded path of the key, prefixed with the string "file://" and ending
+with a terminating NUL byte. When using PKCS#12 format private keys and
+the blob scheme, this property should be set to the PKCS#12 data and the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property must be set to
+password used to decrypt the PKCS#12 certificate and key. When using
+PKCS#12 files and the path scheme, this property should be set to the
+full UTF-8 encoded path of the key, prefixed with the string "file://"
+and and ending with a terminating NUL byte, and as with the blob scheme
+the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property must be set to
+the password used to decode the PKCS#12 private key and certificate.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-private-key" title="nm_setting_802_1x_set_phase2_private_key ()"><code class="function">nm_setting_802_1x_set_phase2_private_key()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-private-key-password"></a><h3>The <code class="literal">“phase2-private-key-password”</code> property</h3>
<pre class="programlisting"> “phase2-private-key-password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to decrypt the "phase 2" private key specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key" title="The “phase2-private-key” property"><span class="type">“phase2-private-key”</span></a> property when the private key either
+uses the path scheme, or is a PKCS#12 format key. Setting this property
+directly is not generally necessary except when returning secrets to
+NetworkManager; it is generally set automatically when setting the
+private key by the <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-private-key" title="nm_setting_802_1x_set_phase2_private_key ()"><code class="function">nm_setting_802_1x_set_phase2_private_key()</code></a> function.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3871,7 +3851,8 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-private-key-password-flags"></a><h3>The <code class="literal">“phase2-private-key-password-flags”</code> property</h3>
<pre class="programlisting"> “phase2-private-key-password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -3880,7 +3861,10 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-subject-match"></a><h3>The <code class="literal">“phase2-subject-match”</code> property</h3>
<pre class="programlisting"> “phase2-subject-match” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Substring to be matched against the subject of the certificate presented
+by the authentication server during the inner "phase 2"
+authentication. When unset, no verification of the authentication server
+certificate's subject is performed.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3888,7 +3872,7 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--pin"></a><h3>The <code class="literal">“pin”</code> property</h3>
<pre class="programlisting"> “pin” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>PIN used for EAP authentication methods.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3896,7 +3880,7 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--pin-flags"></a><h3>The <code class="literal">“pin-flags”</code> property</h3>
<pre class="programlisting"> “pin-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--pin" title="The “pin” property"><span class="type">“pin”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -3905,14 +3889,41 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--private-key"></a><h3>The <code class="literal">“private-key”</code> property</h3>
<pre class="programlisting"> “private-key” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Contains the private key when the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property is set to
+"tls".</p>
+<p>Key data is specified using a "scheme"; two are currently supported: blob
+and path. When using the blob scheme and private keys, this property
+should be set to the key's encrypted PEM encoded data. When using private
+keys with the path scheme, this property should be set to the full UTF-8
+encoded path of the key, prefixed with the string "file://" and ending
+with a terminating NUL byte. When using PKCS#12 format private keys and
+the blob scheme, this property should be set to the PKCS#12 data and the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a> property must be set to password
+used to decrypt the PKCS#12 certificate and key. When using PKCS#12 files
+and the path scheme, this property should be set to the full UTF-8
+encoded path of the key, prefixed with the string "file://" and and
+ending with a terminating NUL byte, and as with the blob scheme the
+"private-key-password" property must be set to the password used to
+decode the PKCS#12 private key and certificate.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-private-key" title="nm_setting_802_1x_set_private_key ()"><code class="function">nm_setting_802_1x_set_private_key()</code></a> function instead.</p>
+<p>WARNING: <a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key" title="The “private-key” property"><span class="type">“private-key”</span></a> is not a "secret" property, and thus
+unencrypted private key data using the BLOB scheme may be readable by
+unprivileged users. Private keys should always be encrypted with a
+private key password to prevent unauthorized access to unencrypted
+private key data.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--private-key-password"></a><h3>The <code class="literal">“private-key-password”</code> property</h3>
<pre class="programlisting"> “private-key-password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to decrypt the private key specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key" title="The “private-key” property"><span class="type">“private-key”</span></a> property when the private key either uses the
+path scheme, or if the private key is a PKCS#12 format key. Setting this
+property directly is not generally necessary except when returning
+secrets to NetworkManager; it is generally set automatically when setting
+the private key by the <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-private-key" title="nm_setting_802_1x_set_private_key ()"><code class="function">nm_setting_802_1x_set_private_key()</code></a> function.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3920,7 +3931,8 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--private-key-password-flags"></a><h3>The <code class="literal">“private-key-password-flags”</code> property</h3>
<pre class="programlisting"> “private-key-password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a>
+property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -3929,7 +3941,9 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--subject-match"></a><h3>The <code class="literal">“subject-match”</code> property</h3>
<pre class="programlisting"> “subject-match” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Substring to be matched against the subject of the certificate presented
+by the authentication server. When unset, no verification of the
+authentication server certificate's subject is performed.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3937,14 +3951,18 @@ required</p>
<div class="refsect2">
<a name="NMSetting8021x--system-ca-certs"></a><h3>The <code class="literal">“system-ca-certs”</code> property</h3>
<pre class="programlisting"> “system-ca-certs” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <code class="literal">TRUE</code>, overrides the <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-path" title="The “ca-path” property"><span class="type">“ca-path”</span></a> and
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-path" title="The “phase2-ca-path” property"><span class="type">“phase2-ca-path”</span></a> properties using the system CA directory
+specified at configure time with the --system-ca-path switch. The
+certificates in this directory are added to the verification chain in
+addition to any certificates specified by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-cert" title="The “ca-cert” property"><span class="type">“ca-cert”</span></a> and
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-cert" title="The “phase2-ca-cert” property"><span class="type">“phase2-ca-cert”</span></a> properties.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingAdsl.html b/docs/libnm-util/html/NMSettingAdsl.html
index 3b2aef235..165177b5c 100644
--- a/docs/libnm-util/html/NMSettingAdsl.html
+++ b/docs/libnm-util/html/NMSettingAdsl.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingAdsl</title>
+<title>NMSettingAdsl: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh">
<link rel="next" href="NMSettingDcb.html" title="NMSettingDcb">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -263,7 +263,6 @@ nm_setting_adsl_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.2.22.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingAdsl.html" title="NMSettingAdsl"><span class="type">NMSettingAdsl</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -275,7 +274,6 @@ nm_setting_adsl_new (<em class="parameter"><code><span class="type">void</span><
<div class="refsect3">
<a name="id-1.2.22.9.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingAdsl.html" title="NMSettingAdsl"><span class="type">NMSettingAdsl</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -301,7 +299,6 @@ nm_setting_adsl_get_username (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.22.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -327,7 +324,6 @@ nm_setting_adsl_get_password (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.22.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -353,7 +349,6 @@ nm_setting_adsl_get_protocol (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.22.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--protocol" title="The “protocol” property"><span class="type">“protocol”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -379,7 +374,6 @@ nm_setting_adsl_get_encapsulation (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.22.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--encapsulation" title="The “encapsulation” property"><span class="type">“encapsulation”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -405,7 +399,6 @@ nm_setting_adsl_get_vpi (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.22.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--vpi" title="The “vpi” property"><span class="type">“vpi”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -431,7 +424,6 @@ nm_setting_adsl_get_vci (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.22.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--vci" title="The “vci” property"><span class="type">“vci”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -457,7 +449,6 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.22.9.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -467,8 +458,6 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<a name="NM-SETTING-ADSL-SETTING-NAME:CAPS"></a><h3>NM_SETTING_ADSL_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_SETTING_NAME "adsl"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -513,104 +502,78 @@ required</p>
<a name="NM-SETTING-ADSL-ERROR:CAPS"></a><h3>NM_SETTING_ADSL_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ERROR nm_setting_adsl_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-USERNAME:CAPS"></a><h3>NM_SETTING_ADSL_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PASSWORD:CAPS"></a><h3>NM_SETTING_ADSL_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_ADSL_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL "protocol"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-ENCAPSULATION:CAPS"></a><h3>NM_SETTING_ADSL_ENCAPSULATION</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ENCAPSULATION "encapsulation"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-VPI:CAPS"></a><h3>NM_SETTING_ADSL_VPI</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_VPI "vpi"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-VCI:CAPS"></a><h3>NM_SETTING_ADSL_VCI</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_VCI "vci"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL-PPPOA:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL_PPPOA</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL_PPPOA "pppoa"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL-PPPOE:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL_PPPOE</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL_PPPOE "pppoe"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL-IPOATM:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL_IPOATM</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL_IPOATM "ipoatm"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-ENCAPSULATION-VCMUX:CAPS"></a><h3>NM_SETTING_ADSL_ENCAPSULATION_VCMUX</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ENCAPSULATION_VCMUX "vcmux"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-ENCAPSULATION-LLC:CAPS"></a><h3>NM_SETTING_ADSL_ENCAPSULATION_LLC</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ENCAPSULATION_LLC "llc"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -618,7 +581,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--encapsulation"></a><h3>The <code class="literal">“encapsulation”</code> property</h3>
<pre class="programlisting"> “encapsulation” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Encapsulation of ADSL connection. Can be "vcmux" or "llc".</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -626,7 +589,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Password used to authenticate with the ADSL service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -634,7 +597,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -643,7 +606,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--protocol"></a><h3>The <code class="literal">“protocol”</code> property</h3>
<pre class="programlisting"> “protocol” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>ADSL connection protocol. Can be "pppoa", "pppoe" or "ipoatm".</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -651,7 +614,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Username used to authenticate with the ADSL service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -659,7 +622,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--vci"></a><h3>The <code class="literal">“vci”</code> property</h3>
<pre class="programlisting"> “vci” <span class="type">guint</span></pre>
-<p></p>
+<p>VCI of ADSL connection</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 65536</p>
<p>Default value: 0</p>
@@ -668,7 +631,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingAdsl--vpi"></a><h3>The <code class="literal">“vpi”</code> property</h3>
<pre class="programlisting"> “vpi” <span class="type">guint</span></pre>
-<p></p>
+<p>VPI of ADSL connection</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 65536</p>
<p>Default value: 0</p>
@@ -676,7 +639,6 @@ required</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingBluetooth.html b/docs/libnm-util/html/NMSettingBluetooth.html
index cf501a32d..b011f98f3 100644
--- a/docs/libnm-util/html/NMSettingBluetooth.html
+++ b/docs/libnm-util/html/NMSettingBluetooth.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingBluetooth</title>
+<title>NMSettingBluetooth: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingWirelessSecurity.html" title="NMSettingWirelessSecurity">
<link rel="next" href="NMSettingSerial.html" title="NMSettingSerial">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -168,7 +168,6 @@ nm_setting_bluetooth_error_quark (<em class="parameter"><code><span class="type"
<div class="refsect3">
<a name="id-1.2.8.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingBluetooth.html" title="NMSettingBluetooth"><span class="type">NMSettingBluetooth</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -208,7 +207,6 @@ describes a connection to.</p>
<div class="refsect3">
<a name="id-1.2.8.9.4.6"></a><h4>Returns</h4>
<p> the Bluetooth address</p>
-<p></p>
</div>
</div>
<hr>
@@ -238,7 +236,6 @@ either DUN to a DUN-capable device or PANU to a NAP-capable device).</p>
<a name="id-1.2.8.9.5.6"></a><h4>Returns</h4>
<p> the type, either <a class="link" href="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-TYPE-PANU:CAPS" title="NM_SETTING_BLUETOOTH_TYPE_PANU"><code class="literal">NM_SETTING_BLUETOOTH_TYPE_PANU</code></a> or
<a class="link" href="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-TYPE-DUN:CAPS" title="NM_SETTING_BLUETOOTH_TYPE_DUN"><code class="literal">NM_SETTING_BLUETOOTH_TYPE_DUN</code></a></p>
-<p></p>
</div>
</div>
</div>
@@ -248,8 +245,6 @@ either DUN to a DUN-capable device or PANU to a NAP-capable device).</p>
<a name="NM-SETTING-BLUETOOTH-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BLUETOOTH_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_SETTING_NAME "bluetooth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -303,24 +298,18 @@ must also contain an <a class="link" href="NMSettingGsm.html" title="NMSettingGs
<a name="NM-SETTING-BLUETOOTH-ERROR:CAPS"></a><h3>NM_SETTING_BLUETOOTH_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_ERROR nm_setting_bluetooth_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BLUETOOTH-BDADDR:CAPS"></a><h3>NM_SETTING_BLUETOOTH_BDADDR</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_BDADDR "bdaddr"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BLUETOOTH-TYPE:CAPS"></a><h3>NM_SETTING_BLUETOOTH_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_TYPE "type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -344,21 +333,21 @@ NAP (Network Access Point) protocol, which accepts connections via PANU.</p>
<div class="refsect2">
<a name="NMSettingBluetooth--bdaddr"></a><h3>The <code class="literal">“bdaddr”</code> property</h3>
<pre class="programlisting"> “bdaddr” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>The Bluetooth address of the device.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBluetooth--type"></a><h3>The <code class="literal">“type”</code> property</h3>
<pre class="programlisting"> “type” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Either "dun" for Dial-Up Networking connections or "panu" for Personal
+Area Networking connections to devices supporting the NAP profile.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingBond.html b/docs/libnm-util/html/NMSettingBond.html
index f0dae1ecb..8d0e4d486 100644
--- a/docs/libnm-util/html/NMSettingBond.html
+++ b/docs/libnm-util/html/NMSettingBond.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingBond</title>
+<title>NMSettingBond: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingWimax.html" title="NMSettingWimax">
<link rel="next" href="NMSettingBridge.html" title="NMSettingBridge">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -271,7 +271,6 @@ nm_setting_bond_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.2.13.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingBond.html" title="NMSettingBond"><span class="type">NMSettingBond</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -309,7 +308,6 @@ nm_setting_bond_get_interface_name (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.13.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBond.html#NMSettingBond--interface-name" title="The “interface-name” property"><span class="type">“interface-name”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -338,7 +336,6 @@ using <a class="link" href="NMSettingBond.html#nm-setting-bond-get-option" title
<div class="refsect3">
<a name="id-1.2.13.9.5.6"></a><h4>Returns</h4>
<p> the number of bonding options</p>
-<p></p>
</div>
</div>
<hr>
@@ -394,7 +391,6 @@ option; this value is owned by the setting and should not be modified. </p></td>
<p> <code class="literal">TRUE</code> on success if the index was valid and an option was found,
<code class="literal">FALSE</code> if the index was invalid (ie, greater than the number of options
currently held by the setting)</p>
-<p></p>
</div>
</div>
<hr>
@@ -432,7 +428,6 @@ nm_setting_bond_get_option_by_name (<em class="parameter"><code><a class="link"
<a name="id-1.2.13.9.7.6"></a><h4>Returns</h4>
<p> the value, or <code class="literal">NULL</code> if the key/value pair was never added to the
setting; the value is owned by the setting and must not be modified</p>
-<p></p>
</div>
</div>
<hr>
@@ -479,7 +474,6 @@ that conflict with each other.</p>
<a name="id-1.2.13.9.8.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was valid and was added to the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -517,7 +511,6 @@ list.</p>
<a name="id-1.2.13.9.9.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was found and removed from the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -560,9 +553,8 @@ the <em class="parameter"><code>name</code></em>
is valid for the given name.
If the <em class="parameter"><code>name</code></em>
is not a valid option, <code class="literal">FALSE</code> will be returned.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -623,7 +615,6 @@ nm_setting_bond_get_option_default (<em class="parameter"><code><a class="link"
<a name="id-1.2.13.9.12.5"></a><h4>Returns</h4>
<p> the value of the bond option if not overridden by an entry in
the <a class="link" href="NMSettingBond.html#NMSettingBond--options" title="The “options” property"><span class="type">“options”</span></a> property.</p>
-<p></p>
</div>
</div>
</div>
@@ -633,8 +624,6 @@ the <a class="link" href="NMSettingBond.html#NMSettingBond--options" title="The
<a name="NM-SETTING-BOND-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BOND_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BOND_SETTING_NAME "bond"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -672,13 +661,13 @@ required</p>
</tr>
<tr>
<td class="enum_member_name"><p><a name="NM-SETTING-BOND-ERROR-INVALID-OPTION:CAPS"></a>NM_SETTING_BOND_ERROR_INVALID_OPTION</p></td>
-<td class="enum_member_description"> </td>
-<td class="enum_member_annotations"> </td>
+<td> </td>
+<td> </td>
</tr>
<tr>
<td class="enum_member_name"><p><a name="NM-SETTING-BOND-ERROR-MISSING-OPTION:CAPS"></a>NM_SETTING_BOND_ERROR_MISSING_OPTION</p></td>
-<td class="enum_member_description"> </td>
-<td class="enum_member_annotations"> </td>
+<td> </td>
+<td> </td>
</tr>
</tbody>
</table></div>
@@ -689,144 +678,108 @@ required</p>
<a name="NM-SETTING-BOND-ERROR:CAPS"></a><h3>NM_SETTING_BOND_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_BOND_ERROR nm_setting_bond_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-INTERFACE-NAME:CAPS"></a><h3>NM_SETTING_BOND_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BOND_INTERFACE_NAME "interface-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTIONS:CAPS"></a><h3>NM_SETTING_BOND_OPTIONS</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTIONS "options"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-MODE:CAPS"></a><h3>NM_SETTING_BOND_OPTION_MODE</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-MIIMON:CAPS"></a><h3>NM_SETTING_BOND_OPTION_MIIMON</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_MIIMON "miimon"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-DOWNDELAY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_DOWNDELAY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_DOWNDELAY "downdelay"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-UPDELAY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_UPDELAY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_UPDELAY "updelay"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-ARP-INTERVAL:CAPS"></a><h3>NM_SETTING_BOND_OPTION_ARP_INTERVAL</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_ARP_INTERVAL "arp_interval"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-ARP-IP-TARGET:CAPS"></a><h3>NM_SETTING_BOND_OPTION_ARP_IP_TARGET</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_ARP_IP_TARGET "arp_ip_target"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-ARP-VALIDATE:CAPS"></a><h3>NM_SETTING_BOND_OPTION_ARP_VALIDATE</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_ARP_VALIDATE "arp_validate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-PRIMARY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_PRIMARY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_PRIMARY "primary"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-PRIMARY-RESELECT:CAPS"></a><h3>NM_SETTING_BOND_OPTION_PRIMARY_RESELECT</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_PRIMARY_RESELECT "primary_reselect"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-FAIL-OVER-MAC:CAPS"></a><h3>NM_SETTING_BOND_OPTION_FAIL_OVER_MAC</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_FAIL_OVER_MAC "fail_over_mac"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-USE-CARRIER:CAPS"></a><h3>NM_SETTING_BOND_OPTION_USE_CARRIER</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_USE_CARRIER "use_carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-AD-SELECT:CAPS"></a><h3>NM_SETTING_BOND_OPTION_AD_SELECT</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_AD_SELECT "ad_select"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-XMIT-HASH-POLICY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-RESEND-IGMP:CAPS"></a><h3>NM_SETTING_BOND_OPTION_RESEND_IGMP</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_RESEND_IGMP "resend_igmp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-LACP-RATE:CAPS"></a><h3>NM_SETTING_BOND_OPTION_LACP_RATE</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -834,7 +787,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingBond--interface-name"></a><h3>The <code class="literal">“interface-name”</code> property</h3>
<pre class="programlisting"> “interface-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the virtual in-kernel bonding network interface</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -842,13 +795,14 @@ required</p>
<div class="refsect2">
<a name="NMSettingBond--options"></a><h3>The <code class="literal">“options”</code> property</h3>
<pre class="programlisting"> “options” <span class="type">GHashTable_gchararray+gchararray_*</span></pre>
-<p></p>
+<p>Dictionary of key/value pairs of bonding options. Both keys and values
+must be strings. Option names must contain only alphanumeric characters
+(ie, [a-zA-Z0-9]).</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingBridge.html b/docs/libnm-util/html/NMSettingBridge.html
index a32924757..71cdd58f2 100644
--- a/docs/libnm-util/html/NMSettingBridge.html
+++ b/docs/libnm-util/html/NMSettingBridge.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingBridge</title>
+<title>NMSettingBridge: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingBond.html" title="NMSettingBond">
<link rel="next" href="NMSettingBridgePort.html" title="NMSettingBridgePort">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -260,9 +260,8 @@ nm_setting_bridge_error_quark (<em class="parameter"><code><span class="type">vo
<div class="refsect3">
<a name="id-1.2.14.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingBridge.html" title="NMSettingBridge"><span class="type">NMSettingBridge</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -275,7 +274,7 @@ nm_setting_bridge_new (<em class="parameter"><code><span class="type">void</span
<p> the new empty <a class="link" href="NMSettingBridge.html" title="NMSettingBridge"><span class="type">NMSettingBridge</span></a> object. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -300,9 +299,8 @@ nm_setting_bridge_get_interface_name (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.14.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--interface-name" title="The “interface-name” property"><span class="type">“interface-name”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -327,9 +325,8 @@ nm_setting_bridge_get_mac_address (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.14.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -354,9 +351,8 @@ nm_setting_bridge_get_stp (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.14.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--stp" title="The “stp” property"><span class="type">“stp”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -381,9 +377,8 @@ nm_setting_bridge_get_priority (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.14.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--priority" title="The “priority” property"><span class="type">“priority”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -408,9 +403,8 @@ nm_setting_bridge_get_forward_delay (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.14.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--forward-delay" title="The “forward-delay” property"><span class="type">“forward-delay”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -435,9 +429,8 @@ nm_setting_bridge_get_hello_time (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.14.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--hello-time" title="The “hello-time” property"><span class="type">“hello-time”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -462,9 +455,8 @@ nm_setting_bridge_get_max_age (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.14.9.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--max-age" title="The “max-age” property"><span class="type">“max-age”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -489,9 +481,8 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.14.9.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--ageing-time" title="The “ageing-time” property"><span class="type">“ageing-time”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
<div class="refsect1">
@@ -500,8 +491,6 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<a name="NM-SETTING-BRIDGE-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BRIDGE_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_SETTING_NAME "bridge"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -540,79 +529,61 @@ required</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-ERROR:CAPS"></a><h3>NM_SETTING_BRIDGE_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_ERROR nm_setting_bridge_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-INTERFACE-NAME:CAPS"></a><h3>NM_SETTING_BRIDGE_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_INTERFACE_NAME "interface-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_BRIDGE_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-STP:CAPS"></a><h3>NM_SETTING_BRIDGE_STP</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_STP "stp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PRIORITY:CAPS"></a><h3>NM_SETTING_BRIDGE_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PRIORITY "priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-FORWARD-DELAY:CAPS"></a><h3>NM_SETTING_BRIDGE_FORWARD_DELAY</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_FORWARD_DELAY "forward-delay"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-HELLO-TIME:CAPS"></a><h3>NM_SETTING_BRIDGE_HELLO_TIME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_HELLO_TIME "hello-time"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-MAX-AGE:CAPS"></a><h3>NM_SETTING_BRIDGE_MAX_AGE</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_MAX_AGE "max-age"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-AGEING-TIME:CAPS"></a><h3>NM_SETTING_BRIDGE_AGEING_TIME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_AGEING_TIME "ageing-time"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -620,82 +591,85 @@ required</p>
<div class="refsect2">
<a name="NMSettingBridge--ageing-time"></a><h3>The <code class="literal">“ageing-time”</code> property</h3>
<pre class="programlisting"> “ageing-time” <span class="type">guint</span></pre>
-<p></p>
+<p>The Ethernet MAC address aging time, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 1000000</p>
<p>Default value: 300</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--forward-delay"></a><h3>The <code class="literal">“forward-delay”</code> property</h3>
<pre class="programlisting"> “forward-delay” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) forwarding delay, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 30</p>
<p>Default value: 15</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--hello-time"></a><h3>The <code class="literal">“hello-time”</code> property</h3>
<pre class="programlisting"> “hello-time” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) hello time, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 10</p>
<p>Default value: 2</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--interface-name"></a><h3>The <code class="literal">“interface-name”</code> property</h3>
<pre class="programlisting"> “interface-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the virtual in-kernel bridging network interface</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, the MAC address of bridge. When creating a new bridge, this
+MAC address will be set. When matching an existing (outside
+NetworkManager created) bridge, this MAC address must match.</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--max-age"></a><h3>The <code class="literal">“max-age”</code> property</h3>
<pre class="programlisting"> “max-age” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) maximum message age, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 40</p>
<p>Default value: 20</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--priority"></a><h3>The <code class="literal">“priority”</code> property</h3>
<pre class="programlisting"> “priority” <span class="type">guint</span></pre>
-<p></p>
+<p>Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower
+values are "better"; the lowest priority bridge will be elected the root
+bridge.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 65535</p>
<p>Default value: 32768</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridge--stp"></a><h3>The <code class="literal">“stp”</code> property</h3>
<pre class="programlisting"> “stp” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Controls whether Spanning Tree Protocol (STP) is enabled for this bridge.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingBridgePort.html b/docs/libnm-util/html/NMSettingBridgePort.html
index 00f8ce21a..bc2041816 100644
--- a/docs/libnm-util/html/NMSettingBridgePort.html
+++ b/docs/libnm-util/html/NMSettingBridgePort.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingBridgePort</title>
+<title>NMSettingBridgePort: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingBridge.html" title="NMSettingBridge">
<link rel="next" href="NMSettingTeam.html" title="NMSettingTeam">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -175,9 +175,8 @@ nm_setting_bridge_port_error_quark (<em class="parameter"><code><span class="typ
<div class="refsect3">
<a name="id-1.2.15.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingBridgePort.html" title="NMSettingBridgePort"><span class="type">NMSettingBridgePort</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -190,7 +189,7 @@ nm_setting_bridge_port_new (<em class="parameter"><code><span class="type">void<
<p> the new empty <a class="link" href="NMSettingBridgePort.html" title="NMSettingBridgePort"><span class="type">NMSettingBridgePort</span></a> object. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -215,9 +214,8 @@ nm_setting_bridge_port_get_priority (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.15.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridgePort.html#NMSettingBridgePort--priority" title="The “priority” property"><span class="type">“priority”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -242,9 +240,8 @@ nm_setting_bridge_port_get_path_cost (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.15.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridgePort.html#NMSettingBridgePort--path-cost" title="The “path-cost” property"><span class="type">“path-cost”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -270,9 +267,8 @@ nm_setting_bridge_port_get_hairpin_mode
<div class="refsect3">
<a name="id-1.2.15.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridgePort.html#NMSettingBridgePort--hairpin-mode" title="The “hairpin-mode” property"><span class="type">“hairpin-mode”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
<div class="refsect1">
@@ -281,8 +277,6 @@ nm_setting_bridge_port_get_hairpin_mode
<a name="NM-SETTING-BRIDGE-PORT-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_SETTING_NAME "bridge-port"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -321,39 +315,31 @@ is required</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-ERROR:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_ERROR nm_setting_bridge_port_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-PRIORITY:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_PRIORITY "priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-PATH-COST:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_PATH_COST</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_PATH_COST "path-cost"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-HAIRPIN-MODE:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE "hairpin-mode"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -361,35 +347,36 @@ is required</p>
<div class="refsect2">
<a name="NMSettingBridgePort--hairpin-mode"></a><h3>The <code class="literal">“hairpin-mode”</code> property</h3>
<pre class="programlisting"> “hairpin-mode” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Enables or disabled "hairpin mode" for the port, which allows frames to
+be sent back out through the port the frame was received on.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridgePort--path-cost"></a><h3>The <code class="literal">“path-cost”</code> property</h3>
<pre class="programlisting"> “path-cost” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) port cost for destinations via this
+port.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 65535</p>
<p>Default value: 100</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingBridgePort--priority"></a><h3>The <code class="literal">“priority”</code> property</h3>
<pre class="programlisting"> “priority” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) priority of this bridge port.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 63</p>
<p>Default value: 32</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingCdma.html b/docs/libnm-util/html/NMSettingCdma.html
index e0d32198b..43980d9d0 100644
--- a/docs/libnm-util/html/NMSettingCdma.html
+++ b/docs/libnm-util/html/NMSettingCdma.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingCdma</title>
+<title>NMSettingCdma: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingSerial.html" title="NMSettingSerial">
<link rel="next" href="NMSettingGsm.html" title="NMSettingGsm">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -193,7 +193,6 @@ nm_setting_cdma_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.2.10.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingCdma.html" title="NMSettingCdma"><span class="type">NMSettingCdma</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -205,7 +204,6 @@ nm_setting_cdma_new (<em class="parameter"><code><span class="type">void</span><
<div class="refsect3">
<a name="id-1.2.10.9.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingCdma.html" title="NMSettingCdma"><span class="type">NMSettingCdma</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -231,7 +229,6 @@ nm_setting_cdma_get_number (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.10.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingCdma.html#NMSettingCdma--number" title="The “number” property"><span class="type">“number”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -257,7 +254,6 @@ nm_setting_cdma_get_username (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.10.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingCdma.html#NMSettingCdma--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -283,7 +279,6 @@ nm_setting_cdma_get_password (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.10.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingCdma.html#NMSettingCdma--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -309,7 +304,6 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.10.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingCdma.html#NMSettingCdma--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -319,8 +313,6 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<a name="NM-SETTING-CDMA-SETTING-NAME:CAPS"></a><h3>NM_SETTING_CDMA_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_SETTING_NAME "cdma"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -373,40 +365,30 @@ is missing in the connection</p>
<a name="NM-SETTING-CDMA-ERROR:CAPS"></a><h3>NM_SETTING_CDMA_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_ERROR nm_setting_cdma_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-NUMBER:CAPS"></a><h3>NM_SETTING_CDMA_NUMBER</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_NUMBER "number"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-USERNAME:CAPS"></a><h3>NM_SETTING_CDMA_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-PASSWORD:CAPS"></a><h3>NM_SETTING_CDMA_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_CDMA_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -414,7 +396,9 @@ is missing in the connection</p>
<div class="refsect2">
<a name="NMSettingCdma--number"></a><h3>The <code class="literal">“number”</code> property</h3>
<pre class="programlisting"> “number” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The number to dial to establish the connection to the CDMA-based mobile
+broadband network, if any. If not specified, the default number (<span class="type">777</span>)
+is used when required.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -422,7 +406,9 @@ is missing in the connection</p>
<div class="refsect2">
<a name="NMSettingCdma--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to authenticate with the network, if required. Many
+providers do not require a password, or accept any password. But if a
+password is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -430,7 +416,7 @@ is missing in the connection</p>
<div class="refsect2">
<a name="NMSettingCdma--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingCdma.html#NMSettingCdma--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -439,14 +425,15 @@ is missing in the connection</p>
<div class="refsect2">
<a name="NMSettingCdma--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The username used to authenticate with the network, if required. Many
+providers do not require a username, or accept any username. But if a
+username is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingConnection.html b/docs/libnm-util/html/NMSettingConnection.html
index f029e3c06..ba73eb009 100644
--- a/docs/libnm-util/html/NMSettingConnection.html
+++ b/docs/libnm-util/html/NMSettingConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingConnection</title>
+<title>NMSettingConnection: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSetting.html" title="NMSetting">
<link rel="next" href="NMSettingWired.html" title="NMSettingWired">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -432,7 +432,6 @@ nm_setting_connection_error_quark (<em class="parameter"><code><span class="type
<div class="refsect3">
<a name="id-1.2.4.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -444,7 +443,6 @@ nm_setting_connection_new (<em class="parameter"><code><span class="type">void</
<div class="refsect3">
<a name="id-1.2.4.9.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -471,7 +469,6 @@ nm_setting_connection_get_id (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.4.9.4.6"></a><h4>Returns</h4>
<p> the connection ID</p>
-<p></p>
</div>
</div>
<hr>
@@ -498,7 +495,6 @@ nm_setting_connection_get_uuid (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.4.9.5.6"></a><h4>Returns</h4>
<p> the connection UUID</p>
-<p></p>
</div>
</div>
<hr>
@@ -526,9 +522,8 @@ nm_setting_connection_get_interface_name
<div class="refsect3">
<a name="id-1.2.4.9.6.6"></a><h4>Returns</h4>
<p> the connection's interface name</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -555,7 +550,6 @@ nm_setting_connection_get_connection_type
<div class="refsect3">
<a name="id-1.2.4.9.7.6"></a><h4>Returns</h4>
<p> the connection type</p>
-<p></p>
</div>
</div>
<hr>
@@ -582,7 +576,6 @@ nm_setting_connection_get_autoconnect (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.2.4.9.8.6"></a><h4>Returns</h4>
<p> the connection's autoconnect behavior</p>
-<p></p>
</div>
</div>
<hr>
@@ -609,7 +602,6 @@ nm_setting_connection_get_timestamp (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.4.9.9.6"></a><h4>Returns</h4>
<p> the connection's timestamp</p>
-<p></p>
</div>
</div>
<hr>
@@ -636,7 +628,6 @@ nm_setting_connection_get_read_only (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.4.9.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is read-only, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -665,7 +656,6 @@ property of this setting.</p>
<div class="refsect3">
<a name="id-1.2.4.9.11.6"></a><h4>Returns</h4>
<p> the number of permissions entires</p>
-<p></p>
</div>
</div>
<hr>
@@ -722,7 +712,6 @@ of this setting.</p>
<a name="id-1.2.4.9.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if a permission was returned, <code class="literal">FALSE</code> if <em class="parameter"><code>idx</code></em>
was invalid</p>
-<p></p>
</div>
</div>
<hr>
@@ -749,7 +738,6 @@ nm_setting_connection_get_zone (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.4.9.13.6"></a><h4>Returns</h4>
<p> the trust level of a connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -786,7 +774,6 @@ nm_setting_connection_permissions_user_allowed
<a name="id-1.2.4.9.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the requested user is allowed to view this connection,
<code class="literal">FALSE</code> if the given user is not allowed to view this connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -841,7 +828,6 @@ list, <code class="literal">FALSE</code> if <em class="parameter"><code>ptype</c
or <em class="parameter"><code>pitem</code></em>
was invalid or it the permission was already
present in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -925,9 +911,8 @@ be a username. See <a class="link" href="NMSettingConnection.html#NMSettingConne
<div class="refsect3">
<a name="id-1.2.4.9.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the permission was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -954,7 +939,6 @@ nm_setting_connection_get_master (<em class="parameter"><code><a class="link" hr
<a name="id-1.2.4.9.18.6"></a><h4>Returns</h4>
<p> interface name of the master device or UUID of the master
connection.</p>
-<p></p>
</div>
</div>
<hr>
@@ -991,7 +975,6 @@ against <em class="parameter"><code>setting</code></em>
<a name="id-1.2.4.9.19.5"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if connection is of the given slave <em class="parameter"><code>type</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1018,7 +1001,6 @@ nm_setting_connection_get_slave_type (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.4.9.20.6"></a><h4>Returns</h4>
<p> the type of slave this connection is, if any</p>
-<p></p>
</div>
</div>
<hr>
@@ -1045,9 +1027,8 @@ nm_setting_connection_get_num_secondaries
<div class="refsect3">
<a name="id-1.2.4.9.21.5"></a><h4>Returns</h4>
<p> the number of configured secondary connection UUIDs</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1081,9 +1062,8 @@ nm_setting_connection_get_secondary (<em class="parameter"><code><a class="link"
<a name="id-1.2.4.9.22.5"></a><h4>Returns</h4>
<p> the secondary connection UUID at index <em class="parameter"><code>idx</code></em>
</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1118,9 +1098,8 @@ nm_setting_connection_add_secondary (<em class="parameter"><code><a class="link"
<a name="id-1.2.4.9.23.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secondary connection UUID was added; <code class="literal">FALSE</code> if the UUID
was already present</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1153,7 +1132,7 @@ nm_setting_connection_remove_secondary
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1189,9 +1168,8 @@ nm_setting_connection_remove_secondary_by_value
<div class="refsect3">
<a name="id-1.2.4.9.25.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secondary connection UUID was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1218,9 +1196,8 @@ nm_setting_connection_get_gateway_ping_timeout
<a name="id-1.2.4.9.26.5"></a><h4>Returns</h4>
<p> the value contained in the <a class="link" href="NMSettingConnection.html#NMSettingConnection--gateway-ping-timeout" title="The “gateway-ping-timeout” property"><span class="type">“gateway-ping-timeout”</span></a>
property.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -1229,8 +1206,6 @@ property.</p>
<a name="NM-SETTING-CONNECTION-SETTING-NAME:CAPS"></a><h3>NM_SETTING_CONNECTION_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_SETTING_NAME "connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1295,112 +1270,84 @@ property.</p>
<a name="NM-SETTING-CONNECTION-ERROR:CAPS"></a><h3>NM_SETTING_CONNECTION_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_ERROR nm_setting_connection_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-ID:CAPS"></a><h3>NM_SETTING_CONNECTION_ID</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_ID "id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-UUID:CAPS"></a><h3>NM_SETTING_CONNECTION_UUID</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_UUID "uuid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-INTERFACE-NAME:CAPS"></a><h3>NM_SETTING_CONNECTION_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_INTERFACE_NAME "interface-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-TYPE:CAPS"></a><h3>NM_SETTING_CONNECTION_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_TYPE "type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-AUTOCONNECT:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT "autoconnect"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-TIMESTAMP:CAPS"></a><h3>NM_SETTING_CONNECTION_TIMESTAMP</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_TIMESTAMP "timestamp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-READ-ONLY:CAPS"></a><h3>NM_SETTING_CONNECTION_READ_ONLY</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_READ_ONLY "read-only"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-PERMISSIONS:CAPS"></a><h3>NM_SETTING_CONNECTION_PERMISSIONS</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_PERMISSIONS "permissions"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-ZONE:CAPS"></a><h3>NM_SETTING_CONNECTION_ZONE</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_ZONE "zone"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-MASTER:CAPS"></a><h3>NM_SETTING_CONNECTION_MASTER</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_MASTER "master"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-SLAVE-TYPE:CAPS"></a><h3>NM_SETTING_CONNECTION_SLAVE_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_SLAVE_TYPE "slave-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-SECONDARIES:CAPS"></a><h3>NM_SETTING_CONNECTION_SECONDARIES</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_SECONDARIES "secondaries"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS"></a><h3>NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT "gateway-ping-timeout"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1431,7 +1378,7 @@ timeout is reached, or an IP gateway replies to a ping.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 30</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1457,7 +1404,7 @@ can be used with, and if interface names change or are reordered the
connection may be applied to the wrong interface.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1501,7 +1448,7 @@ connection is read-only and cannot be modified.</p>
connection itself is activated. Currently only VPN connections are
supported.</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1570,7 +1517,6 @@ firewall.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingDcb.html b/docs/libnm-util/html/NMSettingDcb.html
index 8f2d90eae..5cd1cd536 100644
--- a/docs/libnm-util/html/NMSettingDcb.html
+++ b/docs/libnm-util/html/NMSettingDcb.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingDcb</title>
+<title>NMSettingDcb: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingAdsl.html" title="NMSettingAdsl">
<link rel="next" href="NMSetting8021x.html" title="NMSetting8021x">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -449,9 +449,8 @@ nm_setting_dcb_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.2.23.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingDcb.html" title="NMSettingDcb"><span class="type">NMSettingDcb</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -464,7 +463,7 @@ nm_setting_dcb_new (<em class="parameter"><code><span class="type">void</span></
<p> the new empty <a class="link" href="NMSettingDcb.html" title="NMSettingDcb"><span class="type">NMSettingDcb</span></a> object. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -489,9 +488,8 @@ nm_setting_dcb_get_app_fcoe_flags (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.23.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-flags" title="The “app-fcoe-flags” property"><span class="type">“app-fcoe-flags”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -516,9 +514,8 @@ nm_setting_dcb_get_app_fcoe_priority (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.23.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-priority" title="The “app-fcoe-priority” property"><span class="type">“app-fcoe-priority”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -543,9 +540,8 @@ nm_setting_dcb_get_app_fcoe_mode (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.23.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-mode" title="The “app-fcoe-mode” property"><span class="type">“app-fcoe-mode”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -570,9 +566,8 @@ nm_setting_dcb_get_app_iscsi_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.23.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-iscsi-flags" title="The “app-iscsi-flags” property"><span class="type">“app-iscsi-flags”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -597,9 +592,8 @@ nm_setting_dcb_get_app_iscsi_priority (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.2.23.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-iscsi-priority" title="The “app-iscsi-priority” property"><span class="type">“app-iscsi-priority”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -624,9 +618,8 @@ nm_setting_dcb_get_app_fip_flags (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.23.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fip-flags" title="The “app-fip-flags” property"><span class="type">“app-fip-flags”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -651,9 +644,8 @@ nm_setting_dcb_get_app_fip_priority (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.23.9.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fip-priority" title="The “app-fip-priority” property"><span class="type">“app-fip-priority”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -679,9 +671,8 @@ nm_setting_dcb_get_priority_flow_control_flags
<div class="refsect3">
<a name="id-1.2.23.9.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-flow-control-flags" title="The “priority-flow-control-flags” property"><span class="type">“priority-flow-control-flags”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -717,9 +708,8 @@ nm_setting_dcb_get_priority_flow_control
<p> <code class="literal">TRUE</code> if flow control is enabled for the given <em class="parameter"><code>user_priority</code></em>
,
<code class="literal">FALSE</code> if not enabled</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -758,7 +748,7 @@ the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><co
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -784,9 +774,8 @@ nm_setting_dcb_get_priority_group_flags
<div class="refsect3">
<a name="id-1.2.23.9.14.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -822,9 +811,8 @@ nm_setting_dcb_get_priority_group_id (<em class="parameter"><code><a class="link
is assigned to. These values are
only valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -864,7 +852,7 @@ unrestricted group.</p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -901,9 +889,8 @@ nm_setting_dcb_get_priority_group_bandwidth
. These values are
only valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -943,7 +930,7 @@ to</p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -979,9 +966,8 @@ nm_setting_dcb_get_priority_bandwidth (<em class="parameter"><code><a class="lin
in its priority group.
These values are only valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1021,7 +1007,7 @@ allowed to use within its priority group</p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1058,9 +1044,8 @@ nm_setting_dcb_get_priority_strict_bandwidth
may use all of the bandwidth allocated to its
assigned group, or <code class="literal">FALSE</code> if not. These values are only valid when
<a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1101,7 +1086,7 @@ its priority group, or <code class="literal">FALSE</code> if not</p></td>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1138,9 +1123,8 @@ nm_setting_dcb_get_priority_traffic_class
. These values are only
valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1150,8 +1134,6 @@ nm_setting_dcb_set_priority_traffic_class
(<em class="parameter"><code><a class="link" href="NMSettingDcb.html" title="NMSettingDcb"><span class="type">NMSettingDcb</span></a> *setting</code></em>,
<em class="parameter"><code><span class="type">guint</span> user_priority</code></em>,
<em class="parameter"><code><span class="type">guint</span> traffic_class</code></em>);</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1160,8 +1142,6 @@ nm_setting_dcb_set_priority_traffic_class
<a name="NM-SETTING-DCB-SETTING-NAME:CAPS"></a><h3>NM_SETTING_DCB_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_DCB_SETTING_NAME "dcb"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1206,8 +1186,6 @@ required</p>
<a name="NM-SETTING-DCB-ERROR:CAPS"></a><h3>NM_SETTING_DCB_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_DCB_ERROR nm_setting_dcb_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1254,7 +1232,7 @@ peer configuration advertisements</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1262,7 +1240,7 @@ peer configuration advertisements</p>
<pre class="programlisting">#define NM_SETTING_DCB_FCOE_MODE_FABRIC "fabric"
</pre>
<p>Indicates that the FCoE controller should use "fabric" mode (default)</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1270,127 +1248,97 @@ peer configuration advertisements</p>
<pre class="programlisting">#define NM_SETTING_DCB_FCOE_MODE_VN2VN "vn2vn"
</pre>
<p>Indicates that the FCoE controller should use "VN2VN" mode.</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FCOE-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_APP_FCOE_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FCOE_FLAGS "app-fcoe-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FCOE-PRIORITY:CAPS"></a><h3>NM_SETTING_DCB_APP_FCOE_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FCOE_PRIORITY "app-fcoe-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FCOE-MODE:CAPS"></a><h3>NM_SETTING_DCB_APP_FCOE_MODE</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FCOE_MODE "app-fcoe-mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-ISCSI-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_APP_ISCSI_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_ISCSI_FLAGS "app-iscsi-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-ISCSI-PRIORITY:CAPS"></a><h3>NM_SETTING_DCB_APP_ISCSI_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_ISCSI_PRIORITY "app-iscsi-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FIP-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_APP_FIP_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FIP_FLAGS "app-fip-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FIP-PRIORITY:CAPS"></a><h3>NM_SETTING_DCB_APP_FIP_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FIP_PRIORITY "app-fip-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-FLOW-CONTROL-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS "priority-flow-control-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-FLOW-CONTROL:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_FLOW_CONTROL</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_FLOW_CONTROL "priority-flow-control"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-GROUP-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_GROUP_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_GROUP_FLAGS "priority-group-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-GROUP-ID:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_GROUP_ID</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_GROUP_ID "priority-group-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-GROUP-BANDWIDTH:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH "priority-group-bandwidth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-BANDWIDTH:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_BANDWIDTH</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_BANDWIDTH "priority-bandwidth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-STRICT-BANDWIDTH:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH "priority-strict-bandwidth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-TRAFFIC-CLASS:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS "priority-traffic-class"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1398,143 +1346,177 @@ peer configuration advertisements</p>
<div class="refsect2">
<a name="NMSettingDcb--app-fcoe-flags"></a><h3>The <code class="literal">“app-fcoe-flags”</code> property</h3>
<pre class="programlisting"> “app-fcoe-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for the DCB FCoE application. Flags may
+be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-fcoe-mode"></a><h3>The <code class="literal">“app-fcoe-mode”</code> property</h3>
<pre class="programlisting"> “app-fcoe-mode” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The FCoE controller mode; either <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-FABRIC:CAPS" title="NM_SETTING_DCB_FCOE_MODE_FABRIC"><code class="literal">NM_SETTING_DCB_FCOE_MODE_FABRIC</code></a>
+(default) or <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-VN2VN:CAPS" title="NM_SETTING_DCB_FCOE_MODE_VN2VN"><code class="literal">NM_SETTING_DCB_FCOE_MODE_VN2VN</code></a>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: "fabric"</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-fcoe-priority"></a><h3>The <code class="literal">“app-fcoe-priority”</code> property</h3>
<pre class="programlisting"> “app-fcoe-priority” <span class="type">gint</span></pre>
-<p></p>
+<p>The highest User Priority (0 - 7) which FCoE frames should use, or -1 for
+default priority. Only used when the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-flags" title="The “app-fcoe-flags” property"><span class="type">“app-fcoe-flags”</span></a>
+property includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,7]</p>
<p>Default value: -1</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-fip-flags"></a><h3>The <code class="literal">“app-fip-flags”</code> property</h3>
<pre class="programlisting"> “app-fip-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for the DCB FIP application. Flags may
+be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-fip-priority"></a><h3>The <code class="literal">“app-fip-priority”</code> property</h3>
<pre class="programlisting"> “app-fip-priority” <span class="type">gint</span></pre>
-<p></p>
+<p>The highest User Priority (0 - 7) which FIP frames should use, or -1 for
+default priority. Only used when the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fip-flags" title="The “app-fip-flags” property"><span class="type">“app-fip-flags”</span></a>
+property includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,7]</p>
<p>Default value: -1</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-iscsi-flags"></a><h3>The <code class="literal">“app-iscsi-flags”</code> property</h3>
<pre class="programlisting"> “app-iscsi-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for the DCB iSCSI application. Flags
+may be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-iscsi-priority"></a><h3>The <code class="literal">“app-iscsi-priority”</code> property</h3>
<pre class="programlisting"> “app-iscsi-priority” <span class="type">gint</span></pre>
-<p></p>
+<p>The highest User Priority (0 - 7) which iSCSI frames should use, or -1
+for default priority. Only used when the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-iscsi-flags" title="The “app-iscsi-flags” property"><span class="type">“app-iscsi-flags”</span></a>
+property includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,7]</p>
<p>Default value: -1</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-bandwidth"></a><h3>The <code class="literal">“priority-bandwidth”</code> property</h3>
<pre class="programlisting"> “priority-bandwidth” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates the percentage of bandwidth of
+the priority's assigned group that the priority may use. The sum of all
+percentages for priorities which belong to the same group must total 100
+percent.</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-flow-control"></a><h3>The <code class="literal">“priority-flow-control”</code> property</h3>
<pre class="programlisting"> “priority-flow-control” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates whether or not the corresponding
+priority should transmit priority pause. Allowed values are 0 (do not
+transmit pause) and 1 (transmit pause).</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-flow-control-flags"></a><h3>The <code class="literal">“priority-flow-control-flags”</code> property</h3>
<pre class="programlisting"> “priority-flow-control-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for DCB Priority Flow Control (PFC).
+Flags may be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-group-bandwidth"></a><h3>The <code class="literal">“priority-group-bandwidth”</code> property</h3>
<pre class="programlisting"> “priority-group-bandwidth” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the
+Priority Group ID (0 - 7) and the value indicates the percentage of link
+bandwidth allocated to that group. Allowed values are 0 - 100, and the
+sum of all values must total 100 percent.</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-group-flags"></a><h3>The <code class="literal">“priority-group-flags”</code> property</h3>
<pre class="programlisting"> “priority-group-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for DCB Priority Groups. Flags may be
+any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-group-id"></a><h3>The <code class="literal">“priority-group-id”</code> property</h3>
<pre class="programlisting"> “priority-group-id” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates the Priority Group ID. Allowed
+Priority Group ID values are 0 - 7 or 15 for the unrestricted group.</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-strict-bandwidth"></a><h3>The <code class="literal">“priority-strict-bandwidth”</code> property</h3>
<pre class="programlisting"> “priority-strict-bandwidth” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates whether or not the priority may
+use all of the bandwidth allocated to its assigned group. Allowed values
+are 0 (the priority may not utilize all bandwidth) or 1 (the priority may
+utilize all bandwidth).</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-traffic-class"></a><h3>The <code class="literal">“priority-traffic-class”</code> property</h3>
<pre class="programlisting"> “priority-traffic-class” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates the traffic class (0 - 7) to
+which the priority is mapped.</p>
<p>Flags: Read / Write</p>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingGeneric.html b/docs/libnm-util/html/NMSettingGeneric.html
index d7f571b1c..b6cc9066f 100644
--- a/docs/libnm-util/html/NMSettingGeneric.html
+++ b/docs/libnm-util/html/NMSettingGeneric.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingGeneric</title>
+<title>NMSettingGeneric: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingTeamPort.html" title="NMSettingTeamPort">
<link rel="next" href="NMSettingInfiniband.html" title="NMSettingInfiniband">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -114,9 +114,8 @@ nm_setting_generic_error_quark (<em class="parameter"><code><span class="type">v
<div class="refsect3">
<a name="id-1.2.18.8.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingGeneric.html" title="NMSettingGeneric"><span class="type">NMSettingGeneric</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -129,7 +128,7 @@ nm_setting_generic_new (<em class="parameter"><code><span class="type">void</spa
<p> the new empty <a class="link" href="NMSettingGeneric.html" title="NMSettingGeneric"><span class="type">NMSettingGeneric</span></a> object. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -138,8 +137,6 @@ nm_setting_generic_new (<em class="parameter"><code><span class="type">void</spa
<a name="NM-SETTING-GENERIC-SETTING-NAME:CAPS"></a><h3>NM_SETTING_GENERIC_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_GENERIC_SETTING_NAME "generic"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -178,20 +175,17 @@ is required</p>
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GENERIC-ERROR:CAPS"></a><h3>NM_SETTING_GENERIC_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_GENERIC_ERROR nm_setting_generic_error_quark ()
</pre>
-<p>
-</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingGsm.html b/docs/libnm-util/html/NMSettingGsm.html
index 39aa12d1f..1e725b028 100644
--- a/docs/libnm-util/html/NMSettingGsm.html
+++ b/docs/libnm-util/html/NMSettingGsm.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingGsm</title>
+<title>NMSettingGsm: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingCdma.html" title="NMSettingCdma">
<link rel="next" href="NMSettingWimax.html" title="NMSettingWimax">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -326,7 +326,6 @@ nm_setting_gsm_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.2.11.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingGsm.html" title="NMSettingGsm"><span class="type">NMSettingGsm</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -349,7 +348,6 @@ nm_setting_gsm_new (<em class="parameter"><code><span class="type">void</span></
<div class="refsect3">
<a name="id-1.2.11.9.4.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingGsm.html" title="NMSettingGsm"><span class="type">NMSettingGsm</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -375,7 +373,6 @@ nm_setting_gsm_get_number (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.11.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--number" title="The “number” property"><span class="type">“number”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -401,7 +398,6 @@ nm_setting_gsm_get_username (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.2.11.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -427,7 +423,6 @@ nm_setting_gsm_get_password (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.2.11.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -453,7 +448,6 @@ nm_setting_gsm_get_apn (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.2.11.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--apn" title="The “apn” property"><span class="type">“apn”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -479,7 +473,6 @@ nm_setting_gsm_get_network_id (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.11.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--network-id" title="The “network-id” property"><span class="type">“network-id”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -505,7 +498,6 @@ nm_setting_gsm_get_pin (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.2.11.9.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--pin" title="The “pin” property"><span class="type">“pin”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -531,7 +523,6 @@ nm_setting_gsm_get_home_only (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.11.9.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--home-only" title="The “home-only” property"><span class="type">“home-only”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -557,7 +548,6 @@ nm_setting_gsm_get_pin_flags (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.11.9.12.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingGsm.html#NMSettingGsm--pin" title="The “pin” property"><span class="type">“pin”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -583,7 +573,6 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.11.9.13.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingGsm.html#NMSettingGsm--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -613,7 +602,6 @@ nm_setting_gsm_get_network_type (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.2.11.9.14.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--network-type" title="The “network-type” property"><span class="type">“network-type”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -643,7 +631,6 @@ nm_setting_gsm_get_allowed_bands (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.11.9.15.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--allowed-bands" title="The “allowed-bands” property"><span class="type">“allowed-bands”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -653,8 +640,6 @@ nm_setting_gsm_get_allowed_bands (<em class="parameter"><code><a class="link" hr
<a name="NM-SETTING-GSM-SETTING-NAME:CAPS"></a><h3>NM_SETTING_GSM_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_GSM_SETTING_NAME "gsm"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -707,96 +692,72 @@ is missing in the connection</p>
<a name="NM-SETTING-GSM-ERROR:CAPS"></a><h3>NM_SETTING_GSM_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_GSM_ERROR nm_setting_gsm_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-NUMBER:CAPS"></a><h3>NM_SETTING_GSM_NUMBER</h3>
<pre class="programlisting">#define NM_SETTING_GSM_NUMBER "number"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-USERNAME:CAPS"></a><h3>NM_SETTING_GSM_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_GSM_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PASSWORD:CAPS"></a><h3>NM_SETTING_GSM_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_GSM_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-APN:CAPS"></a><h3>NM_SETTING_GSM_APN</h3>
<pre class="programlisting">#define NM_SETTING_GSM_APN "apn"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-NETWORK-ID:CAPS"></a><h3>NM_SETTING_GSM_NETWORK_ID</h3>
<pre class="programlisting">#define NM_SETTING_GSM_NETWORK_ID "network-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PIN:CAPS"></a><h3>NM_SETTING_GSM_PIN</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PIN "pin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PIN-FLAGS:CAPS"></a><h3>NM_SETTING_GSM_PIN_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PIN_FLAGS "pin-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-HOME-ONLY:CAPS"></a><h3>NM_SETTING_GSM_HOME_ONLY</h3>
<pre class="programlisting">#define NM_SETTING_GSM_HOME_ONLY "home-only"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-ALLOWED-BANDS:CAPS"></a><h3>NM_SETTING_GSM_ALLOWED_BANDS</h3>
<pre class="programlisting">#define NM_SETTING_GSM_ALLOWED_BANDS "allowed-bands"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-NETWORK-TYPE:CAPS"></a><h3>NM_SETTING_GSM_NETWORK_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_GSM_NETWORK_TYPE "network-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1008,7 +969,9 @@ the device may use when connecting to this network.</p>
<div class="refsect2">
<a name="NMSettingGsm--allowed-bands"></a><h3>The <code class="literal">“allowed-bands”</code> property</h3>
<pre class="programlisting"> “allowed-bands” <span class="type">guint</span></pre>
-<p></p>
+<p>Bitfield of allowed frequency bands. Note that not all devices allow
+frequency band control. Permitted values are those specified by
+<a class="link" href="NMSettingGsm.html#NMSettingGsmNetworkBand" title="enum NMSettingGsmNetworkBand"><span class="type">NMSettingGsmNetworkBand</span></a>.</p>
<div class="warning">
<p><code class="literal">NMSettingGsm:allowed-bands</code> has been deprecated since version 0.9.10 and should not be used in newly-written code.</p>
<p>No longer used. Band setting should be done by
@@ -1022,7 +985,13 @@ talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--apn"></a><h3>The <code class="literal">“apn”</code> property</h3>
<pre class="programlisting"> “apn” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The GPRS Access Point Name specifying the APN used when establishing a
+data session with the GSM-based network. The APN often determines how
+the user will be billed for their network usage and whether the user has
+access to the Internet or just a provider-specific walled-garden, so it
+is important to use the correct APN for the user's mobile broadband plan.
+The APN may only be composed of the characters a-z, 0-9, ., and - per GSM
+03.60 Section 14.9.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1030,7 +999,8 @@ talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--home-only"></a><h3>The <code class="literal">“home-only”</code> property</h3>
<pre class="programlisting"> “home-only” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <code class="literal">TRUE</code>, only connections to the home network will be allowed.
+Connections to roaming networks will not be made.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -1038,7 +1008,11 @@ talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--network-id"></a><h3>The <code class="literal">“network-id”</code> property</h3>
<pre class="programlisting"> “network-id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The Network ID (GSM LAI format, ie MCC-MNC) to force specific network
+registration. If the Network ID is specified, NetworkManager will
+attempt to force the device to register only on the specified network.
+This can be used to ensure that the device does not roam when direct
+roaming control of the device is not otherwise possible.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1046,7 +1020,15 @@ talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--network-type"></a><h3>The <code class="literal">“network-type”</code> property</h3>
<pre class="programlisting"> “network-type” <span class="type">gint</span></pre>
-<p></p>
+<p>Network preference to force the device to only use specific network
+technologies. The permitted values are <a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-ANY:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_ANY</code></a>,
+<a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-UMTS-HSPA:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA</code></a>,
+<a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-GPRS-EDGE:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE</code></a>,
+<a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-UMTS-HSPA:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA</code></a>,
+<a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-GPRS-EDGE:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE</code></a>,
+<a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-4G:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G</code></a>, and
+<a class="link" href="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-4G:CAPS"><code class="literal">NM_SETTING_GSM_NETWORK_TYPE_4G</code></a>. Note that not all devices allow network
+preference control.</p>
<div class="warning">
<p><code class="literal">NMSettingGsm:network-type</code> has been deprecated since version 0.9.10 and should not be used in newly-written code.</p>
<p>No longer used. Network type setting should be done
@@ -1060,7 +1042,10 @@ by talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--number"></a><h3>The <code class="literal">“number”</code> property</h3>
<pre class="programlisting"> “number” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Number to dial when establishing a PPP data session with the GSM-based
+mobile broadband network. Many modems do not require PPP for connections
+to the mobile network and thus this property should be left blank, which
+allows NetworkManager to select the appropriate settings automatically.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1068,7 +1053,9 @@ by talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to authenticate with the network, if required. Many
+providers do not require a password, or accept any password. But if a
+password is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1076,7 +1063,7 @@ by talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingGsm.html#NMSettingGsm--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -1085,7 +1072,9 @@ by talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--pin"></a><h3>The <code class="literal">“pin”</code> property</h3>
<pre class="programlisting"> “pin” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the SIM is locked with a PIN it must be unlocked before any other
+operations are requested. Specify the PIN here to allow operation of the
+device.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1093,7 +1082,7 @@ by talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--pin-flags"></a><h3>The <code class="literal">“pin-flags”</code> property</h3>
<pre class="programlisting"> “pin-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingGsm.html#NMSettingGsm--pin" title="The “pin” property"><span class="type">“pin”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -1102,14 +1091,15 @@ by talking to ModemManager directly.</p>
<div class="refsect2">
<a name="NMSettingGsm--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The username used to authenticate with the network, if required. Many
+providers do not require a username, or accept any username. But if a
+username is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingIP4Config.html b/docs/libnm-util/html/NMSettingIP4Config.html
index c96dc86d8..08d299263 100644
--- a/docs/libnm-util/html/NMSettingIP4Config.html
+++ b/docs/libnm-util/html/NMSettingIP4Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingIP4Config</title>
+<title>NMSettingIP4Config: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSetting8021x.html" title="NMSetting8021x">
<link rel="next" href="NMSettingIP6Config.html" title="NMSettingIP6Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -723,7 +723,6 @@ nm_setting_ip4_config_error_quark (<em class="parameter"><code><span class="type
<div class="refsect3">
<a name="id-1.2.25.11.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingIP4Config.html" title="NMSettingIP4Config"><span class="type">NMSettingIP4Config</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -843,7 +842,6 @@ to.</p></td>
<div class="refsect3">
<a name="id-1.2.25.11.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the objects contain the same values, <code class="literal">FALSE</code> if they do not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -870,7 +868,6 @@ nm_ip4_address_get_address (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.25.11.8.6"></a><h4>Returns</h4>
<p> the IPv4 address in network byte order</p>
-<p></p>
</div>
</div>
<hr>
@@ -928,7 +925,6 @@ object.</p>
<div class="refsect3">
<a name="id-1.2.25.11.10.6"></a><h4>Returns</h4>
<p> the IPv4 address prefix</p>
-<p></p>
</div>
</div>
<hr>
@@ -985,7 +981,6 @@ nm_ip4_address_get_gateway (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.25.11.12.6"></a><h4>Returns</h4>
<p> the IPv4 gateway address in network byte order</p>
-<p></p>
</div>
</div>
<hr>
@@ -1135,7 +1130,6 @@ to.</p></td>
<div class="refsect3">
<a name="id-1.2.25.11.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the objects contain the same values, <code class="literal">FALSE</code> if they do not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1162,7 +1156,6 @@ nm_ip4_route_get_dest (<em class="parameter"><code><a class="link" href="NMSetti
<div class="refsect3">
<a name="id-1.2.25.11.19.6"></a><h4>Returns</h4>
<p> the IPv4 address in network byte order</p>
-<p></p>
</div>
</div>
<hr>
@@ -1219,7 +1212,6 @@ nm_ip4_route_get_prefix (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.25.11.21.6"></a><h4>Returns</h4>
<p> the IPv4 prefix</p>
-<p></p>
</div>
</div>
<hr>
@@ -1276,7 +1268,6 @@ nm_ip4_route_get_next_hop (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.25.11.23.6"></a><h4>Returns</h4>
<p> the IPv4 address in network byte order</p>
-<p></p>
</div>
</div>
<hr>
@@ -1334,7 +1325,6 @@ nm_ip4_route_get_metric (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.25.11.25.6"></a><h4>Returns</h4>
<p> the route metric</p>
-<p></p>
</div>
</div>
<hr>
@@ -1403,7 +1393,6 @@ nm_setting_ip4_config_get_method (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.25.11.28.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--method" title="The “method” property"><span class="type">“method”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1429,7 +1418,6 @@ nm_setting_ip4_config_get_num_dns (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.25.11.29.5"></a><h4>Returns</h4>
<p> the number of configured DNS servers</p>
-<p></p>
</div>
</div>
<hr>
@@ -1465,7 +1453,6 @@ nm_setting_ip4_config_get_dns (<em class="parameter"><code><a class="link" href=
<p> the IPv4 address (network byte order) of the DNS server at index
<em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1501,7 +1488,6 @@ nm_setting_ip4_config_add_dns (<em class="parameter"><code><a class="link" href=
<a name="id-1.2.25.11.31.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS server was added; <code class="literal">FALSE</code> if the server was already
known</p>
-<p></p>
</div>
</div>
<hr>
@@ -1570,9 +1556,8 @@ nm_setting_ip4_config_remove_dns_by_value
<a name="id-1.2.25.11.33.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS server was found and removed; <code class="literal">FALSE</code> if it was not.
domain was already known</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1620,7 +1605,6 @@ nm_setting_ip4_config_get_num_dns_searches
<div class="refsect3">
<a name="id-1.2.25.11.35.5"></a><h4>Returns</h4>
<p> the number of configured DNS search domains</p>
-<p></p>
</div>
</div>
<hr>
@@ -1655,7 +1639,6 @@ nm_setting_ip4_config_get_dns_search (<em class="parameter"><code><a class="link
<a name="id-1.2.25.11.36.5"></a><h4>Returns</h4>
<p> the DNS search domain at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1691,7 +1674,6 @@ nm_setting_ip4_config_add_dns_search (<em class="parameter"><code><a class="link
<a name="id-1.2.25.11.37.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS search domain was added; <code class="literal">FALSE</code> if the search
domain was already known</p>
-<p></p>
</div>
</div>
<hr>
@@ -1761,7 +1743,6 @@ nm_setting_ip4_config_remove_dns_search_by_value
<a name="id-1.2.25.11.39.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS search domain was found and removed; <code class="literal">FALSE</code> if it was not.</p>
<p>Since 0.9.10</p>
-<p></p>
</div>
</div>
<hr>
@@ -1811,7 +1792,6 @@ nm_setting_ip4_config_get_num_addresses
<div class="refsect3">
<a name="id-1.2.25.11.41.5"></a><h4>Returns</h4>
<p> the number of configured addresses</p>
-<p></p>
</div>
</div>
<hr>
@@ -1846,7 +1826,6 @@ nm_setting_ip4_config_get_address (<em class="parameter"><code><a class="link" h
<a name="id-1.2.25.11.42.5"></a><h4>Returns</h4>
<p> the address at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1883,7 +1862,6 @@ given address is duplicated internally and is not changed by this function.</p>
<a name="id-1.2.25.11.43.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the address was added; <code class="literal">FALSE</code> if the address was already
known.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1951,9 +1929,8 @@ nm_setting_ip4_config_remove_address_by_value
<div class="refsect3">
<a name="id-1.2.25.11.45.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2000,7 +1977,6 @@ nm_setting_ip4_config_get_num_routes (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.25.11.47.5"></a><h4>Returns</h4>
<p> the number of configured routes</p>
-<p></p>
</div>
</div>
<hr>
@@ -2035,7 +2011,6 @@ nm_setting_ip4_config_get_route (<em class="parameter"><code><a class="link" hre
<a name="id-1.2.25.11.48.5"></a><h4>Returns</h4>
<p> the route at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2071,7 +2046,6 @@ given route is duplicated internally and is not changed by this function.</p>
<div class="refsect3">
<a name="id-1.2.25.11.49.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the route was added; <code class="literal">FALSE</code> if the route was already known.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2139,9 +2113,8 @@ nm_setting_ip4_config_remove_route_by_value
<div class="refsect3">
<a name="id-1.2.25.11.51.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the route was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2192,9 +2165,8 @@ property.</p>
<a name="id-1.2.25.11.53.6"></a><h4>Returns</h4>
<p> the route metric that is used for IPv4 routes that don't explicitly
specify a metric. See <a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--route-metric" title="The “route-metric” property"><span class="type">“route-metric”</span></a> for more details.</p>
-<p></p>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -2223,7 +2195,6 @@ property.</p>
<a name="id-1.2.25.11.54.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if automatically configured (ie via DHCP) routes should be
ignored.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2253,7 +2224,6 @@ property.</p>
<a name="id-1.2.25.11.55.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if automatically configured (ie via DHCP) DNS information
should be ignored.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2283,7 +2253,6 @@ property.</p>
<a name="id-1.2.25.11.56.6"></a><h4>Returns</h4>
<p> the configured Client ID to send to the DHCP server when requesting
addresses via DHCP.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2314,7 +2283,6 @@ property.</p>
<p> <code class="literal">TRUE</code> if NetworkManager should send the machine hostname to the
DHCP server when requesting addresses to allow the server to automatically
update DNS information for this machine.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2343,7 +2311,6 @@ property.</p>
<div class="refsect3">
<a name="id-1.2.25.11.58.6"></a><h4>Returns</h4>
<p> the configured hostname to send to the DHCP server</p>
-<p></p>
</div>
</div>
<hr>
@@ -2373,7 +2340,6 @@ property.</p>
<a name="id-1.2.25.11.59.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if this connection should never be the default connection
for IPv4 addressing</p>
-<p></p>
</div>
</div>
<hr>
@@ -2402,7 +2368,6 @@ property.</p>
<a name="id-1.2.25.11.60.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if this connection doesn't require IPv4 addressing to complete
for the connection to succeed.</p>
-<p></p>
</div>
</div>
</div>
@@ -2412,8 +2377,6 @@ for the connection to succeed.</p>
<a name="NM-SETTING-IP4-CONFIG-SETTING-NAME:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_SETTING_NAME "ipv4"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2466,112 +2429,84 @@ not valid with the given IP4 method</p>
<a name="NM-SETTING-IP4-CONFIG-ERROR:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_ERROR nm_setting_ip4_config_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-METHOD:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_METHOD</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_METHOD "method"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-DNS:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-DNS-SEARCH:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_DNS_SEARCH</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_DNS_SEARCH "dns-search"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-ADDRESSES:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_ADDRESSES</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_ADDRESSES "addresses"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-ROUTES:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-ROUTE-METRIC:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_ROUTE_METRIC</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_ROUTE_METRIC "route-metric"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-IGNORE-AUTO-ROUTES:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-IGNORE-AUTO-DNS:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-DHCP-CLIENT-ID:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-DHCP-SEND-HOSTNAME:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME "dhcp-send-hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-DHCP-HOSTNAME:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-MAY-FAIL:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_MAY_FAIL</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_MAY_FAIL "may-fail"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2623,14 +2558,22 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--addresses"></a><h3>The <code class="literal">“addresses”</code> property</h3>
<pre class="programlisting"> “addresses” <span class="type">GPtrArray_GArray_guint__</span> *</pre>
-<p></p>
+<p>Array of IPv4 address structures. Each IPv4 address structure is
+composed of 3 32-bit values; the first being the IPv4 address (network
+byte order), the second the prefix (1 - 32), and last the IPv4 gateway
+(network byte order). The gateway may be left as 0 if no gateway exists
+for that subnet. For the "auto" method, given IP addresses are appended
+to those returned by automatic configuration. Addresses cannot be used
+with the "shared", "link-local", or "disabled" methods as addressing is
+either automatic or disabled with these methods.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP4Config--dhcp-client-id"></a><h3>The <code class="literal">“dhcp-client-id”</code> property</h3>
<pre class="programlisting"> “dhcp-client-id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>A string sent to the DHCP server to identify the local machine which the
+DHCP server may use to customize the DHCP lease and options.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -2638,7 +2581,8 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--dhcp-hostname"></a><h3>The <code class="literal">“dhcp-hostname”</code> property</h3>
<pre class="programlisting"> “dhcp-hostname” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the <a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--dhcp-send-hostname" title="The “dhcp-send-hostname” property"><span class="type">“dhcp-send-hostname”</span></a> property is <code class="literal">TRUE</code>, then the
+specified name will be sent to the DHCP server when acquiring a lease.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -2646,7 +2590,11 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--dhcp-send-hostname"></a><h3>The <code class="literal">“dhcp-send-hostname”</code> property</h3>
<pre class="programlisting"> “dhcp-send-hostname” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, a hostname is sent to the DHCP server when acquiring a lease.
+Some DHCP servers use this hostname to update DNS databases, essentially
+providing a static hostname for the computer. If the
+<a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--dhcp-hostname" title="The “dhcp-hostname” property"><span class="type">“dhcp-hostname”</span></a> property is empty and this property is
+<code class="literal">TRUE</code>, the current persistent hostname of the computer is sent.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -2654,21 +2602,34 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--dns"></a><h3>The <code class="literal">“dns”</code> property</h3>
<pre class="programlisting"> “dns” <span class="type">GArray_guint_</span> *</pre>
-<p></p>
+<p>List of DNS servers (network byte order). For the "auto" method, these
+DNS servers are appended to those (if any) returned by automatic
+configuration. DNS servers cannot be used with the "shared",
+"link-local", or "disabled" methods as there is no upstream network. In
+all other methods, these DNS servers are used as the only DNS servers for
+this connection.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP4Config--dns-search"></a><h3>The <code class="literal">“dns-search”</code> property</h3>
<pre class="programlisting"> “dns-search” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>List of DNS search domains. For the "auto" method, these search domains
+are appended to those returned by automatic configuration. Search domains
+cannot be used with the "shared", "link-local", or "disabled" methods as
+there is no upstream network. In all other methods, these search domains
+are used as the only search domains for this connection.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP4Config--ignore-auto-dns"></a><h3>The <code class="literal">“ignore-auto-dns”</code> property</h3>
<pre class="programlisting"> “ignore-auto-dns” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When the method is set to "auto" and this property to <code class="literal">TRUE</code>,
+automatically configured nameservers and search domains are ignored and
+only nameservers and search domains specified in the
+<a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--dns" title="The “dns” property"><span class="type">“dns”</span></a> and <a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--dns-search" title="The “dns-search” property"><span class="type">“dns-search”</span></a> properties, if
+any, are used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -2676,7 +2637,9 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--ignore-auto-routes"></a><h3>The <code class="literal">“ignore-auto-routes”</code> property</h3>
<pre class="programlisting"> “ignore-auto-routes” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When the method is set to "auto" and this property to <code class="literal">TRUE</code>,
+automatically configured routes are ignored and only routes specified in
+the <a class="link" href="NMSettingIP4Config.html#NMSettingIP4Config--routes" title="The “routes” property"><span class="type">“routes”</span></a> property, if any, are used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -2684,7 +2647,12 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--may-fail"></a><h3>The <code class="literal">“may-fail”</code> property</h3>
<pre class="programlisting"> “may-fail” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, allow overall network configuration to proceed even if IPv4
+configuration times out. Note that at least one IP configuration must
+succeed or overall network configuration will still fail. For example,
+in IPv6-only networks, setting this property to <code class="literal">TRUE</code> allows the overall
+network configuration to succeed if IPv4 configuration fails but IPv6
+configuration completes successfully.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -2692,7 +2660,18 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--method"></a><h3>The <code class="literal">“method”</code> property</h3>
<pre class="programlisting"> “method” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>IPv4 configuration method. If "auto" is specified then the appropriate
+automatic method (DHCP, PPP, etc) is used for the interface and most
+other properties can be left unset. If "link-local" is specified, then a
+link-local address in the 169.254/16 range will be assigned to the
+interface. If "manual" is specified, static IP addressing is used and at
+least one IP address must be given in the "addresses" property. If
+"shared" is specified (indicating that this connection will provide
+network access to other computers) then the interface is assigned an
+address in the 10.42.x.1/24 range and a DHCP and forwarding DNS server
+are started, and the interface is NAT-ed to the current default network
+connection. "disabled" means IPv4 will not be used on this connection.
+This property must be set.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -2700,7 +2679,8 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--never-default"></a><h3>The <code class="literal">“never-default”</code> property</h3>
<pre class="programlisting"> “never-default” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, this connection will never be the default IPv4 connection,
+meaning it will never be assigned the default route by NetworkManager.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -2708,23 +2688,36 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--route-metric"></a><h3>The <code class="literal">“route-metric”</code> property</h3>
<pre class="programlisting"> “route-metric” <span class="type">gint64</span></pre>
-<p></p>
+<p>The default metric for routes that don't explicitly specify a metric.
+The default value -1 means that the metric is choosen automatically
+based on the device type.
+The metric applies to dynamic routes, manual (static) routes that
+don't have an explicit metric setting, address prefix routes, and
+the default route.
+As the linux kernel accepts zero (0) as a valid metric, zero is
+a valid value.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,4294967295]</p>
<p>Default value: -1</p>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP4Config--routes"></a><h3>The <code class="literal">“routes”</code> property</h3>
<pre class="programlisting"> “routes” <span class="type">GPtrArray_GArray_guint__</span> *</pre>
-<p></p>
+<p>Array of IPv4 route structures. Each IPv4 route structure is composed of
+4 32-bit values; the first being the destination IPv4 network or address
+(network byte order), the second the destination network or address
+prefix (1 - 32), the third being the next-hop (network byte order) if
+any, and the fourth being the route metric. For the "auto" method, given
+IP routes are appended to those returned by automatic configuration.
+Routes cannot be used with the "shared", "link-local", or "disabled"
+methods because there is no upstream network.</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingIP6Config.html b/docs/libnm-util/html/NMSettingIP6Config.html
index 67b63a872..eb42de118 100644
--- a/docs/libnm-util/html/NMSettingIP6Config.html
+++ b/docs/libnm-util/html/NMSettingIP6Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingIP6Config</title>
+<title>NMSettingIP6Config: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingIP4Config.html" title="NMSettingIP4Config">
<link rel="next" href="NMSettingPPP.html" title="NMSettingPPP">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -708,7 +708,6 @@ nm_setting_ip6_config_error_quark (<em class="parameter"><code><span class="type
<div class="refsect3">
<a name="id-1.2.26.11.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingIP6Config.html" title="NMSettingIP6Config"><span class="type">NMSettingIP6Config</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -828,7 +827,6 @@ to.</p></td>
<div class="refsect3">
<a name="id-1.2.26.11.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the objects contain the same values, <code class="literal">FALSE</code> if they do not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -912,7 +910,6 @@ nm_ip6_address_get_prefix (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.26.11.10.6"></a><h4>Returns</h4>
<p> the IPv6 address prefix</p>
-<p></p>
</div>
</div>
<hr>
@@ -1119,7 +1116,6 @@ to.</p></td>
<div class="refsect3">
<a name="id-1.2.26.11.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the objects contain the same values, <code class="literal">FALSE</code> if they do not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1203,7 +1199,6 @@ nm_ip6_route_get_prefix (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.26.11.21.6"></a><h4>Returns</h4>
<p> the IPv6 prefix</p>
-<p></p>
</div>
</div>
<hr>
@@ -1318,7 +1313,6 @@ nm_ip6_route_get_metric (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.26.11.25.6"></a><h4>Returns</h4>
<p> the route metric</p>
-<p></p>
</div>
</div>
<hr>
@@ -1387,7 +1381,6 @@ nm_setting_ip6_config_get_method (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.26.11.28.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingIP6Config.html#NMSettingIP6Config--method" title="The “method” property"><span class="type">“method”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1413,7 +1406,6 @@ nm_setting_ip6_config_get_num_dns (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.26.11.29.5"></a><h4>Returns</h4>
<p> the number of configured DNS servers</p>
-<p></p>
</div>
</div>
<hr>
@@ -1484,7 +1476,6 @@ nm_setting_ip6_config_add_dns (<em class="parameter"><code><a class="link" href=
<a name="id-1.2.26.11.31.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS server was added; <code class="literal">FALSE</code> if the server was already
known</p>
-<p></p>
</div>
</div>
<hr>
@@ -1552,9 +1543,8 @@ nm_setting_ip6_config_remove_dns_by_value
<div class="refsect3">
<a name="id-1.2.26.11.33.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS server was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1602,7 +1592,6 @@ nm_setting_ip6_config_get_num_dns_searches
<div class="refsect3">
<a name="id-1.2.26.11.35.5"></a><h4>Returns</h4>
<p> the number of configured DNS search domains</p>
-<p></p>
</div>
</div>
<hr>
@@ -1637,7 +1626,6 @@ nm_setting_ip6_config_get_dns_search (<em class="parameter"><code><a class="link
<a name="id-1.2.26.11.36.5"></a><h4>Returns</h4>
<p> the DNS search domain at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1673,7 +1661,6 @@ nm_setting_ip6_config_add_dns_search (<em class="parameter"><code><a class="link
<a name="id-1.2.26.11.37.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS search domain was added; <code class="literal">FALSE</code> if the search
domain was already known</p>
-<p></p>
</div>
</div>
<hr>
@@ -1743,7 +1730,6 @@ nm_setting_ip6_config_remove_dns_search_by_value
<a name="id-1.2.26.11.39.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS search domain was found and removed; <code class="literal">FALSE</code> if it was not.</p>
<p>Since 0.9.10</p>
-<p></p>
</div>
</div>
<hr>
@@ -1793,7 +1779,6 @@ nm_setting_ip6_config_get_num_addresses
<div class="refsect3">
<a name="id-1.2.26.11.41.5"></a><h4>Returns</h4>
<p> the number of configured addresses</p>
-<p></p>
</div>
</div>
<hr>
@@ -1828,7 +1813,6 @@ nm_setting_ip6_config_get_address (<em class="parameter"><code><a class="link" h
<a name="id-1.2.26.11.42.5"></a><h4>Returns</h4>
<p> the address at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1865,7 +1849,6 @@ given address is duplicated internally and is not changed by this function.</p>
<a name="id-1.2.26.11.43.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the address was added; <code class="literal">FALSE</code> if the address was already
known.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1933,9 +1916,8 @@ nm_setting_ip6_config_remove_address_by_value
<div class="refsect3">
<a name="id-1.2.26.11.45.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1982,7 +1964,6 @@ nm_setting_ip6_config_get_num_routes (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.26.11.47.5"></a><h4>Returns</h4>
<p> the number of configured routes</p>
-<p></p>
</div>
</div>
<hr>
@@ -2017,7 +1998,6 @@ nm_setting_ip6_config_get_route (<em class="parameter"><code><a class="link" hre
<a name="id-1.2.26.11.48.5"></a><h4>Returns</h4>
<p> the route at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2053,7 +2033,6 @@ given route is duplicated internally and is not changed by this function.</p>
<div class="refsect3">
<a name="id-1.2.26.11.49.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the route was added; <code class="literal">FALSE</code> if the route was already known.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2121,9 +2100,8 @@ nm_setting_ip6_config_remove_route_by_value
<div class="refsect3">
<a name="id-1.2.26.11.51.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the route was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2174,7 +2152,6 @@ property.</p>
<a name="id-1.2.26.11.53.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if automatically configured (ie via DHCP) routes should be
ignored.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2204,9 +2181,8 @@ property.</p>
<a name="id-1.2.26.11.54.6"></a><h4>Returns</h4>
<p> the route metric that is used for IPv6 routes that don't explicitly
specify a metric. See <a class="link" href="NMSettingIP6Config.html#NMSettingIP6Config--route-metric" title="The “route-metric” property"><span class="type">“route-metric”</span></a> for more details.</p>
-<p></p>
</div>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
@@ -2235,7 +2211,6 @@ property.</p>
<a name="id-1.2.26.11.55.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if automatically configured (ie via DHCP or router
advertisements) DNS information should be ignored.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2264,9 +2239,8 @@ property.</p>
<div class="refsect3">
<a name="id-1.2.26.11.56.6"></a><h4>Returns</h4>
<p> the configured hostname to send to the DHCP server</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -2295,7 +2269,6 @@ property.</p>
<a name="id-1.2.26.11.57.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if this connection should never be the default connection
for IPv6 addressing</p>
-<p></p>
</div>
</div>
<hr>
@@ -2324,7 +2297,6 @@ property.</p>
<a name="id-1.2.26.11.58.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if this connection doesn't require IPv6 addressing to complete
for the connection to succeed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2352,7 +2324,6 @@ property.</p>
<div class="refsect3">
<a name="id-1.2.26.11.59.6"></a><h4>Returns</h4>
<p> IPv6 Privacy Extensions configuration value (<a class="link" href="NMSettingIP6Config.html#NMSettingIP6ConfigPrivacy" title="enum NMSettingIP6ConfigPrivacy"><span class="type">NMSettingIP6ConfigPrivacy</span></a>).</p>
-<p></p>
</div>
</div>
</div>
@@ -2362,8 +2333,6 @@ property.</p>
<a name="NM-SETTING-IP6-CONFIG-SETTING-NAME:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_SETTING_NAME "ipv6"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2416,104 +2385,78 @@ not valid with the given IPv6 method</p>
<a name="NM-SETTING-IP6-CONFIG-ERROR:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_ERROR nm_setting_ip6_config_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-METHOD:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_METHOD</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_METHOD "method"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-DNS:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-DNS-SEARCH:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_DNS_SEARCH</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_DNS_SEARCH "dns-search"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-ADDRESSES:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_ADDRESSES</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_ADDRESSES "addresses"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-ROUTES:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-ROUTE-METRIC:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_ROUTE_METRIC</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_ROUTE_METRIC "route-metric"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-IGNORE-AUTO-ROUTES:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-IGNORE-AUTO-DNS:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-MAY-FAIL:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_MAY_FAIL</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_MAY_FAIL "may-fail"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-IP6-PRIVACY:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_IP6_PRIVACY</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_IP6_PRIVACY "ip6-privacy"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-DHCP-HOSTNAME:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME "dhcp-hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2623,37 +2566,61 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--addresses"></a><h3>The <code class="literal">“addresses”</code> property</h3>
<pre class="programlisting"> “addresses” <span class="type">GPtrArray_GValueArray_GArray_guchar_+guint+GArray_guchar___*</span></pre>
-<p></p>
+<p>Array of IPv6 address structures. Each IPv6 address structure is
+composed of 3 members, the first being a byte array containing the IPv6
+address (network byte order), the second a 32-bit integer containing the
+IPv6 address prefix, and the third a byte array containing the IPv6
+address (network byte order) of the gateway associated with this address,
+if any. If no gateway is given, the third element should be given as all
+zeros. For the "auto" method, given IP addresses are appended to those
+returned by automatic configuration. Addresses cannot be used with the
+"shared" or "link-local" methods as the interface is automatically
+assigned an address with these methods.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP6Config--dhcp-hostname"></a><h3>The <code class="literal">“dhcp-hostname”</code> property</h3>
<pre class="programlisting"> “dhcp-hostname” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The specified name will be sent to the DHCP server when acquiring a
+lease.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP6Config--dns"></a><h3>The <code class="literal">“dns”</code> property</h3>
<pre class="programlisting"> “dns” <span class="type">GPtrArray_GArray_guchar__</span> *</pre>
-<p></p>
+<p>Array of DNS servers, where each member of the array is a byte array
+containing the IPv6 address of the DNS server (in network byte order).
+For the "auto" method, these DNS servers are appended to those (if any)
+returned by automatic configuration. DNS servers cannot be used with the
+"shared" or "link-local" methods as there is no usptream network. In all
+other methods, these DNS servers are used as the only DNS servers for
+this connection.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP6Config--dns-search"></a><h3>The <code class="literal">“dns-search”</code> property</h3>
<pre class="programlisting"> “dns-search” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>List of DNS search domains. For the "auto" method, these search domains
+are appended to those returned by automatic configuration. Search domains
+cannot be used with the "shared" or "link-local" methods as there is no
+upstream network. In all other methods, these search domains are used as
+the only search domains for this connection.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP6Config--ignore-auto-dns"></a><h3>The <code class="literal">“ignore-auto-dns”</code> property</h3>
<pre class="programlisting"> “ignore-auto-dns” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When the method is set to "auto" or "dhcp" and this property is set to
+<code class="literal">TRUE</code>, automatically configured nameservers and search domains are
+ignored and only nameservers and search domains specified in the
+<a class="link" href="NMSettingIP6Config.html#NMSettingIP6Config--dns" title="The “dns” property"><span class="type">“dns”</span></a> and <a class="link" href="NMSettingIP6Config.html#NMSettingIP6Config--dns-search" title="The “dns-search” property"><span class="type">“dns-search”</span></a> properties, if
+any, are used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -2661,7 +2628,9 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--ignore-auto-routes"></a><h3>The <code class="literal">“ignore-auto-routes”</code> property</h3>
<pre class="programlisting"> “ignore-auto-routes” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When the method is set to "auto" or "dhcp" and this property is set to
+<code class="literal">TRUE</code>, automatically configured routes are ignored and only routes
+specified in the <a class="link" href="NMSettingIP6Config.html#NMSettingIP6Config--routes" title="The “routes” property"><span class="type">“routes”</span></a> property, if any, are used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -2669,7 +2638,13 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--ip6-privacy"></a><h3>The <code class="literal">“ip6-privacy”</code> property</h3>
<pre class="programlisting"> “ip6-privacy” <span class="type">gint</span></pre>
-<p></p>
+<p>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If
+enabled, it makes the kernel generate a temporary IPv6 address in
+addition to the public one generated from MAC address via modified
+EUI-64. This enhances privacy, but could cause problems in some
+applications, on the other hand. The permitted values are: 0: disabled,
+1: enabled (prefer public address), 2: enabled (prefer temporary
+addresses).</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,2]</p>
<p>Default value: -1</p>
@@ -2678,7 +2653,12 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--may-fail"></a><h3>The <code class="literal">“may-fail”</code> property</h3>
<pre class="programlisting"> “may-fail” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, allow overall network configuration to proceed even if IPv6
+configuration times out. Note that at least one IP configuration must
+succeed or overall network configuration will still fail. For example,
+in IPv4-only networks, setting this property to <code class="literal">TRUE</code> allows the overall
+network configuration to succeed if IPv6 configuration fails but IPv4
+configuration completes successfully.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -2686,7 +2666,16 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--method"></a><h3>The <code class="literal">“method”</code> property</h3>
<pre class="programlisting"> “method” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>IPv6 configuration method. If "auto" is specified then the appropriate
+automatic method (PPP, router advertisement, etc) is used for the device
+and most other properties can be left unset. To force the use of DHCP
+only, specify "dhcp"; this method is only valid for Ethernet- based
+hardware. If "link-local" is specified, then an IPv6 link-local address
+will be assigned to the interface. If "manual" is specified, static IP
+addressing is used and at least one IP address must be given in the
+"addresses" property. If "ignore" is specified, IPv6 configuration is
+not done. This property must be set. Note: the "shared" method is not
+yet supported.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -2694,7 +2683,9 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--never-default"></a><h3>The <code class="literal">“never-default”</code> property</h3>
<pre class="programlisting"> “never-default” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, this connection will never be the default IPv6 connection,
+meaning it will never be assigned the default IPv6 route by
+NetworkManager.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -2702,23 +2693,36 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--route-metric"></a><h3>The <code class="literal">“route-metric”</code> property</h3>
<pre class="programlisting"> “route-metric” <span class="type">gint64</span></pre>
-<p></p>
+<p>The default metric for routes that don't explicitly specify a metric.
+The default value -1 means that the metric is choosen automatically
+based on the device type.
+The metric applies to dynamic routes, manual (static) routes that
+don't have an explicit metric setting, address prefix routes, and
+the default route.
+As the linux kernel replaces zero (0) by 1024 (user-default), setting
+this property to 0 means effectively setting it to 1024.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,4294967295]</p>
<p>Default value: -1</p>
-<p class="since">Since 1.0</p>
+<p class="since">Since: 1.0</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIP6Config--routes"></a><h3>The <code class="literal">“routes”</code> property</h3>
<pre class="programlisting"> “routes” <span class="type">GPtrArray_GValueArray_GArray_guchar_+guint+GArray_guchar_+guint__*</span></pre>
-<p></p>
+<p>Array of IPv6 route structures. Each IPv6 route structure is composed of
+4 members; the first being the destination IPv6 network or address
+(network byte order) as a byte array, the second the destination network
+or address IPv6 prefix, the third being the next-hop IPv6 address
+(network byte order) if any, and the fourth being the route metric. For
+the "auto" method, given IP routes are appended to those returned by
+automatic configuration. Routes cannot be used with the "shared" or
+"link-local" methods because there is no upstream network.</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingInfiniband.html b/docs/libnm-util/html/NMSettingInfiniband.html
index f61fe6f7c..82db623e8 100644
--- a/docs/libnm-util/html/NMSettingInfiniband.html
+++ b/docs/libnm-util/html/NMSettingInfiniband.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingInfiniband</title>
+<title>NMSettingInfiniband: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingGeneric.html" title="NMSettingGeneric">
<link rel="next" href="NMSettingVlan.html" title="NMSettingVlan">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -209,7 +209,6 @@ nm_setting_infiniband_error_quark (<em class="parameter"><code><span class="type
<div class="refsect3">
<a name="id-1.2.19.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingInfiniband.html" title="NMSettingInfiniband"><span class="type">NMSettingInfiniband</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -247,7 +246,6 @@ nm_setting_infiniband_get_mac_address (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.2.19.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -273,7 +271,6 @@ nm_setting_infiniband_get_mtu (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.19.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -302,7 +299,6 @@ nm_setting_infiniband_get_transport_mode
<div class="refsect3">
<a name="id-1.2.19.9.6.6"></a><h4>Returns</h4>
<p> the IPoIB transport mode</p>
-<p></p>
</div>
</div>
<hr>
@@ -331,7 +327,6 @@ a 16-bit unsigned integer.</p>
<div class="refsect3">
<a name="id-1.2.19.9.7.6"></a><h4>Returns</h4>
<p> the IPoIB P_Key</p>
-<p></p>
</div>
</div>
<hr>
@@ -358,7 +353,6 @@ nm_setting_infiniband_get_parent (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.19.9.8.6"></a><h4>Returns</h4>
<p> the parent interface name</p>
-<p></p>
</div>
</div>
</div>
@@ -368,8 +362,6 @@ nm_setting_infiniband_get_parent (<em class="parameter"><code><a class="link" hr
<a name="NM-SETTING-INFINIBAND-SETTING-NAME:CAPS"></a><h3>NM_SETTING_INFINIBAND_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_SETTING_NAME "infiniband"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -414,48 +406,36 @@ required</p>
<a name="NM-SETTING-INFINIBAND-ERROR:CAPS"></a><h3>NM_SETTING_INFINIBAND_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_ERROR nm_setting_infiniband_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_INFINIBAND_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-MTU:CAPS"></a><h3>NM_SETTING_INFINIBAND_MTU</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-TRANSPORT-MODE:CAPS"></a><h3>NM_SETTING_INFINIBAND_TRANSPORT_MODE</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_TRANSPORT_MODE "transport-mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-P-KEY:CAPS"></a><h3>NM_SETTING_INFINIBAND_P_KEY</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_P_KEY "p-key"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-PARENT:CAPS"></a><h3>NM_SETTING_INFINIBAND_PARENT</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_PARENT "parent"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -463,14 +443,17 @@ required</p>
<div class="refsect2">
<a name="NMSettingInfiniband--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the IPoIB device whose
+permanent MAC address matches. This property does not change the MAC
+address of the device (i.e. MAC spoofing).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingInfiniband--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, only transmit packets of the specified size or smaller,
+breaking larger packets up into multiple frames.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -478,7 +461,10 @@ required</p>
<div class="refsect2">
<a name="NMSettingInfiniband--p-key"></a><h3>The <code class="literal">“p-key”</code> property</h3>
<pre class="programlisting"> “p-key” <span class="type">gint</span></pre>
-<p></p>
+<p>The InfiniBand P_Key to use for this device. A value of -1 means to use
+the default P_Key (aka "the P_Key at index 0"). Otherwise it is a 16-bit
+unsigned integer, whose high bit is set if it is a "full membership"
+P_Key.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,65535]</p>
<p>Default value: -1</p>
@@ -487,7 +473,10 @@ required</p>
<div class="refsect2">
<a name="NMSettingInfiniband--parent"></a><h3>The <code class="literal">“parent”</code> property</h3>
<pre class="programlisting"> “parent” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The interface name of the parent device of this device. Normally <code class="literal">NULL</code>,
+but if the <a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--p-key" title="The “p-key” property"><span class="type">“p_key”</span></a> property is set, then you must
+specify the base device by setting either this property or
+<a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
@@ -495,14 +484,14 @@ required</p>
<div class="refsect2">
<a name="NMSettingInfiniband--transport-mode"></a><h3>The <code class="literal">“transport-mode”</code> property</h3>
<pre class="programlisting"> “transport-mode” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IP-over-InfiniBand transport mode. Either "datagram" or
+"connected".</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingOlpcMesh.html b/docs/libnm-util/html/NMSettingOlpcMesh.html
index c43b6dd85..d9a5d1d03 100644
--- a/docs/libnm-util/html/NMSettingOlpcMesh.html
+++ b/docs/libnm-util/html/NMSettingOlpcMesh.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingOlpcMesh</title>
+<title>NMSettingOlpcMesh: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingVlan.html" title="NMSettingVlan">
<link rel="next" href="NMSettingAdsl.html" title="NMSettingAdsl">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -157,8 +157,6 @@
</div>
<div class="refsect1">
<a name="NMSettingOlpcMesh.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMSettingOlpcMesh.functions_details"></a><h2>Functions</h2>
@@ -166,12 +164,6 @@
<a name="nm-setting-olpc-mesh-error-quark"></a><h3>nm_setting_olpc_mesh_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_setting_olpc_mesh_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.2.21.8.2.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -182,7 +174,6 @@ nm_setting_olpc_mesh_new (<em class="parameter"><code><span class="type">void</s
<div class="refsect3">
<a name="id-1.2.21.8.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -190,24 +181,12 @@ nm_setting_olpc_mesh_new (<em class="parameter"><code><span class="type">void</s
<a name="nm-setting-olpc-mesh-get-ssid"></a><h3>nm_setting_olpc_mesh_get_ssid ()</h3>
<pre class="programlisting">const <span class="returnvalue">GByteArray</span> *
nm_setting_olpc_mesh_get_ssid (<em class="parameter"><code><a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> *setting</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.2.21.8.4.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-setting-olpc-mesh-get-channel"></a><h3>nm_setting_olpc_mesh_get_channel ()</h3>
<pre class="programlisting"><span class="returnvalue">guint32</span>
nm_setting_olpc_mesh_get_channel (<em class="parameter"><code><a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> *setting</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.2.21.8.5.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -215,12 +194,6 @@ nm_setting_olpc_mesh_get_channel (<em class="parameter"><code><a class="link" hr
<pre class="programlisting">const <span class="returnvalue">GByteArray</span> *
nm_setting_olpc_mesh_get_dhcp_anycast_address
(<em class="parameter"><code><a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> *setting</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.2.21.8.6.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
</div>
<div class="refsect1">
@@ -229,8 +202,6 @@ nm_setting_olpc_mesh_get_dhcp_anycast_address
<a name="NM-SETTING-OLPC-MESH-SETTING-NAME:CAPS"></a><h3>NM_SETTING_OLPC_MESH_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_SETTING_NAME "802-11-olpc-mesh"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -275,32 +246,24 @@ required</p>
<a name="NM-SETTING-OLPC-MESH-ERROR:CAPS"></a><h3>NM_SETTING_OLPC_MESH_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_ERROR nm_setting_olpc_mesh_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-OLPC-MESH-SSID:CAPS"></a><h3>NM_SETTING_OLPC_MESH_SSID</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_SSID "ssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-OLPC-MESH-CHANNEL:CAPS"></a><h3>NM_SETTING_OLPC_MESH_CHANNEL</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_CHANNEL "channel"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-OLPC-MESH-DHCP-ANYCAST-ADDRESS:CAPS"></a><h3>NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS "dhcp-anycast-address"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -308,7 +271,7 @@ required</p>
<div class="refsect2">
<a name="NMSettingOlpcMesh--channel"></a><h3>The <code class="literal">“channel”</code> property</h3>
<pre class="programlisting"> “channel” <span class="type">guint</span></pre>
-<p></p>
+<p>Channel on which the mesh network to join is located.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -316,20 +279,21 @@ required</p>
<div class="refsect2">
<a name="NMSettingOlpcMesh--dhcp-anycast-address"></a><h3>The <code class="literal">“dhcp-anycast-address”</code> property</h3>
<pre class="programlisting"> “dhcp-anycast-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>Anycast DHCP MAC address used when requesting an IP address via DHCP.
+The specific anycast address used determines which DHCP server class
+answers the request.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingOlpcMesh--ssid"></a><h3>The <code class="literal">“ssid”</code> property</h3>
<pre class="programlisting"> “ssid” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>SSID of the mesh network to join.</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingPPP.html b/docs/libnm-util/html/NMSettingPPP.html
index d71e91f52..c66bd5950 100644
--- a/docs/libnm-util/html/NMSettingPPP.html
+++ b/docs/libnm-util/html/NMSettingPPP.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingPPP</title>
+<title>NMSettingPPP: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingIP6Config.html" title="NMSettingIP6Config">
<link rel="next" href="NMSettingPPPOE.html" title="NMSettingPPPOE">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -432,7 +432,6 @@ nm_setting_ppp_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.2.27.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingPPP.html" title="NMSettingPPP"><span class="type">NMSettingPPP</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -470,7 +469,6 @@ nm_setting_ppp_get_noauth (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.27.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--noauth" title="The “noauth” property"><span class="type">“noauth”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -496,7 +494,6 @@ nm_setting_ppp_get_refuse_eap (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.27.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--refuse-eap" title="The “refuse-eap” property"><span class="type">“refuse-eap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -522,7 +519,6 @@ nm_setting_ppp_get_refuse_pap (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.27.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--refuse-pap" title="The “refuse-pap” property"><span class="type">“refuse-pap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -548,7 +544,6 @@ nm_setting_ppp_get_refuse_chap (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.27.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--refuse-chap" title="The “refuse-chap” property"><span class="type">“refuse-chap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -574,7 +569,6 @@ nm_setting_ppp_get_refuse_mschap (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.27.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--refuse-mschap" title="The “refuse-mschap” property"><span class="type">“refuse-mschap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -600,7 +594,6 @@ nm_setting_ppp_get_refuse_mschapv2 (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.27.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--refuse-mschapv2" title="The “refuse-mschapv2” property"><span class="type">“refuse-mschapv2”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -626,7 +619,6 @@ nm_setting_ppp_get_nobsdcomp (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.27.9.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--nobsdcomp" title="The “nobsdcomp” property"><span class="type">“nobsdcomp”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -652,7 +644,6 @@ nm_setting_ppp_get_nodeflate (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.27.9.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--nodeflate" title="The “nodeflate” property"><span class="type">“nodeflate”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -678,7 +669,6 @@ nm_setting_ppp_get_no_vj_comp (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.27.9.12.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--no-vj-comp" title="The “no-vj-comp” property"><span class="type">“no-vj-comp”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -704,7 +694,6 @@ nm_setting_ppp_get_require_mppe (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.2.27.9.13.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--require-mppe" title="The “require-mppe” property"><span class="type">“require-mppe”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -730,7 +719,6 @@ nm_setting_ppp_get_require_mppe_128 (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.27.9.14.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--require-mppe-128" title="The “require-mppe-128” property"><span class="type">“require-mppe-128”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -756,7 +744,6 @@ nm_setting_ppp_get_mppe_stateful (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.27.9.15.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--mppe-stateful" title="The “mppe-stateful” property"><span class="type">“mppe-stateful”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -782,7 +769,6 @@ nm_setting_ppp_get_crtscts (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.27.9.16.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--crtscts" title="The “crtscts” property"><span class="type">“crtscts”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -808,7 +794,6 @@ nm_setting_ppp_get_baud (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.2.27.9.17.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--baud" title="The “baud” property"><span class="type">“baud”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -834,7 +819,6 @@ nm_setting_ppp_get_mru (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.2.27.9.18.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--mru" title="The “mru” property"><span class="type">“mru”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -860,7 +844,6 @@ nm_setting_ppp_get_mtu (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.2.27.9.19.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -886,7 +869,6 @@ nm_setting_ppp_get_lcp_echo_failure (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.27.9.20.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--lcp-echo-failure" title="The “lcp-echo-failure” property"><span class="type">“lcp-echo-failure”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -912,7 +894,6 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.27.9.21.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPP.html#NMSettingPPP--lcp-echo-interval" title="The “lcp-echo-interval” property"><span class="type">“lcp-echo-interval”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -922,8 +903,6 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<a name="NM-SETTING-PPP-SETTING-NAME:CAPS"></a><h3>NM_SETTING_PPP_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_PPP_SETTING_NAME "ppp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -976,152 +955,114 @@ with other setting configuration parameters</p>
<a name="NM-SETTING-PPP-ERROR:CAPS"></a><h3>NM_SETTING_PPP_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_PPP_ERROR nm_setting_ppp_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NOAUTH:CAPS"></a><h3>NM_SETTING_PPP_NOAUTH</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NOAUTH "noauth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-EAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_EAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_EAP "refuse-eap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-PAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_PAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_PAP "refuse-pap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-CHAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_CHAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_CHAP "refuse-chap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-MSCHAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_MSCHAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_MSCHAP "refuse-mschap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-MSCHAPV2:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_MSCHAPV2</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_MSCHAPV2 "refuse-mschapv2"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NOBSDCOMP:CAPS"></a><h3>NM_SETTING_PPP_NOBSDCOMP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NOBSDCOMP "nobsdcomp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NODEFLATE:CAPS"></a><h3>NM_SETTING_PPP_NODEFLATE</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NODEFLATE "nodeflate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NO-VJ-COMP:CAPS"></a><h3>NM_SETTING_PPP_NO_VJ_COMP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NO_VJ_COMP "no-vj-comp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REQUIRE-MPPE:CAPS"></a><h3>NM_SETTING_PPP_REQUIRE_MPPE</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REQUIRE_MPPE "require-mppe"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REQUIRE-MPPE-128:CAPS"></a><h3>NM_SETTING_PPP_REQUIRE_MPPE_128</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REQUIRE_MPPE_128 "require-mppe-128"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-MPPE-STATEFUL:CAPS"></a><h3>NM_SETTING_PPP_MPPE_STATEFUL</h3>
<pre class="programlisting">#define NM_SETTING_PPP_MPPE_STATEFUL "mppe-stateful"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-CRTSCTS:CAPS"></a><h3>NM_SETTING_PPP_CRTSCTS</h3>
<pre class="programlisting">#define NM_SETTING_PPP_CRTSCTS "crtscts"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-BAUD:CAPS"></a><h3>NM_SETTING_PPP_BAUD</h3>
<pre class="programlisting">#define NM_SETTING_PPP_BAUD "baud"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-MRU:CAPS"></a><h3>NM_SETTING_PPP_MRU</h3>
<pre class="programlisting">#define NM_SETTING_PPP_MRU "mru"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-MTU:CAPS"></a><h3>NM_SETTING_PPP_MTU</h3>
<pre class="programlisting">#define NM_SETTING_PPP_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-LCP-ECHO-FAILURE:CAPS"></a><h3>NM_SETTING_PPP_LCP_ECHO_FAILURE</h3>
<pre class="programlisting">#define NM_SETTING_PPP_LCP_ECHO_FAILURE "lcp-echo-failure"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-LCP-ECHO-INTERVAL:CAPS"></a><h3>NM_SETTING_PPP_LCP_ECHO_INTERVAL</h3>
<pre class="programlisting">#define NM_SETTING_PPP_LCP_ECHO_INTERVAL "lcp-echo-interval"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1129,7 +1070,9 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--baud"></a><h3>The <code class="literal">“baud”</code> property</h3>
<pre class="programlisting"> “baud” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to set the serial port to the specified
+baudrate. This value should normally be left as 0 to automatically
+choose the speed.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1137,7 +1080,9 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--crtscts"></a><h3>The <code class="literal">“crtscts”</code> property</h3>
<pre class="programlisting"> “crtscts” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, specify that pppd should set the serial port to use hardware
+flow control with RTS and CTS signals. This value should normally be set
+to <code class="literal">FALSE</code>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1145,7 +1090,10 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--lcp-echo-failure"></a><h3>The <code class="literal">“lcp-echo-failure”</code> property</h3>
<pre class="programlisting"> “lcp-echo-failure” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to presume the connection to the peer has
+failed if the specified number of LCP echo-requests go unanswered by the
+peer. The "lcp-echo-interval" property must also be set to a non-zero
+value if this property is used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1153,7 +1101,10 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--lcp-echo-interval"></a><h3>The <code class="literal">“lcp-echo-interval”</code> property</h3>
<pre class="programlisting"> “lcp-echo-interval” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to send an LCP echo-request frame to the peer
+every n seconds (where n is the specified value). Note that some PPP
+peers will respond to echo requests and some will not, and it is not
+possible to autodetect this.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1161,7 +1112,8 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--mppe-stateful"></a><h3>The <code class="literal">“mppe-stateful”</code> property</h3>
<pre class="programlisting"> “mppe-stateful” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, stateful MPPE is used. See pppd documentation for more
+information on stateful MPPE.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1169,7 +1121,9 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--mru"></a><h3>The <code class="literal">“mru”</code> property</h3>
<pre class="programlisting"> “mru” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to request that the peer send packets no
+larger than the specified size. If non-zero, the MRU should be between
+128 and 16384.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 16384</p>
<p>Default value: 0</p>
@@ -1178,7 +1132,8 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to send packets no larger than the specified
+size.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1186,7 +1141,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--no-vj-comp"></a><h3>The <code class="literal">“no-vj-comp”</code> property</h3>
<pre class="programlisting"> “no-vj-comp” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, Van Jacobsen TCP header compression will not be requested.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1194,7 +1149,9 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--noauth"></a><h3>The <code class="literal">“noauth”</code> property</h3>
<pre class="programlisting"> “noauth” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, do not require the other side (usually the PPP server) to
+authenticate itself to the client. If <code class="literal">FALSE</code>, require authentication
+from the remote side. In almost all cases, this should be <code class="literal">TRUE</code>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -1202,7 +1159,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--nobsdcomp"></a><h3>The <code class="literal">“nobsdcomp”</code> property</h3>
<pre class="programlisting"> “nobsdcomp” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, BSD compression will not be requested.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1210,7 +1167,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--nodeflate"></a><h3>The <code class="literal">“nodeflate”</code> property</h3>
<pre class="programlisting"> “nodeflate” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, "deflate" compression will not be requested.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1218,7 +1175,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--refuse-chap"></a><h3>The <code class="literal">“refuse-chap”</code> property</h3>
<pre class="programlisting"> “refuse-chap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the CHAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1226,7 +1183,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--refuse-eap"></a><h3>The <code class="literal">“refuse-eap”</code> property</h3>
<pre class="programlisting"> “refuse-eap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the EAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1234,7 +1191,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--refuse-mschap"></a><h3>The <code class="literal">“refuse-mschap”</code> property</h3>
<pre class="programlisting"> “refuse-mschap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the MSCHAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1242,7 +1199,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--refuse-mschapv2"></a><h3>The <code class="literal">“refuse-mschapv2”</code> property</h3>
<pre class="programlisting"> “refuse-mschapv2” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the MSCHAPv2 authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1250,7 +1207,7 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--refuse-pap"></a><h3>The <code class="literal">“refuse-pap”</code> property</h3>
<pre class="programlisting"> “refuse-pap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the PAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1258,7 +1215,10 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--require-mppe"></a><h3>The <code class="literal">“require-mppe”</code> property</h3>
<pre class="programlisting"> “require-mppe” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, MPPE (Microsoft Point-to-Point Encrpytion) will be required for
+the PPP session. If either 64-bit or 128-bit MPPE is not available the
+session will fail. Note that MPPE is not used on mobile broadband
+connections.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1266,14 +1226,15 @@ with other setting configuration parameters</p>
<div class="refsect2">
<a name="NMSettingPPP--require-mppe-128"></a><h3>The <code class="literal">“require-mppe-128”</code> property</h3>
<pre class="programlisting"> “require-mppe-128” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, 128-bit MPPE (Microsoft Point-to-Point Encrpytion) will be
+required for the PPP session, and the "require-mppe" property must also
+be set to <code class="literal">TRUE</code>. If 128-bit MPPE is not available the session will fail.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingPPPOE.html b/docs/libnm-util/html/NMSettingPPPOE.html
index 97d3edde9..c7abaffe5 100644
--- a/docs/libnm-util/html/NMSettingPPPOE.html
+++ b/docs/libnm-util/html/NMSettingPPPOE.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingPPPOE</title>
+<title>NMSettingPPPOE: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingPPP.html" title="NMSettingPPP">
<link rel="next" href="NMSettingVPN.html" title="NMSettingVPN">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -193,7 +193,6 @@ nm_setting_pppoe_error_quark (<em class="parameter"><code><span class="type">voi
<div class="refsect3">
<a name="id-1.2.28.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingPPPOE.html" title="NMSettingPPPOE"><span class="type">NMSettingPPPOE</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -231,7 +230,6 @@ nm_setting_pppoe_get_service (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.28.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPPOE.html#NMSettingPPPOE--service" title="The “service” property"><span class="type">“service”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -257,7 +255,6 @@ nm_setting_pppoe_get_username (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.28.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPPOE.html#NMSettingPPPOE--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -283,7 +280,6 @@ nm_setting_pppoe_get_password (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.28.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPPPOE.html#NMSettingPPPOE--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -309,7 +305,6 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.28.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingPPPOE.html#NMSettingPPPOE--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -319,8 +314,6 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<a name="NM-SETTING-PPPOE-SETTING-NAME:CAPS"></a><h3>NM_SETTING_PPPOE_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_SETTING_NAME "pppoe"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -373,40 +366,30 @@ did not contain a required PPP setting for PPP related options</p>
<a name="NM-SETTING-PPPOE-ERROR:CAPS"></a><h3>NM_SETTING_PPPOE_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_ERROR nm_setting_pppoe_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-SERVICE:CAPS"></a><h3>NM_SETTING_PPPOE_SERVICE</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_SERVICE "service"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-USERNAME:CAPS"></a><h3>NM_SETTING_PPPOE_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-PASSWORD:CAPS"></a><h3>NM_SETTING_PPPOE_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_PPPOE_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -414,7 +397,7 @@ did not contain a required PPP setting for PPP related options</p>
<div class="refsect2">
<a name="NMSettingPPPOE--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Password used to authenticate with the PPPoE service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -422,7 +405,7 @@ did not contain a required PPP setting for PPP related options</p>
<div class="refsect2">
<a name="NMSettingPPPOE--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingPPPOE.html#NMSettingPPPOE--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -431,7 +414,10 @@ did not contain a required PPP setting for PPP related options</p>
<div class="refsect2">
<a name="NMSettingPPPOE--service"></a><h3>The <code class="literal">“service”</code> property</h3>
<pre class="programlisting"> “service” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, instruct PPPoE to only initiate sessions with access
+concentrators that provide the specified service. For most providers,
+this should be left blank. It is only required if there are multiple
+access concentrators or a specific service is known to be required.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -439,14 +425,13 @@ did not contain a required PPP setting for PPP related options</p>
<div class="refsect2">
<a name="NMSettingPPPOE--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Username used to authenticate with the PPPoE service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingSerial.html b/docs/libnm-util/html/NMSettingSerial.html
index 6e9ede6a4..43c21e9ed 100644
--- a/docs/libnm-util/html/NMSettingSerial.html
+++ b/docs/libnm-util/html/NMSettingSerial.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingSerial</title>
+<title>NMSettingSerial: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingBluetooth.html" title="NMSettingBluetooth">
<link rel="next" href="NMSettingCdma.html" title="NMSettingCdma">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -211,7 +211,6 @@ nm_setting_serial_error_quark (<em class="parameter"><code><span class="type">vo
<div class="refsect3">
<a name="id-1.2.9.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingSerial.html" title="NMSettingSerial"><span class="type">NMSettingSerial</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -249,7 +248,6 @@ nm_setting_serial_get_baud (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.9.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--baud" title="The “baud” property"><span class="type">“baud”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -275,7 +273,6 @@ nm_setting_serial_get_bits (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.9.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--bits" title="The “bits” property"><span class="type">“bits”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -301,7 +298,6 @@ nm_setting_serial_get_parity (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.9.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--parity" title="The “parity” property"><span class="type">“parity”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -327,7 +323,6 @@ nm_setting_serial_get_stopbits (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.9.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--stopbits" title="The “stopbits” property"><span class="type">“stopbits”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -353,7 +348,6 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.9.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--send-delay" title="The “send-delay” property"><span class="type">“send-delay”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -363,8 +357,6 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<a name="NM-SETTING-SERIAL-SETTING-NAME:CAPS"></a><h3>NM_SETTING_SERIAL_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_SETTING_NAME "serial"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -417,48 +409,36 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
<a name="NM-SETTING-SERIAL-ERROR:CAPS"></a><h3>NM_SETTING_SERIAL_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_ERROR nm_setting_serial_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-BAUD:CAPS"></a><h3>NM_SETTING_SERIAL_BAUD</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_BAUD "baud"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-BITS:CAPS"></a><h3>NM_SETTING_SERIAL_BITS</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_BITS "bits"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-PARITY:CAPS"></a><h3>NM_SETTING_SERIAL_PARITY</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_PARITY "parity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-STOPBITS:CAPS"></a><h3>NM_SETTING_SERIAL_STOPBITS</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_STOPBITS "stopbits"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-SEND-DELAY:CAPS"></a><h3>NM_SETTING_SERIAL_SEND_DELAY</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_SEND_DELAY "send-delay"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -466,7 +446,9 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
<div class="refsect2">
<a name="NMSettingSerial--baud"></a><h3>The <code class="literal">“baud”</code> property</h3>
<pre class="programlisting"> “baud” <span class="type">guint</span></pre>
-<p></p>
+<p>Speed to use for communication over the serial port. Note that this
+value usually has no effect for mobile broadband modems as they generally
+ignore speed settings and use the highest available speed.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 57600</p>
</div>
@@ -474,7 +456,7 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
<div class="refsect2">
<a name="NMSettingSerial--bits"></a><h3>The <code class="literal">“bits”</code> property</h3>
<pre class="programlisting"> “bits” <span class="type">guint</span></pre>
-<p></p>
+<p>Byte-width of the serial communication. The 8 in "8n1" for example.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [5,8]</p>
<p>Default value: 8</p>
@@ -483,7 +465,8 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
<div class="refsect2">
<a name="NMSettingSerial--parity"></a><h3>The <code class="literal">“parity”</code> property</h3>
<pre class="programlisting"> “parity” <span class="type">gchar</span></pre>
-<p></p>
+<p>Parity setting of the serial port. Either 'E' for even parity, 'o' for
+odd parity, or 'n' for no parity.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [69,111]</p>
<p>Default value: 110</p>
@@ -492,7 +475,7 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
<div class="refsect2">
<a name="NMSettingSerial--send-delay"></a><h3>The <code class="literal">“send-delay”</code> property</h3>
<pre class="programlisting"> “send-delay” <span class="type">guint64</span></pre>
-<p></p>
+<p>Time to delay between each byte sent to the modem, in microseconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -500,7 +483,8 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
<div class="refsect2">
<a name="NMSettingSerial--stopbits"></a><h3>The <code class="literal">“stopbits”</code> property</h3>
<pre class="programlisting"> “stopbits” <span class="type">guint</span></pre>
-<p></p>
+<p>Number of stop bits for communication on the serial port. Either 1 or 2.
+The 1 in "8n1" for example.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [1,2]</p>
<p>Default value: 1</p>
@@ -508,7 +492,6 @@ setting requires the connection to contain an <a class="link" href="NMSettingPPP
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingTeam.html b/docs/libnm-util/html/NMSettingTeam.html
index fb7ee6a77..2e40a312b 100644
--- a/docs/libnm-util/html/NMSettingTeam.html
+++ b/docs/libnm-util/html/NMSettingTeam.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingTeam</title>
+<title>NMSettingTeam: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingBridgePort.html" title="NMSettingBridgePort">
<link rel="next" href="NMSettingTeamPort.html" title="NMSettingTeamPort">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -158,9 +158,8 @@ nm_setting_team_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.2.16.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingTeam.html" title="NMSettingTeam"><span class="type">NMSettingTeam</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -173,7 +172,7 @@ nm_setting_team_new (<em class="parameter"><code><span class="type">void</span><
<p> the new empty <a class="link" href="NMSettingTeam.html" title="NMSettingTeam"><span class="type">NMSettingTeam</span></a> object. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -198,9 +197,8 @@ nm_setting_team_get_interface_name (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.16.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingTeam.html#NMSettingTeam--interface-name" title="The “interface-name” property"><span class="type">“interface-name”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -225,9 +223,8 @@ nm_setting_team_get_config (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.16.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingTeam.html#NMSettingTeam--config" title="The “config” property"><span class="type">“config”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -236,8 +233,6 @@ nm_setting_team_get_config (<em class="parameter"><code><a class="link" href="NM
<a name="NM-SETTING-TEAM-SETTING-NAME:CAPS"></a><h3>NM_SETTING_TEAM_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_SETTING_NAME "team"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -282,24 +277,18 @@ required</p>
<a name="NM-SETTING-TEAM-ERROR:CAPS"></a><h3>NM_SETTING_TEAM_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_ERROR nm_setting_team_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-TEAM-INTERFACE-NAME:CAPS"></a><h3>NM_SETTING_TEAM_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_INTERFACE_NAME "interface-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-TEAM-CONFIG:CAPS"></a><h3>NM_SETTING_TEAM_CONFIG</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_CONFIG "config"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -307,7 +296,10 @@ required</p>
<div class="refsect2">
<a name="NMSettingTeam--config"></a><h3>The <code class="literal">“config”</code> property</h3>
<pre class="programlisting"> “config” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The JSON configuration for the team network interface. The property
+should contain raw JSON configuration data suitable for teamd, because
+the value is passed directly to teamd. If not specified, the default
+configuration is used. See man teamd.conf for the format details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -315,14 +307,13 @@ required</p>
<div class="refsect2">
<a name="NMSettingTeam--interface-name"></a><h3>The <code class="literal">“interface-name”</code> property</h3>
<pre class="programlisting"> “interface-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the virtual in-kernel team network interface</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingTeamPort.html b/docs/libnm-util/html/NMSettingTeamPort.html
index f29e7b880..c08a4eb0a 100644
--- a/docs/libnm-util/html/NMSettingTeamPort.html
+++ b/docs/libnm-util/html/NMSettingTeamPort.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingTeamPort</title>
+<title>NMSettingTeamPort: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingTeam.html" title="NMSettingTeam">
<link rel="next" href="NMSettingGeneric.html" title="NMSettingGeneric">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -139,9 +139,8 @@ nm_setting_team_port_error_quark (<em class="parameter"><code><span class="type"
<div class="refsect3">
<a name="id-1.2.17.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingTeamPort.html" title="NMSettingTeamPort"><span class="type">NMSettingTeamPort</span></a> errors.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -154,7 +153,7 @@ nm_setting_team_port_new (<em class="parameter"><code><span class="type">void</s
<p> the new empty <a class="link" href="NMSettingTeamPort.html" title="NMSettingTeamPort"><span class="type">NMSettingTeamPort</span></a> object. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -179,9 +178,8 @@ nm_setting_team_port_get_config (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.2.17.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingTeamPort.html#NMSettingTeamPort--config" title="The “config” property"><span class="type">“config”</span></a> property of the setting</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -190,8 +188,6 @@ nm_setting_team_port_get_config (<em class="parameter"><code><a class="link" hre
<a name="NM-SETTING-TEAM-PORT-SETTING-NAME:CAPS"></a><h3>NM_SETTING_TEAM_PORT_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_PORT_SETTING_NAME "team-port"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -236,16 +232,12 @@ is required</p>
<a name="NM-SETTING-TEAM-PORT-ERROR:CAPS"></a><h3>NM_SETTING_TEAM_PORT_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_PORT_ERROR nm_setting_team_port_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-TEAM-PORT-CONFIG:CAPS"></a><h3>NM_SETTING_TEAM_PORT_CONFIG</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_PORT_CONFIG "config"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -253,14 +245,16 @@ is required</p>
<div class="refsect2">
<a name="NMSettingTeamPort--config"></a><h3>The <code class="literal">“config”</code> property</h3>
<pre class="programlisting"> “config” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The JSON configuration for the team port. The property should contain raw
+JSON configuration data suitable for teamd, because the value is passed
+directly to teamd. If not specified, the default configuration is
+used. See man teamd.conf for the format details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingVPN.html b/docs/libnm-util/html/NMSettingVPN.html
index 52bf704f6..7f44ba65a 100644
--- a/docs/libnm-util/html/NMSettingVPN.html
+++ b/docs/libnm-util/html/NMSettingVPN.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingVPN</title>
+<title>NMSettingVPN: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingPPPOE.html" title="NMSettingPPPOE">
<link rel="next" href="libnm-util-nm-utils.html" title="nm-utils">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -284,7 +284,6 @@ nm_setting_vpn_error_quark (<em class="parameter"><code><span class="type">void<
<div class="refsect3">
<a name="id-1.2.29.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingVPN.html" title="NMSettingVPN"><span class="type">NMSettingVPN</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -360,7 +359,6 @@ plugin that should be used to connect to this VPN.</p>
<div class="refsect3">
<a name="id-1.2.29.9.5.6"></a><h4>Returns</h4>
<p> the VPN plugin's service name</p>
-<p></p>
</div>
</div>
<hr>
@@ -386,7 +384,6 @@ nm_setting_vpn_get_user_name (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.29.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVPN.html#NMSettingVPN--user-name" title="The “user-name” property"><span class="type">“user-name”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -412,7 +409,6 @@ nm_setting_vpn_get_persistent (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.29.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVPN.html#NMSettingVPN--persistent" title="The “persistent” property"><span class="type">“persistent”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -439,7 +435,6 @@ nm_setting_vpn_get_num_data_items (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.2.29.9.8.6"></a><h4>Returns</h4>
<p> the number of VPN plugin specific configuration data items</p>
-<p></p>
</div>
</div>
<hr>
@@ -517,7 +512,6 @@ by <a class="link" href="NMSettingVPN.html#nm-setting-vpn-add-data-item" title="
<div class="refsect3">
<a name="id-1.2.29.9.10.6"></a><h4>Returns</h4>
<p> the data item, if any</p>
-<p></p>
</div>
</div>
<hr>
@@ -554,7 +548,6 @@ nm_setting_vpn_remove_data_item (<em class="parameter"><code><a class="link" hre
<a name="id-1.2.29.9.11.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the data item was found and removed from the internal list,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -621,7 +614,6 @@ nm_setting_vpn_get_num_secrets (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.29.9.13.6"></a><h4>Returns</h4>
<p> the number of VPN plugin specific secrets</p>
-<p></p>
</div>
</div>
<hr>
@@ -698,7 +690,6 @@ by <a class="link" href="NMSettingVPN.html#nm-setting-vpn-add-secret" title="nm_
<div class="refsect3">
<a name="id-1.2.29.9.15.6"></a><h4>Returns</h4>
<p> the secret, if any</p>
-<p></p>
</div>
</div>
<hr>
@@ -735,7 +726,6 @@ nm_setting_vpn_remove_secret (<em class="parameter"><code><a class="link" href="
<a name="id-1.2.29.9.16.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secret was found and removed from the internal list,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -785,8 +775,6 @@ iteration will not be part of the iteration.</p>
<a name="NM-SETTING-VPN-SETTING-NAME:CAPS"></a><h3>NM_SETTING_VPN_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VPN_SETTING_NAME "vpn"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -831,48 +819,36 @@ required</p>
<a name="NM-SETTING-VPN-ERROR:CAPS"></a><h3>NM_SETTING_VPN_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_VPN_ERROR nm_setting_vpn_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-SERVICE-TYPE:CAPS"></a><h3>NM_SETTING_VPN_SERVICE_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_VPN_SERVICE_TYPE "service-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-USER-NAME:CAPS"></a><h3>NM_SETTING_VPN_USER_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VPN_USER_NAME "user-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-PERSISTENT:CAPS"></a><h3>NM_SETTING_VPN_PERSISTENT</h3>
<pre class="programlisting">#define NM_SETTING_VPN_PERSISTENT "persistent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-DATA:CAPS"></a><h3>NM_SETTING_VPN_DATA</h3>
<pre class="programlisting">#define NM_SETTING_VPN_DATA "data"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-SECRETS:CAPS"></a><h3>NM_SETTING_VPN_SECRETS</h3>
<pre class="programlisting">#define NM_SETTING_VPN_SECRETS "secrets"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -880,14 +856,17 @@ required</p>
<div class="refsect2">
<a name="NMSettingVPN--data"></a><h3>The <code class="literal">“data”</code> property</h3>
<pre class="programlisting"> “data” <span class="type">GHashTable_gchararray+gchararray_*</span></pre>
-<p></p>
+<p>Dictionary of key/value pairs of VPN plugin specific data. Both keys and
+values must be strings.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVPN--persistent"></a><h3>The <code class="literal">“persistent”</code> property</h3>
<pre class="programlisting"> “persistent” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If the VPN service supports persistence, and this property is <code class="literal">TRUE</code>,
+the VPN will attempt to stay connected across link changes and outages,
+until explicitly disconnected.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -895,14 +874,17 @@ required</p>
<div class="refsect2">
<a name="NMSettingVPN--secrets"></a><h3>The <code class="literal">“secrets”</code> property</h3>
<pre class="programlisting"> “secrets” <span class="type">GHashTable_gchararray+gchararray_*</span></pre>
-<p></p>
+<p>Dictionary of key/value pairs of VPN plugin specific secrets like
+passwords or private keys. Both keys and values must be strings.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVPN--service-type"></a><h3>The <code class="literal">“service-type”</code> property</h3>
<pre class="programlisting"> “service-type” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>D-Bus service name of the VPN plugin that this setting uses to connect to
+its network. i.e. org.freedesktop.NetworkManager.vpnc for the vpnc
+plugin.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -910,14 +892,18 @@ required</p>
<div class="refsect2">
<a name="NMSettingVPN--user-name"></a><h3>The <code class="literal">“user-name”</code> property</h3>
<pre class="programlisting"> “user-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the VPN connection requires a user name for authentication, that name
+should be provided here. If the connection is available to more than one
+user, and the VPN requires each user to supply a different name, then
+leave this property empty. If this property is empty, NetworkManager
+will automatically supply the username of the user which requested the
+VPN connection.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingVlan.html b/docs/libnm-util/html/NMSettingVlan.html
index be7914172..35e0e7a94 100644
--- a/docs/libnm-util/html/NMSettingVlan.html
+++ b/docs/libnm-util/html/NMSettingVlan.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingVlan</title>
+<title>NMSettingVlan: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingInfiniband.html" title="NMSettingInfiniband">
<link rel="next" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -286,7 +286,6 @@ nm_setting_vlan_error_quark (<em class="parameter"><code><span class="type">void
<div class="refsect3">
<a name="id-1.2.20.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingVlan.html" title="NMSettingVlan"><span class="type">NMSettingVlan</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -324,7 +323,6 @@ nm_setting_vlan_get_interface_name (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.20.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--interface-name" title="The “interface-name” property"><span class="type">“interface_name”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -350,7 +348,6 @@ nm_setting_vlan_get_parent (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.20.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--parent" title="The “parent” property"><span class="type">“parent”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -376,7 +373,6 @@ nm_setting_vlan_get_id (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.2.20.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--id" title="The “id” property"><span class="type">“id”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -402,7 +398,6 @@ nm_setting_vlan_get_flags (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.20.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--flags" title="The “flags” property"><span class="type">“flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -439,7 +434,6 @@ properties of this setting.</p>
<div class="refsect3">
<a name="id-1.2.20.9.8.6"></a><h4>Returns</h4>
<p> return the number of ingress/egress priority entries, -1 if error</p>
-<p></p>
</div>
</div>
<hr>
@@ -493,7 +487,6 @@ or <a class="link" href="NMSettingVlan.html#NMSettingVlan--egress-priority-map"
<div class="refsect3">
<a name="id-1.2.20.9.9.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if a priority map was returned, <code class="literal">FALSE</code> if error</p>
-<p></p>
</div>
</div>
<hr>
@@ -558,7 +551,6 @@ to</p></td>
<a name="id-1.2.20.9.10.8"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the new priority mapping was successfully added to the
list, <code class="literal">FALSE</code> if error</p>
-<p></p>
</div>
</div>
<hr>
@@ -652,9 +644,8 @@ to</p></td>
<div class="refsect3">
<a name="id-1.2.20.9.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the priority mapping was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -699,9 +690,8 @@ properties.</p>
<div class="refsect3">
<a name="id-1.2.20.9.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the priority mapping was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -775,7 +765,6 @@ the Linux SKB priorities to 802.1p priorities.</p>
<a name="id-1.2.20.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the entry was successfully added to the list, or it
overwrote the old value, <code class="literal">FALSE</code> if error</p>
-<p></p>
</div>
</div>
</div>
@@ -785,8 +774,6 @@ overwrote the old value, <code class="literal">FALSE</code> if error</p>
<a name="NM-SETTING-VLAN-SETTING-NAME:CAPS"></a><h3>NM_SETTING_VLAN_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_SETTING_NAME "vlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -839,56 +826,42 @@ overwrote the old value, <code class="literal">FALSE</code> if error</p>
<a name="NM-SETTING-VLAN-ERROR:CAPS"></a><h3>NM_SETTING_VLAN_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_ERROR nm_setting_vlan_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-INTERFACE-NAME:CAPS"></a><h3>NM_SETTING_VLAN_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_INTERFACE_NAME "interface-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-PARENT:CAPS"></a><h3>NM_SETTING_VLAN_PARENT</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_PARENT "parent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-ID:CAPS"></a><h3>NM_SETTING_VLAN_ID</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_ID "id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-FLAGS:CAPS"></a><h3>NM_SETTING_VLAN_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_FLAGS "flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-INGRESS-PRIORITY-MAP:CAPS"></a><h3>NM_SETTING_VLAN_INGRESS_PRIORITY_MAP</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_INGRESS_PRIORITY_MAP "ingress-priority-map"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-EGRESS-PRIORITY-MAP:CAPS"></a><h3>NM_SETTING_VLAN_EGRESS_PRIORITY_MAP</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_EGRESS_PRIORITY_MAP "egress-priority-map"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -970,14 +943,20 @@ to 802.1p priorities used in VLANs.</p>
<div class="refsect2">
<a name="NMSettingVlan--egress-priority-map"></a><h3>The <code class="literal">“egress-priority-map”</code> property</h3>
<pre class="programlisting"> “egress-priority-map” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>For outgoing packets, a list of mappings from Linux SKB priorities to
+802.1p priorities. The mapping is given in the format "from:to" where
+both "from" and "to" are unsigned integers, ie "7:3".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVlan--flags"></a><h3>The <code class="literal">“flags”</code> property</h3>
<pre class="programlisting"> “flags” <span class="type">guint</span></pre>
-<p></p>
+<p>One or more flags which control the behavior and features of the VLAN
+interface. Flags include <a class="link" href="NMSettingVlan.html#NM-VLAN-FLAG-REORDER-HEADERS:CAPS"><code class="literal">NM_VLAN_FLAG_REORDER_HEADERS</code></a> (reordering of
+output packet headers), <a class="link" href="NMSettingVlan.html#NM-VLAN-FLAG-GVRP:CAPS"><code class="literal">NM_VLAN_FLAG_GVRP</code></a> (use of the GVRP protocol),
+and <a class="link" href="NMSettingVlan.html#NM-VLAN-FLAG-LOOSE-BINDING:CAPS"><code class="literal">NM_VLAN_FLAG_LOOSE_BINDING</code></a> (loose binding of the interface to its
+master device's operating state).</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -985,7 +964,8 @@ to 802.1p priorities used in VLANs.</p>
<div class="refsect2">
<a name="NMSettingVlan--id"></a><h3>The <code class="literal">“id”</code> property</h3>
<pre class="programlisting"> “id” <span class="type">guint</span></pre>
-<p></p>
+<p>The VLAN identifier that the interface created by this connection should
+be assigned.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 4095</p>
<p>Default value: 0</p>
@@ -994,14 +974,20 @@ to 802.1p priorities used in VLANs.</p>
<div class="refsect2">
<a name="NMSettingVlan--ingress-priority-map"></a><h3>The <code class="literal">“ingress-priority-map”</code> property</h3>
<pre class="programlisting"> “ingress-priority-map” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>For incoming packets, a list of mappings from 802.1p priorities to Linux
+SKB priorities. The mapping is given in the format "from:to" where both
+"from" and "to" are unsigned integers, ie "7:3".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVlan--interface-name"></a><h3>The <code class="literal">“interface-name”</code> property</h3>
<pre class="programlisting"> “interface-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If given, specifies the kernel name of the VLAN interface. If not given,
+a default name will be constructed from the interface described by the
+parent interface and the <a class="link" href="NMSettingVlan.html#NMSettingVlan--id" title="The “id” property"><span class="type">“id”</span></a> property, eg "eth2.1". The
+parent interface may be given by the <a class="link" href="NMSettingVlan.html#NMSettingVlan--parent" title="The “parent” property"><span class="type">“parent”</span></a> property or by
+the <a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of an <a class="link" href="NMSettingWired.html" title="NMSettingWired"><span class="type">NMSettingWired</span></a> setting.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
@@ -1009,14 +995,16 @@ to 802.1p priorities used in VLANs.</p>
<div class="refsect2">
<a name="NMSettingVlan--parent"></a><h3>The <code class="literal">“parent”</code> property</h3>
<pre class="programlisting"> “parent” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If given, specifies the parent interface name or parent connection UUID
+from which this VLAN interface should be created. If this property is
+not specified, the connection must contain an <a class="link" href="NMSettingWired.html" title="NMSettingWired"><span class="type">NMSettingWired</span></a> setting
+with a <a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingWimax.html b/docs/libnm-util/html/NMSettingWimax.html
index 6d0035fbb..1b10df760 100644
--- a/docs/libnm-util/html/NMSettingWimax.html
+++ b/docs/libnm-util/html/NMSettingWimax.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingWimax</title>
+<title>NMSettingWimax: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingGsm.html" title="NMSettingGsm">
<link rel="next" href="NMSettingBond.html" title="NMSettingBond">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -158,7 +158,6 @@ nm_setting_wimax_error_quark (<em class="parameter"><code><span class="type">voi
<div class="refsect3">
<a name="id-1.2.12.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingWimax.html" title="NMSettingWimax"><span class="type">NMSettingWimax</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -170,7 +169,6 @@ nm_setting_wimax_new (<em class="parameter"><code><span class="type">void</span>
<div class="refsect3">
<a name="id-1.2.12.9.3.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingWimax.html" title="NMSettingWimax"><span class="type">NMSettingWimax</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -198,7 +196,6 @@ specific WiMAX network this setting describes a connection to.</p>
<div class="refsect3">
<a name="id-1.2.12.9.4.6"></a><h4>Returns</h4>
<p> the WiMAX NSP name</p>
-<p></p>
</div>
</div>
<hr>
@@ -226,7 +223,6 @@ to.</p>
<div class="refsect3">
<a name="id-1.2.12.9.5.6"></a><h4>Returns</h4>
<p> the MAC address</p>
-<p></p>
</div>
</div>
</div>
@@ -236,8 +232,6 @@ to.</p>
<a name="NM-SETTING-WIMAX-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIMAX_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_SETTING_NAME "wimax"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -282,24 +276,18 @@ required</p>
<a name="NM-SETTING-WIMAX-ERROR:CAPS"></a><h3>NM_SETTING_WIMAX_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_ERROR nm_setting_wimax_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIMAX-NETWORK-NAME:CAPS"></a><h3>NM_SETTING_WIMAX_NETWORK_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_NETWORK_NAME "network-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIMAX-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIMAX_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -307,21 +295,23 @@ required</p>
<div class="refsect2">
<a name="NMSettingWimax--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the WiMAX device whose
+MAC address matches. This property does not change the MAC address of the
+device (known as MAC spoofing).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWimax--network-name"></a><h3>The <code class="literal">“network-name”</code> property</h3>
<pre class="programlisting"> “network-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Network Service Provider (NSP) name of the WiMAX network this connection
+should use.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingWired.html b/docs/libnm-util/html/NMSettingWired.html
index 3b0bfc3f1..75184b1b3 100644
--- a/docs/libnm-util/html/NMSettingWired.html
+++ b/docs/libnm-util/html/NMSettingWired.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingWired</title>
+<title>NMSettingWired: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingConnection.html" title="NMSettingConnection">
<link rel="next" href="NMSettingWireless.html" title="NMSettingWireless">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -396,7 +396,6 @@ nm_setting_wired_error_quark (<em class="parameter"><code><span class="type">voi
<div class="refsect3">
<a name="id-1.2.5.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingWired.html" title="NMSettingWired"><span class="type">NMSettingWired</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -434,7 +433,6 @@ nm_setting_wired_get_port (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.2.5.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--port" title="The “port” property"><span class="type">“port”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -460,7 +458,6 @@ nm_setting_wired_get_speed (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.2.5.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--speed" title="The “speed” property"><span class="type">“speed”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -486,7 +483,6 @@ nm_setting_wired_get_duplex (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.2.5.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--duplex" title="The “duplex” property"><span class="type">“duplex”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -512,7 +508,6 @@ nm_setting_wired_get_auto_negotiate (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.5.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--auto-negotiate" title="The “auto-negotiate” property"><span class="type">“auto-negotiate”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -538,7 +533,6 @@ nm_setting_wired_get_mac_address (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.5.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -565,7 +559,6 @@ nm_setting_wired_get_cloned_mac_address
<div class="refsect3">
<a name="id-1.2.5.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--cloned-mac-address" title="The “cloned-mac-address” property"><span class="type">“cloned-mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -620,9 +613,8 @@ nm_setting_wired_get_num_mac_blacklist_items
<div class="refsect3">
<a name="id-1.2.5.9.11.5"></a><h4>Returns</h4>
<p> the number of blacklisted MAC addresses</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -658,9 +650,8 @@ nm_setting_wired_get_mac_blacklist_item
<p> the blacklisted MAC address string (hex-digits-and-colons notation)
at index <em class="parameter"><code>idx</code></em>
</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -696,9 +687,8 @@ nm_setting_wired_add_mac_blacklist_item
<a name="id-1.2.5.9.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was added; <code class="literal">FALSE</code> if the MAC address
is invalid or was already present</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -731,7 +721,7 @@ nm_setting_wired_remove_mac_blacklist_item
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -768,9 +758,8 @@ the blacklist</p></td>
<div class="refsect3">
<a name="id-1.2.5.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -794,7 +783,7 @@ nm_setting_wired_clear_mac_blacklist_items
</tr></tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -819,7 +808,6 @@ nm_setting_wired_get_mtu (<em class="parameter"><code><a class="link" href="NMSe
<div class="refsect3">
<a name="id-1.2.5.9.17.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -877,7 +865,6 @@ of 'qeth', 'lcs', or 'ctc'.</p>
<div class="refsect3">
<a name="id-1.2.5.9.19.6"></a><h4>Returns</h4>
<p> the s390 device type</p>
-<p></p>
</div>
</div>
<hr>
@@ -906,7 +893,6 @@ option individually using <a class="link" href="NMSettingWired.html#nm-setting-w
<div class="refsect3">
<a name="id-1.2.5.9.20.6"></a><h4>Returns</h4>
<p> the number of s390-specific device options</p>
-<p></p>
</div>
</div>
<hr>
@@ -962,7 +948,6 @@ option; this value is owned by the setting and should not be modified. </p></td>
<p> <code class="literal">TRUE</code> on success if the index was valid and an option was found,
<code class="literal">FALSE</code> if the index was invalid (ie, greater than the number of options
currently held by the setting)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1001,7 +986,6 @@ nm_setting_wired_get_s390_option_by_key
<a name="id-1.2.5.9.22.6"></a><h4>Returns</h4>
<p> the value, or <code class="literal">NULL</code> if the key/value pair was never added to the
setting; the value is owned by the setting and must not be modified</p>
-<p></p>
</div>
</div>
<hr>
@@ -1046,7 +1030,6 @@ may already exist.</p>
<a name="id-1.2.5.9.23.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was valid and was added to the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1084,7 +1067,6 @@ list.</p>
<a name="id-1.2.5.9.24.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was found and removed from the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1114,7 +1096,7 @@ nm_setting_wired_get_valid_s390_options
<p> a <code class="literal">NULL</code>-terminated array of strings of valid s390 options. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -1123,8 +1105,6 @@ nm_setting_wired_get_valid_s390_options
<a name="NM-SETTING-WIRED-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIRED_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_SETTING_NAME "802-3-ethernet"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1169,96 +1149,72 @@ required</p>
<a name="NM-SETTING-WIRED-ERROR:CAPS"></a><h3>NM_SETTING_WIRED_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_ERROR nm_setting_wired_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-PORT:CAPS"></a><h3>NM_SETTING_WIRED_PORT</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_PORT "port"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-SPEED:CAPS"></a><h3>NM_SETTING_WIRED_SPEED</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_SPEED "speed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-DUPLEX:CAPS"></a><h3>NM_SETTING_WIRED_DUPLEX</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_DUPLEX "duplex"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-AUTO-NEGOTIATE:CAPS"></a><h3>NM_SETTING_WIRED_AUTO_NEGOTIATE</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_AUTO_NEGOTIATE "auto-negotiate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRED_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-CLONED-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRED_CLONED_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_CLONED_MAC_ADDRESS "cloned-mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-MAC-ADDRESS-BLACKLIST:CAPS"></a><h3>NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST "mac-address-blacklist"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-MTU:CAPS"></a><h3>NM_SETTING_WIRED_MTU</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-S390-SUBCHANNELS:CAPS"></a><h3>NM_SETTING_WIRED_S390_SUBCHANNELS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_S390_SUBCHANNELS "s390-subchannels"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-S390-NETTYPE:CAPS"></a><h3>NM_SETTING_WIRED_S390_NETTYPE</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_S390_NETTYPE "s390-nettype"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-S390-OPTIONS:CAPS"></a><h3>NM_SETTING_WIRED_S390_OPTIONS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_S390_OPTIONS "s390-options"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1266,7 +1222,9 @@ required</p>
<div class="refsect2">
<a name="NMSettingWired--auto-negotiate"></a><h3>The <code class="literal">“auto-negotiate”</code> property</h3>
<pre class="programlisting"> “auto-negotiate” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, allow auto-negotiation of port speed and duplex mode. If
+<code class="literal">FALSE</code>, do not allow auto-negotiation, in which case the "speed" and
+"duplex" properties should be set.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -1274,14 +1232,16 @@ required</p>
<div class="refsect2">
<a name="NMSettingWired--cloned-mac-address"></a><h3>The <code class="literal">“cloned-mac-address”</code> property</h3>
<pre class="programlisting"> “cloned-mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, request that the device use this MAC address instead of its
+permanent MAC address. This is known as MAC cloning or spoofing.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--duplex"></a><h3>The <code class="literal">“duplex”</code> property</h3>
<pre class="programlisting"> “duplex” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, request that the device only use the specified duplex mode.
+Either "half" or "full".</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1289,21 +1249,27 @@ required</p>
<div class="refsect2">
<a name="NMSettingWired--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the Ethernet device
+whose permanent MAC address matches. This property does not change the
+MAC address of the device (i.e. MAC spoofing).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--mac-address-blacklist"></a><h3>The <code class="literal">“mac-address-blacklist”</code> property</h3>
<pre class="programlisting"> “mac-address-blacklist” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>If specified, this connection will never apply to the Ethernet device
+whose permanent MAC address matches an address in the list. Each MAC
+address is in the standard hex-digits-and-colons notation
+(00:11:22:33:44:55).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, only transmit packets of the specified size or smaller,
+breaking larger packets up into multiple Ethernet frames.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1311,7 +1277,10 @@ required</p>
<div class="refsect2">
<a name="NMSettingWired--port"></a><h3>The <code class="literal">“port”</code> property</h3>
<pre class="programlisting"> “port” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Specific port type to use if multiple the device supports multiple
+attachment methods. One of "tp" (Twisted Pair), "aui" (Attachment Unit
+Interface), "bnc" (Thin Ethernet) or "mii" (Media Independent Interface.
+If the device supports only one port type, this setting is ignored.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1319,7 +1288,8 @@ required</p>
<div class="refsect2">
<a name="NMSettingWired--s390-nettype"></a><h3>The <code class="literal">“s390-nettype”</code> property</h3>
<pre class="programlisting"> “s390-nettype” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>s390 network device type; one of "qeth", "lcs", or "ctc", representing
+the different types of virtual network devices available on s390 systems.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1327,28 +1297,37 @@ required</p>
<div class="refsect2">
<a name="NMSettingWired--s390-options"></a><h3>The <code class="literal">“s390-options”</code> property</h3>
<pre class="programlisting"> “s390-options” <span class="type">GHashTable_gchararray+gchararray_*</span></pre>
-<p></p>
+<p>Dictionary of key/value pairs of s390-specific device options. Both keys
+and values must be strings. Allowed keys include "portno", "layer2",
+"portname", "protocol", among others. Key names must contain only
+alphanumeric characters (ie, [a-zA-Z0-9]).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--s390-subchannels"></a><h3>The <code class="literal">“s390-subchannels”</code> property</h3>
<pre class="programlisting"> “s390-subchannels” <span class="type">GPtrArray_gchararray_</span> *</pre>
-<p></p>
+<p>Identifies specific subchannels that this network device uses for
+communication with z/VM or s390 host. Like the
+<a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property for non-z/VM devices, this property
+can be used to ensure this connection only applies to the network device
+that uses these subchannels. The list should contain exactly 3 strings,
+and each string may only be composed of hexadecimal characters and the
+period (.) character.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--speed"></a><h3>The <code class="literal">“speed”</code> property</h3>
<pre class="programlisting"> “speed” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, request that the device use only the specified speed. In
+Mbit/s, ie 100 == 100Mbit/s.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingWireless.html b/docs/libnm-util/html/NMSettingWireless.html
index f668698ae..4642d6217 100644
--- a/docs/libnm-util/html/NMSettingWireless.html
+++ b/docs/libnm-util/html/NMSettingWireless.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingWireless</title>
+<title>NMSettingWireless: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingWired.html" title="NMSettingWired">
<link rel="next" href="NMSettingWirelessSecurity.html" title="NMSettingWirelessSecurity">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -445,7 +445,6 @@ nm_setting_wireless_error_quark (<em class="parameter"><code><span class="type">
<div class="refsect3">
<a name="id-1.2.6.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingWireless.html" title="NMSettingWireless"><span class="type">NMSettingWireless</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -483,7 +482,6 @@ nm_setting_wireless_get_ssid (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.6.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--ssid" title="The “ssid” property"><span class="type">“ssid”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -509,7 +507,6 @@ nm_setting_wireless_get_mode (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.6.9.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mode" title="The “mode” property"><span class="type">“mode”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -535,7 +532,6 @@ nm_setting_wireless_get_band (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.6.9.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--band" title="The “band” property"><span class="type">“band”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -561,7 +557,6 @@ nm_setting_wireless_get_channel (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.2.6.9.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--channel" title="The “channel” property"><span class="type">“channel”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -587,7 +582,6 @@ nm_setting_wireless_get_bssid (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.2.6.9.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--bssid" title="The “bssid” property"><span class="type">“bssid”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -613,7 +607,6 @@ nm_setting_wireless_get_rate (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.2.6.9.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--rate" title="The “rate” property"><span class="type">“rate”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -639,7 +632,6 @@ nm_setting_wireless_get_tx_power (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.2.6.9.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--tx-power" title="The “tx-power” property"><span class="type">“tx-power”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -665,7 +657,6 @@ nm_setting_wireless_get_mac_address (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.2.6.9.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -692,7 +683,6 @@ nm_setting_wireless_get_cloned_mac_address
<div class="refsect3">
<a name="id-1.2.6.9.12.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--cloned-mac-address" title="The “cloned-mac-address” property"><span class="type">“cloned-mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -747,9 +737,8 @@ nm_setting_wireless_get_num_mac_blacklist_items
<div class="refsect3">
<a name="id-1.2.6.9.14.5"></a><h4>Returns</h4>
<p> the number of blacklisted MAC addresses</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -785,9 +774,8 @@ nm_setting_wireless_get_mac_blacklist_item
<p> the blacklisted MAC address string (hex-digits-and-colons notation)
at index <em class="parameter"><code>idx</code></em>
</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -823,9 +811,8 @@ nm_setting_wireless_add_mac_blacklist_item
<a name="id-1.2.6.9.16.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was added; <code class="literal">FALSE</code> if the MAC address
is invalid or was already present</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -858,7 +845,7 @@ nm_setting_wireless_remove_mac_blacklist_item
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -895,9 +882,8 @@ the blacklist</p></td>
<div class="refsect3">
<a name="id-1.2.6.9.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -921,7 +907,7 @@ nm_setting_wireless_clear_mac_blacklist_items
</tr></tbody>
</table></div>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -946,7 +932,6 @@ nm_setting_wireless_get_mtu (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.2.6.9.20.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -972,7 +957,6 @@ nm_setting_wireless_get_hidden (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.2.6.9.21.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--hidden" title="The “hidden” property"><span class="type">“hidden”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1011,7 +995,6 @@ not be preserved.</p>
<a name="id-1.2.6.9.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>bssid</code></em>
was already known, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1038,7 +1021,6 @@ nm_setting_wireless_get_num_seen_bssids
<div class="refsect3">
<a name="id-1.2.6.9.23.5"></a><h4>Returns</h4>
<p> the number of BSSIDs in the previously seen BSSID list</p>
-<p></p>
</div>
</div>
<hr>
@@ -1073,7 +1055,6 @@ nm_setting_wireless_get_seen_bssid (<em class="parameter"><code><a class="link"
<a name="id-1.2.6.9.24.5"></a><h4>Returns</h4>
<p> the BSSID at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1141,7 +1122,6 @@ capabilities</p></td>
<a name="id-1.2.6.9.25.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the given settings are compatible with the access point's
security flags and mode, <code class="literal">FALSE</code> if they are not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1172,7 +1152,6 @@ the presence of NM_SETTING_WIRELESS_SECURITY_SETTING_NAME in the connection.</p>
<div class="refsect3">
<a name="id-1.2.6.9.26.6"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--security" title="The “security” property"><span class="type">“security”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -1182,8 +1161,6 @@ the presence of NM_SETTING_WIRELESS_SECURITY_SETTING_NAME in the connection.</p>
<a name="NM-SETTING-WIRELESS-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIRELESS_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SETTING_NAME "802-11-wireless"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1244,120 +1221,90 @@ set to a value that requires the <a class="link" href="NMSettingWireless.html#NM
<a name="NM-SETTING-WIRELESS-ERROR:CAPS"></a><h3>NM_SETTING_WIRELESS_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_ERROR nm_setting_wireless_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SSID:CAPS"></a><h3>NM_SETTING_WIRELESS_SSID</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SSID "ssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MODE:CAPS"></a><h3>NM_SETTING_WIRELESS_MODE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-BAND:CAPS"></a><h3>NM_SETTING_WIRELESS_BAND</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_BAND "band"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-CHANNEL:CAPS"></a><h3>NM_SETTING_WIRELESS_CHANNEL</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_CHANNEL "channel"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-BSSID:CAPS"></a><h3>NM_SETTING_WIRELESS_BSSID</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_BSSID "bssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-RATE:CAPS"></a><h3>NM_SETTING_WIRELESS_RATE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_RATE "rate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-TX-POWER:CAPS"></a><h3>NM_SETTING_WIRELESS_TX_POWER</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_TX_POWER "tx-power"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRELESS_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-CLONED-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS "cloned-mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MAC-ADDRESS-BLACKLIST:CAPS"></a><h3>NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST "mac-address-blacklist"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MTU:CAPS"></a><h3>NM_SETTING_WIRELESS_MTU</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SEEN-BSSIDS:CAPS"></a><h3>NM_SETTING_WIRELESS_SEEN_BSSIDS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SEEN_BSSIDS "seen-bssids"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-HIDDEN:CAPS"></a><h3>NM_SETTING_WIRELESS_HIDDEN</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_HIDDEN "hidden"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SEC:CAPS"></a><h3>NM_SETTING_WIRELESS_SEC</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SEC "security"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1373,7 +1320,7 @@ set to a value that requires the <a class="link" href="NMSettingWireless.html#NM
</pre>
<p>Indicates AP/master mode where the wireless device is started as an access
point/hotspot.</p>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1389,7 +1336,12 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--band"></a><h3>The <code class="literal">“band”</code> property</h3>
<pre class="programlisting"> “band” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>802.11 frequency band of the network. One of "a" for 5GHz 802.11a or
+"bg" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network
+to the specific band, i.e. if "a" is specified, the device will not
+associate with the same network in the 2.4GHz band even if the network's
+settings are compatible. This setting depends on specific driver
+capability and may not work with all drivers.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1397,14 +1349,20 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--bssid"></a><h3>The <code class="literal">“bssid”</code> property</h3>
<pre class="programlisting"> “bssid” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, directs the device to only associate with the given access
+point. This capability is highly driver dependent and not supported by
+all devices. Note: this property does not control the BSSID used when
+creating an Ad-Hoc network and is unlikely to in the future.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--channel"></a><h3>The <code class="literal">“channel”</code> property</h3>
<pre class="programlisting"> “channel” <span class="type">guint</span></pre>
-<p></p>
+<p>Wireless channel to use for the Wi-Fi connection. The device will only
+join (or create for Ad-Hoc networks) a Wi-Fi network on the specified
+channel. Because channel numbers overlap between bands, this property
+also requires the "band" property to be set.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1412,14 +1370,19 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--cloned-mac-address"></a><h3>The <code class="literal">“cloned-mac-address”</code> property</h3>
<pre class="programlisting"> “cloned-mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, request that the Wi-Fi device use this MAC address instead
+of its permanent MAC address. This is known as MAC cloning or spoofing.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--hidden"></a><h3>The <code class="literal">“hidden”</code> property</h3>
<pre class="programlisting"> “hidden” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, indicates this network is a non-broadcasting network that hides
+its SSID. In this case various workarounds may take place, such as
+probe-scanning the SSID for more reliable network discovery. However,
+these workarounds expose inherent insecurities with hidden SSID networks,
+and thus hidden SSID networks should be used with caution.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -1427,21 +1390,26 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the Wi-Fi device whose
+permanent MAC address matches. This property does not change the MAC
+address of the device (i.e. MAC spoofing).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--mac-address-blacklist"></a><h3>The <code class="literal">“mac-address-blacklist”</code> property</h3>
<pre class="programlisting"> “mac-address-blacklist” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>A list of permanent MAC addresses of Wi-Fi devices to which this
+connection should never apply. Each MAC address should be given in the
+standard hex-digits-and-colons notation (eg "00:11:22:33:44:55").</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
<pre class="programlisting"> “mode” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Wi-Fi network mode; one of "infrastructure", "adhoc" or "ap". If blank,
+infrastructure is assumed.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1449,7 +1417,8 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, only transmit packets of the specified size or smaller,
+breaking larger packets up into multiple Ethernet frames.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1457,7 +1426,10 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--rate"></a><h3>The <code class="literal">“rate”</code> property</h3>
<pre class="programlisting"> “rate” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, directs the device to only use the specified bitrate for
+communication with the access point. Units are in Kb/s, ie 5500 = 5.5
+Mbit/s. This property is highly driver dependent and not all devices
+support setting a static bitrate.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1465,7 +1437,10 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--security"></a><h3>The <code class="literal">“security”</code> property</h3>
<pre class="programlisting"> “security” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the wireless connection has any security restrictions, like 802.1x,
+WEP, or WPA, set this property to
+<a class="link" href="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS" title="NM_SETTING_WIRELESS_SECURITY_SETTING_NAME"><code class="literal">NM_SETTING_WIRELESS_SECURITY_SETTING_NAME</code></a> and ensure the connection
+contains a valid <a class="link" href="NMSettingWirelessSecurity.html" title="NMSettingWirelessSecurity"><span class="type">NMSettingWirelessSecurity</span></a> setting.</p>
<div class="warning">
<p><code class="literal">NMSettingWireless:security</code> has been deprecated since version 0.9.10 and should not be used in newly-written code.</p>
<p>No longer used. Security restrictions are recognized
@@ -1479,28 +1454,34 @@ connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--seen-bssids"></a><h3>The <code class="literal">“seen-bssids”</code> property</h3>
<pre class="programlisting"> “seen-bssids” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>A list of BSSIDs (each BSSID formatted as a MAC address like
+"00:11:22:33:44:55") that have been detected as part of the Wi-Fi
+network. NetworkManager internally tracks previously seen BSSIDs. The
+property is only meant for reading and reflects the BSSID list of
+NetworkManager. The changes you make to this property will not be
+preserved.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--ssid"></a><h3>The <code class="literal">“ssid”</code> property</h3>
<pre class="programlisting"> “ssid” <span class="type">GArray_guchar_</span> *</pre>
-<p></p>
+<p>SSID of the Wi-Fi network. Must be specified.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--tx-power"></a><h3>The <code class="literal">“tx-power”</code> property</h3>
<pre class="programlisting"> “tx-power” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, directs the device to use the specified transmit power.
+Units are dBm. This property is highly driver dependent and not all
+devices support setting a static transmit power.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/NMSettingWirelessSecurity.html b/docs/libnm-util/html/NMSettingWirelessSecurity.html
index 6f4b21a96..d091dda22 100644
--- a/docs/libnm-util/html/NMSettingWirelessSecurity.html
+++ b/docs/libnm-util/html/NMSettingWirelessSecurity.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NMSettingWirelessSecurity</title>
+<title>NMSettingWirelessSecurity: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingWireless.html" title="NMSettingWireless">
<link rel="next" href="NMSettingBluetooth.html" title="NMSettingBluetooth">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -537,7 +537,6 @@ nm_setting_wireless_security_error_quark
<div class="refsect3">
<a name="id-1.2.7.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMSettingWired.html" title="NMSettingWired"><span class="type">NMSettingWired</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -576,7 +575,6 @@ nm_setting_wireless_security_get_key_mgmt
<div class="refsect3">
<a name="id-1.2.7.9.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--key-mgmt" title="The “key-mgmt” property"><span class="type">“key-mgmt”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -604,7 +602,6 @@ nm_setting_wireless_security_get_num_protos
<a name="id-1.2.7.9.5.5"></a><h4>Returns</h4>
<p> the number of security protocols this connection allows when
connecting to secure Wi-Fi networks</p>
-<p></p>
</div>
</div>
<hr>
@@ -640,7 +637,6 @@ nm_setting_wireless_security_get_proto
<a name="id-1.2.7.9.6.5"></a><h4>Returns</h4>
<p> the protocol at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -682,7 +678,6 @@ with the access point.</p>
<a name="id-1.2.7.9.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the protocol was new and and was added to the allowed
protocol list, or <code class="literal">FALSE</code> if it was already in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -749,9 +744,8 @@ nm_setting_wireless_security_remove_proto_by_value
<div class="refsect3">
<a name="id-1.2.7.9.9.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the protocol was found and removed; <code class="literal">FALSE</code> it it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -801,7 +795,6 @@ nm_setting_wireless_security_get_num_pairwise
<div class="refsect3">
<a name="id-1.2.7.9.11.5"></a><h4>Returns</h4>
<p> the number of pairwise encryption algorithms in the allowed list</p>
-<p></p>
</div>
</div>
<hr>
@@ -839,7 +832,6 @@ list.</p>
<a name="id-1.2.7.9.12.6"></a><h4>Returns</h4>
<p> the pairwise encryption algorithm at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -879,7 +871,6 @@ compatible with this connection.</p>
<a name="id-1.2.7.9.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the algorithm was added to the list, <code class="literal">FALSE</code> if it was
already in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -948,9 +939,8 @@ algorithm list.</p>
<div class="refsect3">
<a name="id-1.2.7.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the encryption algorith was found and removed; <code class="literal">FALSE</code> it it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1000,7 +990,6 @@ nm_setting_wireless_security_get_num_groups
<div class="refsect3">
<a name="id-1.2.7.9.17.5"></a><h4>Returns</h4>
<p> the number of groupwise encryption algorithms in the allowed list</p>
-<p></p>
</div>
</div>
<hr>
@@ -1038,7 +1027,6 @@ list.</p>
<a name="id-1.2.7.9.18.6"></a><h4>Returns</h4>
<p> the groupwise encryption algorithm at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1079,7 +1067,6 @@ compatible with this connection.</p>
<a name="id-1.2.7.9.19.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the algorithm was added to the list, <code class="literal">FALSE</code> if it was
already in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -1149,9 +1136,8 @@ algorithm list.</p>
<div class="refsect3">
<a name="id-1.2.7.9.21.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the algorithm was found and removed; <code class="literal">FALSE</code> it it was not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -1200,7 +1186,6 @@ nm_setting_wireless_security_get_psk (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.2.7.9.23.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--psk" title="The “psk” property"><span class="type">“psk”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1228,7 +1213,6 @@ nm_setting_wireless_security_get_psk_flags
<a name="id-1.2.7.9.24.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--psk" title="The “psk” property"><span class="type">“psk”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1255,7 +1239,6 @@ nm_setting_wireless_security_get_leap_username
<div class="refsect3">
<a name="id-1.2.7.9.25.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-username" title="The “leap-username” property"><span class="type">“leap-username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1282,7 +1265,6 @@ nm_setting_wireless_security_get_leap_password
<div class="refsect3">
<a name="id-1.2.7.9.26.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-password" title="The “leap-password” property"><span class="type">“leap-password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1310,7 +1292,6 @@ nm_setting_wireless_security_get_leap_password_flags
<a name="id-1.2.7.9.27.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-password" title="The “leap-password” property"><span class="type">“leap-password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1345,7 +1326,6 @@ nm_setting_wireless_security_get_wep_key
<div class="refsect3">
<a name="id-1.2.7.9.28.5"></a><h4>Returns</h4>
<p> the WEP key at the given index</p>
-<p></p>
</div>
</div>
<hr>
@@ -1411,7 +1391,6 @@ nm_setting_wireless_security_get_wep_tx_keyidx
<div class="refsect3">
<a name="id-1.2.7.9.30.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-tx-keyidx" title="The “wep-tx-keyidx” property"><span class="type">“wep-tx-keyidx”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1438,7 +1417,6 @@ nm_setting_wireless_security_get_auth_alg
<div class="refsect3">
<a name="id-1.2.7.9.31.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--auth-alg" title="The “auth-alg” property"><span class="type">“auth-alg”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1465,7 +1443,6 @@ nm_setting_wireless_security_get_wep_key_flags
<div class="refsect3">
<a name="id-1.2.7.9.32.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the all WEP keys</p>
-<p></p>
</div>
</div>
<hr>
@@ -1492,7 +1469,6 @@ nm_setting_wireless_security_get_wep_key_type
<div class="refsect3">
<a name="id-1.2.7.9.33.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key-type" title="The “wep-key-type” property"><span class="type">“wep-key-type”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -1502,8 +1478,6 @@ nm_setting_wireless_security_get_wep_key_type
<a name="NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_SETTING_NAME "802-11-wireless-security"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1581,8 +1555,6 @@ encryption protocol</p>
<a name="NM-SETTING-WIRELESS-SECURITY-ERROR:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_ERROR</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_ERROR nm_setting_wireless_security_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1648,136 +1620,102 @@ the actual WEP key using the MD5 hash algorithm.</p>
<a name="NM-SETTING-WIRELESS-SECURITY-KEY-MGMT:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_KEY_MGMT</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_KEY_MGMT "key-mgmt"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-TX-KEYIDX:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX "wep-tx-keyidx"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-AUTH-ALG:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_AUTH_ALG</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_AUTH_ALG "auth-alg"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PROTO:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PROTO</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PROTO "proto"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PAIRWISE:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PAIRWISE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PAIRWISE "pairwise"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-GROUP:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_GROUP</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_GROUP "group"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-LEAP-USERNAME:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME "leap-username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY0:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY0</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY0 "wep-key0"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY1:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY1</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY1 "wep-key1"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY2:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY2</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY2 "wep-key2"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY3:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY3</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY3 "wep-key3"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY-FLAGS:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS "wep-key-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY-TYPE:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE "wep-key-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PSK:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PSK</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PSK "psk"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PSK-FLAGS:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS "psk-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-LEAP-PASSWORD:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD "leap-password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-LEAP-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS "leap-password-flags"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1785,7 +1723,11 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--auth-alg"></a><h3>The <code class="literal">“auth-alg”</code> property</h3>
<pre class="programlisting"> “auth-alg” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>When WEP is used (ie, key-mgmt = "none" or "ieee8021x") indicate the
+802.11 authentication algorithm required by the AP here. One of "open"
+for Open System, "shared" for Shared Key, or "leap" for Cisco LEAP. When
+using Cisco LEAP (ie, key-mgmt = "ieee8021x" and auth-alg = "leap") the
+"leap-username" and "leap-password" properties must be specified.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1793,14 +1735,20 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--group"></a><h3>The <code class="literal">“group”</code> property</h3>
<pre class="programlisting"> “group” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>A list of group/broadcast encryption algorithms which prevents
+connections to Wi-Fi networks that do not utilize one of the algorithms
+in the list. For maximum compatibility leave this property empty. Each
+list element may be one of "wep40", "wep104", "tkip", or "ccmp".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--key-mgmt"></a><h3>The <code class="literal">“key-mgmt”</code> property</h3>
<pre class="programlisting"> “key-mgmt” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Key management used for the connection. One of "none" (WEP), "ieee8021x"
+(Dynamic WEP), "wpa-none" (Ad-Hoc WPA-PSK), "wpa-psk" (infrastructure
+WPA-PSK), or "wpa-eap" (WPA-Enterprise). This property must be set for
+any Wi-Fi connection that uses security.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1808,7 +1756,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--leap-password"></a><h3>The <code class="literal">“leap-password”</code> property</h3>
<pre class="programlisting"> “leap-password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The login password for legacy LEAP connections (ie, key-mgmt =
+"ieee8021x" and auth-alg = "leap").</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1816,7 +1765,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--leap-password-flags"></a><h3>The <code class="literal">“leap-password-flags”</code> property</h3>
<pre class="programlisting"> “leap-password-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the
+<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-password" title="The “leap-password” property"><span class="type">“leap-password”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -1825,7 +1775,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--leap-username"></a><h3>The <code class="literal">“leap-username”</code> property</h3>
<pre class="programlisting"> “leap-username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The login username for legacy LEAP connections (ie, key-mgmt =
+"ieee8021x" and auth-alg = "leap").</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1833,21 +1784,31 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--pairwise"></a><h3>The <code class="literal">“pairwise”</code> property</h3>
<pre class="programlisting"> “pairwise” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>A list of pairwise encryption algorithms which prevents connections to
+Wi-Fi networks that do not utilize one of the algorithms in the list.
+For maximum compatibility leave this property empty. Each list element
+may be one of "tkip" or "ccmp".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--proto"></a><h3>The <code class="literal">“proto”</code> property</h3>
<pre class="programlisting"> “proto” <span class="type">GSList_gchararray_</span> *</pre>
-<p></p>
+<p>List of strings specifying the allowed WPA protocol versions to use.
+Each element may be one "wpa" (allow WPA) or "rsn" (allow WPA2/RSN). If
+not specified, both WPA and RSN connections are allowed.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--psk"></a><h3>The <code class="literal">“psk”</code> property</h3>
<pre class="programlisting"> “psk” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Pre-Shared-Key for WPA networks. If the key is 64-characters long, it
+must contain only hexadecimal characters and is interpreted as a
+hexadecimal WPA key. Otherwise, the key must be between 8 and 63 ASCII
+characters (as specified in the 802.11i standard) and is interpreted as a
+WPA passphrase, and is hashed to derive the actual WPA-PSK used when
+connecting to the Wi-Fi network.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1855,7 +1816,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--psk-flags"></a><h3>The <code class="literal">“psk-flags”</code> property</h3>
<pre class="programlisting"> “psk-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--psk" title="The “psk” property"><span class="type">“psk”</span></a>
+property.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -1864,7 +1826,9 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key-flags"></a><h3>The <code class="literal">“wep-key-flags”</code> property</h3>
<pre class="programlisting"> “wep-key-flags” <span class="type">guint</span></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key0" title="The “wep-key0” property"><span class="type">“wep-key0”</span></a>,
+<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key1" title="The “wep-key1” property"><span class="type">“wep-key1”</span></a>, <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key2" title="The “wep-key2” property"><span class="type">“wep-key2”</span></a>,
+and <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key3" title="The “wep-key3” property"><span class="type">“wep-key3”</span></a> properties.</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 7</p>
<p>Default value: 0</p>
@@ -1873,7 +1837,12 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key-type"></a><h3>The <code class="literal">“wep-key-type”</code> property</h3>
<pre class="programlisting"> “wep-key-type” <span class="type">guint</span></pre>
-<p></p>
+<p>Controls the interpretation of WEP keys. Allowed values are
+<a class="link" href="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-KEY:CAPS"><code class="literal">NM_WEP_KEY_TYPE_KEY</code></a>, in which case the key is either a 10- or
+26-character hexadecimal string, or a 5- or 13-character ASCII password;
+or <a class="link" href="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-PASSPHRASE:CAPS"><code class="literal">NM_WEP_KEY_TYPE_PASSPHRASE</code></a>, in which case the passphrase is provided
+as a string and will be hashed using the de-facto MD5 method to derive
+the actual WEP key.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 2</p>
<p>Default value: 0</p>
@@ -1882,7 +1851,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key0"></a><h3>The <code class="literal">“wep-key0”</code> property</h3>
<pre class="programlisting"> “wep-key0” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 0 WEP key. This is the WEP key used in most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1890,7 +1860,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key1"></a><h3>The <code class="literal">“wep-key1”</code> property</h3>
<pre class="programlisting"> “wep-key1” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 1 WEP key. This WEP index is not used by most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1898,7 +1869,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key2"></a><h3>The <code class="literal">“wep-key2”</code> property</h3>
<pre class="programlisting"> “wep-key2” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 2 WEP key. This WEP index is not used by most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1906,7 +1878,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key3"></a><h3>The <code class="literal">“wep-key3”</code> property</h3>
<pre class="programlisting"> “wep-key3” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 3 WEP key. This WEP index is not used by most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1914,7 +1887,10 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-tx-keyidx"></a><h3>The <code class="literal">“wep-tx-keyidx”</code> property</h3>
<pre class="programlisting"> “wep-tx-keyidx” <span class="type">guint</span></pre>
-<p></p>
+<p>When static WEP is used (ie, key-mgmt = "none") and a non-default WEP key
+index is used by the AP, put that WEP key index here. Valid values are 0
+(default key) through 3. Note that some consumer access points (like the
+Linksys WRT54G) number the keys 1 - 4.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 3</p>
<p>Default value: 0</p>
@@ -1922,7 +1898,6 @@ the actual WEP key using the MD5 hash algorithm.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/annotation-glossary.html b/docs/libnm-util/html/annotation-glossary.html
index fbcda20a8..76baf2026 100644
--- a/docs/libnm-util/html/annotation-glossary.html
+++ b/docs/libnm-util/html/annotation-glossary.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: Annotation Glossary</title>
+<title>Annotation Glossary: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="index.html" title="libnm-util Reference Manual">
<link rel="prev" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -53,6 +53,8 @@
<a name="glsS"></a><h3 class="title">S</h3>
<dt><span class="glossterm"><a name="annotation-glossterm-scope%20call"></a>scope call</span></dt>
<dd class="glossdef"><p>The callback is valid only during the call to the method.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-skip"></a>skip</span></dt>
+<dd class="glossdef"><p>Exposed in C code, not necessarily available in other languages.</p></dd>
<a name="glsT"></a><h3 class="title">T</h3>
<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt>
<dd class="glossdef"><p>Free data container after the code is done.</p></dd>
@@ -62,7 +64,6 @@
<dd class="glossdef"><p>Don't free data after the code is done.</p></dd>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/api-index-full.html b/docs/libnm-util/html/api-index-full.html
index 228ba8e63..b7b0aaf57 100644
--- a/docs/libnm-util/html/api-index-full.html
+++ b/docs/libnm-util/html/api-index-full.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: API Index</title>
+<title>API Index: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="index.html" title="libnm-util Reference Manual">
<link rel="prev" href="object-tree.html" title="Object Hierarchy">
<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -5220,7 +5220,6 @@
<dd></dd>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/ch01.html b/docs/libnm-util/html/ch01.html
index ef2dca61c..44d6c2682 100644
--- a/docs/libnm-util/html/ch01.html
+++ b/docs/libnm-util/html/ch01.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: libnm-util API Reference</title>
+<title>libnm-util API Reference: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="index.html" title="libnm-util Reference Manual">
<link rel="prev" href="index.html" title="libnm-util Reference Manual">
<link rel="next" href="NMConnection.html" title="NMConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -122,7 +122,6 @@ that require PPP to deliver IP capability</span>
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/index.html b/docs/libnm-util/html/index.html
index 36815443b..7be228838 100644
--- a/docs/libnm-util/html/index.html
+++ b/docs/libnm-util/html/index.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="next" href="ch01.html" title="libnm-util API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">libnm-util Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for libnm-util 1.0.2
+ for libnm-util 1.0.4
The latest version of this documentation can be found on-line at
<a class="ulink" href="https://developer.gnome.org/libnm-util/0.9/" target="_top">https://developer.gnome.org/libnm-util/0.9/</a>.
@@ -152,7 +152,6 @@ that require PPP to deliver IP capability</span>
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/index.sgml b/docs/libnm-util/html/index.sgml
index 417ba7681..77fff963c 100644
--- a/docs/libnm-util/html/index.sgml
+++ b/docs/libnm-util/html/index.sgml
@@ -73,6 +73,11 @@
<ANCHOR id="NM-CONNECTION-CHANGED:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-CHANGED:CAPS">
<ANCHOR id="NM-CONNECTION-PATH:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-PATH:CAPS">
<ANCHOR id="NMConnectionError" href="libnm-util/NMConnection.html#NMConnectionError">
+<ANCHOR id="NM-CONNECTION-ERROR-UNKNOWN:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-CONNECTION-SETTING-NOT-FOUND:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-ERROR-CONNECTION-SETTING-NOT-FOUND:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-CONNECTION-TYPE-INVALID:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-ERROR-CONNECTION-TYPE-INVALID:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-SETTING-NOT-FOUND:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-ERROR-SETTING-NOT-FOUND:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-INVALID-SETTING:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-ERROR-INVALID-SETTING:CAPS">
<ANCHOR id="NM-CONNECTION-NORMALIZE-PARAM-IP6-CONFIG-METHOD:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-NORMALIZE-PARAM-IP6-CONFIG-METHOD:CAPS">
<ANCHOR id="NM-CONNECTION-ERROR:CAPS" href="libnm-util/NMConnection.html#NM-CONNECTION-ERROR:CAPS">
<ANCHOR id="NMConnection-struct" href="libnm-util/NMConnection.html#NMConnection-struct">
@@ -115,13 +120,37 @@
<ANCHOR id="nm-setting-get-virtual-iface-name" href="libnm-util/NMSetting.html#nm-setting-get-virtual-iface-name">
<ANCHOR id="NMSetting.other_details" href="libnm-util/NMSetting.html#NMSetting.other_details">
<ANCHOR id="NMSettingError" href="libnm-util/NMSetting.html#NMSettingError">
+<ANCHOR id="NM-SETTING-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-ERROR-PROPERTY-NOT-FOUND:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-ERROR-PROPERTY-NOT-FOUND:CAPS">
+<ANCHOR id="NM-SETTING-ERROR-PROPERTY-NOT-SECRET:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-ERROR-PROPERTY-NOT-SECRET:CAPS">
+<ANCHOR id="NM-SETTING-ERROR-PROPERTY-TYPE-MISMATCH:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-ERROR-PROPERTY-TYPE-MISMATCH:CAPS">
<ANCHOR id="NM-SETTING-ERROR:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-ERROR:CAPS">
<ANCHOR id="NM-SETTING-NAME:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingSecretFlags" href="libnm-util/NMSetting.html#NMSettingSecretFlags">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-NONE:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-SECRET-FLAG-NONE:CAPS">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-AGENT-OWNED:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-SECRET-FLAG-AGENT-OWNED:CAPS">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-NOT-SAVED:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-SAVED:CAPS">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-NOT-REQUIRED:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-REQUIRED:CAPS">
<ANCHOR id="NMSettingCompareFlags" href="libnm-util/NMSetting.html#NMSettingCompareFlags">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-EXACT:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-EXACT:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-FUZZY:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-FUZZY:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-ID:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-ID:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-SECRETS:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-AGENT-OWNED-SECRETS:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-AGENT-OWNED-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-NOT-SAVED-SECRETS:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-NOT-SAVED-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-DIFF-RESULT-WITH-DEFAULT:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-WITH-DEFAULT:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-DIFF-RESULT-NO-DEFAULT:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-NO-DEFAULT:CAPS">
<ANCHOR id="NMSetting-struct" href="libnm-util/NMSetting.html#NMSetting-struct">
<ANCHOR id="NMSettingHashFlags" href="libnm-util/NMSetting.html#NMSettingHashFlags">
+<ANCHOR id="NM-SETTING-HASH-FLAG-ALL:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-HASH-FLAG-ALL:CAPS">
+<ANCHOR id="NM-SETTING-HASH-FLAG-NO-SECRETS:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-HASH-FLAG-NO-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-HASH-FLAG-ONLY-SECRETS:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-HASH-FLAG-ONLY-SECRETS:CAPS">
<ANCHOR id="NMSettingDiffResult" href="libnm-util/NMSetting.html#NMSettingDiffResult">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-UNKNOWN:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-DIFF-RESULT-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-A:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-B:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-A-DEFAULT:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A-DEFAULT:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-B-DEFAULT:CAPS" href="libnm-util/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B-DEFAULT:CAPS">
<ANCHOR id="NMSetting.property-details" href="libnm-util/NMSetting.html#NMSetting.property-details">
<ANCHOR id="NMSetting--name" href="libnm-util/NMSetting.html#NMSetting--name">
<ANCHOR id="NMSettingConnection" href="libnm-util/NMSettingConnection.html">
@@ -160,6 +189,11 @@
<ANCHOR id="NMSettingConnection.other_details" href="libnm-util/NMSettingConnection.html#NMSettingConnection.other_details">
<ANCHOR id="NM-SETTING-CONNECTION-SETTING-NAME:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingConnectionError" href="libnm-util/NMSettingConnection.html#NMSettingConnectionError">
+<ANCHOR id="NM-SETTING-CONNECTION-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-ERROR-TYPE-SETTING-NOT-FOUND:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-TYPE-SETTING-NOT-FOUND:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-ERROR-IP-CONFIG-NOT-ALLOWED:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-IP-CONFIG-NOT-ALLOWED:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-ERROR:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-ID:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-ID:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-UUID:CAPS" href="libnm-util/NMSettingConnection.html#NM-SETTING-CONNECTION-UUID:CAPS">
@@ -224,6 +258,9 @@
<ANCHOR id="NMSettingWired.other_details" href="libnm-util/NMSettingWired.html#NMSettingWired.other_details">
<ANCHOR id="NM-SETTING-WIRED-SETTING-NAME:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingWiredError" href="libnm-util/NMSettingWired.html#NMSettingWiredError">
+<ANCHOR id="NM-SETTING-WIRED-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-WIRED-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-WIRED-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-WIRED-ERROR:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-ERROR:CAPS">
<ANCHOR id="NM-SETTING-WIRED-PORT:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-PORT:CAPS">
<ANCHOR id="NM-SETTING-WIRED-SPEED:CAPS" href="libnm-util/NMSettingWired.html#NM-SETTING-WIRED-SPEED:CAPS">
@@ -284,6 +321,11 @@
<ANCHOR id="NMSettingWireless.other_details" href="libnm-util/NMSettingWireless.html#NMSettingWireless.other_details">
<ANCHOR id="NM-SETTING-WIRELESS-SETTING-NAME:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingWirelessError" href="libnm-util/NMSettingWireless.html#NMSettingWirelessError">
+<ANCHOR id="NM-SETTING-WIRELESS-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-ERROR-MISSING-SECURITY-SETTING:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-MISSING-SECURITY-SETTING:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-ERROR-CHANNEL-REQUIRES-BAND:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-CHANNEL-REQUIRES-BAND:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-ERROR:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SSID:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-SSID:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-MODE:CAPS" href="libnm-util/NMSettingWireless.html#NM-SETTING-WIRELESS-MODE:CAPS">
@@ -360,8 +402,19 @@
<ANCHOR id="NMSettingWirelessSecurity.other_details" href="libnm-util/NMSettingWirelessSecurity.html#NMSettingWirelessSecurity.other_details">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingWirelessSecurityError" href="libnm-util/NMSettingWirelessSecurity.html#NMSettingWirelessSecurityError">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-MISSING-802-1X-SETTING:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-MISSING-802-1X-SETTING:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-LEAP-REQUIRES-802-1X:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-LEAP-REQUIRES-802-1X:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-LEAP-REQUIRES-USERNAME:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-LEAP-REQUIRES-USERNAME:CAPS">
+<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR-SHARED-KEY-REQUIRES-WEP:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-SHARED-KEY-REQUIRES-WEP:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-ERROR:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR:CAPS">
<ANCHOR id="NMWepKeyType" href="libnm-util/NMSettingWirelessSecurity.html#NMWepKeyType">
+<ANCHOR id="NM-WEP-KEY-TYPE-UNKNOWN:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="NM-WEP-KEY-TYPE-KEY:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-KEY:CAPS">
+<ANCHOR id="NM-WEP-KEY-TYPE-PASSPHRASE:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-PASSPHRASE:CAPS">
+<ANCHOR id="NM-WEP-KEY-TYPE-LAST:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-LAST:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-KEY-MGMT:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-KEY-MGMT:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-WEP-TX-KEYIDX:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-WEP-TX-KEYIDX:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-AUTH-ALG:CAPS" href="libnm-util/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-AUTH-ALG:CAPS">
@@ -412,6 +465,10 @@
<ANCHOR id="NMSettingBluetooth.other_details" href="libnm-util/NMSettingBluetooth.html#NMSettingBluetooth.other_details">
<ANCHOR id="NM-SETTING-BLUETOOTH-SETTING-NAME:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingBluetoothError" href="libnm-util/NMSettingBluetooth.html#NMSettingBluetoothError">
+<ANCHOR id="NM-SETTING-BLUETOOTH-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-BLUETOOTH-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-BLUETOOTH-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-BLUETOOTH-ERROR-TYPE-SETTING-NOT-FOUND:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-TYPE-SETTING-NOT-FOUND:CAPS">
<ANCHOR id="NM-SETTING-BLUETOOTH-ERROR:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR:CAPS">
<ANCHOR id="NM-SETTING-BLUETOOTH-BDADDR:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-BDADDR:CAPS">
<ANCHOR id="NM-SETTING-BLUETOOTH-TYPE:CAPS" href="libnm-util/NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-TYPE:CAPS">
@@ -438,6 +495,10 @@
<ANCHOR id="NMSettingSerial.other_details" href="libnm-util/NMSettingSerial.html#NMSettingSerial.other_details">
<ANCHOR id="NM-SETTING-SERIAL-SETTING-NAME:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingSerialError" href="libnm-util/NMSettingSerial.html#NMSettingSerialError">
+<ANCHOR id="NM-SETTING-SERIAL-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-SERIAL-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-SERIAL-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-SERIAL-ERROR-MISSING-PPP-SETTING:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-MISSING-PPP-SETTING:CAPS">
<ANCHOR id="NM-SETTING-SERIAL-ERROR:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-ERROR:CAPS">
<ANCHOR id="NM-SETTING-SERIAL-BAUD:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-BAUD:CAPS">
<ANCHOR id="NM-SETTING-SERIAL-BITS:CAPS" href="libnm-util/NMSettingSerial.html#NM-SETTING-SERIAL-BITS:CAPS">
@@ -467,6 +528,10 @@
<ANCHOR id="NMSettingCdma.other_details" href="libnm-util/NMSettingCdma.html#NMSettingCdma.other_details">
<ANCHOR id="NM-SETTING-CDMA-SETTING-NAME:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingCdmaError" href="libnm-util/NMSettingCdma.html#NMSettingCdmaError">
+<ANCHOR id="NM-SETTING-CDMA-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-CDMA-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-CDMA-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-CDMA-ERROR-MISSING-SERIAL-SETTING:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-ERROR-MISSING-SERIAL-SETTING:CAPS">
<ANCHOR id="NM-SETTING-CDMA-ERROR:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-ERROR:CAPS">
<ANCHOR id="NM-SETTING-CDMA-NUMBER:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-NUMBER:CAPS">
<ANCHOR id="NM-SETTING-CDMA-USERNAME:CAPS" href="libnm-util/NMSettingCdma.html#NM-SETTING-CDMA-USERNAME:CAPS">
@@ -502,6 +567,10 @@
<ANCHOR id="NMSettingGsm.other_details" href="libnm-util/NMSettingGsm.html#NMSettingGsm.other_details">
<ANCHOR id="NM-SETTING-GSM-SETTING-NAME:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingGsmError" href="libnm-util/NMSettingGsm.html#NMSettingGsmError">
+<ANCHOR id="NM-SETTING-GSM-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-GSM-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-GSM-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-GSM-ERROR-MISSING-SERIAL-SETTING:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-ERROR-MISSING-SERIAL-SETTING:CAPS">
<ANCHOR id="NM-SETTING-GSM-ERROR:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-ERROR:CAPS">
<ANCHOR id="NM-SETTING-GSM-NUMBER:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NUMBER:CAPS">
<ANCHOR id="NM-SETTING-GSM-USERNAME:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-USERNAME:CAPS">
@@ -515,7 +584,29 @@
<ANCHOR id="NM-SETTING-GSM-ALLOWED-BANDS:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-ALLOWED-BANDS:CAPS">
<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE:CAPS">
<ANCHOR id="NMSettingGsmNetworkType" href="libnm-util/NMSettingGsm.html#NMSettingGsmNetworkType">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-ANY:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-ANY:CAPS">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-UMTS-HSPA:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-UMTS-HSPA:CAPS">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-GPRS-EDGE:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-GPRS-EDGE:CAPS">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-PREFER-UMTS-HSPA:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-UMTS-HSPA:CAPS">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-PREFER-GPRS-EDGE:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-GPRS-EDGE:CAPS">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-PREFER-4G:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-4G:CAPS">
+<ANCHOR id="NM-SETTING-GSM-NETWORK-TYPE-4G:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-4G:CAPS">
<ANCHOR id="NMSettingGsmNetworkBand" href="libnm-util/NMSettingGsm.html#NMSettingGsmNetworkBand">
+<ANCHOR id="NM-SETTING-GSM-BAND-UNKNOWN:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-ANY:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-ANY:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-EGSM:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-EGSM:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-DCS:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-DCS:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-PCS:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-PCS:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-G850:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-G850:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U2100:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U2100:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U1800:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U1800:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U17IV:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U17IV:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U800:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U800:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U850:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U850:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U900:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U900:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U17IX:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U17IX:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U1900:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U1900:CAPS">
+<ANCHOR id="NM-SETTING-GSM-BAND-U2600:CAPS" href="libnm-util/NMSettingGsm.html#NM-SETTING-GSM-BAND-U2600:CAPS">
<ANCHOR id="NMSettingGsm.property-details" href="libnm-util/NMSettingGsm.html#NMSettingGsm.property-details">
<ANCHOR id="NMSettingGsm--allowed-bands" href="libnm-util/NMSettingGsm.html#NMSettingGsm--allowed-bands">
<ANCHOR id="NMSettingGsm--apn" href="libnm-util/NMSettingGsm.html#NMSettingGsm--apn">
@@ -543,6 +634,9 @@
<ANCHOR id="NMSettingWimax.other_details" href="libnm-util/NMSettingWimax.html#NMSettingWimax.other_details">
<ANCHOR id="NM-SETTING-WIMAX-SETTING-NAME:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingWimaxError" href="libnm-util/NMSettingWimax.html#NMSettingWimaxError">
+<ANCHOR id="NM-SETTING-WIMAX-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-WIMAX-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-WIMAX-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-WIMAX-ERROR:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-ERROR:CAPS">
<ANCHOR id="NM-SETTING-WIMAX-NETWORK-NAME:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-NETWORK-NAME:CAPS">
<ANCHOR id="NM-SETTING-WIMAX-MAC-ADDRESS:CAPS" href="libnm-util/NMSettingWimax.html#NM-SETTING-WIMAX-MAC-ADDRESS:CAPS">
@@ -571,6 +665,11 @@
<ANCHOR id="NMSettingBond.other_details" href="libnm-util/NMSettingBond.html#NMSettingBond.other_details">
<ANCHOR id="NM-SETTING-BOND-SETTING-NAME:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingBondError" href="libnm-util/NMSettingBond.html#NMSettingBondError">
+<ANCHOR id="NM-SETTING-BOND-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-BOND-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-BOND-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-BOND-ERROR-INVALID-OPTION:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-ERROR-INVALID-OPTION:CAPS">
+<ANCHOR id="NM-SETTING-BOND-ERROR-MISSING-OPTION:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-ERROR-MISSING-OPTION:CAPS">
<ANCHOR id="NM-SETTING-BOND-ERROR:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-ERROR:CAPS">
<ANCHOR id="NM-SETTING-BOND-INTERFACE-NAME:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-INTERFACE-NAME:CAPS">
<ANCHOR id="NM-SETTING-BOND-OPTIONS:CAPS" href="libnm-util/NMSettingBond.html#NM-SETTING-BOND-OPTIONS:CAPS">
@@ -613,6 +712,9 @@
<ANCHOR id="NMSettingBridge.other_details" href="libnm-util/NMSettingBridge.html#NMSettingBridge.other_details">
<ANCHOR id="NM-SETTING-BRIDGE-SETTING-NAME:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingBridgeError" href="libnm-util/NMSettingBridge.html#NMSettingBridgeError">
+<ANCHOR id="NM-SETTING-BRIDGE-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-BRIDGE-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-BRIDGE-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-BRIDGE-ERROR:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR:CAPS">
<ANCHOR id="NM-SETTING-BRIDGE-INTERFACE-NAME:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-INTERFACE-NAME:CAPS">
<ANCHOR id="NM-SETTING-BRIDGE-MAC-ADDRESS:CAPS" href="libnm-util/NMSettingBridge.html#NM-SETTING-BRIDGE-MAC-ADDRESS:CAPS">
@@ -647,6 +749,9 @@
<ANCHOR id="NMSettingBridgePort.other_details" href="libnm-util/NMSettingBridgePort.html#NMSettingBridgePort.other_details">
<ANCHOR id="NM-SETTING-BRIDGE-PORT-SETTING-NAME:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingBridgePortError" href="libnm-util/NMSettingBridgePort.html#NMSettingBridgePortError">
+<ANCHOR id="NM-SETTING-BRIDGE-PORT-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-BRIDGE-PORT-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-BRIDGE-PORT-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-BRIDGE-PORT-ERROR:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR:CAPS">
<ANCHOR id="NM-SETTING-BRIDGE-PORT-PRIORITY:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-PRIORITY:CAPS">
<ANCHOR id="NM-SETTING-BRIDGE-PORT-PATH-COST:CAPS" href="libnm-util/NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-PATH-COST:CAPS">
@@ -670,6 +775,9 @@
<ANCHOR id="NMSettingTeam.other_details" href="libnm-util/NMSettingTeam.html#NMSettingTeam.other_details">
<ANCHOR id="NM-SETTING-TEAM-SETTING-NAME:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingTeamError" href="libnm-util/NMSettingTeam.html#NMSettingTeamError">
+<ANCHOR id="NM-SETTING-TEAM-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-TEAM-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-TEAM-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-TEAM-ERROR:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-ERROR:CAPS">
<ANCHOR id="NM-SETTING-TEAM-INTERFACE-NAME:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-INTERFACE-NAME:CAPS">
<ANCHOR id="NM-SETTING-TEAM-CONFIG:CAPS" href="libnm-util/NMSettingTeam.html#NM-SETTING-TEAM-CONFIG:CAPS">
@@ -690,6 +798,9 @@
<ANCHOR id="NMSettingTeamPort.other_details" href="libnm-util/NMSettingTeamPort.html#NMSettingTeamPort.other_details">
<ANCHOR id="NM-SETTING-TEAM-PORT-SETTING-NAME:CAPS" href="libnm-util/NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingTeamPortError" href="libnm-util/NMSettingTeamPort.html#NMSettingTeamPortError">
+<ANCHOR id="NM-SETTING-TEAM-PORT-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-TEAM-PORT-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-TEAM-PORT-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-TEAM-PORT-ERROR:CAPS" href="libnm-util/NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR:CAPS">
<ANCHOR id="NM-SETTING-TEAM-PORT-CONFIG:CAPS" href="libnm-util/NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-CONFIG:CAPS">
<ANCHOR id="NMSettingTeamPort.property-details" href="libnm-util/NMSettingTeamPort.html#NMSettingTeamPort.property-details">
@@ -706,6 +817,9 @@
<ANCHOR id="NMSettingGeneric.other_details" href="libnm-util/NMSettingGeneric.html#NMSettingGeneric.other_details">
<ANCHOR id="NM-SETTING-GENERIC-SETTING-NAME:CAPS" href="libnm-util/NMSettingGeneric.html#NM-SETTING-GENERIC-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingGenericError" href="libnm-util/NMSettingGeneric.html#NMSettingGenericError">
+<ANCHOR id="NM-SETTING-GENERIC-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-GENERIC-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-GENERIC-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-GENERIC-ERROR:CAPS" href="libnm-util/NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR:CAPS">
<ANCHOR id="NMSettingInfiniband" href="libnm-util/NMSettingInfiniband.html">
<ANCHOR id="NMSettingInfiniband.functions" href="libnm-util/NMSettingInfiniband.html#NMSettingInfiniband.functions">
@@ -725,6 +839,9 @@
<ANCHOR id="NMSettingInfiniband.other_details" href="libnm-util/NMSettingInfiniband.html#NMSettingInfiniband.other_details">
<ANCHOR id="NM-SETTING-INFINIBAND-SETTING-NAME:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingInfinibandError" href="libnm-util/NMSettingInfiniband.html#NMSettingInfinibandError">
+<ANCHOR id="NM-SETTING-INFINIBAND-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-INFINIBAND-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-INFINIBAND-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-INFINIBAND-ERROR:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR:CAPS">
<ANCHOR id="NM-SETTING-INFINIBAND-MAC-ADDRESS:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-MAC-ADDRESS:CAPS">
<ANCHOR id="NM-SETTING-INFINIBAND-MTU:CAPS" href="libnm-util/NMSettingInfiniband.html#NM-SETTING-INFINIBAND-MTU:CAPS">
@@ -762,6 +879,10 @@
<ANCHOR id="NMSettingVlan.other_details" href="libnm-util/NMSettingVlan.html#NMSettingVlan.other_details">
<ANCHOR id="NM-SETTING-VLAN-SETTING-NAME:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingVlanError" href="libnm-util/NMSettingVlan.html#NMSettingVlanError">
+<ANCHOR id="NM-SETTING-VLAN-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-VLAN-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-VLAN-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-VLAN-ERROR-INVALID-PARENT:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-ERROR-INVALID-PARENT:CAPS">
<ANCHOR id="NM-SETTING-VLAN-ERROR:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-ERROR:CAPS">
<ANCHOR id="NM-SETTING-VLAN-INTERFACE-NAME:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-INTERFACE-NAME:CAPS">
<ANCHOR id="NM-SETTING-VLAN-PARENT:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-PARENT:CAPS">
@@ -770,7 +891,12 @@
<ANCHOR id="NM-SETTING-VLAN-INGRESS-PRIORITY-MAP:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-INGRESS-PRIORITY-MAP:CAPS">
<ANCHOR id="NM-SETTING-VLAN-EGRESS-PRIORITY-MAP:CAPS" href="libnm-util/NMSettingVlan.html#NM-SETTING-VLAN-EGRESS-PRIORITY-MAP:CAPS">
<ANCHOR id="NMVlanPriorityMap" href="libnm-util/NMSettingVlan.html#NMVlanPriorityMap">
+<ANCHOR id="NM-VLAN-INGRESS-MAP:CAPS" href="libnm-util/NMSettingVlan.html#NM-VLAN-INGRESS-MAP:CAPS">
+<ANCHOR id="NM-VLAN-EGRESS-MAP:CAPS" href="libnm-util/NMSettingVlan.html#NM-VLAN-EGRESS-MAP:CAPS">
<ANCHOR id="NMVlanFlags" href="libnm-util/NMSettingVlan.html#NMVlanFlags">
+<ANCHOR id="NM-VLAN-FLAG-REORDER-HEADERS:CAPS" href="libnm-util/NMSettingVlan.html#NM-VLAN-FLAG-REORDER-HEADERS:CAPS">
+<ANCHOR id="NM-VLAN-FLAG-GVRP:CAPS" href="libnm-util/NMSettingVlan.html#NM-VLAN-FLAG-GVRP:CAPS">
+<ANCHOR id="NM-VLAN-FLAG-LOOSE-BINDING:CAPS" href="libnm-util/NMSettingVlan.html#NM-VLAN-FLAG-LOOSE-BINDING:CAPS">
<ANCHOR id="NMSettingVlan.property-details" href="libnm-util/NMSettingVlan.html#NMSettingVlan.property-details">
<ANCHOR id="NMSettingVlan--egress-priority-map" href="libnm-util/NMSettingVlan.html#NMSettingVlan--egress-priority-map">
<ANCHOR id="NMSettingVlan--flags" href="libnm-util/NMSettingVlan.html#NMSettingVlan--flags">
@@ -793,6 +919,9 @@
<ANCHOR id="NMSettingOlpcMesh.other_details" href="libnm-util/NMSettingOlpcMesh.html#NMSettingOlpcMesh.other_details">
<ANCHOR id="NM-SETTING-OLPC-MESH-SETTING-NAME:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingOlpcMeshError" href="libnm-util/NMSettingOlpcMesh.html#NMSettingOlpcMeshError">
+<ANCHOR id="NM-SETTING-OLPC-MESH-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-OLPC-MESH-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-OLPC-MESH-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-OLPC-MESH-ERROR:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR:CAPS">
<ANCHOR id="NM-SETTING-OLPC-MESH-SSID:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-SSID:CAPS">
<ANCHOR id="NM-SETTING-OLPC-MESH-CHANNEL:CAPS" href="libnm-util/NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-CHANNEL:CAPS">
@@ -821,6 +950,9 @@
<ANCHOR id="NMSettingAdsl.other_details" href="libnm-util/NMSettingAdsl.html#NMSettingAdsl.other_details">
<ANCHOR id="NM-SETTING-ADSL-SETTING-NAME:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingAdslError" href="libnm-util/NMSettingAdsl.html#NMSettingAdslError">
+<ANCHOR id="NM-SETTING-ADSL-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-ADSL-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-ADSL-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-ADSL-ERROR:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-ERROR:CAPS">
<ANCHOR id="NM-SETTING-ADSL-USERNAME:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-USERNAME:CAPS">
<ANCHOR id="NM-SETTING-ADSL-PASSWORD:CAPS" href="libnm-util/NMSettingAdsl.html#NM-SETTING-ADSL-PASSWORD:CAPS">
@@ -876,8 +1008,15 @@
<ANCHOR id="NMSettingDcb.other_details" href="libnm-util/NMSettingDcb.html#NMSettingDcb.other_details">
<ANCHOR id="NM-SETTING-DCB-SETTING-NAME:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingDcbError" href="libnm-util/NMSettingDcb.html#NMSettingDcbError">
+<ANCHOR id="NM-SETTING-DCB-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-DCB-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-DCB-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-DCB-ERROR:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-ERROR:CAPS">
<ANCHOR id="NMSettingDcbFlags" href="libnm-util/NMSettingDcb.html#NMSettingDcbFlags">
+<ANCHOR id="NM-SETTING-DCB-FLAG-NONE:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-FLAG-NONE:CAPS">
+<ANCHOR id="NM-SETTING-DCB-FLAG-ENABLE:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS">
+<ANCHOR id="NM-SETTING-DCB-FLAG-ADVERTISE:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS">
+<ANCHOR id="NM-SETTING-DCB-FLAG-WILLING:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS">
<ANCHOR id="NM-SETTING-DCB-FCOE-MODE-FABRIC:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-FABRIC:CAPS">
<ANCHOR id="NM-SETTING-DCB-FCOE-MODE-VN2VN:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-VN2VN:CAPS">
<ANCHOR id="NM-SETTING-DCB-APP-FCOE-FLAGS:CAPS" href="libnm-util/NMSettingDcb.html#NM-SETTING-DCB-APP-FCOE-FLAGS:CAPS">
@@ -990,9 +1129,19 @@
<ANCHOR id="nm-setting-802-1x-get-phase2-private-key-format" href="libnm-util/NMSetting8021x.html#nm-setting-802-1x-get-phase2-private-key-format">
<ANCHOR id="NMSetting8021x.other_details" href="libnm-util/NMSetting8021x.html#NMSetting8021x.other_details">
<ANCHOR id="NMSetting8021xCKFormat" href="libnm-util/NMSetting8021x.html#NMSetting8021xCKFormat">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-UNKNOWN:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-X509:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-X509:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-RAW-KEY:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-RAW-KEY:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-PKCS12:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-PKCS12:CAPS">
<ANCHOR id="NMSetting8021xCKScheme" href="libnm-util/NMSetting8021x.html#NMSetting8021xCKScheme">
+<ANCHOR id="NM-SETTING-802-1X-CK-SCHEME-UNKNOWN:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-SCHEME-BLOB:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-BLOB:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-SCHEME-PATH:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CAPS">
<ANCHOR id="NM-SETTING-802-1X-SETTING-NAME:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-SETTING-NAME:CAPS">
<ANCHOR id="NMSetting8021xError" href="libnm-util/NMSetting8021x.html#NMSetting8021xError">
+<ANCHOR id="NM-SETTING-802-1X-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-802-1X-ERROR:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-ERROR:CAPS">
<ANCHOR id="NM-SETTING-802-1X-EAP:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-EAP:CAPS">
<ANCHOR id="NM-SETTING-802-1X-IDENTITY:CAPS" href="libnm-util/NMSetting8021x.html#NM-SETTING-802-1X-IDENTITY:CAPS">
@@ -1131,6 +1280,10 @@
<ANCHOR id="NMSettingIP4Config.other_details" href="libnm-util/NMSettingIP4Config.html#NMSettingIP4Config.other_details">
<ANCHOR id="NM-SETTING-IP4-CONFIG-SETTING-NAME:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingIP4ConfigError" href="libnm-util/NMSettingIP4Config.html#NMSettingIP4ConfigError">
+<ANCHOR id="NM-SETTING-IP4-CONFIG-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-IP4-CONFIG-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-IP4-CONFIG-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-IP4-CONFIG-ERROR-NOT-ALLOWED-FOR-METHOD:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-NOT-ALLOWED-FOR-METHOD:CAPS">
<ANCHOR id="NM-SETTING-IP4-CONFIG-ERROR:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR:CAPS">
<ANCHOR id="NM-SETTING-IP4-CONFIG-METHOD:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-METHOD:CAPS">
<ANCHOR id="NM-SETTING-IP4-CONFIG-DNS:CAPS" href="libnm-util/NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-DNS:CAPS">
@@ -1235,6 +1388,10 @@
<ANCHOR id="NMSettingIP6Config.other_details" href="libnm-util/NMSettingIP6Config.html#NMSettingIP6Config.other_details">
<ANCHOR id="NM-SETTING-IP6-CONFIG-SETTING-NAME:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingIP6ConfigError" href="libnm-util/NMSettingIP6Config.html#NMSettingIP6ConfigError">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-ERROR-NOT-ALLOWED-FOR-METHOD:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-NOT-ALLOWED-FOR-METHOD:CAPS">
<ANCHOR id="NM-SETTING-IP6-CONFIG-ERROR:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR:CAPS">
<ANCHOR id="NM-SETTING-IP6-CONFIG-METHOD:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-METHOD:CAPS">
<ANCHOR id="NM-SETTING-IP6-CONFIG-DNS:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-DNS:CAPS">
@@ -1255,6 +1412,10 @@
<ANCHOR id="NM-SETTING-IP6-CONFIG-METHOD-MANUAL:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-METHOD-MANUAL:CAPS">
<ANCHOR id="NM-SETTING-IP6-CONFIG-METHOD-SHARED:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-METHOD-SHARED:CAPS">
<ANCHOR id="NMSettingIP6ConfigPrivacy" href="libnm-util/NMSettingIP6Config.html#NMSettingIP6ConfigPrivacy">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-UNKNOWN:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-DISABLED:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-DISABLED:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-PUBLIC-ADDR:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-PUBLIC-ADDR:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-TEMP-ADDR:CAPS" href="libnm-util/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-TEMP-ADDR:CAPS">
<ANCHOR id="NMSettingIP6Config.property-details" href="libnm-util/NMSettingIP6Config.html#NMSettingIP6Config.property-details">
<ANCHOR id="NMSettingIP6Config--addresses" href="libnm-util/NMSettingIP6Config.html#NMSettingIP6Config--addresses">
<ANCHOR id="NMSettingIP6Config--dhcp-hostname" href="libnm-util/NMSettingIP6Config.html#NMSettingIP6Config--dhcp-hostname">
@@ -1299,6 +1460,10 @@
<ANCHOR id="NMSettingPPP.other_details" href="libnm-util/NMSettingPPP.html#NMSettingPPP.other_details">
<ANCHOR id="NM-SETTING-PPP-SETTING-NAME:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingPPPError" href="libnm-util/NMSettingPPP.html#NMSettingPPPError">
+<ANCHOR id="NM-SETTING-PPP-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-PPP-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-PPP-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-PPP-ERROR-REQUIRE-MPPE-NOT-ALLOWED:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-ERROR-REQUIRE-MPPE-NOT-ALLOWED:CAPS">
<ANCHOR id="NM-SETTING-PPP-ERROR:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-ERROR:CAPS">
<ANCHOR id="NM-SETTING-PPP-NOAUTH:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-NOAUTH:CAPS">
<ANCHOR id="NM-SETTING-PPP-REFUSE-EAP:CAPS" href="libnm-util/NMSettingPPP.html#NM-SETTING-PPP-REFUSE-EAP:CAPS">
@@ -1354,6 +1519,10 @@
<ANCHOR id="NMSettingPPPOE.other_details" href="libnm-util/NMSettingPPPOE.html#NMSettingPPPOE.other_details">
<ANCHOR id="NM-SETTING-PPPOE-SETTING-NAME:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingPPPOEError" href="libnm-util/NMSettingPPPOE.html#NMSettingPPPOEError">
+<ANCHOR id="NM-SETTING-PPPOE-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-PPPOE-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-PPPOE-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-PPPOE-ERROR-MISSING-PPP-SETTING:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-MISSING-PPP-SETTING:CAPS">
<ANCHOR id="NM-SETTING-PPPOE-ERROR:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR:CAPS">
<ANCHOR id="NM-SETTING-PPPOE-SERVICE:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-SERVICE:CAPS">
<ANCHOR id="NM-SETTING-PPPOE-USERNAME:CAPS" href="libnm-util/NMSettingPPPOE.html#NM-SETTING-PPPOE-USERNAME:CAPS">
@@ -1391,6 +1560,9 @@
<ANCHOR id="NMSettingVPN.other_details" href="libnm-util/NMSettingVPN.html#NMSettingVPN.other_details">
<ANCHOR id="NM-SETTING-VPN-SETTING-NAME:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingVpnError" href="libnm-util/NMSettingVPN.html#NMSettingVpnError">
+<ANCHOR id="NM-SETTING-VPN-ERROR-UNKNOWN:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-ERROR-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-VPN-ERROR-INVALID-PROPERTY:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-ERROR-INVALID-PROPERTY:CAPS">
+<ANCHOR id="NM-SETTING-VPN-ERROR-MISSING-PROPERTY:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-ERROR-MISSING-PROPERTY:CAPS">
<ANCHOR id="NM-SETTING-VPN-ERROR:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-ERROR:CAPS">
<ANCHOR id="NM-SETTING-VPN-SERVICE-TYPE:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-SERVICE-TYPE:CAPS">
<ANCHOR id="NM-SETTING-VPN-USER-NAME:CAPS" href="libnm-util/NMSettingVPN.html#NM-SETTING-VPN-USER-NAME:CAPS">
@@ -1464,6 +1636,15 @@
<ANCHOR id="nm-utils-check-virtual-device-compatibility" href="libnm-util/libnm-util-nm-utils.html#nm-utils-check-virtual-device-compatibility">
<ANCHOR id="libnm-util-nm-utils.other_details" href="libnm-util/libnm-util-nm-utils.html#libnm-util-nm-utils.other_details">
<ANCHOR id="NMUtilsSecurityType" href="libnm-util/libnm-util-nm-utils.html#NMUtilsSecurityType">
+<ANCHOR id="NMU-SEC-INVALID:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-INVALID:CAPS">
+<ANCHOR id="NMU-SEC-NONE:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-NONE:CAPS">
+<ANCHOR id="NMU-SEC-STATIC-WEP:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-STATIC-WEP:CAPS">
+<ANCHOR id="NMU-SEC-LEAP:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-LEAP:CAPS">
+<ANCHOR id="NMU-SEC-DYNAMIC-WEP:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-DYNAMIC-WEP:CAPS">
+<ANCHOR id="NMU-SEC-WPA-PSK:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-WPA-PSK:CAPS">
+<ANCHOR id="NMU-SEC-WPA-ENTERPRISE:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-WPA-ENTERPRISE:CAPS">
+<ANCHOR id="NMU-SEC-WPA2-PSK:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-WPA2-PSK:CAPS">
+<ANCHOR id="NMU-SEC-WPA2-ENTERPRISE:CAPS" href="libnm-util/libnm-util-nm-utils.html#NMU-SEC-WPA2-ENTERPRISE:CAPS">
<ANCHOR id="NM-UTILS-HWADDR-LEN-MAX:CAPS" href="libnm-util/libnm-util-nm-utils.html#NM-UTILS-HWADDR-LEN-MAX:CAPS">
<ANCHOR id="NM-UTILS-INET-ADDRSTRLEN:CAPS" href="libnm-util/libnm-util-nm-utils.html#NM-UTILS-INET-ADDRSTRLEN:CAPS">
<ANCHOR id="libnm-util-NetworkManager" href="libnm-util/libnm-util-NetworkManager.html">
@@ -1512,19 +1693,171 @@
<ANCHOR id="NM-DBUS-INTERFACE-SECRET-AGENT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DBUS-INTERFACE-SECRET-AGENT:CAPS">
<ANCHOR id="NM-DBUS-PATH-SECRET-AGENT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DBUS-PATH-SECRET-AGENT:CAPS">
<ANCHOR id="NMState" href="libnm-util/libnm-util-NetworkManager.html#NMState">
+<ANCHOR id="NM-STATE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-STATE-ASLEEP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-ASLEEP:CAPS">
+<ANCHOR id="NM-STATE-DISCONNECTED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-DISCONNECTED:CAPS">
+<ANCHOR id="NM-STATE-DISCONNECTING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-DISCONNECTING:CAPS">
+<ANCHOR id="NM-STATE-CONNECTING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-CONNECTING:CAPS">
+<ANCHOR id="NM-STATE-CONNECTED-LOCAL:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-CONNECTED-LOCAL:CAPS">
+<ANCHOR id="NM-STATE-CONNECTED-SITE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-CONNECTED-SITE:CAPS">
+<ANCHOR id="NM-STATE-CONNECTED-GLOBAL:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-CONNECTED-GLOBAL:CAPS">
<ANCHOR id="NM-STATE-CONNECTED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-STATE-CONNECTED:CAPS">
<ANCHOR id="NMConnectivityState" href="libnm-util/libnm-util-NetworkManager.html#NMConnectivityState">
+<ANCHOR id="NM-CONNECTIVITY-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-CONNECTIVITY-UNKNOWN:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-CONNECTIVITY-NONE:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-PORTAL:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-CONNECTIVITY-PORTAL:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-LIMITED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-CONNECTIVITY-LIMITED:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-FULL:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-CONNECTIVITY-FULL:CAPS">
<ANCHOR id="NMDeviceType" href="libnm-util/libnm-util-NetworkManager.html#NMDeviceType">
+<ANCHOR id="NM-DEVICE-TYPE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-ETHERNET:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-ETHERNET:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-WIFI:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-WIFI:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-UNUSED1:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-UNUSED1:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-UNUSED2:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-UNUSED2:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-BT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-BT:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-OLPC-MESH:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-OLPC-MESH:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-WIMAX:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-WIMAX:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-MODEM:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-MODEM:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-INFINIBAND:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-INFINIBAND:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-BOND:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-BOND:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-VLAN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-VLAN:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-ADSL:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-ADSL:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-BRIDGE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-BRIDGE:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-GENERIC:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-GENERIC:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-TEAM:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-TYPE-TEAM:CAPS">
<ANCHOR id="NMDeviceCapabilities" href="libnm-util/libnm-util-NetworkManager.html#NMDeviceCapabilities">
+<ANCHOR id="NM-DEVICE-CAP-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-CAP-NONE:CAPS">
+<ANCHOR id="NM-DEVICE-CAP-NM-SUPPORTED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-CAP-NM-SUPPORTED:CAPS">
+<ANCHOR id="NM-DEVICE-CAP-CARRIER-DETECT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-CAP-CARRIER-DETECT:CAPS">
+<ANCHOR id="NM-DEVICE-CAP-IS-SOFTWARE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-CAP-IS-SOFTWARE:CAPS">
<ANCHOR id="NMDeviceWifiCapabilities" href="libnm-util/libnm-util-NetworkManager.html#NMDeviceWifiCapabilities">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-NONE:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-WEP40:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP40:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-WEP104:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP104:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-TKIP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-TKIP:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-CCMP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-CCMP:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-WPA:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-WPA:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-RSN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-RSN:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-AP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-AP:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-ADHOC:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-ADHOC:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-FREQ-VALID:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-FREQ-VALID:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-FREQ-2GHZ:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-FREQ-2GHZ:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-FREQ-5GHZ:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-FREQ-5GHZ:CAPS">
<ANCHOR id="NM80211ApFlags" href="libnm-util/libnm-util-NetworkManager.html#NM80211ApFlags">
+<ANCHOR id="NM-802-11-AP-FLAGS-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-FLAGS-NONE:CAPS">
+<ANCHOR id="NM-802-11-AP-FLAGS-PRIVACY:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-FLAGS-PRIVACY:CAPS">
<ANCHOR id="NM80211ApSecurityFlags" href="libnm-util/libnm-util-NetworkManager.html#NM80211ApSecurityFlags">
+<ANCHOR id="NM-802-11-AP-SEC-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-NONE:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-WEP40:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-WEP40:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-WEP104:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-WEP104:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-TKIP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-TKIP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-CCMP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-CCMP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-WEP40:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-WEP40:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-WEP104:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-WEP104:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-TKIP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-TKIP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-CCMP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-CCMP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-KEY-MGMT-PSK:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-KEY-MGMT-PSK:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-KEY-MGMT-802-1X:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-AP-SEC-KEY-MGMT-802-1X:CAPS">
<ANCHOR id="NM80211Mode" href="libnm-util/libnm-util-NetworkManager.html#NM80211Mode">
+<ANCHOR id="NM-802-11-MODE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-MODE-UNKNOWN:CAPS">
+<ANCHOR id="NM-802-11-MODE-ADHOC:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-MODE-ADHOC:CAPS">
+<ANCHOR id="NM-802-11-MODE-INFRA:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-MODE-INFRA:CAPS">
+<ANCHOR id="NM-802-11-MODE-AP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-802-11-MODE-AP:CAPS">
<ANCHOR id="NMBluetoothCapabilities" href="libnm-util/libnm-util-NetworkManager.html#NMBluetoothCapabilities">
+<ANCHOR id="NM-BT-CAPABILITY-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-BT-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-BT-CAPABILITY-DUN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-BT-CAPABILITY-DUN:CAPS">
+<ANCHOR id="NM-BT-CAPABILITY-NAP:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-BT-CAPABILITY-NAP:CAPS">
<ANCHOR id="NMDeviceModemCapabilities" href="libnm-util/libnm-util-NetworkManager.html#NMDeviceModemCapabilities">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-POTS:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-POTS:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-CDMA-EVDO:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-CDMA-EVDO:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-GSM-UMTS:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-GSM-UMTS:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-LTE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-LTE:CAPS">
<ANCHOR id="NMDeviceState" href="libnm-util/libnm-util-NetworkManager.html#NMDeviceState">
+<ANCHOR id="NM-DEVICE-STATE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-UNMANAGED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-UNMANAGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-UNAVAILABLE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-DISCONNECTED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-DISCONNECTED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-PREPARE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-PREPARE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-CONFIG:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-CONFIG:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-NEED-AUTH:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-NEED-AUTH:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-IP-CONFIG:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-IP-CONFIG:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-IP-CHECK:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-IP-CHECK:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-SECONDARIES:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-SECONDARIES:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-ACTIVATED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-ACTIVATED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-DEACTIVATING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-DEACTIVATING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-FAILED:CAPS">
<ANCHOR id="NMDeviceStateReason" href="libnm-util/libnm-util-NetworkManager.html#NMDeviceStateReason">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NONE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NOW-MANAGED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NOW-MANAGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NOW-UNMANAGED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NOW-UNMANAGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CONFIG-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CONFIG-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-IP-CONFIG-UNAVAILABLE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-IP-CONFIG-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-IP-CONFIG-EXPIRED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-IP-CONFIG-EXPIRED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NO-SECRETS:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NO-SECRETS:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-DISCONNECT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-DISCONNECT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-CONFIG-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-CONFIG-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-TIMEOUT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-TIMEOUT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PPP-START-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PPP-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PPP-DISCONNECT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PPP-DISCONNECT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PPP-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PPP-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DHCP-START-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DHCP-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DHCP-ERROR:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DHCP-ERROR:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DHCP-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DHCP-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SHARED-START-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SHARED-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SHARED-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SHARED-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-AUTOIP-START-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-AUTOIP-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-AUTOIP-ERROR:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-AUTOIP-ERROR:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-AUTOIP-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-AUTOIP-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-BUSY:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-BUSY:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-NO-DIAL-TONE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-NO-DIAL-TONE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-NO-CARRIER:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-NO-CARRIER:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-DIAL-TIMEOUT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-TIMEOUT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-DIAL-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-INIT-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-INIT-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-APN-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-APN-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-NOT-SEARCHING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-NOT-SEARCHING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-DENIED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-DENIED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-TIMEOUT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-TIMEOUT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-PIN-CHECK-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-PIN-CHECK-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-FIRMWARE-MISSING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-FIRMWARE-MISSING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-REMOVED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-REMOVED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SLEEPING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SLEEPING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CONNECTION-REMOVED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CONNECTION-REMOVED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-USER-REQUESTED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-USER-REQUESTED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CARRIER:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CARRIER:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CONNECTION-ASSUMED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CONNECTION-ASSUMED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-AVAILABLE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-AVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-NOT-FOUND:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-NOT-FOUND:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-BT-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-BT-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-NOT-INSERTED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-NOT-INSERTED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-PIN-REQUIRED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-PIN-REQUIRED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-PUK-REQUIRED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-PUK-REQUIRED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-WRONG:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-WRONG:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-INFINIBAND-MODE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-INFINIBAND-MODE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DEPENDENCY-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DEPENDENCY-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-BR2684-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-BR2684-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-MANAGER-UNAVAILABLE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-MANAGER-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SSID-NOT-FOUND:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SSID-NOT-FOUND:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SECONDARY-CONNECTION-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SECONDARY-CONNECTION-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DCB-FCOE-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DCB-FCOE-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-TEAMD-CONTROL-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-TEAMD-CONTROL-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-AVAILABLE:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-AVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SIM-PIN-INCORRECT:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SIM-PIN-INCORRECT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NEW-ACTIVATION:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NEW-ACTIVATION:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-LAST:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-LAST:CAPS">
<ANCHOR id="NMActiveConnectionState" href="libnm-util/libnm-util-NetworkManager.html#NMActiveConnectionState">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-ACTIVATING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATING:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-DEACTIVATING:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATING:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-DEACTIVATED:CAPS" href="libnm-util/libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATED:CAPS">
<ANCHOR id="libnm-util-NetworkManagerVPN" href="libnm-util/libnm-util-NetworkManagerVPN.html">
<ANCHOR id="libnm-util-NetworkManagerVPN.other" href="libnm-util/libnm-util-NetworkManagerVPN.html#libnm-util-NetworkManagerVPN.other">
<ANCHOR id="libnm-util-NetworkManagerVPN.description" href="libnm-util/libnm-util-NetworkManagerVPN.html#libnm-util-NetworkManagerVPN.description">
@@ -1556,9 +1889,39 @@
<ANCHOR id="NM-DBUS-VPN-SIGNAL-STATE-CHANGE:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-DBUS-VPN-SIGNAL-STATE-CHANGE:CAPS">
<ANCHOR id="NM-DBUS-VPN-SIGNAL-IP4-CONFIG:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-DBUS-VPN-SIGNAL-IP4-CONFIG:CAPS">
<ANCHOR id="NMVPNServiceState" href="libnm-util/libnm-util-NetworkManagerVPN.html#NMVPNServiceState">
+<ANCHOR id="NM-VPN-SERVICE-STATE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-INIT:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-INIT:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-SHUTDOWN:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-SHUTDOWN:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STARTING:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STARTING:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STARTED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STARTED:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STOPPING:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STOPPING:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STOPPED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STOPPED:CAPS">
<ANCHOR id="NMVPNConnectionState" href="libnm-util/libnm-util-NetworkManagerVPN.html#NMVPNConnectionState">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-PREPARE:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-PREPARE:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-NEED-AUTH:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-NEED-AUTH:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-CONNECT:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-CONNECT:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-IP-CONFIG-GET:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-IP-CONFIG-GET:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-ACTIVATED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-ACTIVATED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-FAILED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-DISCONNECTED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-DISCONNECTED:CAPS">
<ANCHOR id="NMVPNConnectionStateReason" href="libnm-util/libnm-util-NetworkManagerVPN.html#NMVPNConnectionStateReason">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-UNKNOWN:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-UNKNOWN:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-NONE:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-NONE:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-USER-DISCONNECTED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-USER-DISCONNECTED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-DEVICE-DISCONNECTED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-DEVICE-DISCONNECTED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-SERVICE-STOPPED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-STOPPED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-IP-CONFIG-INVALID:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-IP-CONFIG-INVALID:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-CONNECT-TIMEOUT:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-CONNECT-TIMEOUT:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-TIMEOUT:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-TIMEOUT:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-FAILED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-NO-SECRETS:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-NO-SECRETS:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-LOGIN-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-LOGIN-FAILED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-CONNECTION-REMOVED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-CONNECTION-REMOVED:CAPS">
<ANCHOR id="NMVPNPluginFailure" href="libnm-util/libnm-util-NetworkManagerVPN.html#NMVPNPluginFailure">
+<ANCHOR id="NM-VPN-PLUGIN-FAILURE-LOGIN-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-FAILURE-LOGIN-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-FAILURE-CONNECT-FAILED:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-FAILURE-CONNECT-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-FAILURE-BAD-IP-CONFIG:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-FAILURE-BAD-IP-CONFIG:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-CONFIG-TUNDEV:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-CONFIG-TUNDEV:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-CONFIG-BANNER:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-CONFIG-BANNER:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-CONFIG-EXT-GATEWAY:CAPS" href="libnm-util/libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-CONFIG-EXT-GATEWAY:CAPS">
@@ -1599,6 +1962,7 @@
<ANCHOR id="annotation-glossterm-inout" href="libnm-util/annotation-glossary.html#annotation-glossterm-inout">
<ANCHOR id="annotation-glossterm-out" href="libnm-util/annotation-glossary.html#annotation-glossterm-out">
<ANCHOR id="annotation-glossterm-scope call" href="libnm-util/annotation-glossary.html#annotation-glossterm-scope call">
+<ANCHOR id="annotation-glossterm-skip" href="libnm-util/annotation-glossary.html#annotation-glossterm-skip">
<ANCHOR id="annotation-glossterm-transfer container" href="libnm-util/annotation-glossary.html#annotation-glossterm-transfer container">
<ANCHOR id="annotation-glossterm-transfer full" href="libnm-util/annotation-glossary.html#annotation-glossterm-transfer full">
<ANCHOR id="annotation-glossterm-transfer none" href="libnm-util/annotation-glossary.html#annotation-glossterm-transfer none">
diff --git a/docs/libnm-util/html/libnm-util-NetworkManager.html b/docs/libnm-util/html/libnm-util-NetworkManager.html
index bbad114b8..1154416a2 100644
--- a/docs/libnm-util/html/libnm-util-NetworkManager.html
+++ b/docs/libnm-util/html/libnm-util-NetworkManager.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NetworkManager</title>
+<title>NetworkManager: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="libnm-util-nm-utils.html" title="nm-utils">
<link rel="next" href="libnm-util-NetworkManagerVPN.html" title="NetworkManagerVPN">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -260,11 +260,10 @@
</div>
<div class="refsect1">
<a name="libnm-util-NetworkManager.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-util-NetworkManager.functions_details"></a><h2>Functions</h2>
+<p></p>
</div>
<div class="refsect1">
<a name="libnm-util-NetworkManager.other_details"></a><h2>Types and Values</h2>
@@ -272,320 +271,240 @@
<a name="NM-DBUS-SERVICE:CAPS"></a><h3>NM_DBUS_SERVICE</h3>
<pre class="programlisting">#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH:CAPS"></a><h3>NM_DBUS_PATH</h3>
<pre class="programlisting">#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE:CAPS"></a><h3>NM_DBUS_INTERFACE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-WIRED:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_WIRED</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-ADSL:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_ADSL</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_ADSL NM_DBUS_INTERFACE_DEVICE ".Adsl"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-WIRELESS:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_WIRELESS</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-BLUETOOTH:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_BLUETOOTH</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_BLUETOOTH NM_DBUS_INTERFACE_DEVICE ".Bluetooth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-OLPC-MESH:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_OLPC_MESH</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_OLPC_MESH NM_DBUS_INTERFACE_DEVICE ".OlpcMesh"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-ACCESS-POINT:CAPS"></a><h3>NM_DBUS_PATH_ACCESS_POINT</h3>
<pre class="programlisting">#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-ACCESS-POINT:CAPS"></a><h3>NM_DBUS_INTERFACE_ACCESS_POINT</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-MODEM:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_MODEM</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-WIMAX:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_WIMAX</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_WIMAX NM_DBUS_INTERFACE_DEVICE ".WiMax"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-WIMAX-NSP:CAPS"></a><h3>NM_DBUS_INTERFACE_WIMAX_NSP</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_WIMAX_NSP NM_DBUS_INTERFACE ".WiMax.Nsp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-WIMAX-NSP:CAPS"></a><h3>NM_DBUS_PATH_WIMAX_NSP</h3>
<pre class="programlisting">#define NM_DBUS_PATH_WIMAX_NSP NM_DBUS_PATH "/Nsp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-ACTIVE-CONNECTION:CAPS"></a><h3>NM_DBUS_INTERFACE_ACTIVE_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-IP4-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DHCP4-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_DHCP4_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DHCP4_CONFIG NM_DBUS_INTERFACE ".DHCP4Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-IP6-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_IP6_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_IP6_CONFIG NM_DBUS_INTERFACE ".IP6Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DHCP6-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_DHCP6_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DHCP6_CONFIG NM_DBUS_INTERFACE ".DHCP6Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-INFINIBAND:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_INFINIBAND</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_INFINIBAND NM_DBUS_INTERFACE_DEVICE ".Infiniband"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-BOND:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_BOND</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_BOND NM_DBUS_INTERFACE_DEVICE ".Bond"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-TEAM:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_TEAM</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_TEAM NM_DBUS_INTERFACE_DEVICE ".Team"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-VLAN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_VLAN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_VLAN NM_DBUS_INTERFACE_DEVICE ".Vlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-BRIDGE:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_BRIDGE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_BRIDGE NM_DBUS_INTERFACE_DEVICE ".Bridge"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-GENERIC:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_GENERIC</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_GENERIC NM_DBUS_INTERFACE_DEVICE ".Generic"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-VETH:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_VETH</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_VETH NM_DBUS_INTERFACE_DEVICE ".Veth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-TUN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_TUN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_TUN NM_DBUS_INTERFACE_DEVICE ".Tun"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-MACVLAN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_MACVLAN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_MACVLAN NM_DBUS_INTERFACE_DEVICE ".Macvlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-VXLAN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_VXLAN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_VXLAN NM_DBUS_INTERFACE_DEVICE ".Vxlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-GRE:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_GRE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_GRE NM_DBUS_INTERFACE_DEVICE ".Gre"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-IFACE-SETTINGS:CAPS"></a><h3>NM_DBUS_IFACE_SETTINGS</h3>
<pre class="programlisting">#define NM_DBUS_IFACE_SETTINGS "org.freedesktop.NetworkManager.Settings"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-SETTINGS:CAPS"></a><h3>NM_DBUS_PATH_SETTINGS</h3>
<pre class="programlisting">#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-IFACE-SETTINGS-CONNECTION:CAPS"></a><h3>NM_DBUS_IFACE_SETTINGS_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_IFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-SETTINGS-CONNECTION:CAPS"></a><h3>NM_DBUS_PATH_SETTINGS_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_PATH_SETTINGS_CONNECTION "/org/freedesktop/NetworkManager/Settings/Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-IFACE-SETTINGS-CONNECTION-SECRETS:CAPS"></a><h3>NM_DBUS_IFACE_SETTINGS_CONNECTION_SECRETS</h3>
<pre class="programlisting">#define NM_DBUS_IFACE_SETTINGS_CONNECTION_SECRETS "org.freedesktop.NetworkManager.Settings.Connection.Secrets"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-AGENT-MANAGER:CAPS"></a><h3>NM_DBUS_INTERFACE_AGENT_MANAGER</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_AGENT_MANAGER NM_DBUS_INTERFACE ".AgentManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-AGENT-MANAGER:CAPS"></a><h3>NM_DBUS_PATH_AGENT_MANAGER</h3>
<pre class="programlisting">#define NM_DBUS_PATH_AGENT_MANAGER "/org/freedesktop/NetworkManager/AgentManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-SECRET-AGENT:CAPS"></a><h3>NM_DBUS_INTERFACE_SECRET_AGENT</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_SECRET_AGENT NM_DBUS_INTERFACE ".SecretAgent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-SECRET-AGENT:CAPS"></a><h3>NM_DBUS_PATH_SECRET_AGENT</h3>
<pre class="programlisting">#define NM_DBUS_PATH_SECRET_AGENT "/org/freedesktop/NetworkManager/SecretAgent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -666,8 +585,6 @@
<a name="NM-STATE-CONNECTED:CAPS"></a><h3>NM_STATE_CONNECTED</h3>
<pre class="programlisting">#define NM_STATE_CONNECTED NM_STATE_CONNECTED_GLOBAL
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -723,7 +640,7 @@
</tbody>
</table></div>
</div>
-<p class="since">Since 0.9.8.6</p>
+<p class="since">Since: 0.9.8.6</p>
</div>
<hr>
<div class="refsect2">
@@ -1865,10 +1782,24 @@ GPRS, EDGE, UMTS, HSDPA, HSUPA, or HSPA+ packet switched data capability</p>
<td class="enum_member_annotations"> </td>
</tr>
<tr>
-<td class="enum_member_name"><p><a name="NM-DEVICE-STATE-REASON-LAST:CAPS"></a>NM_DEVICE_STATE_REASON_LAST</p></td>
-<td class="enum_member_description"> </td>
+<td class="enum_member_name"><p><a name="NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS"></a>NM_DEVICE_STATE_REASON_PARENT_CHANGED</p></td>
+<td class="enum_member_description">
+<p>the device's parent changed</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS"></a>NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED</p></td>
+<td class="enum_member_description">
+<p>the device parent's management changed</p>
+</td>
<td class="enum_member_annotations"> </td>
</tr>
+<tr>
+<td class="enum_member_name"><p><a name="NM-DEVICE-STATE-REASON-LAST:CAPS"></a>NM_DEVICE_STATE_REASON_LAST</p></td>
+<td> </td>
+<td> </td>
+</tr>
</tbody>
</table></div>
</div>
@@ -1933,7 +1864,6 @@ network.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/libnm-util-NetworkManagerVPN.html b/docs/libnm-util/html/libnm-util-NetworkManagerVPN.html
index 3d488c048..cee007fc2 100644
--- a/docs/libnm-util/html/libnm-util-NetworkManagerVPN.html
+++ b/docs/libnm-util/html/libnm-util-NetworkManagerVPN.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: NetworkManagerVPN</title>
+<title>NetworkManagerVPN: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="libnm-util-NetworkManager.html" title="NetworkManager">
<link rel="next" href="object-tree.html" title="Object Hierarchy">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -292,11 +292,10 @@
</div>
<div class="refsect1">
<a name="libnm-util-NetworkManagerVPN.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-util-NetworkManagerVPN.functions_details"></a><h2>Functions</h2>
+<p></p>
</div>
<div class="refsect1">
<a name="libnm-util-NetworkManagerVPN.other_details"></a><h2>Types and Values</h2>
@@ -304,200 +303,150 @@
<a name="NM-DBUS-PATH-VPN:CAPS"></a><h3>NM_DBUS_PATH_VPN</h3>
<pre class="programlisting">#define NM_DBUS_PATH_VPN "/org/freedesktop/NetworkManager/VPN/Manager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-VPN:CAPS"></a><h3>NM_DBUS_INTERFACE_VPN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_VPN "org.freedesktop.NetworkManager.VPN.Manager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_PATH_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_PATH_VPN_CONNECTION "/org/freedesktop/NetworkManager/VPN/Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_INTERFACE_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPN.Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-DBUS-PLUGIN-PATH:CAPS"></a><h3>NM_VPN_DBUS_PLUGIN_PATH</h3>
<pre class="programlisting">#define NM_VPN_DBUS_PLUGIN_PATH "/org/freedesktop/NetworkManager/VPN/Plugin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-DBUS-PLUGIN-INTERFACE:CAPS"></a><h3>NM_VPN_DBUS_PLUGIN_INTERFACE</h3>
<pre class="programlisting">#define NM_VPN_DBUS_PLUGIN_INTERFACE "org.freedesktop.NetworkManager.VPN.Plugin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-NO-ACTIVE-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_NO_ACTIVE_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_NO_ACTIVE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPNConnections.NoActiveVPNConnection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-NO-VPN-CONNECTIONS:CAPS"></a><h3>NM_DBUS_NO_VPN_CONNECTIONS</h3>
<pre class="programlisting">#define NM_DBUS_NO_VPN_CONNECTIONS "org.freedesktop.NetworkManager.VPNConnections.NoVPNConnections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INVALID-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_INVALID_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INVALID_VPN_CONNECTION "org.freedesktop.NetworkManager.VPNConnections.InvalidVPNConnection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-ERROR-PREFIX:CAPS"></a><h3>NM_DBUS_VPN_ERROR_PREFIX</h3>
<pre class="programlisting">#define NM_DBUS_VPN_ERROR_PREFIX "org.freedesktop.NetworkManager.VPN.Error"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-STARTING-IN-PROGRESS:CAPS"></a><h3>NM_DBUS_VPN_STARTING_IN_PROGRESS</h3>
<pre class="programlisting">#define NM_DBUS_VPN_STARTING_IN_PROGRESS "StartingInProgress"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-ALREADY-STARTED:CAPS"></a><h3>NM_DBUS_VPN_ALREADY_STARTED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_ALREADY_STARTED "AlreadyStarted"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-STOPPING-IN-PROGRESS:CAPS"></a><h3>NM_DBUS_VPN_STOPPING_IN_PROGRESS</h3>
<pre class="programlisting">#define NM_DBUS_VPN_STOPPING_IN_PROGRESS "StoppingInProgress"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-ALREADY-STOPPED:CAPS"></a><h3>NM_DBUS_VPN_ALREADY_STOPPED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_ALREADY_STOPPED "AlreadyStopped"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-WRONG-STATE:CAPS"></a><h3>NM_DBUS_VPN_WRONG_STATE</h3>
<pre class="programlisting">#define NM_DBUS_VPN_WRONG_STATE "WrongState"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-BAD-ARGUMENTS:CAPS"></a><h3>NM_DBUS_VPN_BAD_ARGUMENTS</h3>
<pre class="programlisting">#define NM_DBUS_VPN_BAD_ARGUMENTS "BadArguments"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-INTERACTIVE-NOT-SUPPORTED:CAPS"></a><h3>NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED "InteractiveNotSupported"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-LOGIN-BANNER:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_LOGIN_BANNER</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_LOGIN_BANNER "LoginBanner"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-LOGIN-FAILED:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_LOGIN_FAILED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_LOGIN_FAILED "LoginFailed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-LAUNCH-FAILED:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED "LaunchFailed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-CONNECT-FAILED:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_CONNECT_FAILED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_CONNECT_FAILED "ConnectFailed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-VPN-CONFIG-BAD:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD "VPNConfigBad"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-IP-CONFIG-BAD:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD "IPConfigBad"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-STATE-CHANGE:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_STATE_CHANGE</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_STATE_CHANGE "StateChange"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-IP4-CONFIG:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_IP4_CONFIG "IP4Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -803,269 +752,202 @@
<a name="NM-VPN-PLUGIN-CONFIG-TUNDEV:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_TUNDEV</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_TUNDEV "tundev"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-BANNER:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_BANNER</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_BANNER "banner"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-EXT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY "gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-MTU:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_MTU</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-HAS-IP4:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_HAS_IP4</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_HAS_IP4 "has-ip4"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-HAS-IP6:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_HAS_IP6</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_HAS_IP6 "has-ip6"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CAN-PERSIST:CAPS"></a><h3>NM_VPN_PLUGIN_CAN_PERSIST</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CAN_PERSIST "can-persist"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-INT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY "internal-gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-ADDRESS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS "address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-PTP:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_PTP</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_PTP "ptp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-PREFIX:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_PREFIX</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_PREFIX "prefix"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-DNS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-NBNS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_NBNS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_NBNS "nbns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-MSS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_MSS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_MSS "mss"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-DOMAIN:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN "domain"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-DOMAINS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-ROUTES:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-BANNER:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_BANNER</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_BANNER NM_VPN_PLUGIN_CONFIG_BANNER
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-EXT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-MTU:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_MTU</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_MTU NM_VPN_PLUGIN_CONFIG_MTU
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-TUNDEV:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV NM_VPN_PLUGIN_CONFIG_TUNDEV
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-INT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY "internal-gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-ADDRESS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS "address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-PTP:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_PTP</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_PTP "ptp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-PREFIX:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_PREFIX</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_PREFIX "prefix"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-DNS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-MSS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_MSS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_MSS "mss"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-DOMAIN:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN "domain"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-DOMAINS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-ROUTES:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/libnm-util-nm-utils.html b/docs/libnm-util/html/libnm-util-nm-utils.html
index bdd5ddbd0..9507d0aba 100644
--- a/docs/libnm-util/html/libnm-util-nm-utils.html
+++ b/docs/libnm-util/html/libnm-util-nm-utils.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: nm-utils</title>
+<title>nm-utils: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="ch01.html" title="libnm-util API Reference">
<link rel="prev" href="NMSettingVPN.html" title="NMSettingVPN">
<link rel="next" href="libnm-util-NetworkManager.html" title="NetworkManager">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -520,7 +520,6 @@ uses libnm-util. This function can be called more than once.</p>
<div class="refsect3">
<a name="id-1.2.30.8.2.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the initialization was successful, <code class="literal">FALSE</code> on failure.</p>
-<p></p>
</div>
</div>
<hr>
@@ -566,7 +565,6 @@ number of known SSID-cloaking methods.</p>
<div class="refsect3">
<a name="id-1.2.30.8.4.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the SSID is "empty", <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -606,7 +604,6 @@ be used for display of SSIDs.</p>
<a name="id-1.2.30.8.5.6"></a><h4>Returns</h4>
<p> pointer to the escaped SSID, which uses an internal static buffer
and will be overwritten by subsequent calls to this function</p>
-<p></p>
</div>
</div>
<hr>
@@ -652,7 +649,6 @@ NULLs, even though that is functionally pointless.</p>
<div class="refsect3">
<a name="id-1.2.30.8.6.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the SSIDs are the same, <code class="literal">FALSE</code> if they are not</p>
-<p></p>
</div>
</div>
<hr>
@@ -741,8 +737,9 @@ nm_utils_slist_free (<em class="parameter"><code><span class="type">GSList</span
<p>use <code class="function">g_slist_free_full()</code>.</p>
</div>
<p>Utility function to free a <span class="type">GSList</span>.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.2.30.8.9.6"></a><h4>Parameters</h4>
+<a name="id-1.2.30.8.9.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -840,7 +837,6 @@ e.g. (<a class="link" href="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR
<p> <code class="literal">TRUE</code> if the device capabilities and AP capabilties intersect and are
compatible with the desired <em class="parameter"><code>type</code></em>
, <code class="literal">FALSE</code> if they are not</p>
-<p></p>
</div>
</div>
<hr>
@@ -881,9 +877,8 @@ e.g. <a class="link" href="libnm-util-nm-utils.html#NMU-SEC-STATIC-WEP:CAPS"><sp
<p> <code class="literal">TRUE</code> if the device capabilities are compatible with the desired
<em class="parameter"><code>type</code></em>
, <code class="literal">FALSE</code> if they are not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -919,9 +914,8 @@ nm_utils_wep_key_valid (<em class="parameter"><code>const <span class="type">cha
<a name="id-1.2.30.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>key</code></em>
is a WEP key, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -949,9 +943,8 @@ nm_utils_wpa_psk_valid (<em class="parameter"><code>const <span class="type">cha
<a name="id-1.2.30.8.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>psk</code></em>
is a WPA PSK, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -1110,7 +1103,6 @@ nm_utils_ip4_netmask_to_prefix (<em class="parameter"><code><span class="type">g
<div class="refsect3">
<a name="id-1.2.30.8.18.5"></a><h4>Returns</h4>
<p> the CIDR prefix represented by the netmask</p>
-<p></p>
</div>
</div>
<hr>
@@ -1136,7 +1128,6 @@ nm_utils_ip4_prefix_to_netmask (<em class="parameter"><code><span class="type">g
<div class="refsect3">
<a name="id-1.2.30.8.19.5"></a><h4>Returns</h4>
<p> the netmask represented by the prefix, in network byte order</p>
-<p></p>
</div>
</div>
<hr>
@@ -1166,7 +1157,6 @@ falls in the predefined classes.</p>
<div class="refsect3">
<a name="id-1.2.30.8.20.6"></a><h4>Returns</h4>
<p> the default class prefix for the given IP</p>
-<p></p>
</div>
</div>
<hr>
@@ -1311,8 +1301,9 @@ which should be unset by the caller (when no longer needed) with
nm_utils_ip6_dns_from_gvalue (<em class="parameter"><code>const <span class="type">GValue</span> *value</code></em>);</pre>
<p>Converts a <span class="type">GValue</span> containing a <span class="type">GPtrArray</span> of IP6 DNS, represented as
<span class="type">GByteArrays</span> into a <span class="type">GSList</span> of <code class="literal"><span class="type">struct in6_addr</span></code>s.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.2.30.8.25.5"></a><h4>Parameters</h4>
+<a name="id-1.2.30.8.25.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1327,9 +1318,8 @@ nm_utils_ip6_dns_from_gvalue (<em class="parameter"><code>const <span class="typ
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.2.30.8.25.6"></a><h4>Returns</h4>
+<a name="id-1.2.30.8.25.7"></a><h4>Returns</h4>
<p> a <span class="type">GSList</span> of IP6 addresses.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1343,8 +1333,9 @@ in6_addr</span></code> structs into a <span class="type">GPtrArray</span> of <sp
representing each server's IPv6 addresses in network byte order.
The specific format of this serialization is not guaranteed to be
stable and may be extended in the future.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.2.30.8.26.5"></a><h4>Parameters</h4>
+<a name="id-1.2.30.8.26.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1377,7 +1368,6 @@ nm_utils_uuid_generate (<em class="parameter"><code><span class="type">void</spa
<a name="id-1.2.30.8.27.4"></a><h4>Returns</h4>
<p> a newly allocated UUID suitable for use as the <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a>
object's <a class="link" href="NMSettingConnection.html#NMSettingConnection--id" title="The “id” property"><span class="type">“id”</span></a>: property. Should be freed with <code class="function">g_free()</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -1406,7 +1396,6 @@ nm_utils_uuid_generate_from_string (<em class="parameter"><code>const <span clas
<a name="id-1.2.30.8.28.6"></a><h4>Returns</h4>
<p> a newly allocated UUID suitable for use as the <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a>
object's <a class="link" href="NMSettingConnection.html#NMSettingConnection--id" title="The “id” property"><span class="type">“id”</span></a>: property</p>
-<p></p>
</div>
</div>
<hr>
@@ -1538,7 +1527,6 @@ nm_utils_file_is_pkcs12 (<em class="parameter"><code>const <span class="type">ch
<div class="refsect3">
<a name="id-1.2.30.8.31.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the file is PKCS#12, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1547,12 +1535,6 @@ nm_utils_file_is_pkcs12 (<em class="parameter"><code>const <span class="type">ch
<pre class="programlisting"><span class="returnvalue">gboolean</span>
<span class="c_punctuation">(</span>*NMUtilsFileSearchInPathsPredicate<span class="c_punctuation">)</span> (<em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.2.30.8.32.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -1659,7 +1641,6 @@ nm_utils_wifi_freq_to_channel (<em class="parameter"><code><span class="type">gu
<div class="refsect3">
<a name="id-1.2.30.8.34.6"></a><h4>Returns</h4>
<p> the channel represented by the frequency or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -1696,7 +1677,6 @@ nm_utils_wifi_channel_to_freq (<em class="parameter"><code><span class="type">gu
<p> the frequency represented by the channel of the band,
or -1 when the freq is invalid, or 0 when the band
is invalid</p>
-<p></p>
</div>
</div>
<hr>
@@ -1737,7 +1717,6 @@ nm_utils_wifi_find_next_channel (<em class="parameter"><code><span class="type">
<div class="refsect3">
<a name="id-1.2.30.8.36.6"></a><h4>Returns</h4>
<p> the next channel in the specified direction or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -1772,7 +1751,6 @@ nm_utils_wifi_is_channel_valid (<em class="parameter"><code><span class="type">g
<div class="refsect3">
<a name="id-1.2.30.8.37.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> or <code class="literal">FALSE</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -1801,7 +1779,6 @@ nm_utils_hwaddr_len (<em class="parameter"><code><span class="type">int</span> t
<div class="refsect3">
<a name="id-1.2.30.8.38.6"></a><h4>Returns</h4>
<p> the positive length, or -1 if the type is unknown/unsupported.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1840,7 +1817,6 @@ a length; but you can just use <a class="link" href="libnm-util-nm-utils.html#nm
<p> the type, either <code class="literal">ARPHRD_ETHER</code> or
<code class="literal">ARPHRD_INFINIBAND</code>. If the length is unexpected, return -1
(unsupported type/length).</p>
-<p></p>
</div>
</div>
<hr>
@@ -1970,7 +1946,6 @@ instead of a type.</p>
<p> <em class="parameter"><code>buffer</code></em>
, or <code class="literal">NULL</code> if <em class="parameter"><code>asc</code></em>
couldn't be parsed</p>
-<p></p>
</div>
</div>
<hr>
@@ -2010,7 +1985,7 @@ nm_utils_hwaddr_ntoa_len (<em class="parameter"><code><span class="type">gconstp
. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2059,9 +2034,8 @@ the size of the buffer in bytes.</p></td>
couldn't be parsed
or would be shorter or longer than <em class="parameter"><code>length</code></em>
.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2090,9 +2064,8 @@ nm_utils_hwaddr_valid (<em class="parameter"><code>const <span class="type">char
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>asc</code></em>
appears to be a valid hardware address
of some type, <code class="literal">FALSE</code> if not.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2140,7 +2113,7 @@ array</p></td>
. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2167,9 +2140,8 @@ nm_utils_hex2byte (<em class="parameter"><code>const <span class="type">char</sp
<a name="id-1.2.30.8.47.6"></a><h4>Returns</h4>
<p> a byte, or -1 if <em class="parameter"><code>hex</code></em>
doesn't represent a hex byte</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2209,7 +2181,7 @@ string (it has to be even)</p></td>
<p> a array of bytes, or <code class="literal">NULL</code> on error. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2236,9 +2208,8 @@ function in net/core/dev.c.</p>
<div class="refsect3">
<a name="id-1.2.30.8.49.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if interface name is valid, otherwise <code class="literal">FALSE</code> is returned.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -2266,9 +2237,8 @@ nm_utils_is_uuid (<em class="parameter"><code>const <span class="type">char</spa
<a name="id-1.2.30.8.50.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>str</code></em>
is a UUID, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
-<p class="since">Since 0.9.8</p>
+<p class="since">Since: 0.9.8</p>
</div>
<hr>
<div class="refsect2">
@@ -2277,8 +2247,9 @@ is a UUID, <code class="literal">FALSE</code> if not</p>
nm_utils_inet4_ntop (<em class="parameter"><code><span class="type">in_addr_t</span> inaddr</code></em>,
<em class="parameter"><code><span class="type">char</span> *dst</code></em>);</pre>
<p>Wrapper for inet_ntop.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.2.30.8.51.5"></a><h4>Parameters</h4>
+<a name="id-1.2.30.8.51.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2309,13 +2280,12 @@ buffer to avoid these issues.</p></td>
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.2.30.8.51.6"></a><h4>Returns</h4>
+<a name="id-1.2.30.8.51.7"></a><h4>Returns</h4>
<p> the input buffer <em class="parameter"><code>dst</code></em>
, or a pointer to an
internal, static buffer. This function cannot fail.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2324,8 +2294,9 @@ internal, static buffer. This function cannot fail.</p>
nm_utils_inet6_ntop (<em class="parameter"><code>const <span class="type">struct in6_addr</span> *in6addr</code></em>,
<em class="parameter"><code><span class="type">char</span> *dst</code></em>);</pre>
<p>Wrapper for inet_ntop.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.2.30.8.52.5"></a><h4>Parameters</h4>
+<a name="id-1.2.30.8.52.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2356,15 +2327,14 @@ buffer to avoid these issues.</p></td>
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.2.30.8.52.6"></a><h4>Returns</h4>
+<a name="id-1.2.30.8.52.7"></a><h4>Returns</h4>
<p> the input buffer <em class="parameter"><code>dst</code></em>
, or a pointer to an
internal, static buffer. <code class="literal">NULL</code> is not allowed as <em class="parameter"><code>in6addr</code></em>
,
otherwise, this function cannot fail.</p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
<hr>
<div class="refsect2">
@@ -2419,9 +2389,8 @@ underlying device driver.</p>
<div class="refsect3">
<a name="id-1.2.30.8.53.9"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> or <code class="literal">FALSE</code></p>
-<p></p>
</div>
-<p class="since">Since 0.9.10</p>
+<p class="since">Since: 0.9.10</p>
</div>
</div>
<div class="refsect1">
@@ -2529,7 +2498,6 @@ for both <a class="link" href="libnm-util-nm-utils.html#nm-utils-inet4-ntop" tit
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/libnm-util.devhelp2 b/docs/libnm-util/html/libnm-util.devhelp2
index 144f60eb5..2530e8274 100644
--- a/docs/libnm-util/html/libnm-util.devhelp2
+++ b/docs/libnm-util/html/libnm-util.devhelp2
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<book xmlns="http://www.devhelp.net/book" title="libnm-util Reference Manual" link="index.html" author="" name="libnm-util" version="2" language="c">
<chapters>
<sub name="libnm-util API Reference" link="ch01.html">
@@ -1332,5 +1331,368 @@
<keyword type="macro" name="NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS" link="libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-IP6-CONFIG-DOMAINS:CAPS"/>
<keyword type="macro" name="NM_VPN_PLUGIN_IP6_CONFIG_ROUTES" link="libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-IP6-CONFIG-ROUTES:CAPS"/>
<keyword type="macro" name="NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT" link="libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-IP6-CONFIG-NEVER-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_UNKNOWN" link="NMConnection.html#NM-CONNECTION-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND" link="NMConnection.html#NM-CONNECTION-ERROR-CONNECTION-SETTING-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID" link="NMConnection.html#NM-CONNECTION-ERROR-CONNECTION-TYPE-INVALID:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_SETTING_NOT_FOUND" link="NMConnection.html#NM-CONNECTION-ERROR-SETTING-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_INVALID_SETTING" link="NMConnection.html#NM-CONNECTION-ERROR-INVALID-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ERROR_UNKNOWN" link="NMSetting.html#NM-SETTING-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ERROR_PROPERTY_NOT_FOUND" link="NMSetting.html#NM-SETTING-ERROR-PROPERTY-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ERROR_PROPERTY_NOT_SECRET" link="NMSetting.html#NM-SETTING-ERROR-PROPERTY-NOT-SECRET:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH" link="NMSetting.html#NM-SETTING-ERROR-PROPERTY-TYPE-MISMATCH:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_NONE" link="NMSetting.html#NM-SETTING-SECRET-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_AGENT_OWNED" link="NMSetting.html#NM-SETTING-SECRET-FLAG-AGENT-OWNED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_NOT_SAVED" link="NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-SAVED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_NOT_REQUIRED" link="NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-REQUIRED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_EXACT" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-EXACT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_FUZZY" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-FUZZY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_ID" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-ID:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-AGENT-OWNED-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-NOT-SAVED-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-WITH-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-NO-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_HASH_FLAG_ALL" link="NMSetting.html#NM-SETTING-HASH-FLAG-ALL:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_HASH_FLAG_NO_SECRETS" link="NMSetting.html#NM-SETTING-HASH-FLAG-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_HASH_FLAG_ONLY_SECRETS" link="NMSetting.html#NM-SETTING-HASH-FLAG-ONLY-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_UNKNOWN" link="NMSetting.html#NM-SETTING-DIFF-RESULT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_A" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_B" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_A_DEFAULT" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_B_DEFAULT" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_ERROR_UNKNOWN" link="NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY" link="NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY" link="NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_ERROR_TYPE_SETTING_NOT_FOUND" link="NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-TYPE-SETTING-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_ERROR_IP_CONFIG_NOT_ALLOWED" link="NMSettingConnection.html#NM-SETTING-CONNECTION-ERROR-IP-CONFIG-NOT-ALLOWED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRED_ERROR_UNKNOWN" link="NMSettingWired.html#NM-SETTING-WIRED-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRED_ERROR_INVALID_PROPERTY" link="NMSettingWired.html#NM-SETTING-WIRED-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRED_ERROR_MISSING_PROPERTY" link="NMSettingWired.html#NM-SETTING-WIRED-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_ERROR_UNKNOWN" link="NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY" link="NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_ERROR_MISSING_PROPERTY" link="NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_ERROR_MISSING_SECURITY_SETTING" link="NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-MISSING-SECURITY-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_ERROR_CHANNEL_REQUIRES_BAND" link="NMSettingWireless.html#NM-SETTING-WIRELESS-ERROR-CHANNEL-REQUIRES-BAND:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_UNKNOWN" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_PROPERTY" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_802_1X_SETTING" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-MISSING-802-1X-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_802_1X" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-LEAP-REQUIRES-802-1X:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_USERNAME" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-LEAP-REQUIRES-USERNAME:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIRELESS_SECURITY_ERROR_SHARED_KEY_REQUIRES_WEP" link="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-ERROR-SHARED-KEY-REQUIRES-WEP:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_UNKNOWN" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_KEY" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-KEY:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_PASSPHRASE" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-PASSPHRASE:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_LAST" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-LAST:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BLUETOOTH_ERROR_UNKNOWN" link="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BLUETOOTH_ERROR_INVALID_PROPERTY" link="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BLUETOOTH_ERROR_MISSING_PROPERTY" link="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BLUETOOTH_ERROR_TYPE_SETTING_NOT_FOUND" link="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-ERROR-TYPE-SETTING-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_ERROR_UNKNOWN" link="NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_ERROR_INVALID_PROPERTY" link="NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_ERROR_MISSING_PROPERTY" link="NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_ERROR_MISSING_PPP_SETTING" link="NMSettingSerial.html#NM-SETTING-SERIAL-ERROR-MISSING-PPP-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CDMA_ERROR_UNKNOWN" link="NMSettingCdma.html#NM-SETTING-CDMA-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CDMA_ERROR_INVALID_PROPERTY" link="NMSettingCdma.html#NM-SETTING-CDMA-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CDMA_ERROR_MISSING_PROPERTY" link="NMSettingCdma.html#NM-SETTING-CDMA-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CDMA_ERROR_MISSING_SERIAL_SETTING" link="NMSettingCdma.html#NM-SETTING-CDMA-ERROR-MISSING-SERIAL-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_ERROR_UNKNOWN" link="NMSettingGsm.html#NM-SETTING-GSM-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_ERROR_INVALID_PROPERTY" link="NMSettingGsm.html#NM-SETTING-GSM-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_ERROR_MISSING_PROPERTY" link="NMSettingGsm.html#NM-SETTING-GSM-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_ERROR_MISSING_SERIAL_SETTING" link="NMSettingGsm.html#NM-SETTING-GSM-ERROR-MISSING-SERIAL-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_ANY" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-ANY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-UMTS-HSPA:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-GPRS-EDGE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-UMTS-HSPA:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-GPRS-EDGE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-PREFER-4G:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_NETWORK_TYPE_4G" link="NMSettingGsm.html#NM-SETTING-GSM-NETWORK-TYPE-4G:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_UNKNOWN" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_ANY" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-ANY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_EGSM" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-EGSM:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_DCS" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-DCS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_PCS" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-PCS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_G850" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-G850:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U2100" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U2100:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U1800" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U1800:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U17IV" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U17IV:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U800" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U800:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U850" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U850:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U900" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U900:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U17IX" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U17IX:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U1900" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U1900:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GSM_BAND_U2600" link="NMSettingGsm.html#NM-SETTING-GSM-BAND-U2600:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIMAX_ERROR_UNKNOWN" link="NMSettingWimax.html#NM-SETTING-WIMAX-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIMAX_ERROR_INVALID_PROPERTY" link="NMSettingWimax.html#NM-SETTING-WIMAX-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_WIMAX_ERROR_MISSING_PROPERTY" link="NMSettingWimax.html#NM-SETTING-WIMAX-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BOND_ERROR_UNKNOWN" link="NMSettingBond.html#NM-SETTING-BOND-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BOND_ERROR_INVALID_PROPERTY" link="NMSettingBond.html#NM-SETTING-BOND-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BOND_ERROR_MISSING_PROPERTY" link="NMSettingBond.html#NM-SETTING-BOND-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BOND_ERROR_INVALID_OPTION" link="NMSettingBond.html#NM-SETTING-BOND-ERROR-INVALID-OPTION:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BOND_ERROR_MISSING_OPTION" link="NMSettingBond.html#NM-SETTING-BOND-ERROR-MISSING-OPTION:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BRIDGE_ERROR_UNKNOWN" link="NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY" link="NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY" link="NMSettingBridge.html#NM-SETTING-BRIDGE-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN" link="NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY" link="NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY" link="NMSettingBridgePort.html#NM-SETTING-BRIDGE-PORT-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_TEAM_ERROR_UNKNOWN" link="NMSettingTeam.html#NM-SETTING-TEAM-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_TEAM_ERROR_INVALID_PROPERTY" link="NMSettingTeam.html#NM-SETTING-TEAM-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_TEAM_ERROR_MISSING_PROPERTY" link="NMSettingTeam.html#NM-SETTING-TEAM-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_TEAM_PORT_ERROR_UNKNOWN" link="NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_TEAM_PORT_ERROR_INVALID_PROPERTY" link="NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_TEAM_PORT_ERROR_MISSING_PROPERTY" link="NMSettingTeamPort.html#NM-SETTING-TEAM-PORT-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GENERIC_ERROR_UNKNOWN" link="NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GENERIC_ERROR_INVALID_PROPERTY" link="NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_GENERIC_ERROR_MISSING_PROPERTY" link="NMSettingGeneric.html#NM-SETTING-GENERIC-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_INFINIBAND_ERROR_UNKNOWN" link="NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY" link="NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_INFINIBAND_ERROR_MISSING_PROPERTY" link="NMSettingInfiniband.html#NM-SETTING-INFINIBAND-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VLAN_ERROR_UNKNOWN" link="NMSettingVlan.html#NM-SETTING-VLAN-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VLAN_ERROR_INVALID_PROPERTY" link="NMSettingVlan.html#NM-SETTING-VLAN-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VLAN_ERROR_MISSING_PROPERTY" link="NMSettingVlan.html#NM-SETTING-VLAN-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VLAN_ERROR_INVALID_PARENT" link="NMSettingVlan.html#NM-SETTING-VLAN-ERROR-INVALID-PARENT:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_INGRESS_MAP" link="NMSettingVlan.html#NM-VLAN-INGRESS-MAP:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_EGRESS_MAP" link="NMSettingVlan.html#NM-VLAN-EGRESS-MAP:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_FLAG_REORDER_HEADERS" link="NMSettingVlan.html#NM-VLAN-FLAG-REORDER-HEADERS:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_FLAG_GVRP" link="NMSettingVlan.html#NM-VLAN-FLAG-GVRP:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_FLAG_LOOSE_BINDING" link="NMSettingVlan.html#NM-VLAN-FLAG-LOOSE-BINDING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_OLPC_MESH_ERROR_UNKNOWN" link="NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY" link="NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_OLPC_MESH_ERROR_MISSING_PROPERTY" link="NMSettingOlpcMesh.html#NM-SETTING-OLPC-MESH-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ADSL_ERROR_UNKNOWN" link="NMSettingAdsl.html#NM-SETTING-ADSL-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ADSL_ERROR_INVALID_PROPERTY" link="NMSettingAdsl.html#NM-SETTING-ADSL-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_ADSL_ERROR_MISSING_PROPERTY" link="NMSettingAdsl.html#NM-SETTING-ADSL-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_ERROR_UNKNOWN" link="NMSettingDcb.html#NM-SETTING-DCB-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_ERROR_INVALID_PROPERTY" link="NMSettingDcb.html#NM-SETTING-DCB-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_ERROR_MISSING_PROPERTY" link="NMSettingDcb.html#NM-SETTING-DCB-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_NONE" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_ENABLE" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_ADVERTISE" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_WILLING" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_UNKNOWN" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_X509" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-X509:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_RAW_KEY" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-RAW-KEY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_PKCS12" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-PKCS12:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_SCHEME_UNKNOWN" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_SCHEME_BLOB" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-BLOB:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_SCHEME_PATH" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_ERROR_UNKNOWN" link="NMSetting8021x.html#NM-SETTING-802-1X-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_ERROR_INVALID_PROPERTY" link="NMSetting8021x.html#NM-SETTING-802-1X-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_ERROR_MISSING_PROPERTY" link="NMSetting8021x.html#NM-SETTING-802-1X-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP4_CONFIG_ERROR_UNKNOWN" link="NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY" link="NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP4_CONFIG_ERROR_MISSING_PROPERTY" link="NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD" link="NMSettingIP4Config.html#NM-SETTING-IP4-CONFIG-ERROR-NOT-ALLOWED-FOR-METHOD:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_ERROR_UNKNOWN" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-ERROR-NOT-ALLOWED-FOR-METHOD:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-DISABLED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-PUBLIC-ADDR:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-TEMP-ADDR:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPP_ERROR_UNKNOWN" link="NMSettingPPP.html#NM-SETTING-PPP-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPP_ERROR_INVALID_PROPERTY" link="NMSettingPPP.html#NM-SETTING-PPP-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPP_ERROR_MISSING_PROPERTY" link="NMSettingPPP.html#NM-SETTING-PPP-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPP_ERROR_REQUIRE_MPPE_NOT_ALLOWED" link="NMSettingPPP.html#NM-SETTING-PPP-ERROR-REQUIRE-MPPE-NOT-ALLOWED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPPOE_ERROR_UNKNOWN" link="NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPPOE_ERROR_INVALID_PROPERTY" link="NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPPOE_ERROR_MISSING_PROPERTY" link="NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_PPPOE_ERROR_MISSING_PPP_SETTING" link="NMSettingPPPOE.html#NM-SETTING-PPPOE-ERROR-MISSING-PPP-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VPN_ERROR_UNKNOWN" link="NMSettingVPN.html#NM-SETTING-VPN-ERROR-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VPN_ERROR_INVALID_PROPERTY" link="NMSettingVPN.html#NM-SETTING-VPN-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_VPN_ERROR_MISSING_PROPERTY" link="NMSettingVPN.html#NM-SETTING-VPN-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_INVALID" link="libnm-util-nm-utils.html#NMU-SEC-INVALID:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_NONE" link="libnm-util-nm-utils.html#NMU-SEC-NONE:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_STATIC_WEP" link="libnm-util-nm-utils.html#NMU-SEC-STATIC-WEP:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_LEAP" link="libnm-util-nm-utils.html#NMU-SEC-LEAP:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_DYNAMIC_WEP" link="libnm-util-nm-utils.html#NMU-SEC-DYNAMIC-WEP:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA_PSK" link="libnm-util-nm-utils.html#NMU-SEC-WPA-PSK:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA_ENTERPRISE" link="libnm-util-nm-utils.html#NMU-SEC-WPA-ENTERPRISE:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA2_PSK" link="libnm-util-nm-utils.html#NMU-SEC-WPA2-PSK:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA2_ENTERPRISE" link="libnm-util-nm-utils.html#NMU-SEC-WPA2-ENTERPRISE:CAPS"/>
+ <keyword type="constant" name="NM_STATE_UNKNOWN" link="libnm-util-NetworkManager.html#NM-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_STATE_ASLEEP" link="libnm-util-NetworkManager.html#NM-STATE-ASLEEP:CAPS"/>
+ <keyword type="constant" name="NM_STATE_DISCONNECTED" link="libnm-util-NetworkManager.html#NM-STATE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_STATE_DISCONNECTING" link="libnm-util-NetworkManager.html#NM-STATE-DISCONNECTING:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTING" link="libnm-util-NetworkManager.html#NM-STATE-CONNECTING:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTED_LOCAL" link="libnm-util-NetworkManager.html#NM-STATE-CONNECTED-LOCAL:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTED_SITE" link="libnm-util-NetworkManager.html#NM-STATE-CONNECTED-SITE:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTED_GLOBAL" link="libnm-util-NetworkManager.html#NM-STATE-CONNECTED-GLOBAL:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_UNKNOWN" link="libnm-util-NetworkManager.html#NM-CONNECTIVITY-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_NONE" link="libnm-util-NetworkManager.html#NM-CONNECTIVITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_PORTAL" link="libnm-util-NetworkManager.html#NM-CONNECTIVITY-PORTAL:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_LIMITED" link="libnm-util-NetworkManager.html#NM-CONNECTIVITY-LIMITED:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_FULL" link="libnm-util-NetworkManager.html#NM-CONNECTIVITY-FULL:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_UNKNOWN" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_ETHERNET" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-ETHERNET:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_WIFI" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-WIFI:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_UNUSED1" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-UNUSED1:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_UNUSED2" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-UNUSED2:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_BT" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-BT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_OLPC_MESH" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-OLPC-MESH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_WIMAX" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-WIMAX:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_MODEM" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-MODEM:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_INFINIBAND" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-INFINIBAND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_BOND" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-BOND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_VLAN" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-VLAN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_ADSL" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-ADSL:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_BRIDGE" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-BRIDGE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_GENERIC" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-GENERIC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_TEAM" link="libnm-util-NetworkManager.html#NM-DEVICE-TYPE-TEAM:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_NONE" link="libnm-util-NetworkManager.html#NM-DEVICE-CAP-NONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_NM_SUPPORTED" link="libnm-util-NetworkManager.html#NM-DEVICE-CAP-NM-SUPPORTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_CARRIER_DETECT" link="libnm-util-NetworkManager.html#NM-DEVICE-CAP-CARRIER-DETECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_IS_SOFTWARE" link="libnm-util-NetworkManager.html#NM-DEVICE-CAP-IS-SOFTWARE:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_NONE" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-NONE:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_WEP40" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP40:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_WEP104" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP104:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_TKIP" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-TKIP:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_CCMP" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-CIPHER-CCMP:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_WPA" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-WPA:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_RSN" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-RSN:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_AP" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-AP:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_ADHOC" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-ADHOC:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_FREQ_VALID" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-FREQ-VALID:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_FREQ_2GHZ" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-FREQ-2GHZ:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_FREQ_5GHZ" link="libnm-util-NetworkManager.html#NM-WIFI-DEVICE-CAP-FREQ-5GHZ:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_FLAGS_NONE" link="libnm-util-NetworkManager.html#NM-802-11-AP-FLAGS-NONE:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_FLAGS_PRIVACY" link="libnm-util-NetworkManager.html#NM-802-11-AP-FLAGS-PRIVACY:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_NONE" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-NONE:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_WEP40" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-WEP40:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_WEP104" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-WEP104:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_TKIP" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-TKIP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_CCMP" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-PAIR-CCMP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_WEP40" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-WEP40:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_WEP104" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-WEP104:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_TKIP" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-TKIP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_CCMP" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-GROUP-CCMP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_KEY_MGMT_PSK" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-KEY-MGMT-PSK:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_KEY_MGMT_802_1X" link="libnm-util-NetworkManager.html#NM-802-11-AP-SEC-KEY-MGMT-802-1X:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_UNKNOWN" link="libnm-util-NetworkManager.html#NM-802-11-MODE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_ADHOC" link="libnm-util-NetworkManager.html#NM-802-11-MODE-ADHOC:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_INFRA" link="libnm-util-NetworkManager.html#NM-802-11-MODE-INFRA:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_AP" link="libnm-util-NetworkManager.html#NM-802-11-MODE-AP:CAPS"/>
+ <keyword type="constant" name="NM_BT_CAPABILITY_NONE" link="libnm-util-NetworkManager.html#NM-BT-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_BT_CAPABILITY_DUN" link="libnm-util-NetworkManager.html#NM-BT-CAPABILITY-DUN:CAPS"/>
+ <keyword type="constant" name="NM_BT_CAPABILITY_NAP" link="libnm-util-NetworkManager.html#NM-BT-CAPABILITY-NAP:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_NONE" link="libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_POTS" link="libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-POTS:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO" link="libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-CDMA-EVDO:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS" link="libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-GSM-UMTS:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_LTE" link="libnm-util-NetworkManager.html#NM-DEVICE-MODEM-CAPABILITY-LTE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_UNKNOWN" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_UNMANAGED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-UNMANAGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_UNAVAILABLE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_DISCONNECTED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_PREPARE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-PREPARE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_CONFIG" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-CONFIG:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_NEED_AUTH" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-NEED-AUTH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_IP_CONFIG" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-IP-CONFIG:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_IP_CHECK" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-IP-CHECK:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_SECONDARIES" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-SECONDARIES:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_ACTIVATED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-ACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_DEACTIVATING" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-DEACTIVATING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NONE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_UNKNOWN" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NOW_MANAGED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NOW-MANAGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NOW_UNMANAGED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NOW-UNMANAGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CONFIG_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CONFIG-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-IP-CONFIG-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-IP-CONFIG-EXPIRED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NO_SECRETS" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-DISCONNECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-CONFIG-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PPP_START_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PPP-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PPP_DISCONNECT" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PPP-DISCONNECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PPP_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PPP-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DHCP_START_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DHCP-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DHCP_ERROR" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DHCP-ERROR:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DHCP_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DHCP-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SHARED_START_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SHARED-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SHARED_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SHARED-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-AUTOIP-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_AUTOIP_ERROR" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-AUTOIP-ERROR:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_AUTOIP_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-AUTOIP-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_BUSY" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-BUSY:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-NO-DIAL-TONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-NO-CARRIER:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-INIT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_APN_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-APN-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-NOT-SEARCHING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-DENIED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-PIN-CHECK-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_FIRMWARE_MISSING" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-FIRMWARE-MISSING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_REMOVED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SLEEPING" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SLEEPING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CONNECTION_REMOVED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CONNECTION-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_USER_REQUESTED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-USER-REQUESTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CARRIER" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CARRIER:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-CONNECTION-ASSUMED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SUPPLICANT-AVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_BT_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-BT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-NOT-INSERTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-PIN-REQUIRED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-PUK-REQUIRED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_WRONG" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-GSM-SIM-WRONG:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_INFINIBAND_MODE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-INFINIBAND-MODE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DEPENDENCY-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_BR2684_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-BR2684-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-MANAGER-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SSID_NOT_FOUND" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SSID-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SECONDARY-CONNECTION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-DCB-FCOE-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-TEAMD-CONTROL-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_FAILED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_AVAILABLE" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-MODEM-AVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-SIM-PIN-INCORRECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NEW_ACTIVATION" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-NEW-ACTIVATION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PARENT_CHANGED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_LAST" link="libnm-util-NetworkManager.html#NM-DEVICE-STATE-REASON-LAST:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_UNKNOWN" link="libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_ACTIVATING" link="libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATING:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_ACTIVATED" link="libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_DEACTIVATING" link="libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATING:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_DEACTIVATED" link="libnm-util-NetworkManager.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_UNKNOWN" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_INIT" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-INIT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_SHUTDOWN" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-SHUTDOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STARTING" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STARTING:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STARTED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STARTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STOPPING" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STOPPING:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STOPPED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-SERVICE-STATE-STOPPED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_UNKNOWN" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_PREPARE" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-PREPARE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_NEED_AUTH" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-NEED-AUTH:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_CONNECT" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-CONNECT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_IP_CONFIG_GET" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-IP-CONFIG-GET:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_ACTIVATED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-ACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_FAILED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_DISCONNECTED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_UNKNOWN" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_NONE" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-NONE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-USER-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-DEVICE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-STOPPED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-IP-CONFIG-INVALID:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-CONNECT-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-LOGIN-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-CONNECTION-STATE-REASON-CONNECTION-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-FAILURE-LOGIN-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED" link="libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-FAILURE-CONNECT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG" link="libnm-util-NetworkManagerVPN.html#NM-VPN-PLUGIN-FAILURE-BAD-IP-CONFIG:CAPS"/>
</functions>
</book>
diff --git a/docs/libnm-util/html/object-tree.html b/docs/libnm-util/html/object-tree.html
index 0efce8c73..9c2eaa401 100644
--- a/docs/libnm-util/html/object-tree.html
+++ b/docs/libnm-util/html/object-tree.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm-util Reference Manual: Object Hierarchy</title>
+<title>Object Hierarchy: libnm-util Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm-util Reference Manual">
<link rel="up" href="index.html" title="libnm-util Reference Manual">
<link rel="prev" href="libnm-util-NetworkManagerVPN.html" title="NetworkManagerVPN">
<link rel="next" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -103,7 +103,6 @@
</pre>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm-util/html/style.css b/docs/libnm-util/html/style.css
index c141ddd29..367542097 100644
--- a/docs/libnm-util/html/style.css
+++ b/docs/libnm-util/html/style.css
@@ -60,7 +60,7 @@ a:hover
div.informaltable table
{
border-collapse: separate;
- border-spacing: 1em 0.5em;
+ border-spacing: 1em 0.3em;
border: none;
}
@@ -148,6 +148,8 @@ div.table table th
h4
{
color: #555753;
+ margin-top: 1em;
+ margin-bottom: 1em;
}
hr
@@ -166,17 +168,16 @@ dl.toc dt
padding-bottom: 0.25em;
}
-dl.toc > dd > dl > dt
+dl.toc > dt
{
padding-top: 0.25em;
padding-bottom: 0.25em;
+ font-weight: bold;
}
-dl.toc > dt
+dl.toc > dl
{
- padding-top: 1em;
padding-bottom: 0.5em;
- font-weight: bold;
}
.parameter
@@ -346,7 +347,9 @@ acronym,abbr
}
@media screen {
- sup a.footnote
+ /* these have a <sup> as a first child, but since there are no parent selectors
+ * we can't use that. */
+ a.footnote
{
position: relative;
top: 0em ! important;
diff --git a/docs/libnm-util/tmpl/NetworkManager.sgml b/docs/libnm-util/tmpl/NetworkManager.sgml
deleted file mode 100644
index 008d08b8b..000000000
--- a/docs/libnm-util/tmpl/NetworkManager.sgml
+++ /dev/null
@@ -1,539 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NetworkManager
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DBUS_SERVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_WIRED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_ADSL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_WIRELESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_BLUETOOTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_OLPC_MESH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_ACCESS_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_ACCESS_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_MODEM ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_WIMAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_WIMAX_NSP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_WIMAX_NSP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_ACTIVE_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DHCP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_IP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DHCP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_INFINIBAND ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_BOND ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_TEAM ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_VLAN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_BRIDGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_GENERIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_VETH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_TUN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_MACVLAN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_VXLAN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_GRE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_IFACE_SETTINGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_SETTINGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_IFACE_SETTINGS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_SETTINGS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_IFACE_SETTINGS_CONNECTION_SECRETS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_AGENT_MANAGER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_AGENT_MANAGER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_SECRET_AGENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_SECRET_AGENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMState ##### -->
-<para>
-
-</para>
-
-@NM_STATE_UNKNOWN:
-@NM_STATE_ASLEEP:
-@NM_STATE_DISCONNECTED:
-@NM_STATE_DISCONNECTING:
-@NM_STATE_CONNECTING:
-@NM_STATE_CONNECTED_LOCAL:
-@NM_STATE_CONNECTED_SITE:
-@NM_STATE_CONNECTED_GLOBAL:
-
-<!-- ##### MACRO NM_STATE_CONNECTED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMConnectivityState ##### -->
-<para>
-
-</para>
-
-@NM_CONNECTIVITY_UNKNOWN:
-@NM_CONNECTIVITY_NONE:
-@NM_CONNECTIVITY_PORTAL:
-@NM_CONNECTIVITY_LIMITED:
-@NM_CONNECTIVITY_FULL:
-
-<!-- ##### ENUM NMDeviceType ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_TYPE_UNKNOWN:
-@NM_DEVICE_TYPE_ETHERNET:
-@NM_DEVICE_TYPE_WIFI:
-@NM_DEVICE_TYPE_UNUSED1:
-@NM_DEVICE_TYPE_UNUSED2:
-@NM_DEVICE_TYPE_BT:
-@NM_DEVICE_TYPE_OLPC_MESH:
-@NM_DEVICE_TYPE_WIMAX:
-@NM_DEVICE_TYPE_MODEM:
-@NM_DEVICE_TYPE_INFINIBAND:
-@NM_DEVICE_TYPE_BOND:
-@NM_DEVICE_TYPE_VLAN:
-@NM_DEVICE_TYPE_ADSL:
-@NM_DEVICE_TYPE_BRIDGE:
-@NM_DEVICE_TYPE_GENERIC:
-@NM_DEVICE_TYPE_TEAM:
-
-<!-- ##### ENUM NMDeviceCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_CAP_NONE:
-@NM_DEVICE_CAP_NM_SUPPORTED:
-@NM_DEVICE_CAP_CARRIER_DETECT:
-@NM_DEVICE_CAP_IS_SOFTWARE:
-
-<!-- ##### ENUM NMDeviceWifiCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_WIFI_DEVICE_CAP_NONE:
-@NM_WIFI_DEVICE_CAP_CIPHER_WEP40:
-@NM_WIFI_DEVICE_CAP_CIPHER_WEP104:
-@NM_WIFI_DEVICE_CAP_CIPHER_TKIP:
-@NM_WIFI_DEVICE_CAP_CIPHER_CCMP:
-@NM_WIFI_DEVICE_CAP_WPA:
-@NM_WIFI_DEVICE_CAP_RSN:
-@NM_WIFI_DEVICE_CAP_AP:
-@NM_WIFI_DEVICE_CAP_ADHOC:
-@NM_WIFI_DEVICE_CAP_FREQ_VALID:
-@NM_WIFI_DEVICE_CAP_FREQ_2GHZ:
-@NM_WIFI_DEVICE_CAP_FREQ_5GHZ:
-
-<!-- ##### ENUM NM80211ApFlags ##### -->
-<para>
-
-</para>
-
-@NM_802_11_AP_FLAGS_NONE:
-@NM_802_11_AP_FLAGS_PRIVACY:
-
-<!-- ##### ENUM NM80211ApSecurityFlags ##### -->
-<para>
-
-</para>
-
-@NM_802_11_AP_SEC_NONE:
-@NM_802_11_AP_SEC_PAIR_WEP40:
-@NM_802_11_AP_SEC_PAIR_WEP104:
-@NM_802_11_AP_SEC_PAIR_TKIP:
-@NM_802_11_AP_SEC_PAIR_CCMP:
-@NM_802_11_AP_SEC_GROUP_WEP40:
-@NM_802_11_AP_SEC_GROUP_WEP104:
-@NM_802_11_AP_SEC_GROUP_TKIP:
-@NM_802_11_AP_SEC_GROUP_CCMP:
-@NM_802_11_AP_SEC_KEY_MGMT_PSK:
-@NM_802_11_AP_SEC_KEY_MGMT_802_1X:
-
-<!-- ##### ENUM NM80211Mode ##### -->
-<para>
-
-</para>
-
-@NM_802_11_MODE_UNKNOWN:
-@NM_802_11_MODE_ADHOC:
-@NM_802_11_MODE_INFRA:
-@NM_802_11_MODE_AP:
-
-<!-- ##### ENUM NMBluetoothCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_BT_CAPABILITY_NONE:
-@NM_BT_CAPABILITY_DUN:
-@NM_BT_CAPABILITY_NAP:
-
-<!-- ##### ENUM NMDeviceModemCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_MODEM_CAPABILITY_NONE:
-@NM_DEVICE_MODEM_CAPABILITY_POTS:
-@NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO:
-@NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS:
-@NM_DEVICE_MODEM_CAPABILITY_LTE:
-
-<!-- ##### ENUM NMDeviceState ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_STATE_UNKNOWN:
-@NM_DEVICE_STATE_UNMANAGED:
-@NM_DEVICE_STATE_UNAVAILABLE:
-@NM_DEVICE_STATE_DISCONNECTED:
-@NM_DEVICE_STATE_PREPARE:
-@NM_DEVICE_STATE_CONFIG:
-@NM_DEVICE_STATE_NEED_AUTH:
-@NM_DEVICE_STATE_IP_CONFIG:
-@NM_DEVICE_STATE_IP_CHECK:
-@NM_DEVICE_STATE_SECONDARIES:
-@NM_DEVICE_STATE_ACTIVATED:
-@NM_DEVICE_STATE_DEACTIVATING:
-@NM_DEVICE_STATE_FAILED:
-
-<!-- ##### ENUM NMDeviceStateReason ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_STATE_REASON_NONE:
-@NM_DEVICE_STATE_REASON_UNKNOWN:
-@NM_DEVICE_STATE_REASON_NOW_MANAGED:
-@NM_DEVICE_STATE_REASON_NOW_UNMANAGED:
-@NM_DEVICE_STATE_REASON_CONFIG_FAILED:
-@NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE:
-@NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED:
-@NM_DEVICE_STATE_REASON_NO_SECRETS:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT:
-@NM_DEVICE_STATE_REASON_PPP_START_FAILED:
-@NM_DEVICE_STATE_REASON_PPP_DISCONNECT:
-@NM_DEVICE_STATE_REASON_PPP_FAILED:
-@NM_DEVICE_STATE_REASON_DHCP_START_FAILED:
-@NM_DEVICE_STATE_REASON_DHCP_ERROR:
-@NM_DEVICE_STATE_REASON_DHCP_FAILED:
-@NM_DEVICE_STATE_REASON_SHARED_START_FAILED:
-@NM_DEVICE_STATE_REASON_SHARED_FAILED:
-@NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED:
-@NM_DEVICE_STATE_REASON_AUTOIP_ERROR:
-@NM_DEVICE_STATE_REASON_AUTOIP_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_BUSY:
-@NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE:
-@NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER:
-@NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT:
-@NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_APN_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED:
-@NM_DEVICE_STATE_REASON_FIRMWARE_MISSING:
-@NM_DEVICE_STATE_REASON_REMOVED:
-@NM_DEVICE_STATE_REASON_SLEEPING:
-@NM_DEVICE_STATE_REASON_CONNECTION_REMOVED:
-@NM_DEVICE_STATE_REASON_USER_REQUESTED:
-@NM_DEVICE_STATE_REASON_CARRIER:
-@NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE:
-@NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND:
-@NM_DEVICE_STATE_REASON_BT_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_WRONG:
-@NM_DEVICE_STATE_REASON_INFINIBAND_MODE:
-@NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED:
-@NM_DEVICE_STATE_REASON_BR2684_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE:
-@NM_DEVICE_STATE_REASON_SSID_NOT_FOUND:
-@NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED:
-@NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED:
-@NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_AVAILABLE:
-@NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT:
-@NM_DEVICE_STATE_REASON_NEW_ACTIVATION:
-@NM_DEVICE_STATE_REASON_LAST:
-
-<!-- ##### ENUM NMActiveConnectionState ##### -->
-<para>
-
-</para>
-
-@NM_ACTIVE_CONNECTION_STATE_UNKNOWN:
-@NM_ACTIVE_CONNECTION_STATE_ACTIVATING:
-@NM_ACTIVE_CONNECTION_STATE_ACTIVATED:
-@NM_ACTIVE_CONNECTION_STATE_DEACTIVATING:
-@NM_ACTIVE_CONNECTION_STATE_DEACTIVATED:
-
diff --git a/docs/libnm-util/tmpl/NetworkManagerVPN.sgml b/docs/libnm-util/tmpl/NetworkManagerVPN.sgml
deleted file mode 100644
index 03b7f3164..000000000
--- a/docs/libnm-util/tmpl/NetworkManagerVPN.sgml
+++ /dev/null
@@ -1,484 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NetworkManagerVPN
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DBUS_PATH_VPN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_VPN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_DBUS_PLUGIN_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_DBUS_PLUGIN_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_NO_ACTIVE_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_NO_VPN_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INVALID_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_ERROR_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_STARTING_IN_PROGRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_ALREADY_STARTED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_STOPPING_IN_PROGRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_ALREADY_STOPPED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_WRONG_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_BAD_ARGUMENTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_LOGIN_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_LOGIN_FAILED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_CONNECT_FAILED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_STATE_CHANGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVPNServiceState ##### -->
-<para>
-
-</para>
-
-@NM_VPN_SERVICE_STATE_UNKNOWN:
-@NM_VPN_SERVICE_STATE_INIT:
-@NM_VPN_SERVICE_STATE_SHUTDOWN:
-@NM_VPN_SERVICE_STATE_STARTING:
-@NM_VPN_SERVICE_STATE_STARTED:
-@NM_VPN_SERVICE_STATE_STOPPING:
-@NM_VPN_SERVICE_STATE_STOPPED:
-
-<!-- ##### ENUM NMVPNConnectionState ##### -->
-<para>
-
-</para>
-
-@NM_VPN_CONNECTION_STATE_UNKNOWN:
-@NM_VPN_CONNECTION_STATE_PREPARE:
-@NM_VPN_CONNECTION_STATE_NEED_AUTH:
-@NM_VPN_CONNECTION_STATE_CONNECT:
-@NM_VPN_CONNECTION_STATE_IP_CONFIG_GET:
-@NM_VPN_CONNECTION_STATE_ACTIVATED:
-@NM_VPN_CONNECTION_STATE_FAILED:
-@NM_VPN_CONNECTION_STATE_DISCONNECTED:
-
-<!-- ##### ENUM NMVPNConnectionStateReason ##### -->
-<para>
-
-</para>
-
-@NM_VPN_CONNECTION_STATE_REASON_UNKNOWN:
-@NM_VPN_CONNECTION_STATE_REASON_NONE:
-@NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED:
-@NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED:
-@NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED:
-@NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID:
-@NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT:
-@NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT:
-@NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED:
-@NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS:
-@NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED:
-@NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED:
-
-<!-- ##### ENUM NMVPNPluginFailure ##### -->
-<para>
-
-</para>
-
-@NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED:
-@NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED:
-@NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG:
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_TUNDEV ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_HAS_IP4 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_HAS_IP6 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CAN_PERSIST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_PTP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_NBNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_MSS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_PTP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_MSS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
diff --git a/docs/libnm-util/tmpl/libnm-util-unused.sgml b/docs/libnm-util/tmpl/libnm-util-unused.sgml
deleted file mode 100644
index e69de29bb..000000000
--- a/docs/libnm-util/tmpl/libnm-util-unused.sgml
+++ /dev/null
diff --git a/docs/libnm-util/tmpl/nm-connection.sgml b/docs/libnm-util/tmpl/nm-connection.sgml
deleted file mode 100644
index 27d34bb6f..000000000
--- a/docs/libnm-util/tmpl/nm-connection.sgml
+++ /dev/null
@@ -1,663 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_CONNECTION_SECRETS_UPDATED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_SECRETS_CLEARED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_CHANGED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMConnectionError ##### -->
-<para>
-
-</para>
-
-@NM_CONNECTION_ERROR_UNKNOWN:
-@NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND:
-@NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID:
-@NM_CONNECTION_ERROR_SETTING_NOT_FOUND:
-@NM_CONNECTION_ERROR_INVALID_SETTING:
-
-<!-- ##### MACRO NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_connection_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### STRUCT NMConnection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SIGNAL NMConnection::changed ##### -->
-<para>
-
-</para>
-
-@nmconnection: the object which received the signal.
-
-<!-- ##### SIGNAL NMConnection::secrets-cleared ##### -->
-<para>
-
-</para>
-
-@nmconnection: the object which received the signal.
-
-<!-- ##### SIGNAL NMConnection::secrets-updated ##### -->
-<para>
-
-</para>
-
-@nmconnection: the object which received the signal.
-@arg1:
-
-<!-- ##### ARG NMConnection:path ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION nm_connection_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_new_from_hash ##### -->
-<para>
-
-</para>
-
-@hash:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_duplicate ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_create_setting ##### -->
-<para>
-
-</para>
-
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_add_setting ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting:
-
-
-<!-- ##### FUNCTION nm_connection_remove_setting ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_type:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_by_name ##### -->
-<para>
-
-</para>
-
-@connection:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_replace_settings ##### -->
-<para>
-
-</para>
-
-@connection:
-@new_settings:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_replace_settings_from_connection ##### -->
-<para>
-
-</para>
-
-@connection:
-@new_connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_compare ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_diff ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@out_settings:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_verify ##### -->
-<para>
-
-</para>
-
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_normalize ##### -->
-<para>
-
-</para>
-
-@connection:
-@parameters:
-@modified:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_need_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-@hints:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_clear_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-
-
-<!-- ##### FUNCTION nm_connection_clear_secrets_with_flags ##### -->
-<para>
-
-</para>
-
-@connection:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_connection_update_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_name:
-@secrets:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_set_path ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-
-
-<!-- ##### FUNCTION nm_connection_get_path ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_virtual_iface_name ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_interface_name ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_is_type ##### -->
-<para>
-
-</para>
-
-@connection:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_for_each_setting_value ##### -->
-<para>
-
-</para>
-
-@connection:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_connection_to_hash ##### -->
-<para>
-
-</para>
-
-@connection:
-@flags:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_dump ##### -->
-<para>
-
-</para>
-
-@connection:
-
-
-<!-- ##### FUNCTION nm_connection_lookup_setting_type ##### -->
-<para>
-
-</para>
-
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_lookup_setting_type_by_quark ##### -->
-<para>
-
-</para>
-
-@error_quark:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_uuid ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_id ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_connection_type ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_virtual_device_description ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_802_1x ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bluetooth ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bond ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_team ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_team_port ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bridge ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bridge_port ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_cdma ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_connection ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_dcb ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_generic ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_gsm ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_infiniband ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_ip4_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_ip6_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_olpc_mesh ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_ppp ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_pppoe ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_serial ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_vpn ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wimax ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_adsl ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wired ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wireless ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wireless_security ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_vlan ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-8021x.sgml b/docs/libnm-util/tmpl/nm-setting-8021x.sgml
deleted file mode 100644
index a5b6f3157..000000000
--- a/docs/libnm-util/tmpl/nm-setting-8021x.sgml
+++ /dev/null
@@ -1,943 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSetting8021x
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMSetting8021xCKFormat ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_802_1X_CK_FORMAT_UNKNOWN:
-@NM_SETTING_802_1X_CK_FORMAT_X509:
-@NM_SETTING_802_1X_CK_FORMAT_RAW_KEY:
-@NM_SETTING_802_1X_CK_FORMAT_PKCS12:
-
-<!-- ##### ENUM NMSetting8021xCKScheme ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_802_1X_CK_SCHEME_UNKNOWN:
-@NM_SETTING_802_1X_CK_SCHEME_BLOB:
-@NM_SETTING_802_1X_CK_SCHEME_PATH:
-
-<!-- ##### MACRO NM_SETTING_802_1X_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSetting8021xError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_802_1X_ERROR_UNKNOWN:
-@NM_SETTING_802_1X_ERROR_INVALID_PROPERTY:
-@NM_SETTING_802_1X_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_802_1X_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_EAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_IDENTITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_ANONYMOUS_IDENTITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PAC_FILE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_CA_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_CA_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_SUBJECT_MATCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_ALTSUBJECT_MATCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_CLIENT_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE1_PEAPVER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE1_PEAPLABEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_AUTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_AUTHEAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_CA_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_CA_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_CLIENT_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD_RAW ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD_RAW_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PRIVATE_KEY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_PRIVATE_KEY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PIN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_SYSTEM_CA_CERTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_num_eap_methods ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_eap_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_add_eap_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@eap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_eap_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_eap_method_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@eap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_clear_eap_methods ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_identity ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_anonymous_identity ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_pac_file ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_system_ca_certs ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_ca_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_subject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_num_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_add_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_altsubject_match_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_clear_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_client_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_client_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_client_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_client_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase1_peapver ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase1_peaplabel ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase1_fast_provisioning ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_auth ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_autheap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_phase2_ca_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_subject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_num_phase2_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_add_phase2_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@phase2_altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_phase2_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_phase2_altsubject_match_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@phase2_altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_clear_phase2_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_client_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_client_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_client_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_phase2_client_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password_raw ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password_raw_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_pin ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_pin_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_private_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@key_path:
-@password:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_format ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_phase2_private_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@key_path:
-@password:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_format ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-adsl.sgml b/docs/libnm-util/tmpl/nm-setting-adsl.sgml
deleted file mode 100644
index aa9a16619..000000000
--- a/docs/libnm-util/tmpl/nm-setting-adsl.sgml
+++ /dev/null
@@ -1,212 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingAdsl
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingAdslError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_ADSL_ERROR_UNKNOWN:
-@NM_SETTING_ADSL_ERROR_INVALID_PROPERTY:
-@NM_SETTING_ADSL_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_ADSL_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_adsl_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_ENCAPSULATION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_VPI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_VCI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL_PPPOA ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL_PPPOE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL_IPOATM ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_ENCAPSULATION_VCMUX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_ENCAPSULATION_LLC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_adsl_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_protocol ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_encapsulation ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_vpi ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_vci ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-bluetooth.sgml b/docs/libnm-util/tmpl/nm-setting-bluetooth.sgml
deleted file mode 100644
index 058e98fce..000000000
--- a/docs/libnm-util/tmpl/nm-setting-bluetooth.sgml
+++ /dev/null
@@ -1,112 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBluetooth
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingBluetoothError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_BLUETOOTH_ERROR_UNKNOWN:
-@NM_SETTING_BLUETOOTH_ERROR_INVALID_PROPERTY:
-@NM_SETTING_BLUETOOTH_ERROR_MISSING_PROPERTY:
-@NM_SETTING_BLUETOOTH_ERROR_TYPE_SETTING_NOT_FOUND:
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_BDADDR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_TYPE_DUN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_TYPE_PANU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_get_bdaddr ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_get_connection_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-bond.sgml b/docs/libnm-util/tmpl/nm-setting-bond.sgml
deleted file mode 100644
index 2131ced0a..000000000
--- a/docs/libnm-util/tmpl/nm-setting-bond.sgml
+++ /dev/null
@@ -1,276 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBond
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BOND_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingBondError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_BOND_ERROR_UNKNOWN:
-@NM_SETTING_BOND_ERROR_INVALID_PROPERTY:
-@NM_SETTING_BOND_ERROR_MISSING_PROPERTY:
-@NM_SETTING_BOND_ERROR_INVALID_OPTION:
-@NM_SETTING_BOND_ERROR_MISSING_OPTION:
-
-<!-- ##### MACRO NM_SETTING_BOND_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bond_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_BOND_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_MIIMON ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_DOWNDELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_UPDELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_ARP_INTERVAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_ARP_IP_TARGET ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_ARP_VALIDATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_PRIMARY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_PRIMARY_RESELECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_FAIL_OVER_MAC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_USE_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_AD_SELECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_RESEND_IGMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_LACP_RATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bond_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_num_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@out_name:
-@out_value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_option_by_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_add_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_remove_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_validate_option ##### -->
-<para>
-
-</para>
-
-@name:
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_valid_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_option_default ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-bridge-port.sgml b/docs/libnm-util/tmpl/nm-setting-bridge-port.sgml
deleted file mode 100644
index ebbed6dbe..000000000
--- a/docs/libnm-util/tmpl/nm-setting-bridge-port.sgml
+++ /dev/null
@@ -1,113 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBridgePort
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingBridgePortError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_BRIDGE_PORT_ERROR_UNKNOWN:
-@NM_SETTING_BRIDGE_PORT_ERROR_INVALID_PROPERTY:
-@NM_SETTING_BRIDGE_PORT_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_PATH_COST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_get_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_get_path_cost ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_get_hairpin_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-bridge.sgml b/docs/libnm-util/tmpl/nm-setting-bridge.sgml
deleted file mode 100644
index 1b14c3d88..000000000
--- a/docs/libnm-util/tmpl/nm-setting-bridge.sgml
+++ /dev/null
@@ -1,193 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBridge
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingBridgeError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_BRIDGE_ERROR_UNKNOWN:
-@NM_SETTING_BRIDGE_ERROR_INVALID_PROPERTY:
-@NM_SETTING_BRIDGE_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bridge_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_STP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_FORWARD_DELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_HELLO_TIME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_MAX_AGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_AGEING_TIME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bridge_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_stp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_forward_delay ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_hello_time ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_max_age ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_ageing_time ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-cdma.sgml b/docs/libnm-util/tmpl/nm-setting-cdma.sgml
deleted file mode 100644
index fdcad0de2..000000000
--- a/docs/libnm-util/tmpl/nm-setting-cdma.sgml
+++ /dev/null
@@ -1,130 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingCdma
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingCdmaError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_CDMA_ERROR_UNKNOWN:
-@NM_SETTING_CDMA_ERROR_INVALID_PROPERTY:
-@NM_SETTING_CDMA_ERROR_MISSING_PROPERTY:
-@NM_SETTING_CDMA_ERROR_MISSING_SERIAL_SETTING:
-
-<!-- ##### MACRO NM_SETTING_CDMA_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_cdma_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_NUMBER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_cdma_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_number ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-connection.sgml b/docs/libnm-util/tmpl/nm-setting-connection.sgml
deleted file mode 100644
index 732527f63..000000000
--- a/docs/libnm-util/tmpl/nm-setting-connection.sgml
+++ /dev/null
@@ -1,451 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingConnectionError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_CONNECTION_ERROR_UNKNOWN:
-@NM_SETTING_CONNECTION_ERROR_INVALID_PROPERTY:
-@NM_SETTING_CONNECTION_ERROR_MISSING_PROPERTY:
-@NM_SETTING_CONNECTION_ERROR_TYPE_SETTING_NOT_FOUND:
-@NM_SETTING_CONNECTION_ERROR_IP_CONFIG_NOT_ALLOWED:
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_connection_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_UUID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_AUTOCONNECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_TIMESTAMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_READ_ONLY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_PERMISSIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_ZONE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_MASTER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_SLAVE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_SECONDARIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### STRUCT NMSettingConnection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG NMSettingConnection:autoconnect ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:gateway-ping-timeout ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:id ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:interface-name ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:master ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:permissions ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:read-only ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:secondaries ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:slave-type ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:timestamp ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:type ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:uuid ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:zone ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION nm_setting_connection_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_uuid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_connection_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_autoconnect ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_timestamp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_read_only ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_num_permissions ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_permission ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@out_ptype:
-@out_pitem:
-@out_detail:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_zone ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_permissions_user_allowed ##### -->
-<para>
-
-</para>
-
-@setting:
-@uname:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_add_permission ##### -->
-<para>
-
-</para>
-
-@setting:
-@ptype:
-@pitem:
-@detail:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_permission ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_permission_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@ptype:
-@pitem:
-@detail:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_master ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_is_slave_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_slave_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_num_secondaries ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_secondary ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_add_secondary ##### -->
-<para>
-
-</para>
-
-@setting:
-@sec_uuid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_secondary ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_secondary_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@sec_uuid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_gateway_ping_timeout ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-dcb.sgml b/docs/libnm-util/tmpl/nm-setting-dcb.sgml
deleted file mode 100644
index f7b8abb1c..000000000
--- a/docs/libnm-util/tmpl/nm-setting-dcb.sgml
+++ /dev/null
@@ -1,395 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingDcb
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_DCB_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingDcbError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_DCB_ERROR_UNKNOWN:
-@NM_SETTING_DCB_ERROR_INVALID_PROPERTY:
-@NM_SETTING_DCB_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_DCB_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_dcb_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### ENUM NMSettingDcbFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_DCB_FLAG_NONE:
-@NM_SETTING_DCB_FLAG_ENABLE:
-@NM_SETTING_DCB_FLAG_ADVERTISE:
-@NM_SETTING_DCB_FLAG_WILLING:
-
-<!-- ##### MACRO NM_SETTING_DCB_FCOE_MODE_FABRIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_FCOE_MODE_VN2VN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FCOE_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FCOE_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FCOE_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_ISCSI_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_ISCSI_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FIP_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FIP_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_FLOW_CONTROL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_GROUP_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_GROUP_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_BANDWIDTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_dcb_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fcoe_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fcoe_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fcoe_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_iscsi_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_iscsi_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fip_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fip_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_flow_control_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_flow_control ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_flow_control ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_group_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_group_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_group_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@group_id:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_group_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@group_id:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_group_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@group_id:
-@bandwidth_percent:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@bandwidth_percent:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_strict_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_strict_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@strict:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_traffic_class ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_traffic_class ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@traffic_class:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-generic.sgml b/docs/libnm-util/tmpl/nm-setting-generic.sgml
deleted file mode 100644
index 2c88c208b..000000000
--- a/docs/libnm-util/tmpl/nm-setting-generic.sgml
+++ /dev/null
@@ -1,65 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingGeneric
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_GENERIC_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingGenericError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_GENERIC_ERROR_UNKNOWN:
-@NM_SETTING_GENERIC_ERROR_INVALID_PROPERTY:
-@NM_SETTING_GENERIC_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_GENERIC_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_generic_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_generic_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-gsm.sgml b/docs/libnm-util/tmpl/nm-setting-gsm.sgml
deleted file mode 100644
index 6dc2d3bf1..000000000
--- a/docs/libnm-util/tmpl/nm-setting-gsm.sgml
+++ /dev/null
@@ -1,283 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingGsm
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_GSM_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingGsmError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_GSM_ERROR_UNKNOWN:
-@NM_SETTING_GSM_ERROR_INVALID_PROPERTY:
-@NM_SETTING_GSM_ERROR_MISSING_PROPERTY:
-@NM_SETTING_GSM_ERROR_MISSING_SERIAL_SETTING:
-
-<!-- ##### MACRO NM_SETTING_GSM_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_gsm_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_GSM_NUMBER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_APN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_NETWORK_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PIN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_HOME_ONLY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_ALLOWED_BANDS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_NETWORK_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingGsmNetworkType ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_GSM_NETWORK_TYPE_ANY:
-@NM_SETTING_GSM_NETWORK_TYPE_UMTS_HSPA:
-@NM_SETTING_GSM_NETWORK_TYPE_GPRS_EDGE:
-@NM_SETTING_GSM_NETWORK_TYPE_PREFER_UMTS_HSPA:
-@NM_SETTING_GSM_NETWORK_TYPE_PREFER_GPRS_EDGE:
-@NM_SETTING_GSM_NETWORK_TYPE_PREFER_4G:
-@NM_SETTING_GSM_NETWORK_TYPE_4G:
-
-<!-- ##### ENUM NMSettingGsmNetworkBand ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_GSM_BAND_UNKNOWN:
-@NM_SETTING_GSM_BAND_ANY:
-@NM_SETTING_GSM_BAND_EGSM:
-@NM_SETTING_GSM_BAND_DCS:
-@NM_SETTING_GSM_BAND_PCS:
-@NM_SETTING_GSM_BAND_G850:
-@NM_SETTING_GSM_BAND_U2100:
-@NM_SETTING_GSM_BAND_U1800:
-@NM_SETTING_GSM_BAND_U17IV:
-@NM_SETTING_GSM_BAND_U800:
-@NM_SETTING_GSM_BAND_U850:
-@NM_SETTING_GSM_BAND_U900:
-@NM_SETTING_GSM_BAND_U17IX:
-@NM_SETTING_GSM_BAND_U1900:
-@NM_SETTING_GSM_BAND_U2600:
-
-<!-- ##### MACRO NM_SETTING_GSM_BANDS_MAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_gsm_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_number ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_apn ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_network_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_pin ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_home_only ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_pin_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_network_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_allowed_bands ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-infiniband.sgml b/docs/libnm-util/tmpl/nm-setting-infiniband.sgml
deleted file mode 100644
index 7a695cdd9..000000000
--- a/docs/libnm-util/tmpl/nm-setting-infiniband.sgml
+++ /dev/null
@@ -1,145 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingInfiniband
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingInfinibandError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_INFINIBAND_ERROR_UNKNOWN:
-@NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY:
-@NM_SETTING_INFINIBAND_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_TRANSPORT_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_P_KEY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_PARENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_transport_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_p_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_parent ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-ip4-config.sgml b/docs/libnm-util/tmpl/nm-setting-ip4-config.sgml
deleted file mode 100644
index e035c4932..000000000
--- a/docs/libnm-util/tmpl/nm-setting-ip4-config.sgml
+++ /dev/null
@@ -1,711 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingIP4Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingIP4ConfigError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_IP4_CONFIG_ERROR_UNKNOWN:
-@NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY:
-@NM_SETTING_IP4_CONFIG_ERROR_MISSING_PROPERTY:
-@NM_SETTING_IP4_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD:
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_DNS_SEARCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_ADDRESSES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_ROUTE_METRIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_MAY_FAIL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_AUTO ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_MANUAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_SHARED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_DISABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_ip4_address_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_address_dup ##### -->
-<para>
-
-</para>
-
-@source:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_address_ref ##### -->
-<para>
-
-</para>
-
-@address:
-
-
-<!-- ##### FUNCTION nm_ip4_address_unref ##### -->
-<para>
-
-</para>
-
-@address:
-
-
-<!-- ##### FUNCTION nm_ip4_address_compare ##### -->
-<para>
-
-</para>
-
-@address:
-@other:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_address_get_address ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_address_set_address ##### -->
-<para>
-
-</para>
-
-@address:
-@addr:
-
-
-<!-- ##### FUNCTION nm_ip4_address_get_prefix ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_address_set_prefix ##### -->
-<para>
-
-</para>
-
-@address:
-@prefix:
-
-
-<!-- ##### FUNCTION nm_ip4_address_get_gateway ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_address_set_gateway ##### -->
-<para>
-
-</para>
-
-@address:
-@gateway:
-
-
-<!-- ##### FUNCTION nm_ip4_route_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_dup ##### -->
-<para>
-
-</para>
-
-@source:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_ref ##### -->
-<para>
-
-</para>
-
-@route:
-
-
-<!-- ##### FUNCTION nm_ip4_route_unref ##### -->
-<para>
-
-</para>
-
-@route:
-
-
-<!-- ##### FUNCTION nm_ip4_route_compare ##### -->
-<para>
-
-</para>
-
-@route:
-@other:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_get_dest ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_set_dest ##### -->
-<para>
-
-</para>
-
-@route:
-@dest:
-
-
-<!-- ##### FUNCTION nm_ip4_route_get_prefix ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_set_prefix ##### -->
-<para>
-
-</para>
-
-@route:
-@prefix:
-
-
-<!-- ##### FUNCTION nm_ip4_route_get_next_hop ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_set_next_hop ##### -->
-<para>
-
-</para>
-
-@route:
-@next_hop:
-
-
-<!-- ##### FUNCTION nm_ip4_route_get_metric ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip4_route_set_metric ##### -->
-<para>
-
-</para>
-
-@route:
-@metric:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_num_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_add_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_dns_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_clear_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_num_dns_searches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_add_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns_search:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_dns_search_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns_search:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_clear_dns_searches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_num_addresses ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_add_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_address_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_clear_addresses ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_num_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_add_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_remove_route_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_clear_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_route_metric ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_ignore_auto_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_ignore_auto_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_dhcp_client_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_dhcp_send_hostname ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_dhcp_hostname ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_never_default ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_may_fail ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-ip6-config.sgml b/docs/libnm-util/tmpl/nm-setting-ip6-config.sgml
deleted file mode 100644
index 1f089c630..000000000
--- a/docs/libnm-util/tmpl/nm-setting-ip6-config.sgml
+++ /dev/null
@@ -1,712 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingIP6Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingIP6ConfigError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_IP6_CONFIG_ERROR_UNKNOWN:
-@NM_SETTING_IP6_CONFIG_ERROR_INVALID_PROPERTY:
-@NM_SETTING_IP6_CONFIG_ERROR_MISSING_PROPERTY:
-@NM_SETTING_IP6_CONFIG_ERROR_NOT_ALLOWED_FOR_METHOD:
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_DNS_SEARCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_ADDRESSES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_ROUTE_METRIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_MAY_FAIL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_IP6_PRIVACY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_DHCP_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_IGNORE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_AUTO ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_DHCP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_MANUAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_SHARED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingIP6ConfigPrivacy ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN:
-@NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED:
-@NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR:
-@NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR:
-
-<!-- ##### FUNCTION nm_ip6_address_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_address_dup ##### -->
-<para>
-
-</para>
-
-@source:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_address_ref ##### -->
-<para>
-
-</para>
-
-@address:
-
-
-<!-- ##### FUNCTION nm_ip6_address_unref ##### -->
-<para>
-
-</para>
-
-@address:
-
-
-<!-- ##### FUNCTION nm_ip6_address_compare ##### -->
-<para>
-
-</para>
-
-@address:
-@other:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_address_get_address ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_address_set_address ##### -->
-<para>
-
-</para>
-
-@address:
-@addr:
-
-
-<!-- ##### FUNCTION nm_ip6_address_get_prefix ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_address_set_prefix ##### -->
-<para>
-
-</para>
-
-@address:
-@prefix:
-
-
-<!-- ##### FUNCTION nm_ip6_address_get_gateway ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_address_set_gateway ##### -->
-<para>
-
-</para>
-
-@address:
-@gateway:
-
-
-<!-- ##### FUNCTION nm_ip6_route_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_dup ##### -->
-<para>
-
-</para>
-
-@source:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_ref ##### -->
-<para>
-
-</para>
-
-@route:
-
-
-<!-- ##### FUNCTION nm_ip6_route_unref ##### -->
-<para>
-
-</para>
-
-@route:
-
-
-<!-- ##### FUNCTION nm_ip6_route_compare ##### -->
-<para>
-
-</para>
-
-@route:
-@other:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_get_dest ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_set_dest ##### -->
-<para>
-
-</para>
-
-@route:
-@dest:
-
-
-<!-- ##### FUNCTION nm_ip6_route_get_prefix ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_set_prefix ##### -->
-<para>
-
-</para>
-
-@route:
-@prefix:
-
-
-<!-- ##### FUNCTION nm_ip6_route_get_next_hop ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_set_next_hop ##### -->
-<para>
-
-</para>
-
-@route:
-@next_hop:
-
-
-<!-- ##### FUNCTION nm_ip6_route_get_metric ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip6_route_set_metric ##### -->
-<para>
-
-</para>
-
-@route:
-@metric:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_num_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_add_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_dns_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_clear_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_num_dns_searches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_add_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns_search:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_dns_search_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns_search:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_clear_dns_searches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_num_addresses ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_add_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_address_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_clear_addresses ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_num_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_add_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_remove_route_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_clear_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_ignore_auto_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_route_metric ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_ignore_auto_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_dhcp_hostname ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_never_default ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_may_fail ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_ip6_privacy ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-olpc-mesh.sgml b/docs/libnm-util/tmpl/nm-setting-olpc-mesh.sgml
deleted file mode 100644
index c3971303b..000000000
--- a/docs/libnm-util/tmpl/nm-setting-olpc-mesh.sgml
+++ /dev/null
@@ -1,113 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingOlpcMesh
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingOlpcMeshError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_OLPC_MESH_ERROR_UNKNOWN:
-@NM_SETTING_OLPC_MESH_ERROR_INVALID_PROPERTY:
-@NM_SETTING_OLPC_MESH_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_SSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_CHANNEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_get_ssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_get_channel ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_get_dhcp_anycast_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-ppp.sgml b/docs/libnm-util/tmpl/nm-setting-ppp.sgml
deleted file mode 100644
index ccf4f0d97..000000000
--- a/docs/libnm-util/tmpl/nm-setting-ppp.sgml
+++ /dev/null
@@ -1,354 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingPPP
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_PPP_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingPPPError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_PPP_ERROR_UNKNOWN:
-@NM_SETTING_PPP_ERROR_INVALID_PROPERTY:
-@NM_SETTING_PPP_ERROR_MISSING_PROPERTY:
-@NM_SETTING_PPP_ERROR_REQUIRE_MPPE_NOT_ALLOWED:
-
-<!-- ##### MACRO NM_SETTING_PPP_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ppp_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NOAUTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_EAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_PAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_CHAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_MSCHAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_MSCHAPV2 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NOBSDCOMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NODEFLATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NO_VJ_COMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REQUIRE_MPPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REQUIRE_MPPE_128 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_MPPE_STATEFUL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_CRTSCTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_BAUD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_MRU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_LCP_ECHO_FAILURE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_LCP_ECHO_INTERVAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ppp_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_noauth ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_eap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_pap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_chap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_mschap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_mschapv2 ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_nobsdcomp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_nodeflate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_no_vj_comp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_require_mppe ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_require_mppe_128 ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_mppe_stateful ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_crtscts ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_baud ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_mru ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_lcp_echo_failure ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_lcp_echo_interval ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-pppoe.sgml b/docs/libnm-util/tmpl/nm-setting-pppoe.sgml
deleted file mode 100644
index f34ba1d27..000000000
--- a/docs/libnm-util/tmpl/nm-setting-pppoe.sgml
+++ /dev/null
@@ -1,130 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingPPPOE
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingPPPOEError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_PPPOE_ERROR_UNKNOWN:
-@NM_SETTING_PPPOE_ERROR_INVALID_PROPERTY:
-@NM_SETTING_PPPOE_ERROR_MISSING_PROPERTY:
-@NM_SETTING_PPPOE_ERROR_MISSING_PPP_SETTING:
-
-<!-- ##### MACRO NM_SETTING_PPPOE_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_SERVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_service ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-serial.sgml b/docs/libnm-util/tmpl/nm-setting-serial.sgml
deleted file mode 100644
index fcd7e170b..000000000
--- a/docs/libnm-util/tmpl/nm-setting-serial.sgml
+++ /dev/null
@@ -1,146 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingSerial
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingSerialError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_SERIAL_ERROR_UNKNOWN:
-@NM_SETTING_SERIAL_ERROR_INVALID_PROPERTY:
-@NM_SETTING_SERIAL_ERROR_MISSING_PROPERTY:
-@NM_SETTING_SERIAL_ERROR_MISSING_PPP_SETTING:
-
-<!-- ##### MACRO NM_SETTING_SERIAL_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_serial_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_BAUD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_BITS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_PARITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_STOPBITS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_SEND_DELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_serial_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_baud ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_bits ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_parity ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_stopbits ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_send_delay ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-team-port.sgml b/docs/libnm-util/tmpl/nm-setting-team-port.sgml
deleted file mode 100644
index 37ed15ee6..000000000
--- a/docs/libnm-util/tmpl/nm-setting-team-port.sgml
+++ /dev/null
@@ -1,81 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingTeamPort
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_PORT_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingTeamPortError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_TEAM_PORT_ERROR_UNKNOWN:
-@NM_SETTING_TEAM_PORT_ERROR_INVALID_PROPERTY:
-@NM_SETTING_TEAM_PORT_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_TEAM_PORT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_team_port_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_PORT_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_team_port_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_team_port_get_config ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-team.sgml b/docs/libnm-util/tmpl/nm-setting-team.sgml
deleted file mode 100644
index 161fc193e..000000000
--- a/docs/libnm-util/tmpl/nm-setting-team.sgml
+++ /dev/null
@@ -1,97 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingTeam
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingTeamError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_TEAM_ERROR_UNKNOWN:
-@NM_SETTING_TEAM_ERROR_INVALID_PROPERTY:
-@NM_SETTING_TEAM_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_TEAM_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_team_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_team_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_team_get_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_team_get_config ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-vlan.sgml b/docs/libnm-util/tmpl/nm-setting-vlan.sgml
deleted file mode 100644
index 79053ea55..000000000
--- a/docs/libnm-util/tmpl/nm-setting-vlan.sgml
+++ /dev/null
@@ -1,249 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingVlan
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingVlanError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_VLAN_ERROR_UNKNOWN:
-@NM_SETTING_VLAN_ERROR_INVALID_PROPERTY:
-@NM_SETTING_VLAN_ERROR_MISSING_PROPERTY:
-@NM_SETTING_VLAN_ERROR_INVALID_PARENT:
-
-<!-- ##### MACRO NM_SETTING_VLAN_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_vlan_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_PARENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_INGRESS_PRIORITY_MAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_EGRESS_PRIORITY_MAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVlanPriorityMap ##### -->
-<para>
-
-</para>
-
-@NM_VLAN_INGRESS_MAP:
-@NM_VLAN_EGRESS_MAP:
-
-<!-- ##### ENUM NMVlanFlags ##### -->
-<para>
-
-</para>
-
-@NM_VLAN_FLAG_REORDER_HEADERS:
-@NM_VLAN_FLAG_GVRP:
-@NM_VLAN_FLAG_LOOSE_BINDING:
-
-<!-- ##### FUNCTION nm_setting_vlan_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_parent ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_num_priorities ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@idx:
-@out_from:
-@out_to:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_add_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@from:
-@to:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_remove_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_remove_priority_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@from:
-@to:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_remove_priority_str_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_clear_priorities ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_add_priority_str ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@str:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-vpn.sgml b/docs/libnm-util/tmpl/nm-setting-vpn.sgml
deleted file mode 100644
index 3d2b9a3ac..000000000
--- a/docs/libnm-util/tmpl/nm-setting-vpn.sgml
+++ /dev/null
@@ -1,235 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingVPN
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_VPN_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingVpnError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_VPN_ERROR_UNKNOWN:
-@NM_SETTING_VPN_ERROR_INVALID_PROPERTY:
-@NM_SETTING_VPN_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_VPN_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_vpn_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_VPN_SERVICE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_USER_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_PERSISTENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_DATA ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_SECRETS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### USER_FUNCTION NMVPNIterFunc ##### -->
-<para>
-
-</para>
-
-@key:
-@value:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_service_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_user_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_persistent ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_num_data_items ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_add_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@item:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_remove_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_foreach_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_num_secrets ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_add_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@secret:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_remove_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_foreach_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-wimax.sgml b/docs/libnm-util/tmpl/nm-setting-wimax.sgml
deleted file mode 100644
index ebfbd61a2..000000000
--- a/docs/libnm-util/tmpl/nm-setting-wimax.sgml
+++ /dev/null
@@ -1,97 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWimax
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIMAX_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingWimaxError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_WIMAX_ERROR_UNKNOWN:
-@NM_SETTING_WIMAX_ERROR_INVALID_PROPERTY:
-@NM_SETTING_WIMAX_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_WIMAX_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wimax_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_WIMAX_NETWORK_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIMAX_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wimax_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wimax_get_network_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wimax_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-wired.sgml b/docs/libnm-util/tmpl/nm-setting-wired.sgml
deleted file mode 100644
index fe4f2d325..000000000
--- a/docs/libnm-util/tmpl/nm-setting-wired.sgml
+++ /dev/null
@@ -1,349 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWired
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingWiredError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_WIRED_ERROR_UNKNOWN:
-@NM_SETTING_WIRED_ERROR_INVALID_PROPERTY:
-@NM_SETTING_WIRED_ERROR_MISSING_PROPERTY:
-
-<!-- ##### MACRO NM_SETTING_WIRED_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wired_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_PORT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_SPEED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_DUPLEX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_AUTO_NEGOTIATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_CLONED_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_S390_SUBCHANNELS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_S390_NETTYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_S390_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wired_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_port ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_speed ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_duplex ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_auto_negotiate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_cloned_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mac_address_blacklist ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_num_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_add_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_remove_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_wired_remove_mac_blacklist_item_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_clear_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_subchannels ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_nettype ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_num_s390_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@out_key:
-@out_value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_option_by_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_add_s390_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_remove_s390_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_valid_s390_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-wireless-security.sgml b/docs/libnm-util/tmpl/nm-setting-wireless-security.sgml
deleted file mode 100644
index dea50cd7b..000000000
--- a/docs/libnm-util/tmpl/nm-setting-wireless-security.sgml
+++ /dev/null
@@ -1,476 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWirelessSecurity
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingWirelessSecurityError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_WIRELESS_SECURITY_ERROR_UNKNOWN:
-@NM_SETTING_WIRELESS_SECURITY_ERROR_INVALID_PROPERTY:
-@NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_PROPERTY:
-@NM_SETTING_WIRELESS_SECURITY_ERROR_MISSING_802_1X_SETTING:
-@NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_802_1X:
-@NM_SETTING_WIRELESS_SECURITY_ERROR_LEAP_REQUIRES_USERNAME:
-@NM_SETTING_WIRELESS_SECURITY_ERROR_SHARED_KEY_REQUIRES_WEP:
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### ENUM NMWepKeyType ##### -->
-<para>
-
-</para>
-
-@NM_WEP_KEY_TYPE_UNKNOWN:
-@NM_WEP_KEY_TYPE_KEY:
-@NM_WEP_KEY_TYPE_PASSPHRASE:
-@NM_WEP_KEY_TYPE_LAST:
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_KEY_MGMT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_AUTH_ALG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PROTO ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PAIRWISE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_GROUP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY0 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY1 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY2 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY3 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PSK ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_key_mgmt ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_num_protos ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_proto ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_add_proto ##### -->
-<para>
-
-</para>
-
-@setting:
-@proto:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_proto ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_proto_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@proto:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_clear_protos ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_num_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_add_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@pairwise:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_pairwise_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@pairwise:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_clear_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_num_groups ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_group ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_add_group ##### -->
-<para>
-
-</para>
-
-@setting:
-@group:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_group ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_group_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@group:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_clear_groups ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_psk ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_psk_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_leap_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_leap_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_leap_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_set_wep_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@key:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_tx_keyidx ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_auth_alg ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_key_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_key_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting-wireless.sgml b/docs/libnm-util/tmpl/nm-setting-wireless.sgml
deleted file mode 100644
index 08c526b17..000000000
--- a/docs/libnm-util/tmpl/nm-setting-wireless.sgml
+++ /dev/null
@@ -1,402 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWireless
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingWirelessError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_WIRELESS_ERROR_UNKNOWN:
-@NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY:
-@NM_SETTING_WIRELESS_ERROR_MISSING_PROPERTY:
-@NM_SETTING_WIRELESS_ERROR_MISSING_SECURITY_SETTING:
-@NM_SETTING_WIRELESS_ERROR_CHANNEL_REQUIRES_BAND:
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wireless_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_BAND ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_CHANNEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_BSSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_RATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_TX_POWER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SEEN_BSSIDS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_HIDDEN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SEC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE_ADHOC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE_AP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE_INFRA ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wireless_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_ssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_band ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_channel ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_bssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_rate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_tx_power ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_cloned_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mac_address_blacklist ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_num_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_add_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_remove_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_remove_mac_blacklist_item_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_clear_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_hidden ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_add_seen_bssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@bssid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_num_seen_bssids ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_seen_bssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_ap_security_compatible ##### -->
-<para>
-
-</para>
-
-@s_wireless:
-@s_wireless_sec:
-@ap_flags:
-@ap_wpa:
-@ap_rsn:
-@ap_mode:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_security ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-setting.sgml b/docs/libnm-util/tmpl/nm-setting.sgml
deleted file mode 100644
index 61a3bdc20..000000000
--- a/docs/libnm-util/tmpl/nm-setting.sgml
+++ /dev/null
@@ -1,327 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSetting
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMSettingError ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_ERROR_UNKNOWN:
-@NM_SETTING_ERROR_PROPERTY_NOT_FOUND:
-@NM_SETTING_ERROR_PROPERTY_NOT_SECRET:
-@NM_SETTING_ERROR_PROPERTY_TYPE_MISMATCH:
-
-<!-- ##### MACRO NM_SETTING_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_SERIALIZE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_REQUIRED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_SECRET ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_FUZZY_IGNORE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingSecretFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_SECRET_FLAG_NONE:
-@NM_SETTING_SECRET_FLAG_AGENT_OWNED:
-@NM_SETTING_SECRET_FLAG_NOT_SAVED:
-@NM_SETTING_SECRET_FLAG_NOT_REQUIRED:
-
-<!-- ##### ENUM NMSettingCompareFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_COMPARE_FLAG_EXACT:
-@NM_SETTING_COMPARE_FLAG_FUZZY:
-@NM_SETTING_COMPARE_FLAG_IGNORE_ID:
-@NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS:
-@NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS:
-@NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS:
-@NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT:
-@NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT:
-
-<!-- ##### STRUCT NMSetting ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG NMSetting:name ##### -->
-<para>
-
-</para>
-
-<!-- ##### USER_FUNCTION NMSettingClearSecretsWithFlagsFn ##### -->
-<para>
-
-</para>
-
-@setting:
-@secret:
-@flags:
-@user_data:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMSettingValueIterFn ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@value:
-@flags:
-@user_data:
-
-
-<!-- ##### ENUM NMSettingHashFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_HASH_FLAG_ALL:
-@NM_SETTING_HASH_FLAG_NO_SECRETS:
-@NM_SETTING_HASH_FLAG_ONLY_SECRETS:
-
-<!-- ##### FUNCTION nm_setting_to_hash ##### -->
-<para>
-
-</para>
-
-@setting:
-@flags:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_new_from_hash ##### -->
-<para>
-
-</para>
-
-@setting_type:
-@hash:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_duplicate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_get_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_verify ##### -->
-<para>
-
-</para>
-
-@setting:
-@all_settings:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_compare ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@Returns:
-
-
-<!-- ##### ENUM NMSettingDiffResult ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_DIFF_RESULT_UNKNOWN:
-@NM_SETTING_DIFF_RESULT_IN_A:
-@NM_SETTING_DIFF_RESULT_IN_B:
-@NM_SETTING_DIFF_RESULT_IN_A_DEFAULT:
-@NM_SETTING_DIFF_RESULT_IN_B_DEFAULT:
-
-<!-- ##### FUNCTION nm_setting_diff ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@invert_results:
-@results:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_enumerate_values ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_to_string ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_clear_secrets ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_clear_secrets_with_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_need_secrets ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_update_secrets ##### -->
-<para>
-
-</para>
-
-@setting:
-@secrets:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_get_secret_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@secret_name:
-@out_flags:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_set_secret_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@secret_name:
-@flags:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_get_virtual_iface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm-util/tmpl/nm-utils-enum-types.sgml b/docs/libnm-util/tmpl/nm-utils-enum-types.sgml
deleted file mode 100644
index 820258228..000000000
--- a/docs/libnm-util/tmpl/nm-utils-enum-types.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-utils-enum-types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/docs/libnm-util/tmpl/nm-utils.sgml b/docs/libnm-util/tmpl/nm-utils.sgml
deleted file mode 100644
index 2bb22046a..000000000
--- a/docs/libnm-util/tmpl/nm-utils.sgml
+++ /dev/null
@@ -1,562 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-utils
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION nm_utils_init ##### -->
-<para>
-
-</para>
-
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_deinit ##### -->
-<para>
-
-</para>
-
-@void:
-
-
-<!-- ##### FUNCTION nm_utils_is_empty_ssid ##### -->
-<para>
-
-</para>
-
-@ssid:
-@len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_escape_ssid ##### -->
-<para>
-
-</para>
-
-@ssid:
-@len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_same_ssid ##### -->
-<para>
-
-</para>
-
-@ssid1:
-@ssid2:
-@ignore_trailing_null:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ssid_to_utf8 ##### -->
-<para>
-
-</para>
-
-@ssid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_gvalue_hash_dup ##### -->
-<para>
-
-</para>
-
-@hash:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_slist_free ##### -->
-<para>
-
-</para>
-
-@list:
-@elem_destroy_fn:
-
-
-<!-- ##### ENUM NMUtilsSecurityType ##### -->
-<para>
-
-</para>
-
-@NMU_SEC_INVALID:
-@NMU_SEC_NONE:
-@NMU_SEC_STATIC_WEP:
-@NMU_SEC_LEAP:
-@NMU_SEC_DYNAMIC_WEP:
-@NMU_SEC_WPA_PSK:
-@NMU_SEC_WPA_ENTERPRISE:
-@NMU_SEC_WPA2_PSK:
-@NMU_SEC_WPA2_ENTERPRISE:
-
-<!-- ##### FUNCTION nm_utils_security_valid ##### -->
-<para>
-
-</para>
-
-@type:
-@wifi_caps:
-@have_ap:
-@adhoc:
-@ap_flags:
-@ap_wpa:
-@ap_rsn:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ap_mode_security_valid ##### -->
-<para>
-
-</para>
-
-@type:
-@wifi_caps:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wep_key_valid ##### -->
-<para>
-
-</para>
-
-@key:
-@wep_type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wpa_psk_valid ##### -->
-<para>
-
-</para>
-
-@psk:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_addresses_from_gvalue ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_addresses_to_gvalue ##### -->
-<para>
-
-</para>
-
-@list:
-@value:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_routes_from_gvalue ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_routes_to_gvalue ##### -->
-<para>
-
-</para>
-
-@list:
-@value:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_netmask_to_prefix ##### -->
-<para>
-
-</para>
-
-@netmask:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_prefix_to_netmask ##### -->
-<para>
-
-</para>
-
-@prefix:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_get_default_prefix ##### -->
-<para>
-
-</para>
-
-@ip:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_addresses_from_gvalue ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_addresses_to_gvalue ##### -->
-<para>
-
-</para>
-
-@list:
-@value:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_routes_from_gvalue ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_routes_to_gvalue ##### -->
-<para>
-
-</para>
-
-@list:
-@value:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_dns_from_gvalue ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_dns_to_gvalue ##### -->
-<para>
-
-</para>
-
-@list:
-@value:
-
-
-<!-- ##### FUNCTION nm_utils_uuid_generate ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_uuid_generate_from_string ##### -->
-<para>
-
-</para>
-
-@s:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_rsa_key_encrypt ##### -->
-<para>
-
-</para>
-
-@data:
-@in_password:
-@out_password:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_rsa_key_encrypt_aes ##### -->
-<para>
-
-</para>
-
-@data:
-@in_password:
-@out_password:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_file_is_pkcs12 ##### -->
-<para>
-
-</para>
-
-@filename:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMUtilsFileSearchInPathsPredicate ##### -->
-<para>
-
-</para>
-
-@filename:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_file_search_in_paths ##### -->
-<para>
-
-</para>
-
-@progname:
-@try_first:
-@paths:
-@file_test_flags:
-@predicate:
-@user_data:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_freq_to_channel ##### -->
-<para>
-
-</para>
-
-@freq:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_channel_to_freq ##### -->
-<para>
-
-</para>
-
-@channel:
-@band:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_find_next_channel ##### -->
-<para>
-
-</para>
-
-@channel:
-@direction:
-@band:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_is_channel_valid ##### -->
-<para>
-
-</para>
-
-@channel:
-@band:
-@Returns:
-
-
-<!-- ##### MACRO NM_UTILS_HWADDR_LEN_MAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_len ##### -->
-<para>
-
-</para>
-
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_type ##### -->
-<para>
-
-</para>
-
-@len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_ntoa ##### -->
-<para>
-
-</para>
-
-@addr:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_atoba ##### -->
-<para>
-
-</para>
-
-@asc:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_aton ##### -->
-<para>
-
-</para>
-
-@asc:
-@type:
-@buffer:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_ntoa_len ##### -->
-<para>
-
-</para>
-
-@addr:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_aton_len ##### -->
-<para>
-
-</para>
-
-@asc:
-@buffer:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_valid ##### -->
-<para>
-
-</para>
-
-@asc:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_bin2hexstr ##### -->
-<para>
-
-</para>
-
-@bytes:
-@len:
-@final_len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hex2byte ##### -->
-<para>
-
-</para>
-
-@hex:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hexstr2bin ##### -->
-<para>
-
-</para>
-
-@hex:
-@len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_iface_valid_name ##### -->
-<para>
-
-</para>
-
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_is_uuid ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### MACRO NM_UTILS_INET_ADDRSTRLEN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_utils_inet4_ntop ##### -->
-<para>
-
-</para>
-
-@inaddr:
-@dst:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_inet6_ntop ##### -->
-<para>
-
-</para>
-
-@in6addr:
-@dst:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_check_virtual_device_compatibility ##### -->
-<para>
-
-</para>
-
-@virtual_type:
-@other_type:
-@Returns:
-
-
diff --git a/docs/libnm-util/version.xml b/docs/libnm-util/version.xml
index 6d7de6e6a..ee90284c2 100644
--- a/docs/libnm-util/version.xml
+++ b/docs/libnm-util/version.xml
@@ -1 +1 @@
-1.0.2
+1.0.4
diff --git a/docs/libnm/Makefile.in b/docs/libnm/Makefile.in
index 04cec2f19..54ad32871 100644
--- a/docs/libnm/Makefile.in
+++ b/docs/libnm/Makefile.in
@@ -142,6 +142,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -255,6 +256,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -495,6 +497,7 @@ GPATH = $(srcdir)
TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)
SETUP_FILES = \
$(content_files) \
+ $(expand_content_files) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE)-sections.txt \
$(DOC_MODULE)-overrides.txt
@@ -502,9 +505,9 @@ SETUP_FILES = \
# include common portion ...
EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
-DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
@@ -539,11 +542,6 @@ GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V))
GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects";
-#### templates ####
-GTK_DOC_V_TMPL = $(GTK_DOC_V_TMPL_$(V))
-GTK_DOC_V_TMPL_ = $(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY))
-GTK_DOC_V_TMPL_0 = @echo " DOC Rebuilding template files";
-
#### xml ####
GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V))
GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
@@ -780,18 +778,15 @@ $(REPORT_FILES): sgml-build.stamp
setup-build.stamp:
-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
if test "x$$files" != "x" ; then \
for file in $$files ; do \
- destdir=`dirname $(abs_builddir)/$$file` ;\
+ destdir=`dirname $(abs_builddir)/$$file`; \
test -d "$$destdir" || mkdir -p "$$destdir"; \
test -f $(abs_srcdir)/$$file && \
cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -pR $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
$(AM_V_at)touch setup-build.stamp
@@ -804,7 +799,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
scanobj_options=""; \
gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
scanobj_options="--verbose"; \
fi; \
@@ -821,23 +816,8 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -pR $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- $(AM_V_at)touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
- -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+ $(GTK_DOC_V_XML)_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
done ; \
@@ -847,17 +827,17 @@ sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(
sgml.stamp: sgml-build.stamp
@true
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
mkhtml_options=""; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkhtml_options="$$mkhtml_options --verbose"; \
fi; \
fi; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
fi; \
cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -873,11 +853,11 @@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
$(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
$(AM_V_at)touch html-build.stamp
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
mkpdf_options=""; \
gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkpdf_options="$$mkpdf_options --verbose"; \
fi; \
@@ -902,13 +882,15 @@ clean-local:
@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
rm -f $(DOC_MODULE).types; \
fi
+ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+ rm -f $(DOC_MODULE)-sections.txt; \
+ fi
distclean-local:
@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
+ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
fi
maintainer-clean-local:
@@ -955,9 +937,7 @@ uninstall-local:
@HAVE_GTK_DOC_FALSE@ @false
dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
diff --git a/docs/libnm/html/NMAccessPoint.html b/docs/libnm/html/NMAccessPoint.html
index 8391ef44d..1daa7c012 100644
--- a/docs/libnm/html/NMAccessPoint.html
+++ b/docs/libnm/html/NMAccessPoint.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMAccessPoint</title>
+<title>NMAccessPoint: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMRemoteConnection.html" title="NMRemoteConnection">
<link rel="next" href="NMWimaxNsp.html" title="NMWimaxNsp">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -256,8 +256,6 @@
</div>
<div class="refsect1">
<a name="NMAccessPoint.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMAccessPoint.functions_details"></a><h2>Functions</h2>
@@ -284,7 +282,6 @@ nm_access_point_get_flags (<em class="parameter"><code><a class="link" href="NMA
<div class="refsect3">
<a name="id-1.5.19.8.2.6"></a><h4>Returns</h4>
<p> the flags</p>
-<p></p>
</div>
</div>
<hr>
@@ -311,7 +308,6 @@ nm_access_point_get_wpa_flags (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.5.19.8.3.6"></a><h4>Returns</h4>
<p> the WPA flags</p>
-<p></p>
</div>
</div>
<hr>
@@ -339,7 +335,6 @@ point.</p>
<div class="refsect3">
<a name="id-1.5.19.8.4.6"></a><h4>Returns</h4>
<p> the RSN flags</p>
-<p></p>
</div>
</div>
<hr>
@@ -395,7 +390,6 @@ nm_access_point_get_bssid (<em class="parameter"><code><a class="link" href="NMA
<a name="id-1.5.19.8.6.6"></a><h4>Returns</h4>
<p> the BSSID of the access point. This is an internal string and must
not be modified or freed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -422,7 +416,6 @@ nm_access_point_get_frequency (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.5.19.8.7.6"></a><h4>Returns</h4>
<p> the frequency</p>
-<p></p>
</div>
</div>
<hr>
@@ -449,7 +442,6 @@ nm_access_point_get_mode (<em class="parameter"><code><a class="link" href="NMAc
<div class="refsect3">
<a name="id-1.5.19.8.8.6"></a><h4>Returns</h4>
<p> the mode</p>
-<p></p>
</div>
</div>
<hr>
@@ -476,7 +468,6 @@ nm_access_point_get_max_bitrate (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.5.19.8.9.6"></a><h4>Returns</h4>
<p> the maximum bit rate (kbit/s)</p>
-<p></p>
</div>
</div>
<hr>
@@ -503,7 +494,6 @@ nm_access_point_get_strength (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.5.19.8.10.6"></a><h4>Returns</h4>
<p> the signal strength</p>
-<p></p>
</div>
</div>
<hr>
@@ -592,7 +582,6 @@ against</p></td>
<a name="id-1.5.19.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this Wi-Fi AP,
<code class="literal">FALSE</code> if it cannot be.</p>
-<p></p>
</div>
</div>
</div>
@@ -602,80 +591,60 @@ against</p></td>
<a name="NM-ACCESS-POINT-FLAGS:CAPS"></a><h3>NM_ACCESS_POINT_FLAGS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_FLAGS "flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-WPA-FLAGS:CAPS"></a><h3>NM_ACCESS_POINT_WPA_FLAGS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_WPA_FLAGS "wpa-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-RSN-FLAGS:CAPS"></a><h3>NM_ACCESS_POINT_RSN_FLAGS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_RSN_FLAGS "rsn-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-SSID:CAPS"></a><h3>NM_ACCESS_POINT_SSID</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_SSID "ssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-BSSID:CAPS"></a><h3>NM_ACCESS_POINT_BSSID</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_BSSID "bssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-FREQUENCY:CAPS"></a><h3>NM_ACCESS_POINT_FREQUENCY</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_FREQUENCY "frequency"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-MODE:CAPS"></a><h3>NM_ACCESS_POINT_MODE</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-MAX-BITRATE:CAPS"></a><h3>NM_ACCESS_POINT_MAX_BITRATE</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_MAX_BITRATE "max-bitrate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-STRENGTH:CAPS"></a><h3>NM_ACCESS_POINT_STRENGTH</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_STRENGTH "strength"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACCESS-POINT-HW-ADDRESS:CAPS"></a><h3>NM_ACCESS_POINT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_ACCESS_POINT_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -683,7 +652,7 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--bssid"></a><h3>The <code class="literal">“bssid”</code> property</h3>
<pre class="programlisting"> “bssid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The BSSID of the access point.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -691,14 +660,14 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--flags"></a><h3>The <code class="literal">“flags”</code> property</h3>
<pre class="programlisting"> “flags” <a class="link" href="libnm-nm-dbus-interface.html#NM80211ApFlags" title="enum NM80211ApFlags"><span class="type">NM80211ApFlags</span></a></pre>
-<p></p>
+<p>The flags of the access point.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMAccessPoint--frequency"></a><h3>The <code class="literal">“frequency”</code> property</h3>
<pre class="programlisting"> “frequency” <span class="type">guint</span></pre>
-<p></p>
+<p>The frequency of the access point.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 10000</p>
<p>Default value: 0</p>
@@ -707,7 +676,7 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Alias for <a class="link" href="NMAccessPoint.html#NMAccessPoint--bssid" title="The “bssid” property"><span class="type">“bssid”</span></a>.</p>
<div class="warning">
<p><code class="literal">NMAccessPoint:hw-address</code> has been deprecated since version 1.0 and should not be used in newly-written code.</p>
<p>use <a class="link" href="NMAccessPoint.html#NMAccessPoint--bssid" title="The “bssid” property"><span class="type">“bssid”</span></a>.</p>
@@ -719,7 +688,7 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--max-bitrate"></a><h3>The <code class="literal">“max-bitrate”</code> property</h3>
<pre class="programlisting"> “max-bitrate” <span class="type">guint</span></pre>
-<p></p>
+<p>The maximum bit rate of the access point in kbit/s.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -727,7 +696,9 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
<pre class="programlisting"> “mode” <a class="link" href="libnm-nm-dbus-interface.html#NM80211Mode" title="enum NM80211Mode"><span class="type">NM80211Mode</span></a></pre>
-<p></p>
+<p>The mode of the access point; either "infrastructure" (a central
+coordinator of the wireless network allowing clients to connect) or
+"ad-hoc" (a network with no central controller).</p>
<p>Flags: Read</p>
<p>Default value: NM_802_11_MODE_INFRA</p>
</div>
@@ -735,21 +706,21 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--rsn-flags"></a><h3>The <code class="literal">“rsn-flags”</code> property</h3>
<pre class="programlisting"> “rsn-flags” <a class="link" href="libnm-nm-dbus-interface.html#NM80211ApSecurityFlags" title="enum NM80211ApSecurityFlags"><span class="type">NM80211ApSecurityFlags</span></a></pre>
-<p></p>
+<p>The RSN flags of the access point.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMAccessPoint--ssid"></a><h3>The <code class="literal">“ssid”</code> property</h3>
<pre class="programlisting"> “ssid” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>The SSID of the access point, or <code class="literal">NULL</code> if it is not known.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMAccessPoint--strength"></a><h3>The <code class="literal">“strength”</code> property</h3>
<pre class="programlisting"> “strength” <span class="type">guchar</span></pre>
-<p></p>
+<p>The current signal strength of the access point.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -757,13 +728,12 @@ against</p></td>
<div class="refsect2">
<a name="NMAccessPoint--wpa-flags"></a><h3>The <code class="literal">“wpa-flags”</code> property</h3>
<pre class="programlisting"> “wpa-flags” <a class="link" href="libnm-nm-dbus-interface.html#NM80211ApSecurityFlags" title="enum NM80211ApSecurityFlags"><span class="type">NM80211ApSecurityFlags</span></a></pre>
-<p></p>
+<p>The WPA flags of the access point.</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMActiveConnection.html b/docs/libnm/html/NMActiveConnection.html
index bbe1a3fe8..a059c1809 100644
--- a/docs/libnm/html/NMActiveConnection.html
+++ b/docs/libnm/html/NMActiveConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMActiveConnection</title>
+<title>NMActiveConnection: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceWimax.html" title="NMDeviceWimax">
<link rel="next" href="NMVpnConnection.html" title="NMVpnConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -338,8 +338,6 @@
</div>
<div class="refsect1">
<a name="NMActiveConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMActiveConnection.functions_details"></a><h2>Functions</h2>
@@ -396,7 +394,6 @@ nm_active_connection_get_id (<em class="parameter"><code><a class="link" href="N
<a name="id-1.5.16.8.3.6"></a><h4>Returns</h4>
<p> the ID of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> that backs the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -424,7 +421,6 @@ nm_active_connection_get_uuid (<em class="parameter"><code><a class="link" href=
<a name="id-1.5.16.8.4.6"></a><h4>Returns</h4>
<p> the UUID of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> that backs the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -453,7 +449,6 @@ nm_active_connection_get_connection_type
<a name="id-1.5.16.8.5.6"></a><h4>Returns</h4>
<p> the type of the <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> that backs the <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a>.
This is the internal string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -488,7 +483,6 @@ resolve it with <a class="link" href="NMDeviceWifi.html#nm-device-wifi-get-acces
<a name="id-1.5.16.8.6.7"></a><h4>Returns</h4>
<p> the specific object's D-Bus path. This is the internal string used
by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -543,7 +537,6 @@ nm_active_connection_get_state (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.5.16.8.8.6"></a><h4>Returns</h4>
<p> the state</p>
-<p></p>
</div>
</div>
<hr>
@@ -598,7 +591,6 @@ the default IPv4 route and DNS information).</p>
<div class="refsect3">
<a name="id-1.5.16.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the active connection is the default IPv4 connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -684,7 +676,6 @@ the default IPv6 route and DNS information).</p>
<div class="refsect3">
<a name="id-1.5.16.8.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the active connection is the default IPv6 connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -769,7 +760,6 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.5.16.8.16.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the active connection is a VPN connection</p>
-<p></p>
</div>
</div>
</div>
@@ -779,120 +769,90 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<a name="NM-ACTIVE-CONNECTION-CONNECTION:CAPS"></a><h3>NM_ACTIVE_CONNECTION_CONNECTION</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_CONNECTION "connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-ID:CAPS"></a><h3>NM_ACTIVE_CONNECTION_ID</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_ID "id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-UUID:CAPS"></a><h3>NM_ACTIVE_CONNECTION_UUID</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_UUID "uuid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-TYPE:CAPS"></a><h3>NM_ACTIVE_CONNECTION_TYPE</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_TYPE "type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-SPECIFIC-OBJECT-PATH:CAPS"></a><h3>NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT_PATH</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT_PATH "specific-object-path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DEVICES:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DEVICES</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DEVICES "devices"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-STATE:CAPS"></a><h3>NM_ACTIVE_CONNECTION_STATE</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DEFAULT:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DEFAULT</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DEFAULT "default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-IP4-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DHCP4-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DHCP4_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DEFAULT6:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DEFAULT6</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DEFAULT6 "default6"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-IP6-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_IP6_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_IP6_CONFIG "ip6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-DHCP6-CONFIG:CAPS"></a><h3>NM_ACTIVE_CONNECTION_DHCP6_CONFIG</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_DHCP6_CONFIG "dhcp6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-VPN:CAPS"></a><h3>NM_ACTIVE_CONNECTION_VPN</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_VPN "vpn"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-ACTIVE-CONNECTION-MASTER:CAPS"></a><h3>NM_ACTIVE_CONNECTION_MASTER</h3>
<pre class="programlisting">#define NM_ACTIVE_CONNECTION_MASTER "master"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -900,14 +860,14 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--connection"></a><h3>The <code class="literal">“connection”</code> property</h3>
<pre class="programlisting"> “connection” <a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> *</pre>
-<p></p>
+<p>The connection that this is an active instance of.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--default"></a><h3>The <code class="literal">“default”</code> property</h3>
<pre class="programlisting"> “default” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the active connection is the default IPv4 one.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -915,7 +875,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--default6"></a><h3>The <code class="literal">“default6”</code> property</h3>
<pre class="programlisting"> “default6” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the active connection is the default IPv6 one.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -923,28 +883,29 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--devices"></a><h3>The <code class="literal">“devices”</code> property</h3>
<pre class="programlisting"> “devices” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The devices of the active connection.</p>
+<p>Element-type: NMDevice</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--dhcp4-config"></a><h3>The <code class="literal">“dhcp4-config”</code> property</h3>
<pre class="programlisting"> “dhcp4-config” <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> *</pre>
-<p></p>
+<p>The IPv4 <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> of the connection.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--dhcp6-config"></a><h3>The <code class="literal">“dhcp6-config”</code> property</h3>
<pre class="programlisting"> “dhcp6-config” <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> *</pre>
-<p></p>
+<p>The IPv6 <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> of the connection.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--id"></a><h3>The <code class="literal">“id”</code> property</h3>
<pre class="programlisting"> “id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active connection's ID</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -952,28 +913,29 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--ip4-config"></a><h3>The <code class="literal">“ip4-config”</code> property</h3>
<pre class="programlisting"> “ip4-config” <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> *</pre>
-<p></p>
+<p>The IPv4 <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> of the connection.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--ip6-config"></a><h3>The <code class="literal">“ip6-config”</code> property</h3>
<pre class="programlisting"> “ip6-config” <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> *</pre>
-<p></p>
+<p>The IPv6 <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> of the connection.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--master"></a><h3>The <code class="literal">“master”</code> property</h3>
<pre class="programlisting"> “master” <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> *</pre>
-<p></p>
+<p>The master device if one exists.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMActiveConnection--specific-object-path"></a><h3>The <code class="literal">“specific-object-path”</code> property</h3>
<pre class="programlisting"> “specific-object-path” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The path to the "specific object" of the active connection; see
+<a class="link" href="NMActiveConnection.html#nm-active-connection-get-specific-object-path" title="nm_active_connection_get_specific_object_path ()"><code class="function">nm_active_connection_get_specific_object_path()</code></a> for more details.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -981,7 +943,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--state"></a><h3>The <code class="literal">“state”</code> property</h3>
<pre class="programlisting"> “state” <a class="link" href="libnm-nm-dbus-interface.html#NMActiveConnectionState" title="enum NMActiveConnectionState"><span class="type">NMActiveConnectionState</span></a></pre>
-<p></p>
+<p>The state of the active connection.</p>
<p>Flags: Read</p>
<p>Default value: NM_ACTIVE_CONNECTION_STATE_UNKNOWN</p>
</div>
@@ -989,7 +951,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--type"></a><h3>The <code class="literal">“type”</code> property</h3>
<pre class="programlisting"> “type” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active connection's type</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -997,7 +959,7 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--uuid"></a><h3>The <code class="literal">“uuid”</code> property</h3>
<pre class="programlisting"> “uuid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active connection's UUID</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -1005,14 +967,13 @@ nm_active_connection_get_vpn (<em class="parameter"><code><a class="link" href="
<div class="refsect2">
<a name="NMActiveConnection--vpn"></a><h3>The <code class="literal">“vpn”</code> property</h3>
<pre class="programlisting"> “vpn” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the active connection is a VPN connection.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMClient.html b/docs/libnm/html/NMClient.html
index b038c2316..950d72514 100644
--- a/docs/libnm/html/NMClient.html
+++ b/docs/libnm/html/NMClient.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMClient</title>
+<title>NMClient: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch02.html" title="Client Object API Reference">
<link rel="prev" href="ch02.html" title="Client Object API Reference">
<link rel="next" href="NMSecretAgentOld.html" title="NMSecretAgentOld">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -759,8 +759,6 @@
</div>
<div class="refsect1">
<a name="NMClient.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMClient.functions_details"></a><h2>Functions</h2>
@@ -772,7 +770,6 @@ nm_client_error_quark (<em class="parameter"><code><span class="type">void</span
<div class="refsect3">
<a name="id-1.3.2.9.2.5"></a><h4>Returns</h4>
<p> the error quark used for <a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> errors.</p>
-<p></p>
</div>
</div>
<hr>
@@ -810,7 +807,6 @@ that.</p>
<div class="refsect3">
<a name="id-1.3.2.9.3.7"></a><h4>Returns</h4>
<p> a new <a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> or NULL on an error</p>
-<p></p>
</div>
</div>
<hr>
@@ -886,7 +882,6 @@ nm_client_new_finish (<em class="parameter"><code><span class="type">GAsyncResul
<div class="refsect3">
<a name="id-1.3.2.9.5.6"></a><h4>Returns</h4>
<p> a new <a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a>, or <code class="literal">NULL</code> on error</p>
-<p></p>
</div>
</div>
<hr>
@@ -913,7 +908,6 @@ nm_client_get_version (<em class="parameter"><code><a class="link" href="NMClien
<div class="refsect3">
<a name="id-1.3.2.9.6.6"></a><h4>Returns</h4>
<p> string with the version (or <code class="literal">NULL</code> if NetworkManager is not running)</p>
-<p></p>
</div>
</div>
<hr>
@@ -940,7 +934,6 @@ nm_client_get_state (<em class="parameter"><code><a class="link" href="NMClient.
<div class="refsect3">
<a name="id-1.3.2.9.7.6"></a><h4>Returns</h4>
<p> the current <a class="link" href="libnm-nm-dbus-interface.html#NMState" title="enum NMState"><code class="literal">NMState</code></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -968,7 +961,6 @@ connections at startup.</p>
<div class="refsect3">
<a name="id-1.3.2.9.8.6"></a><h4>Returns</h4>
<p> whether the daemon is still starting up</p>
-<p></p>
</div>
</div>
<hr>
@@ -995,7 +987,6 @@ nm_client_get_nm_running (<em class="parameter"><code><a class="link" href="NMCl
<div class="refsect3">
<a name="id-1.3.2.9.9.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the daemon is running</p>
-<p></p>
</div>
</div>
<hr>
@@ -1022,7 +1013,6 @@ nm_client_networking_get_enabled (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.3.2.9.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if networking is enabled, <code class="literal">FALSE</code> if networking is disabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1065,7 +1055,6 @@ all controlled interfaces are available for activation.</p>
<div class="refsect3">
<a name="id-1.3.2.9.11.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> otherwise</p>
-<p></p>
</div>
</div>
<hr>
@@ -1092,7 +1081,6 @@ nm_client_wireless_get_enabled (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.3.2.9.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if wireless is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1150,7 +1138,6 @@ nm_client_wireless_hardware_get_enabled
<div class="refsect3">
<a name="id-1.3.2.9.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the wireless hardware is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1177,7 +1164,6 @@ nm_client_wwan_get_enabled (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.3.2.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if WWAN is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1234,7 +1220,6 @@ nm_client_wwan_hardware_get_enabled (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.2.9.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the WWAN hardware is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1261,7 +1246,6 @@ nm_client_wimax_get_enabled (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.3.2.9.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if WiMAX is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1318,7 +1302,6 @@ nm_client_wimax_hardware_get_enabled (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.3.2.9.20.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the WiMAX hardware is enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -1366,7 +1349,6 @@ a list of domains separated by ",". </p></td>
<div class="refsect3">
<a name="id-1.3.2.9.21.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> otherwise</p>
-<p></p>
</div>
</div>
<hr>
@@ -1414,7 +1396,6 @@ domains separated by ",". (<code class="literal">NULL</code> or an empty string
<div class="refsect3">
<a name="id-1.3.2.9.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> otherwise</p>
-<p></p>
</div>
</div>
<hr>
@@ -1450,7 +1431,6 @@ client can or cannot perform the action the permission represents</p>
<div class="refsect3">
<a name="id-1.3.2.9.23.6"></a><h4>Returns</h4>
<p> the permission's result, one of <a class="link" href="NMClient.html#NMClientPermissionResult" title="enum NMClientPermissionResult"><span class="type">NMClientPermissionResult</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1480,7 +1460,6 @@ connectivity state first before returning any information.</p>
<div class="refsect3">
<a name="id-1.3.2.9.24.6"></a><h4>Returns</h4>
<p> the current connectivity state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1525,7 +1504,6 @@ if you do not want to block.</p>
<div class="refsect3">
<a name="id-1.3.2.9.25.7"></a><h4>Returns</h4>
<p> the (new) current connectivity state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1614,7 +1592,6 @@ call.</p>
<div class="refsect3">
<a name="id-1.3.2.9.27.6"></a><h4>Returns</h4>
<p> the (new) current connectivity state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1663,7 +1640,6 @@ clear any existing persistent hostname. </p></td>
<div class="refsect3">
<a name="id-1.3.2.9.28.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the request was successful, <code class="literal">FALSE</code> if it failed</p>
-<p></p>
</div>
</div>
<hr>
@@ -1755,7 +1731,6 @@ nm_client_save_hostname_finish (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.3.2.9.30.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the request was successful, <code class="literal">FALSE</code> if it failed</p>
-<p></p>
</div>
</div>
<hr>
@@ -2256,7 +2231,6 @@ nm_client_deactivate_connection (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.3.2.9.41.6"></a><h4>Returns</h4>
<p> success or failure</p>
-<p></p>
</div>
</div>
<hr>
@@ -2347,7 +2321,6 @@ nm_client_deactivate_connection_finish
<div class="refsect3">
<a name="id-1.3.2.9.43.6"></a><h4>Returns</h4>
<p> success or failure</p>
-<p></p>
</div>
</div>
<hr>
@@ -2668,7 +2641,6 @@ filenames that failed to load. </p></td>
<p> <code class="literal">TRUE</code> if NetworkManager at least tried to load <em class="parameter"><code>filenames</code></em>
,
<code class="literal">FALSE</code> if an error occurred (eg, permission denied).</p>
-<p></p>
</div>
</div>
<hr>
@@ -2770,7 +2742,6 @@ filenames that failed to load. </p></td>
<p> <code class="literal">TRUE</code> if NetworkManager at least tried to load <em class="parameter"><code>filenames</code></em>
,
<code class="literal">FALSE</code> if an error occurred (eg, permission denied).</p>
-<p></p>
</div>
</div>
<hr>
@@ -2813,7 +2784,6 @@ the in-memory state matches the on-disk state.</p>
<div class="refsect3">
<a name="id-1.3.2.9.53.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on failure</p>
-<p></p>
</div>
</div>
<hr>
@@ -2899,7 +2869,6 @@ nm_client_reload_connections_finish (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.2.9.55.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on failure</p>
-<p></p>
</div>
</div>
</div>
@@ -2909,192 +2878,144 @@ nm_client_reload_connections_finish (<em class="parameter"><code><a class="link"
<a name="NM-CLIENT-VERSION:CAPS"></a><h3>NM_CLIENT_VERSION</h3>
<pre class="programlisting">#define NM_CLIENT_VERSION "version"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-STATE:CAPS"></a><h3>NM_CLIENT_STATE</h3>
<pre class="programlisting">#define NM_CLIENT_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-STARTUP:CAPS"></a><h3>NM_CLIENT_STARTUP</h3>
<pre class="programlisting">#define NM_CLIENT_STARTUP "startup"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-NM-RUNNING:CAPS"></a><h3>NM_CLIENT_NM_RUNNING</h3>
<pre class="programlisting">#define NM_CLIENT_NM_RUNNING "nm-running"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-NETWORKING-ENABLED:CAPS"></a><h3>NM_CLIENT_NETWORKING_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_NETWORKING_ENABLED "networking-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIRELESS-ENABLED:CAPS"></a><h3>NM_CLIENT_WIRELESS_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIRELESS_ENABLED "wireless-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIRELESS-HARDWARE-ENABLED:CAPS"></a><h3>NM_CLIENT_WIRELESS_HARDWARE_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIRELESS_HARDWARE_ENABLED "wireless-hardware-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WWAN-ENABLED:CAPS"></a><h3>NM_CLIENT_WWAN_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WWAN_ENABLED "wwan-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WWAN-HARDWARE-ENABLED:CAPS"></a><h3>NM_CLIENT_WWAN_HARDWARE_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WWAN_HARDWARE_ENABLED "wwan-hardware-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIMAX-ENABLED:CAPS"></a><h3>NM_CLIENT_WIMAX_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIMAX_ENABLED "wimax-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-WIMAX-HARDWARE-ENABLED:CAPS"></a><h3>NM_CLIENT_WIMAX_HARDWARE_ENABLED</h3>
<pre class="programlisting">#define NM_CLIENT_WIMAX_HARDWARE_ENABLED "wimax-hardware-enabled"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-ACTIVE-CONNECTIONS:CAPS"></a><h3>NM_CLIENT_ACTIVE_CONNECTIONS</h3>
<pre class="programlisting">#define NM_CLIENT_ACTIVE_CONNECTIONS "active-connections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-CONNECTIVITY:CAPS"></a><h3>NM_CLIENT_CONNECTIVITY</h3>
<pre class="programlisting">#define NM_CLIENT_CONNECTIVITY "connectivity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-PRIMARY-CONNECTION:CAPS"></a><h3>NM_CLIENT_PRIMARY_CONNECTION</h3>
<pre class="programlisting">#define NM_CLIENT_PRIMARY_CONNECTION "primary-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-ACTIVATING-CONNECTION:CAPS"></a><h3>NM_CLIENT_ACTIVATING_CONNECTION</h3>
<pre class="programlisting">#define NM_CLIENT_ACTIVATING_CONNECTION "activating-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-DEVICES:CAPS"></a><h3>NM_CLIENT_DEVICES</h3>
<pre class="programlisting">#define NM_CLIENT_DEVICES "devices"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-CONNECTIONS:CAPS"></a><h3>NM_CLIENT_CONNECTIONS</h3>
<pre class="programlisting">#define NM_CLIENT_CONNECTIONS "connections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-HOSTNAME:CAPS"></a><h3>NM_CLIENT_HOSTNAME</h3>
<pre class="programlisting">#define NM_CLIENT_HOSTNAME "hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-CAN-MODIFY:CAPS"></a><h3>NM_CLIENT_CAN_MODIFY</h3>
<pre class="programlisting">#define NM_CLIENT_CAN_MODIFY "can-modify"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-DEVICE-ADDED:CAPS"></a><h3>NM_CLIENT_DEVICE_ADDED</h3>
<pre class="programlisting">#define NM_CLIENT_DEVICE_ADDED "device-added"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-DEVICE-REMOVED:CAPS"></a><h3>NM_CLIENT_DEVICE_REMOVED</h3>
<pre class="programlisting">#define NM_CLIENT_DEVICE_REMOVED "device-removed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-PERMISSION-CHANGED:CAPS"></a><h3>NM_CLIENT_PERMISSION_CHANGED</h3>
<pre class="programlisting">#define NM_CLIENT_PERMISSION_CHANGED "permission-changed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-CONNECTION-ADDED:CAPS"></a><h3>NM_CLIENT_CONNECTION_ADDED</h3>
<pre class="programlisting">#define NM_CLIENT_CONNECTION_ADDED "connection-added"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CLIENT-CONNECTION-REMOVED:CAPS"></a><h3>NM_CLIENT_CONNECTION_REMOVED</h3>
<pre class="programlisting">#define NM_CLIENT_CONNECTION_REMOVED "connection-removed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -3313,8 +3234,6 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<a name="NM-CLIENT-ERROR:CAPS"></a><h3>NM_CLIENT_ERROR</h3>
<pre class="programlisting">#define NM_CLIENT_ERROR nm_client_error_quark ()
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -3322,21 +3241,23 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--activating-connection"></a><h3>The <code class="literal">“activating-connection”</code> property</h3>
<pre class="programlisting"> “activating-connection” <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> of the activating connection that is
+likely to become the new <a class="link" href="NMClient.html#NMClient--primary-connection" title="The “primary-connection” property"><span class="type">“primary-connection”</span></a>.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--active-connections"></a><h3>The <code class="literal">“active-connections”</code> property</h3>
<pre class="programlisting"> “active-connections” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The active connections.</p>
+<p>Element-type: NMActiveConnection</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--can-modify"></a><h3>The <code class="literal">“can-modify”</code> property</h3>
<pre class="programlisting"> “can-modify” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, adding and modifying connections is supported.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -3344,14 +3265,18 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--connections"></a><h3>The <code class="literal">“connections”</code> property</h3>
<pre class="programlisting"> “connections” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The list of configured connections that are available to the user. (Note
+that this differs from the underlying D-Bus property, which may also
+contain the object paths of connections that the user does not have
+permission to read the details of.)</p>
+<p>Element-type: NMRemoteConnection</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--connectivity"></a><h3>The <code class="literal">“connectivity”</code> property</h3>
<pre class="programlisting"> “connectivity” <a class="link" href="libnm-nm-dbus-interface.html#NMConnectivityState" title="enum NMConnectivityState"><span class="type">NMConnectivityState</span></a></pre>
-<p></p>
+<p>The network connectivity state.</p>
<p>Flags: Read</p>
<p>Default value: NM_CONNECTIVITY_UNKNOWN</p>
</div>
@@ -3359,14 +3284,16 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--devices"></a><h3>The <code class="literal">“devices”</code> property</h3>
<pre class="programlisting"> “devices” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>List of known network devices.</p>
+<p>Element-type: NMDevice</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--hostname"></a><h3>The <code class="literal">“hostname”</code> property</h3>
<pre class="programlisting"> “hostname” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The machine hostname stored in persistent configuration. This can be
+modified by calling <a class="link" href="NMClient.html#nm-client-save-hostname" title="nm_client_save_hostname ()"><code class="function">nm_client_save_hostname()</code></a>.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -3374,7 +3301,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--networking-enabled"></a><h3>The <code class="literal">“networking-enabled”</code> property</h3>
<pre class="programlisting"> “networking-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether networking is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: TRUE</p>
</div>
@@ -3382,7 +3309,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--nm-running"></a><h3>The <code class="literal">“nm-running”</code> property</h3>
<pre class="programlisting"> “nm-running” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the daemon is running.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -3390,14 +3317,15 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--primary-connection"></a><h3>The <code class="literal">“primary-connection”</code> property</h3>
<pre class="programlisting"> “primary-connection” <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> of the device with the default route;
+see <a class="link" href="NMClient.html#nm-client-get-primary-connection" title="nm_client_get_primary_connection ()"><code class="function">nm_client_get_primary_connection()</code></a> for more details.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMClient--startup"></a><h3>The <code class="literal">“startup”</code> property</h3>
<pre class="programlisting"> “startup” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the daemon is still starting up.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -3405,7 +3333,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--state"></a><h3>The <code class="literal">“state”</code> property</h3>
<pre class="programlisting"> “state” <a class="link" href="libnm-nm-dbus-interface.html#NMState" title="enum NMState"><span class="type">NMState</span></a></pre>
-<p></p>
+<p>The current daemon state.</p>
<p>Flags: Read</p>
<p>Default value: NM_STATE_UNKNOWN</p>
</div>
@@ -3413,7 +3341,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--version"></a><h3>The <code class="literal">“version”</code> property</h3>
<pre class="programlisting"> “version” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The NetworkManager version.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -3421,7 +3349,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wimax-enabled"></a><h3>The <code class="literal">“wimax-enabled”</code> property</h3>
<pre class="programlisting"> “wimax-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether WiMAX functionality is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -3429,7 +3357,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wimax-hardware-enabled"></a><h3>The <code class="literal">“wimax-hardware-enabled”</code> property</h3>
<pre class="programlisting"> “wimax-hardware-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the WiMAX hardware is enabled.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -3437,7 +3365,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wireless-enabled"></a><h3>The <code class="literal">“wireless-enabled”</code> property</h3>
<pre class="programlisting"> “wireless-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether wireless is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -3445,7 +3373,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wireless-hardware-enabled"></a><h3>The <code class="literal">“wireless-hardware-enabled”</code> property</h3>
<pre class="programlisting"> “wireless-hardware-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the wireless hardware is enabled.</p>
<p>Flags: Read</p>
<p>Default value: TRUE</p>
</div>
@@ -3453,7 +3381,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wwan-enabled"></a><h3>The <code class="literal">“wwan-enabled”</code> property</h3>
<pre class="programlisting"> “wwan-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether WWAN functionality is enabled.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -3461,7 +3389,7 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
<div class="refsect2">
<a name="NMClient--wwan-hardware-enabled"></a><h3>The <code class="literal">“wwan-hardware-enabled”</code> property</h3>
<pre class="programlisting"> “wwan-hardware-enabled” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the WWAN hardware is enabled.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -3474,6 +3402,34 @@ the user requires to obtain a given <a class="link" href="NMClient.html#NMClient
user_function (<a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> *client,
<a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> *connection,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> has been added.</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the settings object that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>connection</p></td>
+<td class="parameter_description"><p>the new connection</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -3483,6 +3439,34 @@ user_function (<a class="link" href="NMClient.html" title="NMClient"><span class
user_function (<a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> *client,
<a class="link" href="NMRemoteConnection.html" title="NMRemoteConnection"><span class="type">NMRemoteConnection</span></a> *connection,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> has been removed.</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the settings object that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>connection</p></td>
+<td class="parameter_description"><p>the removed connection</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -3492,6 +3476,34 @@ user_function (<a class="link" href="NMClient.html" title="NMClient"><span class
user_function (<a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> *client,
<span class="type">GObject</span> *device,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> is added.</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.4.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the client that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p> the new device. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Override the parsed C type with given type."><span class="acronym">type</span></acronym> NMDevice]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -3501,6 +3513,34 @@ user_function (<a class="link" href="NMClient.html" title="NMClient"><span class
user_function (<a class="link" href="NMClient.html" title="NMClient"><span class="type">NMClient</span></a> *client,
<span class="type">GObject</span> *device,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> is removed.</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.5.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the client that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p> the removed device. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Override the parsed C type with given type."><span class="acronym">type</span></acronym> NMDevice]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -3511,12 +3551,44 @@ user_function (<a class="link" href="NMClient.html" title="NMClient"><span class
<span class="type">guint</span> permission,
<span class="type">guint</span> result,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a permission has changed</p>
+<div class="refsect3">
+<a name="id-1.3.2.12.6.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>client</p></td>
+<td class="parameter_description"><p>the client that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>permission</p></td>
+<td class="parameter_description"><p>a permission from <a class="link" href="NMClient.html#NMClientPermission" title="enum NMClientPermission"><span class="type">NMClientPermission</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>result</p></td>
+<td class="parameter_description"><p>the permission's result, one of <a class="link" href="NMClient.html#NMClientPermissionResult" title="enum NMClientPermissionResult"><span class="type">NMClientPermissionResult</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDevice.html b/docs/libnm/html/NMDevice.html
index 13cae2dba..8065247c7 100644
--- a/docs/libnm/html/NMDevice.html
+++ b/docs/libnm/html/NMDevice.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDevice</title>
+<title>NMDevice: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="next" href="NMDeviceAdsl.html" title="NMDeviceAdsl">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -626,8 +626,6 @@
</div>
<div class="refsect1">
<a name="NMDevice.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDevice.functions_details"></a><h2>Functions</h2>
@@ -655,7 +653,6 @@ nm_device_get_iface (<em class="parameter"><code><a class="link" href="NMDevice.
<a name="id-1.5.2.9.2.6"></a><h4>Returns</h4>
<p> the interface of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -684,7 +681,6 @@ when the device is in the ACTIVATED state.</p>
<a name="id-1.5.2.9.3.6"></a><h4>Returns</h4>
<p> the IP traffic interface of the device. This is the internal string
used by the device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -711,7 +707,6 @@ nm_device_get_device_type (<em class="parameter"><code><a class="link" href="NMD
<div class="refsect3">
<a name="id-1.5.2.9.4.6"></a><h4>Returns</h4>
<p> the device type</p>
-<p></p>
</div>
</div>
<hr>
@@ -740,7 +735,6 @@ nm_device_get_udi (<em class="parameter"><code><a class="link" href="NMDevice.ht
<p> the Unique Device Identifier of the device. This identifier may be
used to gather more information about the device from various operating
system services like udev or sysfs.</p>
-<p></p>
</div>
</div>
<hr>
@@ -768,7 +762,6 @@ nm_device_get_driver (<em class="parameter"><code><a class="link" href="NMDevice
<a name="id-1.5.2.9.6.6"></a><h4>Returns</h4>
<p> the driver of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -796,7 +789,6 @@ nm_device_get_driver_version (<em class="parameter"><code><a class="link" href="
<a name="id-1.5.2.9.7.6"></a><h4>Returns</h4>
<p> the version of the device driver. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -824,7 +816,6 @@ nm_device_get_firmware_version (<em class="parameter"><code><a class="link" href
<a name="id-1.5.2.9.8.6"></a><h4>Returns</h4>
<p> the firmware version of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -854,7 +845,6 @@ nm_device_get_type_description (<em class="parameter"><code><a class="link" href
<a name="id-1.5.2.9.9.6"></a><h4>Returns</h4>
<p> the type description of the device. This is the internal
string used by the device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -883,7 +873,6 @@ nm_device_get_hw_address (<em class="parameter"><code><a class="link" href="NMDe
<a name="id-1.5.2.9.10.6"></a><h4>Returns</h4>
<p> the current MAC of the device, or <code class="literal">NULL</code>.
This is the internal string used by the device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -910,7 +899,6 @@ nm_device_get_capabilities (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.2.9.11.6"></a><h4>Returns</h4>
<p> the capabilities</p>
-<p></p>
</div>
</div>
<hr>
@@ -937,7 +925,6 @@ nm_device_get_managed (<em class="parameter"><code><a class="link" href="NMDevic
<div class="refsect3">
<a name="id-1.5.2.9.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device is managed by NetworkManager</p>
-<p></p>
</div>
</div>
<hr>
@@ -964,7 +951,6 @@ nm_device_get_autoconnect (<em class="parameter"><code><a class="link" href="NMD
<div class="refsect3">
<a name="id-1.5.2.9.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device is allowed to be autoconnected</p>
-<p></p>
</div>
</div>
<hr>
@@ -1023,7 +1009,6 @@ to be missing.</p>
<a name="id-1.5.2.9.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if firmware required for the device's operation is likely
to be missing.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1169,7 +1154,6 @@ nm_device_get_state (<em class="parameter"><code><a class="link" href="NMDevice.
<div class="refsect3">
<a name="id-1.5.2.9.20.6"></a><h4>Returns</h4>
<p> the current device state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1196,7 +1180,6 @@ nm_device_get_state_reason (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.2.9.21.6"></a><h4>Returns</h4>
<p> the reason for entering the current device state</p>
-<p></p>
</div>
</div>
<hr>
@@ -1287,7 +1270,6 @@ ports on a single physical port. (Eg, NPAR / SR-IOV.)</p>
<p> the physical port ID of the device, or <code class="literal">NULL</code> if the port
ID is unknown. This is the internal string used by the device and
must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1314,7 +1296,6 @@ nm_device_get_mtu (<em class="parameter"><code><a class="link" href="NMDevice.ht
<div class="refsect3">
<a name="id-1.5.2.9.25.6"></a><h4>Returns</h4>
<p> the MTU of the device.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1342,7 +1323,6 @@ nm_device_is_software (<em class="parameter"><code><a class="link" href="NMDevic
<a name="id-1.5.2.9.26.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>device</code></em>
is a software device, <code class="literal">FALSE</code> if it is a hardware device.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1370,7 +1350,6 @@ nm_device_get_product (<em class="parameter"><code><a class="link" href="NMDevic
<a name="id-1.5.2.9.27.6"></a><h4>Returns</h4>
<p> the product name of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1398,7 +1377,6 @@ nm_device_get_vendor (<em class="parameter"><code><a class="link" href="NMDevice
<a name="id-1.5.2.9.28.6"></a><h4>Returns</h4>
<p> the vendor name of the device. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1428,7 +1406,6 @@ nm_device_get_description (<em class="parameter"><code><a class="link" href="NMD
<p> a description of <em class="parameter"><code>device</code></em>
. If either the vendor or the
product name is unknown, this returns the interface name.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1510,7 +1487,6 @@ request.</p>
<a name="id-1.5.2.9.31.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1597,7 +1573,6 @@ nm_device_disconnect_finish (<em class="parameter"><code><a class="link" href="N
<a name="id-1.5.2.9.33.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1639,7 +1614,6 @@ nm_device_delete (<em class="parameter"><code><a class="link" href="NMDevice.htm
<a name="id-1.5.2.9.34.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1725,7 +1699,6 @@ nm_device_delete_finish (<em class="parameter"><code><a class="link" href="NMDev
<a name="id-1.5.2.9.36.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1817,7 +1790,6 @@ against</p></td>
<a name="id-1.5.2.9.38.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this device, <code class="literal">FALSE</code>
if is incompatible with the device's capabilities and characteristics.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1871,7 +1843,6 @@ against</p></td>
<a name="id-1.5.2.9.39.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this device, <code class="literal">FALSE</code>
if is incompatible with the device's capabilities and characteristics.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1901,7 +1872,6 @@ that can be used on <em class="parameter"><code>device</code></em>
<a name="id-1.5.2.9.40.6"></a><h4>Returns</h4>
<p> <em class="parameter"><code>device</code></em>
's associated <a class="link" href="NMSetting.html" title="NMSetting"><span class="type">NMSetting</span></a> type</p>
-<p></p>
</div>
</div>
</div>
@@ -1911,184 +1881,138 @@ that can be used on <em class="parameter"><code>device</code></em>
<a name="NM-DEVICE-DEVICE-TYPE:CAPS"></a><h3>NM_DEVICE_DEVICE_TYPE</h3>
<pre class="programlisting">#define NM_DEVICE_DEVICE_TYPE "device-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-UDI:CAPS"></a><h3>NM_DEVICE_UDI</h3>
<pre class="programlisting">#define NM_DEVICE_UDI "udi"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-INTERFACE:CAPS"></a><h3>NM_DEVICE_INTERFACE</h3>
<pre class="programlisting">#define NM_DEVICE_INTERFACE "interface"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-IP-INTERFACE:CAPS"></a><h3>NM_DEVICE_IP_INTERFACE</h3>
<pre class="programlisting">#define NM_DEVICE_IP_INTERFACE "ip-interface"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DRIVER:CAPS"></a><h3>NM_DEVICE_DRIVER</h3>
<pre class="programlisting">#define NM_DEVICE_DRIVER "driver"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DRIVER-VERSION:CAPS"></a><h3>NM_DEVICE_DRIVER_VERSION</h3>
<pre class="programlisting">#define NM_DEVICE_DRIVER_VERSION "driver-version"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-FIRMWARE-VERSION:CAPS"></a><h3>NM_DEVICE_FIRMWARE_VERSION</h3>
<pre class="programlisting">#define NM_DEVICE_FIRMWARE_VERSION "firmware-version"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_CAPABILITIES "capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MANAGED:CAPS"></a><h3>NM_DEVICE_MANAGED</h3>
<pre class="programlisting">#define NM_DEVICE_MANAGED "managed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-AUTOCONNECT:CAPS"></a><h3>NM_DEVICE_AUTOCONNECT</h3>
<pre class="programlisting">#define NM_DEVICE_AUTOCONNECT "autoconnect"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-FIRMWARE-MISSING:CAPS"></a><h3>NM_DEVICE_FIRMWARE_MISSING</h3>
<pre class="programlisting">#define NM_DEVICE_FIRMWARE_MISSING "firmware-missing"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-IP4-CONFIG:CAPS"></a><h3>NM_DEVICE_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_IP4_CONFIG "ip4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DHCP4-CONFIG:CAPS"></a><h3>NM_DEVICE_DHCP4_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_DHCP4_CONFIG "dhcp4-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-IP6-CONFIG:CAPS"></a><h3>NM_DEVICE_IP6_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_IP6_CONFIG "ip6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-DHCP6-CONFIG:CAPS"></a><h3>NM_DEVICE_DHCP6_CONFIG</h3>
<pre class="programlisting">#define NM_DEVICE_DHCP6_CONFIG "dhcp6-config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-STATE:CAPS"></a><h3>NM_DEVICE_STATE</h3>
<pre class="programlisting">#define NM_DEVICE_STATE "state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-STATE-REASON:CAPS"></a><h3>NM_DEVICE_STATE_REASON</h3>
<pre class="programlisting">#define NM_DEVICE_STATE_REASON "state-reason"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ACTIVE-CONNECTION:CAPS"></a><h3>NM_DEVICE_ACTIVE_CONNECTION</h3>
<pre class="programlisting">#define NM_DEVICE_ACTIVE_CONNECTION "active-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-AVAILABLE-CONNECTIONS:CAPS"></a><h3>NM_DEVICE_AVAILABLE_CONNECTIONS</h3>
<pre class="programlisting">#define NM_DEVICE_AVAILABLE_CONNECTIONS "available-connections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VENDOR:CAPS"></a><h3>NM_DEVICE_VENDOR</h3>
<pre class="programlisting">#define NM_DEVICE_VENDOR "vendor"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-PRODUCT:CAPS"></a><h3>NM_DEVICE_PRODUCT</h3>
<pre class="programlisting">#define NM_DEVICE_PRODUCT "product"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-PHYSICAL-PORT-ID:CAPS"></a><h3>NM_DEVICE_PHYSICAL_PORT_ID</h3>
<pre class="programlisting">#define NM_DEVICE_PHYSICAL_PORT_ID "physical-port-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MTU:CAPS"></a><h3>NM_DEVICE_MTU</h3>
<pre class="programlisting">#define NM_DEVICE_MTU "mtu"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -2096,14 +2020,14 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--active-connection"></a><h3>The <code class="literal">“active-connection”</code> property</h3>
<pre class="programlisting"> “active-connection” <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> *</pre>
-<p></p>
+<p>The <a class="link" href="NMActiveConnection.html" title="NMActiveConnection"><span class="type">NMActiveConnection</span></a> object that "owns" this device during activation.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--autoconnect"></a><h3>The <code class="literal">“autoconnect”</code> property</h3>
<pre class="programlisting"> “autoconnect” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device can auto-activate a connection.</p>
<p>Flags: Read / Write</p>
<p>Default value: TRUE</p>
</div>
@@ -2111,21 +2035,22 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--available-connections"></a><h3>The <code class="literal">“available-connections”</code> property</h3>
<pre class="programlisting"> “available-connections” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The available connections of the device</p>
+<p>Element-type: NMRemoteConnection</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--capabilities"></a><h3>The <code class="literal">“capabilities”</code> property</h3>
<pre class="programlisting"> “capabilities” <a class="link" href="libnm-nm-dbus-interface.html#NMDeviceCapabilities" title="enum NMDeviceCapabilities"><span class="type">NMDeviceCapabilities</span></a></pre>
-<p></p>
+<p>The capabilities of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--device-type"></a><h3>The <code class="literal">“device-type”</code> property</h3>
<pre class="programlisting"> “device-type” <a class="link" href="libnm-nm-dbus-interface.html#NMDeviceType" title="enum NMDeviceType"><span class="type">NMDeviceType</span></a></pre>
-<p></p>
+<p>The numeric type of the device.</p>
<p>Flags: Read</p>
<p>Default value: NM_DEVICE_TYPE_UNKNOWN</p>
</div>
@@ -2133,21 +2058,21 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--dhcp4-config"></a><h3>The <code class="literal">“dhcp4-config”</code> property</h3>
<pre class="programlisting"> “dhcp4-config” <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> *</pre>
-<p></p>
+<p>The IPv4 <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--dhcp6-config"></a><h3>The <code class="literal">“dhcp6-config”</code> property</h3>
<pre class="programlisting"> “dhcp6-config” <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> *</pre>
-<p></p>
+<p>The IPv6 <a class="link" href="NMDhcpConfig.html" title="NMDhcpConfig"><span class="type">NMDhcpConfig</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--driver"></a><h3>The <code class="literal">“driver”</code> property</h3>
<pre class="programlisting"> “driver” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The driver of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2155,7 +2080,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--driver-version"></a><h3>The <code class="literal">“driver-version”</code> property</h3>
<pre class="programlisting"> “driver-version” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The version of the device driver.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2163,7 +2088,8 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--firmware-missing"></a><h3>The <code class="literal">“firmware-missing”</code> property</h3>
<pre class="programlisting"> “firmware-missing” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <code class="literal">TRUE</code> indicates the device is likely missing firmware required
+for its operation.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2171,7 +2097,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--firmware-version"></a><h3>The <code class="literal">“firmware-version”</code> property</h3>
<pre class="programlisting"> “firmware-version” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The firmware version of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2179,7 +2105,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--interface"></a><h3>The <code class="literal">“interface”</code> property</h3>
<pre class="programlisting"> “interface” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The interface of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2187,7 +2113,8 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--ip-interface"></a><h3>The <code class="literal">“ip-interface”</code> property</h3>
<pre class="programlisting"> “ip-interface” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IP interface of the device which should be used for all IP-related
+operations like addressing and routing.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2195,21 +2122,21 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--ip4-config"></a><h3>The <code class="literal">“ip4-config”</code> property</h3>
<pre class="programlisting"> “ip4-config” <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> *</pre>
-<p></p>
+<p>The <a href="https://developer.gnome.org/libnm-glib/0.9/NMIP4Config.html"><span class="type">NMIP4Config</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--ip6-config"></a><h3>The <code class="literal">“ip6-config”</code> property</h3>
<pre class="programlisting"> “ip6-config” <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> *</pre>
-<p></p>
+<p>The IPv6 <a class="link" href="NMIPConfig.html" title="NMIPConfig"><span class="type">NMIPConfig</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDevice--managed"></a><h3>The <code class="literal">“managed”</code> property</h3>
<pre class="programlisting"> “managed” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device is managed by NetworkManager.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -2217,7 +2144,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>The MTU of the device.</p>
<p>Flags: Read</p>
<p>Default value: 1500</p>
</div>
@@ -2225,7 +2152,8 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--physical-port-id"></a><h3>The <code class="literal">“physical-port-id”</code> property</h3>
<pre class="programlisting"> “physical-port-id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The physical port ID of the device. (See
+<a class="link" href="NMDevice.html#nm-device-get-physical-port-id" title="nm_device_get_physical_port_id ()"><code class="function">nm_device_get_physical_port_id()</code></a>.)</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2233,7 +2161,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--product"></a><h3>The <code class="literal">“product”</code> property</h3>
<pre class="programlisting"> “product” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The product string of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2241,7 +2169,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--state"></a><h3>The <code class="literal">“state”</code> property</h3>
<pre class="programlisting"> “state” <a class="link" href="libnm-nm-dbus-interface.html#NMDeviceState" title="enum NMDeviceState"><span class="type">NMDeviceState</span></a></pre>
-<p></p>
+<p>The state of the device.</p>
<p>Flags: Read</p>
<p>Default value: NM_DEVICE_STATE_UNKNOWN</p>
</div>
@@ -2249,7 +2177,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--state-reason"></a><h3>The <code class="literal">“state-reason”</code> property</h3>
<pre class="programlisting"> “state-reason” <span class="type">guint</span></pre>
-<p></p>
+<p>The reason for the device state.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -2257,7 +2185,12 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--udi"></a><h3>The <code class="literal">“udi”</code> property</h3>
<pre class="programlisting"> “udi” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>An operating-system specific device hardware identifier; this is not
+unique to a specific hardware device across reboots or hotplugs. It
+is an opaque string which for some device types (Bluetooth, Modem)
+contains an identifier provided by the underlying hardware service daemon
+such as Bluez or ModemManager, and clients can use this property to
+request more information about the device from those services.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2265,7 +2198,7 @@ that can be used on <em class="parameter"><code>device</code></em>
<div class="refsect2">
<a name="NMDevice--vendor"></a><h3>The <code class="literal">“vendor”</code> property</h3>
<pre class="programlisting"> “vendor” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The vendor string of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -2280,12 +2213,49 @@ user_function (<a class="link" href="NMDevice.html" title="NMDevice"><span class
<span class="type">guint</span> old_state,
<span class="type">guint</span> reason,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies the state change of a <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a>.</p>
+<div class="refsect3">
+<a name="id-1.5.2.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p>the device object that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>new_state</p></td>
+<td class="parameter_description"><p>the new state of the device</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>old_state</p></td>
+<td class="parameter_description"><p>the previous state of the device</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>reason</p></td>
+<td class="parameter_description"><p>the reason describing the state change</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceAdsl.html b/docs/libnm/html/NMDeviceAdsl.html
index 168d4ad8a..7c9c5612c 100644
--- a/docs/libnm/html/NMDeviceAdsl.html
+++ b/docs/libnm/html/NMDeviceAdsl.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceAdsl</title>
+<title>NMDeviceAdsl: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDevice.html" title="NMDevice">
<link rel="next" href="NMDeviceBond.html" title="NMDeviceBond">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -88,8 +88,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceAdsl.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceAdsl.functions_details"></a><h2>Functions</h2>
@@ -116,7 +114,6 @@ nm_device_adsl_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.3.8.2.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
</div>
@@ -126,8 +123,6 @@ nm_device_adsl_get_carrier (<em class="parameter"><code><a class="link" href="NM
<a name="NM-DEVICE-ADSL-CARRIER:CAPS"></a><h3>NM_DEVICE_ADSL_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_ADSL_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -135,14 +130,13 @@ nm_device_adsl_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceAdsl--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceBond.html b/docs/libnm/html/NMDeviceBond.html
index 03023581a..b99d8ba3d 100644
--- a/docs/libnm/html/NMDeviceBond.html
+++ b/docs/libnm/html/NMDeviceBond.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceBond</title>
+<title>NMDeviceBond: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceAdsl.html" title="NMDeviceAdsl">
<link rel="next" href="NMDeviceBridge.html" title="NMDeviceBridge">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -128,8 +128,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceBond.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceBond.functions_details"></a><h2>Functions</h2>
@@ -157,7 +155,6 @@ nm_device_bond_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.5.4.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -184,7 +181,6 @@ nm_device_bond_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.4.8.3.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
<hr>
@@ -225,24 +221,18 @@ copy used by the device, and must not be modified. </p>
<a name="NM-DEVICE-BOND-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_BOND_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BOND-CARRIER:CAPS"></a><h3>NM_DEVICE_BOND_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BOND-SLAVES:CAPS"></a><h3>NM_DEVICE_BOND_SLAVES</h3>
<pre class="programlisting">#define NM_DEVICE_BOND_SLAVES "slaves"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -250,7 +240,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBond--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -258,7 +248,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBond--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -266,13 +256,13 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBond--slaves"></a><h3>The <code class="literal">“slaves”</code> property</h3>
<pre class="programlisting"> “slaves” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The devices slaved to the bond device.</p>
+<p>Element-type: NMDevice</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceBridge.html b/docs/libnm/html/NMDeviceBridge.html
index 6fd332de9..dee83c758 100644
--- a/docs/libnm/html/NMDeviceBridge.html
+++ b/docs/libnm/html/NMDeviceBridge.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceBridge</title>
+<title>NMDeviceBridge: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceBond.html" title="NMDeviceBond">
<link rel="next" href="NMDeviceBt.html" title="NMDeviceBt">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -128,8 +128,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceBridge.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceBridge.functions_details"></a><h2>Functions</h2>
@@ -157,7 +155,6 @@ nm_device_bridge_get_hw_address (<em class="parameter"><code><a class="link" hre
<a name="id-1.5.5.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -184,7 +181,6 @@ nm_device_bridge_get_carrier (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.5.5.8.3.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
<hr>
@@ -225,24 +221,18 @@ copy used by the device, and must not be modified. </p>
<a name="NM-DEVICE-BRIDGE-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_BRIDGE_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BRIDGE-CARRIER:CAPS"></a><h3>NM_DEVICE_BRIDGE_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BRIDGE-SLAVES:CAPS"></a><h3>NM_DEVICE_BRIDGE_SLAVES</h3>
<pre class="programlisting">#define NM_DEVICE_BRIDGE_SLAVES "slaves"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -250,7 +240,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBridge--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -258,7 +248,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBridge--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -266,13 +256,13 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceBridge--slaves"></a><h3>The <code class="literal">“slaves”</code> property</h3>
<pre class="programlisting"> “slaves” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The devices slaved to the bridge device.</p>
+<p>Element-type: NMDevice</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceBt.html b/docs/libnm/html/NMDeviceBt.html
index 8aad8df81..b8cb2689f 100644
--- a/docs/libnm/html/NMDeviceBt.html
+++ b/docs/libnm/html/NMDeviceBt.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceBt</title>
+<title>NMDeviceBt: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceBridge.html" title="NMDeviceBridge">
<link rel="next" href="NMDeviceEthernet.html" title="NMDeviceEthernet">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -128,8 +128,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceBt.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceBt.functions_details"></a><h2>Functions</h2>
@@ -157,7 +155,6 @@ nm_device_bt_get_hw_address (<em class="parameter"><code><a class="link" href="N
<a name="id-1.5.6.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -184,7 +181,6 @@ nm_device_bt_get_name (<em class="parameter"><code><a class="link" href="NMDevic
<div class="refsect3">
<a name="id-1.5.6.8.3.6"></a><h4>Returns</h4>
<p> the name of the device</p>
-<p></p>
</div>
</div>
<hr>
@@ -211,7 +207,6 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.5.6.8.4.6"></a><h4>Returns</h4>
<p> a combination of <a class="link" href="libnm-nm-dbus-interface.html#NMBluetoothCapabilities" title="enum NMBluetoothCapabilities"><span class="type">NMBluetoothCapabilities</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -221,24 +216,18 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<a name="NM-DEVICE-BT-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_BT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_BT_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BT-NAME:CAPS"></a><h3>NM_DEVICE_BT_NAME</h3>
<pre class="programlisting">#define NM_DEVICE_BT_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-BT-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_BT_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_BT_CAPABILITIES "bt-capabilities"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -246,14 +235,14 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMDeviceBt--bt-capabilities"></a><h3>The <code class="literal">“bt-capabilities”</code> property</h3>
<pre class="programlisting"> “bt-capabilities” <a class="link" href="libnm-nm-dbus-interface.html#NMBluetoothCapabilities" title="enum NMBluetoothCapabilities"><span class="type">NMBluetoothCapabilities</span></a></pre>
-<p></p>
+<p>The device's bluetooth capabilities, a combination of <a class="link" href="libnm-nm-dbus-interface.html#NMBluetoothCapabilities" title="enum NMBluetoothCapabilities"><span class="type">NMBluetoothCapabilities</span></a>.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceBt--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -261,14 +250,13 @@ nm_device_bt_get_capabilities (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMDeviceBt--name"></a><h3>The <code class="literal">“name”</code> property</h3>
<pre class="programlisting"> “name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the bluetooth device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceEthernet.html b/docs/libnm/html/NMDeviceEthernet.html
index 2beee10d5..04e68bda8 100644
--- a/docs/libnm/html/NMDeviceEthernet.html
+++ b/docs/libnm/html/NMDeviceEthernet.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceEthernet</title>
+<title>NMDeviceEthernet: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceBt.html" title="NMDeviceBt">
<link rel="next" href="NMDeviceGeneric.html" title="NMDeviceGeneric">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -145,8 +145,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceEthernet.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceEthernet.functions_details"></a><h2>Functions</h2>
@@ -174,7 +172,6 @@ nm_device_ethernet_get_hw_address (<em class="parameter"><code><a class="link" h
<a name="id-1.5.7.8.2.6"></a><h4>Returns</h4>
<p> the active hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -203,7 +200,6 @@ nm_device_ethernet_get_permanent_hw_address
<a name="id-1.5.7.8.3.6"></a><h4>Returns</h4>
<p> the permanent hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -230,7 +226,6 @@ nm_device_ethernet_get_speed (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.5.7.8.4.6"></a><h4>Returns</h4>
<p> the speed of the device</p>
-<p></p>
</div>
</div>
<hr>
@@ -257,7 +252,6 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.5.7.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
</div>
@@ -267,32 +261,24 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<a name="NM-DEVICE-ETHERNET-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_ETHERNET_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-PERMANENT-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS "perm-hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-SPEED:CAPS"></a><h3>NM_DEVICE_ETHERNET_SPEED</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_SPEED "speed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-ETHERNET-CARRIER:CAPS"></a><h3>NM_DEVICE_ETHERNET_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_ETHERNET_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -300,7 +286,7 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -308,7 +294,7 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The active hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -316,7 +302,7 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--perm-hw-address"></a><h3>The <code class="literal">“perm-hw-address”</code> property</h3>
<pre class="programlisting"> “perm-hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The permanent hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -324,14 +310,13 @@ nm_device_ethernet_get_carrier (<em class="parameter"><code><a class="link" href
<div class="refsect2">
<a name="NMDeviceEthernet--speed"></a><h3>The <code class="literal">“speed”</code> property</h3>
<pre class="programlisting"> “speed” <span class="type">guint</span></pre>
-<p></p>
+<p>The speed of the device.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceGeneric.html b/docs/libnm/html/NMDeviceGeneric.html
index 28a8bb866..8144c52fd 100644
--- a/docs/libnm/html/NMDeviceGeneric.html
+++ b/docs/libnm/html/NMDeviceGeneric.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceGeneric</title>
+<title>NMDeviceGeneric: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceEthernet.html" title="NMDeviceEthernet">
<link rel="next" href="NMDeviceInfiniband.html" title="NMDeviceInfiniband">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -102,8 +102,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceGeneric.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceGeneric.functions_details"></a><h2>Functions</h2>
@@ -131,7 +129,6 @@ nm_device_generic_get_hw_address (<em class="parameter"><code><a class="link" hr
<a name="id-1.5.8.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -141,16 +138,12 @@ device, and must not be modified.</p>
<a name="NM-DEVICE-GENERIC-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_GENERIC_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_GENERIC_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-GENERIC-TYPE-DESCRIPTION:CAPS"></a><h3>NM_DEVICE_GENERIC_TYPE_DESCRIPTION</h3>
<pre class="programlisting">#define NM_DEVICE_GENERIC_TYPE_DESCRIPTION "type-description"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -158,7 +151,7 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMDeviceGeneric--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -166,14 +159,14 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMDeviceGeneric--type-description"></a><h3>The <code class="literal">“type-description”</code> property</h3>
<pre class="programlisting"> “type-description” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>A description of the specific type of device this is, or <code class="literal">NULL</code>
+if not known.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceInfiniband.html b/docs/libnm/html/NMDeviceInfiniband.html
index 607839447..310d85500 100644
--- a/docs/libnm/html/NMDeviceInfiniband.html
+++ b/docs/libnm/html/NMDeviceInfiniband.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceInfiniband</title>
+<title>NMDeviceInfiniband: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceGeneric.html" title="NMDeviceGeneric">
<link rel="next" href="NMDeviceModem.html" title="NMDeviceModem">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -111,8 +111,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceInfiniband.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceInfiniband.functions_details"></a><h2>Functions</h2>
@@ -140,7 +138,6 @@ nm_device_infiniband_get_hw_address (<em class="parameter"><code><a class="link"
<a name="id-1.5.9.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -167,7 +164,6 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.5.9.8.3.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
</div>
@@ -177,16 +173,12 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<a name="NM-DEVICE-INFINIBAND-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_INFINIBAND_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_INFINIBAND_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-INFINIBAND-CARRIER:CAPS"></a><h3>NM_DEVICE_INFINIBAND_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_INFINIBAND_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -194,7 +186,7 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMDeviceInfiniband--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -202,14 +194,13 @@ nm_device_infiniband_get_carrier (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMDeviceInfiniband--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceModem.html b/docs/libnm/html/NMDeviceModem.html
index 49cd12df2..63f1dbf6e 100644
--- a/docs/libnm/html/NMDeviceModem.html
+++ b/docs/libnm/html/NMDeviceModem.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceModem</title>
+<title>NMDeviceModem: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceInfiniband.html" title="NMDeviceInfiniband">
<link rel="next" href="NMDeviceOlpcMesh.html" title="NMDeviceOlpcMesh">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -111,8 +111,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceModem.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceModem.functions_details"></a><h2>Functions</h2>
@@ -142,7 +140,6 @@ may require a firmware reload or reinitialization.</p>
<div class="refsect3">
<a name="id-1.5.10.8.2.6"></a><h4>Returns</h4>
<p> the generic access technology families the modem supports</p>
-<p></p>
</div>
</div>
<hr>
@@ -173,7 +170,6 @@ represents the network types the modem can immediately connect to.</p>
<a name="id-1.5.10.8.3.6"></a><h4>Returns</h4>
<p> the generic access technology families the modem supports without
a firmware reload or other reinitialization</p>
-<p></p>
</div>
</div>
</div>
@@ -183,16 +179,12 @@ a firmware reload or other reinitialization</p>
<a name="NM-DEVICE-MODEM-MODEM-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_MODEM_MODEM_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_MODEM_MODEM_CAPABILITIES "modem-capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-MODEM-CURRENT-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_MODEM_CURRENT_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_MODEM_CURRENT_CAPABILITIES "current-capabilities"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -200,20 +192,23 @@ a firmware reload or other reinitialization</p>
<div class="refsect2">
<a name="NMDeviceModem--current-capabilities"></a><h3>The <code class="literal">“current-capabilities”</code> property</h3>
<pre class="programlisting"> “current-capabilities” <a class="link" href="libnm-nm-dbus-interface.html#NMDeviceModemCapabilities" title="enum NMDeviceModemCapabilities"><span class="type">NMDeviceModemCapabilities</span></a></pre>
-<p></p>
+<p>The generic family of access technologies the modem currently supports
+without a firmware reload or reinitialization.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceModem--modem-capabilities"></a><h3>The <code class="literal">“modem-capabilities”</code> property</h3>
<pre class="programlisting"> “modem-capabilities” <a class="link" href="libnm-nm-dbus-interface.html#NMDeviceModemCapabilities" title="enum NMDeviceModemCapabilities"><span class="type">NMDeviceModemCapabilities</span></a></pre>
-<p></p>
+<p>The generic family of access technologies the modem supports. Not all
+capabilities are available at the same time however; some modems require
+a firmware reload or other reinitialization to switch between eg
+CDMA/EVDO and GSM/UMTS.</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceOlpcMesh.html b/docs/libnm/html/NMDeviceOlpcMesh.html
index 0bdbf9aae..1e4e036af 100644
--- a/docs/libnm/html/NMDeviceOlpcMesh.html
+++ b/docs/libnm/html/NMDeviceOlpcMesh.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceOlpcMesh</title>
+<title>NMDeviceOlpcMesh: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceModem.html" title="NMDeviceModem">
<link rel="next" href="NMDeviceTeam.html" title="NMDeviceTeam">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -129,8 +129,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceOlpcMesh.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceOlpcMesh.functions_details"></a><h2>Functions</h2>
@@ -158,7 +156,6 @@ nm_device_olpc_mesh_get_hw_address (<em class="parameter"><code><a class="link"
<a name="id-1.5.11.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -213,7 +210,6 @@ nm_device_olpc_mesh_get_active_channel
<div class="refsect3">
<a name="id-1.5.11.8.4.6"></a><h4>Returns</h4>
<p> active channel of the device</p>
-<p></p>
</div>
</div>
</div>
@@ -223,24 +219,18 @@ nm_device_olpc_mesh_get_active_channel
<a name="NM-DEVICE-OLPC-MESH-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-OLPC-MESH-COMPANION:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_COMPANION</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_COMPANION "companion"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-OLPC-MESH-ACTIVE-CHANNEL:CAPS"></a><h3>NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL</h3>
<pre class="programlisting">#define NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL "active-channel"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -248,7 +238,7 @@ nm_device_olpc_mesh_get_active_channel
<div class="refsect2">
<a name="NMDeviceOlpcMesh--active-channel"></a><h3>The <code class="literal">“active-channel”</code> property</h3>
<pre class="programlisting"> “active-channel” <span class="type">guint</span></pre>
-<p></p>
+<p>The device's active channel.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -256,21 +246,20 @@ nm_device_olpc_mesh_get_active_channel
<div class="refsect2">
<a name="NMDeviceOlpcMesh--companion"></a><h3>The <code class="literal">“companion”</code> property</h3>
<pre class="programlisting"> “companion” <a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *</pre>
-<p></p>
+<p>The companion device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceOlpcMesh--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceTeam.html b/docs/libnm/html/NMDeviceTeam.html
index ded0ca8f2..9290d5180 100644
--- a/docs/libnm/html/NMDeviceTeam.html
+++ b/docs/libnm/html/NMDeviceTeam.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceTeam</title>
+<title>NMDeviceTeam: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceOlpcMesh.html" title="NMDeviceOlpcMesh">
<link rel="next" href="NMDeviceVlan.html" title="NMDeviceVlan">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -128,8 +128,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceTeam.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceTeam.functions_details"></a><h2>Functions</h2>
@@ -157,7 +155,6 @@ nm_device_team_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.5.12.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -184,7 +181,6 @@ nm_device_team_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.12.8.3.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
<hr>
@@ -225,24 +221,18 @@ copy used by the device, and must not be modified. </p>
<a name="NM-DEVICE-TEAM-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_TEAM_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-TEAM-CARRIER:CAPS"></a><h3>NM_DEVICE_TEAM_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-TEAM-SLAVES:CAPS"></a><h3>NM_DEVICE_TEAM_SLAVES</h3>
<pre class="programlisting">#define NM_DEVICE_TEAM_SLAVES "slaves"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -250,7 +240,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceTeam--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -258,7 +248,7 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceTeam--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -266,13 +256,13 @@ copy used by the device, and must not be modified. </p>
<div class="refsect2">
<a name="NMDeviceTeam--slaves"></a><h3>The <code class="literal">“slaves”</code> property</h3>
<pre class="programlisting"> “slaves” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>The devices enslaved to the team device.</p>
+<p>Element-type: NMDevice</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceVlan.html b/docs/libnm/html/NMDeviceVlan.html
index 3febf8386..1101eb80a 100644
--- a/docs/libnm/html/NMDeviceVlan.html
+++ b/docs/libnm/html/NMDeviceVlan.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceVlan</title>
+<title>NMDeviceVlan: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceTeam.html" title="NMDeviceTeam">
<link rel="next" href="NMDeviceWifi.html" title="NMDeviceWifi">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -146,8 +146,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceVlan.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceVlan.functions_details"></a><h2>Functions</h2>
@@ -175,7 +173,6 @@ nm_device_vlan_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.5.13.8.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -202,7 +199,6 @@ nm_device_vlan_get_carrier (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.13.8.3.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the device has carrier</p>
-<p></p>
</div>
</div>
<hr>
@@ -254,7 +250,6 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.13.8.5.5"></a><h4>Returns</h4>
<p> the device's VLAN ID</p>
-<p></p>
</div>
</div>
</div>
@@ -264,32 +259,24 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<a name="NM-DEVICE-VLAN-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_VLAN_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-CARRIER:CAPS"></a><h3>NM_DEVICE_VLAN_CARRIER</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_CARRIER "carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-PARENT:CAPS"></a><h3>NM_DEVICE_VLAN_PARENT</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_PARENT "parent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-VLAN-VLAN-ID:CAPS"></a><h3>NM_DEVICE_VLAN_VLAN_ID</h3>
<pre class="programlisting">#define NM_DEVICE_VLAN_VLAN_ID "vlan-id"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -297,7 +284,7 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceVlan--carrier"></a><h3>The <code class="literal">“carrier”</code> property</h3>
<pre class="programlisting"> “carrier” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Whether the device has carrier.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -305,7 +292,7 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceVlan--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -313,14 +300,14 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMDeviceVlan--parent"></a><h3>The <code class="literal">“parent”</code> property</h3>
<pre class="programlisting"> “parent” <a class="link" href="NMDevice.html" title="NMDevice"><span class="type">NMDevice</span></a> *</pre>
-<p></p>
+<p>The devices's parent device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceVlan--vlan-id"></a><h3>The <code class="literal">“vlan-id”</code> property</h3>
<pre class="programlisting"> “vlan-id” <span class="type">guint</span></pre>
-<p></p>
+<p>The device's VLAN ID.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 4095</p>
<p>Default value: 0</p>
@@ -328,7 +315,6 @@ nm_device_vlan_get_vlan_id (<em class="parameter"><code><a class="link" href="NM
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceWifi.html b/docs/libnm/html/NMDeviceWifi.html
index 6bbad017e..db0dca479 100644
--- a/docs/libnm/html/NMDeviceWifi.html
+++ b/docs/libnm/html/NMDeviceWifi.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceWifi</title>
+<title>NMDeviceWifi: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceVlan.html" title="NMDeviceVlan">
<link rel="next" href="NMDeviceWimax.html" title="NMDeviceWimax">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -252,8 +252,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceWifi.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceWifi.functions_details"></a><h2>Functions</h2>
@@ -281,7 +279,6 @@ nm_device_wifi_get_hw_address (<em class="parameter"><code><a class="link" href=
<a name="id-1.5.14.9.2.6"></a><h4>Returns</h4>
<p> the actual hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -310,7 +307,6 @@ nm_device_wifi_get_permanent_hw_address
<a name="id-1.5.14.9.3.6"></a><h4>Returns</h4>
<p> the permanent hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -337,7 +333,6 @@ nm_device_wifi_get_mode (<em class="parameter"><code><a class="link" href="NMDev
<div class="refsect3">
<a name="id-1.5.14.9.4.6"></a><h4>Returns</h4>
<p> the mode</p>
-<p></p>
</div>
</div>
<hr>
@@ -364,7 +359,6 @@ nm_device_wifi_get_bitrate (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.5.14.9.5.6"></a><h4>Returns</h4>
<p> the bit rate (kbit/s)</p>
-<p></p>
</div>
</div>
<hr>
@@ -391,7 +385,6 @@ nm_device_wifi_get_capabilities (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.5.14.9.6.6"></a><h4>Returns</h4>
<p> the capabilities</p>
-<p></p>
</div>
</div>
<hr>
@@ -530,7 +523,6 @@ after that for the scan to complete.</p>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be
set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -620,7 +612,6 @@ nm_device_wifi_request_scan_finish (<em class="parameter"><code><a class="link"
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be
set.</p>
-<p></p>
</div>
</div>
</div>
@@ -630,56 +621,42 @@ set.</p>
<a name="NM-DEVICE-WIFI-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_WIFI_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-PERMANENT-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS "perm-hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-MODE:CAPS"></a><h3>NM_DEVICE_WIFI_MODE</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-BITRATE:CAPS"></a><h3>NM_DEVICE_WIFI_BITRATE</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_BITRATE "bitrate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-ACTIVE-ACCESS-POINT:CAPS"></a><h3>NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT "active-access-point"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-CAPABILITIES:CAPS"></a><h3>NM_DEVICE_WIFI_CAPABILITIES</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_CAPABILITIES "wireless-capabilities"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIFI-ACCESS-POINTS:CAPS"></a><h3>NM_DEVICE_WIFI_ACCESS_POINTS</h3>
<pre class="programlisting">#define NM_DEVICE_WIFI_ACCESS_POINTS "access-points"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -687,21 +664,22 @@ set.</p>
<div class="refsect2">
<a name="NMDeviceWifi--access-points"></a><h3>The <code class="literal">“access-points”</code> property</h3>
<pre class="programlisting"> “access-points” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>List of all Wi-Fi access points the device can see.</p>
+<p>Element-type: NMAccessPoint</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWifi--active-access-point"></a><h3>The <code class="literal">“active-access-point”</code> property</h3>
<pre class="programlisting"> “active-access-point” <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> *</pre>
-<p></p>
+<p>The active <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWifi--bitrate"></a><h3>The <code class="literal">“bitrate”</code> property</h3>
<pre class="programlisting"> “bitrate” <span class="type">guint</span></pre>
-<p></p>
+<p>The bit rate of the device in kbit/s.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -709,7 +687,7 @@ set.</p>
<div class="refsect2">
<a name="NMDeviceWifi--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -717,7 +695,7 @@ set.</p>
<div class="refsect2">
<a name="NMDeviceWifi--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
<pre class="programlisting"> “mode” <a class="link" href="libnm-nm-dbus-interface.html#NM80211Mode" title="enum NM80211Mode"><span class="type">NM80211Mode</span></a></pre>
-<p></p>
+<p>The mode of the device.</p>
<p>Flags: Read</p>
<p>Default value: NM_802_11_MODE_UNKNOWN</p>
</div>
@@ -725,7 +703,7 @@ set.</p>
<div class="refsect2">
<a name="NMDeviceWifi--perm-hw-address"></a><h3>The <code class="literal">“perm-hw-address”</code> property</h3>
<pre class="programlisting"> “perm-hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -733,7 +711,7 @@ set.</p>
<div class="refsect2">
<a name="NMDeviceWifi--wireless-capabilities"></a><h3>The <code class="literal">“wireless-capabilities”</code> property</h3>
<pre class="programlisting"> “wireless-capabilities” <a class="link" href="libnm-nm-dbus-interface.html#NMDeviceWifiCapabilities" title="enum NMDeviceWifiCapabilities"><span class="type">NMDeviceWifiCapabilities</span></a></pre>
-<p></p>
+<p>The wireless capabilities of the device.</p>
<p>Flags: Read</p>
</div>
</div>
@@ -745,6 +723,34 @@ set.</p>
user_function (<a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *device,
<span class="type">GObject</span> *ap,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> is added to the Wi-Fi device.</p>
+<div class="refsect3">
+<a name="id-1.5.14.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p>the Wi-Fi device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ap</p></td>
+<td class="parameter_description"><p>the new access point</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -754,12 +760,39 @@ user_function (<a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><sp
user_function (<a class="link" href="NMDeviceWifi.html" title="NMDeviceWifi"><span class="type">NMDeviceWifi</span></a> *device,
<span class="type">GObject</span> *ap,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMAccessPoint.html" title="NMAccessPoint"><span class="type">NMAccessPoint</span></a> is removed from the Wi-Fi device.</p>
+<div class="refsect3">
+<a name="id-1.5.14.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>device</p></td>
+<td class="parameter_description"><p>the Wi-Fi device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>ap</p></td>
+<td class="parameter_description"><p>the removed access point</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDeviceWimax.html b/docs/libnm/html/NMDeviceWimax.html
index f1d58b57f..4fc7c558a 100644
--- a/docs/libnm/html/NMDeviceWimax.html
+++ b/docs/libnm/html/NMDeviceWimax.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDeviceWimax</title>
+<title>NMDeviceWimax: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMDeviceWifi.html" title="NMDeviceWifi">
<link rel="next" href="NMActiveConnection.html" title="NMActiveConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -245,8 +245,6 @@
</div>
<div class="refsect1">
<a name="NMDeviceWimax.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDeviceWimax.functions_details"></a><h2>Functions</h2>
@@ -274,7 +272,6 @@ nm_device_wimax_get_hw_address (<em class="parameter"><code><a class="link" href
<a name="id-1.5.15.9.2.6"></a><h4>Returns</h4>
<p> the hardware address. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
<hr>
@@ -394,7 +391,6 @@ device is not connected.</p>
<div class="refsect3">
<a name="id-1.5.15.9.6.6"></a><h4>Returns</h4>
<p> the center frequency in KHz, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -424,7 +420,6 @@ device is not connected.</p>
<div class="refsect3">
<a name="id-1.5.15.9.7.6"></a><h4>Returns</h4>
<p> the RSSI in dBm, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -453,7 +448,6 @@ meaning when the device is not connected.</p>
<div class="refsect3">
<a name="id-1.5.15.9.8.6"></a><h4>Returns</h4>
<p> the CINR in dB, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -482,7 +476,6 @@ nm_device_wimax_get_tx_power (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.5.15.9.9.6"></a><h4>Returns</h4>
<p> the TX power in dBm, or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -509,7 +502,6 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect3">
<a name="id-1.5.15.9.10.6"></a><h4>Returns</h4>
<p> the ID of the serving Base Station, or <code class="literal">NULL</code></p>
-<p></p>
</div>
</div>
</div>
@@ -519,64 +511,48 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<a name="NM-DEVICE-WIMAX-HW-ADDRESS:CAPS"></a><h3>NM_DEVICE_WIMAX_HW_ADDRESS</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_HW_ADDRESS "hw-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-ACTIVE-NSP:CAPS"></a><h3>NM_DEVICE_WIMAX_ACTIVE_NSP</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_ACTIVE_NSP "active-nsp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-CENTER-FREQUENCY:CAPS"></a><h3>NM_DEVICE_WIMAX_CENTER_FREQUENCY</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_CENTER_FREQUENCY "center-frequency"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-RSSI:CAPS"></a><h3>NM_DEVICE_WIMAX_RSSI</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_RSSI "rssi"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-CINR:CAPS"></a><h3>NM_DEVICE_WIMAX_CINR</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_CINR "cinr"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-TX-POWER:CAPS"></a><h3>NM_DEVICE_WIMAX_TX_POWER</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_TX_POWER "tx-power"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-BSID:CAPS"></a><h3>NM_DEVICE_WIMAX_BSID</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_BSID "bsid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEVICE-WIMAX-NSPS:CAPS"></a><h3>NM_DEVICE_WIMAX_NSPS</h3>
<pre class="programlisting">#define NM_DEVICE_WIMAX_NSPS "nsps"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -584,14 +560,15 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--active-nsp"></a><h3>The <code class="literal">“active-nsp”</code> property</h3>
<pre class="programlisting"> “active-nsp” <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> *</pre>
-<p></p>
+<p>The active <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> of the device.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWimax--bsid"></a><h3>The <code class="literal">“bsid”</code> property</h3>
<pre class="programlisting"> “bsid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The ID of the serving base station as received from the network. Has
+no meaning when the device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -599,7 +576,9 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--center-frequency"></a><h3>The <code class="literal">“center-frequency”</code> property</h3>
<pre class="programlisting"> “center-frequency” <span class="type">guint</span></pre>
-<p></p>
+<p>The center frequency (in KHz) of the radio channel the device is using to
+communicate with the network when connected. Has no meaning when the
+device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -607,7 +586,9 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--cinr"></a><h3>The <code class="literal">“cinr”</code> property</h3>
<pre class="programlisting"> “cinr” <span class="type">gint</span></pre>
-<p></p>
+<p>CINR (Carrier to Interference + Noise Ratio) of the current radio link
+in dB. CINR is a more accurate measure of radio link quality. Has no
+meaning when the device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -615,7 +596,7 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--hw-address"></a><h3>The <code class="literal">“hw-address”</code> property</h3>
<pre class="programlisting"> “hw-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The hardware (MAC) address of the device.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -623,14 +604,18 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--nsps"></a><h3>The <code class="literal">“nsps”</code> property</h3>
<pre class="programlisting"> “nsps” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>List of all WiMAX Network Service Providers the device can see.</p>
+<p>Element-type: NMWimaxNsp</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMDeviceWimax--rssi"></a><h3>The <code class="literal">“rssi”</code> property</h3>
<pre class="programlisting"> “rssi” <span class="type">gint</span></pre>
-<p></p>
+<p>RSSI of the current radio link in dBm. This value indicates how strong
+the raw received RF signal from the base station is, but does not
+indicate the overall quality of the radio link. Has no meaning when the
+device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -638,7 +623,9 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
<div class="refsect2">
<a name="NMDeviceWimax--tx-power"></a><h3>The <code class="literal">“tx-power”</code> property</h3>
<pre class="programlisting"> “tx-power” <span class="type">gint</span></pre>
-<p></p>
+<p>Average power of the last burst transmitted by the device, in units of
+0.5 dBm. i.e. a TxPower of -11 represents an actual device TX power of
+-5.5 dBm. Has no meaning when the device is not connected.</p>
<p>Flags: Read</p>
<p>Default value: 0</p>
</div>
@@ -651,6 +638,34 @@ nm_device_wimax_get_bsid (<em class="parameter"><code><a class="link" href="NMDe
user_function (<a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><span class="type">NMDeviceWimax</span></a> *self,
<span class="type">GObject</span> *nsp,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> is added to the wimax device.</p>
+<div class="refsect3">
+<a name="id-1.5.15.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>self</p></td>
+<td class="parameter_description"><p>the wimax device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nsp</p></td>
+<td class="parameter_description"><p>the new NSP</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
<hr>
@@ -660,12 +675,39 @@ user_function (<a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><
user_function (<a class="link" href="NMDeviceWimax.html" title="NMDeviceWimax"><span class="type">NMDeviceWimax</span></a> *self,
<span class="type">GObject</span> *nsp,
<span class="type">gpointer</span> user_data)</pre>
+<p>Notifies that a <a class="link" href="NMWimaxNsp.html" title="NMWimaxNsp"><span class="type">NMWimaxNsp</span></a> is removed from the wimax device.</p>
+<div class="refsect3">
+<a name="id-1.5.15.12.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>self</p></td>
+<td class="parameter_description"><p>the wimax device that received the signal</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>nsp</p></td>
+<td class="parameter_description"><p>the removed NSP</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
<p>Flags: Run First</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMDhcpConfig.html b/docs/libnm/html/NMDhcpConfig.html
index 3a4a02299..a1e97a8af 100644
--- a/docs/libnm/html/NMDhcpConfig.html
+++ b/docs/libnm/html/NMDhcpConfig.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMDhcpConfig</title>
+<title>NMDhcpConfig: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMIPConfig.html" title="NMIPConfig">
<link rel="next" href="ch05.html" title="Utility API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -118,8 +118,6 @@
</div>
<div class="refsect1">
<a name="NMDhcpConfig.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMDhcpConfig.functions_details"></a><h2>Functions</h2>
@@ -147,7 +145,6 @@ nm_dhcp_config_get_family (<em class="parameter"><code><a class="link" href="NMD
<a name="id-1.5.22.8.2.6"></a><h4>Returns</h4>
<p> the IP address family; either <code class="literal">AF_INET</code> or
<code class="literal">AF_INET6</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -212,7 +209,6 @@ nm_dhcp_config_get_one_option (<em class="parameter"><code><a class="link" href=
<a name="id-1.5.22.8.4.6"></a><h4>Returns</h4>
<p> the configuration option's value. This is the internal string used by the
configuration, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -222,16 +218,12 @@ configuration, and must not be modified.</p>
<a name="NM-DHCP-CONFIG-FAMILY:CAPS"></a><h3>NM_DHCP_CONFIG_FAMILY</h3>
<pre class="programlisting">#define NM_DHCP_CONFIG_FAMILY "family"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DHCP-CONFIG-OPTIONS:CAPS"></a><h3>NM_DHCP_CONFIG_OPTIONS</h3>
<pre class="programlisting">#define NM_DHCP_CONFIG_OPTIONS "options"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -239,7 +231,8 @@ configuration, and must not be modified.</p>
<div class="refsect2">
<a name="NMDhcpConfig--family"></a><h3>The <code class="literal">“family”</code> property</h3>
<pre class="programlisting"> “family” <span class="type">gint</span></pre>
-<p></p>
+<p>The IP address family of the configuration; either
+<code class="literal">AF_INET</code> or <code class="literal">AF_INET6</code>.</p>
<p>Flags: Read</p>
<p>Allowed values: [0,255]</p>
<p>Default value: 0</p>
@@ -248,13 +241,13 @@ configuration, and must not be modified.</p>
<div class="refsect2">
<a name="NMDhcpConfig--options"></a><h3>The <code class="literal">“options”</code> property</h3>
<pre class="programlisting"> “options” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>The <span class="type">GHashTable</span> containing options of the configuration.</p>
+<p>Type: GLib.HashTable(utf8,utf8)</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMIPConfig.html b/docs/libnm/html/NMIPConfig.html
index a93213abb..9a32ecb66 100644
--- a/docs/libnm/html/NMIPConfig.html
+++ b/docs/libnm/html/NMIPConfig.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMIPConfig</title>
+<title>NMIPConfig: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMWimaxNsp.html" title="NMWimaxNsp">
<link rel="next" href="NMDhcpConfig.html" title="NMDhcpConfig">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -210,8 +210,6 @@
</div>
<div class="refsect1">
<a name="NMIPConfig.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMIPConfig.functions_details"></a><h2>Functions</h2>
@@ -239,7 +237,6 @@ nm_ip_config_get_family (<em class="parameter"><code><a class="link" href="NMIPC
<a name="id-1.5.21.8.2.6"></a><h4>Returns</h4>
<p> the IP address family; either <code class="literal">AF_INET</code> or
<code class="literal">AF_INET6</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -445,64 +442,48 @@ nm_ip_config_get_wins_servers (<em class="parameter"><code><a class="link" href=
<a name="NM-IP-CONFIG-FAMILY:CAPS"></a><h3>NM_IP_CONFIG_FAMILY</h3>
<pre class="programlisting">#define NM_IP_CONFIG_FAMILY "family"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-GATEWAY:CAPS"></a><h3>NM_IP_CONFIG_GATEWAY</h3>
<pre class="programlisting">#define NM_IP_CONFIG_GATEWAY "gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-ADDRESSES:CAPS"></a><h3>NM_IP_CONFIG_ADDRESSES</h3>
<pre class="programlisting">#define NM_IP_CONFIG_ADDRESSES "addresses"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-ROUTES:CAPS"></a><h3>NM_IP_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_IP_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-NAMESERVERS:CAPS"></a><h3>NM_IP_CONFIG_NAMESERVERS</h3>
<pre class="programlisting">#define NM_IP_CONFIG_NAMESERVERS "nameservers"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-DOMAINS:CAPS"></a><h3>NM_IP_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_IP_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-SEARCHES:CAPS"></a><h3>NM_IP_CONFIG_SEARCHES</h3>
<pre class="programlisting">#define NM_IP_CONFIG_SEARCHES "searches"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-IP-CONFIG-WINS-SERVERS:CAPS"></a><h3>NM_IP_CONFIG_WINS_SERVERS</h3>
<pre class="programlisting">#define NM_IP_CONFIG_WINS_SERVERS "wins-servers"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -510,21 +491,22 @@ nm_ip_config_get_wins_servers (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMIPConfig--addresses"></a><h3>The <code class="literal">“addresses”</code> property</h3>
<pre class="programlisting"> “addresses” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>A <span class="type">GPtrArray</span> containing the addresses (<a class="link" href="NMSettingIPConfig.html#NMIPAddress"><span class="type">NMIPAddress</span></a>) of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIPConfig--domains"></a><h3>The <code class="literal">“domains”</code> property</h3>
<pre class="programlisting"> “domains” <span class="type">GStrv</span></pre>
-<p></p>
+<p>The array containing domain strings of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIPConfig--family"></a><h3>The <code class="literal">“family”</code> property</h3>
<pre class="programlisting"> “family” <span class="type">gint</span></pre>
-<p></p>
+<p>The IP address family of the configuration; either
+<code class="literal">AF_INET</code> or <code class="literal">AF_INET6</code>.</p>
<p>Flags: Read</p>
<p>Allowed values: [0,255]</p>
<p>Default value: 0</p>
@@ -533,7 +515,7 @@ nm_ip_config_get_wins_servers (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMIPConfig--gateway"></a><h3>The <code class="literal">“gateway”</code> property</h3>
<pre class="programlisting"> “gateway” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IP gateway address of the configuration as string.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -541,34 +523,34 @@ nm_ip_config_get_wins_servers (<em class="parameter"><code><a class="link" href=
<div class="refsect2">
<a name="NMIPConfig--nameservers"></a><h3>The <code class="literal">“nameservers”</code> property</h3>
<pre class="programlisting"> “nameservers” <span class="type">GStrv</span></pre>
-<p></p>
+<p>The array containing name server IP addresses of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIPConfig--routes"></a><h3>The <code class="literal">“routes”</code> property</h3>
<pre class="programlisting"> “routes” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>A <span class="type">GPtrArray</span> containing the routes (<a class="link" href="NMSettingIPConfig.html#NMIPRoute"><span class="type">NMIPRoute</span></a>) of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIPConfig--searches"></a><h3>The <code class="literal">“searches”</code> property</h3>
<pre class="programlisting"> “searches” <span class="type">GStrv</span></pre>
-<p></p>
+<p>The array containing DNS search strings of the configuration.</p>
<p>Flags: Read</p>
</div>
<hr>
<div class="refsect2">
<a name="NMIPConfig--wins-servers"></a><h3>The <code class="literal">“wins-servers”</code> property</h3>
<pre class="programlisting"> “wins-servers” <span class="type">GStrv</span></pre>
-<p></p>
+<p>The array containing WINS server IP addresses of the configuration.
+(This will always be empty for IPv6 configurations.)</p>
<p>Flags: Read</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMObject.html b/docs/libnm/html/NMObject.html
index 38da67a08..c97791520 100644
--- a/docs/libnm/html/NMObject.html
+++ b/docs/libnm/html/NMObject.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMObject</title>
+<title>NMObject: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch02.html" title="Client Object API Reference">
<link rel="prev" href="NMSecretAgentOld.html" title="NMSecretAgentOld">
<link rel="next" href="libnm-nm-errors.html" title="nm-errors">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -112,8 +112,6 @@
</div>
<div class="refsect1">
<a name="NMObject.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMObject.functions_details"></a><h2>Functions</h2>
@@ -141,7 +139,6 @@ nm_object_get_path (<em class="parameter"><code><a class="link" href="NMObject.h
<a name="id-1.3.4.8.2.6"></a><h4>Returns</h4>
<p> the object's path. This is the internal string used by the
device, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -151,16 +148,12 @@ device, and must not be modified.</p>
<a name="NM-OBJECT-PATH:CAPS"></a><h3>NM_OBJECT_PATH</h3>
<pre class="programlisting">#define NM_OBJECT_PATH "path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-OBJECT-DBUS-CONNECTION:CAPS"></a><h3>NM_OBJECT_DBUS_CONNECTION</h3>
<pre class="programlisting">#define NM_OBJECT_DBUS_CONNECTION "dbus-connection"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -168,14 +161,14 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMObject--dbus-connection"></a><h3>The <code class="literal">“dbus-connection”</code> property</h3>
<pre class="programlisting"> “dbus-connection” <span class="type">GDBusConnection</span> *</pre>
-<p></p>
+<p>The <span class="type">GDBusConnection</span> of the object.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<p>Flags: Read / Write / Construct Only</p>
</div>
<hr>
<div class="refsect2">
<a name="NMObject--nm-running-internal"></a><h3>The <code class="literal">“nm-running-internal”</code> property</h3>
<pre class="programlisting"> “nm-running-internal” <span class="type">gboolean</span></pre>
-<p></p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -183,14 +176,13 @@ device, and must not be modified.</p>
<div class="refsect2">
<a name="NMObject--path"></a><h3>The <code class="literal">“path”</code> property</h3>
<pre class="programlisting"> “path” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The D-Bus object path.</p>
<p>Flags: Read / Write / Construct Only</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMRemoteConnection.html b/docs/libnm/html/NMRemoteConnection.html
index 0bead3ba0..d413162d7 100644
--- a/docs/libnm/html/NMRemoteConnection.html
+++ b/docs/libnm/html/NMRemoteConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMRemoteConnection</title>
+<title>NMRemoteConnection: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMVpnConnection.html" title="NMVpnConnection">
<link rel="next" href="NMAccessPoint.html" title="NMAccessPoint">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -214,8 +214,6 @@
</div>
<div class="refsect1">
<a name="NMRemoteConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMRemoteConnection.functions_details"></a><h2>Functions</h2>
@@ -267,7 +265,6 @@ disk; if <code class="literal">FALSE</code>, then only the in-memory representat
<a name="id-1.5.18.8.2.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -365,7 +362,6 @@ nm_remote_connection_commit_changes_finish
<a name="id-1.5.18.8.4.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -408,7 +404,6 @@ been written to disk, or if the connection has never been saved.</p>
<a name="id-1.5.18.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -494,7 +489,6 @@ nm_remote_connection_save_finish (<em class="parameter"><code><a class="link" hr
<a name="id-1.5.18.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -536,7 +530,6 @@ nm_remote_connection_delete (<em class="parameter"><code><a class="link" href="N
<a name="id-1.5.18.8.8.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -621,7 +614,6 @@ nm_remote_connection_delete_finish (<em class="parameter"><code><a class="link"
<a name="id-1.5.18.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success, <code class="literal">FALSE</code> on error, in which case <em class="parameter"><code>error</code></em>
will be set.</p>
-<p></p>
</div>
</div>
<hr>
@@ -671,7 +663,6 @@ not a simple property accessor.</p>
<p> a <span class="type">GVariant</span> of type <code class="literal">NM_VARIANT_TYPE_CONNECTION</code> containing
<em class="parameter"><code>connection</code></em>
's secrets, or <code class="literal">NULL</code> on error.</p>
-<p></p>
</div>
</div>
<hr>
@@ -793,7 +784,6 @@ nm_remote_connection_get_unsaved (<em class="parameter"><code><a class="link" hr
<p> <code class="literal">TRUE</code> if the remote connection contains changes that have not
been saved to disk, <code class="literal">FALSE</code> if the connection is the same as its on-disk
representation.</p>
-<p></p>
</div>
</div>
<hr>
@@ -828,7 +818,6 @@ reference to it.)</p>
<a name="id-1.5.18.8.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the remote connection is visible to the current
user, <code class="literal">FALSE</code> if not.</p>
-<p></p>
</div>
</div>
</div>
@@ -838,32 +827,24 @@ user, <code class="literal">FALSE</code> if not.</p>
<a name="NM-REMOTE-CONNECTION-DBUS-CONNECTION:CAPS"></a><h3>NM_REMOTE_CONNECTION_DBUS_CONNECTION</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_DBUS_CONNECTION "dbus-connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-CONNECTION-PATH:CAPS"></a><h3>NM_REMOTE_CONNECTION_PATH</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_PATH "path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-CONNECTION-UNSAVED:CAPS"></a><h3>NM_REMOTE_CONNECTION_UNSAVED</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_UNSAVED "unsaved"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-REMOTE-CONNECTION-VISIBLE:CAPS"></a><h3>NM_REMOTE_CONNECTION_VISIBLE</h3>
<pre class="programlisting">#define NM_REMOTE_CONNECTION_VISIBLE "visible"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -871,7 +852,8 @@ user, <code class="literal">FALSE</code> if not.</p>
<div class="refsect2">
<a name="NMRemoteConnection--unsaved"></a><h3>The <code class="literal">“unsaved”</code> property</h3>
<pre class="programlisting"> “unsaved” <span class="type">gboolean</span></pre>
-<p></p>
+<p><code class="literal">TRUE</code> if the remote connection contains changes that have not been saved
+to disk, <code class="literal">FALSE</code> if the connection is the same as its on-disk representation.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
@@ -879,14 +861,19 @@ user, <code class="literal">FALSE</code> if not.</p>
<div class="refsect2">
<a name="NMRemoteConnection--visible"></a><h3>The <code class="literal">“visible”</code> property</h3>
<pre class="programlisting"> “visible” <span class="type">gboolean</span></pre>
-<p></p>
+<p><code class="literal">TRUE</code> if the remote connection is visible to the current user, <code class="literal">FALSE</code> if
+not. If the connection is not visible then it is essentially useless; it
+will not contain any settings, and operations such as
+<a class="link" href="NMRemoteConnection.html#nm-remote-connection-save" title="nm_remote_connection_save ()"><code class="function">nm_remote_connection_save()</code></a> and <a class="link" href="NMRemoteConnection.html#nm-remote-connection-delete" title="nm_remote_connection_delete ()"><code class="function">nm_remote_connection_delete()</code></a> will always
+fail. (<a href="https://developer.gnome.org/libnm-glib/0.9/NMRemoteSettings.html"><span class="type">NMRemoteSettings</span></a> will not normally return non-visible connections
+to callers, but it is possible for a connection's visibility to change
+after you already have a reference to it.)</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSecretAgentOld.html b/docs/libnm/html/NMSecretAgentOld.html
index 4eb3641b3..ab20b0eb2 100644
--- a/docs/libnm/html/NMSecretAgentOld.html
+++ b/docs/libnm/html/NMSecretAgentOld.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSecretAgentOld</title>
+<title>NMSecretAgentOld: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch02.html" title="Client Object API Reference">
<link rel="prev" href="NMClient.html" title="NMClient">
<link rel="next" href="NMObject.html" title="NMObject">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -216,8 +216,6 @@
</div>
<div class="refsect1">
<a name="NMSecretAgentOld.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMSecretAgentOld.functions_details"></a><h2>Functions</h2>
@@ -267,7 +265,7 @@ something like this:</p>
<span class="normal"> <a href="NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-PSK:CAPS">NM_SETTING_WIRELESS_SECURITY_PSK</a></span><span class="symbol">,</span><span class="normal"> </span><span class="string">"my really cool PSK"</span><span class="symbol">,</span>
<span class="normal"> NULL</span><span class="symbol">);</span>
<span class="function"><a href="libnm-NMConnection.html#nm-connection-add-setting">nm_connection_add_setting</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">secrets</span><span class="symbol">,</span><span class="normal"> </span><span class="function">NM_SETTING</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">s_wsec</span><span class="symbol">));</span>
-<span class="normal">secrets_dict </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="libnm-NMConnection.html#nm-connection-to-dbus">nm_connection_to_dbus</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">secrets</span><span class="symbol">,</span><span class="normal"> NM_CONNECTION_SERIALIZE_ALL</span><span class="symbol">);</span>
+<span class="normal">secrets_dict </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="libnm-NMConnection.html#nm-connection-to-dbus">nm_connection_to_dbus</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">secrets</span><span class="symbol">,</span><span class="normal"> <a href="libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-ALL:CAPS">NM_CONNECTION_SERIALIZE_ALL</a></span><span class="symbol">);</span>
<span class="symbol">(</span><span class="normal">call the NMSecretAgentOldGetSecretsFunc </span><span class="usertype">with</span><span class="normal"> secrets_dict</span><span class="symbol">)</span>
@@ -461,7 +459,6 @@ registered, or in the process of registering.</p>
<div class="refsect3">
<a name="id-1.3.3.8.5.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if registration was successful, <code class="literal">FALSE</code> on error.</p>
-<p></p>
</div>
</div>
<hr>
@@ -549,7 +546,6 @@ nm_secret_agent_old_register_finish (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.3.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if registration was successful, <code class="literal">FALSE</code> on error.</p>
-<p></p>
</div>
</div>
<hr>
@@ -594,7 +590,6 @@ registered.</p>
<div class="refsect3">
<a name="id-1.3.3.8.8.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if unregistration was successful, <code class="literal">FALSE</code> on error</p>
-<p></p>
</div>
</div>
<hr>
@@ -682,7 +677,6 @@ nm_secret_agent_old_unregister_finish (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.3.3.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if unregistration was successful, <code class="literal">FALSE</code> on error.</p>
-<p></p>
</div>
</div>
<hr>
@@ -708,7 +702,6 @@ nm_secret_agent_old_get_registered (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.3.3.8.11.5"></a><h4>Returns</h4>
<p> a <code class="literal">TRUE</code> if the agent is registered, <code class="literal">FALSE</code> if it is not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -879,32 +872,24 @@ nm_secret_agent_old_delete_secrets (<em class="parameter"><code><a class="link"
<a name="NM-SECRET-AGENT-OLD-IDENTIFIER:CAPS"></a><h3>NM_SECRET_AGENT_OLD_IDENTIFIER</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_OLD_IDENTIFIER "identifier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-OLD-AUTO-REGISTER:CAPS"></a><h3>NM_SECRET_AGENT_OLD_AUTO_REGISTER</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_OLD_AUTO_REGISTER "auto-register"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-OLD-REGISTERED:CAPS"></a><h3>NM_SECRET_AGENT_OLD_REGISTERED</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_OLD_REGISTERED "registered"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-OLD-CAPABILITIES:CAPS"></a><h3>NM_SECRET_AGENT_OLD_CAPABILITIES</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_OLD_CAPABILITIES "capabilities"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -912,7 +897,20 @@ nm_secret_agent_old_delete_secrets (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSecretAgentOld--auto-register"></a><h3>The <code class="literal">“auto-register”</code> property</h3>
<pre class="programlisting"> “auto-register” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code> (the default), the agent will always be registered when
+NetworkManager is running; if NetworkManager exits and restarts, the
+agent will re-register itself automatically.</p>
+<p>In particular, if this property is <code class="literal">TRUE</code> at construct time, then the
+agent will register itself with NetworkManager during
+construction/initialization, and initialization will fail with an error
+if the agent is unable to register itself.</p>
+<p>If the property is <code class="literal">FALSE</code>, the agent will not automatically register with
+NetworkManager, and <a class="link" href="NMSecretAgentOld.html#nm-secret-agent-old-register" title="nm_secret_agent_old_register ()"><code class="function">nm_secret_agent_old_register()</code></a> or
+<a class="link" href="NMSecretAgentOld.html#nm-secret-agent-old-register-async" title="nm_secret_agent_old_register_async ()"><code class="function">nm_secret_agent_old_register_async()</code></a> must be called to register it.</p>
+<p>Calling <a class="link" href="NMSecretAgentOld.html#nm-secret-agent-old-unregister" title="nm_secret_agent_old_unregister ()"><code class="function">nm_secret_agent_old_unregister()</code></a> will suppress auto-registration
+until <a class="link" href="NMSecretAgentOld.html#nm-secret-agent-old-register" title="nm_secret_agent_old_register ()"><code class="function">nm_secret_agent_old_register()</code></a> is called, which re-enables
+auto-registration. This ensures that the agent remains un-registered when
+you expect it to be unregistered.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -920,14 +918,20 @@ nm_secret_agent_old_delete_secrets (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSecretAgentOld--capabilities"></a><h3>The <code class="literal">“capabilities”</code> property</h3>
<pre class="programlisting"> “capabilities” <a class="link" href="libnm-nm-dbus-interface.html#NMSecretAgentCapabilities" title="enum NMSecretAgentCapabilities"><span class="type">NMSecretAgentCapabilities</span></a></pre>
-<p></p>
+<p>A bitfield of <a class="link" href="libnm-nm-dbus-interface.html#NMSecretAgentCapabilities" title="enum NMSecretAgentCapabilities"><code class="literal">NMSecretAgentCapabilities</code></a>.</p>
<p>Flags: Read / Write / Construct</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSecretAgentOld--identifier"></a><h3>The <code class="literal">“identifier”</code> property</h3>
<pre class="programlisting"> “identifier” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Identifies this agent; only one agent in each user session may use the
+same identifier. Identifier formatting follows the same rules as
+D-Bus bus names with the exception that the ':' character is not
+allowed. The valid set of characters is "A-Z[0-9]_-." and the
+identifier is limited in length to 255 characters with a minimum
+of 3 characters. An example valid identifier is 'org.gnome.nm-applet'
+(without quotes).</p>
<p>Flags: Read / Write / Construct Only</p>
<p>Default value: NULL</p>
</div>
@@ -935,14 +939,13 @@ nm_secret_agent_old_delete_secrets (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSecretAgentOld--registered"></a><h3>The <code class="literal">“registered”</code> property</h3>
<pre class="programlisting"> “registered” <span class="type">gboolean</span></pre>
-<p></p>
+<p><code class="literal">TRUE</code> if the agent is registered with NetworkManager, <code class="literal">FALSE</code> if not.</p>
<p>Flags: Read</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSetting.html b/docs/libnm/html/NMSetting.html
index 5e5d535b6..43757b42a 100644
--- a/docs/libnm/html/NMSetting.html
+++ b/docs/libnm/html/NMSetting.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSetting</title>
+<title>NMSetting: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSimpleConnection.html" title="NMSimpleConnection">
<link rel="next" href="NMSettingConnection.html" title="NMSettingConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -256,24 +256,18 @@ of properties and allowed values.</p>
<a name="NM-SETTING-PARAM-REQUIRED:CAPS"></a><h3>NM_SETTING_PARAM_REQUIRED</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_REQUIRED (1 &lt;&lt; (1 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PARAM-SECRET:CAPS"></a><h3>NM_SETTING_PARAM_SECRET</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_SECRET (1 &lt;&lt; (2 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PARAM-FUZZY-IGNORE:CAPS"></a><h3>NM_SETTING_PARAM_FUZZY_IGNORE</h3>
<pre class="programlisting">#define NM_SETTING_PARAM_FUZZY_IGNORE (1 &lt;&lt; (3 + G_PARAM_USER_SHIFT))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -318,7 +312,6 @@ of properties and allowed values.</p>
<div class="refsect3">
<a name="id-1.4.4.8.5.5"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> to clear the secret, <code class="literal">FALSE</code> to not clear the secret</p>
-<p></p>
</div>
</div>
<hr>
@@ -395,7 +388,6 @@ nm_setting_lookup_type (<em class="parameter"><code>const <span class="type">cha
<p> the <span class="type">GType</span> of the setting's class, or <code class="literal">G_TYPE_INVALID</code> if
<em class="parameter"><code>name</code></em>
is not recognized.</p>
-<p></p>
</div>
</div>
<hr>
@@ -451,7 +443,6 @@ nm_setting_get_name (<em class="parameter"><code><a class="link" href="NMSetting
<a name="id-1.4.4.8.9.6"></a><h4>Returns</h4>
<p> a string containing the type name of the <a class="link" href="NMSetting.html" title="NMSetting"><span class="type">NMSetting</span></a> object,
like 'ppp' or 'wireless' or 'wired'.</p>
-<p></p>
</div>
</div>
<hr>
@@ -499,7 +490,6 @@ is being verified in isolation. </p></td>
<div class="refsect3">
<a name="id-1.4.4.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the setting is valid, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -542,7 +532,6 @@ for a description of each flag's behavior.</p>
<div class="refsect3">
<a name="id-1.4.4.8.11.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the comparison succeeds, <code class="literal">FALSE</code> if it does not</p>
-<p></p>
</div>
</div>
<hr>
@@ -605,7 +594,6 @@ in and the settings differ, a new one is created and returned. </p></td>
<div class="refsect3">
<a name="id-1.4.4.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the settings contain the same values, <code class="literal">FALSE</code> if they do not</p>
-<p></p>
</div>
</div>
<hr>
@@ -674,7 +662,6 @@ output format is not guaranteed to be stable and may change at any time.</p>
<p> an allocated string containing a textual representation of the
setting's properties and values (including secrets!), which the caller should
free with <code class="function">g_free()</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -723,7 +710,6 @@ handle that secret.</p>
<a name="id-1.4.4.8.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success (if the given secret name was a valid property of
this setting, and if that property is secret), <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -772,7 +758,6 @@ handle that secret.</p>
<a name="id-1.4.4.8.16.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> on success (if the given secret name was a valid property of
this setting, and if that property is secret), <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -812,7 +797,6 @@ to get the type of</p></td>
<p> the D-Bus marshalling type of <em class="parameter"><code>property</code></em>
on <em class="parameter"><code>setting</code></em>
.</p>
-<p></p>
</div>
</div>
</div>
@@ -822,8 +806,6 @@ on <em class="parameter"><code>setting</code></em>
<a name="NM-SETTING-NAME:CAPS"></a><h3>NM_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1064,7 +1046,6 @@ example "ppp" or "wireless" or "wired".</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSetting8021x.html b/docs/libnm/html/NMSetting8021x.html
index ba6aa73fb..f9e3ae1b1 100644
--- a/docs/libnm/html/NMSetting8021x.html
+++ b/docs/libnm/html/NMSetting8021x.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSetting8021x</title>
+<title>NMSetting8021x: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingConnection.html" title="NMSettingConnection">
<link rel="next" href="NMSettingAdsl.html" title="NMSettingAdsl">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -767,6 +767,10 @@
</colgroup>
<tbody>
<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CERT-SCHEME-PREFIX-PATH:CAPS" title="NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH">NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH</a></td>
+</tr>
+<tr>
<td class="datatype_keyword">enum</td>
<td class="function_name"><a class="link" href="NMSetting8021x.html#NMSetting8021xCKFormat" title="enum NMSetting8021xCKFormat">NMSetting8021xCKFormat</a></td>
</tr>
@@ -950,7 +954,6 @@ nm_setting_802_1x_new (<em class="parameter"><code><span class="type">void</span
<div class="refsect3">
<a name="id-1.4.6.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSetting8021x.html" title="NMSetting8021x"><span class="type">NMSetting8021x</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -981,7 +984,6 @@ allowed EAP methods.</p>
<div class="refsect3">
<a name="id-1.4.6.8.3.6"></a><h4>Returns</h4>
<p> the number of allowed EAP methods</p>
-<p></p>
</div>
</div>
<hr>
@@ -1018,7 +1020,6 @@ nm_setting_802_1x_get_eap_method (<em class="parameter"><code><a class="link" hr
<a name="id-1.4.6.8.4.6"></a><h4>Returns</h4>
<p> the name of the allowed EAP method at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1056,7 +1057,6 @@ allowed EAP methods.</p>
<a name="id-1.4.6.8.5.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the EAP method was successfully added, <code class="literal">FALSE</code> if it was
not a valid method or if it was already allowed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1123,7 +1123,6 @@ nm_setting_802_1x_remove_eap_method_by_value
<div class="refsect3">
<a name="id-1.4.6.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the EAP method was founs and removed, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1173,7 +1172,6 @@ authenticate the user. Often this is a username or login name.</p>
<div class="refsect3">
<a name="id-1.4.6.8.9.6"></a><h4>Returns</h4>
<p> the user identifier</p>
-<p></p>
</div>
</div>
<hr>
@@ -1204,7 +1202,6 @@ a secure form, if applicable for that EAP method.</p>
<div class="refsect3">
<a name="id-1.4.6.8.10.6"></a><h4>Returns</h4>
<p> the anonymous identifier</p>
-<p></p>
</div>
</div>
<hr>
@@ -1231,7 +1228,6 @@ nm_setting_802_1x_get_pac_file (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.6.8.11.6"></a><h4>Returns</h4>
<p> the PAC file</p>
-<p></p>
</div>
</div>
<hr>
@@ -1263,7 +1259,6 @@ of these properties.</p>
<div class="refsect3">
<a name="id-1.4.6.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if a system CA certificate path should be used, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1294,7 +1289,6 @@ certificates for verifying the network to client.</p>
<div class="refsect3">
<a name="id-1.4.6.8.13.6"></a><h4>Returns</h4>
<p> the CA certificate directory path</p>
-<p></p>
</div>
</div>
<hr>
@@ -1325,7 +1319,6 @@ to add more CA certificates for verifying the network to client.</p>
<div class="refsect3">
<a name="id-1.4.6.8.14.6"></a><h4>Returns</h4>
<p> the "phase 2" CA certificate directory path</p>
-<p></p>
</div>
</div>
<hr>
@@ -1354,7 +1347,6 @@ if <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CA
<div class="refsect3">
<a name="id-1.4.6.8.15.6"></a><h4>Returns</h4>
<p> scheme used to store the CA certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1418,7 +1410,6 @@ of the network cannot be confirmed by the client.</p>
<div class="refsect3">
<a name="id-1.4.6.8.17.6"></a><h4>Returns</h4>
<p> path to the CA certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -1479,7 +1470,6 @@ clears the CA certificate.</p></td>
<div class="refsect3">
<a name="id-1.4.6.8.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -1508,7 +1498,6 @@ nm_setting_802_1x_get_subject_match (<em class="parameter"><code><a class="link"
substring to be matched against the subject of the authentication
server certificate, or <code class="literal">NULL</code> no subject verification is to be
performed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1537,7 +1526,6 @@ nm_setting_802_1x_get_num_altsubject_matches
<div class="refsect3">
<a name="id-1.4.6.8.20.6"></a><h4>Returns</h4>
<p> the number of altsubject-matches entries.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1575,7 +1563,6 @@ nm_setting_802_1x_get_altsubject_match
<a name="id-1.4.6.8.21.6"></a><h4>Returns</h4>
<p> the altSubjectName match at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1614,7 +1601,6 @@ server is not verified.</p>
<a name="id-1.4.6.8.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the alternative subject name match was
successfully added, <code class="literal">FALSE</code> if it was already allowed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1683,7 +1669,6 @@ nm_setting_802_1x_remove_altsubject_match_by_value
<a name="id-1.4.6.8.24.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the alternative subject name match was found and removed,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1736,7 +1721,6 @@ if <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CA
<div class="refsect3">
<a name="id-1.4.6.8.26.6"></a><h4>Returns</h4>
<p> scheme used to store the client certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1796,7 +1780,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.4.6.8.28.6"></a><h4>Returns</h4>
<p> path to the client certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -1861,7 +1844,6 @@ clears the client certificate.</p></td>
<div class="refsect3">
<a name="id-1.4.6.8.29.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -1889,7 +1871,6 @@ nm_setting_802_1x_get_phase1_peapver (<em class="parameter"><code><a class="link
<p> the "phase 1" PEAP version to be used when authenticating with
EAP-PEAP as contained in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase1-peapver" title="The “phase1-peapver” property"><span class="type">“phase1-peapver”</span></a> property. Valid
values are <code class="literal">NULL</code> (unset), "0" (PEAP version 0), and "1" (PEAP version 1).</p>
-<p></p>
</div>
</div>
<hr>
@@ -1920,7 +1901,6 @@ used when authenticating with EAP-PEAP, as contained in the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase1-peaplabel" title="The “phase1-peaplabel” property"><span class="type">“phase1-peaplabel”</span></a> property. Valid values are <code class="literal">NULL</code> (unset),
"0" (use old-style label), and "1" (use new-style label). See the
wpa_supplicant documentation for more details.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1949,7 +1929,6 @@ nm_setting_802_1x_get_phase1_fast_provisioning
<p> whether "phase 1" PEAP fast provisioning should be used, as specified
by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase1-fast-provisioning" title="The “phase1-fast-provisioning” property"><span class="type">“phase1-fast-provisioning”</span></a> property. See the
wpa_supplicant documentation for more details.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1976,7 +1955,6 @@ nm_setting_802_1x_get_phase2_auth (<em class="parameter"><code><a class="link" h
<a name="id-1.4.6.8.33.5"></a><h4>Returns</h4>
<p> the "phase 2" non-EAP (ex MD5) allowed authentication method as
specified by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2003,7 +1981,6 @@ nm_setting_802_1x_get_phase2_autheap (<em class="parameter"><code><a class="link
<a name="id-1.4.6.8.34.5"></a><h4>Returns</h4>
<p> the "phase 2" EAP-based (ex TLS) allowed authentication method as
specified by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2034,7 +2011,6 @@ use <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-get-ca-cert-path
<div class="refsect3">
<a name="id-1.4.6.8.35.6"></a><h4>Returns</h4>
<p> scheme used to store the "phase 2" CA certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -2100,7 +2076,6 @@ of the network cannot be confirmed by the client.</p>
<div class="refsect3">
<a name="id-1.4.6.8.37.6"></a><h4>Returns</h4>
<p> path to the "phase 2" CA certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -2161,7 +2136,6 @@ clears the "phase2" CA certificate.</p></td>
<div class="refsect3">
<a name="id-1.4.6.8.38.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -2191,7 +2165,6 @@ nm_setting_802_1x_get_phase2_subject_match
the substring to be matched against the subject of the "phase 2"
authentication server certificate, or <code class="literal">NULL</code> no subject verification
is to be performed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2220,7 +2193,6 @@ nm_setting_802_1x_get_num_phase2_altsubject_matches
<div class="refsect3">
<a name="id-1.4.6.8.40.6"></a><h4>Returns</h4>
<p> the number of phase2-altsubject-matches entries.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2258,7 +2230,6 @@ nm_setting_802_1x_get_phase2_altsubject_match
<a name="id-1.4.6.8.41.6"></a><h4>Returns</h4>
<p> the "phase 2" altSubjectName match at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2298,7 +2269,6 @@ connection</p></td>
<a name="id-1.4.6.8.42.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the "phase 2" alternative subject name match was
successfully added, <code class="literal">FALSE</code> if it was already allowed.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2367,7 +2337,6 @@ nm_setting_802_1x_remove_phase2_altsubject_match_by_value
<a name="id-1.4.6.8.44.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the alternative subject name match for "phase 2" was found and removed,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2422,7 +2391,6 @@ returned scheme is <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-C
<div class="refsect3">
<a name="id-1.4.6.8.46.6"></a><h4>Returns</h4>
<p> scheme used to store the "phase 2" client certificate (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -2482,7 +2450,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.4.6.8.48.6"></a><h4>Returns</h4>
<p> path to the "phase 2" client certificate file</p>
-<p></p>
</div>
</div>
<hr>
@@ -2548,7 +2515,6 @@ clears the "phase2" client certificate.</p></td>
<div class="refsect3">
<a name="id-1.4.6.8.49.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -2575,7 +2541,6 @@ nm_setting_802_1x_get_password (<em class="parameter"><code><a class="link" href
<a name="id-1.4.6.8.50.5"></a><h4>Returns</h4>
<p> the password used by the authentication method, if any, as specified
by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -2601,7 +2566,6 @@ nm_setting_802_1x_get_password_flags (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.4.6.8.51.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2657,7 +2621,6 @@ nm_setting_802_1x_get_password_raw_flags
<a name="id-1.4.6.8.53.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2684,7 +2647,6 @@ nm_setting_802_1x_get_pin (<em class="parameter"><code><a class="link" href="NMS
<a name="id-1.4.6.8.54.5"></a><h4>Returns</h4>
<p> the PIN used by the authentication method, if any, as specified
by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--pin" title="The “pin” property"><span class="type">“pin”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -2711,7 +2673,6 @@ nm_setting_802_1x_get_pin_flags (<em class="parameter"><code><a class="link" hre
<a name="id-1.4.6.8.55.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--pin" title="The “pin” property"><span class="type">“pin”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2743,7 +2704,6 @@ nm_setting_802_1x_get_private_key_scheme
<div class="refsect3">
<a name="id-1.4.6.8.56.6"></a><h4>Returns</h4>
<p> scheme used to store the private key (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -2806,7 +2766,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.4.6.8.58.6"></a><h4>Returns</h4>
<p> path to the private key file</p>
-<p></p>
</div>
</div>
<hr>
@@ -2894,7 +2853,6 @@ an error is returned.</p></td>
<div class="refsect3">
<a name="id-1.4.6.8.59.9"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -2923,7 +2881,6 @@ nm_setting_802_1x_get_private_key_password
<p> the private key password used to decrypt the private key if
previously set with <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-private-key" title="nm_setting_802_1x_set_private_key ()"><code class="function">nm_setting_802_1x_set_private_key()</code></a>, or the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2951,7 +2908,6 @@ nm_setting_802_1x_get_private_key_password_flags
<a name="id-1.4.6.8.61.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -2979,7 +2935,6 @@ nm_setting_802_1x_get_private_key_format
<a name="id-1.4.6.8.62.5"></a><h4>Returns</h4>
<p> the data format of the private key data stored in the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key" title="The “private-key” property"><span class="type">“private-key”</span></a> property</p>
-<p></p>
</div>
</div>
<hr>
@@ -3011,7 +2966,6 @@ scheme is <a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-
<div class="refsect3">
<a name="id-1.4.6.8.63.6"></a><h4>Returns</h4>
<p> scheme used to store the "phase 2" private key (blob or path)</p>
-<p></p>
</div>
</div>
<hr>
@@ -3074,7 +3028,6 @@ authentication method.</p>
<div class="refsect3">
<a name="id-1.4.6.8.65.6"></a><h4>Returns</h4>
<p> path to the "phase 2" private key file</p>
-<p></p>
</div>
</div>
<hr>
@@ -3164,7 +3117,6 @@ an error is returned.</p></td>
<div class="refsect3">
<a name="id-1.4.6.8.66.9"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the operation succeeded, <code class="literal">FALSE</code> if it was unsuccessful</p>
-<p></p>
</div>
</div>
<hr>
@@ -3193,7 +3145,6 @@ nm_setting_802_1x_get_phase2_private_key_password
<p> the private key password used to decrypt the private key if
previously set with <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-private-key" title="nm_setting_802_1x_set_phase2_private_key ()"><code class="function">nm_setting_802_1x_set_phase2_private_key()</code></a> or the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property.</p>
-<p></p>
</div>
</div>
<hr>
@@ -3221,7 +3172,6 @@ nm_setting_802_1x_get_phase2_private_key_password_flags
<a name="id-1.4.6.8.68.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -3249,18 +3199,23 @@ nm_setting_802_1x_get_phase2_private_key_format
<a name="id-1.4.6.8.69.5"></a><h4>Returns</h4>
<p> the data format of the "phase 2" private key data stored in the
<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key" title="The “phase2-private-key” property"><span class="type">“phase2-private-key”</span></a> property</p>
-<p></p>
</div>
</div>
</div>
<div class="refsect1">
<a name="NMSetting8021x.other_details"></a><h2>Types and Values</h2>
<div class="refsect2">
+<a name="NM-SETTING-802-1X-CERT-SCHEME-PREFIX-PATH:CAPS"></a><h3>NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH</h3>
+<pre class="programlisting">#define NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH "file://"
+</pre>
+</div>
+<hr>
+<div class="refsect2">
<a name="NMSetting8021xCKFormat"></a><h3>enum NMSetting8021xCKFormat</h3>
<p><a class="link" href="NMSetting8021x.html#NMSetting8021xCKFormat" title="enum NMSetting8021xCKFormat"><span class="type">NMSetting8021xCKFormat</span></a> values indicate the general type of a certificate
or private key</p>
<div class="refsect3">
-<a name="id-1.4.6.9.2.4"></a><h4>Members</h4>
+<a name="id-1.4.6.9.3.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -3309,7 +3264,7 @@ and private key</p>
stored in the setting properties, either as a blob of the item's data, or as
a path to a certificate or private key file on the filesystem</p>
<div class="refsect3">
-<a name="id-1.4.6.9.3.4"></a><h4>Members</h4>
+<a name="id-1.4.6.9.4.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -3350,264 +3305,198 @@ to a file containing the certificate or key data</p>
<a name="NM-SETTING-802-1X-SETTING-NAME:CAPS"></a><h3>NM_SETTING_802_1X_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_SETTING_NAME "802-1x"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-EAP:CAPS"></a><h3>NM_SETTING_802_1X_EAP</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_EAP "eap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-IDENTITY:CAPS"></a><h3>NM_SETTING_802_1X_IDENTITY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_IDENTITY "identity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-ANONYMOUS-IDENTITY:CAPS"></a><h3>NM_SETTING_802_1X_ANONYMOUS_IDENTITY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_ANONYMOUS_IDENTITY "anonymous-identity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PAC-FILE:CAPS"></a><h3>NM_SETTING_802_1X_PAC_FILE</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PAC_FILE "pac-file"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-CA-CERT:CAPS"></a><h3>NM_SETTING_802_1X_CA_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_CA_CERT "ca-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-CA-PATH:CAPS"></a><h3>NM_SETTING_802_1X_CA_PATH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_CA_PATH "ca-path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-SUBJECT-MATCH:CAPS"></a><h3>NM_SETTING_802_1X_SUBJECT_MATCH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_SUBJECT_MATCH "subject-match"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-ALTSUBJECT-MATCHES:CAPS"></a><h3>NM_SETTING_802_1X_ALTSUBJECT_MATCHES</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_ALTSUBJECT_MATCHES "altsubject-matches"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-CLIENT-CERT:CAPS"></a><h3>NM_SETTING_802_1X_CLIENT_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_CLIENT_CERT "client-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE1-PEAPVER:CAPS"></a><h3>NM_SETTING_802_1X_PHASE1_PEAPVER</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE1_PEAPVER "phase1-peapver"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE1-PEAPLABEL:CAPS"></a><h3>NM_SETTING_802_1X_PHASE1_PEAPLABEL</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE1_PEAPLABEL "phase1-peaplabel"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE1-FAST-PROVISIONING:CAPS"></a><h3>NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING "phase1-fast-provisioning"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-AUTH:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_AUTH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_AUTH "phase2-auth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-AUTHEAP:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_AUTHEAP</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_AUTHEAP "phase2-autheap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-CA-CERT:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_CA_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_CA_CERT "phase2-ca-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-CA-PATH:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_CA_PATH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_CA_PATH "phase2-ca-path"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-SUBJECT-MATCH:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH "phase2-subject-match"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-ALTSUBJECT-MATCHES:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES "phase2-altsubject-matches"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-CLIENT-CERT:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_CLIENT_CERT</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_CLIENT_CERT "phase2-client-cert"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD-RAW:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD_RAW</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD_RAW "password-raw"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PASSWORD-RAW-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PASSWORD_RAW_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PASSWORD_RAW_FLAGS "password-raw-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PRIVATE-KEY:CAPS"></a><h3>NM_SETTING_802_1X_PRIVATE_KEY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PRIVATE_KEY "private-key"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PRIVATE-KEY-PASSWORD:CAPS"></a><h3>NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD "private-key-password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PRIVATE-KEY-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS "private-key-password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-PRIVATE-KEY:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_PRIVATE_KEY</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY "phase2-private-key"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-PRIVATE-KEY-PASSWORD:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD "phase2-private-key-password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PHASE2-PRIVATE-KEY-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS "phase2-private-key-password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PIN:CAPS"></a><h3>NM_SETTING_802_1X_PIN</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PIN "pin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-PIN-FLAGS:CAPS"></a><h3>NM_SETTING_802_1X_PIN_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_PIN_FLAGS "pin-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-802-1X-SYSTEM-CA-CERTS:CAPS"></a><h3>NM_SETTING_802_1X_SYSTEM_CA_CERTS</h3>
<pre class="programlisting">#define NM_SETTING_802_1X_SYSTEM_CA_CERTS "system-ca-certs"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -3615,14 +3504,18 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--altsubject-matches"></a><h3>The <code class="literal">“altsubject-matches”</code> property</h3>
<pre class="programlisting"> “altsubject-matches” <span class="type">GStrv</span></pre>
-<p></p>
+<p>List of strings to be matched against the altSubjectName of the
+certificate presented by the authentication server. If the list is empty,
+no verification of the server certificate's altSubjectName is performed.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--anonymous-identity"></a><h3>The <code class="literal">“anonymous-identity”</code> property</h3>
<pre class="programlisting"> “anonymous-identity” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Anonymous identity string for EAP authentication methods. Used as the
+unencrypted identity with EAP types that support different tunneled
+identity like EAP-TTLS.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3630,14 +3523,27 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--ca-cert"></a><h3>The <code class="literal">“ca-cert”</code> property</h3>
<pre class="programlisting"> “ca-cert” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Contains the CA certificate if used by the EAP method specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte. This
+property can be unset even if the EAP method supports CA certificates,
+but this allows man-in-the-middle attacks and is NOT recommended.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-ca-cert" title="nm_setting_802_1x_set_ca_cert ()"><code class="function">nm_setting_802_1x_set_ca_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--ca-path"></a><h3>The <code class="literal">“ca-path”</code> property</h3>
<pre class="programlisting"> “ca-path” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded path to a directory containing PEM or DER formatted
+certificates to be added to the verification chain in addition to the
+certificate specified in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-cert" title="The “ca-cert” property"><span class="type">“ca-cert”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3645,21 +3551,35 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--client-cert"></a><h3>The <code class="literal">“client-cert”</code> property</h3>
<pre class="programlisting"> “client-cert” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Contains the client certificate if used by the EAP method specified in
+the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-client-cert" title="nm_setting_802_1x_set_client_cert ()"><code class="function">nm_setting_802_1x_set_client_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--eap"></a><h3>The <code class="literal">“eap”</code> property</h3>
<pre class="programlisting"> “eap” <span class="type">GStrv</span></pre>
-<p></p>
+<p>The allowed EAP method to be used when authenticating to the network with
+802.1x. Valid methods are: "leap", "md5", "tls", "peap", "ttls", "pwd",
+and "fast". Each method requires different configuration using the
+properties of this setting; refer to wpa_supplicant documentation for the
+allowed combinations.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--identity"></a><h3>The <code class="literal">“identity”</code> property</h3>
<pre class="programlisting"> “identity” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Identity string for EAP authentication methods. Often the user's user or
+login name.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3667,7 +3587,7 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--pac-file"></a><h3>The <code class="literal">“pac-file”</code> property</h3>
<pre class="programlisting"> “pac-file” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded file path containing PAC for EAP-FAST.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3675,7 +3595,9 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded password used for EAP authentication methods. If both the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property and the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a>
+property are specified, <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> is preferred.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3683,28 +3605,36 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--password-raw"></a><h3>The <code class="literal">“password-raw”</code> property</h3>
<pre class="programlisting"> “password-raw” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Password used for EAP authentication methods, given as a byte array to
+allow passwords in other encodings than UTF-8 to be used. If both the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> property and the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a>
+property are specified, <a class="link" href="NMSetting8021x.html#NMSetting8021x--password" title="The “password” property"><span class="type">“password”</span></a> is preferred.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--password-raw-flags"></a><h3>The <code class="literal">“password-raw-flags”</code> property</h3>
<pre class="programlisting"> “password-raw-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--password-raw" title="The “password-raw” property"><span class="type">“password-raw”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase1-fast-provisioning"></a><h3>The <code class="literal">“phase1-fast-provisioning”</code> property</h3>
<pre class="programlisting"> “phase1-fast-provisioning” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Enables or disables in-line provisioning of EAP-FAST credentials when
+FAST is specified as the EAP method in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property.
+Recognized values are "0" (disabled), "1" (allow unauthenticated
+provisioning), "2" (allow authenticated provisioning), and "3" (allow
+both authenticated and unauthenticated provisioning). See the
+wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3712,7 +3642,10 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase1-peaplabel"></a><h3>The <code class="literal">“phase1-peaplabel”</code> property</h3>
<pre class="programlisting"> “phase1-peaplabel” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Forces use of the new PEAP label during key derivation. Some RADIUS
+servers may require forcing the new PEAP label to interoperate with
+PEAPv1. Set to "1" to force use of the new PEAP label. See the
+wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3720,7 +3653,12 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase1-peapver"></a><h3>The <code class="literal">“phase1-peapver”</code> property</h3>
<pre class="programlisting"> “phase1-peapver” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Forces which PEAP version is used when PEAP is set as the EAP method in
+the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property. When unset, the version reported by
+the server will be used. Sometimes when using older RADIUS servers, it
+is necessary to force the client to use a particular PEAP version. To do
+so, this property may be set to "0" or "1" to force that specific PEAP
+version.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3728,14 +3666,22 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-altsubject-matches"></a><h3>The <code class="literal">“phase2-altsubject-matches”</code> property</h3>
<pre class="programlisting"> “phase2-altsubject-matches” <span class="type">GStrv</span></pre>
-<p></p>
+<p>List of strings to be matched against the altSubjectName of the
+certificate presented by the authentication server during the inner
+"phase 2" authentication. If the list is empty, no verification of the
+server certificate's altSubjectName is performed.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-auth"></a><h3>The <code class="literal">“phase2-auth”</code> property</h3>
<pre class="programlisting"> “phase2-auth” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Specifies the allowed "phase 2" inner non-EAP authentication methods when
+an EAP method that uses an inner TLS tunnel is specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property. Recognized non-EAP "phase 2" methods are
+"pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5", and "tls".
+Each "phase 2" inner method requires specific parameters for successful
+authentication; see the wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3743,7 +3689,12 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-autheap"></a><h3>The <code class="literal">“phase2-autheap”</code> property</h3>
<pre class="programlisting"> “phase2-autheap” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Specifies the allowed "phase 2" inner EAP-based authentication methods
+when an EAP method that uses an inner TLS tunnel is specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property. Recognized EAP-based "phase 2" methods are
+"md5", "mschapv2", "otp", "gtc", and "tls". Each "phase 2" inner method
+requires specific parameters for successful authentication; see the
+wpa_supplicant documentation for more details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3751,14 +3702,28 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-ca-cert"></a><h3>The <code class="literal">“phase2-ca-cert”</code> property</h3>
<pre class="programlisting"> “phase2-ca-cert” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Contains the "phase 2" CA certificate if used by the EAP method specified
+in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> or <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a>
+properties.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte. This
+property can be unset even if the EAP method supports CA certificates,
+but this allows man-in-the-middle attacks and is NOT recommended.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-ca-cert" title="nm_setting_802_1x_set_phase2_ca_cert ()"><code class="function">nm_setting_802_1x_set_phase2_ca_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-ca-path"></a><h3>The <code class="literal">“phase2-ca-path”</code> property</h3>
<pre class="programlisting"> “phase2-ca-path” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>UTF-8 encoded path to a directory containing PEM or DER formatted
+certificates to be added to the verification chain in addition to the
+certificate specified in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-cert" title="The “phase2-ca-cert” property"><span class="type">“phase2-ca-cert”</span></a> property.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3766,21 +3731,58 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-client-cert"></a><h3>The <code class="literal">“phase2-client-cert”</code> property</h3>
<pre class="programlisting"> “phase2-client-cert” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Contains the "phase 2" client certificate if used by the EAP method
+specified in the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> or
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a> properties.</p>
+<p>Certificate data is specified using a "scheme"; two are currently
+supported: blob and path. When using the blob scheme (which is backwards
+compatible with NM 0.7.x) this property should be set to the
+certificate's DER encoded data. When using the path scheme, this property
+should be set to the full UTF-8 encoded path of the certificate, prefixed
+with the string "file://" and ending with a terminating NUL byte. This
+property can be unset even if the EAP method supports CA certificates,
+but this allows man-in-the-middle attacks and is NOT recommended.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-client-cert" title="nm_setting_802_1x_set_phase2_client_cert ()"><code class="function">nm_setting_802_1x_set_phase2_client_cert()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-private-key"></a><h3>The <code class="literal">“phase2-private-key”</code> property</h3>
<pre class="programlisting"> “phase2-private-key” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Contains the "phase 2" inner private key when the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-auth" title="The “phase2-auth” property"><span class="type">“phase2-auth”</span></a> or <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-autheap" title="The “phase2-autheap” property"><span class="type">“phase2-autheap”</span></a> property is
+set to "tls".</p>
+<p>Key data is specified using a "scheme"; two are currently supported: blob
+and path. When using the blob scheme and private keys, this property
+should be set to the key's encrypted PEM encoded data. When using private
+keys with the path scheme, this property should be set to the full UTF-8
+encoded path of the key, prefixed with the string "file://" and ending
+with a terminating NUL byte. When using PKCS#12 format private
+keys and the blob scheme, this property should be set to the
+PKCS#12 data and the <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a>
+property must be set to password used to decrypt the PKCS#12
+certificate and key. When using PKCS#12 files and the path
+scheme, this property should be set to the full UTF-8 encoded path of the
+key, prefixed with the string "file://" and and ending with a terminating
+NUL byte, and as with the blob scheme the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property must be set to the
+password used to decode the PKCS#12 private key and certificate.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-private-key" title="nm_setting_802_1x_set_phase2_private_key ()"><code class="function">nm_setting_802_1x_set_phase2_private_key()</code></a> function instead.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-private-key-password"></a><h3>The <code class="literal">“phase2-private-key-password”</code> property</h3>
<pre class="programlisting"> “phase2-private-key-password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to decrypt the "phase 2" private key specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key" title="The “phase2-private-key” property"><span class="type">“phase2-private-key”</span></a> property when the private key either
+uses the path scheme, or is a PKCS#12 format key. Setting this
+property directly is not generally necessary except when returning
+secrets to NetworkManager; it is generally set automatically when setting
+the private key by the <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-phase2-private-key" title="nm_setting_802_1x_set_phase2_private_key ()"><code class="function">nm_setting_802_1x_set_phase2_private_key()</code></a>
+function.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3788,14 +3790,18 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--phase2-private-key-password-flags"></a><h3>The <code class="literal">“phase2-private-key-password-flags”</code> property</h3>
<pre class="programlisting"> “phase2-private-key-password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-private-key-password" title="The “phase2-private-key-password” property"><span class="type">“phase2-private-key-password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--phase2-subject-match"></a><h3>The <code class="literal">“phase2-subject-match”</code> property</h3>
<pre class="programlisting"> “phase2-subject-match” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Substring to be matched against the subject of the certificate presented
+by the authentication server during the inner "phase 2"
+authentication. When unset, no verification of the authentication server
+certificate's subject is performed.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3803,7 +3809,7 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--pin"></a><h3>The <code class="literal">“pin”</code> property</h3>
<pre class="programlisting"> “pin” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>PIN used for EAP authentication methods.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3811,21 +3817,49 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--pin-flags"></a><h3>The <code class="literal">“pin-flags”</code> property</h3>
<pre class="programlisting"> “pin-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--pin" title="The “pin” property"><span class="type">“pin”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--private-key"></a><h3>The <code class="literal">“private-key”</code> property</h3>
<pre class="programlisting"> “private-key” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>Contains the private key when the <a class="link" href="NMSetting8021x.html#NMSetting8021x--eap" title="The “eap” property"><span class="type">“eap”</span></a> property is set to
+"tls".</p>
+<p>Key data is specified using a "scheme"; two are currently supported: blob
+and path. When using the blob scheme and private keys, this property
+should be set to the key's encrypted PEM encoded data. When using private
+keys with the path scheme, this property should be set to the full UTF-8
+encoded path of the key, prefixed with the string "file://" and ending
+with a terminating NUL byte. When using PKCS#12 format private
+keys and the blob scheme, this property should be set to the
+PKCS#12 data and the <a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a>
+property must be set to password used to decrypt the PKCS#12
+certificate and key. When using PKCS#12 files and the path
+scheme, this property should be set to the full UTF-8 encoded path of the
+key, prefixed with the string "file://" and and ending with a terminating
+NUL byte, and as with the blob scheme the "private-key-password" property
+must be set to the password used to decode the PKCS#12 private
+key and certificate.</p>
+<p>Setting this property directly is discouraged; use the
+<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-private-key" title="nm_setting_802_1x_set_private_key ()"><code class="function">nm_setting_802_1x_set_private_key()</code></a> function instead.</p>
+<p>WARNING: <a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key" title="The “private-key” property"><span class="type">“private-key”</span></a> is not a "secret" property, and thus
+unencrypted private key data using the BLOB scheme may be readable by
+unprivileged users. Private keys should always be encrypted with a
+private key password to prevent unauthorized access to unencrypted
+private key data.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--private-key-password"></a><h3>The <code class="literal">“private-key-password”</code> property</h3>
<pre class="programlisting"> “private-key-password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to decrypt the private key specified in the
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key" title="The “private-key” property"><span class="type">“private-key”</span></a> property when the private key either uses the
+path scheme, or if the private key is a PKCS#12 format key. Setting this
+property directly is not generally necessary except when returning
+secrets to NetworkManager; it is generally set automatically when setting
+the private key by the <a class="link" href="NMSetting8021x.html#nm-setting-802-1x-set-private-key" title="nm_setting_802_1x_set_private_key ()"><code class="function">nm_setting_802_1x_set_private_key()</code></a> function.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3833,14 +3867,17 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--private-key-password-flags"></a><h3>The <code class="literal">“private-key-password-flags”</code> property</h3>
<pre class="programlisting"> “private-key-password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSetting8021x.html#NMSetting8021x--private-key-password" title="The “private-key-password” property"><span class="type">“private-key-password”</span></a>
+property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSetting8021x--subject-match"></a><h3>The <code class="literal">“subject-match”</code> property</h3>
<pre class="programlisting"> “subject-match” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Substring to be matched against the subject of the certificate presented
+by the authentication server. When unset, no verification of the
+authentication server certificate's subject is performed.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3848,14 +3885,21 @@ to a file containing the certificate or key data</p>
<div class="refsect2">
<a name="NMSetting8021x--system-ca-certs"></a><h3>The <code class="literal">“system-ca-certs”</code> property</h3>
<pre class="programlisting"> “system-ca-certs” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <code class="literal">TRUE</code>, overrides the <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-path" title="The “ca-path” property"><span class="type">“ca-path”</span></a> and
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-path" title="The “phase2-ca-path” property"><span class="type">“phase2-ca-path”</span></a> properties using the system CA directory
+specified at configure time with the --system-ca-path switch. The
+certificates in this directory are added to the verification chain in
+addition to any certificates specified by the <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-cert" title="The “ca-cert” property"><span class="type">“ca-cert”</span></a> and
+<a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-cert" title="The “phase2-ca-cert” property"><span class="type">“phase2-ca-cert”</span></a> properties. If the path provided with
+--system-ca-path is rather a file name (bundle of trusted CA certificates),
+it overrides <a class="link" href="NMSetting8021x.html#NMSetting8021x--ca-cert" title="The “ca-cert” property"><span class="type">“ca-cert”</span></a> and <a class="link" href="NMSetting8021x.html#NMSetting8021x--phase2-ca-cert" title="The “phase2-ca-cert” property"><span class="type">“phase2-ca-cert”</span></a>
+properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingAdsl.html b/docs/libnm/html/NMSettingAdsl.html
index f96005af3..3b890722d 100644
--- a/docs/libnm/html/NMSettingAdsl.html
+++ b/docs/libnm/html/NMSettingAdsl.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingAdsl</title>
+<title>NMSettingAdsl: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSetting8021x.html" title="NMSetting8021x">
<link rel="next" href="NMSettingBluetooth.html" title="NMSettingBluetooth">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -240,7 +240,6 @@ nm_setting_adsl_new (<em class="parameter"><code><span class="type">void</span><
<div class="refsect3">
<a name="id-1.4.7.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingAdsl.html" title="NMSettingAdsl"><span class="type">NMSettingAdsl</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -266,7 +265,6 @@ nm_setting_adsl_get_username (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.7.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -292,7 +290,6 @@ nm_setting_adsl_get_password (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.7.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -318,7 +315,6 @@ nm_setting_adsl_get_protocol (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.7.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--protocol" title="The “protocol” property"><span class="type">“protocol”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -344,7 +340,6 @@ nm_setting_adsl_get_encapsulation (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.4.7.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--encapsulation" title="The “encapsulation” property"><span class="type">“encapsulation”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -370,7 +365,6 @@ nm_setting_adsl_get_vpi (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.4.7.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--vpi" title="The “vpi” property"><span class="type">“vpi”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -396,7 +390,6 @@ nm_setting_adsl_get_vci (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.4.7.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--vci" title="The “vci” property"><span class="type">“vci”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -422,7 +415,6 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.7.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -432,104 +424,78 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<a name="NM-SETTING-ADSL-SETTING-NAME:CAPS"></a><h3>NM_SETTING_ADSL_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_SETTING_NAME "adsl"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-USERNAME:CAPS"></a><h3>NM_SETTING_ADSL_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PASSWORD:CAPS"></a><h3>NM_SETTING_ADSL_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_ADSL_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL "protocol"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-ENCAPSULATION:CAPS"></a><h3>NM_SETTING_ADSL_ENCAPSULATION</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ENCAPSULATION "encapsulation"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-VPI:CAPS"></a><h3>NM_SETTING_ADSL_VPI</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_VPI "vpi"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-VCI:CAPS"></a><h3>NM_SETTING_ADSL_VCI</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_VCI "vci"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL-PPPOA:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL_PPPOA</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL_PPPOA "pppoa"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL-PPPOE:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL_PPPOE</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL_PPPOE "pppoe"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-PROTOCOL-IPOATM:CAPS"></a><h3>NM_SETTING_ADSL_PROTOCOL_IPOATM</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_PROTOCOL_IPOATM "ipoatm"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-ENCAPSULATION-VCMUX:CAPS"></a><h3>NM_SETTING_ADSL_ENCAPSULATION_VCMUX</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ENCAPSULATION_VCMUX "vcmux"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-ADSL-ENCAPSULATION-LLC:CAPS"></a><h3>NM_SETTING_ADSL_ENCAPSULATION_LLC</h3>
<pre class="programlisting">#define NM_SETTING_ADSL_ENCAPSULATION_LLC "llc"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -537,7 +503,7 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingAdsl--encapsulation"></a><h3>The <code class="literal">“encapsulation”</code> property</h3>
<pre class="programlisting"> “encapsulation” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Encapsulation of ADSL connection. Can be "vcmux" or "llc".</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -545,7 +511,7 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingAdsl--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Password used to authenticate with the ADSL service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -553,14 +519,14 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingAdsl--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingAdsl.html#NMSettingAdsl--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingAdsl--protocol"></a><h3>The <code class="literal">“protocol”</code> property</h3>
<pre class="programlisting"> “protocol” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>ADSL connection protocol. Can be "pppoa", "pppoe" or "ipoatm".</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -568,7 +534,7 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingAdsl--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Username used to authenticate with the ADSL service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -576,7 +542,7 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingAdsl--vci"></a><h3>The <code class="literal">“vci”</code> property</h3>
<pre class="programlisting"> “vci” <span class="type">guint</span></pre>
-<p></p>
+<p>VCI of ADSL connection</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 65536</p>
<p>Default value: 0</p>
@@ -585,7 +551,7 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingAdsl--vpi"></a><h3>The <code class="literal">“vpi”</code> property</h3>
<pre class="programlisting"> “vpi” <span class="type">guint</span></pre>
-<p></p>
+<p>VPI of ADSL connection</p>
<p>Flags: Read / Write</p>
<p>Allowed values: &lt;= 65536</p>
<p>Default value: 0</p>
@@ -593,7 +559,6 @@ nm_setting_adsl_get_password_flags (<em class="parameter"><code><a class="link"
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingBluetooth.html b/docs/libnm/html/NMSettingBluetooth.html
index 891183180..dc9095c94 100644
--- a/docs/libnm/html/NMSettingBluetooth.html
+++ b/docs/libnm/html/NMSettingBluetooth.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingBluetooth</title>
+<title>NMSettingBluetooth: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingAdsl.html" title="NMSettingAdsl">
<link rel="next" href="NMSettingBond.html" title="NMSettingBond">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -173,7 +173,6 @@ describes a connection to.</p>
<div class="refsect3">
<a name="id-1.4.8.8.3.6"></a><h4>Returns</h4>
<p> the Bluetooth address</p>
-<p></p>
</div>
</div>
<hr>
@@ -203,7 +202,6 @@ either DUN to a DUN-capable device or PANU to a NAP-capable device).</p>
<a name="id-1.4.8.8.4.6"></a><h4>Returns</h4>
<p> the type, either <a class="link" href="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-TYPE-PANU:CAPS" title="NM_SETTING_BLUETOOTH_TYPE_PANU"><code class="literal">NM_SETTING_BLUETOOTH_TYPE_PANU</code></a> or
<a class="link" href="NMSettingBluetooth.html#NM-SETTING-BLUETOOTH-TYPE-DUN:CAPS" title="NM_SETTING_BLUETOOTH_TYPE_DUN"><code class="literal">NM_SETTING_BLUETOOTH_TYPE_DUN</code></a></p>
-<p></p>
</div>
</div>
</div>
@@ -213,24 +211,18 @@ either DUN to a DUN-capable device or PANU to a NAP-capable device).</p>
<a name="NM-SETTING-BLUETOOTH-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BLUETOOTH_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_SETTING_NAME "bluetooth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BLUETOOTH-BDADDR:CAPS"></a><h3>NM_SETTING_BLUETOOTH_BDADDR</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_BDADDR "bdaddr"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BLUETOOTH-TYPE:CAPS"></a><h3>NM_SETTING_BLUETOOTH_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_BLUETOOTH_TYPE "type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -254,7 +246,7 @@ NAP (Network Access Point) protocol, which accepts connections via PANU.</p>
<div class="refsect2">
<a name="NMSettingBluetooth--bdaddr"></a><h3>The <code class="literal">“bdaddr”</code> property</h3>
<pre class="programlisting"> “bdaddr” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The Bluetooth address of the device.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -262,14 +254,14 @@ NAP (Network Access Point) protocol, which accepts connections via PANU.</p>
<div class="refsect2">
<a name="NMSettingBluetooth--type"></a><h3>The <code class="literal">“type”</code> property</h3>
<pre class="programlisting"> “type” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Either "dun" for Dial-Up Networking connections or "panu" for Personal
+Area Networking connections to devices supporting the NAP profile.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingBond.html b/docs/libnm/html/NMSettingBond.html
index 3df3d490f..edf00c346 100644
--- a/docs/libnm/html/NMSettingBond.html
+++ b/docs/libnm/html/NMSettingBond.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingBond</title>
+<title>NMSettingBond: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingBluetooth.html" title="NMSettingBluetooth">
<link rel="next" href="NMSettingBridge.html" title="NMSettingBridge">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -259,7 +259,6 @@ using <a class="link" href="NMSettingBond.html#nm-setting-bond-get-option" title
<div class="refsect3">
<a name="id-1.4.9.8.3.6"></a><h4>Returns</h4>
<p> the number of bonding options</p>
-<p></p>
</div>
</div>
<hr>
@@ -316,7 +315,6 @@ modified. </p></td>
<p> <code class="literal">TRUE</code> on success if the index was valid and an option was found,
<code class="literal">FALSE</code> if the index was invalid (ie, greater than the number of options
currently held by the setting)</p>
-<p></p>
</div>
</div>
<hr>
@@ -354,7 +352,6 @@ nm_setting_bond_get_option_by_name (<em class="parameter"><code><a class="link"
<a name="id-1.4.9.8.5.6"></a><h4>Returns</h4>
<p> the value, or <code class="literal">NULL</code> if the key/value pair was never added to the
setting; the value is owned by the setting and must not be modified</p>
-<p></p>
</div>
</div>
<hr>
@@ -401,7 +398,6 @@ that conflict with each other.</p>
<a name="id-1.4.9.8.6.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was valid and was added to the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -439,7 +435,6 @@ list.</p>
<a name="id-1.4.9.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was found and removed from the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -482,7 +477,6 @@ the <em class="parameter"><code>name</code></em>
is valid for the given name.
If the <em class="parameter"><code>name</code></em>
is not a valid option, <code class="literal">FALSE</code> will be returned.</p>
-<p></p>
</div>
</div>
<hr>
@@ -544,7 +538,6 @@ nm_setting_bond_get_option_default (<em class="parameter"><code><a class="link"
<a name="id-1.4.9.8.10.5"></a><h4>Returns</h4>
<p> the value of the bond option if not overridden by an entry in
the <a class="link" href="NMSettingBond.html#NMSettingBond--options" title="The “options” property"><span class="type">“options”</span></a> property.</p>
-<p></p>
</div>
</div>
</div>
@@ -554,136 +547,102 @@ the <a class="link" href="NMSettingBond.html#NMSettingBond--options" title="The
<a name="NM-SETTING-BOND-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BOND_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BOND_SETTING_NAME "bond"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTIONS:CAPS"></a><h3>NM_SETTING_BOND_OPTIONS</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTIONS "options"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-MODE:CAPS"></a><h3>NM_SETTING_BOND_OPTION_MODE</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-MIIMON:CAPS"></a><h3>NM_SETTING_BOND_OPTION_MIIMON</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_MIIMON "miimon"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-DOWNDELAY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_DOWNDELAY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_DOWNDELAY "downdelay"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-UPDELAY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_UPDELAY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_UPDELAY "updelay"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-ARP-INTERVAL:CAPS"></a><h3>NM_SETTING_BOND_OPTION_ARP_INTERVAL</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_ARP_INTERVAL "arp_interval"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-ARP-IP-TARGET:CAPS"></a><h3>NM_SETTING_BOND_OPTION_ARP_IP_TARGET</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_ARP_IP_TARGET "arp_ip_target"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-ARP-VALIDATE:CAPS"></a><h3>NM_SETTING_BOND_OPTION_ARP_VALIDATE</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_ARP_VALIDATE "arp_validate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-PRIMARY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_PRIMARY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_PRIMARY "primary"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-PRIMARY-RESELECT:CAPS"></a><h3>NM_SETTING_BOND_OPTION_PRIMARY_RESELECT</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_PRIMARY_RESELECT "primary_reselect"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-FAIL-OVER-MAC:CAPS"></a><h3>NM_SETTING_BOND_OPTION_FAIL_OVER_MAC</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_FAIL_OVER_MAC "fail_over_mac"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-USE-CARRIER:CAPS"></a><h3>NM_SETTING_BOND_OPTION_USE_CARRIER</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_USE_CARRIER "use_carrier"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-AD-SELECT:CAPS"></a><h3>NM_SETTING_BOND_OPTION_AD_SELECT</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_AD_SELECT "ad_select"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-XMIT-HASH-POLICY:CAPS"></a><h3>NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY "xmit_hash_policy"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-RESEND-IGMP:CAPS"></a><h3>NM_SETTING_BOND_OPTION_RESEND_IGMP</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_RESEND_IGMP "resend_igmp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BOND-OPTION-LACP-RATE:CAPS"></a><h3>NM_SETTING_BOND_OPTION_LACP_RATE</h3>
<pre class="programlisting">#define NM_SETTING_BOND_OPTION_LACP_RATE "lacp_rate"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -691,13 +650,15 @@ the <a class="link" href="NMSettingBond.html#NMSettingBond--options" title="The
<div class="refsect2">
<a name="NMSettingBond--options"></a><h3>The <code class="literal">“options”</code> property</h3>
<pre class="programlisting"> “options” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>Dictionary of key/value pairs of bonding options. Both keys and values
+must be strings. Option names must contain only alphanumeric characters
+(ie, [a-zA-Z0-9]).</p>
+<p>Type: GHashTable(utf8,utf8)</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingBridge.html b/docs/libnm/html/NMSettingBridge.html
index addccbb41..05bbe151d 100644
--- a/docs/libnm/html/NMSettingBridge.html
+++ b/docs/libnm/html/NMSettingBridge.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingBridge</title>
+<title>NMSettingBridge: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingBond.html" title="NMSettingBond">
<link rel="next" href="NMSettingBridgePort.html" title="NMSettingBridgePort">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -246,7 +246,6 @@ nm_setting_bridge_get_mac_address (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.4.10.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -272,7 +271,6 @@ nm_setting_bridge_get_stp (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.4.10.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--stp" title="The “stp” property"><span class="type">“stp”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -298,7 +296,6 @@ nm_setting_bridge_get_priority (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.10.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--priority" title="The “priority” property"><span class="type">“priority”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -324,7 +321,6 @@ nm_setting_bridge_get_forward_delay (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.10.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--forward-delay" title="The “forward-delay” property"><span class="type">“forward-delay”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -350,7 +346,6 @@ nm_setting_bridge_get_hello_time (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.10.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--hello-time" title="The “hello-time” property"><span class="type">“hello-time”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -376,7 +371,6 @@ nm_setting_bridge_get_max_age (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.10.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--max-age" title="The “max-age” property"><span class="type">“max-age”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -402,7 +396,6 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.4.10.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridge.html#NMSettingBridge--ageing-time" title="The “ageing-time” property"><span class="type">“ageing-time”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -412,64 +405,48 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<a name="NM-SETTING-BRIDGE-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BRIDGE_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_SETTING_NAME "bridge"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_BRIDGE_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-STP:CAPS"></a><h3>NM_SETTING_BRIDGE_STP</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_STP "stp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PRIORITY:CAPS"></a><h3>NM_SETTING_BRIDGE_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PRIORITY "priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-FORWARD-DELAY:CAPS"></a><h3>NM_SETTING_BRIDGE_FORWARD_DELAY</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_FORWARD_DELAY "forward-delay"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-HELLO-TIME:CAPS"></a><h3>NM_SETTING_BRIDGE_HELLO_TIME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_HELLO_TIME "hello-time"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-MAX-AGE:CAPS"></a><h3>NM_SETTING_BRIDGE_MAX_AGE</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_MAX_AGE "max-age"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-AGEING-TIME:CAPS"></a><h3>NM_SETTING_BRIDGE_AGEING_TIME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_AGEING_TIME "ageing-time"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -477,7 +454,7 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--ageing-time"></a><h3>The <code class="literal">“ageing-time”</code> property</h3>
<pre class="programlisting"> “ageing-time” <span class="type">guint</span></pre>
-<p></p>
+<p>The Ethernet MAC address aging time, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 1000000</p>
<p>Default value: 300</p>
@@ -486,7 +463,7 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--forward-delay"></a><h3>The <code class="literal">“forward-delay”</code> property</h3>
<pre class="programlisting"> “forward-delay” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) forwarding delay, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 30</p>
<p>Default value: 15</p>
@@ -495,7 +472,7 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--hello-time"></a><h3>The <code class="literal">“hello-time”</code> property</h3>
<pre class="programlisting"> “hello-time” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) hello time, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 10</p>
<p>Default value: 2</p>
@@ -504,7 +481,9 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, the MAC address of bridge. When creating a new bridge, this
+MAC address will be set. When matching an existing (outside
+NetworkManager created) bridge, this MAC address must match.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -512,7 +491,7 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--max-age"></a><h3>The <code class="literal">“max-age”</code> property</h3>
<pre class="programlisting"> “max-age” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) maximum message age, in seconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 40</p>
<p>Default value: 20</p>
@@ -521,7 +500,9 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--priority"></a><h3>The <code class="literal">“priority”</code> property</h3>
<pre class="programlisting"> “priority” <span class="type">guint</span></pre>
-<p></p>
+<p>Sets the Spanning Tree Protocol (STP) priority for this bridge. Lower
+values are "better"; the lowest priority bridge will be elected the root
+bridge.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 65535</p>
<p>Default value: 32768</p>
@@ -530,14 +511,13 @@ nm_setting_bridge_get_ageing_time (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingBridge--stp"></a><h3>The <code class="literal">“stp”</code> property</h3>
<pre class="programlisting"> “stp” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Controls whether Spanning Tree Protocol (STP) is enabled for this bridge.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingBridgePort.html b/docs/libnm/html/NMSettingBridgePort.html
index c2c4f18bf..b6aee68e6 100644
--- a/docs/libnm/html/NMSettingBridgePort.html
+++ b/docs/libnm/html/NMSettingBridgePort.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingBridgePort</title>
+<title>NMSettingBridgePort: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingBridge.html" title="NMSettingBridge">
<link rel="next" href="NMSettingCdma.html" title="NMSettingCdma">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -178,7 +178,6 @@ nm_setting_bridge_port_get_priority (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.11.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridgePort.html#NMSettingBridgePort--priority" title="The “priority” property"><span class="type">“priority”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -204,7 +203,6 @@ nm_setting_bridge_port_get_path_cost (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.4.11.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridgePort.html#NMSettingBridgePort--path-cost" title="The “path-cost” property"><span class="type">“path-cost”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -231,7 +229,6 @@ nm_setting_bridge_port_get_hairpin_mode
<div class="refsect3">
<a name="id-1.4.11.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingBridgePort.html#NMSettingBridgePort--hairpin-mode" title="The “hairpin-mode” property"><span class="type">“hairpin-mode”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -241,32 +238,24 @@ nm_setting_bridge_port_get_hairpin_mode
<a name="NM-SETTING-BRIDGE-PORT-SETTING-NAME:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_SETTING_NAME "bridge-port"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-PRIORITY:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_PRIORITY "priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-PATH-COST:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_PATH_COST</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_PATH_COST "path-cost"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-BRIDGE-PORT-HAIRPIN-MODE:CAPS"></a><h3>NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE</h3>
<pre class="programlisting">#define NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE "hairpin-mode"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -274,7 +263,8 @@ nm_setting_bridge_port_get_hairpin_mode
<div class="refsect2">
<a name="NMSettingBridgePort--hairpin-mode"></a><h3>The <code class="literal">“hairpin-mode”</code> property</h3>
<pre class="programlisting"> “hairpin-mode” <span class="type">gboolean</span></pre>
-<p></p>
+<p>Enables or disabled "hairpin mode" for the port, which allows frames to
+be sent back out through the port the frame was received on.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -282,7 +272,8 @@ nm_setting_bridge_port_get_hairpin_mode
<div class="refsect2">
<a name="NMSettingBridgePort--path-cost"></a><h3>The <code class="literal">“path-cost”</code> property</h3>
<pre class="programlisting"> “path-cost” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) port cost for destinations via this
+port.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 65535</p>
<p>Default value: 100</p>
@@ -291,7 +282,7 @@ nm_setting_bridge_port_get_hairpin_mode
<div class="refsect2">
<a name="NMSettingBridgePort--priority"></a><h3>The <code class="literal">“priority”</code> property</h3>
<pre class="programlisting"> “priority” <span class="type">guint</span></pre>
-<p></p>
+<p>The Spanning Tree Protocol (STP) priority of this bridge port.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 63</p>
<p>Default value: 32</p>
@@ -299,7 +290,6 @@ nm_setting_bridge_port_get_hairpin_mode
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingCdma.html b/docs/libnm/html/NMSettingCdma.html
index 23dd41222..18180f06e 100644
--- a/docs/libnm/html/NMSettingCdma.html
+++ b/docs/libnm/html/NMSettingCdma.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingCdma</title>
+<title>NMSettingCdma: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingBridgePort.html" title="NMSettingBridgePort">
<link rel="next" href="NMSettingDcb.html" title="NMSettingDcb">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -170,7 +170,6 @@ nm_setting_cdma_new (<em class="parameter"><code><span class="type">void</span><
<div class="refsect3">
<a name="id-1.4.12.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingCdma.html" title="NMSettingCdma"><span class="type">NMSettingCdma</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -196,7 +195,6 @@ nm_setting_cdma_get_number (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.12.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingCdma.html#NMSettingCdma--number" title="The “number” property"><span class="type">“number”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -222,7 +220,6 @@ nm_setting_cdma_get_username (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.12.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingCdma.html#NMSettingCdma--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -248,7 +245,6 @@ nm_setting_cdma_get_password (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.12.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingCdma.html#NMSettingCdma--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -274,7 +270,6 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.12.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingCdma.html#NMSettingCdma--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -284,40 +279,30 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<a name="NM-SETTING-CDMA-SETTING-NAME:CAPS"></a><h3>NM_SETTING_CDMA_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_SETTING_NAME "cdma"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-NUMBER:CAPS"></a><h3>NM_SETTING_CDMA_NUMBER</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_NUMBER "number"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-USERNAME:CAPS"></a><h3>NM_SETTING_CDMA_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-PASSWORD:CAPS"></a><h3>NM_SETTING_CDMA_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CDMA-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_CDMA_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_CDMA_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -325,7 +310,9 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingCdma--number"></a><h3>The <code class="literal">“number”</code> property</h3>
<pre class="programlisting"> “number” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The number to dial to establish the connection to the CDMA-based mobile
+broadband network, if any. If not specified, the default number (<span class="type">777</span>)
+is used when required.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -333,7 +320,9 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingCdma--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to authenticate with the network, if required. Many
+providers do not require a password, or accept any password. But if a
+password is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -341,21 +330,22 @@ nm_setting_cdma_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingCdma--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingCdma.html#NMSettingCdma--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingCdma--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The username used to authenticate with the network, if required. Many
+providers do not require a username, or accept any username. But if a
+username is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingConnection.html b/docs/libnm/html/NMSettingConnection.html
index ebb16ae95..f33e2b888 100644
--- a/docs/libnm/html/NMSettingConnection.html
+++ b/docs/libnm/html/NMSettingConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingConnection</title>
+<title>NMSettingConnection: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSetting.html" title="NMSetting">
<link rel="next" href="NMSetting8021x.html" title="NMSetting8021x">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -188,6 +188,14 @@
</tr>
<tr>
<td class="function_type">
+<a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves"><span class="returnvalue">NMSettingConnectionAutoconnectSlaves</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="NMSettingConnection.html#nm-setting-connection-get-autoconnect-slaves" title="nm_setting_connection_get_autoconnect_slaves ()">nm_setting_connection_get_autoconnect_slaves</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
<span class="returnvalue">guint32</span>
</td>
<td class="function_name">
@@ -256,6 +264,11 @@
<td class="property_flags">Read / Write / Construct</td>
</tr>
<tr>
+<td class="property_type"><a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves"><span class="type">NMSettingConnectionAutoconnectSlaves</span></a></td>
+<td class="property_name"><a class="link" href="NMSettingConnection.html#NMSettingConnection--autoconnect-slaves" title="The “autoconnect-slaves” property">autoconnect-slaves</a></td>
+<td class="property_flags">Read / Write / Construct</td>
+</tr>
+<tr>
<td class="property_type"><span class="type">guint</span></td>
<td class="property_name"><a class="link" href="NMSettingConnection.html#NMSettingConnection--gateway-ping-timeout" title="The “gateway-ping-timeout” property">gateway-ping-timeout</a></td>
<td class="property_flags">Read / Write / Construct</td>
@@ -399,6 +412,10 @@
</tr>
<tr>
<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES:CAPS" title="NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES">NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
<td class="function_name"><a class="link" href="NMSettingConnection.html#NM-SETTING-CONNECTION-SECONDARIES:CAPS" title="NM_SETTING_CONNECTION_SECONDARIES">NM_SETTING_CONNECTION_SECONDARIES</a></td>
</tr>
<tr>
@@ -406,6 +423,10 @@
<td class="function_name"><a class="link" href="NMSettingConnection.html#NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS" title="NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT">NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT</a></td>
</tr>
<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves">NMSettingConnectionAutoconnectSlaves</a></td>
+</tr>
+<tr>
<td class="datatype_keyword">struct</td>
<td class="function_name"><a class="link" href="NMSettingConnection.html#NMSettingConnection-struct" title="struct NMSettingConnection">NMSettingConnection</a></td>
</tr>
@@ -414,7 +435,9 @@
</div>
<div class="refsect1">
<a name="NMSettingConnection.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen"> GObject
+<pre class="screen"> <a href="/usr/share/gtk-doc/html/gobject/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+ <span class="lineart">╰──</span> NMSettingConnectionAutoconnectSlaves
+ GObject
<span class="lineart">╰──</span> <a class="link" href="NMSetting.html" title="NMSetting">NMSetting</a>
<span class="lineart">╰──</span> NMSettingConnection
</pre>
@@ -436,7 +459,6 @@ nm_setting_connection_new (<em class="parameter"><code><span class="type">void</
<div class="refsect3">
<a name="id-1.4.5.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -463,7 +485,6 @@ nm_setting_connection_get_id (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.5.8.3.6"></a><h4>Returns</h4>
<p> the connection ID</p>
-<p></p>
</div>
</div>
<hr>
@@ -490,7 +511,6 @@ nm_setting_connection_get_uuid (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.5.8.4.6"></a><h4>Returns</h4>
<p> the connection UUID</p>
-<p></p>
</div>
</div>
<hr>
@@ -518,7 +538,6 @@ nm_setting_connection_get_interface_name
<div class="refsect3">
<a name="id-1.4.5.8.5.6"></a><h4>Returns</h4>
<p> the connection's interface name</p>
-<p></p>
</div>
</div>
<hr>
@@ -546,7 +565,6 @@ nm_setting_connection_get_connection_type
<div class="refsect3">
<a name="id-1.4.5.8.6.6"></a><h4>Returns</h4>
<p> the connection type</p>
-<p></p>
</div>
</div>
<hr>
@@ -573,7 +591,6 @@ nm_setting_connection_get_autoconnect (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.4.5.8.7.6"></a><h4>Returns</h4>
<p> the connection's autoconnect behavior</p>
-<p></p>
</div>
</div>
<hr>
@@ -602,7 +619,6 @@ The higher number, the higher priority.</p>
<div class="refsect3">
<a name="id-1.4.5.8.8.6"></a><h4>Returns</h4>
<p> the connection's autoconnect priority</p>
-<p></p>
</div>
</div>
<hr>
@@ -629,7 +645,6 @@ nm_setting_connection_get_timestamp (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.5.8.9.6"></a><h4>Returns</h4>
<p> the connection's timestamp</p>
-<p></p>
</div>
</div>
<hr>
@@ -656,7 +671,6 @@ nm_setting_connection_get_read_only (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.5.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is read-only, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -685,7 +699,6 @@ property of this setting.</p>
<div class="refsect3">
<a name="id-1.4.5.8.11.6"></a><h4>Returns</h4>
<p> the number of permissions entires</p>
-<p></p>
</div>
</div>
<hr>
@@ -742,7 +755,6 @@ of this setting.</p>
<a name="id-1.4.5.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if a permission was returned, <code class="literal">FALSE</code> if <em class="parameter"><code>idx</code></em>
was invalid</p>
-<p></p>
</div>
</div>
<hr>
@@ -769,7 +781,6 @@ nm_setting_connection_get_zone (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.5.8.13.6"></a><h4>Returns</h4>
<p> the trust level of a connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -806,7 +817,6 @@ nm_setting_connection_permissions_user_allowed
<a name="id-1.4.5.8.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the requested user is allowed to view this connection,
<code class="literal">FALSE</code> if the given user is not allowed to view this connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -861,7 +871,6 @@ list, <code class="literal">FALSE</code> if <em class="parameter"><code>ptype</c
or <em class="parameter"><code>pitem</code></em>
was invalid or it the permission was already
present in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -945,7 +954,6 @@ be a username. See <a class="link" href="NMSettingConnection.html#NMSettingConne
<div class="refsect3">
<a name="id-1.4.5.8.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the permission was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -973,7 +981,6 @@ nm_setting_connection_get_master (<em class="parameter"><code><a class="link" hr
<a name="id-1.4.5.8.18.6"></a><h4>Returns</h4>
<p> interface name of the master device or UUID of the master
connection.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1010,7 +1017,6 @@ against <em class="parameter"><code>setting</code></em>
<a name="id-1.4.5.8.19.5"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if connection is of the given slave <em class="parameter"><code>type</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1037,17 +1043,45 @@ nm_setting_connection_get_slave_type (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.4.5.8.20.6"></a><h4>Returns</h4>
<p> the type of slave this connection is, if any</p>
-<p></p>
</div>
</div>
<hr>
<div class="refsect2">
+<a name="nm-setting-connection-get-autoconnect-slaves"></a><h3>nm_setting_connection_get_autoconnect_slaves ()</h3>
+<pre class="programlisting"><a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves"><span class="returnvalue">NMSettingConnectionAutoconnectSlaves</span></a>
+nm_setting_connection_get_autoconnect_slaves
+ (<em class="parameter"><code><a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> *setting</code></em>);</pre>
+<p>Returns the <a class="link" href="NMSettingConnection.html#NMSettingConnection--autoconnect-slaves" title="The “autoconnect-slaves” property"><span class="type">“autoconnect-slaves”</span></a> property of the connection.</p>
+<div class="refsect3">
+<a name="id-1.4.5.8.21.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>setting</p></td>
+<td class="parameter_description"><p>the <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.4.5.8.21.6"></a><h4>Returns</h4>
+<p> whether slaves of the connection should be activated together
+with the connection.</p>
+</div>
+<p class="since">Since: 1.0.4</p>
+</div>
+<hr>
+<div class="refsect2">
<a name="nm-setting-connection-get-num-secondaries"></a><h3>nm_setting_connection_get_num_secondaries ()</h3>
<pre class="programlisting"><span class="returnvalue">guint32</span>
nm_setting_connection_get_num_secondaries
(<em class="parameter"><code><a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> *setting</code></em>);</pre>
<div class="refsect3">
-<a name="id-1.4.5.8.21.4"></a><h4>Parameters</h4>
+<a name="id-1.4.5.8.22.4"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1062,9 +1096,8 @@ nm_setting_connection_get_num_secondaries
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.4.5.8.21.5"></a><h4>Returns</h4>
+<a name="id-1.4.5.8.22.5"></a><h4>Returns</h4>
<p> the number of configured secondary connection UUIDs</p>
-<p></p>
</div>
</div>
<hr>
@@ -1074,7 +1107,7 @@ nm_setting_connection_get_num_secondaries
nm_setting_connection_get_secondary (<em class="parameter"><code><a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> *setting</code></em>,
<em class="parameter"><code><span class="type">guint32</span> idx</code></em>);</pre>
<div class="refsect3">
-<a name="id-1.4.5.8.22.4"></a><h4>Parameters</h4>
+<a name="id-1.4.5.8.23.4"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1096,10 +1129,9 @@ nm_setting_connection_get_secondary (<em class="parameter"><code><a class="link"
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.4.5.8.22.5"></a><h4>Returns</h4>
+<a name="id-1.4.5.8.23.5"></a><h4>Returns</h4>
<p> the secondary connection UUID at index <em class="parameter"><code>idx</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1110,7 +1142,7 @@ nm_setting_connection_add_secondary (<em class="parameter"><code><a class="link"
<em class="parameter"><code>const <span class="type">char</span> *sec_uuid</code></em>);</pre>
<p>Adds a new secondary connetion UUID to the setting.</p>
<div class="refsect3">
-<a name="id-1.4.5.8.23.5"></a><h4>Parameters</h4>
+<a name="id-1.4.5.8.24.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1132,10 +1164,9 @@ nm_setting_connection_add_secondary (<em class="parameter"><code><a class="link"
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.4.5.8.23.6"></a><h4>Returns</h4>
+<a name="id-1.4.5.8.24.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secondary connection UUID was added; <code class="literal">FALSE</code> if the UUID
was already present</p>
-<p></p>
</div>
</div>
<hr>
@@ -1148,7 +1179,7 @@ nm_setting_connection_remove_secondary
<p>Removes the secondary coonnection UUID at index <em class="parameter"><code>idx</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.4.5.8.24.5"></a><h4>Parameters</h4>
+<a name="id-1.4.5.8.25.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1180,7 +1211,7 @@ nm_setting_connection_remove_secondary_by_value
<p>Removes the secondary coonnection UUID <em class="parameter"><code>sec_uuid</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.4.5.8.25.5"></a><h4>Parameters</h4>
+<a name="id-1.4.5.8.26.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1202,9 +1233,8 @@ nm_setting_connection_remove_secondary_by_value
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.4.5.8.25.6"></a><h4>Returns</h4>
+<a name="id-1.4.5.8.26.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secondary connection UUID was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1214,7 +1244,7 @@ nm_setting_connection_remove_secondary_by_value
nm_setting_connection_get_gateway_ping_timeout
(<em class="parameter"><code><a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a> *setting</code></em>);</pre>
<div class="refsect3">
-<a name="id-1.4.5.8.26.4"></a><h4>Parameters</h4>
+<a name="id-1.4.5.8.27.4"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1229,10 +1259,9 @@ nm_setting_connection_get_gateway_ping_timeout
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.4.5.8.26.5"></a><h4>Returns</h4>
+<a name="id-1.4.5.8.27.5"></a><h4>Returns</h4>
<p> the value contained in the <a class="link" href="NMSettingConnection.html#NMSettingConnection--gateway-ping-timeout" title="The “gateway-ping-timeout” property"><span class="type">“gateway-ping-timeout”</span></a>
property.</p>
-<p></p>
</div>
</div>
</div>
@@ -1242,144 +1271,155 @@ property.</p>
<a name="NM-SETTING-CONNECTION-SETTING-NAME:CAPS"></a><h3>NM_SETTING_CONNECTION_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_SETTING_NAME "connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-AUTOCONNECT-PRIORITY-MIN:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MIN</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MIN -999
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-AUTOCONNECT-PRIORITY-MAX:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MAX</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MAX 999
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-AUTOCONNECT-PRIORITY-DEFAULT:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_DEFAULT</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_DEFAULT 0
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-ID:CAPS"></a><h3>NM_SETTING_CONNECTION_ID</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_ID "id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-UUID:CAPS"></a><h3>NM_SETTING_CONNECTION_UUID</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_UUID "uuid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-INTERFACE-NAME:CAPS"></a><h3>NM_SETTING_CONNECTION_INTERFACE_NAME</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_INTERFACE_NAME "interface-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-TYPE:CAPS"></a><h3>NM_SETTING_CONNECTION_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_TYPE "type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-AUTOCONNECT:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT "autoconnect"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-AUTOCONNECT-PRIORITY:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY "autoconnect-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-TIMESTAMP:CAPS"></a><h3>NM_SETTING_CONNECTION_TIMESTAMP</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_TIMESTAMP "timestamp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-READ-ONLY:CAPS"></a><h3>NM_SETTING_CONNECTION_READ_ONLY</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_READ_ONLY "read-only"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-PERMISSIONS:CAPS"></a><h3>NM_SETTING_CONNECTION_PERMISSIONS</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_PERMISSIONS "permissions"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-ZONE:CAPS"></a><h3>NM_SETTING_CONNECTION_ZONE</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_ZONE "zone"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-MASTER:CAPS"></a><h3>NM_SETTING_CONNECTION_MASTER</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_MASTER "master"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-SLAVE-TYPE:CAPS"></a><h3>NM_SETTING_CONNECTION_SLAVE_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_SLAVE_TYPE "slave-type"
</pre>
-<p>
-</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES:CAPS"></a><h3>NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES</h3>
+<pre class="programlisting">#define NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES "autoconnect-slaves"
+</pre>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-SECONDARIES:CAPS"></a><h3>NM_SETTING_CONNECTION_SECONDARIES</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_SECONDARIES "secondaries"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS"></a><h3>NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT</h3>
<pre class="programlisting">#define NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT "gateway-ping-timeout"
</pre>
-<p>
-</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="NMSettingConnectionAutoconnectSlaves"></a><h3>enum NMSettingConnectionAutoconnectSlaves</h3>
+<p><a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves"><span class="type">NMSettingConnectionAutoconnectSlaves</span></a> values indicate whether slave connections
+should be activated when master is activated.</p>
+<div class="refsect3">
+<a name="id-1.4.5.9.21.4"></a><h4>Members</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-DEFAULT:CAPS"></a>NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT</p></td>
+<td class="enum_member_description">
+<p>default value</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-NO:CAPS"></a>NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO</p></td>
+<td class="enum_member_description">
+<p>slaves are not brought up when
+ master is activated</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-YES:CAPS"></a>NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES</p></td>
+<td class="enum_member_description">
+<p>slaves are brought up when
+ master is activated</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
</div>
<hr>
<div class="refsect2">
@@ -1414,12 +1454,27 @@ The higher number means higher priority.</p>
</div>
<hr>
<div class="refsect2">
+<a name="NMSettingConnection--autoconnect-slaves"></a><h3>The <code class="literal">“autoconnect-slaves”</code> property</h3>
+<pre class="programlisting"> “autoconnect-slaves” <a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves"><span class="type">NMSettingConnectionAutoconnectSlaves</span></a></pre>
+<p>Whether or not slaves of this connection should be automatically brought up
+when NetworkManager activates this connection. This only has a real effect
+for master connections.
+The permitted values are: 0: leave slave connections untouched,
+1: activate all the slave connections with this connection, -1: default.
+If -1 (default) is set, global connection.autoconnect-slaves is read to
+determine the real value. If it is default as well, this fallbacks to 0.</p>
+<p>Flags: Read / Write / Construct</p>
+<p>Default value: NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT</p>
+<p class="since">Since: 1.0.4</p>
+</div>
+<hr>
+<div class="refsect2">
<a name="NMSettingConnection--gateway-ping-timeout"></a><h3>The <code class="literal">“gateway-ping-timeout”</code> property</h3>
<pre class="programlisting"> “gateway-ping-timeout” <span class="type">guint</span></pre>
<p>If greater than zero, delay success of IP addressing until either the
timeout is reached, or an IP gateway replies to a ping.</p>
<p>Flags: Read / Write / Construct</p>
-<p>Allowed values: &lt;= 30</p>
+<p>Allowed values: &lt;= 600</p>
<p>Default value: 0</p>
</div>
<hr>
@@ -1557,7 +1612,6 @@ firewall.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingDcb.html b/docs/libnm/html/NMSettingDcb.html
index ebfedd697..a662d1087 100644
--- a/docs/libnm/html/NMSettingDcb.html
+++ b/docs/libnm/html/NMSettingDcb.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingDcb</title>
+<title>NMSettingDcb: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingCdma.html" title="NMSettingCdma">
<link rel="next" href="NMSettingGeneric.html" title="NMSettingGeneric">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -453,7 +453,6 @@ nm_setting_dcb_get_app_fcoe_flags (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.4.13.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-flags" title="The “app-fcoe-flags” property"><span class="type">“app-fcoe-flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -479,7 +478,6 @@ nm_setting_dcb_get_app_fcoe_priority (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.4.13.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-priority" title="The “app-fcoe-priority” property"><span class="type">“app-fcoe-priority”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -505,7 +503,6 @@ nm_setting_dcb_get_app_fcoe_mode (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.13.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-mode" title="The “app-fcoe-mode” property"><span class="type">“app-fcoe-mode”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -531,7 +528,6 @@ nm_setting_dcb_get_app_iscsi_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.13.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-iscsi-flags" title="The “app-iscsi-flags” property"><span class="type">“app-iscsi-flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -557,7 +553,6 @@ nm_setting_dcb_get_app_iscsi_priority (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.4.13.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-iscsi-priority" title="The “app-iscsi-priority” property"><span class="type">“app-iscsi-priority”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -583,7 +578,6 @@ nm_setting_dcb_get_app_fip_flags (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.13.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fip-flags" title="The “app-fip-flags” property"><span class="type">“app-fip-flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -609,7 +603,6 @@ nm_setting_dcb_get_app_fip_priority (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.13.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fip-priority" title="The “app-fip-priority” property"><span class="type">“app-fip-priority”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -636,7 +629,6 @@ nm_setting_dcb_get_priority_flow_control_flags
<div class="refsect3">
<a name="id-1.4.13.8.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-flow-control-flags" title="The “priority-flow-control-flags” property"><span class="type">“priority-flow-control-flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -673,7 +665,6 @@ nm_setting_dcb_get_priority_flow_control
<p> <code class="literal">TRUE</code> if flow control is enabled for the given <em class="parameter"><code>user_priority</code></em>
,
<code class="literal">FALSE</code> if not enabled</p>
-<p></p>
</div>
</div>
<hr>
@@ -738,7 +729,6 @@ nm_setting_dcb_get_priority_group_flags
<div class="refsect3">
<a name="id-1.4.13.8.13.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -775,7 +765,6 @@ nm_setting_dcb_get_priority_group_id (<em class="parameter"><code><a class="link
is assigned to. These values are
only valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
</div>
<hr>
@@ -852,7 +841,6 @@ nm_setting_dcb_get_priority_group_bandwidth
. These values are
only valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
</div>
<hr>
@@ -928,7 +916,6 @@ nm_setting_dcb_get_priority_bandwidth (<em class="parameter"><code><a class="lin
in its priority group.
These values are only valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1005,7 +992,6 @@ nm_setting_dcb_get_priority_strict_bandwidth
may use all of the bandwidth allocated to its
assigned group, or <code class="literal">FALSE</code> if not. These values are only valid when
<a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1083,7 +1069,6 @@ nm_setting_dcb_get_priority_traffic_class
. These values are only
valid when <a class="link" href="NMSettingDcb.html#NMSettingDcb--priority-group-flags" title="The “priority-group-flags” property"><span class="type">“priority-group-flags”</span></a> includes the
<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1094,8 +1079,6 @@ nm_setting_dcb_set_priority_traffic_class
(<em class="parameter"><code><a class="link" href="NMSettingDcb.html" title="NMSettingDcb"><span class="type">NMSettingDcb</span></a> *setting</code></em>,
<em class="parameter"><code><span class="type">guint</span> user_priority</code></em>,
<em class="parameter"><code><span class="type">guint</span> traffic_class</code></em>);</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1104,8 +1087,6 @@ nm_setting_dcb_set_priority_traffic_class
<a name="NM-SETTING-DCB-SETTING-NAME:CAPS"></a><h3>NM_SETTING_DCB_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_DCB_SETTING_NAME "dcb"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1172,120 +1153,90 @@ peer configuration advertisements</p>
<a name="NM-SETTING-DCB-APP-FCOE-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_APP_FCOE_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FCOE_FLAGS "app-fcoe-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FCOE-PRIORITY:CAPS"></a><h3>NM_SETTING_DCB_APP_FCOE_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FCOE_PRIORITY "app-fcoe-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FCOE-MODE:CAPS"></a><h3>NM_SETTING_DCB_APP_FCOE_MODE</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FCOE_MODE "app-fcoe-mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-ISCSI-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_APP_ISCSI_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_ISCSI_FLAGS "app-iscsi-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-ISCSI-PRIORITY:CAPS"></a><h3>NM_SETTING_DCB_APP_ISCSI_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_ISCSI_PRIORITY "app-iscsi-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FIP-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_APP_FIP_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FIP_FLAGS "app-fip-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-APP-FIP-PRIORITY:CAPS"></a><h3>NM_SETTING_DCB_APP_FIP_PRIORITY</h3>
<pre class="programlisting">#define NM_SETTING_DCB_APP_FIP_PRIORITY "app-fip-priority"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-FLOW-CONTROL-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS "priority-flow-control-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-FLOW-CONTROL:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_FLOW_CONTROL</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_FLOW_CONTROL "priority-flow-control"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-GROUP-FLAGS:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_GROUP_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_GROUP_FLAGS "priority-group-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-GROUP-ID:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_GROUP_ID</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_GROUP_ID "priority-group-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-GROUP-BANDWIDTH:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH "priority-group-bandwidth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-BANDWIDTH:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_BANDWIDTH</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_BANDWIDTH "priority-bandwidth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-STRICT-BANDWIDTH:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH "priority-strict-bandwidth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-DCB-PRIORITY-TRAFFIC-CLASS:CAPS"></a><h3>NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS</h3>
<pre class="programlisting">#define NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS "priority-traffic-class"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1293,14 +1244,17 @@ peer configuration advertisements</p>
<div class="refsect2">
<a name="NMSettingDcb--app-fcoe-flags"></a><h3>The <code class="literal">“app-fcoe-flags”</code> property</h3>
<pre class="programlisting"> “app-fcoe-flags” <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for the DCB FCoE application. Flags may
+be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-fcoe-mode"></a><h3>The <code class="literal">“app-fcoe-mode”</code> property</h3>
<pre class="programlisting"> “app-fcoe-mode” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The FCoE controller mode; either <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-FABRIC:CAPS" title="NM_SETTING_DCB_FCOE_MODE_FABRIC"><code class="literal">NM_SETTING_DCB_FCOE_MODE_FABRIC</code></a>
+(default) or <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-VN2VN:CAPS" title="NM_SETTING_DCB_FCOE_MODE_VN2VN"><code class="literal">NM_SETTING_DCB_FCOE_MODE_VN2VN</code></a>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: "fabric"</p>
</div>
@@ -1308,7 +1262,9 @@ peer configuration advertisements</p>
<div class="refsect2">
<a name="NMSettingDcb--app-fcoe-priority"></a><h3>The <code class="literal">“app-fcoe-priority”</code> property</h3>
<pre class="programlisting"> “app-fcoe-priority” <span class="type">gint</span></pre>
-<p></p>
+<p>The highest User Priority (0 - 7) which FCoE frames should use, or -1 for
+default priority. Only used when the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-flags" title="The “app-fcoe-flags” property"><span class="type">“app-fcoe-flags”</span></a>
+property includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,7]</p>
<p>Default value: -1</p>
@@ -1317,14 +1273,18 @@ peer configuration advertisements</p>
<div class="refsect2">
<a name="NMSettingDcb--app-fip-flags"></a><h3>The <code class="literal">“app-fip-flags”</code> property</h3>
<pre class="programlisting"> “app-fip-flags” <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for the DCB FIP application. Flags may
+be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-fip-priority"></a><h3>The <code class="literal">“app-fip-priority”</code> property</h3>
<pre class="programlisting"> “app-fip-priority” <span class="type">gint</span></pre>
-<p></p>
+<p>The highest User Priority (0 - 7) which FIP frames should use, or -1 for
+default priority. Only used when the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fip-flags" title="The “app-fip-flags” property"><span class="type">“app-fip-flags”</span></a>
+property includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,7]</p>
<p>Default value: -1</p>
@@ -1333,14 +1293,18 @@ peer configuration advertisements</p>
<div class="refsect2">
<a name="NMSettingDcb--app-iscsi-flags"></a><h3>The <code class="literal">“app-iscsi-flags”</code> property</h3>
<pre class="programlisting"> “app-iscsi-flags” <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for the DCB iSCSI application. Flags
+may be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--app-iscsi-priority"></a><h3>The <code class="literal">“app-iscsi-priority”</code> property</h3>
<pre class="programlisting"> “app-iscsi-priority” <span class="type">gint</span></pre>
-<p></p>
+<p>The highest User Priority (0 - 7) which iSCSI frames should use, or -1
+for default priority. Only used when the <a class="link" href="NMSettingDcb.html#NMSettingDcb--app-iscsi-flags" title="The “app-iscsi-flags” property"><span class="type">“app-iscsi-flags”</span></a>
+property includes the <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a> flag.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,7]</p>
<p>Default value: -1</p>
@@ -1349,62 +1313,86 @@ peer configuration advertisements</p>
<div class="refsect2">
<a name="NMSettingDcb--priority-bandwidth"></a><h3>The <code class="literal">“priority-bandwidth”</code> property</h3>
<pre class="programlisting"> “priority-bandwidth” <span class="type">GArray</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates the percentage of bandwidth of
+the priority's assigned group that the priority may use. The sum of all
+percentages for priorities which belong to the same group must total 100
+percent.</p>
+<p>Element-type: guint</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-flow-control"></a><h3>The <code class="literal">“priority-flow-control”</code> property</h3>
<pre class="programlisting"> “priority-flow-control” <span class="type">GArray</span> *</pre>
-<p></p>
+<p>An array of 8 boolean values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates whether or not the corresponding
+priority should transmit priority pause.</p>
+<p>Element-type: gboolean</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-flow-control-flags"></a><h3>The <code class="literal">“priority-flow-control-flags”</code> property</h3>
<pre class="programlisting"> “priority-flow-control-flags” <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for DCB Priority Flow Control (PFC).
+Flags may be any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-group-bandwidth"></a><h3>The <code class="literal">“priority-group-bandwidth”</code> property</h3>
<pre class="programlisting"> “priority-group-bandwidth” <span class="type">GArray</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the
+Priority Group ID (0 - 7) and the value indicates the percentage of link
+bandwidth allocated to that group. Allowed values are 0 - 100, and the
+sum of all values must total 100 percent.</p>
+<p>Element-type: guint</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-group-flags"></a><h3>The <code class="literal">“priority-group-flags”</code> property</h3>
<pre class="programlisting"> “priority-group-flags” <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a></pre>
-<p></p>
+<p>Specifies the <a class="link" href="NMSettingDcb.html#NMSettingDcbFlags" title="enum NMSettingDcbFlags"><span class="type">NMSettingDcbFlags</span></a> for DCB Priority Groups. Flags may be
+any combination of <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ENABLE</code></a>,
+<a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_ADVERTISE</code></a>, and <a class="link" href="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"><code class="literal">NM_SETTING_DCB_FLAG_WILLING</code></a>.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-group-id"></a><h3>The <code class="literal">“priority-group-id”</code> property</h3>
<pre class="programlisting"> “priority-group-id” <span class="type">GArray</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates the Priority Group ID. Allowed
+Priority Group ID values are 0 - 7 or 15 for the unrestricted group.</p>
+<p>Element-type: guint</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-strict-bandwidth"></a><h3>The <code class="literal">“priority-strict-bandwidth”</code> property</h3>
<pre class="programlisting"> “priority-strict-bandwidth” <span class="type">GArray</span> *</pre>
-<p></p>
+<p>An array of 8 boolean values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates whether or not the priority may
+use all of the bandwidth allocated to its assigned group.</p>
+<p>Element-type: gboolean</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingDcb--priority-traffic-class"></a><h3>The <code class="literal">“priority-traffic-class”</code> property</h3>
<pre class="programlisting"> “priority-traffic-class” <span class="type">GArray</span> *</pre>
-<p></p>
+<p>An array of 8 uint values, where the array index corresponds to the User
+Priority (0 - 7) and the value indicates the traffic class (0 - 7) to
+which the priority is mapped.</p>
+<p>Element-type: guint</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingGeneric.html b/docs/libnm/html/NMSettingGeneric.html
index 13bf6b873..f19755974 100644
--- a/docs/libnm/html/NMSettingGeneric.html
+++ b/docs/libnm/html/NMSettingGeneric.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingGeneric</title>
+<title>NMSettingGeneric: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingDcb.html" title="NMSettingDcb">
<link rel="next" href="NMSettingGsm.html" title="NMSettingGsm">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -97,13 +97,10 @@ nm_setting_generic_new (<em class="parameter"><code><span class="type">void</spa
<a name="NM-SETTING-GENERIC-SETTING-NAME:CAPS"></a><h3>NM_SETTING_GENERIC_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_GENERIC_SETTING_NAME "generic"
</pre>
-<p>
-</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingGsm.html b/docs/libnm/html/NMSettingGsm.html
index 2da1fa2ef..bee69df61 100644
--- a/docs/libnm/html/NMSettingGsm.html
+++ b/docs/libnm/html/NMSettingGsm.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingGsm</title>
+<title>NMSettingGsm: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingGeneric.html" title="NMSettingGeneric">
<link rel="next" href="NMSettingInfiniband.html" title="NMSettingInfiniband">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -255,7 +255,6 @@ nm_setting_gsm_new (<em class="parameter"><code><span class="type">void</span></
<div class="refsect3">
<a name="id-1.4.15.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingGsm.html" title="NMSettingGsm"><span class="type">NMSettingGsm</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -281,7 +280,6 @@ nm_setting_gsm_get_number (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.4.15.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--number" title="The “number” property"><span class="type">“number”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -307,7 +305,6 @@ nm_setting_gsm_get_username (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.4.15.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -333,7 +330,6 @@ nm_setting_gsm_get_password (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.4.15.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -359,7 +355,6 @@ nm_setting_gsm_get_apn (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.4.15.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--apn" title="The “apn” property"><span class="type">“apn”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -385,7 +380,6 @@ nm_setting_gsm_get_network_id (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.15.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--network-id" title="The “network-id” property"><span class="type">“network-id”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -411,7 +405,6 @@ nm_setting_gsm_get_pin (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.4.15.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--pin" title="The “pin” property"><span class="type">“pin”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -437,7 +430,6 @@ nm_setting_gsm_get_home_only (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.15.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingGsm.html#NMSettingGsm--home-only" title="The “home-only” property"><span class="type">“home-only”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -463,7 +455,6 @@ nm_setting_gsm_get_pin_flags (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.15.8.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingGsm.html#NMSettingGsm--pin" title="The “pin” property"><span class="type">“pin”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -489,7 +480,6 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.4.15.8.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingGsm.html#NMSettingGsm--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -499,80 +489,60 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<a name="NM-SETTING-GSM-SETTING-NAME:CAPS"></a><h3>NM_SETTING_GSM_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_GSM_SETTING_NAME "gsm"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-NUMBER:CAPS"></a><h3>NM_SETTING_GSM_NUMBER</h3>
<pre class="programlisting">#define NM_SETTING_GSM_NUMBER "number"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-USERNAME:CAPS"></a><h3>NM_SETTING_GSM_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_GSM_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PASSWORD:CAPS"></a><h3>NM_SETTING_GSM_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_GSM_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-APN:CAPS"></a><h3>NM_SETTING_GSM_APN</h3>
<pre class="programlisting">#define NM_SETTING_GSM_APN "apn"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-NETWORK-ID:CAPS"></a><h3>NM_SETTING_GSM_NETWORK_ID</h3>
<pre class="programlisting">#define NM_SETTING_GSM_NETWORK_ID "network-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PIN:CAPS"></a><h3>NM_SETTING_GSM_PIN</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PIN "pin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-PIN-FLAGS:CAPS"></a><h3>NM_SETTING_GSM_PIN_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_GSM_PIN_FLAGS "pin-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-GSM-HOME-ONLY:CAPS"></a><h3>NM_SETTING_GSM_HOME_ONLY</h3>
<pre class="programlisting">#define NM_SETTING_GSM_HOME_ONLY "home-only"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -580,7 +550,13 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--apn"></a><h3>The <code class="literal">“apn”</code> property</h3>
<pre class="programlisting"> “apn” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The GPRS Access Point Name specifying the APN used when establishing a
+data session with the GSM-based network. The APN often determines how
+the user will be billed for their network usage and whether the user has
+access to the Internet or just a provider-specific walled-garden, so it
+is important to use the correct APN for the user's mobile broadband plan.
+The APN may only be composed of the characters a-z, 0-9, ., and - per GSM
+03.60 Section 14.9.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -588,7 +564,8 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--home-only"></a><h3>The <code class="literal">“home-only”</code> property</h3>
<pre class="programlisting"> “home-only” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <code class="literal">TRUE</code>, only connections to the home network will be allowed.
+Connections to roaming networks will not be made.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -596,7 +573,11 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--network-id"></a><h3>The <code class="literal">“network-id”</code> property</h3>
<pre class="programlisting"> “network-id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The Network ID (GSM LAI format, ie MCC-MNC) to force specific network
+registration. If the Network ID is specified, NetworkManager will
+attempt to force the device to register only on the specified network.
+This can be used to ensure that the device does not roam when direct
+roaming control of the device is not otherwise possible.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -604,7 +585,10 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--number"></a><h3>The <code class="literal">“number”</code> property</h3>
<pre class="programlisting"> “number” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Number to dial when establishing a PPP data session with the GSM-based
+mobile broadband network. Many modems do not require PPP for connections
+to the mobile network and thus this property should be left blank, which
+allows NetworkManager to select the appropriate settings automatically.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -612,7 +596,9 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The password used to authenticate with the network, if required. Many
+providers do not require a password, or accept any password. But if a
+password is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -620,14 +606,16 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingGsm.html#NMSettingGsm--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingGsm--pin"></a><h3>The <code class="literal">“pin”</code> property</h3>
<pre class="programlisting"> “pin” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the SIM is locked with a PIN it must be unlocked before any other
+operations are requested. Specify the PIN here to allow operation of the
+device.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -635,21 +623,22 @@ nm_setting_gsm_get_password_flags (<em class="parameter"><code><a class="link" h
<div class="refsect2">
<a name="NMSettingGsm--pin-flags"></a><h3>The <code class="literal">“pin-flags”</code> property</h3>
<pre class="programlisting"> “pin-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingGsm.html#NMSettingGsm--pin" title="The “pin” property"><span class="type">“pin”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingGsm--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The username used to authenticate with the network, if required. Many
+providers do not require a username, or accept any username. But if a
+username is required, it is specified here.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingIP4Config.html b/docs/libnm/html/NMSettingIP4Config.html
index 95b3dc6d8..9a40fd47c 100644
--- a/docs/libnm/html/NMSettingIP4Config.html
+++ b/docs/libnm/html/NMSettingIP4Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingIP4Config</title>
+<title>NMSettingIP4Config: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingIPConfig.html" title="NMSettingIPConfig">
<link rel="next" href="NMSettingIP6Config.html" title="NMSettingIP6Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -181,7 +181,6 @@ property.</p>
<a name="id-1.4.18.8.3.6"></a><h4>Returns</h4>
<p> the configured Client ID to send to the DHCP server when requesting
addresses via DHCP.</p>
-<p></p>
</div>
</div>
</div>
@@ -191,16 +190,12 @@ addresses via DHCP.</p>
<a name="NM-SETTING-IP4-CONFIG-SETTING-NAME:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_SETTING_NAME "ipv4"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP4-CONFIG-DHCP-CLIENT-ID:CAPS"></a><h3>NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID</h3>
<pre class="programlisting">#define NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID "dhcp-client-id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -252,14 +247,14 @@ through that interface to the default network.</p>
<div class="refsect2">
<a name="NMSettingIP4Config--dhcp-client-id"></a><h3>The <code class="literal">“dhcp-client-id”</code> property</h3>
<pre class="programlisting"> “dhcp-client-id” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>A string sent to the DHCP server to identify the local machine which the
+DHCP server may use to customize the DHCP lease and options.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingIP6Config.html b/docs/libnm/html/NMSettingIP6Config.html
index 75c33f7f9..7d4408c72 100644
--- a/docs/libnm/html/NMSettingIP6Config.html
+++ b/docs/libnm/html/NMSettingIP6Config.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingIP6Config</title>
+<title>NMSettingIP6Config: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingIP4Config.html" title="NMSettingIP4Config">
<link rel="next" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -187,7 +187,6 @@ property.</p>
<div class="refsect3">
<a name="id-1.4.19.8.3.6"></a><h4>Returns</h4>
<p> IPv6 Privacy Extensions configuration value (<a class="link" href="NMSettingIP6Config.html#NMSettingIP6ConfigPrivacy" title="enum NMSettingIP6ConfigPrivacy"><span class="type">NMSettingIP6ConfigPrivacy</span></a>).</p>
-<p></p>
</div>
</div>
</div>
@@ -197,16 +196,12 @@ property.</p>
<a name="NM-SETTING-IP6-CONFIG-SETTING-NAME:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_SETTING_NAME "ipv6"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP6-CONFIG-IP6-PRIVACY:CAPS"></a><h3>NM_SETTING_IP6_CONFIG_IP6_PRIVACY</h3>
<pre class="programlisting">#define NM_SETTING_IP6_CONFIG_IP6_PRIVACY "ip6-privacy"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -316,14 +311,23 @@ are enabled and temporary addresses are preferred over public addresses</p>
<div class="refsect2">
<a name="NMSettingIP6Config--ip6-privacy"></a><h3>The <code class="literal">“ip6-privacy”</code> property</h3>
<pre class="programlisting"> “ip6-privacy” <a class="link" href="NMSettingIP6Config.html#NMSettingIP6ConfigPrivacy" title="enum NMSettingIP6ConfigPrivacy"><span class="type">NMSettingIP6ConfigPrivacy</span></a></pre>
-<p></p>
+<p>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If
+enabled, it makes the kernel generate a temporary IPv6 address in
+addition to the public one generated from MAC address via modified
+EUI-64. This enhances privacy, but could cause problems in some
+applications, on the other hand. The permitted values are: -1: unknown,
+0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary
+addresses).</p>
+<p>Having a per-connection setting set to "-1" (unknown) means fallback to
+global configuration "ipv6.ip6-privacy".</p>
+<p>If also global configuration is unspecified or set to "-1", fallback to read
+"/proc/sys/net/ipv6/conf/default/use_tempaddr".</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingIPConfig.html b/docs/libnm/html/NMSettingIPConfig.html
index ae386b277..9ec050954 100644
--- a/docs/libnm/html/NMSettingIPConfig.html
+++ b/docs/libnm/html/NMSettingIPConfig.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingIPConfig</title>
+<title>NMSettingIPConfig: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingInfiniband.html" title="NMSettingInfiniband">
<link rel="next" href="NMSettingIP4Config.html" title="NMSettingIP4Config">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -952,7 +952,6 @@ to.</p></td>
<div class="refsect3">
<a name="id-1.4.17.11.6.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the objects contain the same values, <code class="literal">FALSE</code> if they do not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1009,7 +1008,6 @@ object.</p>
<div class="refsect3">
<a name="id-1.4.17.11.8.6"></a><h4>Returns</h4>
<p> the IP address family</p>
-<p></p>
</div>
</div>
<hr>
@@ -1036,7 +1034,6 @@ nm_ip_address_get_address (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.4.17.11.9.6"></a><h4>Returns</h4>
<p> the IP address</p>
-<p></p>
</div>
</div>
<hr>
@@ -1083,8 +1080,9 @@ nm_ip_address_get_address_binary (<em class="parameter"><code><a class="link" hr
<p><em class="parameter"><code>addr</code></em>
must point to a buffer that is the correct size for <em class="parameter"><code>address</code></em>
's family.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.4.17.11.11.6"></a><h4>Parameters</h4>
+<a name="id-1.4.17.11.11.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1116,8 +1114,9 @@ nm_ip_address_set_address_binary (<em class="parameter"><code><a class="link" hr
<p><em class="parameter"><code>addr</code></em>
must point to a buffer that is the correct size for <em class="parameter"><code>address</code></em>
's family.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.4.17.11.12.6"></a><h4>Parameters</h4>
+<a name="id-1.4.17.11.12.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1164,7 +1163,6 @@ object.</p>
<div class="refsect3">
<a name="id-1.4.17.11.13.6"></a><h4>Returns</h4>
<p> the IP address prefix</p>
-<p></p>
</div>
</div>
<hr>
@@ -1506,7 +1504,6 @@ to.</p></td>
<div class="refsect3">
<a name="id-1.4.17.11.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the objects contain the same values, <code class="literal">FALSE</code> if they do not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1563,7 +1560,6 @@ object.</p>
<div class="refsect3">
<a name="id-1.4.17.11.24.6"></a><h4>Returns</h4>
<p> the IP address family</p>
-<p></p>
</div>
</div>
<hr>
@@ -1590,7 +1586,6 @@ nm_ip_route_get_dest (<em class="parameter"><code><a class="link" href="NMSettin
<div class="refsect3">
<a name="id-1.4.17.11.25.6"></a><h4>Returns</h4>
<p> the IP address of the route's destination</p>
-<p></p>
</div>
</div>
<hr>
@@ -1637,8 +1632,9 @@ nm_ip_route_get_dest_binary (<em class="parameter"><code><a class="link" href="N
<p><em class="parameter"><code>dest</code></em>
must point to a buffer that is the correct size for <em class="parameter"><code>route</code></em>
's family.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.4.17.11.27.6"></a><h4>Parameters</h4>
+<a name="id-1.4.17.11.27.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1670,8 +1666,9 @@ nm_ip_route_set_dest_binary (<em class="parameter"><code><a class="link" href="N
<p><em class="parameter"><code>dest</code></em>
must point to a buffer that is the correct size for <em class="parameter"><code>route</code></em>
's family.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.4.17.11.28.6"></a><h4>Parameters</h4>
+<a name="id-1.4.17.11.28.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1717,7 +1714,6 @@ nm_ip_route_get_prefix (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.4.17.11.29.6"></a><h4>Returns</h4>
<p> the IP prefix</p>
-<p></p>
</div>
</div>
<hr>
@@ -1775,7 +1771,6 @@ route has no next hop.</p>
<div class="refsect3">
<a name="id-1.4.17.11.31.6"></a><h4>Returns</h4>
<p> the IP address of the next hop, or <code class="literal">NULL</code> if this is a device route.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1823,8 +1818,9 @@ nm_ip_route_get_next_hop_binary (<em class="parameter"><code><a class="link" hre
<p><em class="parameter"><code>next_hop</code></em>
must point to a buffer that is the correct size for <em class="parameter"><code>route</code></em>
's family.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.4.17.11.33.6"></a><h4>Parameters</h4>
+<a name="id-1.4.17.11.33.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1846,12 +1842,11 @@ nm_ip_route_get_next_hop_binary (<em class="parameter"><code><a class="link" hre
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.4.17.11.33.7"></a><h4>Returns</h4>
+<a name="id-1.4.17.11.33.8"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>route</code></em>
has a next hop, <code class="literal">FALSE</code> if not (in which case
<em class="parameter"><code>next_hop</code></em>
will be zeroed out)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1865,8 +1860,9 @@ nm_ip_route_set_next_hop_binary (<em class="parameter"><code><a class="link" hre
(if non-<code class="literal">NULL</code>) must point to a buffer that is the correct size for
<em class="parameter"><code>route</code></em>
's family.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.4.17.11.34.6"></a><h4>Parameters</h4>
+<a name="id-1.4.17.11.34.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1914,7 +1910,6 @@ indicate "better" or more preferred routes; -1 indicates "default"
<div class="refsect3">
<a name="id-1.4.17.11.35.6"></a><h4>Returns</h4>
<p> the route metric</p>
-<p></p>
</div>
</div>
<hr>
@@ -2078,7 +2073,6 @@ nm_setting_ip_config_get_method (<em class="parameter"><code><a class="link" hre
<p> the <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--method" title="The “method” property"><span class="type">“method”</span></a> property of the setting; see
<a class="link" href="NMSettingIP4Config.html" title="NMSettingIP4Config"><span class="type">NMSettingIP4Config</span></a> and <a class="link" href="NMSettingIP6Config.html" title="NMSettingIP6Config"><span class="type">NMSettingIP6Config</span></a> for details of the
methods available with each type.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2104,7 +2098,6 @@ nm_setting_ip_config_get_num_dns (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.17.11.41.5"></a><h4>Returns</h4>
<p> the number of configured DNS servers</p>
-<p></p>
</div>
</div>
<hr>
@@ -2139,7 +2132,6 @@ nm_setting_ip_config_get_dns (<em class="parameter"><code><a class="link" href="
<a name="id-1.4.17.11.42.5"></a><h4>Returns</h4>
<p> the IP address of the DNS server at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2175,7 +2167,6 @@ nm_setting_ip_config_add_dns (<em class="parameter"><code><a class="link" href="
<a name="id-1.4.17.11.43.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS server was added; <code class="literal">FALSE</code> if the server was already
known</p>
-<p></p>
</div>
</div>
<hr>
@@ -2243,7 +2234,6 @@ nm_setting_ip_config_remove_dns_by_value
<div class="refsect3">
<a name="id-1.4.17.11.45.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS server was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2292,7 +2282,6 @@ nm_setting_ip_config_get_num_dns_searches
<div class="refsect3">
<a name="id-1.4.17.11.47.5"></a><h4>Returns</h4>
<p> the number of configured DNS search domains</p>
-<p></p>
</div>
</div>
<hr>
@@ -2327,7 +2316,6 @@ nm_setting_ip_config_get_dns_search (<em class="parameter"><code><a class="link"
<a name="id-1.4.17.11.48.5"></a><h4>Returns</h4>
<p> the DNS search domain at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2363,7 +2351,6 @@ nm_setting_ip_config_add_dns_search (<em class="parameter"><code><a class="link"
<a name="id-1.4.17.11.49.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS search domain was added; <code class="literal">FALSE</code> if the search
domain was already known</p>
-<p></p>
</div>
</div>
<hr>
@@ -2433,7 +2420,6 @@ nm_setting_ip_config_remove_dns_search_by_value
<a name="id-1.4.17.11.51.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the DNS search domain was found and removed; <code class="literal">FALSE</code> if it was not.</p>
<p>Since 0.9.10</p>
-<p></p>
</div>
</div>
<hr>
@@ -2483,7 +2469,6 @@ nm_setting_ip_config_get_num_addresses
<div class="refsect3">
<a name="id-1.4.17.11.53.5"></a><h4>Returns</h4>
<p> the number of configured addresses</p>
-<p></p>
</div>
</div>
<hr>
@@ -2518,7 +2503,6 @@ nm_setting_ip_config_get_address (<em class="parameter"><code><a class="link" hr
<a name="id-1.4.17.11.54.5"></a><h4>Returns</h4>
<p> the address at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2555,7 +2539,6 @@ given address is duplicated internally and is not changed by this function.</p>
<a name="id-1.4.17.11.55.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the address was added; <code class="literal">FALSE</code> if the address was already
known.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2623,7 +2606,6 @@ nm_setting_ip_config_remove_address_by_value
<div class="refsect3">
<a name="id-1.4.17.11.57.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2672,7 +2654,6 @@ nm_setting_ip_config_get_gateway (<em class="parameter"><code><a class="link" hr
<a name="id-1.4.17.11.59.5"></a><h4>Returns</h4>
<p> the IP address of the gateway associated with this configuration, or
<code class="literal">NULL</code>.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2698,7 +2679,6 @@ nm_setting_ip_config_get_num_routes (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.17.11.60.5"></a><h4>Returns</h4>
<p> the number of configured routes</p>
-<p></p>
</div>
</div>
<hr>
@@ -2733,7 +2713,6 @@ nm_setting_ip_config_get_route (<em class="parameter"><code><a class="link" href
<a name="id-1.4.17.11.61.5"></a><h4>Returns</h4>
<p> the route at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -2769,7 +2748,6 @@ given route is duplicated internally and is not changed by this function.</p>
<div class="refsect3">
<a name="id-1.4.17.11.62.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the route was added; <code class="literal">FALSE</code> if the route was already known.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2837,7 +2815,6 @@ nm_setting_ip_config_remove_route_by_value
<div class="refsect3">
<a name="id-1.4.17.11.64.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the route was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2888,7 +2865,6 @@ property.</p>
<a name="id-1.4.17.11.66.6"></a><h4>Returns</h4>
<p> the route metric that is used for routes that don't explicitly
specify a metric. See <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--route-metric" title="The “route-metric” property"><span class="type">“route-metric”</span></a> for more details.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2918,7 +2894,6 @@ property.</p>
<a name="id-1.4.17.11.67.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if automatically configured (ie via DHCP) routes should be
ignored.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2948,7 +2923,6 @@ property.</p>
<a name="id-1.4.17.11.68.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if automatically configured (ie via DHCP) DNS information
should be ignored.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2977,7 +2951,6 @@ property.</p>
<div class="refsect3">
<a name="id-1.4.17.11.69.6"></a><h4>Returns</h4>
<p> the configured hostname to send to the DHCP server</p>
-<p></p>
</div>
</div>
<hr>
@@ -3008,7 +2981,6 @@ property.</p>
<p> <code class="literal">TRUE</code> if NetworkManager should send the machine hostname to the
DHCP server when requesting addresses to allow the server to automatically
update DNS information for this machine.</p>
-<p></p>
</div>
</div>
<hr>
@@ -3038,7 +3010,6 @@ property.</p>
<a name="id-1.4.17.11.71.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if this connection should never be the default
connection</p>
-<p></p>
</div>
</div>
<hr>
@@ -3067,7 +3038,6 @@ property.</p>
<a name="id-1.4.17.11.72.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if this connection doesn't require this type of IP
addressing to complete for the connection to succeed.</p>
-<p></p>
</div>
</div>
</div>
@@ -3077,104 +3047,78 @@ addressing to complete for the connection to succeed.</p>
<a name="NM-SETTING-IP-CONFIG-METHOD:CAPS"></a><h3>NM_SETTING_IP_CONFIG_METHOD</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_METHOD "method"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-DNS:CAPS"></a><h3>NM_SETTING_IP_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-DNS-SEARCH:CAPS"></a><h3>NM_SETTING_IP_CONFIG_DNS_SEARCH</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_DNS_SEARCH "dns-search"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-ADDRESSES:CAPS"></a><h3>NM_SETTING_IP_CONFIG_ADDRESSES</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_ADDRESSES "addresses"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-GATEWAY:CAPS"></a><h3>NM_SETTING_IP_CONFIG_GATEWAY</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_GATEWAY "gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-ROUTES:CAPS"></a><h3>NM_SETTING_IP_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-ROUTE-METRIC:CAPS"></a><h3>NM_SETTING_IP_CONFIG_ROUTE_METRIC</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_ROUTE_METRIC "route-metric"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-IGNORE-AUTO-ROUTES:CAPS"></a><h3>NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-IGNORE-AUTO-DNS:CAPS"></a><h3>NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-DHCP-HOSTNAME:CAPS"></a><h3>NM_SETTING_IP_CONFIG_DHCP_HOSTNAME</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_DHCP_HOSTNAME "dhcp-hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-DHCP-SEND-HOSTNAME:CAPS"></a><h3>NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME "dhcp-send-hostname"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_SETTING_IP_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-IP-CONFIG-MAY-FAIL:CAPS"></a><h3>NM_SETTING_IP_CONFIG_MAY_FAIL</h3>
<pre class="programlisting">#define NM_SETTING_IP_CONFIG_MAY_FAIL "may-fail"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -3182,14 +3126,16 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--addresses"></a><h3>The <code class="literal">“addresses”</code> property</h3>
<pre class="programlisting"> “addresses” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>Array of IP addresses.</p>
+<p>Element-Type: NMIPAddress</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIPConfig--dhcp-hostname"></a><h3>The <code class="literal">“dhcp-hostname”</code> property</h3>
<pre class="programlisting"> “dhcp-hostname” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--dhcp-send-hostname" title="The “dhcp-send-hostname” property"><span class="type">“dhcp-send-hostname”</span></a> property is <code class="literal">TRUE</code>, then the
+specified name will be sent to the DHCP server when acquiring a lease.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3197,7 +3143,11 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--dhcp-send-hostname"></a><h3>The <code class="literal">“dhcp-send-hostname”</code> property</h3>
<pre class="programlisting"> “dhcp-send-hostname” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, a hostname is sent to the DHCP server when acquiring a lease.
+Some DHCP servers use this hostname to update DNS databases, essentially
+providing a static hostname for the computer. If the
+<a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--dhcp-hostname" title="The “dhcp-hostname” property"><span class="type">“dhcp-hostname”</span></a> property is <code class="literal">NULL</code> and this property is
+<code class="literal">TRUE</code>, the current persistent hostname of the computer is sent.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -3205,21 +3155,22 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--dns"></a><h3>The <code class="literal">“dns”</code> property</h3>
<pre class="programlisting"> “dns” <span class="type">GStrv</span></pre>
-<p></p>
+<p>Array of IP addresses of DNS servers.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIPConfig--dns-search"></a><h3>The <code class="literal">“dns-search”</code> property</h3>
<pre class="programlisting"> “dns-search” <span class="type">GStrv</span></pre>
-<p></p>
+<p>Array of DNS search domains.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingIPConfig--gateway"></a><h3>The <code class="literal">“gateway”</code> property</h3>
<pre class="programlisting"> “gateway” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The gateway associated with this configuration. This is only meaningful
+if <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--addresses" title="The “addresses” property"><span class="type">“addresses”</span></a> is also set.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3227,7 +3178,11 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--ignore-auto-dns"></a><h3>The <code class="literal">“ignore-auto-dns”</code> property</h3>
<pre class="programlisting"> “ignore-auto-dns” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--method" title="The “method” property"><span class="type">“method”</span></a> is set to "auto" and this property to
+<code class="literal">TRUE</code>, automatically configured nameservers and search domains are
+ignored and only nameservers and search domains specified in the
+<a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--dns" title="The “dns” property"><span class="type">“dns”</span></a> and <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--dns-search" title="The “dns-search” property"><span class="type">“dns-search”</span></a> properties, if
+any, are used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -3235,7 +3190,9 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--ignore-auto-routes"></a><h3>The <code class="literal">“ignore-auto-routes”</code> property</h3>
<pre class="programlisting"> “ignore-auto-routes” <span class="type">gboolean</span></pre>
-<p></p>
+<p>When <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--method" title="The “method” property"><span class="type">“method”</span></a> is set to "auto" and this property to
+<code class="literal">TRUE</code>, automatically configured routes are ignored and only routes
+specified in the <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--routes" title="The “routes” property"><span class="type">“routes”</span></a> property, if any, are used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -3243,7 +3200,13 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--may-fail"></a><h3>The <code class="literal">“may-fail”</code> property</h3>
<pre class="programlisting"> “may-fail” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, allow overall network configuration to proceed even if the
+configuration specified by this property times out. Note that at least
+one IP configuration must succeed or overall network configuration will
+still fail. For example, in IPv6-only networks, setting this property to
+<code class="literal">TRUE</code> on the <a class="link" href="NMSettingIP4Config.html" title="NMSettingIP4Config"><span class="type">NMSettingIP4Config</span></a> allows the overall network configuration
+to succeed if IPv4 configuration fails but IPv6 configuration completes
+successfully.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -3251,7 +3214,17 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--method"></a><h3>The <code class="literal">“method”</code> property</h3>
<pre class="programlisting"> “method” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>IP configuration method.</p>
+<p><a class="link" href="NMSettingIP4Config.html" title="NMSettingIP4Config"><span class="type">NMSettingIP4Config</span></a> and <a class="link" href="NMSettingIP6Config.html" title="NMSettingIP6Config"><span class="type">NMSettingIP6Config</span></a> both support "auto",
+"manual", and "link-local". See the subclass-specific documentation for
+other values.</p>
+<p>In general, for the "auto" method, properties such as
+<a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--dns" title="The “dns” property"><span class="type">“dns”</span></a> and <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--routes" title="The “routes” property"><span class="type">“routes”</span></a> specify information
+that is added on to the information returned from automatic
+configuration. The <a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--ignore-auto-routes" title="The “ignore-auto-routes” property"><span class="type">“ignore-auto-routes”</span></a> and
+<a class="link" href="NMSettingIPConfig.html#NMSettingIPConfig--ignore-auto-dns" title="The “ignore-auto-dns” property"><span class="type">“ignore-auto-dns”</span></a> properties modify this behavior.</p>
+<p>For methods that imply no upstream network, such as "shared" or
+"link-local", these properties must be empty.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -3259,7 +3232,9 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--never-default"></a><h3>The <code class="literal">“never-default”</code> property</h3>
<pre class="programlisting"> “never-default” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, this connection will never be the default connection for this
+IP type, meaning it will never be assigned the default route by
+NetworkManager.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -3267,7 +3242,16 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--route-metric"></a><h3>The <code class="literal">“route-metric”</code> property</h3>
<pre class="programlisting"> “route-metric” <span class="type">gint64</span></pre>
-<p></p>
+<p>The default metric for routes that don't explicitly specify a metric.
+The default value -1 means that the metric is choosen automatically
+based on the device type.
+The metric applies to dynamic routes, manual (static) routes that
+don't have an explicit metric setting, address prefix routes, and
+the default route.
+Note that for IPv6, the kernel accepts zero (0) but coerces it to
+1024 (user default). Hence, setting this property to zero effectively
+mean setting it to 1024.
+For IPv4, zero is a regular value for the metric.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,4294967295]</p>
<p>Default value: -1</p>
@@ -3276,7 +3260,8 @@ addressing to complete for the connection to succeed.</p>
<div class="refsect2">
<a name="NMSettingIPConfig--routes"></a><h3>The <code class="literal">“routes”</code> property</h3>
<pre class="programlisting"> “routes” <span class="type">GPtrArray</span> *</pre>
-<p></p>
+<p>Array of IP routes.</p>
+<p>Element-Type: NMIPRoute</p>
<p>Flags: Read / Write</p>
</div>
</div>
@@ -3286,7 +3271,6 @@ addressing to complete for the connection to succeed.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingInfiniband.html b/docs/libnm/html/NMSettingInfiniband.html
index d68c9929f..4ab10c024 100644
--- a/docs/libnm/html/NMSettingInfiniband.html
+++ b/docs/libnm/html/NMSettingInfiniband.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingInfiniband</title>
+<title>NMSettingInfiniband: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingGsm.html" title="NMSettingGsm">
<link rel="next" href="NMSettingIPConfig.html" title="NMSettingIPConfig">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -219,7 +219,6 @@ nm_setting_infiniband_get_mac_address (<em class="parameter"><code><a class="lin
<div class="refsect3">
<a name="id-1.4.16.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -245,7 +244,6 @@ nm_setting_infiniband_get_mtu (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.16.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -274,7 +272,6 @@ nm_setting_infiniband_get_transport_mode
<div class="refsect3">
<a name="id-1.4.16.8.5.6"></a><h4>Returns</h4>
<p> the IPoIB transport mode</p>
-<p></p>
</div>
</div>
<hr>
@@ -303,7 +300,6 @@ a 16-bit unsigned integer.</p>
<div class="refsect3">
<a name="id-1.4.16.8.6.6"></a><h4>Returns</h4>
<p> the IPoIB P_Key</p>
-<p></p>
</div>
</div>
<hr>
@@ -330,7 +326,6 @@ nm_setting_infiniband_get_parent (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.16.8.7.6"></a><h4>Returns</h4>
<p> the parent interface name</p>
-<p></p>
</div>
</div>
<hr>
@@ -360,7 +355,6 @@ return <code class="literal">NULL</code>.)</p>
<div class="refsect3">
<a name="id-1.4.16.8.8.6"></a><h4>Returns</h4>
<p> the interface name, or <code class="literal">NULL</code></p>
-<p></p>
</div>
</div>
</div>
@@ -370,48 +364,36 @@ return <code class="literal">NULL</code>.)</p>
<a name="NM-SETTING-INFINIBAND-SETTING-NAME:CAPS"></a><h3>NM_SETTING_INFINIBAND_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_SETTING_NAME "infiniband"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_INFINIBAND_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-MTU:CAPS"></a><h3>NM_SETTING_INFINIBAND_MTU</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-TRANSPORT-MODE:CAPS"></a><h3>NM_SETTING_INFINIBAND_TRANSPORT_MODE</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_TRANSPORT_MODE "transport-mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-P-KEY:CAPS"></a><h3>NM_SETTING_INFINIBAND_P_KEY</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_P_KEY "p-key"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-INFINIBAND-PARENT:CAPS"></a><h3>NM_SETTING_INFINIBAND_PARENT</h3>
<pre class="programlisting">#define NM_SETTING_INFINIBAND_PARENT "parent"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -419,7 +401,9 @@ return <code class="literal">NULL</code>.)</p>
<div class="refsect2">
<a name="NMSettingInfiniband--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the IPoIB device whose
+permanent MAC address matches. This property does not change the MAC
+address of the device (i.e. MAC spoofing).</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -427,7 +411,8 @@ return <code class="literal">NULL</code>.)</p>
<div class="refsect2">
<a name="NMSettingInfiniband--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, only transmit packets of the specified size or smaller,
+breaking larger packets up into multiple frames.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -435,7 +420,10 @@ return <code class="literal">NULL</code>.)</p>
<div class="refsect2">
<a name="NMSettingInfiniband--p-key"></a><h3>The <code class="literal">“p-key”</code> property</h3>
<pre class="programlisting"> “p-key” <span class="type">gint</span></pre>
-<p></p>
+<p>The InfiniBand P_Key to use for this device. A value of -1 means to use
+the default P_Key (aka "the P_Key at index 0"). Otherwise it is a 16-bit
+unsigned integer, whose high bit is set if it is a "full membership"
+P_Key.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [-1,65535]</p>
<p>Default value: -1</p>
@@ -444,7 +432,10 @@ return <code class="literal">NULL</code>.)</p>
<div class="refsect2">
<a name="NMSettingInfiniband--parent"></a><h3>The <code class="literal">“parent”</code> property</h3>
<pre class="programlisting"> “parent” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The interface name of the parent device of this device. Normally <code class="literal">NULL</code>,
+but if the <a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--p-key" title="The “p-key” property"><span class="type">“p_key”</span></a> property is set, then you must
+specify the base device by setting either this property or
+<a class="link" href="NMSettingInfiniband.html#NMSettingInfiniband--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
@@ -452,14 +443,14 @@ return <code class="literal">NULL</code>.)</p>
<div class="refsect2">
<a name="NMSettingInfiniband--transport-mode"></a><h3>The <code class="literal">“transport-mode”</code> property</h3>
<pre class="programlisting"> “transport-mode” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The IP-over-InfiniBand transport mode. Either "datagram" or
+"connected".</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingOlpcMesh.html b/docs/libnm/html/NMSettingOlpcMesh.html
index 8291a3135..b8d90183e 100644
--- a/docs/libnm/html/NMSettingOlpcMesh.html
+++ b/docs/libnm/html/NMSettingOlpcMesh.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingOlpcMesh</title>
+<title>NMSettingOlpcMesh: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingIP6Config.html" title="NMSettingIP6Config">
<link rel="next" href="NMSettingPpp.html" title="NMSettingPpp">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -140,8 +140,6 @@
</div>
<div class="refsect1">
<a name="NMSettingOlpcMesh.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMSettingOlpcMesh.functions_details"></a><h2>Functions</h2>
@@ -153,7 +151,6 @@ nm_setting_olpc_mesh_new (<em class="parameter"><code><span class="type">void</s
<div class="refsect3">
<a name="id-1.4.20.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -172,12 +169,6 @@ nm_setting_olpc_mesh_get_ssid (<em class="parameter"><code><a class="link" href=
<a name="nm-setting-olpc-mesh-get-channel"></a><h3>nm_setting_olpc_mesh_get_channel ()</h3>
<pre class="programlisting"><span class="returnvalue">guint32</span>
nm_setting_olpc_mesh_get_channel (<em class="parameter"><code><a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> *setting</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.4.20.8.4.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -185,12 +176,6 @@ nm_setting_olpc_mesh_get_channel (<em class="parameter"><code><a class="link" hr
<pre class="programlisting">const <span class="returnvalue">char</span> *
nm_setting_olpc_mesh_get_dhcp_anycast_address
(<em class="parameter"><code><a class="link" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh"><span class="type">NMSettingOlpcMesh</span></a> *setting</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.4.20.8.5.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
</div>
<div class="refsect1">
@@ -199,32 +184,24 @@ nm_setting_olpc_mesh_get_dhcp_anycast_address
<a name="NM-SETTING-OLPC-MESH-SETTING-NAME:CAPS"></a><h3>NM_SETTING_OLPC_MESH_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_SETTING_NAME "802-11-olpc-mesh"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-OLPC-MESH-SSID:CAPS"></a><h3>NM_SETTING_OLPC_MESH_SSID</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_SSID "ssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-OLPC-MESH-CHANNEL:CAPS"></a><h3>NM_SETTING_OLPC_MESH_CHANNEL</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_CHANNEL "channel"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-OLPC-MESH-DHCP-ANYCAST-ADDRESS:CAPS"></a><h3>NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS "dhcp-anycast-address"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -232,7 +209,7 @@ nm_setting_olpc_mesh_get_dhcp_anycast_address
<div class="refsect2">
<a name="NMSettingOlpcMesh--channel"></a><h3>The <code class="literal">“channel”</code> property</h3>
<pre class="programlisting"> “channel” <span class="type">guint</span></pre>
-<p></p>
+<p>Channel on which the mesh network to join is located.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -240,7 +217,9 @@ nm_setting_olpc_mesh_get_dhcp_anycast_address
<div class="refsect2">
<a name="NMSettingOlpcMesh--dhcp-anycast-address"></a><h3>The <code class="literal">“dhcp-anycast-address”</code> property</h3>
<pre class="programlisting"> “dhcp-anycast-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Anycast DHCP MAC address used when requesting an IP address via DHCP.
+The specific anycast address used determines which DHCP server class
+answers the request.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -248,13 +227,12 @@ nm_setting_olpc_mesh_get_dhcp_anycast_address
<div class="refsect2">
<a name="NMSettingOlpcMesh--ssid"></a><h3>The <code class="literal">“ssid”</code> property</h3>
<pre class="programlisting"> “ssid” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>SSID of the mesh network to join.</p>
<p>Flags: Read / Write</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingPpp.html b/docs/libnm/html/NMSettingPpp.html
index 832e3fcd0..2ea944438 100644
--- a/docs/libnm/html/NMSettingPpp.html
+++ b/docs/libnm/html/NMSettingPpp.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingPpp</title>
+<title>NMSettingPpp: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingOlpcMesh.html" title="NMSettingOlpcMesh">
<link rel="next" href="NMSettingPppoe.html" title="NMSettingPppoe">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -435,7 +435,6 @@ nm_setting_ppp_get_noauth (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.4.21.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--noauth" title="The “noauth” property"><span class="type">“noauth”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -461,7 +460,6 @@ nm_setting_ppp_get_refuse_eap (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.21.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--refuse-eap" title="The “refuse-eap” property"><span class="type">“refuse-eap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -487,7 +485,6 @@ nm_setting_ppp_get_refuse_pap (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.21.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--refuse-pap" title="The “refuse-pap” property"><span class="type">“refuse-pap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -513,7 +510,6 @@ nm_setting_ppp_get_refuse_chap (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.21.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--refuse-chap" title="The “refuse-chap” property"><span class="type">“refuse-chap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -539,7 +535,6 @@ nm_setting_ppp_get_refuse_mschap (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.21.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--refuse-mschap" title="The “refuse-mschap” property"><span class="type">“refuse-mschap”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -565,7 +560,6 @@ nm_setting_ppp_get_refuse_mschapv2 (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.21.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--refuse-mschapv2" title="The “refuse-mschapv2” property"><span class="type">“refuse-mschapv2”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -591,7 +585,6 @@ nm_setting_ppp_get_nobsdcomp (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.21.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--nobsdcomp" title="The “nobsdcomp” property"><span class="type">“nobsdcomp”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -617,7 +610,6 @@ nm_setting_ppp_get_nodeflate (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.21.8.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--nodeflate" title="The “nodeflate” property"><span class="type">“nodeflate”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -643,7 +635,6 @@ nm_setting_ppp_get_no_vj_comp (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.21.8.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--no-vj-comp" title="The “no-vj-comp” property"><span class="type">“no-vj-comp”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -669,7 +660,6 @@ nm_setting_ppp_get_require_mppe (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.4.21.8.12.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--require-mppe" title="The “require-mppe” property"><span class="type">“require-mppe”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -695,7 +685,6 @@ nm_setting_ppp_get_require_mppe_128 (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.21.8.13.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--require-mppe-128" title="The “require-mppe-128” property"><span class="type">“require-mppe-128”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -721,7 +710,6 @@ nm_setting_ppp_get_mppe_stateful (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.21.8.14.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--mppe-stateful" title="The “mppe-stateful” property"><span class="type">“mppe-stateful”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -747,7 +735,6 @@ nm_setting_ppp_get_crtscts (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.21.8.15.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--crtscts" title="The “crtscts” property"><span class="type">“crtscts”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -773,7 +760,6 @@ nm_setting_ppp_get_baud (<em class="parameter"><code><a class="link" href="NMSet
<div class="refsect3">
<a name="id-1.4.21.8.16.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--baud" title="The “baud” property"><span class="type">“baud”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -799,7 +785,6 @@ nm_setting_ppp_get_mru (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.4.21.8.17.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--mru" title="The “mru” property"><span class="type">“mru”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -825,7 +810,6 @@ nm_setting_ppp_get_mtu (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.4.21.8.18.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -851,7 +835,6 @@ nm_setting_ppp_get_lcp_echo_failure (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.21.8.19.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--lcp-echo-failure" title="The “lcp-echo-failure” property"><span class="type">“lcp-echo-failure”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -877,7 +860,6 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.4.21.8.20.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPpp.html#NMSettingPpp--lcp-echo-interval" title="The “lcp-echo-interval” property"><span class="type">“lcp-echo-interval”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -887,152 +869,114 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<a name="NM-SETTING-PPP-SETTING-NAME:CAPS"></a><h3>NM_SETTING_PPP_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_PPP_SETTING_NAME "ppp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NOAUTH:CAPS"></a><h3>NM_SETTING_PPP_NOAUTH</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NOAUTH "noauth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-EAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_EAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_EAP "refuse-eap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-PAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_PAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_PAP "refuse-pap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-CHAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_CHAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_CHAP "refuse-chap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-MSCHAP:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_MSCHAP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_MSCHAP "refuse-mschap"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REFUSE-MSCHAPV2:CAPS"></a><h3>NM_SETTING_PPP_REFUSE_MSCHAPV2</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REFUSE_MSCHAPV2 "refuse-mschapv2"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NOBSDCOMP:CAPS"></a><h3>NM_SETTING_PPP_NOBSDCOMP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NOBSDCOMP "nobsdcomp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NODEFLATE:CAPS"></a><h3>NM_SETTING_PPP_NODEFLATE</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NODEFLATE "nodeflate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-NO-VJ-COMP:CAPS"></a><h3>NM_SETTING_PPP_NO_VJ_COMP</h3>
<pre class="programlisting">#define NM_SETTING_PPP_NO_VJ_COMP "no-vj-comp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REQUIRE-MPPE:CAPS"></a><h3>NM_SETTING_PPP_REQUIRE_MPPE</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REQUIRE_MPPE "require-mppe"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-REQUIRE-MPPE-128:CAPS"></a><h3>NM_SETTING_PPP_REQUIRE_MPPE_128</h3>
<pre class="programlisting">#define NM_SETTING_PPP_REQUIRE_MPPE_128 "require-mppe-128"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-MPPE-STATEFUL:CAPS"></a><h3>NM_SETTING_PPP_MPPE_STATEFUL</h3>
<pre class="programlisting">#define NM_SETTING_PPP_MPPE_STATEFUL "mppe-stateful"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-CRTSCTS:CAPS"></a><h3>NM_SETTING_PPP_CRTSCTS</h3>
<pre class="programlisting">#define NM_SETTING_PPP_CRTSCTS "crtscts"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-BAUD:CAPS"></a><h3>NM_SETTING_PPP_BAUD</h3>
<pre class="programlisting">#define NM_SETTING_PPP_BAUD "baud"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-MRU:CAPS"></a><h3>NM_SETTING_PPP_MRU</h3>
<pre class="programlisting">#define NM_SETTING_PPP_MRU "mru"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-MTU:CAPS"></a><h3>NM_SETTING_PPP_MTU</h3>
<pre class="programlisting">#define NM_SETTING_PPP_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-LCP-ECHO-FAILURE:CAPS"></a><h3>NM_SETTING_PPP_LCP_ECHO_FAILURE</h3>
<pre class="programlisting">#define NM_SETTING_PPP_LCP_ECHO_FAILURE "lcp-echo-failure"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPP-LCP-ECHO-INTERVAL:CAPS"></a><h3>NM_SETTING_PPP_LCP_ECHO_INTERVAL</h3>
<pre class="programlisting">#define NM_SETTING_PPP_LCP_ECHO_INTERVAL "lcp-echo-interval"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1040,7 +984,9 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--baud"></a><h3>The <code class="literal">“baud”</code> property</h3>
<pre class="programlisting"> “baud” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to set the serial port to the specified
+baudrate. This value should normally be left as 0 to automatically
+choose the speed.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1048,7 +994,9 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--crtscts"></a><h3>The <code class="literal">“crtscts”</code> property</h3>
<pre class="programlisting"> “crtscts” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, specify that pppd should set the serial port to use hardware
+flow control with RTS and CTS signals. This value should normally be set
+to <code class="literal">FALSE</code>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1056,7 +1004,10 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--lcp-echo-failure"></a><h3>The <code class="literal">“lcp-echo-failure”</code> property</h3>
<pre class="programlisting"> “lcp-echo-failure” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to presume the connection to the peer has
+failed if the specified number of LCP echo-requests go unanswered by the
+peer. The "lcp-echo-interval" property must also be set to a non-zero
+value if this property is used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1064,7 +1015,10 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--lcp-echo-interval"></a><h3>The <code class="literal">“lcp-echo-interval”</code> property</h3>
<pre class="programlisting"> “lcp-echo-interval” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to send an LCP echo-request frame to the peer
+every n seconds (where n is the specified value). Note that some PPP
+peers will respond to echo requests and some will not, and it is not
+possible to autodetect this.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1072,7 +1026,8 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--mppe-stateful"></a><h3>The <code class="literal">“mppe-stateful”</code> property</h3>
<pre class="programlisting"> “mppe-stateful” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, stateful MPPE is used. See pppd documentation for more
+information on stateful MPPE.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1080,7 +1035,9 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--mru"></a><h3>The <code class="literal">“mru”</code> property</h3>
<pre class="programlisting"> “mru” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to request that the peer send packets no
+larger than the specified size. If non-zero, the MRU should be between
+128 and 16384.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 16384</p>
<p>Default value: 0</p>
@@ -1089,7 +1046,8 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, instruct pppd to send packets no larger than the specified
+size.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1097,7 +1055,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--no-vj-comp"></a><h3>The <code class="literal">“no-vj-comp”</code> property</h3>
<pre class="programlisting"> “no-vj-comp” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, Van Jacobsen TCP header compression will not be requested.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1105,7 +1063,9 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--noauth"></a><h3>The <code class="literal">“noauth”</code> property</h3>
<pre class="programlisting"> “noauth” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, do not require the other side (usually the PPP server) to
+authenticate itself to the client. If <code class="literal">FALSE</code>, require authentication
+from the remote side. In almost all cases, this should be <code class="literal">TRUE</code>.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -1113,7 +1073,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--nobsdcomp"></a><h3>The <code class="literal">“nobsdcomp”</code> property</h3>
<pre class="programlisting"> “nobsdcomp” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, BSD compression will not be requested.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1121,7 +1081,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--nodeflate"></a><h3>The <code class="literal">“nodeflate”</code> property</h3>
<pre class="programlisting"> “nodeflate” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, "deflate" compression will not be requested.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1129,7 +1089,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--refuse-chap"></a><h3>The <code class="literal">“refuse-chap”</code> property</h3>
<pre class="programlisting"> “refuse-chap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the CHAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1137,7 +1097,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--refuse-eap"></a><h3>The <code class="literal">“refuse-eap”</code> property</h3>
<pre class="programlisting"> “refuse-eap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the EAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1145,7 +1105,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--refuse-mschap"></a><h3>The <code class="literal">“refuse-mschap”</code> property</h3>
<pre class="programlisting"> “refuse-mschap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the MSCHAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1153,7 +1113,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--refuse-mschapv2"></a><h3>The <code class="literal">“refuse-mschapv2”</code> property</h3>
<pre class="programlisting"> “refuse-mschapv2” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the MSCHAPv2 authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1161,7 +1121,7 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--refuse-pap"></a><h3>The <code class="literal">“refuse-pap”</code> property</h3>
<pre class="programlisting"> “refuse-pap” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, the PAP authentication method will not be used.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1169,7 +1129,10 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--require-mppe"></a><h3>The <code class="literal">“require-mppe”</code> property</h3>
<pre class="programlisting"> “require-mppe” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, MPPE (Microsoft Point-to-Point Encrpytion) will be required for
+the PPP session. If either 64-bit or 128-bit MPPE is not available the
+session will fail. Note that MPPE is not used on mobile broadband
+connections.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
@@ -1177,14 +1140,15 @@ nm_setting_ppp_get_lcp_echo_interval (<em class="parameter"><code><a class="link
<div class="refsect2">
<a name="NMSettingPpp--require-mppe-128"></a><h3>The <code class="literal">“require-mppe-128”</code> property</h3>
<pre class="programlisting"> “require-mppe-128” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, 128-bit MPPE (Microsoft Point-to-Point Encrpytion) will be
+required for the PPP session, and the "require-mppe" property must also
+be set to <code class="literal">TRUE</code>. If 128-bit MPPE is not available the session will fail.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: FALSE</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingPppoe.html b/docs/libnm/html/NMSettingPppoe.html
index daa5f9438..6155a5481 100644
--- a/docs/libnm/html/NMSettingPppoe.html
+++ b/docs/libnm/html/NMSettingPppoe.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingPppoe</title>
+<title>NMSettingPppoe: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingPpp.html" title="NMSettingPpp">
<link rel="next" href="NMSettingSerial.html" title="NMSettingSerial">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -196,7 +196,6 @@ nm_setting_pppoe_get_service (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.22.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPppoe.html#NMSettingPppoe--service" title="The “service” property"><span class="type">“service”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -222,7 +221,6 @@ nm_setting_pppoe_get_username (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.22.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPppoe.html#NMSettingPppoe--username" title="The “username” property"><span class="type">“username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -248,7 +246,6 @@ nm_setting_pppoe_get_password (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.22.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingPppoe.html#NMSettingPppoe--password" title="The “password” property"><span class="type">“password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -274,7 +271,6 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.22.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the <a class="link" href="NMSettingPppoe.html#NMSettingPppoe--password" title="The “password” property"><span class="type">“password”</span></a></p>
-<p></p>
</div>
</div>
</div>
@@ -284,40 +280,30 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<a name="NM-SETTING-PPPOE-SETTING-NAME:CAPS"></a><h3>NM_SETTING_PPPOE_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_SETTING_NAME "pppoe"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-SERVICE:CAPS"></a><h3>NM_SETTING_PPPOE_SERVICE</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_SERVICE "service"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-USERNAME:CAPS"></a><h3>NM_SETTING_PPPOE_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_USERNAME "username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-PASSWORD:CAPS"></a><h3>NM_SETTING_PPPOE_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_PASSWORD "password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-PPPOE-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_PPPOE_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_PPPOE_PASSWORD_FLAGS "password-flags"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -325,7 +311,7 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingPppoe--password"></a><h3>The <code class="literal">“password”</code> property</h3>
<pre class="programlisting"> “password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Password used to authenticate with the PPPoE service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -333,14 +319,17 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingPppoe--password-flags"></a><h3>The <code class="literal">“password-flags”</code> property</h3>
<pre class="programlisting"> “password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingPppoe.html#NMSettingPppoe--password" title="The “password” property"><span class="type">“password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingPppoe--service"></a><h3>The <code class="literal">“service”</code> property</h3>
<pre class="programlisting"> “service” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, instruct PPPoE to only initiate sessions with access
+concentrators that provide the specified service. For most providers,
+this should be left blank. It is only required if there are multiple
+access concentrators or a specific service is known to be required.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -348,14 +337,13 @@ nm_setting_pppoe_get_password_flags (<em class="parameter"><code><a class="link"
<div class="refsect2">
<a name="NMSettingPppoe--username"></a><h3>The <code class="literal">“username”</code> property</h3>
<pre class="programlisting"> “username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Username used to authenticate with the PPPoE service.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingSerial.html b/docs/libnm/html/NMSettingSerial.html
index f27e73ee2..14ae299b0 100644
--- a/docs/libnm/html/NMSettingSerial.html
+++ b/docs/libnm/html/NMSettingSerial.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingSerial</title>
+<title>NMSettingSerial: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingPppoe.html" title="NMSettingPppoe">
<link rel="next" href="NMSettingTeam.html" title="NMSettingTeam">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -220,7 +220,6 @@ nm_setting_serial_get_baud (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.23.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--baud" title="The “baud” property"><span class="type">“baud”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -246,7 +245,6 @@ nm_setting_serial_get_bits (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.23.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--bits" title="The “bits” property"><span class="type">“bits”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -272,7 +270,6 @@ nm_setting_serial_get_parity (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.23.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--parity" title="The “parity” property"><span class="type">“parity”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -298,7 +295,6 @@ nm_setting_serial_get_stopbits (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.23.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--stopbits" title="The “stopbits” property"><span class="type">“stopbits”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -324,7 +320,6 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.23.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingSerial.html#NMSettingSerial--send-delay" title="The “send-delay” property"><span class="type">“send-delay”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -334,8 +329,6 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<a name="NM-SETTING-SERIAL-SETTING-NAME:CAPS"></a><h3>NM_SETTING_SERIAL_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_SETTING_NAME "serial"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -380,40 +373,30 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<a name="NM-SETTING-SERIAL-BAUD:CAPS"></a><h3>NM_SETTING_SERIAL_BAUD</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_BAUD "baud"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-BITS:CAPS"></a><h3>NM_SETTING_SERIAL_BITS</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_BITS "bits"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-PARITY:CAPS"></a><h3>NM_SETTING_SERIAL_PARITY</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_PARITY "parity"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-STOPBITS:CAPS"></a><h3>NM_SETTING_SERIAL_STOPBITS</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_STOPBITS "stopbits"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-SERIAL-SEND-DELAY:CAPS"></a><h3>NM_SETTING_SERIAL_SEND_DELAY</h3>
<pre class="programlisting">#define NM_SETTING_SERIAL_SEND_DELAY "send-delay"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -421,7 +404,9 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMSettingSerial--baud"></a><h3>The <code class="literal">“baud”</code> property</h3>
<pre class="programlisting"> “baud” <span class="type">guint</span></pre>
-<p></p>
+<p>Speed to use for communication over the serial port. Note that this
+value usually has no effect for mobile broadband modems as they generally
+ignore speed settings and use the highest available speed.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 57600</p>
</div>
@@ -429,7 +414,7 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMSettingSerial--bits"></a><h3>The <code class="literal">“bits”</code> property</h3>
<pre class="programlisting"> “bits” <span class="type">guint</span></pre>
-<p></p>
+<p>Byte-width of the serial communication. The 8 in "8n1" for example.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [5,8]</p>
<p>Default value: 8</p>
@@ -438,7 +423,7 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMSettingSerial--parity"></a><h3>The <code class="literal">“parity”</code> property</h3>
<pre class="programlisting"> “parity” <a class="link" href="NMSettingSerial.html#NMSettingSerialParity" title="enum NMSettingSerialParity"><span class="type">NMSettingSerialParity</span></a></pre>
-<p></p>
+<p>Parity setting of the serial port.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NM_SETTING_SERIAL_PARITY_NONE</p>
</div>
@@ -446,7 +431,7 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMSettingSerial--send-delay"></a><h3>The <code class="literal">“send-delay”</code> property</h3>
<pre class="programlisting"> “send-delay” <span class="type">guint64</span></pre>
-<p></p>
+<p>Time to delay between each byte sent to the modem, in microseconds.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -454,7 +439,8 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
<div class="refsect2">
<a name="NMSettingSerial--stopbits"></a><h3>The <code class="literal">“stopbits”</code> property</h3>
<pre class="programlisting"> “stopbits” <span class="type">guint</span></pre>
-<p></p>
+<p>Number of stop bits for communication on the serial port. Either 1 or 2.
+The 1 in "8n1" for example.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: [1,2]</p>
<p>Default value: 1</p>
@@ -462,7 +448,6 @@ nm_setting_serial_get_send_delay (<em class="parameter"><code><a class="link" hr
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingTeam.html b/docs/libnm/html/NMSettingTeam.html
index 85f6eeeac..bd678358a 100644
--- a/docs/libnm/html/NMSettingTeam.html
+++ b/docs/libnm/html/NMSettingTeam.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingTeam</title>
+<title>NMSettingTeam: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingSerial.html" title="NMSettingSerial">
<link rel="next" href="NMSettingTeamPort.html" title="NMSettingTeamPort">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -142,7 +142,6 @@ nm_setting_team_get_config (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.24.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingTeam.html#NMSettingTeam--config" title="The “config” property"><span class="type">“config”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -152,16 +151,12 @@ nm_setting_team_get_config (<em class="parameter"><code><a class="link" href="NM
<a name="NM-SETTING-TEAM-SETTING-NAME:CAPS"></a><h3>NM_SETTING_TEAM_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_SETTING_NAME "team"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-TEAM-CONFIG:CAPS"></a><h3>NM_SETTING_TEAM_CONFIG</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_CONFIG "config"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -169,14 +164,16 @@ nm_setting_team_get_config (<em class="parameter"><code><a class="link" href="NM
<div class="refsect2">
<a name="NMSettingTeam--config"></a><h3>The <code class="literal">“config”</code> property</h3>
<pre class="programlisting"> “config” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The JSON configuration for the team network interface. The property
+should contain raw JSON configuration data suitable for teamd, because
+the value is passed directly to teamd. If not specified, the default
+configuration is used. See man teamd.conf for the format details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingTeamPort.html b/docs/libnm/html/NMSettingTeamPort.html
index e25e1e4e8..fbe09ce02 100644
--- a/docs/libnm/html/NMSettingTeamPort.html
+++ b/docs/libnm/html/NMSettingTeamPort.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingTeamPort</title>
+<title>NMSettingTeamPort: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingTeam.html" title="NMSettingTeam">
<link rel="next" href="NMSettingVlan.html" title="NMSettingVlan">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -142,7 +142,6 @@ nm_setting_team_port_get_config (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.4.25.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingTeamPort.html#NMSettingTeamPort--config" title="The “config” property"><span class="type">“config”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -152,16 +151,12 @@ nm_setting_team_port_get_config (<em class="parameter"><code><a class="link" hre
<a name="NM-SETTING-TEAM-PORT-SETTING-NAME:CAPS"></a><h3>NM_SETTING_TEAM_PORT_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_PORT_SETTING_NAME "team-port"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-TEAM-PORT-CONFIG:CAPS"></a><h3>NM_SETTING_TEAM_PORT_CONFIG</h3>
<pre class="programlisting">#define NM_SETTING_TEAM_PORT_CONFIG "config"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -169,14 +164,16 @@ nm_setting_team_port_get_config (<em class="parameter"><code><a class="link" hre
<div class="refsect2">
<a name="NMSettingTeamPort--config"></a><h3>The <code class="literal">“config”</code> property</h3>
<pre class="programlisting"> “config” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The JSON configuration for the team port. The property should contain raw
+JSON configuration data suitable for teamd, because the value is passed
+directly to teamd. If not specified, the default configuration is
+used. See man teamd.conf for the format details.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingVlan.html b/docs/libnm/html/NMSettingVlan.html
index a82533dc9..d205fd32e 100644
--- a/docs/libnm/html/NMSettingVlan.html
+++ b/docs/libnm/html/NMSettingVlan.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingVlan</title>
+<title>NMSettingVlan: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingTeamPort.html" title="NMSettingTeamPort">
<link rel="next" href="NMSettingVpn.html" title="NMSettingVpn">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -272,7 +272,6 @@ nm_setting_vlan_get_parent (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.26.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--parent" title="The “parent” property"><span class="type">“parent”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -298,7 +297,6 @@ nm_setting_vlan_get_id (<em class="parameter"><code><a class="link" href="NMSett
<div class="refsect3">
<a name="id-1.4.26.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--id" title="The “id” property"><span class="type">“id”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -324,7 +322,6 @@ nm_setting_vlan_get_flags (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.4.26.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVlan.html#NMSettingVlan--flags" title="The “flags” property"><span class="type">“flags”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -361,7 +358,6 @@ properties of this setting.</p>
<div class="refsect3">
<a name="id-1.4.26.8.6.6"></a><h4>Returns</h4>
<p> return the number of ingress/egress priority entries, -1 if error</p>
-<p></p>
</div>
</div>
<hr>
@@ -415,7 +411,6 @@ or <a class="link" href="NMSettingVlan.html#NMSettingVlan--egress-priority-map"
<div class="refsect3">
<a name="id-1.4.26.8.7.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if a priority map was returned, <code class="literal">FALSE</code> if error</p>
-<p></p>
</div>
</div>
<hr>
@@ -480,7 +475,6 @@ to</p></td>
<a name="id-1.4.26.8.8.8"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the new priority mapping was successfully added to the
list, <code class="literal">FALSE</code> if error</p>
-<p></p>
</div>
</div>
<hr>
@@ -574,7 +568,6 @@ to</p></td>
<div class="refsect3">
<a name="id-1.4.26.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the priority mapping was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -620,7 +613,6 @@ properties.</p>
<div class="refsect3">
<a name="id-1.4.26.8.11.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the priority mapping was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -695,7 +687,6 @@ the Linux SKB priorities to 802.1p priorities.</p>
<a name="id-1.4.26.8.13.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the entry was successfully added to the list, or it
overwrote the old value, <code class="literal">FALSE</code> if error</p>
-<p></p>
</div>
</div>
</div>
@@ -705,48 +696,36 @@ overwrote the old value, <code class="literal">FALSE</code> if error</p>
<a name="NM-SETTING-VLAN-SETTING-NAME:CAPS"></a><h3>NM_SETTING_VLAN_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_SETTING_NAME "vlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-PARENT:CAPS"></a><h3>NM_SETTING_VLAN_PARENT</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_PARENT "parent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-ID:CAPS"></a><h3>NM_SETTING_VLAN_ID</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_ID "id"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-FLAGS:CAPS"></a><h3>NM_SETTING_VLAN_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_FLAGS "flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-INGRESS-PRIORITY-MAP:CAPS"></a><h3>NM_SETTING_VLAN_INGRESS_PRIORITY_MAP</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_INGRESS_PRIORITY_MAP "ingress-priority-map"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VLAN-EGRESS-PRIORITY-MAP:CAPS"></a><h3>NM_SETTING_VLAN_EGRESS_PRIORITY_MAP</h3>
<pre class="programlisting">#define NM_SETTING_VLAN_EGRESS_PRIORITY_MAP "egress-priority-map"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -828,21 +807,28 @@ to 802.1p priorities used in VLANs.</p>
<div class="refsect2">
<a name="NMSettingVlan--egress-priority-map"></a><h3>The <code class="literal">“egress-priority-map”</code> property</h3>
<pre class="programlisting"> “egress-priority-map” <span class="type">GStrv</span></pre>
-<p></p>
+<p>For outgoing packets, a list of mappings from Linux SKB priorities to
+802.1p priorities. The mapping is given in the format "from:to" where
+both "from" and "to" are unsigned integers, ie "7:3".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVlan--flags"></a><h3>The <code class="literal">“flags”</code> property</h3>
<pre class="programlisting"> “flags” <a class="link" href="NMSettingVlan.html#NMVlanFlags" title="enum NMVlanFlags"><span class="type">NMVlanFlags</span></a></pre>
-<p></p>
+<p>One or more flags which control the behavior and features of the VLAN
+interface. Flags include <a class="link" href="NMSettingVlan.html#NM-VLAN-FLAG-REORDER-HEADERS:CAPS"><code class="literal">NM_VLAN_FLAG_REORDER_HEADERS</code></a> (reordering of
+output packet headers), <a class="link" href="NMSettingVlan.html#NM-VLAN-FLAG-GVRP:CAPS"><code class="literal">NM_VLAN_FLAG_GVRP</code></a> (use of the GVRP protocol),
+and <a class="link" href="NMSettingVlan.html#NM-VLAN-FLAG-LOOSE-BINDING:CAPS"><code class="literal">NM_VLAN_FLAG_LOOSE_BINDING</code></a> (loose binding of the interface to its
+master device's operating state).</p>
<p>Flags: Read / Write / Construct</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVlan--id"></a><h3>The <code class="literal">“id”</code> property</h3>
<pre class="programlisting"> “id” <span class="type">guint</span></pre>
-<p></p>
+<p>The VLAN identifier that the interface created by this connection should
+be assigned.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 4095</p>
<p>Default value: 0</p>
@@ -851,21 +837,25 @@ to 802.1p priorities used in VLANs.</p>
<div class="refsect2">
<a name="NMSettingVlan--ingress-priority-map"></a><h3>The <code class="literal">“ingress-priority-map”</code> property</h3>
<pre class="programlisting"> “ingress-priority-map” <span class="type">GStrv</span></pre>
-<p></p>
+<p>For incoming packets, a list of mappings from 802.1p priorities to Linux
+SKB priorities. The mapping is given in the format "from:to" where both
+"from" and "to" are unsigned integers, ie "7:3".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVlan--parent"></a><h3>The <code class="literal">“parent”</code> property</h3>
<pre class="programlisting"> “parent” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If given, specifies the parent interface name or parent connection UUID
+from which this VLAN interface should be created. If this property is
+not specified, the connection must contain an <a class="link" href="NMSettingWired.html" title="NMSettingWired"><span class="type">NMSettingWired</span></a> setting
+with a <a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingVpn.html b/docs/libnm/html/NMSettingVpn.html
index a55a552a4..ba0b03047 100644
--- a/docs/libnm/html/NMSettingVpn.html
+++ b/docs/libnm/html/NMSettingVpn.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingVpn</title>
+<title>NMSettingVpn: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingVlan.html" title="NMSettingVlan">
<link rel="next" href="NMSettingWimax.html" title="NMSettingWimax">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -327,7 +327,6 @@ plugin that should be used to connect to this VPN.</p>
<div class="refsect3">
<a name="id-1.4.27.8.4.6"></a><h4>Returns</h4>
<p> the VPN plugin's service name</p>
-<p></p>
</div>
</div>
<hr>
@@ -353,7 +352,6 @@ nm_setting_vpn_get_user_name (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.27.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVpn.html#NMSettingVpn--user-name" title="The “user-name” property"><span class="type">“user-name”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -379,7 +377,6 @@ nm_setting_vpn_get_persistent (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.27.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingVpn.html#NMSettingVpn--persistent" title="The “persistent” property"><span class="type">“persistent”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -406,7 +403,6 @@ nm_setting_vpn_get_num_data_items (<em class="parameter"><code><a class="link" h
<div class="refsect3">
<a name="id-1.4.27.8.7.6"></a><h4>Returns</h4>
<p> the number of VPN plugin specific configuration data items</p>
-<p></p>
</div>
</div>
<hr>
@@ -484,7 +480,6 @@ by <a class="link" href="NMSettingVpn.html#nm-setting-vpn-add-data-item" title="
<div class="refsect3">
<a name="id-1.4.27.8.9.6"></a><h4>Returns</h4>
<p> the data item, if any</p>
-<p></p>
</div>
</div>
<hr>
@@ -521,7 +516,6 @@ nm_setting_vpn_remove_data_item (<em class="parameter"><code><a class="link" hre
<a name="id-1.4.27.8.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the data item was found and removed from the internal list,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -588,7 +582,6 @@ nm_setting_vpn_get_num_secrets (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.27.8.12.6"></a><h4>Returns</h4>
<p> the number of VPN plugin specific secrets</p>
-<p></p>
</div>
</div>
<hr>
@@ -665,7 +658,6 @@ by <a class="link" href="NMSettingVpn.html#nm-setting-vpn-add-secret" title="nm_
<div class="refsect3">
<a name="id-1.4.27.8.14.6"></a><h4>Returns</h4>
<p> the secret, if any</p>
-<p></p>
</div>
</div>
<hr>
@@ -702,7 +694,6 @@ nm_setting_vpn_remove_secret (<em class="parameter"><code><a class="link" href="
<a name="id-1.4.27.8.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secret was found and removed from the internal list,
<code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -752,48 +743,36 @@ iteration will not be part of the iteration.</p>
<a name="NM-SETTING-VPN-SETTING-NAME:CAPS"></a><h3>NM_SETTING_VPN_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VPN_SETTING_NAME "vpn"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-SERVICE-TYPE:CAPS"></a><h3>NM_SETTING_VPN_SERVICE_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_VPN_SERVICE_TYPE "service-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-USER-NAME:CAPS"></a><h3>NM_SETTING_VPN_USER_NAME</h3>
<pre class="programlisting">#define NM_SETTING_VPN_USER_NAME "user-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-PERSISTENT:CAPS"></a><h3>NM_SETTING_VPN_PERSISTENT</h3>
<pre class="programlisting">#define NM_SETTING_VPN_PERSISTENT "persistent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-DATA:CAPS"></a><h3>NM_SETTING_VPN_DATA</h3>
<pre class="programlisting">#define NM_SETTING_VPN_DATA "data"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-VPN-SECRETS:CAPS"></a><h3>NM_SETTING_VPN_SECRETS</h3>
<pre class="programlisting">#define NM_SETTING_VPN_SECRETS "secrets"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -801,14 +780,18 @@ iteration will not be part of the iteration.</p>
<div class="refsect2">
<a name="NMSettingVpn--data"></a><h3>The <code class="literal">“data”</code> property</h3>
<pre class="programlisting"> “data” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>Dictionary of key/value pairs of VPN plugin specific data. Both keys and
+values must be strings.</p>
+<p>Type: GHashTable(utf8,utf8)</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVpn--persistent"></a><h3>The <code class="literal">“persistent”</code> property</h3>
<pre class="programlisting"> “persistent” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If the VPN service supports persistence, and this property is <code class="literal">TRUE</code>,
+the VPN will attempt to stay connected across link changes and outages,
+until explicitly disconnected.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -816,14 +799,18 @@ iteration will not be part of the iteration.</p>
<div class="refsect2">
<a name="NMSettingVpn--secrets"></a><h3>The <code class="literal">“secrets”</code> property</h3>
<pre class="programlisting"> “secrets” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>Dictionary of key/value pairs of VPN plugin specific secrets like
+passwords or private keys. Both keys and values must be strings.</p>
+<p>Type: GHashTable(utf8,utf8)</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingVpn--service-type"></a><h3>The <code class="literal">“service-type”</code> property</h3>
<pre class="programlisting"> “service-type” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>D-Bus service name of the VPN plugin that this setting uses to connect to
+its network. i.e. org.freedesktop.NetworkManager.vpnc for the vpnc
+plugin.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -831,14 +818,18 @@ iteration will not be part of the iteration.</p>
<div class="refsect2">
<a name="NMSettingVpn--user-name"></a><h3>The <code class="literal">“user-name”</code> property</h3>
<pre class="programlisting"> “user-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If the VPN connection requires a user name for authentication, that name
+should be provided here. If the connection is available to more than one
+user, and the VPN requires each user to supply a different name, then
+leave this property empty. If this property is empty, NetworkManager
+will automatically supply the username of the user which requested the
+VPN connection.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingWimax.html b/docs/libnm/html/NMSettingWimax.html
index 996660513..b4843dd70 100644
--- a/docs/libnm/html/NMSettingWimax.html
+++ b/docs/libnm/html/NMSettingWimax.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingWimax</title>
+<title>NMSettingWimax: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingVpn.html" title="NMSettingVpn">
<link rel="next" href="NMSettingWired.html" title="NMSettingWired">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -135,7 +135,6 @@ nm_setting_wimax_new (<em class="parameter"><code><span class="type">void</span>
<div class="refsect3">
<a name="id-1.4.28.8.2.5"></a><h4>Returns</h4>
<p> the new empty <a class="link" href="NMSettingWimax.html" title="NMSettingWimax"><span class="type">NMSettingWimax</span></a> object</p>
-<p></p>
</div>
</div>
<hr>
@@ -163,7 +162,6 @@ specific WiMAX network this setting describes a connection to.</p>
<div class="refsect3">
<a name="id-1.4.28.8.3.6"></a><h4>Returns</h4>
<p> the WiMAX NSP name</p>
-<p></p>
</div>
</div>
<hr>
@@ -191,7 +189,6 @@ to.</p>
<div class="refsect3">
<a name="id-1.4.28.8.4.6"></a><h4>Returns</h4>
<p> the MAC address</p>
-<p></p>
</div>
</div>
</div>
@@ -201,24 +198,18 @@ to.</p>
<a name="NM-SETTING-WIMAX-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIMAX_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_SETTING_NAME "wimax"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIMAX-NETWORK-NAME:CAPS"></a><h3>NM_SETTING_WIMAX_NETWORK_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_NETWORK_NAME "network-name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIMAX-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIMAX_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIMAX_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -226,7 +217,9 @@ to.</p>
<div class="refsect2">
<a name="NMSettingWimax--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the WiMAX device whose
+MAC address matches. This property does not change the MAC address of the
+device (known as MAC spoofing).</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -234,14 +227,14 @@ to.</p>
<div class="refsect2">
<a name="NMSettingWimax--network-name"></a><h3>The <code class="literal">“network-name”</code> property</h3>
<pre class="programlisting"> “network-name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Network Service Provider (NSP) name of the WiMAX network this connection
+should use.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingWired.html b/docs/libnm/html/NMSettingWired.html
index a65d2e22d..6255f6c83 100644
--- a/docs/libnm/html/NMSettingWired.html
+++ b/docs/libnm/html/NMSettingWired.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingWired</title>
+<title>NMSettingWired: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingWimax.html" title="NMSettingWimax">
<link rel="next" href="NMSettingWireless.html" title="NMSettingWireless">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -398,7 +398,6 @@ nm_setting_wired_get_port (<em class="parameter"><code><a class="link" href="NMS
<div class="refsect3">
<a name="id-1.4.29.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--port" title="The “port” property"><span class="type">“port”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -424,7 +423,6 @@ nm_setting_wired_get_speed (<em class="parameter"><code><a class="link" href="NM
<div class="refsect3">
<a name="id-1.4.29.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--speed" title="The “speed” property"><span class="type">“speed”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -450,7 +448,6 @@ nm_setting_wired_get_duplex (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.4.29.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--duplex" title="The “duplex” property"><span class="type">“duplex”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -476,7 +473,6 @@ nm_setting_wired_get_auto_negotiate (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.29.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--auto-negotiate" title="The “auto-negotiate” property"><span class="type">“auto-negotiate”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -502,7 +498,6 @@ nm_setting_wired_get_mac_address (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.29.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -529,7 +524,6 @@ nm_setting_wired_get_cloned_mac_address
<div class="refsect3">
<a name="id-1.4.29.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--cloned-mac-address" title="The “cloned-mac-address” property"><span class="type">“cloned-mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -556,7 +550,6 @@ nm_setting_wired_get_mac_address_blacklist
<div class="refsect3">
<a name="id-1.4.29.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--mac-address-blacklist" title="The “mac-address-blacklist” property"><span class="type">“mac-address-blacklist”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -583,7 +576,6 @@ nm_setting_wired_get_num_mac_blacklist_items
<div class="refsect3">
<a name="id-1.4.29.8.10.5"></a><h4>Returns</h4>
<p> the number of blacklisted MAC addresses</p>
-<p></p>
</div>
</div>
<hr>
@@ -620,7 +612,6 @@ nm_setting_wired_get_mac_blacklist_item
<p> the blacklisted MAC address string (hex-digits-and-colons notation)
at index <em class="parameter"><code>idx</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -657,7 +648,6 @@ nm_setting_wired_add_mac_blacklist_item
<a name="id-1.4.29.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was added; <code class="literal">FALSE</code> if the MAC address
is invalid or was already present</p>
-<p></p>
</div>
</div>
<hr>
@@ -727,7 +717,6 @@ the blacklist</p></td>
<div class="refsect3">
<a name="id-1.4.29.8.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -776,7 +765,6 @@ nm_setting_wired_get_mtu (<em class="parameter"><code><a class="link" href="NMSe
<div class="refsect3">
<a name="id-1.4.29.8.16.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWired.html#NMSettingWired--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -834,7 +822,6 @@ of 'qeth', 'lcs', or 'ctc'.</p>
<div class="refsect3">
<a name="id-1.4.29.8.18.6"></a><h4>Returns</h4>
<p> the s390 device type</p>
-<p></p>
</div>
</div>
<hr>
@@ -863,7 +850,6 @@ option individually using <a class="link" href="NMSettingWired.html#nm-setting-w
<div class="refsect3">
<a name="id-1.4.29.8.19.6"></a><h4>Returns</h4>
<p> the number of s390-specific device options</p>
-<p></p>
</div>
</div>
<hr>
@@ -920,7 +906,6 @@ modified. </p></td>
<p> <code class="literal">TRUE</code> on success if the index was valid and an option was found,
<code class="literal">FALSE</code> if the index was invalid (ie, greater than the number of options
currently held by the setting)</p>
-<p></p>
</div>
</div>
<hr>
@@ -959,7 +944,6 @@ nm_setting_wired_get_s390_option_by_key
<a name="id-1.4.29.8.21.6"></a><h4>Returns</h4>
<p> the value, or <code class="literal">NULL</code> if the key/value pair was never added to the
setting; the value is owned by the setting and must not be modified</p>
-<p></p>
</div>
</div>
<hr>
@@ -1004,7 +988,6 @@ may already exist.</p>
<a name="id-1.4.29.8.22.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was valid and was added to the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1042,7 +1025,6 @@ list.</p>
<a name="id-1.4.29.8.23.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the option was found and removed from the internal option
list, <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1080,96 +1062,72 @@ nm_setting_wired_get_valid_s390_options
<a name="NM-SETTING-WIRED-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIRED_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_SETTING_NAME "802-3-ethernet"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-PORT:CAPS"></a><h3>NM_SETTING_WIRED_PORT</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_PORT "port"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-SPEED:CAPS"></a><h3>NM_SETTING_WIRED_SPEED</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_SPEED "speed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-DUPLEX:CAPS"></a><h3>NM_SETTING_WIRED_DUPLEX</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_DUPLEX "duplex"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-AUTO-NEGOTIATE:CAPS"></a><h3>NM_SETTING_WIRED_AUTO_NEGOTIATE</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_AUTO_NEGOTIATE "auto-negotiate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRED_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-CLONED-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRED_CLONED_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_CLONED_MAC_ADDRESS "cloned-mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-MAC-ADDRESS-BLACKLIST:CAPS"></a><h3>NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST "mac-address-blacklist"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-MTU:CAPS"></a><h3>NM_SETTING_WIRED_MTU</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-S390-SUBCHANNELS:CAPS"></a><h3>NM_SETTING_WIRED_S390_SUBCHANNELS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_S390_SUBCHANNELS "s390-subchannels"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-S390-NETTYPE:CAPS"></a><h3>NM_SETTING_WIRED_S390_NETTYPE</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_S390_NETTYPE "s390-nettype"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRED-S390-OPTIONS:CAPS"></a><h3>NM_SETTING_WIRED_S390_OPTIONS</h3>
<pre class="programlisting">#define NM_SETTING_WIRED_S390_OPTIONS "s390-options"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1177,7 +1135,9 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--auto-negotiate"></a><h3>The <code class="literal">“auto-negotiate”</code> property</h3>
<pre class="programlisting"> “auto-negotiate” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, allow auto-negotiation of port speed and duplex mode. If
+<code class="literal">FALSE</code>, do not allow auto-negotiation, in which case the "speed" and
+"duplex" properties should be set.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: TRUE</p>
</div>
@@ -1185,7 +1145,8 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--cloned-mac-address"></a><h3>The <code class="literal">“cloned-mac-address”</code> property</h3>
<pre class="programlisting"> “cloned-mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, request that the device use this MAC address instead of its
+permanent MAC address. This is known as MAC cloning or spoofing.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1193,7 +1154,8 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--duplex"></a><h3>The <code class="literal">“duplex”</code> property</h3>
<pre class="programlisting"> “duplex” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, request that the device only use the specified duplex mode.
+Either "half" or "full".</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1201,7 +1163,9 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the Ethernet device
+whose permanent MAC address matches. This property does not change the
+MAC address of the device (i.e. MAC spoofing).</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1209,14 +1173,18 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--mac-address-blacklist"></a><h3>The <code class="literal">“mac-address-blacklist”</code> property</h3>
<pre class="programlisting"> “mac-address-blacklist” <span class="type">GStrv</span></pre>
-<p></p>
+<p>If specified, this connection will never apply to the Ethernet device
+whose permanent MAC address matches an address in the list. Each MAC
+address is in the standard hex-digits-and-colons notation
+(00:11:22:33:44:55).</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, only transmit packets of the specified size or smaller,
+breaking larger packets up into multiple Ethernet frames.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1224,7 +1192,10 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--port"></a><h3>The <code class="literal">“port”</code> property</h3>
<pre class="programlisting"> “port” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Specific port type to use if multiple the device supports multiple
+attachment methods. One of "tp" (Twisted Pair), "aui" (Attachment Unit
+Interface), "bnc" (Thin Ethernet) or "mii" (Media Independent Interface.
+If the device supports only one port type, this setting is ignored.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1232,7 +1203,8 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--s390-nettype"></a><h3>The <code class="literal">“s390-nettype”</code> property</h3>
<pre class="programlisting"> “s390-nettype” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>s390 network device type; one of "qeth", "lcs", or "ctc", representing
+the different types of virtual network devices available on s390 systems.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1240,28 +1212,38 @@ nm_setting_wired_get_valid_s390_options
<div class="refsect2">
<a name="NMSettingWired--s390-options"></a><h3>The <code class="literal">“s390-options”</code> property</h3>
<pre class="programlisting"> “s390-options” <span class="type">GHashTable</span> *</pre>
-<p></p>
+<p>Dictionary of key/value pairs of s390-specific device options. Both keys
+and values must be strings. Allowed keys include "portno", "layer2",
+"portname", "protocol", among others. Key names must contain only
+alphanumeric characters (ie, [a-zA-Z0-9]).</p>
+<p>Type: GHashTable(utf8,utf8)</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--s390-subchannels"></a><h3>The <code class="literal">“s390-subchannels”</code> property</h3>
<pre class="programlisting"> “s390-subchannels” <span class="type">GStrv</span></pre>
-<p></p>
+<p>Identifies specific subchannels that this network device uses for
+communication with z/VM or s390 host. Like the
+<a class="link" href="NMSettingWired.html#NMSettingWired--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property for non-z/VM devices, this property
+can be used to ensure this connection only applies to the network device
+that uses these subchannels. The list should contain exactly 3 strings,
+and each string may only be composed of hexadecimal characters and the
+period (.) character.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWired--speed"></a><h3>The <code class="literal">“speed”</code> property</h3>
<pre class="programlisting"> “speed” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, request that the device use only the specified speed. In
+Mbit/s, ie 100 == 100Mbit/s.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingWireless.html b/docs/libnm/html/NMSettingWireless.html
index 1c59261b1..f4cd00502 100644
--- a/docs/libnm/html/NMSettingWireless.html
+++ b/docs/libnm/html/NMSettingWireless.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingWireless</title>
+<title>NMSettingWireless: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingWired.html" title="NMSettingWired">
<link rel="next" href="NMSettingWirelessSecurity.html" title="NMSettingWirelessSecurity">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -456,7 +456,6 @@ nm_setting_wireless_get_mode (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.30.8.4.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mode" title="The “mode” property"><span class="type">“mode”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -482,7 +481,6 @@ nm_setting_wireless_get_band (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.30.8.5.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--band" title="The “band” property"><span class="type">“band”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -508,7 +506,6 @@ nm_setting_wireless_get_channel (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.4.30.8.6.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--channel" title="The “channel” property"><span class="type">“channel”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -534,7 +531,6 @@ nm_setting_wireless_get_bssid (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.4.30.8.7.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--bssid" title="The “bssid” property"><span class="type">“bssid”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -560,7 +556,6 @@ nm_setting_wireless_get_rate (<em class="parameter"><code><a class="link" href="
<div class="refsect3">
<a name="id-1.4.30.8.8.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--rate" title="The “rate” property"><span class="type">“rate”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -586,7 +581,6 @@ nm_setting_wireless_get_tx_power (<em class="parameter"><code><a class="link" hr
<div class="refsect3">
<a name="id-1.4.30.8.9.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--tx-power" title="The “tx-power” property"><span class="type">“tx-power”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -612,7 +606,6 @@ nm_setting_wireless_get_mac_address (<em class="parameter"><code><a class="link"
<div class="refsect3">
<a name="id-1.4.30.8.10.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mac-address" title="The “mac-address” property"><span class="type">“mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -639,7 +632,6 @@ nm_setting_wireless_get_cloned_mac_address
<div class="refsect3">
<a name="id-1.4.30.8.11.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--cloned-mac-address" title="The “cloned-mac-address” property"><span class="type">“cloned-mac-address”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -666,7 +658,6 @@ nm_setting_wireless_get_mac_address_blacklist
<div class="refsect3">
<a name="id-1.4.30.8.12.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mac-address-blacklist" title="The “mac-address-blacklist” property"><span class="type">“mac-address-blacklist”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -693,7 +684,6 @@ nm_setting_wireless_get_num_mac_blacklist_items
<div class="refsect3">
<a name="id-1.4.30.8.13.5"></a><h4>Returns</h4>
<p> the number of blacklisted MAC addresses</p>
-<p></p>
</div>
</div>
<hr>
@@ -730,7 +720,6 @@ nm_setting_wireless_get_mac_blacklist_item
<p> the blacklisted MAC address string (hex-digits-and-colons notation)
at index <em class="parameter"><code>idx</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -767,7 +756,6 @@ nm_setting_wireless_add_mac_blacklist_item
<a name="id-1.4.30.8.15.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was added; <code class="literal">FALSE</code> if the MAC address
is invalid or was already present</p>
-<p></p>
</div>
</div>
<hr>
@@ -837,7 +825,6 @@ the blacklist</p></td>
<div class="refsect3">
<a name="id-1.4.30.8.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the MAC address was found and removed; <code class="literal">FALSE</code> if it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -886,7 +873,6 @@ nm_setting_wireless_get_mtu (<em class="parameter"><code><a class="link" href="N
<div class="refsect3">
<a name="id-1.4.30.8.19.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--mtu" title="The “mtu” property"><span class="type">“mtu”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -912,7 +898,6 @@ nm_setting_wireless_get_hidden (<em class="parameter"><code><a class="link" href
<div class="refsect3">
<a name="id-1.4.30.8.20.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWireless.html#NMSettingWireless--hidden" title="The “hidden” property"><span class="type">“hidden”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -951,7 +936,6 @@ not be preserved.</p>
<a name="id-1.4.30.8.21.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>bssid</code></em>
was already known, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -978,7 +962,6 @@ nm_setting_wireless_get_num_seen_bssids
<div class="refsect3">
<a name="id-1.4.30.8.22.5"></a><h4>Returns</h4>
<p> the number of BSSIDs in the previously seen BSSID list</p>
-<p></p>
</div>
</div>
<hr>
@@ -1013,7 +996,6 @@ nm_setting_wireless_get_seen_bssid (<em class="parameter"><code><a class="link"
<a name="id-1.4.30.8.23.5"></a><h4>Returns</h4>
<p> the BSSID at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1081,7 +1063,6 @@ capabilities</p></td>
<a name="id-1.4.30.8.24.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the given settings are compatible with the access point's
security flags and mode, <code class="literal">FALSE</code> if they are not.</p>
-<p></p>
</div>
</div>
</div>
@@ -1091,112 +1072,84 @@ security flags and mode, <code class="literal">FALSE</code> if they are not.</p>
<a name="NM-SETTING-WIRELESS-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIRELESS_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SETTING_NAME "802-11-wireless"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SSID:CAPS"></a><h3>NM_SETTING_WIRELESS_SSID</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SSID "ssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MODE:CAPS"></a><h3>NM_SETTING_WIRELESS_MODE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MODE "mode"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-BAND:CAPS"></a><h3>NM_SETTING_WIRELESS_BAND</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_BAND "band"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-CHANNEL:CAPS"></a><h3>NM_SETTING_WIRELESS_CHANNEL</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_CHANNEL "channel"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-BSSID:CAPS"></a><h3>NM_SETTING_WIRELESS_BSSID</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_BSSID "bssid"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-RATE:CAPS"></a><h3>NM_SETTING_WIRELESS_RATE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_RATE "rate"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-TX-POWER:CAPS"></a><h3>NM_SETTING_WIRELESS_TX_POWER</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_TX_POWER "tx-power"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRELESS_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MAC_ADDRESS "mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-CLONED-MAC-ADDRESS:CAPS"></a><h3>NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS "cloned-mac-address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MAC-ADDRESS-BLACKLIST:CAPS"></a><h3>NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST "mac-address-blacklist"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-MTU:CAPS"></a><h3>NM_SETTING_WIRELESS_MTU</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SEEN-BSSIDS:CAPS"></a><h3>NM_SETTING_WIRELESS_SEEN_BSSIDS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SEEN_BSSIDS "seen-bssids"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-HIDDEN:CAPS"></a><h3>NM_SETTING_WIRELESS_HIDDEN</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_HIDDEN "hidden"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1227,7 +1180,12 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--band"></a><h3>The <code class="literal">“band”</code> property</h3>
<pre class="programlisting"> “band” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>802.11 frequency band of the network. One of "a" for 5GHz 802.11a or
+"bg" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network
+to the specific band, i.e. if "a" is specified, the device will not
+associate with the same network in the 2.4GHz band even if the network's
+settings are compatible. This setting depends on specific driver
+capability and may not work with all drivers.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1235,7 +1193,10 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--bssid"></a><h3>The <code class="literal">“bssid”</code> property</h3>
<pre class="programlisting"> “bssid” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, directs the device to only associate with the given access
+point. This capability is highly driver dependent and not supported by
+all devices. Note: this property does not control the BSSID used when
+creating an Ad-Hoc network and is unlikely to in the future.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1243,7 +1204,10 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--channel"></a><h3>The <code class="literal">“channel”</code> property</h3>
<pre class="programlisting"> “channel” <span class="type">guint</span></pre>
-<p></p>
+<p>Wireless channel to use for the Wi-Fi connection. The device will only
+join (or create for Ad-Hoc networks) a Wi-Fi network on the specified
+channel. Because channel numbers overlap between bands, this property
+also requires the "band" property to be set.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1251,7 +1215,8 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--cloned-mac-address"></a><h3>The <code class="literal">“cloned-mac-address”</code> property</h3>
<pre class="programlisting"> “cloned-mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, request that the Wi-Fi device use this MAC address instead
+of its permanent MAC address. This is known as MAC cloning or spoofing.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1259,7 +1224,11 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--hidden"></a><h3>The <code class="literal">“hidden”</code> property</h3>
<pre class="programlisting"> “hidden” <span class="type">gboolean</span></pre>
-<p></p>
+<p>If <code class="literal">TRUE</code>, indicates this network is a non-broadcasting network that hides
+its SSID. In this case various workarounds may take place, such as
+probe-scanning the SSID for more reliable network discovery. However,
+these workarounds expose inherent insecurities with hidden SSID networks,
+and thus hidden SSID networks should be used with caution.</p>
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
@@ -1267,7 +1236,9 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--mac-address"></a><h3>The <code class="literal">“mac-address”</code> property</h3>
<pre class="programlisting"> “mac-address” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>If specified, this connection will only apply to the Wi-Fi device whose
+permanent MAC address matches. This property does not change the MAC
+address of the device (i.e. MAC spoofing).</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1275,14 +1246,17 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--mac-address-blacklist"></a><h3>The <code class="literal">“mac-address-blacklist”</code> property</h3>
<pre class="programlisting"> “mac-address-blacklist” <span class="type">GStrv</span></pre>
-<p></p>
+<p>A list of permanent MAC addresses of Wi-Fi devices to which this
+connection should never apply. Each MAC address should be given in the
+standard hex-digits-and-colons notation (eg "00:11:22:33:44:55").</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--mode"></a><h3>The <code class="literal">“mode”</code> property</h3>
<pre class="programlisting"> “mode” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Wi-Fi network mode; one of "infrastructure", "adhoc" or "ap". If blank,
+infrastructure is assumed.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1290,7 +1264,8 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--mtu"></a><h3>The <code class="literal">“mtu”</code> property</h3>
<pre class="programlisting"> “mtu” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, only transmit packets of the specified size or smaller,
+breaking larger packets up into multiple Ethernet frames.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1298,7 +1273,10 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--rate"></a><h3>The <code class="literal">“rate”</code> property</h3>
<pre class="programlisting"> “rate” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, directs the device to only use the specified bitrate for
+communication with the access point. Units are in Kb/s, ie 5500 = 5.5
+Mbit/s. This property is highly driver dependent and not all devices
+support setting a static bitrate.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
@@ -1306,28 +1284,34 @@ for this connection.</p>
<div class="refsect2">
<a name="NMSettingWireless--seen-bssids"></a><h3>The <code class="literal">“seen-bssids”</code> property</h3>
<pre class="programlisting"> “seen-bssids” <span class="type">GStrv</span></pre>
-<p></p>
+<p>A list of BSSIDs (each BSSID formatted as a MAC address like
+"00:11:22:33:44:55") that have been detected as part of the Wi-Fi
+network. NetworkManager internally tracks previously seen BSSIDs. The
+property is only meant for reading and reflects the BSSID list of
+NetworkManager. The changes you make to this property will not be
+preserved.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--ssid"></a><h3>The <code class="literal">“ssid”</code> property</h3>
<pre class="programlisting"> “ssid” <span class="type">GBytes</span> *</pre>
-<p></p>
+<p>SSID of the Wi-Fi network. Must be specified.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWireless--tx-power"></a><h3>The <code class="literal">“tx-power”</code> property</h3>
<pre class="programlisting"> “tx-power” <span class="type">guint</span></pre>
-<p></p>
+<p>If non-zero, directs the device to use the specified transmit power.
+Units are dBm. This property is highly driver dependent and not all
+devices support setting a static transmit power.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: 0</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSettingWirelessSecurity.html b/docs/libnm/html/NMSettingWirelessSecurity.html
index 4542c1134..59829facf 100644
--- a/docs/libnm/html/NMSettingWirelessSecurity.html
+++ b/docs/libnm/html/NMSettingWirelessSecurity.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSettingWirelessSecurity</title>
+<title>NMSettingWirelessSecurity: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="NMSettingWireless.html" title="NMSettingWireless">
<link rel="next" href="ch04.html" title="Device and Runtime Configuration API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -538,7 +538,6 @@ nm_setting_wireless_security_get_key_mgmt
<div class="refsect3">
<a name="id-1.4.31.8.3.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--key-mgmt" title="The “key-mgmt” property"><span class="type">“key-mgmt”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -566,7 +565,6 @@ nm_setting_wireless_security_get_num_protos
<a name="id-1.4.31.8.4.5"></a><h4>Returns</h4>
<p> the number of security protocols this connection allows when
connecting to secure Wi-Fi networks</p>
-<p></p>
</div>
</div>
<hr>
@@ -602,7 +600,6 @@ nm_setting_wireless_security_get_proto
<a name="id-1.4.31.8.5.5"></a><h4>Returns</h4>
<p> the protocol at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -644,7 +641,6 @@ with the access point.</p>
<a name="id-1.4.31.8.6.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the protocol was new and and was added to the allowed
protocol list, or <code class="literal">FALSE</code> if it was already in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -711,7 +707,6 @@ nm_setting_wireless_security_remove_proto_by_value
<div class="refsect3">
<a name="id-1.4.31.8.8.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the protocol was found and removed; <code class="literal">FALSE</code> it it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -762,7 +757,6 @@ nm_setting_wireless_security_get_num_pairwise
<div class="refsect3">
<a name="id-1.4.31.8.10.5"></a><h4>Returns</h4>
<p> the number of pairwise encryption algorithms in the allowed list</p>
-<p></p>
</div>
</div>
<hr>
@@ -800,7 +794,6 @@ list.</p>
<a name="id-1.4.31.8.11.6"></a><h4>Returns</h4>
<p> the pairwise encryption algorithm at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -840,7 +833,6 @@ compatible with this connection.</p>
<a name="id-1.4.31.8.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the algorithm was added to the list, <code class="literal">FALSE</code> if it was
already in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -909,7 +901,6 @@ algorithm list.</p>
<div class="refsect3">
<a name="id-1.4.31.8.14.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the encryption algorith was found and removed; <code class="literal">FALSE</code> it it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -960,7 +951,6 @@ nm_setting_wireless_security_get_num_groups
<div class="refsect3">
<a name="id-1.4.31.8.16.5"></a><h4>Returns</h4>
<p> the number of groupwise encryption algorithms in the allowed list</p>
-<p></p>
</div>
</div>
<hr>
@@ -998,7 +988,6 @@ list.</p>
<a name="id-1.4.31.8.17.6"></a><h4>Returns</h4>
<p> the groupwise encryption algorithm at index <em class="parameter"><code>i</code></em>
</p>
-<p></p>
</div>
</div>
<hr>
@@ -1039,7 +1028,6 @@ compatible with this connection.</p>
<a name="id-1.4.31.8.18.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the algorithm was added to the list, <code class="literal">FALSE</code> if it was
already in the list</p>
-<p></p>
</div>
</div>
<hr>
@@ -1109,7 +1097,6 @@ algorithm list.</p>
<div class="refsect3">
<a name="id-1.4.31.8.20.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the algorithm was found and removed; <code class="literal">FALSE</code> it it was not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1159,7 +1146,6 @@ nm_setting_wireless_security_get_psk (<em class="parameter"><code><a class="link
<div class="refsect3">
<a name="id-1.4.31.8.22.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--psk" title="The “psk” property"><span class="type">“psk”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1187,7 +1173,6 @@ nm_setting_wireless_security_get_psk_flags
<a name="id-1.4.31.8.23.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--psk" title="The “psk” property"><span class="type">“psk”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1214,7 +1199,6 @@ nm_setting_wireless_security_get_leap_username
<div class="refsect3">
<a name="id-1.4.31.8.24.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-username" title="The “leap-username” property"><span class="type">“leap-username”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1241,7 +1225,6 @@ nm_setting_wireless_security_get_leap_password
<div class="refsect3">
<a name="id-1.4.31.8.25.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-password" title="The “leap-password” property"><span class="type">“leap-password”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1269,7 +1252,6 @@ nm_setting_wireless_security_get_leap_password_flags
<a name="id-1.4.31.8.26.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the
<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-password" title="The “leap-password” property"><span class="type">“leap-password”</span></a></p>
-<p></p>
</div>
</div>
<hr>
@@ -1304,7 +1286,6 @@ nm_setting_wireless_security_get_wep_key
<div class="refsect3">
<a name="id-1.4.31.8.27.5"></a><h4>Returns</h4>
<p> the WEP key at the given index</p>
-<p></p>
</div>
</div>
<hr>
@@ -1370,7 +1351,6 @@ nm_setting_wireless_security_get_wep_tx_keyidx
<div class="refsect3">
<a name="id-1.4.31.8.29.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-tx-keyidx" title="The “wep-tx-keyidx” property"><span class="type">“wep-tx-keyidx”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1397,7 +1377,6 @@ nm_setting_wireless_security_get_auth_alg
<div class="refsect3">
<a name="id-1.4.31.8.30.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--auth-alg" title="The “auth-alg” property"><span class="type">“auth-alg”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1424,7 +1403,6 @@ nm_setting_wireless_security_get_wep_key_flags
<div class="refsect3">
<a name="id-1.4.31.8.31.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a> pertaining to the all WEP keys</p>
-<p></p>
</div>
</div>
<hr>
@@ -1451,7 +1429,6 @@ nm_setting_wireless_security_get_wep_key_type
<div class="refsect3">
<a name="id-1.4.31.8.32.5"></a><h4>Returns</h4>
<p> the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key-type" title="The “wep-key-type” property"><span class="type">“wep-key-type”</span></a> property of the setting</p>
-<p></p>
</div>
</div>
</div>
@@ -1461,8 +1438,6 @@ nm_setting_wireless_security_get_wep_key_type
<a name="NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_SETTING_NAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_SETTING_NAME "802-11-wireless-security"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1528,136 +1503,102 @@ the actual WEP key using the MD5 hash algorithm.</p>
<a name="NM-SETTING-WIRELESS-SECURITY-KEY-MGMT:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_KEY_MGMT</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_KEY_MGMT "key-mgmt"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-TX-KEYIDX:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX "wep-tx-keyidx"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-AUTH-ALG:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_AUTH_ALG</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_AUTH_ALG "auth-alg"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PROTO:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PROTO</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PROTO "proto"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PAIRWISE:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PAIRWISE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PAIRWISE "pairwise"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-GROUP:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_GROUP</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_GROUP "group"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-LEAP-USERNAME:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME "leap-username"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY0:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY0</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY0 "wep-key0"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY1:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY1</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY1 "wep-key1"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY2:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY2</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY2 "wep-key2"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY3:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY3</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY3 "wep-key3"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY-FLAGS:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS "wep-key-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-WEP-KEY-TYPE:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE "wep-key-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PSK:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PSK</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PSK "psk"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-PSK-FLAGS:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS "psk-flags"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-LEAP-PASSWORD:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD "leap-password"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTING-WIRELESS-SECURITY-LEAP-PASSWORD-FLAGS:CAPS"></a><h3>NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS</h3>
<pre class="programlisting">#define NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS "leap-password-flags"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -1665,7 +1606,11 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--auth-alg"></a><h3>The <code class="literal">“auth-alg”</code> property</h3>
<pre class="programlisting"> “auth-alg” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>When WEP is used (ie, key-mgmt = "none" or "ieee8021x") indicate the
+802.11 authentication algorithm required by the AP here. One of "open"
+for Open System, "shared" for Shared Key, or "leap" for Cisco LEAP. When
+using Cisco LEAP (ie, key-mgmt = "ieee8021x" and auth-alg = "leap") the
+"leap-username" and "leap-password" properties must be specified.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1673,14 +1618,20 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--group"></a><h3>The <code class="literal">“group”</code> property</h3>
<pre class="programlisting"> “group” <span class="type">GStrv</span></pre>
-<p></p>
+<p>A list of group/broadcast encryption algorithms which prevents
+connections to Wi-Fi networks that do not utilize one of the algorithms
+in the list. For maximum compatibility leave this property empty. Each
+list element may be one of "wep40", "wep104", "tkip", or "ccmp".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--key-mgmt"></a><h3>The <code class="literal">“key-mgmt”</code> property</h3>
<pre class="programlisting"> “key-mgmt” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Key management used for the connection. One of "none" (WEP), "ieee8021x"
+(Dynamic WEP), "wpa-none" (Ad-Hoc WPA-PSK), "wpa-psk" (infrastructure
+WPA-PSK), or "wpa-eap" (WPA-Enterprise). This property must be set for
+any Wi-Fi connection that uses security.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1688,7 +1639,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--leap-password"></a><h3>The <code class="literal">“leap-password”</code> property</h3>
<pre class="programlisting"> “leap-password” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The login password for legacy LEAP connections (ie, key-mgmt =
+"ieee8021x" and auth-alg = "leap").</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1696,14 +1648,16 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--leap-password-flags"></a><h3>The <code class="literal">“leap-password-flags”</code> property</h3>
<pre class="programlisting"> “leap-password-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the
+<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--leap-password" title="The “leap-password” property"><span class="type">“leap-password”</span></a> property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--leap-username"></a><h3>The <code class="literal">“leap-username”</code> property</h3>
<pre class="programlisting"> “leap-username” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The login username for legacy LEAP connections (ie, key-mgmt =
+"ieee8021x" and auth-alg = "leap").</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1711,21 +1665,31 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--pairwise"></a><h3>The <code class="literal">“pairwise”</code> property</h3>
<pre class="programlisting"> “pairwise” <span class="type">GStrv</span></pre>
-<p></p>
+<p>A list of pairwise encryption algorithms which prevents connections to
+Wi-Fi networks that do not utilize one of the algorithms in the list.
+For maximum compatibility leave this property empty. Each list element
+may be one of "tkip" or "ccmp".</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--proto"></a><h3>The <code class="literal">“proto”</code> property</h3>
<pre class="programlisting"> “proto” <span class="type">GStrv</span></pre>
-<p></p>
+<p>List of strings specifying the allowed WPA protocol versions to use.
+Each element may be one "wpa" (allow WPA) or "rsn" (allow WPA2/RSN). If
+not specified, both WPA and RSN connections are allowed.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--psk"></a><h3>The <code class="literal">“psk”</code> property</h3>
<pre class="programlisting"> “psk” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Pre-Shared-Key for WPA networks. If the key is 64-characters long, it
+must contain only hexadecimal characters and is interpreted as a
+hexadecimal WPA key. Otherwise, the key must be between 8 and 63 ASCII
+characters (as specified in the 802.11i standard) and is interpreted as a
+WPA passphrase, and is hashed to derive the actual WPA-PSK used when
+connecting to the Wi-Fi network.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1733,21 +1697,29 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--psk-flags"></a><h3>The <code class="literal">“psk-flags”</code> property</h3>
<pre class="programlisting"> “psk-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--psk" title="The “psk” property"><span class="type">“psk”</span></a>
+property.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key-flags"></a><h3>The <code class="literal">“wep-key-flags”</code> property</h3>
<pre class="programlisting"> “wep-key-flags” <a class="link" href="NMSetting.html#NMSettingSecretFlags" title="enum NMSettingSecretFlags"><span class="type">NMSettingSecretFlags</span></a></pre>
-<p></p>
+<p>Flags indicating how to handle the <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key0" title="The “wep-key0” property"><span class="type">“wep-key0”</span></a>,
+<a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key1" title="The “wep-key1” property"><span class="type">“wep-key1”</span></a>, <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key2" title="The “wep-key2” property"><span class="type">“wep-key2”</span></a>,
+and <a class="link" href="NMSettingWirelessSecurity.html#NMSettingWirelessSecurity--wep-key3" title="The “wep-key3” property"><span class="type">“wep-key3”</span></a> properties.</p>
<p>Flags: Read / Write</p>
</div>
<hr>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key-type"></a><h3>The <code class="literal">“wep-key-type”</code> property</h3>
<pre class="programlisting"> “wep-key-type” <a class="link" href="NMSettingWirelessSecurity.html#NMWepKeyType" title="enum NMWepKeyType"><span class="type">NMWepKeyType</span></a></pre>
-<p></p>
+<p>Controls the interpretation of WEP keys. Allowed values are
+<a class="link" href="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-KEY:CAPS"><code class="literal">NM_WEP_KEY_TYPE_KEY</code></a>, in which case the key is either a 10- or
+26-character hexadecimal string, or a 5- or 13-character ASCII password;
+or <a class="link" href="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-PASSPHRASE:CAPS"><code class="literal">NM_WEP_KEY_TYPE_PASSPHRASE</code></a>, in which case the passphrase is provided
+as a string and will be hashed using the de-facto MD5 method to derive
+the actual WEP key.</p>
<p>Flags: Read / Write / Construct</p>
<p>Default value: NM_WEP_KEY_TYPE_UNKNOWN</p>
</div>
@@ -1755,7 +1727,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key0"></a><h3>The <code class="literal">“wep-key0”</code> property</h3>
<pre class="programlisting"> “wep-key0” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 0 WEP key. This is the WEP key used in most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1763,7 +1736,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key1"></a><h3>The <code class="literal">“wep-key1”</code> property</h3>
<pre class="programlisting"> “wep-key1” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 1 WEP key. This WEP index is not used by most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1771,7 +1745,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key2"></a><h3>The <code class="literal">“wep-key2”</code> property</h3>
<pre class="programlisting"> “wep-key2” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 2 WEP key. This WEP index is not used by most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1779,7 +1754,8 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-key3"></a><h3>The <code class="literal">“wep-key3”</code> property</h3>
<pre class="programlisting"> “wep-key3” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Index 3 WEP key. This WEP index is not used by most networks. See the
+"wep-key-type" property for a description of how this key is interpreted.</p>
<p>Flags: Read / Write</p>
<p>Default value: NULL</p>
</div>
@@ -1787,7 +1763,10 @@ the actual WEP key using the MD5 hash algorithm.</p>
<div class="refsect2">
<a name="NMSettingWirelessSecurity--wep-tx-keyidx"></a><h3>The <code class="literal">“wep-tx-keyidx”</code> property</h3>
<pre class="programlisting"> “wep-tx-keyidx” <span class="type">guint</span></pre>
-<p></p>
+<p>When static WEP is used (ie, key-mgmt = "none") and a non-default WEP key
+index is used by the AP, put that WEP key index here. Valid values are 0
+(default key) through 3. Note that some consumer access points (like the
+Linksys WRT54G) number the keys 1 - 4.</p>
<p>Flags: Read / Write / Construct</p>
<p>Allowed values: &lt;= 3</p>
<p>Default value: 0</p>
@@ -1795,7 +1774,6 @@ the actual WEP key using the MD5 hash algorithm.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMSimpleConnection.html b/docs/libnm/html/NMSimpleConnection.html
index b1e77edbb..5fa62ec03 100644
--- a/docs/libnm/html/NMSimpleConnection.html
+++ b/docs/libnm/html/NMSimpleConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMSimpleConnection</title>
+<title>NMSimpleConnection: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="libnm-NMConnection.html" title="NMConnection">
<link rel="next" href="NMSetting.html" title="NMSetting">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -75,8 +75,6 @@
</div>
<div class="refsect1">
<a name="NMSimpleConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMSimpleConnection.functions_details"></a><h2>Functions</h2>
@@ -166,7 +164,6 @@ and properties as the source <a href="https://developer.gnome.org/libnm-util/0.9
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMVpnConnection.html b/docs/libnm/html/NMVpnConnection.html
index e1e8ab620..de3a08b49 100644
--- a/docs/libnm/html/NMVpnConnection.html
+++ b/docs/libnm/html/NMVpnConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMVpnConnection</title>
+<title>NMVpnConnection: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMActiveConnection.html" title="NMActiveConnection">
<link rel="next" href="NMRemoteConnection.html" title="NMRemoteConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -127,8 +127,6 @@
</div>
<div class="refsect1">
<a name="NMVpnConnection.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMVpnConnection.functions_details"></a><h2>Functions</h2>
@@ -155,7 +153,6 @@ nm_vpn_connection_get_vpn_state (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.5.17.9.2.6"></a><h4>Returns</h4>
<p> the VPN state of the active VPN connection.</p>
-<p></p>
</div>
</div>
<hr>
@@ -183,7 +180,6 @@ nm_vpn_connection_get_banner (<em class="parameter"><code><a class="link" href="
<a name="id-1.5.17.9.3.6"></a><h4>Returns</h4>
<p> the VPN login banner of the VPN connection. This is the internal
string used by the connection, and must not be modified.</p>
-<p></p>
</div>
</div>
</div>
@@ -193,16 +189,12 @@ string used by the connection, and must not be modified.</p>
<a name="NM-VPN-CONNECTION-VPN-STATE:CAPS"></a><h3>NM_VPN_CONNECTION_VPN_STATE</h3>
<pre class="programlisting">#define NM_VPN_CONNECTION_VPN_STATE "vpn-state"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-CONNECTION-BANNER:CAPS"></a><h3>NM_VPN_CONNECTION_BANNER</h3>
<pre class="programlisting">#define NM_VPN_CONNECTION_BANNER "banner"
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
@@ -210,7 +202,7 @@ string used by the connection, and must not be modified.</p>
<div class="refsect2">
<a name="NMVpnConnection--banner"></a><h3>The <code class="literal">“banner”</code> property</h3>
<pre class="programlisting"> “banner” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The VPN login banner of the active VPN connection.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -218,7 +210,7 @@ string used by the connection, and must not be modified.</p>
<div class="refsect2">
<a name="NMVpnConnection--vpn-state"></a><h3>The <code class="literal">“vpn-state”</code> property</h3>
<pre class="programlisting"> “vpn-state” <a class="link" href="libnm-nm-vpn-dbus-interface.html#NMVpnConnectionState" title="enum NMVpnConnectionState"><span class="type">NMVpnConnectionState</span></a></pre>
-<p></p>
+<p>The VPN state of the active VPN connection.</p>
<p>Flags: Read</p>
<p>Default value: NM_VPN_CONNECTION_STATE_UNKNOWN</p>
</div>
@@ -237,7 +229,6 @@ user_function (<a class="link" href="NMVpnConnection.html" title="NMVpnConnectio
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMVpnEditor.html b/docs/libnm/html/NMVpnEditor.html
index ee18c74db..d6f1b3cac 100644
--- a/docs/libnm/html/NMVpnEditor.html
+++ b/docs/libnm/html/NMVpnEditor.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMVpnEditor</title>
+<title>NMVpnEditor: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch06.html" title="VPN Plugin API Reference">
<link rel="prev" href="libnm-nm-vpn-dbus-interface.html" title="nm-vpn-dbus-interface">
<link rel="next" href="object-tree.html" title="Object Hierarchy">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -208,8 +208,6 @@
</div>
<div class="refsect1">
<a name="NMVpnEditor.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMVpnEditor.functions_details"></a><h2>Functions</h2>
@@ -217,24 +215,12 @@
<a name="NMVpnEditorPluginFactory"></a><h3>NMVpnEditorPluginFactory ()</h3>
<pre class="programlisting"><a class="link" href="NMVpnEditor.html#NMVpnEditorPlugin"><span class="returnvalue">NMVpnEditorPlugin</span></a> *
<span class="c_punctuation">(</span>*NMVpnEditorPluginFactory<span class="c_punctuation">)</span> (<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.7.3.10.2.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-vpn-editor-plugin-factory"></a><h3>nm_vpn_editor_plugin_factory ()</h3>
<pre class="programlisting"><a class="link" href="NMVpnEditor.html#NMVpnEditorPlugin"><span class="returnvalue">NMVpnEditorPlugin</span></a> *
nm_vpn_editor_plugin_factory (<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.7.3.10.3.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -254,12 +240,6 @@ nm_vpn_editor_plugin_get_editor (<em class="parameter"><code><a class="link" hre
<a name="nm-vpn-editor-plugin-get-capabilities"></a><h3>nm_vpn_editor_plugin_get_capabilities ()</h3>
<pre class="programlisting"><a class="link" href="NMVpnEditor.html#NMVpnEditorPluginCapability" title="enum NMVpnEditorPluginCapability"><span class="returnvalue">NMVpnEditorPluginCapability</span></a>
nm_vpn_editor_plugin_get_capabilities (<em class="parameter"><code><a class="link" href="NMVpnEditor.html#NMVpnEditorPlugin"><span class="type">NMVpnEditorPlugin</span></a> *plugin</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.7.3.10.5.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -282,12 +262,6 @@ nm_vpn_editor_plugin_export (<em class="parameter"><code><a class="link" href="N
<em class="parameter"><code>const <span class="type">char</span> *path</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.7.3.10.7.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -296,12 +270,6 @@ nm_vpn_editor_plugin_export (<em class="parameter"><code><a class="link" href="N
nm_vpn_editor_plugin_get_suggested_filename
(<em class="parameter"><code><a class="link" href="NMVpnEditor.html#NMVpnEditorPlugin"><span class="type">NMVpnEditorPlugin</span></a> *plugin</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.7.3.10.8.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -321,12 +289,6 @@ nm_vpn_editor_get_widget (<em class="parameter"><code><a class="link" href="NMVp
nm_vpn_editor_update_connection (<em class="parameter"><code><a class="link" href="NMVpnEditor.html" title="NMVpnEditor"><span class="type">NMVpnEditor</span></a> *editor</code></em>,
<em class="parameter"><code><a href="https://developer.gnome.org/libnm-util/0.9/NMConnection.html"><span class="type">NMConnection</span></a> *connection</code></em>,
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.7.3.10.10.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
</div>
<div class="refsect1">
@@ -380,24 +342,18 @@ nm_vpn_editor_update_connection (<em class="parameter"><code><a class="link" hre
<a name="NM-VPN-EDITOR-PLUGIN-NAME:CAPS"></a><h3>NM_VPN_EDITOR_PLUGIN_NAME</h3>
<pre class="programlisting">#define NM_VPN_EDITOR_PLUGIN_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-EDITOR-PLUGIN-DESCRIPTION:CAPS"></a><h3>NM_VPN_EDITOR_PLUGIN_DESCRIPTION</h3>
<pre class="programlisting">#define NM_VPN_EDITOR_PLUGIN_DESCRIPTION "description"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-EDITOR-PLUGIN-SERVICE:CAPS"></a><h3>NM_VPN_EDITOR_PLUGIN_SERVICE</h3>
<pre class="programlisting">#define NM_VPN_EDITOR_PLUGIN_SERVICE "service"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -552,7 +508,7 @@ to write values to the connection.</p></td>
<div class="refsect2">
<a name="NMVpnEditorPlugin--description"></a><h3>The <code class="literal">“description”</code> property</h3>
<pre class="programlisting"> “description” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Longer description of the VPN plugin.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -560,7 +516,7 @@ to write values to the connection.</p></td>
<div class="refsect2">
<a name="NMVpnEditorPlugin--name"></a><h3>The <code class="literal">“name”</code> property</h3>
<pre class="programlisting"> “name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>Short display name of the VPN plugin.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -568,7 +524,7 @@ to write values to the connection.</p></td>
<div class="refsect2">
<a name="NMVpnEditorPlugin--service"></a><h3>The <code class="literal">“service”</code> property</h3>
<pre class="programlisting"> “service” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>D-Bus service name of the plugin's VPN service.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -585,7 +541,6 @@ user_function (<a class="link" href="NMVpnEditor.html" title="NMVpnEditor"><span
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/NMWimaxNsp.html b/docs/libnm/html/NMWimaxNsp.html
index 6b4d83071..c91b65e21 100644
--- a/docs/libnm/html/NMWimaxNsp.html
+++ b/docs/libnm/html/NMWimaxNsp.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMWimaxNsp</title>
+<title>NMWimaxNsp: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch04.html" title="Device and Runtime Configuration API Reference">
<link rel="prev" href="NMAccessPoint.html" title="NMAccessPoint">
<link rel="next" href="NMIPConfig.html" title="NMIPConfig">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -149,8 +149,6 @@
</div>
<div class="refsect1">
<a name="NMWimaxNsp.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="NMWimaxNsp.functions_details"></a><h2>Functions</h2>
@@ -177,7 +175,6 @@ nm_wimax_nsp_get_name (<em class="parameter"><code><a class="link" href="NMWimax
<div class="refsect3">
<a name="id-1.5.20.8.2.6"></a><h4>Returns</h4>
<p> the name</p>
-<p></p>
</div>
</div>
<hr>
@@ -204,7 +201,6 @@ nm_wimax_nsp_get_signal_quality (<em class="parameter"><code><a class="link" hre
<div class="refsect3">
<a name="id-1.5.20.8.3.6"></a><h4>Returns</h4>
<p> the signal quality</p>
-<p></p>
</div>
</div>
<hr>
@@ -231,7 +227,6 @@ nm_wimax_nsp_get_network_type (<em class="parameter"><code><a class="link" href=
<div class="refsect3">
<a name="id-1.5.20.8.4.6"></a><h4>Returns</h4>
<p> the network type</p>
-<p></p>
</div>
</div>
<hr>
@@ -314,7 +309,6 @@ against</p></td>
<a name="id-1.5.20.8.6.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection may be activated with this WiMAX NSP,
<code class="literal">FALSE</code> if it cannot be.</p>
-<p></p>
</div>
</div>
</div>
@@ -324,24 +318,18 @@ against</p></td>
<a name="NM-WIMAX-NSP-NAME:CAPS"></a><h3>NM_WIMAX_NSP_NAME</h3>
<pre class="programlisting">#define NM_WIMAX_NSP_NAME "name"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-WIMAX-NSP-SIGNAL-QUALITY:CAPS"></a><h3>NM_WIMAX_NSP_SIGNAL_QUALITY</h3>
<pre class="programlisting">#define NM_WIMAX_NSP_SIGNAL_QUALITY "signal-quality"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-WIMAX-NSP-NETWORK-TYPE:CAPS"></a><h3>NM_WIMAX_NSP_NETWORK_TYPE</h3>
<pre class="programlisting">#define NM_WIMAX_NSP_NETWORK_TYPE "network-type"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -394,7 +382,7 @@ against</p></td>
<div class="refsect2">
<a name="NMWimaxNsp--name"></a><h3>The <code class="literal">“name”</code> property</h3>
<pre class="programlisting"> “name” <span class="type">gchar</span> *</pre>
-<p></p>
+<p>The name of the WiMAX NSP.</p>
<p>Flags: Read</p>
<p>Default value: NULL</p>
</div>
@@ -402,7 +390,7 @@ against</p></td>
<div class="refsect2">
<a name="NMWimaxNsp--network-type"></a><h3>The <code class="literal">“network-type”</code> property</h3>
<pre class="programlisting"> “network-type” <a class="link" href="NMWimaxNsp.html#NMWimaxNspNetworkType" title="enum NMWimaxNspNetworkType"><span class="type">NMWimaxNspNetworkType</span></a></pre>
-<p></p>
+<p>The network type of the WiMAX NSP.</p>
<p>Flags: Read</p>
<p>Default value: NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN</p>
</div>
@@ -410,7 +398,7 @@ against</p></td>
<div class="refsect2">
<a name="NMWimaxNsp--signal-quality"></a><h3>The <code class="literal">“signal-quality”</code> property</h3>
<pre class="programlisting"> “signal-quality” <span class="type">guint</span></pre>
-<p></p>
+<p>The signal quality of the WiMAX NSP.</p>
<p>Flags: Read</p>
<p>Allowed values: &lt;= 100</p>
<p>Default value: 0</p>
@@ -418,7 +406,6 @@ against</p></td>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/annotation-glossary.html b/docs/libnm/html/annotation-glossary.html
index ffa567c1f..ff0568419 100644
--- a/docs/libnm/html/annotation-glossary.html
+++ b/docs/libnm/html/annotation-glossary.html
@@ -2,12 +2,12 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Annotation Glossary</title>
+<title>Annotation Glossary: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -55,6 +55,8 @@
<dd class="glossdef"><p>The callback is valid until first called.</p></dd>
<dt><span class="glossterm"><a name="annotation-glossterm-scope%20call"></a>scope call</span></dt>
<dd class="glossdef"><p>The callback is valid only during the call to the method.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-skip"></a>skip</span></dt>
+<dd class="glossdef"><p>Exposed in C code, not necessarily available in other languages.</p></dd>
<a name="glsT"></a><h3 class="title">T</h3>
<dt><span class="glossterm"><a name="annotation-glossterm-transfer%20container"></a>transfer container</span></dt>
<dd class="glossdef"><p>Free data container after the code is done.</p></dd>
@@ -66,7 +68,6 @@
<dd class="glossdef"><p>Override the parsed C type with given type.</p></dd>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/api-index-full.html b/docs/libnm/html/api-index-full.html
index e64d64775..aac846df6 100644
--- a/docs/libnm/html/api-index-full.html
+++ b/docs/libnm/html/api-index-full.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: API Index</title>
+<title>API Index: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="object-tree.html" title="Object Hierarchy">
<link rel="next" href="annotation-glossary.html" title="Annotation Glossary">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -27,6 +27,8 @@
 <span class="dim">|</span> 
<a class="shortcut" href="#idxI">I</a>
 <span class="dim">|</span> 
+ <a class="shortcut" href="#idxK">K</a>
+  <span class="dim">|</span> 
<a class="shortcut" href="#idxM">M</a>
 <span class="dim">|</span> 
<a class="shortcut" href="#idxO">O</a>
@@ -390,6 +392,10 @@
<a class="link" href="libnm-nm-version.html#NM-AVAILABLE-IN-1-0:CAPS" title="NM_AVAILABLE_IN_1_0">NM_AVAILABLE_IN_1_0</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
</dt>
<dd></dd>
+<dt>
+<a class="link" href="libnm-nm-version.html#NM-AVAILABLE-IN-1-0-4:CAPS" title="NM_AVAILABLE_IN_1_0_4">NM_AVAILABLE_IN_1_0_4</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
+</dt>
+<dd></dd>
<a name="idxB"></a><h3 class="title">B</h3>
<dt>
<a class="link" href="libnm-nm-dbus-interface.html#NMBluetoothCapabilities" title="enum NMBluetoothCapabilities">NMBluetoothCapabilities</a>, enum in <a class="link" href="libnm-nm-dbus-interface.html" title="nm-dbus-interface">nm-dbus-interface</a>
@@ -1342,6 +1348,14 @@
</dt>
<dd></dd>
<dt>
+DEFINE_KF_LIST_WRAPPER_PROTO, macro in nm-keyfile-utils
+</dt>
+<dd></dd>
+<dt>
+DEFINE_KF_WRAPPER_PROTO, macro in nm-keyfile-utils
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="libnm-nm-version.html#NM-DEPRECATED-IN-0-9-10:CAPS" title="NM_DEPRECATED_IN_0_9_10">NM_DEPRECATED_IN_0_9_10</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
</dt>
<dd></dd>
@@ -2591,6 +2605,79 @@
<a class="link" href="NMSettingIPConfig.html#nm-ip-route-unref" title="nm_ip_route_unref ()">nm_ip_route_unref</a>, function in <a class="link" href="NMSettingIPConfig.html" title="NMSettingIPConfig">NMSettingIPConfig</a>
</dt>
<dd></dd>
+<a name="idxK"></a><h3 class="title">K</h3>
+<dt>
+NMKeyfileReadHandler, user_function in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NMKeyfileReadType, enum in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NMKeyfileReadTypeDataWarn, struct in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NMKeyfileWarnSeverity, enum in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NMKeyfileWriteHandler, user_function in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NMKeyfileWriteType, enum in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NMKeyfileWriteTypeDataCert, struct in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB, macro in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+NM_KEYFILE_CERT_SCHEME_PREFIX_PATH, macro in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_detect_unqualified_path_scheme, function in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_plugin_get_alias_for_setting_name, function in nm-keyfile-utils
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_plugin_get_setting_name_for_alias, function in nm-keyfile-utils
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_plugin_kf_get_keys, function in nm-keyfile-utils
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_plugin_kf_get_string, function in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_plugin_kf_has_key, function in nm-keyfile-utils
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_plugin_kf_set_string, function in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_read, function in nm-keyfile-internal
+</dt>
+<dd></dd>
+<dt>
+nm_keyfile_write, function in nm-keyfile-internal
+</dt>
+<dd></dd>
<a name="idxM"></a><h3 class="title">M</h3>
<dt>
<a class="link" href="libnm-nm-version.html#NM-MAJOR-VERSION:CAPS" title="NM_MAJOR_VERSION">NM_MAJOR_VERSION</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
@@ -3088,6 +3175,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="NMSettingConnection.html#NMSettingConnection--autoconnect-slaves" title="The “autoconnect-slaves” property">NMSettingConnection:autoconnect-slaves</a>, object property in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="NMSettingConnection.html#NMSettingConnection--gateway-ping-timeout" title="The “gateway-ping-timeout” property">NMSettingConnection:gateway-ping-timeout</a>, object property in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
</dt>
<dd></dd>
@@ -3136,6 +3227,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves">NMSettingConnectionAutoconnectSlaves</a>, enum in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="NMSettingDcb.html#NMSettingDcb--app-fcoe-flags" title="The “app-fcoe-flags” property">NMSettingDcb:app-fcoe-flags</a>, object property in <a class="link" href="NMSettingDcb.html" title="NMSettingDcb">NMSettingDcb</a>
</dt>
<dd></dd>
@@ -3716,6 +3811,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="NMSetting8021x.html#NM-SETTING-802-1X-CERT-SCHEME-PREFIX-PATH:CAPS" title="NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH">NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH</a>, macro in <a class="link" href="NMSetting8021x.html" title="NMSetting8021x">NMSetting8021x</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="NMSetting8021x.html#nm-setting-802-1x-clear-altsubject-matches" title="nm_setting_802_1x_clear_altsubject_matches ()">nm_setting_802_1x_clear_altsubject_matches</a>, function in <a class="link" href="NMSetting8021x.html" title="NMSetting8021x">NMSetting8021x</a>
</dt>
<dd></dd>
@@ -4480,6 +4579,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES:CAPS" title="NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES">NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES</a>, macro in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="NMSettingConnection.html#NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS" title="NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT">NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT</a>, macro in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
</dt>
<dd></dd>
@@ -4492,6 +4595,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="NMSettingConnection.html#nm-setting-connection-get-autoconnect-slaves" title="nm_setting_connection_get_autoconnect_slaves ()">nm_setting_connection_get_autoconnect_slaves</a>, function in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="NMSettingConnection.html#nm-setting-connection-get-connection-type" title="nm_setting_connection_get_connection_type ()">nm_setting_connection_get_connection_type</a>, function in <a class="link" href="NMSettingConnection.html" title="NMSettingConnection">NMSettingConnection</a>
</dt>
<dd></dd>
@@ -6474,6 +6581,14 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="libnm-nm-version.html#NM-VERSION-1-0-2:CAPS" title="NM_VERSION_1_0_2">NM_VERSION_1_0_2</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="libnm-nm-version.html#NM-VERSION-1-0-4:CAPS" title="NM_VERSION_1_0_4">NM_VERSION_1_0_4</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="libnm-nm-version.html#NM-VERSION-CUR-STABLE:CAPS" title="NM_VERSION_CUR_STABLE">NM_VERSION_CUR_STABLE</a>, macro in <a class="link" href="libnm-nm-version.html" title="nm-version">nm-version</a>
</dt>
<dd></dd>
@@ -6773,6 +6888,10 @@
<a class="link" href="libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-IP6-CONFIG-ROUTES:CAPS" title="NM_VPN_PLUGIN_IP6_CONFIG_ROUTES">NM_VPN_PLUGIN_IP6_CONFIG_ROUTES</a>, macro in <a class="link" href="libnm-nm-vpn-dbus-interface.html" title="nm-vpn-dbus-interface">nm-vpn-dbus-interface</a>
</dt>
<dd></dd>
+<dt>
+VPN_SECRETS_GROUP, macro in nm-keyfile-utils
+</dt>
+<dd></dd>
<a name="idxW"></a><h3 class="title">W</h3>
<dt>
<a class="link" href="NMSettingWirelessSecurity.html#NMWepKeyType" title="enum NMWepKeyType">NMWepKeyType</a>, enum in <a class="link" href="NMSettingWirelessSecurity.html" title="NMSettingWirelessSecurity">NMSettingWirelessSecurity</a>
@@ -6828,7 +6947,6 @@
<dd></dd>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/ch02.html b/docs/libnm/html/ch02.html
index 8275cbd84..64f062238 100644
--- a/docs/libnm/html/ch02.html
+++ b/docs/libnm/html/ch02.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Client Object API Reference</title>
+<title>Client Object API Reference: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="ref-overview.html" title="Overview">
<link rel="next" href="NMClient.html" title="NMClient">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -41,7 +41,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/ch03.html b/docs/libnm/html/ch03.html
index 5a52fb4cf..e30c11dcc 100644
--- a/docs/libnm/html/ch03.html
+++ b/docs/libnm/html/ch03.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Connection and Setting API Reference</title>
+<title>Connection and Setting API Reference: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="libnm-nm-dbus-interface.html" title="nm-dbus-interface">
<link rel="next" href="libnm-NMConnection.html" title="NMConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -120,7 +120,6 @@ use WEP, LEAP, WPA or WPA2/RSN security</span>
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/ch04.html b/docs/libnm/html/ch04.html
index 851d3f2b9..6513b1a82 100644
--- a/docs/libnm/html/ch04.html
+++ b/docs/libnm/html/ch04.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Device and Runtime Configuration API Reference</title>
+<title>Device and Runtime Configuration API Reference: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="NMSettingWirelessSecurity.html" title="NMSettingWirelessSecurity">
<link rel="next" href="NMDevice.html" title="NMDevice">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -89,7 +89,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/ch05.html b/docs/libnm/html/ch05.html
index 08ddd5cc1..8dd164e2b 100644
--- a/docs/libnm/html/ch05.html
+++ b/docs/libnm/html/ch05.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Utility API Reference</title>
+<title>Utility API Reference: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="NMDhcpConfig.html" title="NMDhcpConfig">
<link rel="next" href="libnm-nm-utils.html" title="nm-utils">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -32,7 +32,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/ch06.html b/docs/libnm/html/ch06.html
index 4e2d3dc41..7cbb0f5e0 100644
--- a/docs/libnm/html/ch06.html
+++ b/docs/libnm/html/ch06.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: VPN Plugin API Reference</title>
+<title>VPN Plugin API Reference: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="libnm-nm-version.html" title="nm-version">
<link rel="next" href="libnm-nm-vpn-dbus-interface.html" title="nm-vpn-dbus-interface">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -32,7 +32,6 @@
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/index.html b/docs/libnm/html/index.html
index 8affed8ea..f197c752c 100644
--- a/docs/libnm/html/index.html
+++ b/docs/libnm/html/index.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="next" href="ref-overview.html" title="Overview">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">libnm Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for libnm 1.0.2
+ for libnm 1.0.4
The latest version of this documentation can be found on-line at
<a class="ulink" href="https://developer.gnome.org/libnm/1.0/" target="_top">https://developer.gnome.org/libnm/1.0/</a>.
@@ -253,7 +253,6 @@ use WEP, LEAP, WPA or WPA2/RSN security</span>
</dl></div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/index.sgml b/docs/libnm/html/index.sgml
index ebd23df0a..0f085cb34 100644
--- a/docs/libnm/html/index.sgml
+++ b/docs/libnm/html/index.sgml
@@ -87,8 +87,28 @@
<ANCHOR id="NM-CLIENT-CONNECTION-ADDED:CAPS" href="libnm/NMClient.html#NM-CLIENT-CONNECTION-ADDED:CAPS">
<ANCHOR id="NM-CLIENT-CONNECTION-REMOVED:CAPS" href="libnm/NMClient.html#NM-CLIENT-CONNECTION-REMOVED:CAPS">
<ANCHOR id="NMClientPermission" href="libnm/NMClient.html#NMClientPermission">
+<ANCHOR id="NM-CLIENT-PERMISSION-NONE:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-NONE:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-NETWORK:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-NETWORK:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIFI:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIFI:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-WWAN:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WWAN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIMAX:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIMAX:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SLEEP-WAKE:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-SLEEP-WAKE:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-NETWORK-CONTROL:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-NETWORK-CONTROL:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-WIFI-SHARE-PROTECTED:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-PROTECTED:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-WIFI-SHARE-OPEN:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-OPEN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SETTINGS-MODIFY-SYSTEM:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-SYSTEM:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SETTINGS-MODIFY-OWN:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-OWN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-SETTINGS-MODIFY-HOSTNAME:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-HOSTNAME:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-LAST:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-LAST:CAPS">
<ANCHOR id="NMClientPermissionResult" href="libnm/NMClient.html#NMClientPermissionResult">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-UNKNOWN:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-RESULT-UNKNOWN:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-YES:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-RESULT-YES:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-AUTH:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-RESULT-AUTH:CAPS">
+<ANCHOR id="NM-CLIENT-PERMISSION-RESULT-NO:CAPS" href="libnm/NMClient.html#NM-CLIENT-PERMISSION-RESULT-NO:CAPS">
<ANCHOR id="NMClientError" href="libnm/NMClient.html#NMClientError">
+<ANCHOR id="NM-CLIENT-ERROR-FAILED:CAPS" href="libnm/NMClient.html#NM-CLIENT-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-CLIENT-ERROR-MANAGER-NOT-RUNNING:CAPS" href="libnm/NMClient.html#NM-CLIENT-ERROR-MANAGER-NOT-RUNNING:CAPS">
+<ANCHOR id="NM-CLIENT-ERROR-OBJECT-CREATION-FAILED:CAPS" href="libnm/NMClient.html#NM-CLIENT-ERROR-OBJECT-CREATION-FAILED:CAPS">
<ANCHOR id="NM-CLIENT-ERROR:CAPS" href="libnm/NMClient.html#NM-CLIENT-ERROR:CAPS">
<ANCHOR id="NMClient.property-details" href="libnm/NMClient.html#NMClient.property-details">
<ANCHOR id="NMClient--activating-connection" href="libnm/NMClient.html#NMClient--activating-connection">
@@ -182,16 +202,79 @@
<ANCHOR id="nm-vpn-plugin-error-quark" href="libnm/libnm-nm-errors.html#nm-vpn-plugin-error-quark">
<ANCHOR id="libnm-nm-errors.other_details" href="libnm/libnm-nm-errors.html#libnm-nm-errors.other_details">
<ANCHOR id="NMAgentManagerError" href="libnm/libnm-nm-errors.html#NMAgentManagerError">
+<ANCHOR id="NM-AGENT-MANAGER-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-AGENT-MANAGER-ERROR-PERMISSION-DENIED:CAPS" href="libnm/libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-PERMISSION-DENIED:CAPS">
+<ANCHOR id="NM-AGENT-MANAGER-ERROR-INVALID-IDENTIFIER:CAPS" href="libnm/libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-INVALID-IDENTIFIER:CAPS">
+<ANCHOR id="NM-AGENT-MANAGER-ERROR-NOT-REGISTERED:CAPS" href="libnm/libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-NOT-REGISTERED:CAPS">
+<ANCHOR id="NM-AGENT-MANAGER-ERROR-NO-SECRETS:CAPS" href="libnm/libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-NO-SECRETS:CAPS">
+<ANCHOR id="NM-AGENT-MANAGER-ERROR-USER-CANCELED:CAPS" href="libnm/libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-USER-CANCELED:CAPS">
<ANCHOR id="NMConnectionError" href="libnm/libnm-nm-errors.html#NMConnectionError">
+<ANCHOR id="NM-CONNECTION-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-SETTING-NOT-FOUND:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-SETTING-NOT-FOUND:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-PROPERTY-NOT-FOUND:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-PROPERTY-NOT-FOUND:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-PROPERTY-NOT-SECRET:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-PROPERTY-NOT-SECRET:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-MISSING-SETTING:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-MISSING-SETTING:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-INVALID-SETTING:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-INVALID-SETTING:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-MISSING-PROPERTY:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-MISSING-PROPERTY:CAPS">
+<ANCHOR id="NM-CONNECTION-ERROR-INVALID-PROPERTY:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR-INVALID-PROPERTY:CAPS">
<ANCHOR id="NM-CONNECTION-ERROR:CAPS" href="libnm/libnm-nm-errors.html#NM-CONNECTION-ERROR:CAPS">
<ANCHOR id="NMCryptoError" href="libnm/libnm-nm-errors.html#NMCryptoError">
+<ANCHOR id="NM-CRYPTO-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-CRYPTO-ERROR-INVALID-DATA:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR-INVALID-DATA:CAPS">
+<ANCHOR id="NM-CRYPTO-ERROR-INVALID-PASSWORD:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR-INVALID-PASSWORD:CAPS">
+<ANCHOR id="NM-CRYPTO-ERROR-UNKNOWN-CIPHER:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR-UNKNOWN-CIPHER:CAPS">
+<ANCHOR id="NM-CRYPTO-ERROR-DECRYPTION-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR-DECRYPTION-FAILED:CAPS">
+<ANCHOR id="NM-CRYPTO-ERROR-ENCRYPTION-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR-ENCRYPTION-FAILED:CAPS">
<ANCHOR id="NM-CRYPTO-ERROR:CAPS" href="libnm/libnm-nm-errors.html#NM-CRYPTO-ERROR:CAPS">
<ANCHOR id="NMDeviceError" href="libnm/libnm-nm-errors.html#NMDeviceError">
+<ANCHOR id="NM-DEVICE-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-CREATION-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-CREATION-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-INVALID-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-INVALID-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-INCOMPATIBLE-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-INCOMPATIBLE-CONNECTION:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-NOT-ACTIVE:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-NOT-ACTIVE:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-NOT-SOFTWARE:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-NOT-SOFTWARE:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-NOT-ALLOWED:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-NOT-ALLOWED:CAPS">
+<ANCHOR id="NM-DEVICE-ERROR-SPECIFIC-OBJECT-NOT-FOUND:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR-SPECIFIC-OBJECT-NOT-FOUND:CAPS">
<ANCHOR id="NM-DEVICE-ERROR:CAPS" href="libnm/libnm-nm-errors.html#NM-DEVICE-ERROR:CAPS">
<ANCHOR id="NMManagerError" href="libnm/libnm-nm-errors.html#NMManagerError">
+<ANCHOR id="NM-MANAGER-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-PERMISSION-DENIED:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-PERMISSION-DENIED:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-UNKNOWN-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-CONNECTION:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-UNKNOWN-DEVICE:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-DEVICE:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-CONNECTION-NOT-AVAILABLE:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-CONNECTION-NOT-AVAILABLE:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-CONNECTION-NOT-ACTIVE:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-CONNECTION-NOT-ACTIVE:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-CONNECTION-ALREADY-ACTIVE:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-CONNECTION-ALREADY-ACTIVE:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-DEPENDENCY-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-DEPENDENCY-FAILED:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-ALREADY-ASLEEP-OR-AWAKE:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-ALREADY-ASLEEP-OR-AWAKE:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-ALREADY-ENABLED-OR-DISABLED:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-ALREADY-ENABLED-OR-DISABLED:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-UNKNOWN-LOG-LEVEL:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-LOG-LEVEL:CAPS">
+<ANCHOR id="NM-MANAGER-ERROR-UNKNOWN-LOG-DOMAIN:CAPS" href="libnm/libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-LOG-DOMAIN:CAPS">
<ANCHOR id="NMSecretAgentError" href="libnm/libnm-nm-errors.html#NMSecretAgentError">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-PERMISSION-DENIED:CAPS" href="libnm/libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-PERMISSION-DENIED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-INVALID-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-INVALID-CONNECTION:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-USER-CANCELED:CAPS" href="libnm/libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-USER-CANCELED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-AGENT-CANCELED:CAPS" href="libnm/libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-AGENT-CANCELED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-ERROR-NO-SECRETS:CAPS" href="libnm/libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-NO-SECRETS:CAPS">
<ANCHOR id="NMSettingsError" href="libnm/libnm-nm-errors.html#NMSettingsError">
+<ANCHOR id="NM-SETTINGS-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-SETTINGS-ERROR-PERMISSION-DENIED:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-PERMISSION-DENIED:CAPS">
+<ANCHOR id="NM-SETTINGS-ERROR-NOT-SUPPORTED:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-NOT-SUPPORTED:CAPS">
+<ANCHOR id="NM-SETTINGS-ERROR-INVALID-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-INVALID-CONNECTION:CAPS">
+<ANCHOR id="NM-SETTINGS-ERROR-READ-ONLY-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-READ-ONLY-CONNECTION:CAPS">
+<ANCHOR id="NM-SETTINGS-ERROR-UUID-EXISTS:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-UUID-EXISTS:CAPS">
+<ANCHOR id="NM-SETTINGS-ERROR-INVALID-HOSTNAME:CAPS" href="libnm/libnm-nm-errors.html#NM-SETTINGS-ERROR-INVALID-HOSTNAME:CAPS">
<ANCHOR id="NMVpnPluginError" href="libnm/libnm-nm-errors.html#NMVpnPluginError">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-STARTING-IN-PROGRESS:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-STARTING-IN-PROGRESS:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-ALREADY-STARTED:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-ALREADY-STARTED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-STOPPING-IN-PROGRESS:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-STOPPING-IN-PROGRESS:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-ALREADY-STOPPED:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-ALREADY-STOPPED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-WRONG-STATE:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-WRONG-STATE:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-BAD-ARGUMENTS:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-BAD-ARGUMENTS:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-LAUNCH-FAILED:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-LAUNCH-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-INVALID-CONNECTION:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-INVALID-CONNECTION:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-ERROR-INTERACTIVE-NOT-SUPPORTED:CAPS" href="libnm/libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-INTERACTIVE-NOT-SUPPORTED:CAPS">
<ANCHOR id="libnm-nm-dbus-interface" href="libnm/libnm-nm-dbus-interface.html">
<ANCHOR id="libnm-nm-dbus-interface.other" href="libnm/libnm-nm-dbus-interface.html#libnm-nm-dbus-interface.other">
<ANCHOR id="libnm-nm-dbus-interface.object-hierarchy" href="libnm/libnm-nm-dbus-interface.html#libnm-nm-dbus-interface.object-hierarchy">
@@ -239,20 +322,180 @@
<ANCHOR id="NM-DBUS-INTERFACE-SECRET-AGENT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DBUS-INTERFACE-SECRET-AGENT:CAPS">
<ANCHOR id="NM-DBUS-PATH-SECRET-AGENT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DBUS-PATH-SECRET-AGENT:CAPS">
<ANCHOR id="NMState" href="libnm/libnm-nm-dbus-interface.html#NMState">
+<ANCHOR id="NM-STATE-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-STATE-ASLEEP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-ASLEEP:CAPS">
+<ANCHOR id="NM-STATE-DISCONNECTED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-DISCONNECTED:CAPS">
+<ANCHOR id="NM-STATE-DISCONNECTING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-DISCONNECTING:CAPS">
+<ANCHOR id="NM-STATE-CONNECTING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-CONNECTING:CAPS">
+<ANCHOR id="NM-STATE-CONNECTED-LOCAL:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-CONNECTED-LOCAL:CAPS">
+<ANCHOR id="NM-STATE-CONNECTED-SITE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-CONNECTED-SITE:CAPS">
+<ANCHOR id="NM-STATE-CONNECTED-GLOBAL:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-STATE-CONNECTED-GLOBAL:CAPS">
<ANCHOR id="NMConnectivityState" href="libnm/libnm-nm-dbus-interface.html#NMConnectivityState">
+<ANCHOR id="NM-CONNECTIVITY-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-CONNECTIVITY-UNKNOWN:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-CONNECTIVITY-NONE:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-PORTAL:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-CONNECTIVITY-PORTAL:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-LIMITED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-CONNECTIVITY-LIMITED:CAPS">
+<ANCHOR id="NM-CONNECTIVITY-FULL:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-CONNECTIVITY-FULL:CAPS">
<ANCHOR id="NMDeviceType" href="libnm/libnm-nm-dbus-interface.html#NMDeviceType">
+<ANCHOR id="NM-DEVICE-TYPE-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-ETHERNET:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-ETHERNET:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-WIFI:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-WIFI:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-UNUSED1:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-UNUSED1:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-UNUSED2:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-UNUSED2:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-BT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-BT:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-OLPC-MESH:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-OLPC-MESH:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-WIMAX:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-WIMAX:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-MODEM:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-MODEM:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-INFINIBAND:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-INFINIBAND:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-BOND:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-BOND:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-VLAN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-VLAN:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-ADSL:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-ADSL:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-BRIDGE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-BRIDGE:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-GENERIC:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-GENERIC:CAPS">
+<ANCHOR id="NM-DEVICE-TYPE-TEAM:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-TEAM:CAPS">
<ANCHOR id="NMDeviceCapabilities" href="libnm/libnm-nm-dbus-interface.html#NMDeviceCapabilities">
+<ANCHOR id="NM-DEVICE-CAP-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-CAP-NONE:CAPS">
+<ANCHOR id="NM-DEVICE-CAP-NM-SUPPORTED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-CAP-NM-SUPPORTED:CAPS">
+<ANCHOR id="NM-DEVICE-CAP-CARRIER-DETECT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-CAP-CARRIER-DETECT:CAPS">
+<ANCHOR id="NM-DEVICE-CAP-IS-SOFTWARE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-CAP-IS-SOFTWARE:CAPS">
<ANCHOR id="NMDeviceWifiCapabilities" href="libnm/libnm-nm-dbus-interface.html#NMDeviceWifiCapabilities">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-NONE:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-WEP40:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP40:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-WEP104:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP104:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-TKIP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-TKIP:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-CIPHER-CCMP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-CCMP:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-WPA:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-WPA:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-RSN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-RSN:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-AP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-AP:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-ADHOC:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-ADHOC:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-FREQ-VALID:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-FREQ-VALID:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-FREQ-2GHZ:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-FREQ-2GHZ:CAPS">
+<ANCHOR id="NM-WIFI-DEVICE-CAP-FREQ-5GHZ:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-FREQ-5GHZ:CAPS">
<ANCHOR id="NM80211ApFlags" href="libnm/libnm-nm-dbus-interface.html#NM80211ApFlags">
+<ANCHOR id="NM-802-11-AP-FLAGS-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-FLAGS-NONE:CAPS">
+<ANCHOR id="NM-802-11-AP-FLAGS-PRIVACY:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-FLAGS-PRIVACY:CAPS">
<ANCHOR id="NM80211ApSecurityFlags" href="libnm/libnm-nm-dbus-interface.html#NM80211ApSecurityFlags">
+<ANCHOR id="NM-802-11-AP-SEC-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-NONE:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-WEP40:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-WEP40:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-WEP104:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-WEP104:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-TKIP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-TKIP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-PAIR-CCMP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-CCMP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-WEP40:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-WEP40:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-WEP104:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-WEP104:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-TKIP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-TKIP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-GROUP-CCMP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-CCMP:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-KEY-MGMT-PSK:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-KEY-MGMT-PSK:CAPS">
+<ANCHOR id="NM-802-11-AP-SEC-KEY-MGMT-802-1X:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-KEY-MGMT-802-1X:CAPS">
<ANCHOR id="NM80211Mode" href="libnm/libnm-nm-dbus-interface.html#NM80211Mode">
+<ANCHOR id="NM-802-11-MODE-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-MODE-UNKNOWN:CAPS">
+<ANCHOR id="NM-802-11-MODE-ADHOC:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-MODE-ADHOC:CAPS">
+<ANCHOR id="NM-802-11-MODE-INFRA:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-MODE-INFRA:CAPS">
+<ANCHOR id="NM-802-11-MODE-AP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-802-11-MODE-AP:CAPS">
<ANCHOR id="NMBluetoothCapabilities" href="libnm/libnm-nm-dbus-interface.html#NMBluetoothCapabilities">
+<ANCHOR id="NM-BT-CAPABILITY-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-BT-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-BT-CAPABILITY-DUN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-BT-CAPABILITY-DUN:CAPS">
+<ANCHOR id="NM-BT-CAPABILITY-NAP:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-BT-CAPABILITY-NAP:CAPS">
<ANCHOR id="NMDeviceModemCapabilities" href="libnm/libnm-nm-dbus-interface.html#NMDeviceModemCapabilities">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-POTS:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-POTS:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-CDMA-EVDO:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-CDMA-EVDO:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-GSM-UMTS:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-GSM-UMTS:CAPS">
+<ANCHOR id="NM-DEVICE-MODEM-CAPABILITY-LTE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-LTE:CAPS">
<ANCHOR id="NMDeviceState" href="libnm/libnm-nm-dbus-interface.html#NMDeviceState">
+<ANCHOR id="NM-DEVICE-STATE-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-UNMANAGED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-UNMANAGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-UNAVAILABLE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-DISCONNECTED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-DISCONNECTED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-PREPARE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-PREPARE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-CONFIG:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-CONFIG:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-NEED-AUTH:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-NEED-AUTH:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-IP-CONFIG:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-IP-CONFIG:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-IP-CHECK:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-IP-CHECK:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-SECONDARIES:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-SECONDARIES:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-ACTIVATED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-ACTIVATED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-DEACTIVATING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-DEACTIVATING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-FAILED:CAPS">
<ANCHOR id="NMDeviceStateReason" href="libnm/libnm-nm-dbus-interface.html#NMDeviceStateReason">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NONE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-UNKNOWN:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NOW-MANAGED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NOW-MANAGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NOW-UNMANAGED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NOW-UNMANAGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CONFIG-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CONFIG-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-IP-CONFIG-UNAVAILABLE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-IP-CONFIG-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-IP-CONFIG-EXPIRED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-IP-CONFIG-EXPIRED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NO-SECRETS:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NO-SECRETS:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-DISCONNECT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-DISCONNECT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-CONFIG-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-CONFIG-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-TIMEOUT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-TIMEOUT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PPP-START-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PPP-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PPP-DISCONNECT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PPP-DISCONNECT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PPP-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PPP-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DHCP-START-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DHCP-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DHCP-ERROR:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DHCP-ERROR:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DHCP-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DHCP-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SHARED-START-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SHARED-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SHARED-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SHARED-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-AUTOIP-START-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-AUTOIP-START-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-AUTOIP-ERROR:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-AUTOIP-ERROR:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-AUTOIP-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-AUTOIP-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-BUSY:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-BUSY:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-NO-DIAL-TONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-NO-DIAL-TONE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-NO-CARRIER:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-NO-CARRIER:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-DIAL-TIMEOUT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-TIMEOUT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-DIAL-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-INIT-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-INIT-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-APN-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-APN-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-NOT-SEARCHING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-NOT-SEARCHING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-DENIED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-DENIED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-TIMEOUT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-TIMEOUT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-REGISTRATION-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-PIN-CHECK-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-PIN-CHECK-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-FIRMWARE-MISSING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-FIRMWARE-MISSING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-REMOVED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-REMOVED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SLEEPING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SLEEPING:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CONNECTION-REMOVED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CONNECTION-REMOVED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-USER-REQUESTED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-USER-REQUESTED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CARRIER:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CARRIER:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-CONNECTION-ASSUMED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CONNECTION-ASSUMED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SUPPLICANT-AVAILABLE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-AVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-NOT-FOUND:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-NOT-FOUND:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-BT-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-BT-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-NOT-INSERTED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-NOT-INSERTED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-PIN-REQUIRED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-PIN-REQUIRED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-PUK-REQUIRED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-PUK-REQUIRED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-GSM-SIM-WRONG:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-WRONG:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-INFINIBAND-MODE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-INFINIBAND-MODE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DEPENDENCY-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DEPENDENCY-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-BR2684-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-BR2684-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-MANAGER-UNAVAILABLE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-MANAGER-UNAVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SSID-NOT-FOUND:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SSID-NOT-FOUND:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SECONDARY-CONNECTION-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SECONDARY-CONNECTION-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-DCB-FCOE-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DCB-FCOE-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-TEAMD-CONTROL-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-TEAMD-CONTROL-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-FAILED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-FAILED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-MODEM-AVAILABLE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-AVAILABLE:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-SIM-PIN-INCORRECT:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SIM-PIN-INCORRECT:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-NEW-ACTIVATION:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NEW-ACTIVATION:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS">
+<ANCHOR id="NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS">
<ANCHOR id="NMActiveConnectionState" href="libnm/libnm-nm-dbus-interface.html#NMActiveConnectionState">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-UNKNOWN:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-ACTIVATING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATING:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-DEACTIVATING:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATING:CAPS">
+<ANCHOR id="NM-ACTIVE-CONNECTION-STATE-DEACTIVATED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATED:CAPS">
<ANCHOR id="NMSecretAgentGetSecretsFlags" href="libnm/libnm-nm-dbus-interface.html#NMSecretAgentGetSecretsFlags">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-NONE:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-ALLOW-INTERACTION:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-ALLOW-INTERACTION:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-REQUEST-NEW:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-REQUEST-NEW:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-USER-REQUESTED:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-USER-REQUESTED:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-ONLY-SYSTEM:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-ONLY-SYSTEM:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-GET-SECRETS-FLAG-NO-ERRORS:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-NO-ERRORS:CAPS">
<ANCHOR id="NMSecretAgentCapabilities" href="libnm/libnm-nm-dbus-interface.html#NMSecretAgentCapabilities">
+<ANCHOR id="NM-SECRET-AGENT-CAPABILITY-NONE:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-CAPABILITY-VPN-HINTS:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-CAPABILITY-VPN-HINTS:CAPS">
+<ANCHOR id="NM-SECRET-AGENT-CAPABILITY-LAST:CAPS" href="libnm/libnm-nm-dbus-interface.html#NM-SECRET-AGENT-CAPABILITY-LAST:CAPS">
<ANCHOR id="libnm-NMConnection" href="libnm/libnm-NMConnection.html">
<ANCHOR id="libnm-NMConnection.functions" href="libnm/libnm-NMConnection.html#libnm-NMConnection.functions">
<ANCHOR id="libnm-NMConnection.other" href="libnm/libnm-NMConnection.html#libnm-NMConnection.other">
@@ -320,6 +563,9 @@
<ANCHOR id="NMConnectionInterface" href="libnm/libnm-NMConnection.html#NMConnectionInterface">
<ANCHOR id="NM-VARIANT-TYPE-SETTING:CAPS" href="libnm/libnm-NMConnection.html#NM-VARIANT-TYPE-SETTING:CAPS">
<ANCHOR id="NMConnectionSerializationFlags" href="libnm/libnm-NMConnection.html#NMConnectionSerializationFlags">
+<ANCHOR id="NM-CONNECTION-SERIALIZE-ALL:CAPS" href="libnm/libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-ALL:CAPS">
+<ANCHOR id="NM-CONNECTION-SERIALIZE-NO-SECRETS:CAPS" href="libnm/libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-NO-SECRETS:CAPS">
+<ANCHOR id="NM-CONNECTION-SERIALIZE-ONLY-SECRETS:CAPS" href="libnm/libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-ONLY-SECRETS:CAPS">
<ANCHOR id="NMSimpleConnection" href="libnm/NMSimpleConnection.html">
<ANCHOR id="NMSimpleConnection.functions" href="libnm/NMSimpleConnection.html#NMSimpleConnection.functions">
<ANCHOR id="NMSimpleConnection.object-hierarchy" href="libnm/NMSimpleConnection.html#NMSimpleConnection.object-hierarchy">
@@ -355,9 +601,27 @@
<ANCHOR id="NMSetting.other_details" href="libnm/NMSetting.html#NMSetting.other_details">
<ANCHOR id="NM-SETTING-NAME:CAPS" href="libnm/NMSetting.html#NM-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingSecretFlags" href="libnm/NMSetting.html#NMSettingSecretFlags">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-NONE:CAPS" href="libnm/NMSetting.html#NM-SETTING-SECRET-FLAG-NONE:CAPS">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-AGENT-OWNED:CAPS" href="libnm/NMSetting.html#NM-SETTING-SECRET-FLAG-AGENT-OWNED:CAPS">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-NOT-SAVED:CAPS" href="libnm/NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-SAVED:CAPS">
+<ANCHOR id="NM-SETTING-SECRET-FLAG-NOT-REQUIRED:CAPS" href="libnm/NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-REQUIRED:CAPS">
<ANCHOR id="NMSettingCompareFlags" href="libnm/NMSetting.html#NMSettingCompareFlags">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-EXACT:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-EXACT:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-FUZZY:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-FUZZY:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-ID:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-ID:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-SECRETS:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-AGENT-OWNED-SECRETS:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-AGENT-OWNED-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-NOT-SAVED-SECRETS:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-NOT-SAVED-SECRETS:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-DIFF-RESULT-WITH-DEFAULT:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-WITH-DEFAULT:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-DIFF-RESULT-NO-DEFAULT:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-NO-DEFAULT:CAPS">
+<ANCHOR id="NM-SETTING-COMPARE-FLAG-IGNORE-TIMESTAMP:CAPS" href="libnm/NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-TIMESTAMP:CAPS">
<ANCHOR id="NMSetting-struct" href="libnm/NMSetting.html#NMSetting-struct">
<ANCHOR id="NMSettingDiffResult" href="libnm/NMSetting.html#NMSettingDiffResult">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-UNKNOWN:CAPS" href="libnm/NMSetting.html#NM-SETTING-DIFF-RESULT-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-A:CAPS" href="libnm/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-B:CAPS" href="libnm/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-A-DEFAULT:CAPS" href="libnm/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A-DEFAULT:CAPS">
+<ANCHOR id="NM-SETTING-DIFF-RESULT-IN-B-DEFAULT:CAPS" href="libnm/NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B-DEFAULT:CAPS">
<ANCHOR id="NMSetting.property-details" href="libnm/NMSetting.html#NMSetting.property-details">
<ANCHOR id="NMSetting--name" href="libnm/NMSetting.html#NMSetting--name">
<ANCHOR id="NMSettingConnection" href="libnm/NMSettingConnection.html">
@@ -386,6 +650,7 @@
<ANCHOR id="nm-setting-connection-get-master" href="libnm/NMSettingConnection.html#nm-setting-connection-get-master">
<ANCHOR id="nm-setting-connection-is-slave-type" href="libnm/NMSettingConnection.html#nm-setting-connection-is-slave-type">
<ANCHOR id="nm-setting-connection-get-slave-type" href="libnm/NMSettingConnection.html#nm-setting-connection-get-slave-type">
+<ANCHOR id="nm-setting-connection-get-autoconnect-slaves" href="libnm/NMSettingConnection.html#nm-setting-connection-get-autoconnect-slaves">
<ANCHOR id="nm-setting-connection-get-num-secondaries" href="libnm/NMSettingConnection.html#nm-setting-connection-get-num-secondaries">
<ANCHOR id="nm-setting-connection-get-secondary" href="libnm/NMSettingConnection.html#nm-setting-connection-get-secondary">
<ANCHOR id="nm-setting-connection-add-secondary" href="libnm/NMSettingConnection.html#nm-setting-connection-add-secondary">
@@ -409,12 +674,18 @@
<ANCHOR id="NM-SETTING-CONNECTION-ZONE:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-ZONE:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-MASTER:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-MASTER:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-SLAVE-TYPE:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-SLAVE-TYPE:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-SECONDARIES:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-SECONDARIES:CAPS">
<ANCHOR id="NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS">
+<ANCHOR id="NMSettingConnectionAutoconnectSlaves" href="libnm/NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves">
+<ANCHOR id="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-DEFAULT:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-DEFAULT:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-NO:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-NO:CAPS">
+<ANCHOR id="NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-YES:CAPS" href="libnm/NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-YES:CAPS">
<ANCHOR id="NMSettingConnection-struct" href="libnm/NMSettingConnection.html#NMSettingConnection-struct">
<ANCHOR id="NMSettingConnection.property-details" href="libnm/NMSettingConnection.html#NMSettingConnection.property-details">
<ANCHOR id="NMSettingConnection--autoconnect" href="libnm/NMSettingConnection.html#NMSettingConnection--autoconnect">
<ANCHOR id="NMSettingConnection--autoconnect-priority" href="libnm/NMSettingConnection.html#NMSettingConnection--autoconnect-priority">
+<ANCHOR id="NMSettingConnection--autoconnect-slaves" href="libnm/NMSettingConnection.html#NMSettingConnection--autoconnect-slaves">
<ANCHOR id="NMSettingConnection--gateway-ping-timeout" href="libnm/NMSettingConnection.html#NMSettingConnection--gateway-ping-timeout">
<ANCHOR id="NMSettingConnection--id" href="libnm/NMSettingConnection.html#NMSettingConnection--id">
<ANCHOR id="NMSettingConnection--interface-name" href="libnm/NMSettingConnection.html#NMSettingConnection--interface-name">
@@ -503,8 +774,16 @@
<ANCHOR id="nm-setting-802-1x-get-phase2-private-key-password-flags" href="libnm/NMSetting8021x.html#nm-setting-802-1x-get-phase2-private-key-password-flags">
<ANCHOR id="nm-setting-802-1x-get-phase2-private-key-format" href="libnm/NMSetting8021x.html#nm-setting-802-1x-get-phase2-private-key-format">
<ANCHOR id="NMSetting8021x.other_details" href="libnm/NMSetting8021x.html#NMSetting8021x.other_details">
+<ANCHOR id="NM-SETTING-802-1X-CERT-SCHEME-PREFIX-PATH:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CERT-SCHEME-PREFIX-PATH:CAPS">
<ANCHOR id="NMSetting8021xCKFormat" href="libnm/NMSetting8021x.html#NMSetting8021xCKFormat">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-UNKNOWN:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-X509:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-X509:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-RAW-KEY:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-RAW-KEY:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-FORMAT-PKCS12:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-PKCS12:CAPS">
<ANCHOR id="NMSetting8021xCKScheme" href="libnm/NMSetting8021x.html#NMSetting8021xCKScheme">
+<ANCHOR id="NM-SETTING-802-1X-CK-SCHEME-UNKNOWN:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-SCHEME-BLOB:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-BLOB:CAPS">
+<ANCHOR id="NM-SETTING-802-1X-CK-SCHEME-PATH:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CAPS">
<ANCHOR id="NM-SETTING-802-1X-SETTING-NAME:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-SETTING-NAME:CAPS">
<ANCHOR id="NM-SETTING-802-1X-EAP:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-EAP:CAPS">
<ANCHOR id="NM-SETTING-802-1X-IDENTITY:CAPS" href="libnm/NMSetting8021x.html#NM-SETTING-802-1X-IDENTITY:CAPS">
@@ -770,6 +1049,10 @@
<ANCHOR id="NMSettingDcb.other_details" href="libnm/NMSettingDcb.html#NMSettingDcb.other_details">
<ANCHOR id="NM-SETTING-DCB-SETTING-NAME:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingDcbFlags" href="libnm/NMSettingDcb.html#NMSettingDcbFlags">
+<ANCHOR id="NM-SETTING-DCB-FLAG-NONE:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-FLAG-NONE:CAPS">
+<ANCHOR id="NM-SETTING-DCB-FLAG-ENABLE:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS">
+<ANCHOR id="NM-SETTING-DCB-FLAG-ADVERTISE:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS">
+<ANCHOR id="NM-SETTING-DCB-FLAG-WILLING:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS">
<ANCHOR id="NM-SETTING-DCB-FCOE-MODE-FABRIC:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-FABRIC:CAPS">
<ANCHOR id="NM-SETTING-DCB-FCOE-MODE-VN2VN:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-FCOE-MODE-VN2VN:CAPS">
<ANCHOR id="NM-SETTING-DCB-APP-FCOE-FLAGS:CAPS" href="libnm/NMSettingDcb.html#NM-SETTING-DCB-APP-FCOE-FLAGS:CAPS">
@@ -1025,6 +1308,10 @@
<ANCHOR id="NM-SETTING-IP6-CONFIG-METHOD-MANUAL:CAPS" href="libnm/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-METHOD-MANUAL:CAPS">
<ANCHOR id="NM-SETTING-IP6-CONFIG-METHOD-SHARED:CAPS" href="libnm/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-METHOD-SHARED:CAPS">
<ANCHOR id="NMSettingIP6ConfigPrivacy" href="libnm/NMSettingIP6Config.html#NMSettingIP6ConfigPrivacy">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-UNKNOWN:CAPS" href="libnm/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-UNKNOWN:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-DISABLED:CAPS" href="libnm/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-DISABLED:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-PUBLIC-ADDR:CAPS" href="libnm/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-PUBLIC-ADDR:CAPS">
+<ANCHOR id="NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-TEMP-ADDR:CAPS" href="libnm/NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-TEMP-ADDR:CAPS">
<ANCHOR id="NMSettingIP6Config.property-details" href="libnm/NMSettingIP6Config.html#NMSettingIP6Config.property-details">
<ANCHOR id="NMSettingIP6Config--ip6-privacy" href="libnm/NMSettingIP6Config.html#NMSettingIP6Config--ip6-privacy">
<ANCHOR id="NMSettingOlpcMesh" href="libnm/NMSettingOlpcMesh.html">
@@ -1151,6 +1438,9 @@
<ANCHOR id="NMSettingSerial.other_details" href="libnm/NMSettingSerial.html#NMSettingSerial.other_details">
<ANCHOR id="NM-SETTING-SERIAL-SETTING-NAME:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-SETTING-NAME:CAPS">
<ANCHOR id="NMSettingSerialParity" href="libnm/NMSettingSerial.html#NMSettingSerialParity">
+<ANCHOR id="NM-SETTING-SERIAL-PARITY-NONE:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-PARITY-NONE:CAPS">
+<ANCHOR id="NM-SETTING-SERIAL-PARITY-EVEN:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-PARITY-EVEN:CAPS">
+<ANCHOR id="NM-SETTING-SERIAL-PARITY-ODD:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-PARITY-ODD:CAPS">
<ANCHOR id="NM-SETTING-SERIAL-BAUD:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-BAUD:CAPS">
<ANCHOR id="NM-SETTING-SERIAL-BITS:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-BITS:CAPS">
<ANCHOR id="NM-SETTING-SERIAL-PARITY:CAPS" href="libnm/NMSettingSerial.html#NM-SETTING-SERIAL-PARITY:CAPS">
@@ -1217,7 +1507,12 @@
<ANCHOR id="NM-SETTING-VLAN-INGRESS-PRIORITY-MAP:CAPS" href="libnm/NMSettingVlan.html#NM-SETTING-VLAN-INGRESS-PRIORITY-MAP:CAPS">
<ANCHOR id="NM-SETTING-VLAN-EGRESS-PRIORITY-MAP:CAPS" href="libnm/NMSettingVlan.html#NM-SETTING-VLAN-EGRESS-PRIORITY-MAP:CAPS">
<ANCHOR id="NMVlanPriorityMap" href="libnm/NMSettingVlan.html#NMVlanPriorityMap">
+<ANCHOR id="NM-VLAN-INGRESS-MAP:CAPS" href="libnm/NMSettingVlan.html#NM-VLAN-INGRESS-MAP:CAPS">
+<ANCHOR id="NM-VLAN-EGRESS-MAP:CAPS" href="libnm/NMSettingVlan.html#NM-VLAN-EGRESS-MAP:CAPS">
<ANCHOR id="NMVlanFlags" href="libnm/NMSettingVlan.html#NMVlanFlags">
+<ANCHOR id="NM-VLAN-FLAG-REORDER-HEADERS:CAPS" href="libnm/NMSettingVlan.html#NM-VLAN-FLAG-REORDER-HEADERS:CAPS">
+<ANCHOR id="NM-VLAN-FLAG-GVRP:CAPS" href="libnm/NMSettingVlan.html#NM-VLAN-FLAG-GVRP:CAPS">
+<ANCHOR id="NM-VLAN-FLAG-LOOSE-BINDING:CAPS" href="libnm/NMSettingVlan.html#NM-VLAN-FLAG-LOOSE-BINDING:CAPS">
<ANCHOR id="NMSettingVlan.property-details" href="libnm/NMSettingVlan.html#NMSettingVlan.property-details">
<ANCHOR id="NMSettingVlan--egress-priority-map" href="libnm/NMSettingVlan.html#NMSettingVlan--egress-priority-map">
<ANCHOR id="NMSettingVlan--flags" href="libnm/NMSettingVlan.html#NMSettingVlan--flags">
@@ -1434,6 +1729,10 @@
<ANCHOR id="NMSettingWirelessSecurity.other_details" href="libnm/NMSettingWirelessSecurity.html#NMSettingWirelessSecurity.other_details">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-SETTING-NAME:CAPS">
<ANCHOR id="NMWepKeyType" href="libnm/NMSettingWirelessSecurity.html#NMWepKeyType">
+<ANCHOR id="NM-WEP-KEY-TYPE-UNKNOWN:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="NM-WEP-KEY-TYPE-KEY:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-KEY:CAPS">
+<ANCHOR id="NM-WEP-KEY-TYPE-PASSPHRASE:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-PASSPHRASE:CAPS">
+<ANCHOR id="NM-WEP-KEY-TYPE-LAST:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-LAST:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-KEY-MGMT:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-KEY-MGMT:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-WEP-TX-KEYIDX:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-WEP-TX-KEYIDX:CAPS">
<ANCHOR id="NM-SETTING-WIRELESS-SECURITY-AUTH-ALG:CAPS" href="libnm/NMSettingWirelessSecurity.html#NM-SETTING-WIRELESS-SECURITY-AUTH-ALG:CAPS">
@@ -1988,6 +2287,10 @@
<ANCHOR id="NM-WIMAX-NSP-SIGNAL-QUALITY:CAPS" href="libnm/NMWimaxNsp.html#NM-WIMAX-NSP-SIGNAL-QUALITY:CAPS">
<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE:CAPS" href="libnm/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE:CAPS">
<ANCHOR id="NMWimaxNspNetworkType" href="libnm/NMWimaxNsp.html#NMWimaxNspNetworkType">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-UNKNOWN:CAPS" href="libnm/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-UNKNOWN:CAPS">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-HOME:CAPS" href="libnm/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-HOME:CAPS">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-PARTNER:CAPS" href="libnm/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-PARTNER:CAPS">
+<ANCHOR id="NM-WIMAX-NSP-NETWORK-TYPE-ROAMING-PARTNER:CAPS" href="libnm/NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-ROAMING-PARTNER:CAPS">
<ANCHOR id="NMWimaxNsp.property-details" href="libnm/NMWimaxNsp.html#NMWimaxNsp.property-details">
<ANCHOR id="NMWimaxNsp--name" href="libnm/NMWimaxNsp.html#NMWimaxNsp--name">
<ANCHOR id="NMWimaxNsp--network-type" href="libnm/NMWimaxNsp.html#NMWimaxNsp--network-type">
@@ -2102,6 +2405,15 @@
<ANCHOR id="nm-utils-check-virtual-device-compatibility" href="libnm/libnm-nm-utils.html#nm-utils-check-virtual-device-compatibility">
<ANCHOR id="libnm-nm-utils.other_details" href="libnm/libnm-nm-utils.html#libnm-nm-utils.other_details">
<ANCHOR id="NMUtilsSecurityType" href="libnm/libnm-nm-utils.html#NMUtilsSecurityType">
+<ANCHOR id="NMU-SEC-INVALID:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-INVALID:CAPS">
+<ANCHOR id="NMU-SEC-NONE:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-NONE:CAPS">
+<ANCHOR id="NMU-SEC-STATIC-WEP:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-STATIC-WEP:CAPS">
+<ANCHOR id="NMU-SEC-LEAP:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-LEAP:CAPS">
+<ANCHOR id="NMU-SEC-DYNAMIC-WEP:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-DYNAMIC-WEP:CAPS">
+<ANCHOR id="NMU-SEC-WPA-PSK:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-WPA-PSK:CAPS">
+<ANCHOR id="NMU-SEC-WPA-ENTERPRISE:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-WPA-ENTERPRISE:CAPS">
+<ANCHOR id="NMU-SEC-WPA2-PSK:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-WPA2-PSK:CAPS">
+<ANCHOR id="NMU-SEC-WPA2-ENTERPRISE:CAPS" href="libnm/libnm-nm-utils.html#NMU-SEC-WPA2-ENTERPRISE:CAPS">
<ANCHOR id="NM-UTILS-HWADDR-LEN-MAX:CAPS" href="libnm/libnm-nm-utils.html#NM-UTILS-HWADDR-LEN-MAX:CAPS">
<ANCHOR id="NM-UTILS-INET-ADDRSTRLEN:CAPS" href="libnm/libnm-nm-utils.html#NM-UTILS-INET-ADDRSTRLEN:CAPS">
<ANCHOR id="libnm-nm-version" href="libnm/libnm-nm-version.html">
@@ -2117,6 +2429,8 @@
<ANCHOR id="NM-VERSION-0-9-8:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-0-9-8:CAPS">
<ANCHOR id="NM-VERSION-0-9-10:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-0-9-10:CAPS">
<ANCHOR id="NM-VERSION-1-0:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-1-0:CAPS">
+<ANCHOR id="NM-VERSION-1-0-2:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-1-0-2:CAPS">
+<ANCHOR id="NM-VERSION-1-0-4:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-1-0-4:CAPS">
<ANCHOR id="NM-VERSION-MIN-REQUIRED:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-MIN-REQUIRED:CAPS">
<ANCHOR id="NM-VERSION-MAX-ALLOWED:CAPS" href="libnm/libnm-nm-version.html#NM-VERSION-MAX-ALLOWED:CAPS">
<ANCHOR id="NM-DEPRECATED-IN-0-9-10-FOR:CAPS" href="libnm/libnm-nm-version.html#NM-DEPRECATED-IN-0-9-10-FOR:CAPS">
@@ -2128,6 +2442,7 @@
<ANCHOR id="NM-DEPRECATED-IN-1-0:CAPS" href="libnm/libnm-nm-version.html#NM-DEPRECATED-IN-1-0:CAPS">
<ANCHOR id="NM-AVAILABLE-IN-0-9-10:CAPS" href="libnm/libnm-nm-version.html#NM-AVAILABLE-IN-0-9-10:CAPS">
<ANCHOR id="NM-AVAILABLE-IN-1-0:CAPS" href="libnm/libnm-nm-version.html#NM-AVAILABLE-IN-1-0:CAPS">
+<ANCHOR id="NM-AVAILABLE-IN-1-0-4:CAPS" href="libnm/libnm-nm-version.html#NM-AVAILABLE-IN-1-0-4:CAPS">
<ANCHOR id="libnm-nm-vpn-dbus-interface" href="libnm/libnm-nm-vpn-dbus-interface.html">
<ANCHOR id="libnm-nm-vpn-dbus-interface.other" href="libnm/libnm-nm-vpn-dbus-interface.html#libnm-nm-vpn-dbus-interface.other">
<ANCHOR id="libnm-nm-vpn-dbus-interface.object-hierarchy" href="libnm/libnm-nm-vpn-dbus-interface.html#libnm-nm-vpn-dbus-interface.object-hierarchy">
@@ -2160,9 +2475,39 @@
<ANCHOR id="NM-DBUS-VPN-SIGNAL-STATE-CHANGE:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-DBUS-VPN-SIGNAL-STATE-CHANGE:CAPS">
<ANCHOR id="NM-DBUS-VPN-SIGNAL-IP4-CONFIG:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-DBUS-VPN-SIGNAL-IP4-CONFIG:CAPS">
<ANCHOR id="NMVpnServiceState" href="libnm/libnm-nm-vpn-dbus-interface.html#NMVpnServiceState">
+<ANCHOR id="NM-VPN-SERVICE-STATE-UNKNOWN:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-INIT:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-INIT:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-SHUTDOWN:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-SHUTDOWN:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STARTING:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STARTING:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STARTED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STARTED:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STOPPING:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STOPPING:CAPS">
+<ANCHOR id="NM-VPN-SERVICE-STATE-STOPPED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STOPPED:CAPS">
<ANCHOR id="NMVpnConnectionState" href="libnm/libnm-nm-vpn-dbus-interface.html#NMVpnConnectionState">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-UNKNOWN:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-UNKNOWN:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-PREPARE:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-PREPARE:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-NEED-AUTH:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-NEED-AUTH:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-CONNECT:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-CONNECT:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-IP-CONFIG-GET:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-IP-CONFIG-GET:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-ACTIVATED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-ACTIVATED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-FAILED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-FAILED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-DISCONNECTED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-DISCONNECTED:CAPS">
<ANCHOR id="NMVpnConnectionStateReason" href="libnm/libnm-nm-vpn-dbus-interface.html#NMVpnConnectionStateReason">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-UNKNOWN:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-UNKNOWN:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-NONE:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-NONE:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-USER-DISCONNECTED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-USER-DISCONNECTED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-DEVICE-DISCONNECTED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-DEVICE-DISCONNECTED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-SERVICE-STOPPED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-STOPPED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-IP-CONFIG-INVALID:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-IP-CONFIG-INVALID:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-CONNECT-TIMEOUT:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-CONNECT-TIMEOUT:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-TIMEOUT:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-TIMEOUT:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-FAILED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-FAILED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-NO-SECRETS:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-NO-SECRETS:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-LOGIN-FAILED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-LOGIN-FAILED:CAPS">
+<ANCHOR id="NM-VPN-CONNECTION-STATE-REASON-CONNECTION-REMOVED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-CONNECTION-REMOVED:CAPS">
<ANCHOR id="NMVpnPluginFailure" href="libnm/libnm-nm-vpn-dbus-interface.html#NMVpnPluginFailure">
+<ANCHOR id="NM-VPN-PLUGIN-FAILURE-LOGIN-FAILED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-FAILURE-LOGIN-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-FAILURE-CONNECT-FAILED:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-FAILURE-CONNECT-FAILED:CAPS">
+<ANCHOR id="NM-VPN-PLUGIN-FAILURE-BAD-IP-CONFIG:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-FAILURE-BAD-IP-CONFIG:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-CONFIG-TUNDEV:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-CONFIG-TUNDEV:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-CONFIG-BANNER:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-CONFIG-BANNER:CAPS">
<ANCHOR id="NM-VPN-PLUGIN-CONFIG-EXT-GATEWAY:CAPS" href="libnm/libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-CONFIG-EXT-GATEWAY:CAPS">
@@ -2216,6 +2561,10 @@
<ANCHOR id="nm-vpn-editor-update-connection" href="libnm/NMVpnEditor.html#nm-vpn-editor-update-connection">
<ANCHOR id="NMVpnEditor.other_details" href="libnm/NMVpnEditor.html#NMVpnEditor.other_details">
<ANCHOR id="NMVpnEditorPluginCapability" href="libnm/NMVpnEditor.html#NMVpnEditorPluginCapability">
+<ANCHOR id="NM-VPN-EDITOR-PLUGIN-CAPABILITY-NONE:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-NONE:CAPS">
+<ANCHOR id="NM-VPN-EDITOR-PLUGIN-CAPABILITY-IMPORT:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-IMPORT:CAPS">
+<ANCHOR id="NM-VPN-EDITOR-PLUGIN-CAPABILITY-EXPORT:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-EXPORT:CAPS">
+<ANCHOR id="NM-VPN-EDITOR-PLUGIN-CAPABILITY-IPV6:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-IPV6:CAPS">
<ANCHOR id="NM-VPN-EDITOR-PLUGIN-NAME:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-NAME:CAPS">
<ANCHOR id="NM-VPN-EDITOR-PLUGIN-DESCRIPTION:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-DESCRIPTION:CAPS">
<ANCHOR id="NM-VPN-EDITOR-PLUGIN-SERVICE:CAPS" href="libnm/NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-SERVICE:CAPS">
@@ -2235,6 +2584,7 @@
<ANCHOR id="annotation-glossterm-out" href="libnm/annotation-glossary.html#annotation-glossterm-out">
<ANCHOR id="annotation-glossterm-scope async" href="libnm/annotation-glossary.html#annotation-glossterm-scope async">
<ANCHOR id="annotation-glossterm-scope call" href="libnm/annotation-glossary.html#annotation-glossterm-scope call">
+<ANCHOR id="annotation-glossterm-skip" href="libnm/annotation-glossary.html#annotation-glossterm-skip">
<ANCHOR id="annotation-glossterm-transfer container" href="libnm/annotation-glossary.html#annotation-glossterm-transfer container">
<ANCHOR id="annotation-glossterm-transfer full" href="libnm/annotation-glossary.html#annotation-glossterm-transfer full">
<ANCHOR id="annotation-glossterm-transfer none" href="libnm/annotation-glossary.html#annotation-glossterm-transfer none">
diff --git a/docs/libnm/html/libnm-NMConnection.html b/docs/libnm/html/libnm-NMConnection.html
index 3ff7a3b65..7c3f79528 100644
--- a/docs/libnm/html/libnm-NMConnection.html
+++ b/docs/libnm/html/libnm-NMConnection.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: NMConnection</title>
+<title>NMConnection: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch03.html" title="Connection and Setting API Reference">
<link rel="prev" href="ch03.html" title="Connection and Setting API Reference">
<link rel="next" href="NMSimpleConnection.html" title="NMSimpleConnection">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -742,7 +742,6 @@ need to result in a connection that passes <a class="link" href="libnm-NMConnect
could not
be deserialized (in which case <em class="parameter"><code>connection</code></em>
will be unchanged).</p>
-<p></p>
</div>
</div>
<hr>
@@ -843,7 +842,6 @@ each flag's behavior.</p>
<div class="refsect3">
<a name="id-1.4.2.7.10.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the comparison succeeds, <code class="literal">FALSE</code> if it does not</p>
-<p></p>
</div>
</div>
<hr>
@@ -899,7 +897,6 @@ differ mapped to one or more of <a class="link" href="NMSetting.html#NMSettingDi
<a name="id-1.4.2.7.11.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connections contain the same values, <code class="literal">FALSE</code> if they do
not</p>
-<p></p>
</div>
</div>
<hr>
@@ -942,7 +939,6 @@ setting and which property failed validation, and how it failed validation.</p>
<div class="refsect3">
<a name="id-1.4.2.7.12.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is valid, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1001,7 +997,6 @@ why the connection is invalid, if the function returns an error.</p></td>
<div class="refsect3">
<a name="id-1.4.2.7.13.7"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is valid, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1045,7 +1040,6 @@ elements. </p></td>
<a name="id-1.4.2.7.14.6"></a><h4>Returns</h4>
<p> the setting name of the <a class="link" href="NMSetting.html" title="NMSetting"><span class="type">NMSetting</span></a> object which has invalid or
missing secrets</p>
-<p></p>
</div>
</div>
<hr>
@@ -1164,7 +1158,6 @@ or <a class="link" href="libnm-NMConnection.html#NM-VARIANT-TYPE-SETTING:CAPS" t
<a name="id-1.4.2.7.17.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the secrets were successfully updated, <code class="literal">FALSE</code> if the update
failed (tried to update secrets for a setting that doesn't exist, etc)</p>
-<p></p>
</div>
</div>
<hr>
@@ -1225,7 +1218,6 @@ nm_connection_get_path (<em class="parameter"><code><a href="https://developer.g
<a name="id-1.4.2.7.19.6"></a><h4>Returns</h4>
<p> the D-Bus path of the connection, previously set by a call to
<a class="link" href="libnm-NMConnection.html#nm-connection-set-path" title="nm_connection_set_path ()"><code class="function">nm_connection_set_path()</code></a>.</p>
-<p></p>
</div>
</div>
<hr>
@@ -1256,7 +1248,6 @@ NetworkManager, this is the name of the created interface.</p>
<div class="refsect3">
<a name="id-1.4.2.7.20.7"></a><h4>Returns</h4>
<p> Name of the kernel interface or <code class="literal">NULL</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -1297,7 +1288,6 @@ property of the connection and matches that against <em class="parameter"><code>
<a name="id-1.4.2.7.21.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the connection is of the given <em class="parameter"><code>type</code></em>
, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1386,7 +1376,6 @@ nm_connection_get_uuid (<em class="parameter"><code><a href="https://developer.g
<div class="refsect3">
<a name="id-1.4.2.7.24.6"></a><h4>Returns</h4>
<p> the UUID from the connection's 'connection' setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1413,7 +1402,6 @@ nm_connection_get_id (<em class="parameter"><code><a href="https://developer.gno
<div class="refsect3">
<a name="id-1.4.2.7.25.6"></a><h4>Returns</h4>
<p> the ID from the connection's 'connection' setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1440,7 +1428,6 @@ nm_connection_get_connection_type (<em class="parameter"><code><a href="https://
<div class="refsect3">
<a name="id-1.4.2.7.26.6"></a><h4>Returns</h4>
<p> the type from the connection's 'connection' setting</p>
-<p></p>
</div>
</div>
<hr>
@@ -1470,7 +1457,6 @@ activated even if the device it refers to doesn't exist).</p>
<a name="id-1.4.2.7.27.6"></a><h4>Returns</h4>
<p> whether <em class="parameter"><code>connection</code></em>
refers to a virtual device</p>
-<p></p>
</div>
</div>
<hr>
@@ -2225,32 +2211,24 @@ nm_connection_get_setting_vlan (<em class="parameter"><code><a href="https://dev
<a name="NM-CONNECTION-SECRETS-UPDATED:CAPS"></a><h3>NM_CONNECTION_SECRETS_UPDATED</h3>
<pre class="programlisting">#define NM_CONNECTION_SECRETS_UPDATED "secrets-updated"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-SECRETS-CLEARED:CAPS"></a><h3>NM_CONNECTION_SECRETS_CLEARED</h3>
<pre class="programlisting">#define NM_CONNECTION_SECRETS_CLEARED "secrets-cleared"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-CHANGED:CAPS"></a><h3>NM_CONNECTION_CHANGED</h3>
<pre class="programlisting">#define NM_CONNECTION_CHANGED "changed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-CONNECTION-NORMALIZE-PARAM-IP6-CONFIG-METHOD:CAPS"></a><h3>NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD</h3>
<pre class="programlisting">#define NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD "ip6-config-method"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -2349,7 +2327,6 @@ calling <a class="link" href="libnm-NMConnection.html#nm-connection-to-dbus" tit
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/libnm-nm-dbus-interface.html b/docs/libnm/html/libnm-nm-dbus-interface.html
index 3d03fe4c0..1272e0d3e 100644
--- a/docs/libnm/html/libnm-nm-dbus-interface.html
+++ b/docs/libnm/html/libnm-nm-dbus-interface.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: nm-dbus-interface</title>
+<title>nm-dbus-interface: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch02.html" title="Client Object API Reference">
<link rel="prev" href="libnm-nm-errors.html" title="nm-errors">
<link rel="next" href="ch03.html" title="Connection and Setting API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -286,11 +286,10 @@
</div>
<div class="refsect1">
<a name="libnm-nm-dbus-interface.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-nm-dbus-interface.functions_details"></a><h2>Functions</h2>
+<p></p>
</div>
<div class="refsect1">
<a name="libnm-nm-dbus-interface.other_details"></a><h2>Types and Values</h2>
@@ -298,320 +297,240 @@
<a name="NM-DBUS-SERVICE:CAPS"></a><h3>NM_DBUS_SERVICE</h3>
<pre class="programlisting">#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH:CAPS"></a><h3>NM_DBUS_PATH</h3>
<pre class="programlisting">#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE:CAPS"></a><h3>NM_DBUS_INTERFACE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE NM_DBUS_INTERFACE ".Device"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-WIRED:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_WIRED</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_WIRED NM_DBUS_INTERFACE_DEVICE ".Wired"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-ADSL:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_ADSL</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_ADSL NM_DBUS_INTERFACE_DEVICE ".Adsl"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-WIRELESS:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_WIRELESS</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_WIRELESS NM_DBUS_INTERFACE_DEVICE ".Wireless"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-BLUETOOTH:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_BLUETOOTH</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_BLUETOOTH NM_DBUS_INTERFACE_DEVICE ".Bluetooth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-OLPC-MESH:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_OLPC_MESH</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_OLPC_MESH NM_DBUS_INTERFACE_DEVICE ".OlpcMesh"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-ACCESS-POINT:CAPS"></a><h3>NM_DBUS_PATH_ACCESS_POINT</h3>
<pre class="programlisting">#define NM_DBUS_PATH_ACCESS_POINT NM_DBUS_PATH "/AccessPoint"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-ACCESS-POINT:CAPS"></a><h3>NM_DBUS_INTERFACE_ACCESS_POINT</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_ACCESS_POINT NM_DBUS_INTERFACE ".AccessPoint"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-MODEM:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_MODEM</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_MODEM NM_DBUS_INTERFACE_DEVICE ".Modem"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-WIMAX:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_WIMAX</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_WIMAX NM_DBUS_INTERFACE_DEVICE ".WiMax"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-WIMAX-NSP:CAPS"></a><h3>NM_DBUS_INTERFACE_WIMAX_NSP</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_WIMAX_NSP NM_DBUS_INTERFACE ".WiMax.Nsp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-WIMAX-NSP:CAPS"></a><h3>NM_DBUS_PATH_WIMAX_NSP</h3>
<pre class="programlisting">#define NM_DBUS_PATH_WIMAX_NSP NM_DBUS_PATH "/Nsp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-ACTIVE-CONNECTION:CAPS"></a><h3>NM_DBUS_INTERFACE_ACTIVE_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION NM_DBUS_INTERFACE ".Connection.Active"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-IP4-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_IP4_CONFIG NM_DBUS_INTERFACE ".IP4Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DHCP4-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_DHCP4_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DHCP4_CONFIG NM_DBUS_INTERFACE ".DHCP4Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-IP6-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_IP6_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_IP6_CONFIG NM_DBUS_INTERFACE ".IP6Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DHCP6-CONFIG:CAPS"></a><h3>NM_DBUS_INTERFACE_DHCP6_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DHCP6_CONFIG NM_DBUS_INTERFACE ".DHCP6Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-INFINIBAND:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_INFINIBAND</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_INFINIBAND NM_DBUS_INTERFACE_DEVICE ".Infiniband"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-BOND:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_BOND</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_BOND NM_DBUS_INTERFACE_DEVICE ".Bond"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-TEAM:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_TEAM</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_TEAM NM_DBUS_INTERFACE_DEVICE ".Team"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-VLAN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_VLAN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_VLAN NM_DBUS_INTERFACE_DEVICE ".Vlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-BRIDGE:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_BRIDGE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_BRIDGE NM_DBUS_INTERFACE_DEVICE ".Bridge"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-GENERIC:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_GENERIC</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_GENERIC NM_DBUS_INTERFACE_DEVICE ".Generic"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-VETH:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_VETH</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_VETH NM_DBUS_INTERFACE_DEVICE ".Veth"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-TUN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_TUN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_TUN NM_DBUS_INTERFACE_DEVICE ".Tun"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-MACVLAN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_MACVLAN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_MACVLAN NM_DBUS_INTERFACE_DEVICE ".Macvlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-VXLAN:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_VXLAN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_VXLAN NM_DBUS_INTERFACE_DEVICE ".Vxlan"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-DEVICE-GRE:CAPS"></a><h3>NM_DBUS_INTERFACE_DEVICE_GRE</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_DEVICE_GRE NM_DBUS_INTERFACE_DEVICE ".Gre"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-SETTINGS:CAPS"></a><h3>NM_DBUS_INTERFACE_SETTINGS</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_SETTINGS "org.freedesktop.NetworkManager.Settings"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-SETTINGS:CAPS"></a><h3>NM_DBUS_PATH_SETTINGS</h3>
<pre class="programlisting">#define NM_DBUS_PATH_SETTINGS "/org/freedesktop/NetworkManager/Settings"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-SETTINGS-CONNECTION:CAPS"></a><h3>NM_DBUS_INTERFACE_SETTINGS_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-SETTINGS-CONNECTION:CAPS"></a><h3>NM_DBUS_PATH_SETTINGS_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_PATH_SETTINGS_CONNECTION "/org/freedesktop/NetworkManager/Settings/Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-SETTINGS-CONNECTION-SECRETS:CAPS"></a><h3>NM_DBUS_INTERFACE_SETTINGS_CONNECTION_SECRETS</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_SETTINGS_CONNECTION_SECRETS "org.freedesktop.NetworkManager.Settings.Connection.Secrets"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-AGENT-MANAGER:CAPS"></a><h3>NM_DBUS_INTERFACE_AGENT_MANAGER</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_AGENT_MANAGER NM_DBUS_INTERFACE ".AgentManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-AGENT-MANAGER:CAPS"></a><h3>NM_DBUS_PATH_AGENT_MANAGER</h3>
<pre class="programlisting">#define NM_DBUS_PATH_AGENT_MANAGER "/org/freedesktop/NetworkManager/AgentManager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-SECRET-AGENT:CAPS"></a><h3>NM_DBUS_INTERFACE_SECRET_AGENT</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_SECRET_AGENT NM_DBUS_INTERFACE ".SecretAgent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-SECRET-AGENT:CAPS"></a><h3>NM_DBUS_PATH_SECRET_AGENT</h3>
<pre class="programlisting">#define NM_DBUS_PATH_SECRET_AGENT "/org/freedesktop/NetworkManager/SecretAgent"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1881,6 +1800,20 @@ GPRS, EDGE, UMTS, HSDPA, HSUPA, or HSPA+ packet switched data capability</p>
</td>
<td class="enum_member_annotations"> </td>
</tr>
+<tr>
+<td class="enum_member_name"><p><a name="NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS"></a>NM_DEVICE_STATE_REASON_PARENT_CHANGED</p></td>
+<td class="enum_member_description">
+<p>the device's parent changed</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS"></a>NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED</p></td>
+<td class="enum_member_description">
+<p>the device parent's management changed</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
</tbody>
</table></div>
</div>
@@ -2057,7 +1990,6 @@ VPN plugin authentication dialogs.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/libnm-nm-errors.html b/docs/libnm/html/libnm-nm-errors.html
index b62be03e9..92ea7737e 100644
--- a/docs/libnm/html/libnm-nm-errors.html
+++ b/docs/libnm/html/libnm-nm-errors.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: nm-errors</title>
+<title>nm-errors: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch02.html" title="Client Object API Reference">
<link rel="prev" href="NMObject.html" title="NMObject">
<link rel="next" href="libnm-nm-dbus-interface.html" title="nm-dbus-interface">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -197,8 +197,6 @@
</div>
<div class="refsect1">
<a name="libnm-nm-errors.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-nm-errors.functions_details"></a><h2>Functions</h2>
@@ -206,136 +204,78 @@
<a name="nm-agent-manager-error-quark"></a><h3>nm_agent_manager_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_agent_manager_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.2.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="NM-AGENT-MANAGER-ERROR:CAPS"></a><h3>NM_AGENT_MANAGER_ERROR</h3>
<pre class="programlisting">#define NM_AGENT_MANAGER_ERROR (nm_agent_manager_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="nm-connection-error-quark"></a><h3>nm_connection_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_connection_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.4.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-crypto-error-quark"></a><h3>nm_crypto_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_crypto_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.5.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-device-error-quark"></a><h3>nm_device_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_device_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.6.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="nm-manager-error-quark"></a><h3>nm_manager_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_manager_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.7.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="NM-MANAGER-ERROR:CAPS"></a><h3>NM_MANAGER_ERROR</h3>
<pre class="programlisting">#define NM_MANAGER_ERROR (nm_manager_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="nm-secret-agent-error-quark"></a><h3>nm_secret_agent_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_secret_agent_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.9.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="NM-SECRET-AGENT-ERROR:CAPS"></a><h3>NM_SECRET_AGENT_ERROR</h3>
<pre class="programlisting">#define NM_SECRET_AGENT_ERROR (nm_secret_agent_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="nm-settings-error-quark"></a><h3>nm_settings_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_settings_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.11.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
<a name="NM-SETTINGS-ERROR:CAPS"></a><h3>NM_SETTINGS_ERROR</h3>
<pre class="programlisting">#define NM_SETTINGS_ERROR (nm_settings_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-ERROR:CAPS"></a><h3>NM_VPN_PLUGIN_ERROR</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_ERROR (nm_vpn_plugin_error_quark ())
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="nm-vpn-plugin-error-quark"></a><h3>nm_vpn_plugin_error_quark ()</h3>
<pre class="programlisting"><span class="returnvalue">GQuark</span>
nm_vpn_plugin_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.3.5.7.14.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
</div>
<div class="refsect1">
@@ -506,8 +446,6 @@ methods, or may be returned from D-Bus operations (eg on <a class="link" href="N
<a name="NM-CONNECTION-ERROR:CAPS"></a><h3>NM_CONNECTION_ERROR</h3>
<pre class="programlisting">#define NM_CONNECTION_ERROR nm_connection_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -575,8 +513,6 @@ and some <a class="link" href="NMSetting8021x.html" title="NMSetting8021x"><span
<a name="NM-CRYPTO-ERROR:CAPS"></a><h3>NM_CRYPTO_ERROR</h3>
<pre class="programlisting">#define NM_CRYPTO_ERROR nm_crypto_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -664,8 +600,6 @@ returned from D-Bus operations (where they correspond to errors in the
<a name="NM-DEVICE-ERROR:CAPS"></a><h3>NM_DEVICE_ERROR</h3>
<pre class="programlisting">#define NM_DEVICE_ERROR nm_device_error_quark ()
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -1020,7 +954,6 @@ to errors in the "org.freedesktop.NetworkManager.VPN.Error" namespace.</p>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/libnm-nm-utils.html b/docs/libnm/html/libnm-nm-utils.html
index 60eb603e9..d3789e5b6 100644
--- a/docs/libnm/html/libnm-nm-utils.html
+++ b/docs/libnm/html/libnm-nm-utils.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: nm-utils</title>
+<title>nm-utils: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch05.html" title="Utility API Reference">
<link rel="prev" href="ch05.html" title="Utility API Reference">
<link rel="next" href="libnm-nm-version.html" title="nm-version">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -532,7 +532,6 @@ number of known SSID-cloaking methods.</p>
<div class="refsect3">
<a name="id-1.6.2.7.2.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the SSID is "empty", <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -572,7 +571,6 @@ be used for display of SSIDs.</p>
<a name="id-1.6.2.7.3.6"></a><h4>Returns</h4>
<p> pointer to the escaped SSID, which uses an internal static buffer
and will be overwritten by subsequent calls to this function</p>
-<p></p>
</div>
</div>
<hr>
@@ -632,7 +630,6 @@ NULLs, even though that is functionally pointless.</p>
<div class="refsect3">
<a name="id-1.6.2.7.4.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the SSIDs are the same, <code class="literal">FALSE</code> if they are not</p>
-<p></p>
</div>
</div>
<hr>
@@ -766,7 +763,6 @@ e.g. (<a class="link" href="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-C
<p> <code class="literal">TRUE</code> if the device capabilities and AP capabilties intersect and are
compatible with the desired <em class="parameter"><code>type</code></em>
, <code class="literal">FALSE</code> if they are not</p>
-<p></p>
</div>
</div>
<hr>
@@ -807,7 +803,6 @@ e.g. <a class="link" href="libnm-nm-utils.html#NMU-SEC-STATIC-WEP:CAPS"><span cl
<p> <code class="literal">TRUE</code> if the device capabilities are compatible with the desired
<em class="parameter"><code>type</code></em>
, <code class="literal">FALSE</code> if they are not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -844,7 +839,6 @@ nm_utils_wep_key_valid (<em class="parameter"><code>const <span class="type">cha
<a name="id-1.6.2.7.8.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>key</code></em>
is a WEP key, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -873,7 +867,6 @@ nm_utils_wpa_psk_valid (<em class="parameter"><code>const <span class="type">cha
<a name="id-1.6.2.7.9.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>psk</code></em>
is a WPA PSK, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1099,7 +1092,6 @@ nm_utils_ip4_netmask_to_prefix (<em class="parameter"><code><span class="type">g
<div class="refsect3">
<a name="id-1.6.2.7.16.5"></a><h4>Returns</h4>
<p> the CIDR prefix represented by the netmask</p>
-<p></p>
</div>
</div>
<hr>
@@ -1125,7 +1117,6 @@ nm_utils_ip4_prefix_to_netmask (<em class="parameter"><code><span class="type">g
<div class="refsect3">
<a name="id-1.6.2.7.17.5"></a><h4>Returns</h4>
<p> the netmask represented by the prefix, in network byte order</p>
-<p></p>
</div>
</div>
<hr>
@@ -1155,7 +1146,6 @@ falls in the predefined classes.</p>
<div class="refsect3">
<a name="id-1.6.2.7.18.6"></a><h4>Returns</h4>
<p> the default class prefix for the given IP</p>
-<p></p>
</div>
</div>
<hr>
@@ -1509,7 +1499,6 @@ nm_utils_uuid_generate (<em class="parameter"><code><span class="type">void</spa
<a name="id-1.6.2.7.29.4"></a><h4>Returns</h4>
<p> a newly allocated UUID suitable for use as the <a class="link" href="NMSettingConnection.html" title="NMSettingConnection"><span class="type">NMSettingConnection</span></a>
object's <a class="link" href="NMSettingConnection.html#NMSettingConnection--id" title="The “id” property"><span class="type">“id”</span></a>: property. Should be freed with <code class="function">g_free()</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -1539,7 +1528,6 @@ recognized by NetworkManager.</p>
<div class="refsect3">
<a name="id-1.6.2.7.30.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the file is a certificate, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1577,7 +1565,6 @@ recognized by NetworkManager.</p>
<div class="refsect3">
<a name="id-1.6.2.7.31.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the file is a private key, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1605,7 +1592,6 @@ nm_utils_file_is_pkcs12 (<em class="parameter"><code>const <span class="type">ch
<div class="refsect3">
<a name="id-1.6.2.7.32.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the file is PKCS#12, <code class="literal">FALSE</code> if it is not</p>
-<p></p>
</div>
</div>
<hr>
@@ -1614,12 +1600,6 @@ nm_utils_file_is_pkcs12 (<em class="parameter"><code>const <span class="type">ch
<pre class="programlisting"><span class="returnvalue">gboolean</span>
<span class="c_punctuation">(</span>*NMUtilsFileSearchInPathsPredicate<span class="c_punctuation">)</span> (<em class="parameter"><code>const <span class="type">char</span> *filename</code></em>,
<em class="parameter"><code><span class="type">gpointer</span> user_data</code></em>);</pre>
-<p>
-</p>
-<div class="refsect3">
-<a name="id-1.6.2.7.33.5"></a><h4>Returns</h4>
-<p></p>
-</div>
</div>
<hr>
<div class="refsect2">
@@ -1726,7 +1706,6 @@ nm_utils_wifi_freq_to_channel (<em class="parameter"><code><span class="type">gu
<div class="refsect3">
<a name="id-1.6.2.7.35.6"></a><h4>Returns</h4>
<p> the channel represented by the frequency or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -1763,7 +1742,6 @@ nm_utils_wifi_channel_to_freq (<em class="parameter"><code><span class="type">gu
<p> the frequency represented by the channel of the band,
or -1 when the freq is invalid, or 0 when the band
is invalid</p>
-<p></p>
</div>
</div>
<hr>
@@ -1804,7 +1782,6 @@ nm_utils_wifi_find_next_channel (<em class="parameter"><code><span class="type">
<div class="refsect3">
<a name="id-1.6.2.7.37.6"></a><h4>Returns</h4>
<p> the next channel in the specified direction or 0</p>
-<p></p>
</div>
</div>
<hr>
@@ -1839,7 +1816,6 @@ nm_utils_wifi_is_channel_valid (<em class="parameter"><code><span class="type">g
<div class="refsect3">
<a name="id-1.6.2.7.38.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> or <code class="literal">FALSE</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -1870,7 +1846,6 @@ support it, this will use unicode graphics characters to represent
<div class="refsect3">
<a name="id-1.6.2.7.39.6"></a><h4>Returns</h4>
<p> the graphical representation of the access point strength</p>
-<p></p>
</div>
</div>
<hr>
@@ -1901,7 +1876,6 @@ nm_utils_hwaddr_len (<em class="parameter"><code><span class="type">int</span> t
<div class="refsect3">
<a name="id-1.6.2.7.40.7"></a><h4>Returns</h4>
<p> the length.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2028,7 +2002,6 @@ the size of the buffer in bytes.</p></td>
couldn't be parsed
or would be shorter or longer than <em class="parameter"><code>length</code></em>
.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2069,7 +2042,6 @@ is expected to convert to
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>asc</code></em>
appears to be a valid hardware address
of the indicated length, <code class="literal">FALSE</code> if not.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2195,7 +2167,6 @@ is ASCII</p></td>
and <em class="parameter"><code>hwaddr2</code></em>
are equivalent, <code class="literal">FALSE</code> if they are
different (or either of them is invalid).</p>
-<p></p>
</div>
</div>
<hr>
@@ -2303,7 +2274,6 @@ function in net/core/dev.c.</p>
<div class="refsect3">
<a name="id-1.6.2.7.49.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if interface name is valid, otherwise <code class="literal">FALSE</code> is returned.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2332,7 +2302,6 @@ nm_utils_is_uuid (<em class="parameter"><code>const <span class="type">char</spa
<a name="id-1.6.2.7.50.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if <em class="parameter"><code>str</code></em>
is a UUID, <code class="literal">FALSE</code> if not</p>
-<p></p>
</div>
</div>
<hr>
@@ -2342,8 +2311,9 @@ is a UUID, <code class="literal">FALSE</code> if not</p>
nm_utils_inet4_ntop (<em class="parameter"><code><span class="type">in_addr_t</span> inaddr</code></em>,
<em class="parameter"><code><span class="type">char</span> *dst</code></em>);</pre>
<p>Wrapper for inet_ntop.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.6.2.7.51.5"></a><h4>Parameters</h4>
+<a name="id-1.6.2.7.51.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2374,11 +2344,10 @@ buffer to avoid these issues.</p></td>
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.6.2.7.51.6"></a><h4>Returns</h4>
+<a name="id-1.6.2.7.51.7"></a><h4>Returns</h4>
<p> the input buffer <em class="parameter"><code>dst</code></em>
, or a pointer to an
internal, static buffer. This function cannot fail.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2388,8 +2357,9 @@ internal, static buffer. This function cannot fail.</p>
nm_utils_inet6_ntop (<em class="parameter"><code>const <span class="type">struct in6_addr</span> *in6addr</code></em>,
<em class="parameter"><code><span class="type">char</span> *dst</code></em>);</pre>
<p>Wrapper for inet_ntop.</p>
+<p><span class="annotation">[<acronym title="Exposed in C code, not necessarily available in other languages."><span class="acronym">skip</span></acronym>]</span></p>
<div class="refsect3">
-<a name="id-1.6.2.7.52.5"></a><h4>Parameters</h4>
+<a name="id-1.6.2.7.52.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2420,13 +2390,12 @@ buffer to avoid these issues.</p></td>
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.6.2.7.52.6"></a><h4>Returns</h4>
+<a name="id-1.6.2.7.52.7"></a><h4>Returns</h4>
<p> the input buffer <em class="parameter"><code>dst</code></em>
, or a pointer to an
internal, static buffer. <code class="literal">NULL</code> is not allowed as <em class="parameter"><code>in6addr</code></em>
,
otherwise, this function cannot fail.</p>
-<p></p>
</div>
</div>
<hr>
@@ -2463,7 +2432,6 @@ nm_utils_ipaddr_valid (<em class="parameter"><code><span class="type">int</span>
<div class="refsect3">
<a name="id-1.6.2.7.53.6"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> or <code class="literal">FALSE</code></p>
-<p></p>
</div>
</div>
<hr>
@@ -2519,7 +2487,6 @@ underlying device driver.</p>
<div class="refsect3">
<a name="id-1.6.2.7.54.9"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> or <code class="literal">FALSE</code></p>
-<p></p>
</div>
</div>
</div>
@@ -2628,7 +2595,6 @@ for both <a class="link" href="libnm-nm-utils.html#nm-utils-inet4-ntop" title="n
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/libnm-nm-version.html b/docs/libnm/html/libnm-nm-version.html
index 7cbebd935..99310a5c0 100644
--- a/docs/libnm/html/libnm-nm-version.html
+++ b/docs/libnm/html/libnm-nm-version.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: nm-version</title>
+<title>nm-version: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch05.html" title="Utility API Reference">
<link rel="prev" href="libnm-nm-utils.html" title="nm-utils">
<link rel="next" href="ch06.html" title="VPN Plugin API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -77,6 +77,14 @@
</tr>
<tr>
<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libnm-nm-version.html#NM-VERSION-1-0-2:CAPS" title="NM_VERSION_1_0_2">NM_VERSION_1_0_2</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libnm-nm-version.html#NM-VERSION-1-0-4:CAPS" title="NM_VERSION_1_0_4">NM_VERSION_1_0_4</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
<td class="function_name"><a class="link" href="libnm-nm-version.html#NM-VERSION-MIN-REQUIRED:CAPS" title="NM_VERSION_MIN_REQUIRED">NM_VERSION_MIN_REQUIRED</a></td>
</tr>
<tr>
@@ -130,13 +138,15 @@
<td class="define_keyword">#define</td>
<td class="function_name"><a class="link" href="libnm-nm-version.html#NM-AVAILABLE-IN-1-0:CAPS" title="NM_AVAILABLE_IN_1_0">NM_AVAILABLE_IN_1_0</a></td>
</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="libnm-nm-version.html#NM-AVAILABLE-IN-1-0-4:CAPS" title="NM_AVAILABLE_IN_1_0_4">NM_AVAILABLE_IN_1_0_4</a></td>
+</tr>
</tbody>
</table></div>
</div>
<div class="refsect1">
<a name="libnm-nm-version.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-nm-version.functions_details"></a><h2>Functions</h2>
@@ -158,7 +168,7 @@ is compiled against.</p>
<hr>
<div class="refsect2">
<a name="NM-MICRO-VERSION:CAPS"></a><h3>NM_MICRO_VERSION</h3>
-<pre class="programlisting">#define NM_MICRO_VERSION (2)
+<pre class="programlisting">#define NM_MICRO_VERSION (4)
</pre>
<p>Evaluates to the micro version number of NetworkManager which this source
compiled against.</p>
@@ -198,7 +208,6 @@ compiled against.</p>
<a name="id-1.6.3.6.5.5"></a><h4>Returns</h4>
<p> <code class="literal">TRUE</code> if the version of the NetworkManager header files
is the same as or newer than the passed-in version.</p>
-<p></p>
</div>
</div>
<hr>
@@ -206,119 +215,108 @@ is the same as or newer than the passed-in version.</p>
<a name="NM-ENCODE-VERSION:CAPS"></a><h3>NM_ENCODE_VERSION()</h3>
<pre class="programlisting">#define NM_ENCODE_VERSION(major,minor,micro) ((major) &lt;&lt; 16 | (minor) &lt;&lt; 8 | (micro))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VERSION-0-9-8:CAPS"></a><h3>NM_VERSION_0_9_8</h3>
<pre class="programlisting">#define NM_VERSION_0_9_8 (NM_ENCODE_VERSION (0, 9, 8))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VERSION-0-9-10:CAPS"></a><h3>NM_VERSION_0_9_10</h3>
<pre class="programlisting">#define NM_VERSION_0_9_10 (NM_ENCODE_VERSION (0, 9, 10))
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VERSION-1-0:CAPS"></a><h3>NM_VERSION_1_0</h3>
<pre class="programlisting">#define NM_VERSION_1_0 (NM_ENCODE_VERSION (1, 0, 0))
</pre>
-<p>
-</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="NM-VERSION-1-0-2:CAPS"></a><h3>NM_VERSION_1_0_2</h3>
+<pre class="programlisting">#define NM_VERSION_1_0_2 (NM_ENCODE_VERSION (1, 0, 2))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="NM-VERSION-1-0-4:CAPS"></a><h3>NM_VERSION_1_0_4</h3>
+<pre class="programlisting">#define NM_VERSION_1_0_4 (NM_ENCODE_VERSION (1, 0, 4))
+</pre>
</div>
<hr>
<div class="refsect2">
<a name="NM-VERSION-MIN-REQUIRED:CAPS"></a><h3>NM_VERSION_MIN_REQUIRED</h3>
<pre class="programlisting"># define NM_VERSION_MIN_REQUIRED (NM_VERSION_CUR_STABLE)
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VERSION-MAX-ALLOWED:CAPS"></a><h3>NM_VERSION_MAX_ALLOWED</h3>
<pre class="programlisting"># define NM_VERSION_MAX_ALLOWED (NM_VERSION_CUR_STABLE)
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEPRECATED-IN-0-9-10-FOR:CAPS"></a><h3>NM_DEPRECATED_IN_0_9_10_FOR()</h3>
<pre class="programlisting"># define NM_DEPRECATED_IN_0_9_10_FOR(f) G_DEPRECATED_FOR(f)
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEPRECATED-IN-1-0-FOR:CAPS"></a><h3>NM_DEPRECATED_IN_1_0_FOR()</h3>
<pre class="programlisting"># define NM_DEPRECATED_IN_1_0_FOR(f) G_DEPRECATED_FOR(f)
</pre>
-<p>
-</p>
</div>
</div>
<div class="refsect1">
<a name="libnm-nm-version.other_details"></a><h2>Types and Values</h2>
<div class="refsect2">
<a name="NM-VERSION-CUR-STABLE:CAPS"></a><h3>NM_VERSION_CUR_STABLE</h3>
-<pre class="programlisting">#define NM_VERSION_CUR_STABLE NM_VERSION_1_0
+<pre class="programlisting">#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_2
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VERSION-NEXT-STABLE:CAPS"></a><h3>NM_VERSION_NEXT_STABLE</h3>
-<pre class="programlisting">#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0
+<pre class="programlisting">#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_4
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEPRECATED-IN-0-9-10:CAPS"></a><h3>NM_DEPRECATED_IN_0_9_10</h3>
<pre class="programlisting"># define NM_DEPRECATED_IN_0_9_10 G_DEPRECATED
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DEPRECATED-IN-1-0:CAPS"></a><h3>NM_DEPRECATED_IN_1_0</h3>
<pre class="programlisting"># define NM_DEPRECATED_IN_1_0 G_DEPRECATED
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-AVAILABLE-IN-0-9-10:CAPS"></a><h3>NM_AVAILABLE_IN_0_9_10</h3>
<pre class="programlisting"># define NM_AVAILABLE_IN_0_9_10 G_UNAVAILABLE(0.9,10)
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-AVAILABLE-IN-1-0:CAPS"></a><h3>NM_AVAILABLE_IN_1_0</h3>
<pre class="programlisting"># define NM_AVAILABLE_IN_1_0 G_UNAVAILABLE(1,0)
</pre>
-<p>
-</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="NM-AVAILABLE-IN-1-0-4:CAPS"></a><h3>NM_AVAILABLE_IN_1_0_4</h3>
+<pre class="programlisting"># define NM_AVAILABLE_IN_1_0_4 G_UNAVAILABLE(1,0.4)
+</pre>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/libnm-nm-vpn-dbus-interface.html b/docs/libnm/html/libnm-nm-vpn-dbus-interface.html
index d48bb1cdb..cb1bb7f51 100644
--- a/docs/libnm/html/libnm-nm-vpn-dbus-interface.html
+++ b/docs/libnm/html/libnm-nm-vpn-dbus-interface.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: nm-vpn-dbus-interface</title>
+<title>nm-vpn-dbus-interface: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="ch06.html" title="VPN Plugin API Reference">
<link rel="prev" href="ch06.html" title="VPN Plugin API Reference">
<link rel="next" href="NMVpnEditor.html" title="NMVpnEditor">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -302,11 +302,10 @@
</div>
<div class="refsect1">
<a name="libnm-nm-vpn-dbus-interface.description"></a><h2>Description</h2>
-<p>
-</p>
</div>
<div class="refsect1">
<a name="libnm-nm-vpn-dbus-interface.functions_details"></a><h2>Functions</h2>
+<p></p>
</div>
<div class="refsect1">
<a name="libnm-nm-vpn-dbus-interface.other_details"></a><h2>Types and Values</h2>
@@ -314,200 +313,150 @@
<a name="NM-DBUS-PATH-VPN:CAPS"></a><h3>NM_DBUS_PATH_VPN</h3>
<pre class="programlisting">#define NM_DBUS_PATH_VPN "/org/freedesktop/NetworkManager/VPN/Manager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-VPN:CAPS"></a><h3>NM_DBUS_INTERFACE_VPN</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_VPN "org.freedesktop.NetworkManager.VPN.Manager"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-PATH-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_PATH_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_PATH_VPN_CONNECTION "/org/freedesktop/NetworkManager/VPN/Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INTERFACE-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_INTERFACE_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INTERFACE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPN.Connection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-DBUS-PLUGIN-PATH:CAPS"></a><h3>NM_VPN_DBUS_PLUGIN_PATH</h3>
<pre class="programlisting">#define NM_VPN_DBUS_PLUGIN_PATH "/org/freedesktop/NetworkManager/VPN/Plugin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-DBUS-PLUGIN-INTERFACE:CAPS"></a><h3>NM_VPN_DBUS_PLUGIN_INTERFACE</h3>
<pre class="programlisting">#define NM_VPN_DBUS_PLUGIN_INTERFACE "org.freedesktop.NetworkManager.VPN.Plugin"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-NO-ACTIVE-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_NO_ACTIVE_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_NO_ACTIVE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPNConnections.NoActiveVPNConnection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-NO-VPN-CONNECTIONS:CAPS"></a><h3>NM_DBUS_NO_VPN_CONNECTIONS</h3>
<pre class="programlisting">#define NM_DBUS_NO_VPN_CONNECTIONS "org.freedesktop.NetworkManager.VPNConnections.NoVPNConnections"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-INVALID-VPN-CONNECTION:CAPS"></a><h3>NM_DBUS_INVALID_VPN_CONNECTION</h3>
<pre class="programlisting">#define NM_DBUS_INVALID_VPN_CONNECTION "org.freedesktop.NetworkManager.VPNConnections.InvalidVPNConnection"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-ERROR-PREFIX:CAPS"></a><h3>NM_DBUS_VPN_ERROR_PREFIX</h3>
<pre class="programlisting">#define NM_DBUS_VPN_ERROR_PREFIX "org.freedesktop.NetworkManager.VPN.Error"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-STARTING-IN-PROGRESS:CAPS"></a><h3>NM_DBUS_VPN_STARTING_IN_PROGRESS</h3>
<pre class="programlisting">#define NM_DBUS_VPN_STARTING_IN_PROGRESS "StartingInProgress"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-ALREADY-STARTED:CAPS"></a><h3>NM_DBUS_VPN_ALREADY_STARTED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_ALREADY_STARTED "AlreadyStarted"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-STOPPING-IN-PROGRESS:CAPS"></a><h3>NM_DBUS_VPN_STOPPING_IN_PROGRESS</h3>
<pre class="programlisting">#define NM_DBUS_VPN_STOPPING_IN_PROGRESS "StoppingInProgress"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-ALREADY-STOPPED:CAPS"></a><h3>NM_DBUS_VPN_ALREADY_STOPPED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_ALREADY_STOPPED "AlreadyStopped"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-WRONG-STATE:CAPS"></a><h3>NM_DBUS_VPN_WRONG_STATE</h3>
<pre class="programlisting">#define NM_DBUS_VPN_WRONG_STATE "WrongState"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-BAD-ARGUMENTS:CAPS"></a><h3>NM_DBUS_VPN_BAD_ARGUMENTS</h3>
<pre class="programlisting">#define NM_DBUS_VPN_BAD_ARGUMENTS "BadArguments"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-INTERACTIVE-NOT-SUPPORTED:CAPS"></a><h3>NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED "InteractiveNotSupported"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-LOGIN-BANNER:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_LOGIN_BANNER</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_LOGIN_BANNER "LoginBanner"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-LOGIN-FAILED:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_LOGIN_FAILED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_LOGIN_FAILED "LoginFailed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-LAUNCH-FAILED:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED "LaunchFailed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-CONNECT-FAILED:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_CONNECT_FAILED</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_CONNECT_FAILED "ConnectFailed"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-VPN-CONFIG-BAD:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD "VPNConfigBad"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-IP-CONFIG-BAD:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD "IPConfigBad"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-STATE-CHANGE:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_STATE_CHANGE</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_STATE_CHANGE "StateChange"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-DBUS-VPN-SIGNAL-IP4-CONFIG:CAPS"></a><h3>NM_DBUS_VPN_SIGNAL_IP4_CONFIG</h3>
<pre class="programlisting">#define NM_DBUS_VPN_SIGNAL_IP4_CONFIG "IP4Config"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
@@ -813,269 +762,202 @@
<a name="NM-VPN-PLUGIN-CONFIG-TUNDEV:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_TUNDEV</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_TUNDEV "tundev"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-BANNER:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_BANNER</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_BANNER "banner"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-EXT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY "gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-MTU:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_MTU</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_MTU "mtu"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-HAS-IP4:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_HAS_IP4</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_HAS_IP4 "has-ip4"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CONFIG-HAS-IP6:CAPS"></a><h3>NM_VPN_PLUGIN_CONFIG_HAS_IP6</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CONFIG_HAS_IP6 "has-ip6"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-CAN-PERSIST:CAPS"></a><h3>NM_VPN_PLUGIN_CAN_PERSIST</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_CAN_PERSIST "can-persist"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-INT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY "internal-gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-ADDRESS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS "address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-PTP:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_PTP</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_PTP "ptp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-PREFIX:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_PREFIX</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_PREFIX "prefix"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-DNS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-NBNS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_NBNS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_NBNS "nbns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-MSS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_MSS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_MSS "mss"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-DOMAIN:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN "domain"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-DOMAINS:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-ROUTES:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-BANNER:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_BANNER</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_BANNER NM_VPN_PLUGIN_CONFIG_BANNER
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-EXT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-MTU:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_MTU</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_MTU NM_VPN_PLUGIN_CONFIG_MTU
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP4-CONFIG-TUNDEV:CAPS"></a><h3>NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV NM_VPN_PLUGIN_CONFIG_TUNDEV
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-INT-GATEWAY:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY "internal-gateway"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-ADDRESS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS "address"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-PTP:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_PTP</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_PTP "ptp"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-PREFIX:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_PREFIX</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_PREFIX "prefix"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-DNS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_DNS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_DNS "dns"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-MSS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_MSS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_MSS "mss"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-DOMAIN:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN "domain"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-DOMAINS:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS "domains"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-ROUTES:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_ROUTES</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_ROUTES "routes"
</pre>
-<p>
-</p>
</div>
<hr>
<div class="refsect2">
<a name="NM-VPN-PLUGIN-IP6-CONFIG-NEVER-DEFAULT:CAPS"></a><h3>NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT</h3>
<pre class="programlisting">#define NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT "never-default"
</pre>
-<p>
-</p>
</div>
</div>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/libnm.devhelp2 b/docs/libnm/html/libnm.devhelp2
index 58b5d8e47..ff7493085 100644
--- a/docs/libnm/html/libnm.devhelp2
+++ b/docs/libnm/html/libnm.devhelp2
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<!DOCTYPE book PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<book xmlns="http://www.devhelp.net/book" title="libnm Reference Manual" link="index.html" author="" name="libnm" version="2" language="c">
<chapters>
<sub name="Overview" link="ref-overview.html"/>
@@ -394,6 +393,7 @@
<keyword type="function" name="nm_setting_connection_get_master ()" link="NMSettingConnection.html#nm-setting-connection-get-master"/>
<keyword type="function" name="nm_setting_connection_is_slave_type ()" link="NMSettingConnection.html#nm-setting-connection-is-slave-type"/>
<keyword type="function" name="nm_setting_connection_get_slave_type ()" link="NMSettingConnection.html#nm-setting-connection-get-slave-type"/>
+ <keyword type="function" name="nm_setting_connection_get_autoconnect_slaves ()" link="NMSettingConnection.html#nm-setting-connection-get-autoconnect-slaves" since="1.0.4"/>
<keyword type="function" name="nm_setting_connection_get_num_secondaries ()" link="NMSettingConnection.html#nm-setting-connection-get-num-secondaries"/>
<keyword type="function" name="nm_setting_connection_get_secondary ()" link="NMSettingConnection.html#nm-setting-connection-get-secondary"/>
<keyword type="function" name="nm_setting_connection_add_secondary ()" link="NMSettingConnection.html#nm-setting-connection-add-secondary"/>
@@ -416,11 +416,14 @@
<keyword type="macro" name="NM_SETTING_CONNECTION_ZONE" link="NMSettingConnection.html#NM-SETTING-CONNECTION-ZONE:CAPS"/>
<keyword type="macro" name="NM_SETTING_CONNECTION_MASTER" link="NMSettingConnection.html#NM-SETTING-CONNECTION-MASTER:CAPS"/>
<keyword type="macro" name="NM_SETTING_CONNECTION_SLAVE_TYPE" link="NMSettingConnection.html#NM-SETTING-CONNECTION-SLAVE-TYPE:CAPS"/>
+ <keyword type="macro" name="NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES" link="NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES:CAPS"/>
<keyword type="macro" name="NM_SETTING_CONNECTION_SECONDARIES" link="NMSettingConnection.html#NM-SETTING-CONNECTION-SECONDARIES:CAPS"/>
<keyword type="macro" name="NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT" link="NMSettingConnection.html#NM-SETTING-CONNECTION-GATEWAY-PING-TIMEOUT:CAPS"/>
+ <keyword type="enum" name="enum NMSettingConnectionAutoconnectSlaves" link="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves"/>
<keyword type="struct" name="struct NMSettingConnection" link="NMSettingConnection.html#NMSettingConnection-struct"/>
<keyword type="property" name="The “autoconnect” property" link="NMSettingConnection.html#NMSettingConnection--autoconnect"/>
<keyword type="property" name="The “autoconnect-priority” property" link="NMSettingConnection.html#NMSettingConnection--autoconnect-priority"/>
+ <keyword type="property" name="The “autoconnect-slaves” property" link="NMSettingConnection.html#NMSettingConnection--autoconnect-slaves"/>
<keyword type="property" name="The “gateway-ping-timeout” property" link="NMSettingConnection.html#NMSettingConnection--gateway-ping-timeout"/>
<keyword type="property" name="The “id” property" link="NMSettingConnection.html#NMSettingConnection--id"/>
<keyword type="property" name="The “interface-name” property" link="NMSettingConnection.html#NMSettingConnection--interface-name"/>
@@ -501,6 +504,7 @@
<keyword type="function" name="nm_setting_802_1x_get_phase2_private_key_password ()" link="NMSetting8021x.html#nm-setting-802-1x-get-phase2-private-key-password"/>
<keyword type="function" name="nm_setting_802_1x_get_phase2_private_key_password_flags ()" link="NMSetting8021x.html#nm-setting-802-1x-get-phase2-private-key-password-flags"/>
<keyword type="function" name="nm_setting_802_1x_get_phase2_private_key_format ()" link="NMSetting8021x.html#nm-setting-802-1x-get-phase2-private-key-format"/>
+ <keyword type="macro" name="NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH" link="NMSetting8021x.html#NM-SETTING-802-1X-CERT-SCHEME-PREFIX-PATH:CAPS"/>
<keyword type="enum" name="enum NMSetting8021xCKFormat" link="NMSetting8021x.html#NMSetting8021xCKFormat"/>
<keyword type="enum" name="enum NMSetting8021xCKScheme" link="NMSetting8021x.html#NMSetting8021xCKScheme"/>
<keyword type="macro" name="NM_SETTING_802_1X_SETTING_NAME" link="NMSetting8021x.html#NM-SETTING-802-1X-SETTING-NAME:CAPS"/>
@@ -1678,6 +1682,8 @@
<keyword type="macro" name="NM_VERSION_0_9_8" link="libnm-nm-version.html#NM-VERSION-0-9-8:CAPS"/>
<keyword type="macro" name="NM_VERSION_0_9_10" link="libnm-nm-version.html#NM-VERSION-0-9-10:CAPS"/>
<keyword type="macro" name="NM_VERSION_1_0" link="libnm-nm-version.html#NM-VERSION-1-0:CAPS"/>
+ <keyword type="macro" name="NM_VERSION_1_0_2" link="libnm-nm-version.html#NM-VERSION-1-0-2:CAPS"/>
+ <keyword type="macro" name="NM_VERSION_1_0_4" link="libnm-nm-version.html#NM-VERSION-1-0-4:CAPS"/>
<keyword type="macro" name="NM_VERSION_MIN_REQUIRED" link="libnm-nm-version.html#NM-VERSION-MIN-REQUIRED:CAPS"/>
<keyword type="macro" name="NM_VERSION_MAX_ALLOWED" link="libnm-nm-version.html#NM-VERSION-MAX-ALLOWED:CAPS"/>
<keyword type="macro" name="NM_DEPRECATED_IN_0_9_10_FOR()" link="libnm-nm-version.html#NM-DEPRECATED-IN-0-9-10-FOR:CAPS"/>
@@ -1688,6 +1694,7 @@
<keyword type="macro" name="NM_DEPRECATED_IN_1_0" link="libnm-nm-version.html#NM-DEPRECATED-IN-1-0:CAPS"/>
<keyword type="macro" name="NM_AVAILABLE_IN_0_9_10" link="libnm-nm-version.html#NM-AVAILABLE-IN-0-9-10:CAPS"/>
<keyword type="macro" name="NM_AVAILABLE_IN_1_0" link="libnm-nm-version.html#NM-AVAILABLE-IN-1-0:CAPS"/>
+ <keyword type="macro" name="NM_AVAILABLE_IN_1_0_4" link="libnm-nm-version.html#NM-AVAILABLE-IN-1-0-4:CAPS"/>
<keyword type="macro" name="NM_DBUS_PATH_VPN" link="libnm-nm-vpn-dbus-interface.html#NM-DBUS-PATH-VPN:CAPS"/>
<keyword type="macro" name="NM_DBUS_INTERFACE_VPN" link="libnm-nm-vpn-dbus-interface.html#NM-DBUS-INTERFACE-VPN:CAPS"/>
<keyword type="macro" name="NM_DBUS_PATH_VPN_CONNECTION" link="libnm-nm-vpn-dbus-interface.html#NM-DBUS-PATH-VPN-CONNECTION:CAPS"/>
@@ -1769,5 +1776,346 @@
<keyword type="property" name="The “name” property" link="NMVpnEditor.html#NMVpnEditorPlugin--name"/>
<keyword type="property" name="The “service” property" link="NMVpnEditor.html#NMVpnEditorPlugin--service"/>
<keyword type="signal" name="The “changed” signal" link="NMVpnEditor.html#NMVpnEditor-changed"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_NONE" link="NMClient.html#NM-CLIENT-PERMISSION-NONE:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-NETWORK:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIFI:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WWAN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX" link="NMClient.html#NM-CLIENT-PERMISSION-ENABLE-DISABLE-WIMAX:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SLEEP_WAKE" link="NMClient.html#NM-CLIENT-PERMISSION-SLEEP-WAKE:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_NETWORK_CONTROL" link="NMClient.html#NM-CLIENT-PERMISSION-NETWORK-CONTROL:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED" link="NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-PROTECTED:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN" link="NMClient.html#NM-CLIENT-PERMISSION-WIFI-SHARE-OPEN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM" link="NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-SYSTEM:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN" link="NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-OWN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME" link="NMClient.html#NM-CLIENT-PERMISSION-SETTINGS-MODIFY-HOSTNAME:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_LAST" link="NMClient.html#NM-CLIENT-PERMISSION-LAST:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_UNKNOWN" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_YES" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-YES:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_AUTH" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-AUTH:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_PERMISSION_RESULT_NO" link="NMClient.html#NM-CLIENT-PERMISSION-RESULT-NO:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_ERROR_FAILED" link="NMClient.html#NM-CLIENT-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_ERROR_MANAGER_NOT_RUNNING" link="NMClient.html#NM-CLIENT-ERROR-MANAGER-NOT-RUNNING:CAPS"/>
+ <keyword type="constant" name="NM_CLIENT_ERROR_OBJECT_CREATION_FAILED" link="NMClient.html#NM-CLIENT-ERROR-OBJECT-CREATION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_AGENT_MANAGER_ERROR_FAILED" link="libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_AGENT_MANAGER_ERROR_PERMISSION_DENIED" link="libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-PERMISSION-DENIED:CAPS"/>
+ <keyword type="constant" name="NM_AGENT_MANAGER_ERROR_INVALID_IDENTIFIER" link="libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-INVALID-IDENTIFIER:CAPS"/>
+ <keyword type="constant" name="NM_AGENT_MANAGER_ERROR_NOT_REGISTERED" link="libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-NOT-REGISTERED:CAPS"/>
+ <keyword type="constant" name="NM_AGENT_MANAGER_ERROR_NO_SECRETS" link="libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_AGENT_MANAGER_ERROR_USER_CANCELED" link="libnm-nm-errors.html#NM-AGENT-MANAGER-ERROR-USER-CANCELED:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_FAILED" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_SETTING_NOT_FOUND" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-SETTING-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_PROPERTY_NOT_FOUND" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-PROPERTY-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_PROPERTY_NOT_SECRET" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-PROPERTY-NOT-SECRET:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_MISSING_SETTING" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-MISSING-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_INVALID_SETTING" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-INVALID-SETTING:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_MISSING_PROPERTY" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-MISSING-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_ERROR_INVALID_PROPERTY" link="libnm-nm-errors.html#NM-CONNECTION-ERROR-INVALID-PROPERTY:CAPS"/>
+ <keyword type="constant" name="NM_CRYPTO_ERROR_FAILED" link="libnm-nm-errors.html#NM-CRYPTO-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_CRYPTO_ERROR_INVALID_DATA" link="libnm-nm-errors.html#NM-CRYPTO-ERROR-INVALID-DATA:CAPS"/>
+ <keyword type="constant" name="NM_CRYPTO_ERROR_INVALID_PASSWORD" link="libnm-nm-errors.html#NM-CRYPTO-ERROR-INVALID-PASSWORD:CAPS"/>
+ <keyword type="constant" name="NM_CRYPTO_ERROR_UNKNOWN_CIPHER" link="libnm-nm-errors.html#NM-CRYPTO-ERROR-UNKNOWN-CIPHER:CAPS"/>
+ <keyword type="constant" name="NM_CRYPTO_ERROR_DECRYPTION_FAILED" link="libnm-nm-errors.html#NM-CRYPTO-ERROR-DECRYPTION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_CRYPTO_ERROR_ENCRYPTION_FAILED" link="libnm-nm-errors.html#NM-CRYPTO-ERROR-ENCRYPTION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_FAILED" link="libnm-nm-errors.html#NM-DEVICE-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_CREATION_FAILED" link="libnm-nm-errors.html#NM-DEVICE-ERROR-CREATION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_INVALID_CONNECTION" link="libnm-nm-errors.html#NM-DEVICE-ERROR-INVALID-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION" link="libnm-nm-errors.html#NM-DEVICE-ERROR-INCOMPATIBLE-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_NOT_ACTIVE" link="libnm-nm-errors.html#NM-DEVICE-ERROR-NOT-ACTIVE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_NOT_SOFTWARE" link="libnm-nm-errors.html#NM-DEVICE-ERROR-NOT-SOFTWARE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_NOT_ALLOWED" link="libnm-nm-errors.html#NM-DEVICE-ERROR-NOT-ALLOWED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_ERROR_SPECIFIC_OBJECT_NOT_FOUND" link="libnm-nm-errors.html#NM-DEVICE-ERROR-SPECIFIC-OBJECT-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_FAILED" link="libnm-nm-errors.html#NM-MANAGER-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_PERMISSION_DENIED" link="libnm-nm-errors.html#NM-MANAGER-ERROR-PERMISSION-DENIED:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_UNKNOWN_CONNECTION" link="libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_UNKNOWN_DEVICE" link="libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-DEVICE:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_CONNECTION_NOT_AVAILABLE" link="libnm-nm-errors.html#NM-MANAGER-ERROR-CONNECTION-NOT-AVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE" link="libnm-nm-errors.html#NM-MANAGER-ERROR-CONNECTION-NOT-ACTIVE:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_CONNECTION_ALREADY_ACTIVE" link="libnm-nm-errors.html#NM-MANAGER-ERROR-CONNECTION-ALREADY-ACTIVE:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_DEPENDENCY_FAILED" link="libnm-nm-errors.html#NM-MANAGER-ERROR-DEPENDENCY-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_ALREADY_ASLEEP_OR_AWAKE" link="libnm-nm-errors.html#NM-MANAGER-ERROR-ALREADY-ASLEEP-OR-AWAKE:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED" link="libnm-nm-errors.html#NM-MANAGER-ERROR-ALREADY-ENABLED-OR-DISABLED:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL" link="libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-LOG-LEVEL:CAPS"/>
+ <keyword type="constant" name="NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN" link="libnm-nm-errors.html#NM-MANAGER-ERROR-UNKNOWN-LOG-DOMAIN:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_FAILED" link="libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_PERMISSION_DENIED" link="libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-PERMISSION-DENIED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_INVALID_CONNECTION" link="libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-INVALID-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_USER_CANCELED" link="libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-USER-CANCELED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_AGENT_CANCELED" link="libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-AGENT-CANCELED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_ERROR_NO_SECRETS" link="libnm-nm-errors.html#NM-SECRET-AGENT-ERROR-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_FAILED" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_PERMISSION_DENIED" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-PERMISSION-DENIED:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_NOT_SUPPORTED" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-NOT-SUPPORTED:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_INVALID_CONNECTION" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-INVALID-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_READ_ONLY_CONNECTION" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-READ-ONLY-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_UUID_EXISTS" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-UUID-EXISTS:CAPS"/>
+ <keyword type="constant" name="NM_SETTINGS_ERROR_INVALID_HOSTNAME" link="libnm-nm-errors.html#NM-SETTINGS-ERROR-INVALID-HOSTNAME:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_FAILED" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_STARTING_IN_PROGRESS" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-STARTING-IN-PROGRESS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_ALREADY_STARTED" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-ALREADY-STARTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-STOPPING-IN-PROGRESS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-ALREADY-STOPPED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_WRONG_STATE" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-WRONG-STATE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-BAD-ARGUMENTS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-LAUNCH-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_INVALID_CONNECTION" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-INVALID-CONNECTION:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED" link="libnm-nm-errors.html#NM-VPN-PLUGIN-ERROR-INTERACTIVE-NOT-SUPPORTED:CAPS"/>
+ <keyword type="constant" name="NM_STATE_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_STATE_ASLEEP" link="libnm-nm-dbus-interface.html#NM-STATE-ASLEEP:CAPS"/>
+ <keyword type="constant" name="NM_STATE_DISCONNECTED" link="libnm-nm-dbus-interface.html#NM-STATE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_STATE_DISCONNECTING" link="libnm-nm-dbus-interface.html#NM-STATE-DISCONNECTING:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTING" link="libnm-nm-dbus-interface.html#NM-STATE-CONNECTING:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTED_LOCAL" link="libnm-nm-dbus-interface.html#NM-STATE-CONNECTED-LOCAL:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTED_SITE" link="libnm-nm-dbus-interface.html#NM-STATE-CONNECTED-SITE:CAPS"/>
+ <keyword type="constant" name="NM_STATE_CONNECTED_GLOBAL" link="libnm-nm-dbus-interface.html#NM-STATE-CONNECTED-GLOBAL:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-CONNECTIVITY-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_NONE" link="libnm-nm-dbus-interface.html#NM-CONNECTIVITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_PORTAL" link="libnm-nm-dbus-interface.html#NM-CONNECTIVITY-PORTAL:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_LIMITED" link="libnm-nm-dbus-interface.html#NM-CONNECTIVITY-LIMITED:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTIVITY_FULL" link="libnm-nm-dbus-interface.html#NM-CONNECTIVITY-FULL:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_ETHERNET" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-ETHERNET:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_WIFI" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-WIFI:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_UNUSED1" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-UNUSED1:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_UNUSED2" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-UNUSED2:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_BT" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-BT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_OLPC_MESH" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-OLPC-MESH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_WIMAX" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-WIMAX:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_MODEM" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-MODEM:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_INFINIBAND" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-INFINIBAND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_BOND" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-BOND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_VLAN" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-VLAN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_ADSL" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-ADSL:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_BRIDGE" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-BRIDGE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_GENERIC" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-GENERIC:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_TYPE_TEAM" link="libnm-nm-dbus-interface.html#NM-DEVICE-TYPE-TEAM:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_NONE" link="libnm-nm-dbus-interface.html#NM-DEVICE-CAP-NONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_NM_SUPPORTED" link="libnm-nm-dbus-interface.html#NM-DEVICE-CAP-NM-SUPPORTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_CARRIER_DETECT" link="libnm-nm-dbus-interface.html#NM-DEVICE-CAP-CARRIER-DETECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_CAP_IS_SOFTWARE" link="libnm-nm-dbus-interface.html#NM-DEVICE-CAP-IS-SOFTWARE:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_NONE" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-NONE:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_WEP40" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP40:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_WEP104" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-WEP104:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_TKIP" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-TKIP:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_CIPHER_CCMP" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-CIPHER-CCMP:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_WPA" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-WPA:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_RSN" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-RSN:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_AP" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-AP:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_ADHOC" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-ADHOC:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_FREQ_VALID" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-FREQ-VALID:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_FREQ_2GHZ" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-FREQ-2GHZ:CAPS"/>
+ <keyword type="constant" name="NM_WIFI_DEVICE_CAP_FREQ_5GHZ" link="libnm-nm-dbus-interface.html#NM-WIFI-DEVICE-CAP-FREQ-5GHZ:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_FLAGS_NONE" link="libnm-nm-dbus-interface.html#NM-802-11-AP-FLAGS-NONE:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_FLAGS_PRIVACY" link="libnm-nm-dbus-interface.html#NM-802-11-AP-FLAGS-PRIVACY:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_NONE" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-NONE:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_WEP40" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-WEP40:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_WEP104" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-WEP104:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_TKIP" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-TKIP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_PAIR_CCMP" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-PAIR-CCMP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_WEP40" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-WEP40:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_WEP104" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-WEP104:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_TKIP" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-TKIP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_GROUP_CCMP" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-GROUP-CCMP:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_KEY_MGMT_PSK" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-KEY-MGMT-PSK:CAPS"/>
+ <keyword type="constant" name="NM_802_11_AP_SEC_KEY_MGMT_802_1X" link="libnm-nm-dbus-interface.html#NM-802-11-AP-SEC-KEY-MGMT-802-1X:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-802-11-MODE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_ADHOC" link="libnm-nm-dbus-interface.html#NM-802-11-MODE-ADHOC:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_INFRA" link="libnm-nm-dbus-interface.html#NM-802-11-MODE-INFRA:CAPS"/>
+ <keyword type="constant" name="NM_802_11_MODE_AP" link="libnm-nm-dbus-interface.html#NM-802-11-MODE-AP:CAPS"/>
+ <keyword type="constant" name="NM_BT_CAPABILITY_NONE" link="libnm-nm-dbus-interface.html#NM-BT-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_BT_CAPABILITY_DUN" link="libnm-nm-dbus-interface.html#NM-BT-CAPABILITY-DUN:CAPS"/>
+ <keyword type="constant" name="NM_BT_CAPABILITY_NAP" link="libnm-nm-dbus-interface.html#NM-BT-CAPABILITY-NAP:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_NONE" link="libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_POTS" link="libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-POTS:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO" link="libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-CDMA-EVDO:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS" link="libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-GSM-UMTS:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_MODEM_CAPABILITY_LTE" link="libnm-nm-dbus-interface.html#NM-DEVICE-MODEM-CAPABILITY-LTE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_UNMANAGED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-UNMANAGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_UNAVAILABLE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_DISCONNECTED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_PREPARE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-PREPARE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_CONFIG" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-CONFIG:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_NEED_AUTH" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-NEED-AUTH:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_IP_CONFIG" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-IP-CONFIG:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_IP_CHECK" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-IP-CHECK:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_SECONDARIES" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-SECONDARIES:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_ACTIVATED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-ACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_DEACTIVATING" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-DEACTIVATING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NONE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NOW_MANAGED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NOW-MANAGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NOW_UNMANAGED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NOW-UNMANAGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CONFIG_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CONFIG-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-IP-CONFIG-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-IP-CONFIG-EXPIRED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NO_SECRETS" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-DISCONNECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-CONFIG-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PPP_START_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PPP-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PPP_DISCONNECT" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PPP-DISCONNECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PPP_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PPP-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DHCP_START_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DHCP-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DHCP_ERROR" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DHCP-ERROR:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DHCP_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DHCP-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SHARED_START_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SHARED-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SHARED_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SHARED-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-AUTOIP-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_AUTOIP_ERROR" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-AUTOIP-ERROR:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_AUTOIP_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-AUTOIP-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_BUSY" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-BUSY:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-NO-DIAL-TONE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-NO-CARRIER:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-DIAL-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-INIT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_APN_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-APN-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-NOT-SEARCHING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-DENIED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-REGISTRATION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-PIN-CHECK-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_FIRMWARE_MISSING" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-FIRMWARE-MISSING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_REMOVED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SLEEPING" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SLEEPING:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CONNECTION_REMOVED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CONNECTION-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_USER_REQUESTED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-USER-REQUESTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CARRIER" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CARRIER:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-CONNECTION-ASSUMED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SUPPLICANT-AVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_BT_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-BT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-NOT-INSERTED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-PIN-REQUIRED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-PUK-REQUIRED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_GSM_SIM_WRONG" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-GSM-SIM-WRONG:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_INFINIBAND_MODE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-INFINIBAND-MODE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DEPENDENCY-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_BR2684_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-BR2684-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-MANAGER-UNAVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SSID_NOT_FOUND" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SSID-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SECONDARY-CONNECTION-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-DCB-FCOE-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-TEAMD-CONTROL-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_FAILED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_MODEM_AVAILABLE" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-MODEM-AVAILABLE:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-SIM-PIN-INCORRECT:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_NEW_ACTIVATION" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-NEW-ACTIVATION:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PARENT_CHANGED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PARENT-CHANGED:CAPS"/>
+ <keyword type="constant" name="NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED" link="libnm-nm-dbus-interface.html#NM-DEVICE-STATE-REASON-PARENT-MANAGED-CHANGED:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_UNKNOWN" link="libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_ACTIVATING" link="libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATING:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_ACTIVATED" link="libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-ACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_DEACTIVATING" link="libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATING:CAPS"/>
+ <keyword type="constant" name="NM_ACTIVE_CONNECTION_STATE_DEACTIVATED" link="libnm-nm-dbus-interface.html#NM-ACTIVE-CONNECTION-STATE-DEACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-ALLOW-INTERACTION:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-REQUEST-NEW:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-USER-REQUESTED:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-ONLY-SYSTEM:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-GET-SECRETS-FLAG-NO-ERRORS:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_CAPABILITY_NONE" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_CAPABILITY_VPN_HINTS" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-CAPABILITY-VPN-HINTS:CAPS"/>
+ <keyword type="constant" name="NM_SECRET_AGENT_CAPABILITY_LAST" link="libnm-nm-dbus-interface.html#NM-SECRET-AGENT-CAPABILITY-LAST:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_SERIALIZE_ALL" link="libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-ALL:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_SERIALIZE_NO_SECRETS" link="libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_CONNECTION_SERIALIZE_ONLY_SECRETS" link="libnm-NMConnection.html#NM-CONNECTION-SERIALIZE-ONLY-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_NONE" link="NMSetting.html#NM-SETTING-SECRET-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_AGENT_OWNED" link="NMSetting.html#NM-SETTING-SECRET-FLAG-AGENT-OWNED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_NOT_SAVED" link="NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-SAVED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SECRET_FLAG_NOT_REQUIRED" link="NMSetting.html#NM-SETTING-SECRET-FLAG-NOT-REQUIRED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_EXACT" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-EXACT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_FUZZY" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-FUZZY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_ID" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-ID:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-AGENT-OWNED-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-NOT-SAVED-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-WITH-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-DIFF-RESULT-NO-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_COMPARE_FLAG_IGNORE_TIMESTAMP" link="NMSetting.html#NM-SETTING-COMPARE-FLAG-IGNORE-TIMESTAMP:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_UNKNOWN" link="NMSetting.html#NM-SETTING-DIFF-RESULT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_A" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_B" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_A_DEFAULT" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-A-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DIFF_RESULT_IN_B_DEFAULT" link="NMSetting.html#NM-SETTING-DIFF-RESULT-IN-B-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT" link="NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-DEFAULT:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO" link="NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-NO:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES" link="NMSettingConnection.html#NM-SETTING-CONNECTION-AUTOCONNECT-SLAVES-YES:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_UNKNOWN" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_X509" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-X509:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_RAW_KEY" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-RAW-KEY:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_FORMAT_PKCS12" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-FORMAT-PKCS12:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_SCHEME_UNKNOWN" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_SCHEME_BLOB" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-BLOB:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_802_1X_CK_SCHEME_PATH" link="NMSetting8021x.html#NM-SETTING-802-1X-CK-SCHEME-PATH:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_NONE" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_ENABLE" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ENABLE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_ADVERTISE" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-ADVERTISE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_DCB_FLAG_WILLING" link="NMSettingDcb.html#NM-SETTING-DCB-FLAG-WILLING:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-DISABLED:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-PUBLIC-ADDR:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR" link="NMSettingIP6Config.html#NM-SETTING-IP6-CONFIG-PRIVACY-PREFER-TEMP-ADDR:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_PARITY_NONE" link="NMSettingSerial.html#NM-SETTING-SERIAL-PARITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_PARITY_EVEN" link="NMSettingSerial.html#NM-SETTING-SERIAL-PARITY-EVEN:CAPS"/>
+ <keyword type="constant" name="NM_SETTING_SERIAL_PARITY_ODD" link="NMSettingSerial.html#NM-SETTING-SERIAL-PARITY-ODD:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_INGRESS_MAP" link="NMSettingVlan.html#NM-VLAN-INGRESS-MAP:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_EGRESS_MAP" link="NMSettingVlan.html#NM-VLAN-EGRESS-MAP:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_FLAG_REORDER_HEADERS" link="NMSettingVlan.html#NM-VLAN-FLAG-REORDER-HEADERS:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_FLAG_GVRP" link="NMSettingVlan.html#NM-VLAN-FLAG-GVRP:CAPS"/>
+ <keyword type="constant" name="NM_VLAN_FLAG_LOOSE_BINDING" link="NMSettingVlan.html#NM-VLAN-FLAG-LOOSE-BINDING:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_UNKNOWN" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_KEY" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-KEY:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_PASSPHRASE" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-PASSPHRASE:CAPS"/>
+ <keyword type="constant" name="NM_WEP_KEY_TYPE_LAST" link="NMSettingWirelessSecurity.html#NM-WEP-KEY-TYPE-LAST:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_HOME" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-HOME:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_PARTNER" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-PARTNER:CAPS"/>
+ <keyword type="constant" name="NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER" link="NMWimaxNsp.html#NM-WIMAX-NSP-NETWORK-TYPE-ROAMING-PARTNER:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_INVALID" link="libnm-nm-utils.html#NMU-SEC-INVALID:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_NONE" link="libnm-nm-utils.html#NMU-SEC-NONE:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_STATIC_WEP" link="libnm-nm-utils.html#NMU-SEC-STATIC-WEP:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_LEAP" link="libnm-nm-utils.html#NMU-SEC-LEAP:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_DYNAMIC_WEP" link="libnm-nm-utils.html#NMU-SEC-DYNAMIC-WEP:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA_PSK" link="libnm-nm-utils.html#NMU-SEC-WPA-PSK:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA_ENTERPRISE" link="libnm-nm-utils.html#NMU-SEC-WPA-ENTERPRISE:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA2_PSK" link="libnm-nm-utils.html#NMU-SEC-WPA2-PSK:CAPS"/>
+ <keyword type="constant" name="NMU_SEC_WPA2_ENTERPRISE" link="libnm-nm-utils.html#NMU-SEC-WPA2-ENTERPRISE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_UNKNOWN" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_INIT" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-INIT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_SHUTDOWN" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-SHUTDOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STARTING" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STARTING:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STARTED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STARTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STOPPING" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STOPPING:CAPS"/>
+ <keyword type="constant" name="NM_VPN_SERVICE_STATE_STOPPED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-SERVICE-STATE-STOPPED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_UNKNOWN" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_PREPARE" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-PREPARE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_NEED_AUTH" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-NEED-AUTH:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_CONNECT" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-CONNECT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_IP_CONFIG_GET" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-IP-CONFIG-GET:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_ACTIVATED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-ACTIVATED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_FAILED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_DISCONNECTED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_UNKNOWN" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_NONE" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-NONE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-USER-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-DEVICE-DISCONNECTED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-STOPPED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-IP-CONFIG-INVALID:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-CONNECT-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-TIMEOUT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-SERVICE-START-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-NO-SECRETS:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-LOGIN-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-CONNECTION-STATE-REASON-CONNECTION-REMOVED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-FAILURE-LOGIN-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-FAILURE-CONNECT-FAILED:CAPS"/>
+ <keyword type="constant" name="NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG" link="libnm-nm-vpn-dbus-interface.html#NM-VPN-PLUGIN-FAILURE-BAD-IP-CONFIG:CAPS"/>
+ <keyword type="constant" name="NM_VPN_EDITOR_PLUGIN_CAPABILITY_NONE" link="NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-NONE:CAPS"/>
+ <keyword type="constant" name="NM_VPN_EDITOR_PLUGIN_CAPABILITY_IMPORT" link="NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-IMPORT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_EDITOR_PLUGIN_CAPABILITY_EXPORT" link="NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-EXPORT:CAPS"/>
+ <keyword type="constant" name="NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6" link="NMVpnEditor.html#NM-VPN-EDITOR-PLUGIN-CAPABILITY-IPV6:CAPS"/>
</functions>
</book>
diff --git a/docs/libnm/html/object-tree.html b/docs/libnm/html/object-tree.html
index 514bd2b0d..424f0762f 100644
--- a/docs/libnm/html/object-tree.html
+++ b/docs/libnm/html/object-tree.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Object Hierarchy</title>
+<title>Object Hierarchy: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="NMVpnEditor.html" title="NMVpnEditor">
<link rel="next" href="api-index-full.html" title="API Index">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -115,6 +115,7 @@
<span class="lineart">├──</span> <a class="link" href="NMSetting8021x.html#NMSetting8021xCKFormat" title="enum NMSetting8021xCKFormat">NMSetting8021xCKFormat</a>
<span class="lineart">├──</span> <a class="link" href="NMSetting8021x.html#NMSetting8021xCKScheme" title="enum NMSetting8021xCKScheme">NMSetting8021xCKScheme</a>
<span class="lineart">├──</span> <a class="link" href="NMSetting.html#NMSettingCompareFlags" title="enum NMSettingCompareFlags">NMSettingCompareFlags</a>
+ <span class="lineart">├──</span> <a class="link" href="NMSettingConnection.html#NMSettingConnectionAutoconnectSlaves" title="enum NMSettingConnectionAutoconnectSlaves">NMSettingConnectionAutoconnectSlaves</a>
<span class="lineart">├──</span> <a class="link" href="NMSetting.html#NMSettingDiffResult" title="enum NMSettingDiffResult">NMSettingDiffResult</a>
<span class="lineart">├──</span> <a class="link" href="NMSettingIP6Config.html#NMSettingIP6ConfigPrivacy" title="enum NMSettingIP6ConfigPrivacy">NMSettingIP6ConfigPrivacy</a>
<span class="lineart">├──</span> <a class="link" href="NMSettingSerial.html#NMSettingSerialParity" title="enum NMSettingSerialParity">NMSettingSerialParity</a>
@@ -133,7 +134,6 @@
</pre>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/ref-overview.html b/docs/libnm/html/ref-overview.html
index 17883712e..8d5ab916c 100644
--- a/docs/libnm/html/ref-overview.html
+++ b/docs/libnm/html/ref-overview.html
@@ -2,13 +2,13 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>libnm Reference Manual: Overview</title>
+<title>Overview: libnm Reference Manual</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="libnm Reference Manual">
<link rel="up" href="index.html" title="libnm Reference Manual">
<link rel="prev" href="index.html" title="libnm Reference Manual">
<link rel="next" href="ch02.html" title="Client Object API Reference">
-<meta name="generator" content="GTK-Doc V1.21 (XML mode)">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -42,7 +42,6 @@
</p>
</div>
<div class="footer">
-<hr>
- Generated by GTK-Doc V1.21</div>
+<hr>Generated by GTK-Doc V1.24</div>
</body>
</html> \ No newline at end of file
diff --git a/docs/libnm/html/style.css b/docs/libnm/html/style.css
index c141ddd29..367542097 100644
--- a/docs/libnm/html/style.css
+++ b/docs/libnm/html/style.css
@@ -60,7 +60,7 @@ a:hover
div.informaltable table
{
border-collapse: separate;
- border-spacing: 1em 0.5em;
+ border-spacing: 1em 0.3em;
border: none;
}
@@ -148,6 +148,8 @@ div.table table th
h4
{
color: #555753;
+ margin-top: 1em;
+ margin-bottom: 1em;
}
hr
@@ -166,17 +168,16 @@ dl.toc dt
padding-bottom: 0.25em;
}
-dl.toc > dd > dl > dt
+dl.toc > dt
{
padding-top: 0.25em;
padding-bottom: 0.25em;
+ font-weight: bold;
}
-dl.toc > dt
+dl.toc > dl
{
- padding-top: 1em;
padding-bottom: 0.5em;
- font-weight: bold;
}
.parameter
@@ -346,7 +347,9 @@ acronym,abbr
}
@media screen {
- sup a.footnote
+ /* these have a <sup> as a first child, but since there are no parent selectors
+ * we can't use that. */
+ a.footnote
{
position: relative;
top: 0em ! important;
diff --git a/docs/libnm/libnm-sections.txt b/docs/libnm/libnm-sections.txt
index 947fea62d..ed0cefa8c 100644
--- a/docs/libnm/libnm-sections.txt
+++ b/docs/libnm/libnm-sections.txt
@@ -276,6 +276,7 @@ NM_TYPE_SETTINGS_ERROR
NM_TYPE_SETTING_802_1X_CK_FORMAT
NM_TYPE_SETTING_802_1X_CK_SCHEME
NM_TYPE_SETTING_COMPARE_FLAGS
+NM_TYPE_SETTING_CONNECTION_AUTOCONNECT_SLAVES
NM_TYPE_SETTING_DCB_FLAGS
NM_TYPE_SETTING_DIFF_RESULT
NM_TYPE_SETTING_IP6_CONFIG_PRIVACY
@@ -315,6 +316,7 @@ nm_secret_agent_get_secrets_flags_get_type
nm_setting_802_1x_ck_format_get_type
nm_setting_802_1x_ck_scheme_get_type
nm_setting_compare_flags_get_type
+nm_setting_connection_autoconnect_slaves_get_type
nm_setting_dcb_flags_get_type
nm_setting_diff_result_get_type
nm_setting_ip6_config_privacy_get_type
@@ -852,6 +854,35 @@ nm_ip_config_get_type
</SECTION>
<SECTION>
+<FILE>nm-keyfile-internal</FILE>
+NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB
+NM_KEYFILE_CERT_SCHEME_PREFIX_PATH
+nm_keyfile_detect_unqualified_path_scheme
+NMKeyfileReadType
+NMKeyfileReadHandler
+NMKeyfileWarnSeverity
+NMKeyfileReadTypeDataWarn
+nm_keyfile_read
+NMKeyfileWriteType
+NMKeyfileWriteHandler
+NMKeyfileWriteTypeDataCert
+nm_keyfile_write
+nm_keyfile_plugin_kf_get_string
+nm_keyfile_plugin_kf_set_string
+</SECTION>
+
+<SECTION>
+<FILE>nm-keyfile-utils</FILE>
+VPN_SECRETS_GROUP
+nm_keyfile_plugin_get_alias_for_setting_name
+nm_keyfile_plugin_get_setting_name_for_alias
+DEFINE_KF_LIST_WRAPPER_PROTO
+DEFINE_KF_WRAPPER_PROTO
+nm_keyfile_plugin_kf_get_keys
+nm_keyfile_plugin_kf_has_key
+</SECTION>
+
+<SECTION>
<FILE>nm-object</FILE>
<TITLE>NMObject</TITLE>
NM_OBJECT_PATH
@@ -972,6 +1003,7 @@ nm_setting_get_type
<SECTION>
<FILE>nm-setting-8021x</FILE>
<TITLE>NMSetting8021x</TITLE>
+NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH
NMSetting8021xCKFormat
NMSetting8021xCKScheme
NM_SETTING_802_1X_SETTING_NAME
@@ -1285,8 +1317,10 @@ NM_SETTING_CONNECTION_PERMISSIONS
NM_SETTING_CONNECTION_ZONE
NM_SETTING_CONNECTION_MASTER
NM_SETTING_CONNECTION_SLAVE_TYPE
+NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES
NM_SETTING_CONNECTION_SECONDARIES
NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT
+NMSettingConnectionAutoconnectSlaves
NMSettingConnection
nm_setting_connection_new
nm_setting_connection_get_id
@@ -1307,6 +1341,7 @@ nm_setting_connection_remove_permission_by_value
nm_setting_connection_get_master
nm_setting_connection_is_slave_type
nm_setting_connection_get_slave_type
+nm_setting_connection_get_autoconnect_slaves
nm_setting_connection_get_num_secondaries
nm_setting_connection_get_secondary
nm_setting_connection_add_secondary
@@ -2130,6 +2165,8 @@ NM_ENCODE_VERSION
NM_VERSION_0_9_8
NM_VERSION_0_9_10
NM_VERSION_1_0
+NM_VERSION_1_0_2
+NM_VERSION_1_0_4
NM_VERSION_CUR_STABLE
NM_VERSION_NEXT_STABLE
NM_VERSION_MIN_REQUIRED
@@ -2140,6 +2177,7 @@ NM_DEPRECATED_IN_1_0
NM_DEPRECATED_IN_1_0_FOR
NM_AVAILABLE_IN_0_9_10
NM_AVAILABLE_IN_1_0
+NM_AVAILABLE_IN_1_0_4
</SECTION>
<SECTION>
diff --git a/docs/libnm/libnm.types b/docs/libnm/libnm.types
index c7169090b..2742a215a 100644
--- a/docs/libnm/libnm.types
+++ b/docs/libnm/libnm.types
@@ -57,6 +57,7 @@ nm_setting_bridge_get_type
nm_setting_bridge_port_get_type
nm_setting_cdma_get_type
nm_setting_compare_flags_get_type
+nm_setting_connection_autoconnect_slaves_get_type
nm_setting_connection_get_type
nm_setting_dcb_flags_get_type
nm_setting_dcb_get_type
diff --git a/docs/libnm/tmpl/libnm-unused.sgml b/docs/libnm/tmpl/libnm-unused.sgml
deleted file mode 100644
index e69de29bb..000000000
--- a/docs/libnm/tmpl/libnm-unused.sgml
+++ /dev/null
diff --git a/docs/libnm/tmpl/nm-access-point.sgml b/docs/libnm/tmpl/nm-access-point.sgml
deleted file mode 100644
index 8a5cd28cd..000000000
--- a/docs/libnm/tmpl/nm-access-point.sgml
+++ /dev/null
@@ -1,195 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMAccessPoint
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_WPA_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_RSN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_SSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_BSSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_FREQUENCY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_MAX_BITRATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_STRENGTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACCESS_POINT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_access_point_get_flags ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_wpa_flags ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_rsn_flags ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_ssid ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_bssid ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_frequency ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_mode ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_max_bitrate ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_get_strength ##### -->
-<para>
-
-</para>
-
-@ap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_filter_connections ##### -->
-<para>
-
-</para>
-
-@ap:
-@connections:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_access_point_connection_valid ##### -->
-<para>
-
-</para>
-
-@ap:
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-active-connection.sgml b/docs/libnm/tmpl/nm-active-connection.sgml
deleted file mode 100644
index 77f7be1a9..000000000
--- a/docs/libnm/tmpl/nm-active-connection.sgml
+++ /dev/null
@@ -1,264 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMActiveConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_UUID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DEVICES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DHCP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DEFAULT6 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_IP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_DHCP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_VPN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_ACTIVE_CONNECTION_MASTER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_active_connection_get_connection ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_id ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_uuid ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_connection_type ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_specific_object_path ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_devices ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_state ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_master ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_default ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_ip4_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_dhcp4_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_default6 ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_ip6_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_dhcp6_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_active_connection_get_vpn ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-client.sgml b/docs/libnm/tmpl/nm-client.sgml
deleted file mode 100644
index 123aba73e..000000000
--- a/docs/libnm/tmpl/nm-client.sgml
+++ /dev/null
@@ -1,798 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMClient
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_CLIENT_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_STARTUP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_NM_RUNNING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_NETWORKING_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIRELESS_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIRELESS_HARDWARE_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WWAN_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WWAN_HARDWARE_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIMAX_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_WIMAX_HARDWARE_ENABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_ACTIVE_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_CONNECTIVITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_PRIMARY_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_ACTIVATING_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_DEVICES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_CAN_MODIFY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_DEVICE_ADDED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_DEVICE_REMOVED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_PERMISSION_CHANGED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_CONNECTION_ADDED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CLIENT_CONNECTION_REMOVED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMClientPermission ##### -->
-<para>
-
-</para>
-
-@NM_CLIENT_PERMISSION_NONE:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN:
-@NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX:
-@NM_CLIENT_PERMISSION_SLEEP_WAKE:
-@NM_CLIENT_PERMISSION_NETWORK_CONTROL:
-@NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED:
-@NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN:
-@NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM:
-@NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN:
-@NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME:
-@NM_CLIENT_PERMISSION_LAST:
-
-<!-- ##### ENUM NMClientPermissionResult ##### -->
-<para>
-
-</para>
-
-@NM_CLIENT_PERMISSION_RESULT_UNKNOWN:
-@NM_CLIENT_PERMISSION_RESULT_YES:
-@NM_CLIENT_PERMISSION_RESULT_AUTH:
-@NM_CLIENT_PERMISSION_RESULT_NO:
-
-<!-- ##### ENUM NMClientError ##### -->
-<para>
-
-</para>
-
-@NM_CLIENT_ERROR_FAILED:
-@NM_CLIENT_ERROR_MANAGER_NOT_RUNNING:
-@NM_CLIENT_ERROR_OBJECT_CREATION_FAILED:
-
-<!-- ##### MACRO NM_CLIENT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_client_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_new ##### -->
-<para>
-
-</para>
-
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_new_async ##### -->
-<para>
-
-</para>
-
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_new_finish ##### -->
-<para>
-
-</para>
-
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_version ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_state ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_startup ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_nm_running ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_networking_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_networking_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wireless_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wireless_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wireless_hardware_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wwan_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wwan_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wwan_hardware_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wimax_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_wimax_set_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_client_wimax_hardware_get_enabled ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_logging ##### -->
-<para>
-
-</para>
-
-@client:
-@level:
-@domains:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_set_logging ##### -->
-<para>
-
-</para>
-
-@client:
-@level:
-@domains:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_permission_result ##### -->
-<para>
-
-</para>
-
-@client:
-@permission:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_connectivity ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_check_connectivity ##### -->
-<para>
-
-</para>
-
-@client:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_check_connectivity_async ##### -->
-<para>
-
-</para>
-
-@client:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_check_connectivity_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_save_hostname ##### -->
-<para>
-
-</para>
-
-@client:
-@hostname:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_save_hostname_async ##### -->
-<para>
-
-</para>
-
-@client:
-@hostname:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_save_hostname_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_devices ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_device_by_path ##### -->
-<para>
-
-</para>
-
-@client:
-@object_path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_device_by_iface ##### -->
-<para>
-
-</para>
-
-@client:
-@iface:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_active_connections ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_primary_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_activating_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_activate_connection_async ##### -->
-<para>
-
-</para>
-
-@client:
-@connection:
-@device:
-@specific_object:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_activate_connection_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_add_and_activate_connection_async ##### -->
-<para>
-
-</para>
-
-@client:
-@partial:
-@device:
-@specific_object:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_add_and_activate_connection_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_deactivate_connection ##### -->
-<para>
-
-</para>
-
-@client:
-@active:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_deactivate_connection_async ##### -->
-<para>
-
-</para>
-
-@client:
-@active:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_deactivate_connection_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_connections ##### -->
-<para>
-
-</para>
-
-@client:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_connection_by_id ##### -->
-<para>
-
-</para>
-
-@client:
-@id:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_connection_by_path ##### -->
-<para>
-
-</para>
-
-@client:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_get_connection_by_uuid ##### -->
-<para>
-
-</para>
-
-@client:
-@uuid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_add_connection_async ##### -->
-<para>
-
-</para>
-
-@client:
-@connection:
-@save_to_disk:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_add_connection_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_load_connections ##### -->
-<para>
-
-</para>
-
-@client:
-@filenames:
-@failures:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_load_connections_async ##### -->
-<para>
-
-</para>
-
-@client:
-@filenames:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_load_connections_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@failures:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_reload_connections ##### -->
-<para>
-
-</para>
-
-@client:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_client_reload_connections_async ##### -->
-<para>
-
-</para>
-
-@client:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_client_reload_connections_finish ##### -->
-<para>
-
-</para>
-
-@client:
-@result:
-@error:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-connection.sgml b/docs/libnm/tmpl/nm-connection.sgml
deleted file mode 100644
index 804f0cb24..000000000
--- a/docs/libnm/tmpl/nm-connection.sgml
+++ /dev/null
@@ -1,573 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_CONNECTION_SECRETS_UPDATED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_SECRETS_CLEARED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_CHANGED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### STRUCT NMConnectionInterface ##### -->
-<para>
-
-</para>
-
-@parent:
-@secrets_updated:
-@secrets_cleared:
-@changed:
-
-<!-- ##### FUNCTION nm_connection_add_setting ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting:
-
-
-<!-- ##### FUNCTION nm_connection_remove_setting ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_type:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_by_name ##### -->
-<para>
-
-</para>
-
-@connection:
-@name:
-@Returns:
-
-
-<!-- ##### MACRO NM_VARIANT_TYPE_SETTING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMConnectionSerializationFlags ##### -->
-<para>
-
-</para>
-
-@NM_CONNECTION_SERIALIZE_ALL:
-@NM_CONNECTION_SERIALIZE_NO_SECRETS:
-@NM_CONNECTION_SERIALIZE_ONLY_SECRETS:
-
-<!-- ##### FUNCTION nm_connection_to_dbus ##### -->
-<para>
-
-</para>
-
-@connection:
-@flags:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_replace_settings ##### -->
-<para>
-
-</para>
-
-@connection:
-@new_settings:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_replace_settings_from_connection ##### -->
-<para>
-
-</para>
-
-@connection:
-@new_connection:
-
-
-<!-- ##### FUNCTION nm_connection_clear_settings ##### -->
-<para>
-
-</para>
-
-@connection:
-
-
-<!-- ##### FUNCTION nm_connection_compare ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_diff ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@out_settings:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_verify ##### -->
-<para>
-
-</para>
-
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_normalize ##### -->
-<para>
-
-</para>
-
-@connection:
-@parameters:
-@modified:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_need_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-@hints:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_clear_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-
-
-<!-- ##### FUNCTION nm_connection_clear_secrets_with_flags ##### -->
-<para>
-
-</para>
-
-@connection:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_connection_update_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_name:
-@secrets:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_set_path ##### -->
-<para>
-
-</para>
-
-@connection:
-@path:
-
-
-<!-- ##### FUNCTION nm_connection_get_path ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_interface_name ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_is_type ##### -->
-<para>
-
-</para>
-
-@connection:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_for_each_setting_value ##### -->
-<para>
-
-</para>
-
-@connection:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_connection_dump ##### -->
-<para>
-
-</para>
-
-@connection:
-
-
-<!-- ##### FUNCTION nm_connection_get_uuid ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_id ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_connection_type ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_is_virtual ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_virtual_device_description ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_802_1x ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bluetooth ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bond ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_team ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_team_port ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bridge ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_bridge_port ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_cdma ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_connection ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_dcb ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_generic ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_gsm ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_infiniband ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_ip4_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_ip6_config ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_olpc_mesh ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_ppp ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_pppoe ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_serial ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_vpn ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wimax ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_adsl ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wired ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wireless ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_wireless_security ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_connection_get_setting_vlan ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-core-enum-types.sgml b/docs/libnm/tmpl/nm-core-enum-types.sgml
deleted file mode 100644
index 68f14ec30..000000000
--- a/docs/libnm/tmpl/nm-core-enum-types.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-core-enum-types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/docs/libnm/tmpl/nm-dbus-interface.sgml b/docs/libnm/tmpl/nm-dbus-interface.sgml
deleted file mode 100644
index 127f117da..000000000
--- a/docs/libnm/tmpl/nm-dbus-interface.sgml
+++ /dev/null
@@ -1,552 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-dbus-interface
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DBUS_SERVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_WIRED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_ADSL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_WIRELESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_BLUETOOTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_OLPC_MESH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_ACCESS_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_ACCESS_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_MODEM ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_WIMAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_WIMAX_NSP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_WIMAX_NSP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_ACTIVE_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DHCP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_IP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DHCP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_INFINIBAND ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_BOND ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_TEAM ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_VLAN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_BRIDGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_GENERIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_VETH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_TUN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_MACVLAN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_VXLAN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_DEVICE_GRE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_SETTINGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_SETTINGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_SETTINGS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_SETTINGS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_SETTINGS_CONNECTION_SECRETS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_AGENT_MANAGER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_AGENT_MANAGER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_SECRET_AGENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_SECRET_AGENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMState ##### -->
-<para>
-
-</para>
-
-@NM_STATE_UNKNOWN:
-@NM_STATE_ASLEEP:
-@NM_STATE_DISCONNECTED:
-@NM_STATE_DISCONNECTING:
-@NM_STATE_CONNECTING:
-@NM_STATE_CONNECTED_LOCAL:
-@NM_STATE_CONNECTED_SITE:
-@NM_STATE_CONNECTED_GLOBAL:
-
-<!-- ##### ENUM NMConnectivityState ##### -->
-<para>
-
-</para>
-
-@NM_CONNECTIVITY_UNKNOWN:
-@NM_CONNECTIVITY_NONE:
-@NM_CONNECTIVITY_PORTAL:
-@NM_CONNECTIVITY_LIMITED:
-@NM_CONNECTIVITY_FULL:
-
-<!-- ##### ENUM NMDeviceType ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_TYPE_UNKNOWN:
-@NM_DEVICE_TYPE_ETHERNET:
-@NM_DEVICE_TYPE_WIFI:
-@NM_DEVICE_TYPE_UNUSED1:
-@NM_DEVICE_TYPE_UNUSED2:
-@NM_DEVICE_TYPE_BT:
-@NM_DEVICE_TYPE_OLPC_MESH:
-@NM_DEVICE_TYPE_WIMAX:
-@NM_DEVICE_TYPE_MODEM:
-@NM_DEVICE_TYPE_INFINIBAND:
-@NM_DEVICE_TYPE_BOND:
-@NM_DEVICE_TYPE_VLAN:
-@NM_DEVICE_TYPE_ADSL:
-@NM_DEVICE_TYPE_BRIDGE:
-@NM_DEVICE_TYPE_GENERIC:
-@NM_DEVICE_TYPE_TEAM:
-
-<!-- ##### ENUM NMDeviceCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_CAP_NONE:
-@NM_DEVICE_CAP_NM_SUPPORTED:
-@NM_DEVICE_CAP_CARRIER_DETECT:
-@NM_DEVICE_CAP_IS_SOFTWARE:
-
-<!-- ##### ENUM NMDeviceWifiCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_WIFI_DEVICE_CAP_NONE:
-@NM_WIFI_DEVICE_CAP_CIPHER_WEP40:
-@NM_WIFI_DEVICE_CAP_CIPHER_WEP104:
-@NM_WIFI_DEVICE_CAP_CIPHER_TKIP:
-@NM_WIFI_DEVICE_CAP_CIPHER_CCMP:
-@NM_WIFI_DEVICE_CAP_WPA:
-@NM_WIFI_DEVICE_CAP_RSN:
-@NM_WIFI_DEVICE_CAP_AP:
-@NM_WIFI_DEVICE_CAP_ADHOC:
-@NM_WIFI_DEVICE_CAP_FREQ_VALID:
-@NM_WIFI_DEVICE_CAP_FREQ_2GHZ:
-@NM_WIFI_DEVICE_CAP_FREQ_5GHZ:
-
-<!-- ##### ENUM NM80211ApFlags ##### -->
-<para>
-
-</para>
-
-@NM_802_11_AP_FLAGS_NONE:
-@NM_802_11_AP_FLAGS_PRIVACY:
-
-<!-- ##### ENUM NM80211ApSecurityFlags ##### -->
-<para>
-
-</para>
-
-@NM_802_11_AP_SEC_NONE:
-@NM_802_11_AP_SEC_PAIR_WEP40:
-@NM_802_11_AP_SEC_PAIR_WEP104:
-@NM_802_11_AP_SEC_PAIR_TKIP:
-@NM_802_11_AP_SEC_PAIR_CCMP:
-@NM_802_11_AP_SEC_GROUP_WEP40:
-@NM_802_11_AP_SEC_GROUP_WEP104:
-@NM_802_11_AP_SEC_GROUP_TKIP:
-@NM_802_11_AP_SEC_GROUP_CCMP:
-@NM_802_11_AP_SEC_KEY_MGMT_PSK:
-@NM_802_11_AP_SEC_KEY_MGMT_802_1X:
-
-<!-- ##### ENUM NM80211Mode ##### -->
-<para>
-
-</para>
-
-@NM_802_11_MODE_UNKNOWN:
-@NM_802_11_MODE_ADHOC:
-@NM_802_11_MODE_INFRA:
-@NM_802_11_MODE_AP:
-
-<!-- ##### ENUM NMBluetoothCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_BT_CAPABILITY_NONE:
-@NM_BT_CAPABILITY_DUN:
-@NM_BT_CAPABILITY_NAP:
-
-<!-- ##### ENUM NMDeviceModemCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_MODEM_CAPABILITY_NONE:
-@NM_DEVICE_MODEM_CAPABILITY_POTS:
-@NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO:
-@NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS:
-@NM_DEVICE_MODEM_CAPABILITY_LTE:
-
-<!-- ##### ENUM NMDeviceState ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_STATE_UNKNOWN:
-@NM_DEVICE_STATE_UNMANAGED:
-@NM_DEVICE_STATE_UNAVAILABLE:
-@NM_DEVICE_STATE_DISCONNECTED:
-@NM_DEVICE_STATE_PREPARE:
-@NM_DEVICE_STATE_CONFIG:
-@NM_DEVICE_STATE_NEED_AUTH:
-@NM_DEVICE_STATE_IP_CONFIG:
-@NM_DEVICE_STATE_IP_CHECK:
-@NM_DEVICE_STATE_SECONDARIES:
-@NM_DEVICE_STATE_ACTIVATED:
-@NM_DEVICE_STATE_DEACTIVATING:
-@NM_DEVICE_STATE_FAILED:
-
-<!-- ##### ENUM NMDeviceStateReason ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_STATE_REASON_NONE:
-@NM_DEVICE_STATE_REASON_UNKNOWN:
-@NM_DEVICE_STATE_REASON_NOW_MANAGED:
-@NM_DEVICE_STATE_REASON_NOW_UNMANAGED:
-@NM_DEVICE_STATE_REASON_CONFIG_FAILED:
-@NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE:
-@NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED:
-@NM_DEVICE_STATE_REASON_NO_SECRETS:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT:
-@NM_DEVICE_STATE_REASON_PPP_START_FAILED:
-@NM_DEVICE_STATE_REASON_PPP_DISCONNECT:
-@NM_DEVICE_STATE_REASON_PPP_FAILED:
-@NM_DEVICE_STATE_REASON_DHCP_START_FAILED:
-@NM_DEVICE_STATE_REASON_DHCP_ERROR:
-@NM_DEVICE_STATE_REASON_DHCP_FAILED:
-@NM_DEVICE_STATE_REASON_SHARED_START_FAILED:
-@NM_DEVICE_STATE_REASON_SHARED_FAILED:
-@NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED:
-@NM_DEVICE_STATE_REASON_AUTOIP_ERROR:
-@NM_DEVICE_STATE_REASON_AUTOIP_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_BUSY:
-@NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE:
-@NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER:
-@NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT:
-@NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_APN_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT:
-@NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED:
-@NM_DEVICE_STATE_REASON_FIRMWARE_MISSING:
-@NM_DEVICE_STATE_REASON_REMOVED:
-@NM_DEVICE_STATE_REASON_SLEEPING:
-@NM_DEVICE_STATE_REASON_CONNECTION_REMOVED:
-@NM_DEVICE_STATE_REASON_USER_REQUESTED:
-@NM_DEVICE_STATE_REASON_CARRIER:
-@NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED:
-@NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE:
-@NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND:
-@NM_DEVICE_STATE_REASON_BT_FAILED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED:
-@NM_DEVICE_STATE_REASON_GSM_SIM_WRONG:
-@NM_DEVICE_STATE_REASON_INFINIBAND_MODE:
-@NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED:
-@NM_DEVICE_STATE_REASON_BR2684_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE:
-@NM_DEVICE_STATE_REASON_SSID_NOT_FOUND:
-@NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED:
-@NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED:
-@NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_FAILED:
-@NM_DEVICE_STATE_REASON_MODEM_AVAILABLE:
-@NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT:
-@NM_DEVICE_STATE_REASON_NEW_ACTIVATION:
-
-<!-- ##### ENUM NMActiveConnectionState ##### -->
-<para>
-
-</para>
-
-@NM_ACTIVE_CONNECTION_STATE_UNKNOWN:
-@NM_ACTIVE_CONNECTION_STATE_ACTIVATING:
-@NM_ACTIVE_CONNECTION_STATE_ACTIVATED:
-@NM_ACTIVE_CONNECTION_STATE_DEACTIVATING:
-@NM_ACTIVE_CONNECTION_STATE_DEACTIVATED:
-
-<!-- ##### ENUM NMSecretAgentGetSecretsFlags ##### -->
-<para>
-
-</para>
-
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM:
-@NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS:
-
-<!-- ##### ENUM NMSecretAgentCapabilities ##### -->
-<para>
-
-</para>
-
-@NM_SECRET_AGENT_CAPABILITY_NONE:
-@NM_SECRET_AGENT_CAPABILITY_VPN_HINTS:
-@NM_SECRET_AGENT_CAPABILITY_LAST:
-
diff --git a/docs/libnm/tmpl/nm-device-adsl.sgml b/docs/libnm/tmpl/nm-device-adsl.sgml
deleted file mode 100644
index a6ef7224b..000000000
--- a/docs/libnm/tmpl/nm-device-adsl.sgml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceAdsl
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_ADSL_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_adsl_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-bond.sgml b/docs/libnm/tmpl/nm-device-bond.sgml
deleted file mode 100644
index 8feb3de60..000000000
--- a/docs/libnm/tmpl/nm-device-bond.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceBond
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_BOND_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BOND_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BOND_SLAVES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bond_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bond_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bond_get_slaves ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-bridge.sgml b/docs/libnm/tmpl/nm-device-bridge.sgml
deleted file mode 100644
index 675fdb640..000000000
--- a/docs/libnm/tmpl/nm-device-bridge.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceBridge
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BRIDGE_SLAVES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bridge_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bridge_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bridge_get_slaves ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-bt.sgml b/docs/libnm/tmpl/nm-device-bt.sgml
deleted file mode 100644
index ff536c373..000000000
--- a/docs/libnm/tmpl/nm-device-bt.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceBt
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_BT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BT_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_BT_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_bt_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bt_get_name ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_bt_get_capabilities ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-ethernet.sgml b/docs/libnm/tmpl/nm-device-ethernet.sgml
deleted file mode 100644
index 9bb88cb32..000000000
--- a/docs/libnm/tmpl/nm-device-ethernet.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceEthernet
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_SPEED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ETHERNET_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_permanent_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_speed ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_ethernet_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-generic.sgml b/docs/libnm/tmpl/nm-device-generic.sgml
deleted file mode 100644
index 94f52f55c..000000000
--- a/docs/libnm/tmpl/nm-device-generic.sgml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceGeneric
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_GENERIC_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_GENERIC_TYPE_DESCRIPTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_generic_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-infiniband.sgml b/docs/libnm/tmpl/nm-device-infiniband.sgml
deleted file mode 100644
index bc6e35afd..000000000
--- a/docs/libnm/tmpl/nm-device-infiniband.sgml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceInfiniband
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_INFINIBAND_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_INFINIBAND_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_infiniband_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_infiniband_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-modem.sgml b/docs/libnm/tmpl/nm-device-modem.sgml
deleted file mode 100644
index 042959ce3..000000000
--- a/docs/libnm/tmpl/nm-device-modem.sgml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceModem
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_MODEM_MODEM_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_MODEM_CURRENT_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_modem_get_modem_capabilities ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_modem_get_current_capabilities ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-olpc-mesh.sgml b/docs/libnm/tmpl/nm-device-olpc-mesh.sgml
deleted file mode 100644
index 8047c8f83..000000000
--- a/docs/libnm/tmpl/nm-device-olpc-mesh.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceOlpcMesh
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_COMPANION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_get_companion ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_olpc_mesh_get_active_channel ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-team.sgml b/docs/libnm/tmpl/nm-device-team.sgml
deleted file mode 100644
index dd23f4515..000000000
--- a/docs/libnm/tmpl/nm-device-team.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceTeam
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_TEAM_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_TEAM_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_TEAM_SLAVES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_team_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_team_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_team_get_slaves ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-vlan.sgml b/docs/libnm/tmpl/nm-device-vlan.sgml
deleted file mode 100644
index 44f7d730e..000000000
--- a/docs/libnm/tmpl/nm-device-vlan.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceVlan
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_PARENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VLAN_VLAN_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_carrier ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_parent ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_vlan_get_vlan_id ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-wifi.sgml b/docs/libnm/tmpl/nm-device-wifi.sgml
deleted file mode 100644
index 57891ab34..000000000
--- a/docs/libnm/tmpl/nm-device-wifi.sgml
+++ /dev/null
@@ -1,179 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceWifi
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_PERMANENT_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_BITRATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_ACTIVE_ACCESS_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIFI_ACCESS_POINTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_permanent_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_mode ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_bitrate ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_capabilities ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_active_access_point ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_access_point_by_path ##### -->
-<para>
-
-</para>
-
-@device:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_get_access_points ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_request_scan ##### -->
-<para>
-
-</para>
-
-@device:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wifi_request_scan_async ##### -->
-<para>
-
-</para>
-
-@device:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_wifi_request_scan_finish ##### -->
-<para>
-
-</para>
-
-@device:
-@result:
-@error:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device-wimax.sgml b/docs/libnm/tmpl/nm-device-wimax.sgml
deleted file mode 100644
index 71a3a0392..000000000
--- a/docs/libnm/tmpl/nm-device-wimax.sgml
+++ /dev/null
@@ -1,162 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDeviceWimax
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_HW_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_ACTIVE_NSP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_CENTER_FREQUENCY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_RSSI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_CINR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_TX_POWER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_BSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_WIMAX_NSPS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_hw_address ##### -->
-<para>
-
-</para>
-
-@wimax:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_active_nsp ##### -->
-<para>
-
-</para>
-
-@wimax:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_nsp_by_path ##### -->
-<para>
-
-</para>
-
-@wimax:
-@path:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_nsps ##### -->
-<para>
-
-</para>
-
-@wimax:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_center_frequency ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_rssi ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_cinr ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_tx_power ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_wimax_get_bsid ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-device.sgml b/docs/libnm/tmpl/nm-device.sgml
deleted file mode 100644
index 9abbd9448..000000000
--- a/docs/libnm/tmpl/nm-device.sgml
+++ /dev/null
@@ -1,553 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDevice
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DEVICE_DEVICE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_UDI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_IP_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DRIVER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DRIVER_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_FIRMWARE_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_MANAGED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_AUTOCONNECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_FIRMWARE_MISSING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DHCP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_IP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_DHCP6_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_STATE_REASON ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_ACTIVE_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_AVAILABLE_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_VENDOR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_PRODUCT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_PHYSICAL_PORT_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEVICE_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_get_iface ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_ip_iface ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_device_type ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_udi ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_driver ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_driver_version ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_firmware_version ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_type_description ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_hw_address ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_capabilities ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_managed ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_autoconnect ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_set_autoconnect ##### -->
-<para>
-
-</para>
-
-@device:
-@autoconnect:
-
-
-<!-- ##### FUNCTION nm_device_get_firmware_missing ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_ip4_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_dhcp4_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_ip6_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_dhcp6_config ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_state ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_state_reason ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_active_connection ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_available_connections ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_physical_port_id ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_mtu ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_is_software ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_product ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_vendor ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_description ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_disambiguate_names ##### -->
-<para>
-
-</para>
-
-@devices:
-@num_devices:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_disconnect ##### -->
-<para>
-
-</para>
-
-@device:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_disconnect_async ##### -->
-<para>
-
-</para>
-
-@device:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_disconnect_finish ##### -->
-<para>
-
-</para>
-
-@device:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_delete ##### -->
-<para>
-
-</para>
-
-@device:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_delete_async ##### -->
-<para>
-
-</para>
-
-@device:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_device_delete_finish ##### -->
-<para>
-
-</para>
-
-@device:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_filter_connections ##### -->
-<para>
-
-</para>
-
-@device:
-@connections:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_connection_valid ##### -->
-<para>
-
-</para>
-
-@device:
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_connection_compatible ##### -->
-<para>
-
-</para>
-
-@device:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_device_get_setting_type ##### -->
-<para>
-
-</para>
-
-@device:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-dhcp-config.sgml b/docs/libnm/tmpl/nm-dhcp-config.sgml
deleted file mode 100644
index 9e5bb72a9..000000000
--- a/docs/libnm/tmpl/nm-dhcp-config.sgml
+++ /dev/null
@@ -1,66 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMDhcpConfig
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DHCP_CONFIG_FAMILY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DHCP_CONFIG_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_dhcp_config_get_family ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_dhcp_config_get_options ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_dhcp_config_get_one_option ##### -->
-<para>
-
-</para>
-
-@config:
-@option:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-enum-types.sgml b/docs/libnm/tmpl/nm-enum-types.sgml
deleted file mode 100644
index 8577600d3..000000000
--- a/docs/libnm/tmpl/nm-enum-types.sgml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-enum-types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/docs/libnm/tmpl/nm-errors.sgml b/docs/libnm/tmpl/nm-errors.sgml
deleted file mode 100644
index 8c79b479d..000000000
--- a/docs/libnm/tmpl/nm-errors.sgml
+++ /dev/null
@@ -1,263 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-errors
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMAgentManagerError ##### -->
-<para>
-
-</para>
-
-@NM_AGENT_MANAGER_ERROR_FAILED:
-@NM_AGENT_MANAGER_ERROR_PERMISSION_DENIED:
-@NM_AGENT_MANAGER_ERROR_INVALID_IDENTIFIER:
-@NM_AGENT_MANAGER_ERROR_NOT_REGISTERED:
-@NM_AGENT_MANAGER_ERROR_NO_SECRETS:
-@NM_AGENT_MANAGER_ERROR_USER_CANCELED:
-
-<!-- ##### FUNCTION nm_agent_manager_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_AGENT_MANAGER_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMConnectionError ##### -->
-<para>
-
-</para>
-
-@NM_CONNECTION_ERROR_FAILED:
-@NM_CONNECTION_ERROR_SETTING_NOT_FOUND:
-@NM_CONNECTION_ERROR_PROPERTY_NOT_FOUND:
-@NM_CONNECTION_ERROR_PROPERTY_NOT_SECRET:
-@NM_CONNECTION_ERROR_MISSING_SETTING:
-@NM_CONNECTION_ERROR_INVALID_SETTING:
-@NM_CONNECTION_ERROR_MISSING_PROPERTY:
-@NM_CONNECTION_ERROR_INVALID_PROPERTY:
-
-<!-- ##### MACRO NM_CONNECTION_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_connection_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### ENUM NMCryptoError ##### -->
-<para>
-
-</para>
-
-@NM_CRYPTO_ERROR_FAILED:
-@NM_CRYPTO_ERROR_INVALID_DATA:
-@NM_CRYPTO_ERROR_INVALID_PASSWORD:
-@NM_CRYPTO_ERROR_UNKNOWN_CIPHER:
-@NM_CRYPTO_ERROR_DECRYPTION_FAILED:
-@NM_CRYPTO_ERROR_ENCRYPTION_FAILED:
-
-<!-- ##### MACRO NM_CRYPTO_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_crypto_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### ENUM NMDeviceError ##### -->
-<para>
-
-</para>
-
-@NM_DEVICE_ERROR_FAILED:
-@NM_DEVICE_ERROR_CREATION_FAILED:
-@NM_DEVICE_ERROR_INVALID_CONNECTION:
-@NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION:
-@NM_DEVICE_ERROR_NOT_ACTIVE:
-@NM_DEVICE_ERROR_NOT_SOFTWARE:
-@NM_DEVICE_ERROR_NOT_ALLOWED:
-@NM_DEVICE_ERROR_SPECIFIC_OBJECT_NOT_FOUND:
-
-<!-- ##### MACRO NM_DEVICE_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_device_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### ENUM NMManagerError ##### -->
-<para>
-
-</para>
-
-@NM_MANAGER_ERROR_FAILED:
-@NM_MANAGER_ERROR_PERMISSION_DENIED:
-@NM_MANAGER_ERROR_UNKNOWN_CONNECTION:
-@NM_MANAGER_ERROR_UNKNOWN_DEVICE:
-@NM_MANAGER_ERROR_CONNECTION_NOT_AVAILABLE:
-@NM_MANAGER_ERROR_CONNECTION_NOT_ACTIVE:
-@NM_MANAGER_ERROR_CONNECTION_ALREADY_ACTIVE:
-@NM_MANAGER_ERROR_DEPENDENCY_FAILED:
-@NM_MANAGER_ERROR_ALREADY_ASLEEP_OR_AWAKE:
-@NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED:
-@NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL:
-@NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN:
-
-<!-- ##### FUNCTION nm_manager_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_MANAGER_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSecretAgentError ##### -->
-<para>
-
-</para>
-
-@NM_SECRET_AGENT_ERROR_FAILED:
-@NM_SECRET_AGENT_ERROR_PERMISSION_DENIED:
-@NM_SECRET_AGENT_ERROR_INVALID_CONNECTION:
-@NM_SECRET_AGENT_ERROR_USER_CANCELED:
-@NM_SECRET_AGENT_ERROR_AGENT_CANCELED:
-@NM_SECRET_AGENT_ERROR_NO_SECRETS:
-
-<!-- ##### FUNCTION nm_secret_agent_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingsError ##### -->
-<para>
-
-</para>
-
-@NM_SETTINGS_ERROR_FAILED:
-@NM_SETTINGS_ERROR_PERMISSION_DENIED:
-@NM_SETTINGS_ERROR_NOT_SUPPORTED:
-@NM_SETTINGS_ERROR_INVALID_CONNECTION:
-@NM_SETTINGS_ERROR_READ_ONLY_CONNECTION:
-@NM_SETTINGS_ERROR_UUID_EXISTS:
-@NM_SETTINGS_ERROR_INVALID_HOSTNAME:
-
-<!-- ##### FUNCTION nm_settings_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### MACRO NM_SETTINGS_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVpnPluginError ##### -->
-<para>
-
-</para>
-
-@NM_VPN_PLUGIN_ERROR_FAILED:
-@NM_VPN_PLUGIN_ERROR_STARTING_IN_PROGRESS:
-@NM_VPN_PLUGIN_ERROR_ALREADY_STARTED:
-@NM_VPN_PLUGIN_ERROR_STOPPING_IN_PROGRESS:
-@NM_VPN_PLUGIN_ERROR_ALREADY_STOPPED:
-@NM_VPN_PLUGIN_ERROR_WRONG_STATE:
-@NM_VPN_PLUGIN_ERROR_BAD_ARGUMENTS:
-@NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED:
-@NM_VPN_PLUGIN_ERROR_INVALID_CONNECTION:
-@NM_VPN_PLUGIN_ERROR_INTERACTIVE_NOT_SUPPORTED:
-
-<!-- ##### MACRO NM_VPN_PLUGIN_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_vpn_plugin_error_quark ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-ip-config.sgml b/docs/libnm/tmpl/nm-ip-config.sgml
deleted file mode 100644
index 2784a9b6a..000000000
--- a/docs/libnm/tmpl/nm-ip-config.sgml
+++ /dev/null
@@ -1,152 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMIPConfig
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_IP_CONFIG_FAMILY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_ADDRESSES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_NAMESERVERS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_SEARCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_IP_CONFIG_WINS_SERVERS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_ip_config_get_family ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_gateway ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_addresses ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_routes ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_nameservers ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_domains ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_searches ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_config_get_wins_servers ##### -->
-<para>
-
-</para>
-
-@config:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-object.sgml b/docs/libnm/tmpl/nm-object.sgml
deleted file mode 100644
index 98025f3d2..000000000
--- a/docs/libnm/tmpl/nm-object.sgml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMObject
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_OBJECT_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_OBJECT_DBUS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_object_get_path ##### -->
-<para>
-
-</para>
-
-@object:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-remote-connection.sgml b/docs/libnm/tmpl/nm-remote-connection.sgml
deleted file mode 100644
index fb74dcc5d..000000000
--- a/docs/libnm/tmpl/nm-remote-connection.sgml
+++ /dev/null
@@ -1,206 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMRemoteConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_DBUS_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_UNSAVED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_REMOTE_CONNECTION_VISIBLE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_remote_connection_commit_changes ##### -->
-<para>
-
-</para>
-
-@connection:
-@save_to_disk:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_commit_changes_async ##### -->
-<para>
-
-</para>
-
-@connection:
-@save_to_disk:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_commit_changes_finish ##### -->
-<para>
-
-</para>
-
-@connection:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_save ##### -->
-<para>
-
-</para>
-
-@connection:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_save_async ##### -->
-<para>
-
-</para>
-
-@connection:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_save_finish ##### -->
-<para>
-
-</para>
-
-@connection:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_delete ##### -->
-<para>
-
-</para>
-
-@connection:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_delete_async ##### -->
-<para>
-
-</para>
-
-@connection:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_delete_finish ##### -->
-<para>
-
-</para>
-
-@connection:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_secrets ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_name:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_secrets_async ##### -->
-<para>
-
-</para>
-
-@connection:
-@setting_name:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_secrets_finish ##### -->
-<para>
-
-</para>
-
-@connection:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_unsaved ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_remote_connection_get_visible ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-secret-agent-old.sgml b/docs/libnm/tmpl/nm-secret-agent-old.sgml
deleted file mode 100644
index 1e147551e..000000000
--- a/docs/libnm/tmpl/nm-secret-agent-old.sgml
+++ /dev/null
@@ -1,197 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSecretAgentOld
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_OLD_IDENTIFIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_OLD_AUTO_REGISTER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_OLD_REGISTERED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SECRET_AGENT_OLD_CAPABILITIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### USER_FUNCTION NMSecretAgentOldGetSecretsFunc ##### -->
-<para>
-
-</para>
-
-@agent:
-@connection:
-@secrets:
-@error:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMSecretAgentOldSaveSecretsFunc ##### -->
-<para>
-
-</para>
-
-@agent:
-@connection:
-@error:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION NMSecretAgentOldDeleteSecretsFunc ##### -->
-<para>
-
-</para>
-
-@agent:
-@connection:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_register ##### -->
-<para>
-
-</para>
-
-@self:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_register_async ##### -->
-<para>
-
-</para>
-
-@self:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_register_finish ##### -->
-<para>
-
-</para>
-
-@self:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_unregister ##### -->
-<para>
-
-</para>
-
-@self:
-@cancellable:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_unregister_async ##### -->
-<para>
-
-</para>
-
-@self:
-@cancellable:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_unregister_finish ##### -->
-<para>
-
-</para>
-
-@self:
-@result:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_get_registered ##### -->
-<para>
-
-</para>
-
-@self:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_get_secrets ##### -->
-<para>
-
-</para>
-
-@self:
-@connection:
-@setting_name:
-@hints:
-@flags:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_save_secrets ##### -->
-<para>
-
-</para>
-
-@self:
-@connection:
-@callback:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_secret_agent_old_delete_secrets ##### -->
-<para>
-
-</para>
-
-@self:
-@connection:
-@callback:
-@user_data:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-8021x.sgml b/docs/libnm/tmpl/nm-setting-8021x.sgml
deleted file mode 100644
index f61f08748..000000000
--- a/docs/libnm/tmpl/nm-setting-8021x.sgml
+++ /dev/null
@@ -1,918 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSetting8021x
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM NMSetting8021xCKFormat ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_802_1X_CK_FORMAT_UNKNOWN:
-@NM_SETTING_802_1X_CK_FORMAT_X509:
-@NM_SETTING_802_1X_CK_FORMAT_RAW_KEY:
-@NM_SETTING_802_1X_CK_FORMAT_PKCS12:
-
-<!-- ##### ENUM NMSetting8021xCKScheme ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_802_1X_CK_SCHEME_UNKNOWN:
-@NM_SETTING_802_1X_CK_SCHEME_BLOB:
-@NM_SETTING_802_1X_CK_SCHEME_PATH:
-
-<!-- ##### MACRO NM_SETTING_802_1X_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_EAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_IDENTITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_ANONYMOUS_IDENTITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PAC_FILE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_CA_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_CA_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_SUBJECT_MATCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_ALTSUBJECT_MATCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_CLIENT_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE1_PEAPVER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE1_PEAPLABEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_AUTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_AUTHEAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_CA_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_CA_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_SUBJECT_MATCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_ALTSUBJECT_MATCHES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_CLIENT_CERT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD_RAW ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PASSWORD_RAW_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PRIVATE_KEY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_PRIVATE_KEY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_PIN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_802_1X_SYSTEM_CA_CERTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_num_eap_methods ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_eap_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_add_eap_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@eap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_eap_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_eap_method_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@eap:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_clear_eap_methods ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_identity ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_anonymous_identity ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_pac_file ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_system_ca_certs ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_ca_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_ca_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_subject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_num_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_add_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_altsubject_match_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_clear_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_client_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_client_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_client_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_client_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase1_peapver ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase1_peaplabel ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase1_fast_provisioning ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_auth ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_autheap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_ca_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_phase2_ca_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_subject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_num_phase2_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_add_phase2_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@phase2_altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_phase2_altsubject_match ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_remove_phase2_altsubject_match_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@phase2_altsubject_match:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_clear_phase2_altsubject_matches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_client_cert_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_client_cert_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_client_cert_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_phase2_client_cert ##### -->
-<para>
-
-</para>
-
-@setting:
-@cert_path:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password_raw ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_password_raw_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_pin ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_pin_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_private_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@key_path:
-@password:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_private_key_format ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_scheme ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_blob ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_path ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_set_phase2_private_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@key_path:
-@password:
-@scheme:
-@out_format:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_802_1x_get_phase2_private_key_format ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-adsl.sgml b/docs/libnm/tmpl/nm-setting-adsl.sgml
deleted file mode 100644
index 8895e1192..000000000
--- a/docs/libnm/tmpl/nm-setting-adsl.sgml
+++ /dev/null
@@ -1,187 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingAdsl
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_ENCAPSULATION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_VPI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_VCI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL_PPPOA ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL_PPPOE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_PROTOCOL_IPOATM ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_ENCAPSULATION_VCMUX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_ADSL_ENCAPSULATION_LLC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_adsl_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_protocol ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_encapsulation ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_vpi ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_vci ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_adsl_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-bluetooth.sgml b/docs/libnm/tmpl/nm-setting-bluetooth.sgml
deleted file mode 100644
index 6d1f1468b..000000000
--- a/docs/libnm/tmpl/nm-setting-bluetooth.sgml
+++ /dev/null
@@ -1,86 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBluetooth
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_BDADDR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_TYPE_DUN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BLUETOOTH_TYPE_PANU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_get_bdaddr ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bluetooth_get_connection_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-bond.sgml b/docs/libnm/tmpl/nm-setting-bond.sgml
deleted file mode 100644
index 25b94199f..000000000
--- a/docs/libnm/tmpl/nm-setting-bond.sgml
+++ /dev/null
@@ -1,233 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBond
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BOND_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_MIIMON ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_DOWNDELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_UPDELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_ARP_INTERVAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_ARP_IP_TARGET ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_ARP_VALIDATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_PRIMARY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_PRIMARY_RESELECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_FAIL_OVER_MAC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_USE_CARRIER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_AD_SELECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_RESEND_IGMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BOND_OPTION_LACP_RATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bond_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_num_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@out_name:
-@out_value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_option_by_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_add_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_remove_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_validate_option ##### -->
-<para>
-
-</para>
-
-@name:
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_valid_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bond_get_option_default ##### -->
-<para>
-
-</para>
-
-@setting:
-@name:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-bridge-port.sgml b/docs/libnm/tmpl/nm-setting-bridge-port.sgml
deleted file mode 100644
index 7fec001be..000000000
--- a/docs/libnm/tmpl/nm-setting-bridge-port.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBridgePort
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_PATH_COST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_get_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_get_path_cost ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_port_get_hairpin_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-bridge.sgml b/docs/libnm/tmpl/nm-setting-bridge.sgml
deleted file mode 100644
index 216c370a1..000000000
--- a/docs/libnm/tmpl/nm-setting-bridge.sgml
+++ /dev/null
@@ -1,152 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingBridge
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_STP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_FORWARD_DELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_HELLO_TIME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_MAX_AGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_BRIDGE_AGEING_TIME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_bridge_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_stp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_forward_delay ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_hello_time ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_max_age ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_bridge_get_ageing_time ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-cdma.sgml b/docs/libnm/tmpl/nm-setting-cdma.sgml
deleted file mode 100644
index 2f02d7076..000000000
--- a/docs/libnm/tmpl/nm-setting-cdma.sgml
+++ /dev/null
@@ -1,104 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingCdma
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_NUMBER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CDMA_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_cdma_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_number ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_cdma_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-connection.sgml b/docs/libnm/tmpl/nm-setting-connection.sgml
deleted file mode 100644
index b8bb9b514..000000000
--- a/docs/libnm/tmpl/nm-setting-connection.sgml
+++ /dev/null
@@ -1,466 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_UUID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_INTERFACE_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_AUTOCONNECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_TIMESTAMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_READ_ONLY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_PERMISSIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_ZONE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_MASTER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_SLAVE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_SECONDARIES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### STRUCT NMSettingConnection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG NMSettingConnection:autoconnect ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:autoconnect-priority ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:gateway-ping-timeout ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:id ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:interface-name ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:master ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:permissions ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:read-only ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:secondaries ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:slave-type ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:timestamp ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:type ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:uuid ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG NMSettingConnection:zone ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION nm_setting_connection_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_uuid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_connection_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_autoconnect ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_autoconnect_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_timestamp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_read_only ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_num_permissions ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_permission ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@out_ptype:
-@out_pitem:
-@out_detail:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_zone ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_permissions_user_allowed ##### -->
-<para>
-
-</para>
-
-@setting:
-@uname:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_add_permission ##### -->
-<para>
-
-</para>
-
-@setting:
-@ptype:
-@pitem:
-@detail:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_permission ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_permission_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@ptype:
-@pitem:
-@detail:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_master ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_is_slave_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_slave_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_num_secondaries ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_secondary ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_add_secondary ##### -->
-<para>
-
-</para>
-
-@setting:
-@sec_uuid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_secondary ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_connection_remove_secondary_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@sec_uuid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_connection_get_gateway_ping_timeout ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-dcb.sgml b/docs/libnm/tmpl/nm-setting-dcb.sgml
deleted file mode 100644
index be50bafae..000000000
--- a/docs/libnm/tmpl/nm-setting-dcb.sgml
+++ /dev/null
@@ -1,370 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingDcb
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_DCB_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingDcbFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_DCB_FLAG_NONE:
-@NM_SETTING_DCB_FLAG_ENABLE:
-@NM_SETTING_DCB_FLAG_ADVERTISE:
-@NM_SETTING_DCB_FLAG_WILLING:
-
-<!-- ##### MACRO NM_SETTING_DCB_FCOE_MODE_FABRIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_FCOE_MODE_VN2VN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FCOE_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FCOE_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FCOE_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_ISCSI_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_ISCSI_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FIP_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_APP_FIP_PRIORITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_FLOW_CONTROL_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_FLOW_CONTROL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_GROUP_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_GROUP_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_GROUP_BANDWIDTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_BANDWIDTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_dcb_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fcoe_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fcoe_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fcoe_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_iscsi_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_iscsi_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fip_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_app_fip_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_flow_control_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_flow_control ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_flow_control ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@enabled:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_group_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_group_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_group_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@group_id:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_group_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@group_id:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_group_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@group_id:
-@bandwidth_percent:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@bandwidth_percent:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_strict_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_strict_bandwidth ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@strict:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_get_priority_traffic_class ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_dcb_set_priority_traffic_class ##### -->
-<para>
-
-</para>
-
-@setting:
-@user_priority:
-@traffic_class:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-generic.sgml b/docs/libnm/tmpl/nm-setting-generic.sgml
deleted file mode 100644
index 339f99b5d..000000000
--- a/docs/libnm/tmpl/nm-setting-generic.sgml
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingGeneric
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_GENERIC_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_generic_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-gsm.sgml b/docs/libnm/tmpl/nm-setting-gsm.sgml
deleted file mode 100644
index dd8012479..000000000
--- a/docs/libnm/tmpl/nm-setting-gsm.sgml
+++ /dev/null
@@ -1,184 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingGsm
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_GSM_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_NUMBER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_APN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_NETWORK_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_PIN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_GSM_HOME_ONLY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_gsm_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_number ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_apn ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_network_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_pin ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_home_only ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_pin_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_gsm_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-infiniband.sgml b/docs/libnm/tmpl/nm-setting-infiniband.sgml
deleted file mode 100644
index b6f86e3ae..000000000
--- a/docs/libnm/tmpl/nm-setting-infiniband.sgml
+++ /dev/null
@@ -1,129 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingInfiniband
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_TRANSPORT_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_P_KEY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_INFINIBAND_PARENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_transport_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_p_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_parent ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_infiniband_get_virtual_interface_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-ip-config.sgml b/docs/libnm/tmpl/nm-setting-ip-config.sgml
deleted file mode 100644
index f7ae0e4a6..000000000
--- a/docs/libnm/tmpl/nm-setting-ip-config.sgml
+++ /dev/null
@@ -1,781 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingIPConfig
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION nm_ip_address_new ##### -->
-<para>
-
-</para>
-
-@family:
-@addr:
-@prefix:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_new_binary ##### -->
-<para>
-
-</para>
-
-@family:
-@addr:
-@prefix:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_ref ##### -->
-<para>
-
-</para>
-
-@address:
-
-
-<!-- ##### FUNCTION nm_ip_address_unref ##### -->
-<para>
-
-</para>
-
-@address:
-
-
-<!-- ##### FUNCTION nm_ip_address_equal ##### -->
-<para>
-
-</para>
-
-@address:
-@other:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_dup ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_get_family ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_get_address ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_set_address ##### -->
-<para>
-
-</para>
-
-@address:
-@addr:
-
-
-<!-- ##### FUNCTION nm_ip_address_get_address_binary ##### -->
-<para>
-
-</para>
-
-@address:
-@addr:
-
-
-<!-- ##### FUNCTION nm_ip_address_set_address_binary ##### -->
-<para>
-
-</para>
-
-@address:
-@addr:
-
-
-<!-- ##### FUNCTION nm_ip_address_get_prefix ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_set_prefix ##### -->
-<para>
-
-</para>
-
-@address:
-@prefix:
-
-
-<!-- ##### FUNCTION nm_ip_address_get_attribute_names ##### -->
-<para>
-
-</para>
-
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_get_attribute ##### -->
-<para>
-
-</para>
-
-@address:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_address_set_attribute ##### -->
-<para>
-
-</para>
-
-@address:
-@name:
-@value:
-
-
-<!-- ##### FUNCTION nm_ip_route_new ##### -->
-<para>
-
-</para>
-
-@family:
-@dest:
-@prefix:
-@next_hop:
-@metric:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_new_binary ##### -->
-<para>
-
-</para>
-
-@family:
-@dest:
-@prefix:
-@next_hop:
-@metric:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_ref ##### -->
-<para>
-
-</para>
-
-@route:
-
-
-<!-- ##### FUNCTION nm_ip_route_unref ##### -->
-<para>
-
-</para>
-
-@route:
-
-
-<!-- ##### FUNCTION nm_ip_route_equal ##### -->
-<para>
-
-</para>
-
-@route:
-@other:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_dup ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_family ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_dest ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_dest ##### -->
-<para>
-
-</para>
-
-@route:
-@dest:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_dest_binary ##### -->
-<para>
-
-</para>
-
-@route:
-@dest:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_dest_binary ##### -->
-<para>
-
-</para>
-
-@route:
-@dest:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_prefix ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_prefix ##### -->
-<para>
-
-</para>
-
-@route:
-@prefix:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_next_hop ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_next_hop ##### -->
-<para>
-
-</para>
-
-@route:
-@next_hop:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_next_hop_binary ##### -->
-<para>
-
-</para>
-
-@route:
-@next_hop:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_next_hop_binary ##### -->
-<para>
-
-</para>
-
-@route:
-@next_hop:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_metric ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_metric ##### -->
-<para>
-
-</para>
-
-@route:
-@metric:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_attribute_names ##### -->
-<para>
-
-</para>
-
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_get_attribute ##### -->
-<para>
-
-</para>
-
-@route:
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_ip_route_set_attribute ##### -->
-<para>
-
-</para>
-
-@route:
-@name:
-@value:
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_METHOD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_DNS_SEARCH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_ADDRESSES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_ROUTE_METRIC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_DHCP_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP_CONFIG_MAY_FAIL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_method ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_num_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_add_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_dns_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_clear_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_num_dns_searches ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_add_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns_search:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_dns_search ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_dns_search_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@dns_search:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_clear_dns_searches ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_num_addresses ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_add_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_address_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@address:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_clear_addresses ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_gateway ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_num_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_add_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_route ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_remove_route_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@route:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_clear_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_route_metric ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_ignore_auto_routes ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_ignore_auto_dns ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_dhcp_hostname ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_dhcp_send_hostname ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_never_default ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip_config_get_may_fail ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-ip4-config.sgml b/docs/libnm/tmpl/nm-setting-ip4-config.sgml
deleted file mode 100644
index 4eabe0348..000000000
--- a/docs/libnm/tmpl/nm-setting-ip4-config.sgml
+++ /dev/null
@@ -1,91 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingIP4Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_AUTO ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_MANUAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_SHARED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP4_CONFIG_METHOD_DISABLED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip4_config_get_dhcp_client_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-ip6-config.sgml b/docs/libnm/tmpl/nm-setting-ip6-config.sgml
deleted file mode 100644
index 3ba20ae05..000000000
--- a/docs/libnm/tmpl/nm-setting-ip6-config.sgml
+++ /dev/null
@@ -1,108 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingIP6Config
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_IP6_PRIVACY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_IGNORE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_AUTO ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_DHCP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_MANUAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_IP6_CONFIG_METHOD_SHARED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingIP6ConfigPrivacy ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN:
-@NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED:
-@NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_PUBLIC_ADDR:
-@NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR:
-
-<!-- ##### FUNCTION nm_setting_ip6_config_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ip6_config_get_ip6_privacy ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-olpc-mesh.sgml b/docs/libnm/tmpl/nm-setting-olpc-mesh.sgml
deleted file mode 100644
index ec682d734..000000000
--- a/docs/libnm/tmpl/nm-setting-olpc-mesh.sgml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingOlpcMesh
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_SSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_CHANNEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_get_ssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_get_channel ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_olpc_mesh_get_dhcp_anycast_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-ppp.sgml b/docs/libnm/tmpl/nm-setting-ppp.sgml
deleted file mode 100644
index d974da0f1..000000000
--- a/docs/libnm/tmpl/nm-setting-ppp.sgml
+++ /dev/null
@@ -1,328 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingPpp
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_PPP_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NOAUTH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_EAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_PAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_CHAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_MSCHAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REFUSE_MSCHAPV2 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NOBSDCOMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NODEFLATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_NO_VJ_COMP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REQUIRE_MPPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_REQUIRE_MPPE_128 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_MPPE_STATEFUL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_CRTSCTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_BAUD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_MRU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_LCP_ECHO_FAILURE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPP_LCP_ECHO_INTERVAL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_ppp_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_noauth ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_eap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_pap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_chap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_mschap ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_refuse_mschapv2 ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_nobsdcomp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_nodeflate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_no_vj_comp ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_require_mppe ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_require_mppe_128 ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_mppe_stateful ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_crtscts ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_baud ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_mru ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_lcp_echo_failure ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_ppp_get_lcp_echo_interval ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-pppoe.sgml b/docs/libnm/tmpl/nm-setting-pppoe.sgml
deleted file mode 100644
index 32d9e7250..000000000
--- a/docs/libnm/tmpl/nm-setting-pppoe.sgml
+++ /dev/null
@@ -1,104 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingPppoe
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_SERVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PPPOE_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_service ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_pppoe_get_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-serial.sgml b/docs/libnm/tmpl/nm-setting-serial.sgml
deleted file mode 100644
index d713db5ca..000000000
--- a/docs/libnm/tmpl/nm-setting-serial.sgml
+++ /dev/null
@@ -1,129 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingSerial
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingSerialParity ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_SERIAL_PARITY_NONE:
-@NM_SETTING_SERIAL_PARITY_EVEN:
-@NM_SETTING_SERIAL_PARITY_ODD:
-
-<!-- ##### MACRO NM_SETTING_SERIAL_BAUD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_BITS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_PARITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_STOPBITS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_SERIAL_SEND_DELAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_serial_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_baud ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_bits ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_parity ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_stopbits ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_serial_get_send_delay ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-team-port.sgml b/docs/libnm/tmpl/nm-setting-team-port.sgml
deleted file mode 100644
index 809e1878d..000000000
--- a/docs/libnm/tmpl/nm-setting-team-port.sgml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingTeamPort
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_PORT_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_PORT_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_team_port_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_team_port_get_config ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-team.sgml b/docs/libnm/tmpl/nm-setting-team.sgml
deleted file mode 100644
index 6c2cb1fa0..000000000
--- a/docs/libnm/tmpl/nm-setting-team.sgml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingTeam
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_TEAM_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_team_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_team_get_config ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-vlan.sgml b/docs/libnm/tmpl/nm-setting-vlan.sgml
deleted file mode 100644
index 756c03994..000000000
--- a/docs/libnm/tmpl/nm-setting-vlan.sgml
+++ /dev/null
@@ -1,207 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingVlan
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_PARENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_ID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_INGRESS_PRIORITY_MAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VLAN_EGRESS_PRIORITY_MAP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVlanPriorityMap ##### -->
-<para>
-
-</para>
-
-@NM_VLAN_INGRESS_MAP:
-@NM_VLAN_EGRESS_MAP:
-
-<!-- ##### ENUM NMVlanFlags ##### -->
-<para>
-
-</para>
-
-@NM_VLAN_FLAG_REORDER_HEADERS:
-@NM_VLAN_FLAG_GVRP:
-@NM_VLAN_FLAG_LOOSE_BINDING:
-
-<!-- ##### FUNCTION nm_setting_vlan_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_parent ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_id ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_num_priorities ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_get_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@idx:
-@out_from:
-@out_to:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_add_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@from:
-@to:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_remove_priority ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_remove_priority_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@from:
-@to:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_remove_priority_str_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@str:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_clear_priorities ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-
-
-<!-- ##### FUNCTION nm_setting_vlan_add_priority_str ##### -->
-<para>
-
-</para>
-
-@setting:
-@map:
-@str:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-vpn.sgml b/docs/libnm/tmpl/nm-setting-vpn.sgml
deleted file mode 100644
index 2d5e70c99..000000000
--- a/docs/libnm/tmpl/nm-setting-vpn.sgml
+++ /dev/null
@@ -1,210 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingVpn
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_VPN_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_SERVICE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_USER_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_PERSISTENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_DATA ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_VPN_SECRETS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### USER_FUNCTION NMVpnIterFunc ##### -->
-<para>
-
-</para>
-
-@key:
-@value:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_service_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_user_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_persistent ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_num_data_items ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_add_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@item:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_remove_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_foreach_data_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_num_secrets ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_add_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@secret:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_get_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_remove_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_vpn_foreach_secret ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-wimax.sgml b/docs/libnm/tmpl/nm-setting-wimax.sgml
deleted file mode 100644
index a7f51a8ec..000000000
--- a/docs/libnm/tmpl/nm-setting-wimax.sgml
+++ /dev/null
@@ -1,72 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWimax
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIMAX_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIMAX_NETWORK_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIMAX_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wimax_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wimax_get_network_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wimax_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-wired.sgml b/docs/libnm/tmpl/nm-setting-wired.sgml
deleted file mode 100644
index 156ff4f18..000000000
--- a/docs/libnm/tmpl/nm-setting-wired.sgml
+++ /dev/null
@@ -1,324 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWired
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_PORT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_SPEED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_DUPLEX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_AUTO_NEGOTIATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_CLONED_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_S390_SUBCHANNELS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_S390_NETTYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRED_S390_OPTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wired_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_port ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_speed ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_duplex ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_auto_negotiate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_cloned_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mac_address_blacklist ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_num_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_add_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_remove_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_wired_remove_mac_blacklist_item_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_clear_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_subchannels ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_nettype ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_num_s390_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@out_key:
-@out_value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_s390_option_by_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_add_s390_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_remove_s390_option ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wired_get_valid_s390_options ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-wireless-security.sgml b/docs/libnm/tmpl/nm-setting-wireless-security.sgml
deleted file mode 100644
index 4cb19ed3c..000000000
--- a/docs/libnm/tmpl/nm-setting-wireless-security.sgml
+++ /dev/null
@@ -1,447 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWirelessSecurity
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMWepKeyType ##### -->
-<para>
-
-</para>
-
-@NM_WEP_KEY_TYPE_UNKNOWN:
-@NM_WEP_KEY_TYPE_KEY:
-@NM_WEP_KEY_TYPE_PASSPHRASE:
-@NM_WEP_KEY_TYPE_LAST:
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_KEY_MGMT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_AUTH_ALG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PROTO ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PAIRWISE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_GROUP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY0 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY1 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY2 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY3 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PSK ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_PSK_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_key_mgmt ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_num_protos ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_proto ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_add_proto ##### -->
-<para>
-
-</para>
-
-@setting:
-@proto:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_proto ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_proto_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@proto:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_clear_protos ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_num_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_add_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@pairwise:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_pairwise_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@pairwise:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_clear_pairwise ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_num_groups ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_group ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_add_group ##### -->
-<para>
-
-</para>
-
-@setting:
-@group:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_group ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_remove_group_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@group:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_clear_groups ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_psk ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_psk_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_leap_username ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_leap_password ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_leap_password_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_set_wep_key ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@key:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_tx_keyidx ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_auth_alg ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_key_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_security_get_wep_key_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting-wireless.sgml b/docs/libnm/tmpl/nm-setting-wireless.sgml
deleted file mode 100644
index f20aa1149..000000000
--- a/docs/libnm/tmpl/nm-setting-wireless.sgml
+++ /dev/null
@@ -1,359 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSettingWireless
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_BAND ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_CHANNEL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_BSSID ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_RATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_TX_POWER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_SEEN_BSSIDS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_HIDDEN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE_ADHOC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE_AP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_WIRELESS_MODE_INFRA ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_setting_wireless_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_ssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mode ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_band ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_channel ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_bssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_rate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_tx_power ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_cloned_mac_address ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mac_address_blacklist ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_num_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_add_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_remove_mac_blacklist_item ##### -->
-<para>
-
-</para>
-
-@setting:
-@idx:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_remove_mac_blacklist_item_by_value ##### -->
-<para>
-
-</para>
-
-@setting:
-@mac:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_clear_mac_blacklist_items ##### -->
-<para>
-
-</para>
-
-@setting:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_mtu ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_hidden ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_add_seen_bssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@bssid:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_num_seen_bssids ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_get_seen_bssid ##### -->
-<para>
-
-</para>
-
-@setting:
-@i:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_wireless_ap_security_compatible ##### -->
-<para>
-
-</para>
-
-@s_wireless:
-@s_wireless_sec:
-@ap_flags:
-@ap_wpa:
-@ap_rsn:
-@ap_mode:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-setting.sgml b/docs/libnm/tmpl/nm-setting.sgml
deleted file mode 100644
index 88a4e99e0..000000000
--- a/docs/libnm/tmpl/nm-setting.sgml
+++ /dev/null
@@ -1,238 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSetting
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_REQUIRED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_SECRET ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_PARAM_FUZZY_IGNORE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_SETTING_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMSettingSecretFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_SECRET_FLAG_NONE:
-@NM_SETTING_SECRET_FLAG_AGENT_OWNED:
-@NM_SETTING_SECRET_FLAG_NOT_SAVED:
-@NM_SETTING_SECRET_FLAG_NOT_REQUIRED:
-
-<!-- ##### ENUM NMSettingCompareFlags ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_COMPARE_FLAG_EXACT:
-@NM_SETTING_COMPARE_FLAG_FUZZY:
-@NM_SETTING_COMPARE_FLAG_IGNORE_ID:
-@NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS:
-@NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS:
-@NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS:
-@NM_SETTING_COMPARE_FLAG_DIFF_RESULT_WITH_DEFAULT:
-@NM_SETTING_COMPARE_FLAG_DIFF_RESULT_NO_DEFAULT:
-@NM_SETTING_COMPARE_FLAG_IGNORE_TIMESTAMP:
-
-<!-- ##### STRUCT NMSetting ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG NMSetting:name ##### -->
-<para>
-
-</para>
-
-<!-- ##### USER_FUNCTION NMSettingClearSecretsWithFlagsFn ##### -->
-<para>
-
-</para>
-
-@setting:
-@secret:
-@flags:
-@user_data:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMSettingValueIterFn ##### -->
-<para>
-
-</para>
-
-@setting:
-@key:
-@value:
-@flags:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_lookup_type ##### -->
-<para>
-
-</para>
-
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_duplicate ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_get_name ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_verify ##### -->
-<para>
-
-</para>
-
-@setting:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_compare ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@Returns:
-
-
-<!-- ##### ENUM NMSettingDiffResult ##### -->
-<para>
-
-</para>
-
-@NM_SETTING_DIFF_RESULT_UNKNOWN:
-@NM_SETTING_DIFF_RESULT_IN_A:
-@NM_SETTING_DIFF_RESULT_IN_B:
-@NM_SETTING_DIFF_RESULT_IN_A_DEFAULT:
-@NM_SETTING_DIFF_RESULT_IN_B_DEFAULT:
-
-<!-- ##### FUNCTION nm_setting_diff ##### -->
-<para>
-
-</para>
-
-@a:
-@b:
-@flags:
-@invert_results:
-@results:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_enumerate_values ##### -->
-<para>
-
-</para>
-
-@setting:
-@func:
-@user_data:
-
-
-<!-- ##### FUNCTION nm_setting_to_string ##### -->
-<para>
-
-</para>
-
-@setting:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_get_secret_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@secret_name:
-@out_flags:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_set_secret_flags ##### -->
-<para>
-
-</para>
-
-@setting:
-@secret_name:
-@flags:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_setting_get_dbus_property_type ##### -->
-<para>
-
-</para>
-
-@setting:
-@property_name:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-simple-connection.sgml b/docs/libnm/tmpl/nm-simple-connection.sgml
deleted file mode 100644
index 8ef5406d8..000000000
--- a/docs/libnm/tmpl/nm-simple-connection.sgml
+++ /dev/null
@@ -1,52 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMSimpleConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION nm_simple_connection_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_simple_connection_new_from_dbus ##### -->
-<para>
-
-</para>
-
-@dict:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_simple_connection_new_clone ##### -->
-<para>
-
-</para>
-
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-utils.sgml b/docs/libnm/tmpl/nm-utils.sgml
deleted file mode 100644
index 9981cc586..000000000
--- a/docs/libnm/tmpl/nm-utils.sgml
+++ /dev/null
@@ -1,578 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-utils
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION nm_utils_is_empty_ssid ##### -->
-<para>
-
-</para>
-
-@ssid:
-@len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_escape_ssid ##### -->
-<para>
-
-</para>
-
-@ssid:
-@len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_same_ssid ##### -->
-<para>
-
-</para>
-
-@ssid1:
-@len1:
-@ssid2:
-@len2:
-@ignore_trailing_null:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ssid_to_utf8 ##### -->
-<para>
-
-</para>
-
-@ssid:
-@len:
-@Returns:
-
-
-<!-- ##### ENUM NMUtilsSecurityType ##### -->
-<para>
-
-</para>
-
-@NMU_SEC_INVALID:
-@NMU_SEC_NONE:
-@NMU_SEC_STATIC_WEP:
-@NMU_SEC_LEAP:
-@NMU_SEC_DYNAMIC_WEP:
-@NMU_SEC_WPA_PSK:
-@NMU_SEC_WPA_ENTERPRISE:
-@NMU_SEC_WPA2_PSK:
-@NMU_SEC_WPA2_ENTERPRISE:
-
-<!-- ##### FUNCTION nm_utils_security_valid ##### -->
-<para>
-
-</para>
-
-@type:
-@wifi_caps:
-@have_ap:
-@adhoc:
-@ap_flags:
-@ap_wpa:
-@ap_rsn:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ap_mode_security_valid ##### -->
-<para>
-
-</para>
-
-@type:
-@wifi_caps:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wep_key_valid ##### -->
-<para>
-
-</para>
-
-@key:
-@wep_type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wpa_psk_valid ##### -->
-<para>
-
-</para>
-
-@psk:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_dns_to_variant ##### -->
-<para>
-
-</para>
-
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_dns_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_addresses_to_variant ##### -->
-<para>
-
-</para>
-
-@addresses:
-@gateway:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_addresses_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@out_gateway:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_routes_to_variant ##### -->
-<para>
-
-</para>
-
-@routes:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_routes_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_netmask_to_prefix ##### -->
-<para>
-
-</para>
-
-@netmask:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_prefix_to_netmask ##### -->
-<para>
-
-</para>
-
-@prefix:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip4_get_default_prefix ##### -->
-<para>
-
-</para>
-
-@ip:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_dns_to_variant ##### -->
-<para>
-
-</para>
-
-@dns:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_dns_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_addresses_to_variant ##### -->
-<para>
-
-</para>
-
-@addresses:
-@gateway:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_addresses_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@out_gateway:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_routes_to_variant ##### -->
-<para>
-
-</para>
-
-@routes:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip6_routes_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip_addresses_to_variant ##### -->
-<para>
-
-</para>
-
-@addresses:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip_addresses_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@family:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip_routes_to_variant ##### -->
-<para>
-
-</para>
-
-@routes:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ip_routes_from_variant ##### -->
-<para>
-
-</para>
-
-@value:
-@family:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_uuid_generate ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_file_is_certificate ##### -->
-<para>
-
-</para>
-
-@filename:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_file_is_private_key ##### -->
-<para>
-
-</para>
-
-@filename:
-@out_encrypted:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_file_is_pkcs12 ##### -->
-<para>
-
-</para>
-
-@filename:
-@Returns:
-
-
-<!-- ##### USER_FUNCTION NMUtilsFileSearchInPathsPredicate ##### -->
-<para>
-
-</para>
-
-@filename:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_file_search_in_paths ##### -->
-<para>
-
-</para>
-
-@progname:
-@try_first:
-@paths:
-@file_test_flags:
-@predicate:
-@user_data:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_freq_to_channel ##### -->
-<para>
-
-</para>
-
-@freq:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_channel_to_freq ##### -->
-<para>
-
-</para>
-
-@channel:
-@band:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_find_next_channel ##### -->
-<para>
-
-</para>
-
-@channel:
-@direction:
-@band:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_is_channel_valid ##### -->
-<para>
-
-</para>
-
-@channel:
-@band:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_wifi_strength_bars ##### -->
-<para>
-
-</para>
-
-@strength:
-@Returns:
-
-
-<!-- ##### MACRO NM_UTILS_HWADDR_LEN_MAX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_len ##### -->
-<para>
-
-</para>
-
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_ntoa ##### -->
-<para>
-
-</para>
-
-@addr:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_atoba ##### -->
-<para>
-
-</para>
-
-@asc:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_aton ##### -->
-<para>
-
-</para>
-
-@asc:
-@buffer:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_valid ##### -->
-<para>
-
-</para>
-
-@asc:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_canonical ##### -->
-<para>
-
-</para>
-
-@asc:
-@length:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hwaddr_matches ##### -->
-<para>
-
-</para>
-
-@hwaddr1:
-@hwaddr1_len:
-@hwaddr2:
-@hwaddr2_len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_bin2hexstr ##### -->
-<para>
-
-</para>
-
-@src:
-@len:
-@final_len:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_hexstr2bin ##### -->
-<para>
-
-</para>
-
-@hex:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_iface_valid_name ##### -->
-<para>
-
-</para>
-
-@name:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_is_uuid ##### -->
-<para>
-
-</para>
-
-@str:
-@Returns:
-
-
-<!-- ##### MACRO NM_UTILS_INET_ADDRSTRLEN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_utils_inet4_ntop ##### -->
-<para>
-
-</para>
-
-@inaddr:
-@dst:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_inet6_ntop ##### -->
-<para>
-
-</para>
-
-@in6addr:
-@dst:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_ipaddr_valid ##### -->
-<para>
-
-</para>
-
-@family:
-@ip:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_utils_check_virtual_device_compatibility ##### -->
-<para>
-
-</para>
-
-@virtual_type:
-@other_type:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-version.sgml b/docs/libnm/tmpl/nm-version.sgml
deleted file mode 100644
index c27d75bd4..000000000
--- a/docs/libnm/tmpl/nm-version.sgml
+++ /dev/null
@@ -1,158 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-version
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_MAJOR_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_MINOR_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_MICRO_VERSION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_CHECK_VERSION ##### -->
-<para>
-
-</para>
-
-@major:
-@minor:
-@micro:
-
-
-<!-- ##### MACRO NM_ENCODE_VERSION ##### -->
-<para>
-
-</para>
-
-@major:
-@minor:
-@micro:
-
-
-<!-- ##### MACRO NM_VERSION_0_9_8 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VERSION_0_9_10 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VERSION_1_0 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VERSION_CUR_STABLE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VERSION_NEXT_STABLE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VERSION_MIN_REQUIRED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VERSION_MAX_ALLOWED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEPRECATED_IN_0_9_10 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEPRECATED_IN_0_9_10_FOR ##### -->
-<para>
-
-</para>
-
-@f:
-
-
-<!-- ##### MACRO NM_DEPRECATED_IN_1_0 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DEPRECATED_IN_1_0_FOR ##### -->
-<para>
-
-</para>
-
-@f:
-
-
-<!-- ##### MACRO NM_AVAILABLE_IN_0_9_10 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_AVAILABLE_IN_1_0 ##### -->
-<para>
-
-</para>
-
-
-
diff --git a/docs/libnm/tmpl/nm-vpn-connection.sgml b/docs/libnm/tmpl/nm-vpn-connection.sgml
deleted file mode 100644
index 33b7ef29b..000000000
--- a/docs/libnm/tmpl/nm-vpn-connection.sgml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMVpnConnection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_VPN_CONNECTION_VPN_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_CONNECTION_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION nm_vpn_connection_get_vpn_state ##### -->
-<para>
-
-</para>
-
-@vpn:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_connection_get_banner ##### -->
-<para>
-
-</para>
-
-@vpn:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-vpn-dbus-interface.sgml b/docs/libnm/tmpl/nm-vpn-dbus-interface.sgml
deleted file mode 100644
index c4a88fe38..000000000
--- a/docs/libnm/tmpl/nm-vpn-dbus-interface.sgml
+++ /dev/null
@@ -1,484 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-nm-vpn-dbus-interface
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_DBUS_PATH_VPN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_VPN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_PATH_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INTERFACE_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_DBUS_PLUGIN_PATH ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_DBUS_PLUGIN_INTERFACE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_NO_ACTIVE_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_NO_VPN_CONNECTIONS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_INVALID_VPN_CONNECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_ERROR_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_STARTING_IN_PROGRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_ALREADY_STARTED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_STOPPING_IN_PROGRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_ALREADY_STOPPED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_WRONG_STATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_BAD_ARGUMENTS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_LOGIN_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_LOGIN_FAILED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_CONNECT_FAILED ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_STATE_CHANGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_DBUS_VPN_SIGNAL_IP4_CONFIG ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMVpnServiceState ##### -->
-<para>
-
-</para>
-
-@NM_VPN_SERVICE_STATE_UNKNOWN:
-@NM_VPN_SERVICE_STATE_INIT:
-@NM_VPN_SERVICE_STATE_SHUTDOWN:
-@NM_VPN_SERVICE_STATE_STARTING:
-@NM_VPN_SERVICE_STATE_STARTED:
-@NM_VPN_SERVICE_STATE_STOPPING:
-@NM_VPN_SERVICE_STATE_STOPPED:
-
-<!-- ##### ENUM NMVpnConnectionState ##### -->
-<para>
-
-</para>
-
-@NM_VPN_CONNECTION_STATE_UNKNOWN:
-@NM_VPN_CONNECTION_STATE_PREPARE:
-@NM_VPN_CONNECTION_STATE_NEED_AUTH:
-@NM_VPN_CONNECTION_STATE_CONNECT:
-@NM_VPN_CONNECTION_STATE_IP_CONFIG_GET:
-@NM_VPN_CONNECTION_STATE_ACTIVATED:
-@NM_VPN_CONNECTION_STATE_FAILED:
-@NM_VPN_CONNECTION_STATE_DISCONNECTED:
-
-<!-- ##### ENUM NMVpnConnectionStateReason ##### -->
-<para>
-
-</para>
-
-@NM_VPN_CONNECTION_STATE_REASON_UNKNOWN:
-@NM_VPN_CONNECTION_STATE_REASON_NONE:
-@NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED:
-@NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED:
-@NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED:
-@NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID:
-@NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT:
-@NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT:
-@NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED:
-@NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS:
-@NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED:
-@NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED:
-
-<!-- ##### ENUM NMVpnPluginFailure ##### -->
-<para>
-
-</para>
-
-@NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED:
-@NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED:
-@NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG:
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_TUNDEV ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_HAS_IP4 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CONFIG_HAS_IP6 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_CAN_PERSIST ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_PTP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_NBNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_MSS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_BANNER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_MTU ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_PTP ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_DNS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_MSS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_ROUTES ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT ##### -->
-<para>
-
-</para>
-
-
-
diff --git a/docs/libnm/tmpl/nm-vpn-editor-plugin.sgml b/docs/libnm/tmpl/nm-vpn-editor-plugin.sgml
deleted file mode 100644
index a945515bb..000000000
--- a/docs/libnm/tmpl/nm-vpn-editor-plugin.sgml
+++ /dev/null
@@ -1,169 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMVpnEditor
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### USER_FUNCTION NMVpnEditorPluginFactory ##### -->
-<para>
-
-</para>
-
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_editor_plugin_factory ##### -->
-<para>
-
-</para>
-
-@error:
-@Returns:
-
-
-<!-- ##### ENUM NMVpnEditorPluginCapability ##### -->
-<para>
-
-</para>
-
-@NM_VPN_EDITOR_PLUGIN_CAPABILITY_NONE:
-@NM_VPN_EDITOR_PLUGIN_CAPABILITY_IMPORT:
-@NM_VPN_EDITOR_PLUGIN_CAPABILITY_EXPORT:
-@NM_VPN_EDITOR_PLUGIN_CAPABILITY_IPV6:
-
-<!-- ##### MACRO NM_VPN_EDITOR_PLUGIN_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_EDITOR_PLUGIN_DESCRIPTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_VPN_EDITOR_PLUGIN_SERVICE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### STRUCT NMVpnEditorPluginInterface ##### -->
-<para>
-
-</para>
-
-@g_iface:
-@get_editor:
-@get_capabilities:
-@import_from_file:
-@export_to_file:
-@get_suggested_filename:
-
-<!-- ##### FUNCTION nm_vpn_editor_plugin_get_editor ##### -->
-<para>
-
-</para>
-
-@plugin:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_editor_plugin_get_capabilities ##### -->
-<para>
-
-</para>
-
-@plugin:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_editor_plugin_import ##### -->
-<para>
-
-</para>
-
-@plugin:
-@path:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_editor_plugin_export ##### -->
-<para>
-
-</para>
-
-@plugin:
-@path:
-@connection:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_editor_plugin_get_suggested_filename ##### -->
-<para>
-
-</para>
-
-@plugin:
-@connection:
-@Returns:
-
-
-<!-- ##### STRUCT NMVpnEditorInterface ##### -->
-<para>
-
-</para>
-
-@g_iface:
-@get_widget:
-@placeholder:
-@update_connection:
-@changed:
-
-<!-- ##### FUNCTION nm_vpn_editor_get_widget ##### -->
-<para>
-
-</para>
-
-@editor:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_vpn_editor_update_connection ##### -->
-<para>
-
-</para>
-
-@editor:
-@connection:
-@error:
-@Returns:
-
-
diff --git a/docs/libnm/tmpl/nm-wimax-nsp.sgml b/docs/libnm/tmpl/nm-wimax-nsp.sgml
deleted file mode 100644
index ceb026016..000000000
--- a/docs/libnm/tmpl/nm-wimax-nsp.sgml
+++ /dev/null
@@ -1,102 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-NMWimaxNsp
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO NM_WIMAX_NSP_NAME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_WIMAX_NSP_SIGNAL_QUALITY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO NM_WIMAX_NSP_NETWORK_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM NMWimaxNspNetworkType ##### -->
-<para>
-
-</para>
-
-@NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN:
-@NM_WIMAX_NSP_NETWORK_TYPE_HOME:
-@NM_WIMAX_NSP_NETWORK_TYPE_PARTNER:
-@NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER:
-
-<!-- ##### FUNCTION nm_wimax_nsp_get_name ##### -->
-<para>
-
-</para>
-
-@nsp:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_get_signal_quality ##### -->
-<para>
-
-</para>
-
-@nsp:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_get_network_type ##### -->
-<para>
-
-</para>
-
-@nsp:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_filter_connections ##### -->
-<para>
-
-</para>
-
-@nsp:
-@connections:
-@Returns:
-
-
-<!-- ##### FUNCTION nm_wimax_nsp_connection_valid ##### -->
-<para>
-
-</para>
-
-@nsp:
-@connection:
-@Returns:
-
-
diff --git a/docs/libnm/version.xml b/docs/libnm/version.xml
index 6d7de6e6a..ee90284c2 100644
--- a/docs/libnm/version.xml
+++ b/docs/libnm/version.xml
@@ -1 +1 @@
-1.0.2
+1.0.4
diff --git a/examples/C/Makefile.in b/examples/C/Makefile.in
index f9eec7975..0d6062873 100644
--- a/examples/C/Makefile.in
+++ b/examples/C/Makefile.in
@@ -196,6 +196,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -309,6 +310,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/C/glib/Makefile.in b/examples/C/glib/Makefile.in
index b404d0da2..9c18e61f4 100644
--- a/examples/C/glib/Makefile.in
+++ b/examples/C/glib/Makefile.in
@@ -234,6 +234,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -347,6 +348,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/C/qt/Makefile.in b/examples/C/qt/Makefile.in
index 3f89c11c1..7758476d8 100644
--- a/examples/C/qt/Makefile.in
+++ b/examples/C/qt/Makefile.in
@@ -206,6 +206,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -319,6 +320,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/Makefile.in b/examples/Makefile.in
index 0228abd0e..9e3a806b4 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -195,6 +195,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -308,6 +309,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/dispatcher/Makefile.in b/examples/dispatcher/Makefile.in
index 96174d84f..fba9c8207 100644
--- a/examples/dispatcher/Makefile.in
+++ b/examples/dispatcher/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/python/Makefile.in b/examples/python/Makefile.in
index 071e07913..d94a2675b 100644
--- a/examples/python/Makefile.in
+++ b/examples/python/Makefile.in
@@ -195,6 +195,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -308,6 +309,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/python/dbus/Makefile.in b/examples/python/dbus/Makefile.in
index 3b8862515..784997e1f 100644
--- a/examples/python/dbus/Makefile.in
+++ b/examples/python/dbus/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/python/gi/Makefile.in b/examples/python/gi/Makefile.in
index 980390a12..18e395e9a 100644
--- a/examples/python/gi/Makefile.in
+++ b/examples/python/gi/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/ruby/Makefile.in b/examples/ruby/Makefile.in
index 626b5ed39..b39603347 100644
--- a/examples/ruby/Makefile.in
+++ b/examples/ruby/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/examples/shell/Makefile.in b/examples/shell/Makefile.in
index f6f090526..d22c113ef 100644
--- a/examples/shell/Makefile.in
+++ b/examples/shell/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/gtk-doc.make b/gtk-doc.make
index dd319930f..9ccd0b04b 100644
--- a/gtk-doc.make
+++ b/gtk-doc.make
@@ -25,6 +25,7 @@ TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
SETUP_FILES = \
$(content_files) \
+ $(expand_content_files) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE)-sections.txt \
$(DOC_MODULE)-overrides.txt
@@ -33,9 +34,9 @@ EXTRA_DIST = \
$(HTML_IMAGES) \
$(SETUP_FILES)
-DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
@@ -86,21 +87,19 @@ GTK_DOC_V_SETUP_0=@echo " DOC Preparing build";
setup-build.stamp:
-$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \
+ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \
if test "x$$files" != "x" ; then \
for file in $$files ; do \
- destdir=`dirname $(abs_builddir)/$$file` ;\
+ destdir=`dirname $(abs_builddir)/$$file`; \
test -d "$$destdir" || mkdir -p "$$destdir"; \
test -f $(abs_srcdir)/$$file && \
cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -pR $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
$(AM_V_at)touch setup-build.stamp
+
#### scan ####
GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V))
@@ -120,7 +119,7 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \
scanobj_options=""; \
gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
scanobj_options="--verbose"; \
fi; \
@@ -137,35 +136,14 @@ scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB)
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-#### templates ####
-
-GTK_DOC_V_TMPL=$(GTK_DOC_V_TMPL_$(V))
-GTK_DOC_V_TMPL_=$(GTK_DOC_V_TMPL_$(AM_DEFAULT_VERBOSITY))
-GTK_DOC_V_TMPL_0=@echo " DOC Rebuilding template files";
-
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- $(GTK_DOC_V_TMPL)gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- $(AM_V_at)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -pR $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- $(AM_V_at)touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
#### xml ####
GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V))
GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_XML_0=@echo " DOC Building XML";
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
- -$(GTK_DOC_V_XML)chmod -R u+w $(srcdir) && _source_dir='' ; \
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
+ $(GTK_DOC_V_XML)_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
done ; \
@@ -185,17 +163,17 @@ GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V))
GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references";
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_HTML)rm -rf html && mkdir html && \
mkhtml_options=""; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkhtml_options="$$mkhtml_options --verbose"; \
fi; \
fi; \
gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \
fi; \
cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
@@ -217,11 +195,11 @@ GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V))
GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY))
GTK_DOC_V_PDF_0=@echo " DOC Building PDF";
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
+pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files)
$(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \
mkpdf_options=""; \
gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \
- if test "$(?)" = "0"; then \
+ if test "$$?" = "0"; then \
if test "x$(V)" = "x1"; then \
mkpdf_options="$$mkpdf_options --verbose"; \
fi; \
@@ -246,13 +224,15 @@ clean-local:
@if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \
rm -f $(DOC_MODULE).types; \
fi
+ @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \
+ rm -f $(DOC_MODULE)-sections.txt; \
+ fi
distclean-local:
@rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
+ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \
fi
maintainer-clean-local:
@@ -302,9 +282,7 @@ dist-check-gtkdoc:
endif
dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
diff --git a/include/Makefile.am b/include/Makefile.am
index 6e84a5b63..ff7eac8c2 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -4,6 +4,6 @@ EXTRA_DIST = \
nm-glib-compat.h \
nm-gvaluearray-compat.h \
nm-test-utils.h \
- nm-utils-internal.h
+ nm-macros-internal.h
CLEANFILES=nm-version.h
diff --git a/include/Makefile.in b/include/Makefile.in
index 016710b63..3dbcc3384 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -397,7 +399,7 @@ EXTRA_DIST = \
nm-glib-compat.h \
nm-gvaluearray-compat.h \
nm-test-utils.h \
- nm-utils-internal.h
+ nm-macros-internal.h
CLEANFILES = nm-version.h
all: all-am
diff --git a/include/nm-glib-compat.h b/include/nm-glib-compat.h
index 1dc939fea..dc39d2b93 100644
--- a/include/nm-glib-compat.h
+++ b/include/nm-glib-compat.h
@@ -23,6 +23,7 @@
#include <glib.h>
#include <glib-object.h>
+#include <string.h>
#ifdef __clang__
@@ -163,4 +164,90 @@ q_n##_quark (void) \
}
#endif
+
+static inline gboolean
+nm_g_hash_table_replace (GHashTable *hash, gpointer key, gpointer value)
+{
+ /* glib 2.40 added a return value indicating whether the key already existed
+ * (910191597a6c2e5d5d460e9ce9efb4f47d9cc63c). */
+#if GLIB_CHECK_VERSION(2, 40, 0)
+ return g_hash_table_replace (hash, key, value);
+#else
+ gboolean contained = g_hash_table_contains (hash, key);
+
+ g_hash_table_replace (hash, key, value);
+ return !contained;
+#endif
+}
+
+
+#if !GLIB_CHECK_VERSION(2, 40, 0) || defined (NM_GLIB_COMPAT_H_TEST)
+static inline void
+_nm_g_ptr_array_insert (GPtrArray *array,
+ gint index_,
+ gpointer data)
+{
+ g_return_if_fail (array);
+ g_return_if_fail (index_ >= -1);
+ g_return_if_fail (index_ <= (gint) array->len);
+
+ g_ptr_array_add (array, data);
+
+ if (index_ != -1 && index_ != (gint) (array->len - 1)) {
+ memmove (&(array->pdata[index_ + 1]),
+ &(array->pdata[index_]),
+ (array->len - index_ - 1) * sizeof (gpointer));
+ array->pdata[index_] = data;
+ }
+}
+#endif
+#if !GLIB_CHECK_VERSION(2, 40, 0)
+#define g_ptr_array_insert(array, index, data) G_STMT_START { _nm_g_ptr_array_insert (array, index, data); } G_STMT_END
+#else
+#define g_ptr_array_insert(array, index, data) \
+ G_STMT_START { \
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
+ g_ptr_array_insert (array, index, data); \
+ G_GNUC_END_IGNORE_DEPRECATIONS \
+ } G_STMT_END
+#endif
+
+
+#if !GLIB_CHECK_VERSION (2, 40, 0)
+inline static gboolean
+_g_key_file_save_to_file (GKeyFile *key_file,
+ const gchar *filename,
+ GError **error)
+{
+ gchar *contents;
+ gboolean success;
+ gsize length;
+
+ g_return_val_if_fail (key_file != NULL, FALSE);
+ g_return_val_if_fail (filename != NULL, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ contents = g_key_file_to_data (key_file, &length, NULL);
+ g_assert (contents != NULL);
+
+ success = g_file_set_contents (filename, contents, length, error);
+ g_free (contents);
+
+ return success;
+}
+#define g_key_file_save_to_file(key_file, filename, error) \
+ _g_key_file_save_to_file (key_file, filename, error)
+#else
+#define g_key_file_save_to_file(key_file, filename, error) \
+ ({ \
+ gboolean _success; \
+ \
+ G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
+ _success = g_key_file_save_to_file (key_file, filename, error); \
+ G_GNUC_END_IGNORE_DEPRECATIONS \
+ _success; \
+ })
+#endif
+
+
#endif /* __NM_GLIB_COMPAT_H__ */
diff --git a/include/nm-utils-internal.h b/include/nm-macros-internal.h
index 227a210b2..405051f38 100644
--- a/include/nm-utils-internal.h
+++ b/include/nm-macros-internal.h
@@ -19,8 +19,8 @@
* (C) Copyright 2014 Red Hat, Inc.
*/
-#ifndef __NM_UTILS_INTERNAL_H__
-#define __NM_UTILS_INTERNAL_H__
+#ifndef __NM_MACROS_INTERNAL_H__
+#define __NM_MACROS_INTERNAL_H__
#include <glib.h>
@@ -100,6 +100,19 @@
_found; \
})
+#define NM_PRINT_FMT_QUOTED(cond, prefix, str, suffix, str_else) \
+ (cond) ? (prefix) : "", \
+ (cond) ? (str) : (str_else), \
+ (cond) ? (suffix) : ""
+
+/*****************************************************************************/
+
+#ifdef NM_MORE_ASSERTS
+#define nm_assert(cond) G_STMT_START { g_assert (cond); } G_STMT_END
+#else
+#define nm_assert(cond) G_STMT_START { if (FALSE) { if (cond) { } } } G_STMT_END
+#endif
+
/*****************************************************************************/
#define NM_DEFINE_SINGLETON_INSTANCE(TYPE) \
@@ -173,4 +186,63 @@ nm_clear_g_source (guint *id)
/*****************************************************************************/
-#endif
+/* Determine whether @x is a power of two (@x being an integer type).
+ * For the special cases @x equals zero or one, it also returns true.
+ * For negative @x, always returns FALSE. That only applies, if the data
+ * type of @x is signed. */
+#define nm_utils_is_power_of_two(x) ({ \
+ const typeof(x) __x = (x); \
+ \
+ ((__x & (__x - 1)) == 0) && \
+ /* Check if the value is negative. In that case, return FALSE.
+ * The first expression is a compile time constant, depending on whether
+ * the type is signed. The second expression is a clumsy way for (__x >= 0),
+ * which causes a compiler warning for unsigned types. */ \
+ ( ( ((typeof(__x)) -1) > ((typeof(__x)) 0) ) || (__x > 0) || (__x == 0) ); \
+ })
+
+/*****************************************************************************/
+
+/* check if @flags has exactly one flag (@check) set. You should call this
+ * only with @check being a compile time constant and a power of two. */
+#define NM_FLAGS_HAS(flags, check) \
+ ( (G_STATIC_ASSERT_EXPR ( ((check) != 0) && ((check) & ((check)-1)) == 0 )), (NM_FLAGS_ANY ((flags), (check))) )
+
+#define NM_FLAGS_ANY(flags, check) ( ( ((flags) & (check)) != 0 ) ? TRUE : FALSE )
+#define NM_FLAGS_ALL(flags, check) ( ( ((flags) & (check)) == (check) ) ? TRUE : FALSE )
+
+#define NM_FLAGS_SET(flags, val) ({ \
+ const typeof(flags) _flags = (flags); \
+ const typeof(flags) _val = (val); \
+ \
+ _flags | _val; \
+ })
+
+#define NM_FLAGS_UNSET(flags, val) ({ \
+ const typeof(flags) _flags = (flags); \
+ const typeof(flags) _val = (val); \
+ \
+ _flags & (~_val); \
+ })
+
+#define NM_FLAGS_ASSIGN(flags, val, assign) ({ \
+ const typeof(flags) _flags = (flags); \
+ const typeof(flags) _val = (val); \
+ \
+ (assign) \
+ ? _flags | (_val) \
+ : _flags & (~_val); \
+ })
+
+/*****************************************************************************/
+
+static inline char *
+nm_strstrip (char *str)
+{
+ /* g_strstrip doesn't like NULL. */
+ return str ? g_strstrip (str) : NULL;
+}
+
+/*****************************************************************************/
+
+#endif /* __NM_MACROS_INTERNAL_H__ */
diff --git a/include/nm-test-utils.h b/include/nm-test-utils.h
index 5f83d09da..258d39370 100644
--- a/include/nm-test-utils.h
+++ b/include/nm-test-utils.h
@@ -92,13 +92,14 @@
#include <errno.h>
#include "nm-utils.h"
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
#include "nm-glib-compat.h"
#include "gsystem-local-alloc.h"
-
-/* Analog to EXIT_SUCCESS and EXIT_FAILURE. */
-#define EXIT_SKIP (77)
+#ifdef __NETWORKMANAGER_LOGGING_H__
+/* We are running tests under src/ */
+#include "NetworkManagerUtils.h"
+#endif
/*******************************************************************************/
@@ -122,6 +123,14 @@ nmtst_assert_error (GError *error,
}
}
+inline static void
+_nmtst_assert_success (gboolean success, GError *error, const char *file, int line)
+{
+ if (!success || error)
+ g_error ("(%s:%d) FAILURE success=%d, error=%s", file, line, success, error && error->message ? error->message : "(no error)");
+}
+#define nmtst_assert_success(success, error) _nmtst_assert_success ((success), (error), __FILE__, __LINE__)
+
/*******************************************************************************/
struct __nmtst_internal
@@ -258,6 +267,11 @@ __nmtst_init (int *argc, char ***argv, gboolean assert_logging, const char *log_
g_assert (!argc || (g_strv_length (*argv) == *argc));
g_assert (!assert_logging || (!log_level && !log_domains));
+#ifdef __NETWORKMANAGER_UTILS_H__
+ if (!nm_utils_get_testing_initialized ())
+ _nm_utils_set_testing (_NM_UTILS_TEST_GENERAL);
+#endif
+
if (argc)
__nmtst_internal.orig_argv = g_strdupv (*argv);
@@ -710,6 +724,39 @@ __nmtst_spawn_sync (const char *working_directory, char **standard_out, char **s
/*******************************************************************************/
+inline static char *
+nmtst_file_resolve_relative_path (const char *rel, const char *cwd)
+{
+ gs_free char *cwd_free = NULL;
+
+ g_assert (rel && *rel);
+
+ if (g_path_is_absolute (rel))
+ return g_strdup (rel);
+
+ if (!cwd)
+ cwd = cwd_free = g_get_current_dir ();
+ return g_build_filename (cwd, rel, NULL);
+}
+
+inline static void
+_nmtst_assert_resolve_relative_path_equals (const char *f1, const char *f2, const char *file, int line)
+{
+ gs_free char *p1 = NULL, *p2 = NULL;
+
+ p1 = nmtst_file_resolve_relative_path (f1, NULL);
+ p2 = nmtst_file_resolve_relative_path (f2, NULL);
+ g_assert (p1 && *p1);
+
+ /* Fixme: later we might need to coalesce repeated '/', "./", and "../".
+ * For now, it's good enough. */
+ if (g_strcmp0 (p1, p2) != 0)
+ g_error ("%s:%d : filenames don't match \"%s\" vs. \"%s\" // \"%s\" - \"%s\"", file, line, f1, f2, p1, p2);
+}
+#define nmtst_assert_resolve_relative_path_equals(f1, f2) _nmtst_assert_resolve_relative_path_equals (f1, f2, __FILE__, __LINE__);
+
+/*******************************************************************************/
+
#ifdef __NETWORKMANAGER_PLATFORM_H__
inline static NMPlatformIP6Address *
@@ -742,6 +789,38 @@ nmtst_platform_ip6_address_full (const char *address, const char *peer_address,
return addr;
}
+inline static NMPlatformIP4Route *
+nmtst_platform_ip4_route (const char *network, guint plen, const char *gateway)
+{
+ static NMPlatformIP4Route route;
+
+ memset (&route, 0, sizeof (route));
+ route.network = nmtst_inet4_from_string (network);
+ route.plen = plen;
+ route.gateway = nmtst_inet4_from_string (gateway);
+
+ return &route;
+}
+
+inline static NMPlatformIP4Route *
+nmtst_platform_ip4_route_full (const char *network, guint plen, const char *gateway,
+ int ifindex, NMIPConfigSource source,
+ guint metric, guint mss,
+ guint8 scope,
+ const char *pref_src)
+{
+ NMPlatformIP4Route *route = nmtst_platform_ip4_route (network, plen, gateway);
+
+ route->ifindex = ifindex;
+ route->source = source;
+ route->metric = metric;
+ route->mss = mss;
+ route->scope_inv = nm_platform_route_scope_inv (scope);
+ route->pref_src = nmtst_inet4_from_string (pref_src);
+
+ return route;
+}
+
inline static NMPlatformIP6Route *
nmtst_platform_ip6_route (const char *network, guint plen, const char *gateway)
{
@@ -799,9 +878,6 @@ nmtst_platform_ip4_routes_equal (const NMPlatformIP4Route *a, const NMPlatformIP
nmtst_static_1024_02 (nm_platform_ip4_route_to_string (&b[i])));
g_assert_not_reached ();
}
-
- /* also check with memcmp, though this might fail for valid programs (due to field alignment) */
- g_assert_cmpint (memcmp (&a[i], &b[i], sizeof (a[i])), ==, 0);
}
}
@@ -834,9 +910,6 @@ nmtst_platform_ip6_routes_equal (const NMPlatformIP6Route *a, const NMPlatformIP
nmtst_static_1024_02 (nm_platform_ip6_route_to_string (&b[i])));
g_assert_not_reached ();
}
-
- /* also check with memcmp, though this might fail for valid programs (due to field alignment) */
- g_assert_cmpint (memcmp (&a[i], &b[i], sizeof (a[i])), ==, 0);
}
}
@@ -1193,6 +1266,36 @@ nmtst_assert_hwaddr_equals (gconstpointer hwaddr1, gssize hwaddr1_len, const cha
nmtst_assert_hwaddr_equals (hwaddr1, hwaddr1_len, expected, G_STRLOC)
#endif
+#if defined(__NM_SIMPLE_CONNECTION_H__) && defined(__NM_SETTING_CONNECTION_H__) && defined(__NM_KEYFILE_INTERNAL_H__)
+
+inline static NMConnection *
+nmtst_create_connection_from_keyfile (const char *keyfile_str, const char *keyfile_name, const char *base_dir)
+{
+ GKeyFile *keyfile;
+ GError *error = NULL;
+ gboolean success;
+ NMConnection *con;
+
+ g_assert (keyfile_str);
+
+ keyfile = g_key_file_new ();
+ success = g_key_file_load_from_data (keyfile, keyfile_str, strlen (keyfile_str), G_KEY_FILE_NONE, &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+ con = nm_keyfile_read (keyfile, keyfile_name, base_dir, NULL, NULL, &error);
+ g_assert_no_error (error);
+ g_assert (NM_IS_CONNECTION (con));
+
+ g_key_file_unref (keyfile);
+
+ nmtst_connection_normalize (con);
+
+ return con;
+}
+
+#endif
+
#ifdef __NM_CONNECTION_H__
typedef enum {
diff --git a/introspection/Makefile.in b/introspection/Makefile.in
index 1f358d478..d9f37a991 100644
--- a/introspection/Makefile.in
+++ b/introspection/Makefile.in
@@ -198,6 +198,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -311,6 +312,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/introspection/nm-device.xml b/introspection/nm-device.xml
index 0c2a330c0..e405a384b 100644
--- a/introspection/nm-device.xml
+++ b/introspection/nm-device.xml
@@ -637,6 +637,21 @@
The SIM PIN was incorrect.
</tp:docstring>
</tp:enumvalue>
+ <tp:enumvalue suffix="NEW_ACTIVATION" value="60">
+ <tp:docstring>
+ A new connection activation was enqueued.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="PARENT_CHANGED" value="61">
+ <tp:docstring>
+ The device's parent changed.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="PARENT_MANAGED_CHANGED" value="62">
+ <tp:docstring>
+ The device parent's management changed.
+ </tp:docstring>
+ </tp:enumvalue>
</tp:enum>
<tp:struct name="NM_DEVICE_STATE_REASON_STRUCT">
diff --git a/libnm-core/Makefile.in b/libnm-core/Makefile.in
index 7ceb3cfaf..6f502e387 100644
--- a/libnm-core/Makefile.in
+++ b/libnm-core/Makefile.in
@@ -132,14 +132,15 @@ libnm_core_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_3)
am__libnm_core_la_SOURCES_DIST = $(core_build)/nm-core-enum-types.c \
$(core)/crypto.c $(core)/nm-connection.c $(core)/nm-errors.c \
- $(core)/nm-property-compare.c $(core)/nm-setting-8021x.c \
- $(core)/nm-setting-adsl.c $(core)/nm-setting-bluetooth.c \
- $(core)/nm-setting-bond.c $(core)/nm-setting-bridge-port.c \
- $(core)/nm-setting-bridge.c $(core)/nm-setting-cdma.c \
- $(core)/nm-setting-connection.c $(core)/nm-setting-dcb.c \
- $(core)/nm-setting-generic.c $(core)/nm-setting-gsm.c \
- $(core)/nm-setting-infiniband.c $(core)/nm-setting-ip-config.c \
- $(core)/nm-setting-ip4-config.c \
+ $(core)/nm-keyfile-reader.c $(core)/nm-keyfile-utils.c \
+ $(core)/nm-keyfile-writer.c $(core)/nm-property-compare.c \
+ $(core)/nm-setting-8021x.c $(core)/nm-setting-adsl.c \
+ $(core)/nm-setting-bluetooth.c $(core)/nm-setting-bond.c \
+ $(core)/nm-setting-bridge-port.c $(core)/nm-setting-bridge.c \
+ $(core)/nm-setting-cdma.c $(core)/nm-setting-connection.c \
+ $(core)/nm-setting-dcb.c $(core)/nm-setting-generic.c \
+ $(core)/nm-setting-gsm.c $(core)/nm-setting-infiniband.c \
+ $(core)/nm-setting-ip-config.c $(core)/nm-setting-ip4-config.c \
$(core)/nm-setting-ip6-config.c $(core)/nm-setting-olpc-mesh.c \
$(core)/nm-setting-ppp.c $(core)/nm-setting-pppoe.c \
$(core)/nm-setting-serial.c $(core)/nm-setting-team-port.c \
@@ -150,14 +151,17 @@ am__libnm_core_la_SOURCES_DIST = $(core_build)/nm-core-enum-types.c \
$(core)/nm-setting-wireless.c $(core)/nm-setting.c \
$(core)/nm-simple-connection.c $(core)/nm-utils.c \
$(core)/crypto.h $(core)/nm-connection-private.h \
- $(core)/nm-core-internal.h $(core)/nm-property-compare.h \
+ $(core)/nm-core-internal.h $(core)/nm-keyfile-internal.h \
+ $(core)/nm-keyfile-utils.h $(core)/nm-property-compare.h \
$(core)/nm-setting-private.h $(core)/nm-utils-private.h \
crypto_gnutls.c crypto_nss.c
am__objects_1 = nm-core-enum-types.lo crypto.lo nm-connection.lo \
- nm-errors.lo nm-property-compare.lo nm-setting-8021x.lo \
- nm-setting-adsl.lo nm-setting-bluetooth.lo nm-setting-bond.lo \
- nm-setting-bridge-port.lo nm-setting-bridge.lo \
- nm-setting-cdma.lo nm-setting-connection.lo nm-setting-dcb.lo \
+ nm-errors.lo nm-keyfile-reader.lo nm-keyfile-utils.lo \
+ nm-keyfile-writer.lo nm-property-compare.lo \
+ nm-setting-8021x.lo nm-setting-adsl.lo nm-setting-bluetooth.lo \
+ nm-setting-bond.lo nm-setting-bridge-port.lo \
+ nm-setting-bridge.lo nm-setting-cdma.lo \
+ nm-setting-connection.lo nm-setting-dcb.lo \
nm-setting-generic.lo nm-setting-gsm.lo \
nm-setting-infiniband.lo nm-setting-ip-config.lo \
nm-setting-ip4-config.lo nm-setting-ip6-config.lo \
@@ -315,6 +319,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -428,6 +433,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -622,6 +628,8 @@ libnm_core_private_headers = \
$(core)/crypto.h \
$(core)/nm-connection-private.h \
$(core)/nm-core-internal.h \
+ $(core)/nm-keyfile-internal.h \
+ $(core)/nm-keyfile-utils.h \
$(core)/nm-property-compare.h \
$(core)/nm-setting-private.h \
$(core)/nm-utils-private.h
@@ -631,6 +639,9 @@ libnm_core_sources = \
$(core)/crypto.c \
$(core)/nm-connection.c \
$(core)/nm-errors.c \
+ $(core)/nm-keyfile-reader.c \
+ $(core)/nm-keyfile-utils.c \
+ $(core)/nm-keyfile-writer.c \
$(core)/nm-property-compare.c \
$(core)/nm-setting-8021x.c \
$(core)/nm-setting-adsl.c \
@@ -742,6 +753,9 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-connection.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-core-enum-types.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-errors.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-keyfile-reader.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-keyfile-utils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-keyfile-writer.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-property-compare.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-setting-8021x.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-setting-adsl.Plo@am__quote@
@@ -823,6 +837,27 @@ nm-errors.lo: $(core)/nm-errors.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-errors.lo `test -f '$(core)/nm-errors.c' || echo '$(srcdir)/'`$(core)/nm-errors.c
+nm-keyfile-reader.lo: $(core)/nm-keyfile-reader.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-keyfile-reader.lo -MD -MP -MF $(DEPDIR)/nm-keyfile-reader.Tpo -c -o nm-keyfile-reader.lo `test -f '$(core)/nm-keyfile-reader.c' || echo '$(srcdir)/'`$(core)/nm-keyfile-reader.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-keyfile-reader.Tpo $(DEPDIR)/nm-keyfile-reader.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(core)/nm-keyfile-reader.c' object='nm-keyfile-reader.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-keyfile-reader.lo `test -f '$(core)/nm-keyfile-reader.c' || echo '$(srcdir)/'`$(core)/nm-keyfile-reader.c
+
+nm-keyfile-utils.lo: $(core)/nm-keyfile-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-keyfile-utils.lo -MD -MP -MF $(DEPDIR)/nm-keyfile-utils.Tpo -c -o nm-keyfile-utils.lo `test -f '$(core)/nm-keyfile-utils.c' || echo '$(srcdir)/'`$(core)/nm-keyfile-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-keyfile-utils.Tpo $(DEPDIR)/nm-keyfile-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(core)/nm-keyfile-utils.c' object='nm-keyfile-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-keyfile-utils.lo `test -f '$(core)/nm-keyfile-utils.c' || echo '$(srcdir)/'`$(core)/nm-keyfile-utils.c
+
+nm-keyfile-writer.lo: $(core)/nm-keyfile-writer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-keyfile-writer.lo -MD -MP -MF $(DEPDIR)/nm-keyfile-writer.Tpo -c -o nm-keyfile-writer.lo `test -f '$(core)/nm-keyfile-writer.c' || echo '$(srcdir)/'`$(core)/nm-keyfile-writer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-keyfile-writer.Tpo $(DEPDIR)/nm-keyfile-writer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(core)/nm-keyfile-writer.c' object='nm-keyfile-writer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-keyfile-writer.lo `test -f '$(core)/nm-keyfile-writer.c' || echo '$(srcdir)/'`$(core)/nm-keyfile-writer.c
+
nm-property-compare.lo: $(core)/nm-property-compare.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-property-compare.lo -MD -MP -MF $(DEPDIR)/nm-property-compare.Tpo -c -o nm-property-compare.lo `test -f '$(core)/nm-property-compare.c' || echo '$(srcdir)/'`$(core)/nm-property-compare.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-property-compare.Tpo $(DEPDIR)/nm-property-compare.Plo
diff --git a/libnm-core/Makefile.libnm-core b/libnm-core/Makefile.libnm-core
index fc6d779b5..09a80c714 100644
--- a/libnm-core/Makefile.libnm-core
+++ b/libnm-core/Makefile.libnm-core
@@ -48,6 +48,8 @@ libnm_core_private_headers = \
$(core)/crypto.h \
$(core)/nm-connection-private.h \
$(core)/nm-core-internal.h \
+ $(core)/nm-keyfile-internal.h \
+ $(core)/nm-keyfile-utils.h \
$(core)/nm-property-compare.h \
$(core)/nm-setting-private.h \
$(core)/nm-utils-private.h
@@ -57,6 +59,9 @@ libnm_core_sources = \
$(core)/crypto.c \
$(core)/nm-connection.c \
$(core)/nm-errors.c \
+ $(core)/nm-keyfile-reader.c \
+ $(core)/nm-keyfile-utils.c \
+ $(core)/nm-keyfile-writer.c \
$(core)/nm-property-compare.c \
$(core)/nm-setting-8021x.c \
$(core)/nm-setting-adsl.c \
diff --git a/libnm-core/nm-core-enum-types.c b/libnm-core/nm-core-enum-types.c
index e4cf177c0..cfb264cfb 100644
--- a/libnm-core/nm-core-enum-types.c
+++ b/libnm-core/nm-core-enum-types.c
@@ -401,6 +401,8 @@ nm_device_state_reason_get_type (void)
{ NM_DEVICE_STATE_REASON_MODEM_AVAILABLE, "NM_DEVICE_STATE_REASON_MODEM_AVAILABLE", "modem-available" },
{ NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT, "NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT", "sim-pin-incorrect" },
{ NM_DEVICE_STATE_REASON_NEW_ACTIVATION, "NM_DEVICE_STATE_REASON_NEW_ACTIVATION", "new-activation" },
+ { NM_DEVICE_STATE_REASON_PARENT_CHANGED, "NM_DEVICE_STATE_REASON_PARENT_CHANGED", "parent-changed" },
+ { NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED, "NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED", "parent-managed-changed" },
{ 0, NULL, NULL }
};
GType g_define_type_id =
@@ -716,6 +718,26 @@ nm_setting_802_1x_ck_scheme_get_type (void)
return g_define_type_id__volatile;
}
GType
+nm_setting_connection_autoconnect_slaves_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT, "NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT", "default" },
+ { NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO, "NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO", "no" },
+ { NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES, "NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES", "yes" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("NMSettingConnectionAutoconnectSlaves"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
nm_setting_dcb_flags_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
diff --git a/libnm-core/nm-core-enum-types.h b/libnm-core/nm-core-enum-types.h
index 162b704eb..abc646b20 100644
--- a/libnm-core/nm-core-enum-types.h
+++ b/libnm-core/nm-core-enum-types.h
@@ -61,6 +61,8 @@ GType nm_setting_802_1x_ck_format_get_type (void) G_GNUC_CONST;
#define NM_TYPE_SETTING_802_1X_CK_FORMAT (nm_setting_802_1x_ck_format_get_type ())
GType nm_setting_802_1x_ck_scheme_get_type (void) G_GNUC_CONST;
#define NM_TYPE_SETTING_802_1X_CK_SCHEME (nm_setting_802_1x_ck_scheme_get_type ())
+GType nm_setting_connection_autoconnect_slaves_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_SETTING_CONNECTION_AUTOCONNECT_SLAVES (nm_setting_connection_autoconnect_slaves_get_type ())
GType nm_setting_dcb_flags_get_type (void) G_GNUC_CONST;
#define NM_TYPE_SETTING_DCB_FLAGS (nm_setting_dcb_flags_get_type ())
GType nm_setting_ip6_config_privacy_get_type (void) G_GNUC_CONST;
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
index 9f4b33e34..dd5151e08 100644
--- a/libnm-core/nm-core-internal.h
+++ b/libnm-core/nm-core-internal.h
@@ -110,18 +110,39 @@ GPtrArray *_nm_utils_copy_array (const GPtrArray *array,
GDestroyNotify free_func);
GPtrArray *_nm_utils_copy_object_array (const GPtrArray *array);
+gssize _nm_utils_ptrarray_find_first (gpointer *list, gssize len, gconstpointer needle);
+
+gssize _nm_utils_ptrarray_find_binary_search (gpointer *list, gsize len, gpointer needle, GCompareDataFunc cmpfcn, gpointer user_data);
+
gboolean _nm_utils_string_in_list (const char *str,
const char **valid_strings);
+gssize _nm_utils_strv_find_first (char **list, gssize len, const char *needle);
+
+char **_nm_utils_strv_cleanup (char **strv,
+ gboolean strip_whitespace,
+ gboolean skip_empty,
+ gboolean skip_repeated);
+
char ** _nm_utils_strsplit_set (const char *str,
const char *delimiters,
int max_tokens);
+GSList * _nm_utils_strv_to_slist (char **strv, gboolean deep_copy);
+char ** _nm_utils_slist_to_strv (GSList *slist, gboolean deep_copy);
+
+GPtrArray * _nm_utils_strv_to_ptrarray (char **strv);
+char ** _nm_utils_ptrarray_to_strv (GPtrArray *ptrarray);
+
#define NM_UTILS_UUID_TYPE_LEGACY 0
#define NM_UTILS_UUID_TYPE_VARIANT3 1
char *nm_utils_uuid_generate_from_string (const char *s, gssize slen, int uuid_type, gpointer type_args);
+#define NM_UTILS_UUID_NS "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905"
+
+char *_nm_utils_uuid_generate_from_strings (const char *string1, ...) G_GNUC_NULL_TERMINATED;
+
void _nm_dbus_errors_init (void);
extern gboolean _nm_utils_is_manager_process;
@@ -136,4 +157,6 @@ GByteArray *nm_utils_rsa_key_encrypt (const guint8 *data,
int nm_utils_bond_mode_string_to_int (const char *mode);
const char *nm_utils_bond_mode_int_to_string (int mode);
+gint64 _nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback);
+
#endif
diff --git a/libnm-core/nm-dbus-interface.h b/libnm-core/nm-dbus-interface.h
index 9bab80f35..ccc3b3a9e 100644
--- a/libnm-core/nm-dbus-interface.h
+++ b/libnm-core/nm-dbus-interface.h
@@ -467,6 +467,8 @@ typedef enum {
* @NM_DEVICE_STATE_REASON_MODEM_AVAILABLE: Modem now ready and available
* @NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT: SIM PIN was incorrect
* @NM_DEVICE_STATE_REASON_NEW_ACTIVATION: New connection activation was enqueued
+ * @NM_DEVICE_STATE_REASON_PARENT_CHANGED: the device's parent changed
+ * @NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED: the device parent's management changed
*
* Device state change reason codes
*
@@ -534,6 +536,8 @@ typedef enum {
NM_DEVICE_STATE_REASON_MODEM_AVAILABLE = 58,
NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT = 59,
NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60,
+ NM_DEVICE_STATE_REASON_PARENT_CHANGED = 61,
+ NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED = 62,
} NMDeviceStateReason;
diff --git a/libnm-core/nm-keyfile-internal.h b/libnm-core/nm-keyfile-internal.h
new file mode 100644
index 000000000..f4bb07963
--- /dev/null
+++ b/libnm-core/nm-keyfile-internal.h
@@ -0,0 +1,171 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager system settings service - keyfile plugin
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2008 Novell, Inc.
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#ifndef __NM_KEYFILE_INTERNAL_H__
+#define __NM_KEYFILE_INTERNAL_H__
+
+#include <glib.h>
+#include <sys/types.h>
+
+#include "nm-connection.h"
+#include "nm-setting-8021x.h"
+
+
+/*********************************************************/
+
+#define NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB "data:;base64,"
+#define NM_KEYFILE_CERT_SCHEME_PREFIX_PATH "file://"
+
+char *nm_keyfile_detect_unqualified_path_scheme (const char *base_dir,
+ gconstpointer pdata,
+ gsize data_len,
+ gboolean consider_exists,
+ gboolean *out_exists);
+
+typedef enum {
+ NM_KEYFILE_READ_TYPE_WARN = 1,
+} NMKeyfileReadType;
+
+/**
+ * NMKeyfileReadHandler:
+ *
+ * Hook to nm_keyfile_read(). The user might fail the reading by setting
+ * @error.
+ *
+ * Returns: should return TRUE, if the reading was handled. Otherwise,
+ * a default action will be performed that depends on the @type.
+ * For %NM_KEYFILE_READ_TYPE_WARN type, the default action is doing nothing.
+ */
+typedef gboolean (*NMKeyfileReadHandler) (GKeyFile *keyfile,
+ NMConnection *connection,
+ NMKeyfileReadType type,
+ void *type_data,
+ void *user_data,
+ GError **error);
+
+typedef enum {
+ NM_KEYFILE_WARN_SEVERITY_DEBUG = 1000,
+ NM_KEYFILE_WARN_SEVERITY_INFO = 2000,
+ NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE = 2901,
+ NM_KEYFILE_WARN_SEVERITY_WARN = 3000,
+} NMKeyfileWarnSeverity;
+
+/**
+ * NMKeyfileReadTypeDataWarn:
+ *
+ * this struct is passed as @type_data for the @NMKeyfileReadHandler of
+ * type %NM_KEYFILE_READ_TYPE_WARN.
+ */
+typedef struct {
+ /* might be %NULL, if the warning is not about a group. */
+ const char *group;
+
+ /* might be %NULL, if the warning is not about a setting. */
+ NMSetting *setting;
+
+ /* might be %NULL, if the warning is not about a property. */
+ const char *property_name;
+
+ NMKeyfileWarnSeverity severity;
+ const char *message;
+} NMKeyfileReadTypeDataWarn;
+
+
+NMConnection *nm_keyfile_read (GKeyFile *keyfile,
+ const char *keyfile_name,
+ const char *base_dir,
+ NMKeyfileReadHandler handler,
+ void *user_data,
+ GError **error);
+
+/*********************************************************/
+
+typedef enum {
+ NM_KEYFILE_WRITE_TYPE_CERT = 1,
+} NMKeyfileWriteType;
+
+/**
+ * NMKeyfileWriteHandler:
+ *
+ * This is a hook to tweak the serialization.
+ *
+ * Handler for certain properties or events that are not entirely contained
+ * within the keyfile or that might be serialized differently. The @type and
+ * @type_data arguments tell which kind of argument we have at hand.
+ *
+ * Currently only the type %NM_KEYFILE_WRITE_TYPE_CERT is supported, which provides
+ * @type_data as %NMKeyfileWriteTypeDataCert. However, this handler should be generic enough
+ * to support other types as well.
+ *
+ * This don't have to be only "properties". For example, nm_keyfile_read() uses
+ * a similar handler to push warnings to the caller.
+ *
+ * If the handler raises an error, it should set the @error value. This causes
+ * the an overall failure.
+ *
+ * Returns: whether the issue was handled. If the type was unhandled,
+ * a default action will be performed. This might be raise an error,
+ * do some fallback parsing, or do nothing.
+ */
+typedef gboolean (*NMKeyfileWriteHandler) (NMConnection *connection,
+ GKeyFile *keyfile,
+ NMKeyfileWriteType type,
+ void *type_data,
+ void *user_data,
+ GError **error);
+
+/**
+ * NMKeyfileWriteTypeDataCert:
+ *
+ * this struct is passed as @type_data for the @NMKeyfileWriteHandler of
+ * type %NM_KEYFILE_WRITE_TYPE_CERT.
+ */
+typedef struct {
+ NMSetting8021x *setting;
+ const char *property_name;
+
+ /* The following functions are helpers that simplify the implementation
+ * of the handler. */
+ const char *suffix;
+ NMSetting8021xCKScheme (*scheme_func) (NMSetting8021x *setting);
+ NMSetting8021xCKFormat (*format_func) (NMSetting8021x *setting);
+ const char * (*path_func) (NMSetting8021x *setting);
+ GBytes * (*blob_func) (NMSetting8021x *setting);
+} NMKeyfileWriteTypeDataCert;
+
+
+GKeyFile *nm_keyfile_write (NMConnection *connection,
+ NMKeyfileWriteHandler handler,
+ void *user_data,
+ GError **error);
+
+/*********************************************************/
+
+char *nm_keyfile_plugin_kf_get_string (GKeyFile *kf, const char *group, const char *key, GError **error);
+void nm_keyfile_plugin_kf_set_string (GKeyFile *kf, const char *group, const char *key, const char *value);
+
+void _nm_keyfile_copy (GKeyFile *dst, GKeyFile *src);
+gboolean _nm_keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b);
+gboolean _nm_keyfile_equals (GKeyFile *kf_a, GKeyFile *kf_b, gboolean consider_order);
+gboolean _nm_keyfile_has_values (GKeyFile *keyfile);
+
+
+#endif /* __NM_KEYFILE_INTERNAL_H__ */
diff --git a/libnm-core/nm-keyfile-reader.c b/libnm-core/nm-keyfile-reader.c
new file mode 100644
index 000000000..353804f97
--- /dev/null
+++ b/libnm-core/nm-keyfile-reader.c
@@ -0,0 +1,1659 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager system settings service - keyfile plugin
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2008 - 2009 Novell, Inc.
+ * Copyright (C) 2008 - 2015 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <glib/gi18n-lib.h>
+
+#include "nm-core-internal.h"
+#include "nm-macros-internal.h"
+#include "gsystem-local-alloc.h"
+#include "nm-glib-compat.h"
+#include "nm-keyfile-internal.h"
+#include "nm-keyfile-utils.h"
+#include "nm-setting-private.h"
+
+
+typedef struct {
+ NMConnection *connection;
+ GKeyFile *keyfile;
+ const char *base_dir;
+ NMKeyfileReadHandler handler;
+ void *user_data;
+ GError *error;
+ const char *group;
+ NMSetting *setting;
+} KeyfileReaderInfo;
+
+
+static void
+_handle_warn (KeyfileReaderInfo *info,
+ const char *property_name,
+ NMKeyfileWarnSeverity severity,
+ char *message)
+{
+ NMKeyfileReadTypeDataWarn type_data = {
+ .group = info->group,
+ .setting = info->setting,
+ .property_name = property_name,
+ .severity = severity,
+ .message = message,
+ };
+
+ info->handler (info->keyfile,
+ info->connection,
+ NM_KEYFILE_READ_TYPE_WARN,
+ &type_data,
+ info->user_data,
+ &info->error);
+ g_free (message);
+}
+#define handle_warn(arg_info, arg_property_name, arg_severity, ...) \
+ ({ \
+ KeyfileReaderInfo *_info = (arg_info); \
+ \
+ if (_info->handler) { \
+ _handle_warn (_info, (arg_property_name), (arg_severity), \
+ g_strdup_printf (__VA_ARGS__)); \
+ } \
+ _info->error == NULL; \
+ })
+
+/* Some setting properties also contain setting names, such as
+ * NMSettingConnection's 'type' property (which specifies the base type of the
+ * connection, e.g. ethernet or wifi) or 'slave-type' (specifies type of slave
+ * connection, e.g. bond or bridge). This function handles translating those
+ * properties' values to the real setting name if they are an alias.
+ */
+static void
+setting_alias_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ char *s;
+ const char *key_setting_name;
+
+ s = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
+ if (s) {
+ key_setting_name = nm_keyfile_plugin_get_setting_name_for_alias (s);
+ g_object_set (G_OBJECT (setting),
+ key, key_setting_name ? key_setting_name : s,
+ NULL);
+ g_free (s);
+ }
+}
+
+static void
+read_array_of_uint (GKeyFile *file,
+ NMSetting *setting,
+ const char *key)
+{
+ GArray *array = NULL;
+ gsize length;
+ int i;
+ gint *tmp;
+
+ tmp = nm_keyfile_plugin_kf_get_integer_list (file, nm_setting_get_name (setting), key, &length, NULL);
+ array = g_array_sized_new (FALSE, FALSE, sizeof (guint32), length);
+
+ for (i = 0; i < length; i++)
+ g_array_append_val (array, tmp[i]);
+
+ g_object_set (setting, key, array, NULL);
+ g_array_unref (array);
+}
+
+static gboolean
+get_one_int (KeyfileReaderInfo *info, const char *property_name, const char *str, guint32 max_val, guint32 *out)
+{
+ long tmp;
+ char *endptr;
+
+ g_return_val_if_fail (!info == !property_name, FALSE);
+
+ if (!str || !str[0]) {
+ if (property_name)
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring missing number"));
+ return FALSE;
+ }
+
+ errno = 0;
+ tmp = strtol (str, &endptr, 10);
+ if (errno || (tmp < 0) || (tmp > max_val) || *endptr != 0) {
+ if (property_name)
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid number '%s'"),
+ str);
+ return FALSE;
+ }
+
+ *out = (guint32) tmp;
+ return TRUE;
+}
+
+static gpointer
+build_address (KeyfileReaderInfo *info, int family, const char *address_str, guint32 plen, const char *property_name)
+{
+ NMIPAddress *addr;
+ GError *error = NULL;
+
+ g_return_val_if_fail (address_str, NULL);
+
+ addr = nm_ip_address_new (family, address_str, plen, &error);
+ if (!addr) {
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid %s address: %s"),
+ family == AF_INET ? "IPv4" : "IPv6", error->message);
+ g_error_free (error);
+ }
+
+ return addr;
+}
+
+static gpointer
+build_route (KeyfileReaderInfo *info,
+ const char *property_name,
+ int family,
+ const char *dest_str, guint32 plen,
+ const char *gateway_str, const char *metric_str)
+{
+ NMIPRoute *route;
+ guint32 metric = 0;
+ GError *error = NULL;
+
+ g_return_val_if_fail (plen, NULL);
+ g_return_val_if_fail (dest_str, NULL);
+
+ /* Next hop */
+ if (gateway_str && gateway_str[0]) {
+ if (!nm_utils_ipaddr_valid (family, gateway_str)) {
+ /* Try workaround for routes written by broken keyfile writer.
+ * Due to bug bgo#719851, an older version of writer would have
+ * written "a:b:c:d::/plen,metric" if the gateway was ::, instead
+ * of "a:b:c:d::/plen,,metric" or "a:b:c:d::/plen,::,metric"
+ * Try workaround by interpreting gateway_str as metric to accept such
+ * invalid routes. This broken syntax should not be not officially
+ * supported.
+ **/
+ if ( family == AF_INET6
+ && !metric_str
+ && get_one_int (NULL, NULL, gateway_str, G_MAXUINT32, &metric))
+ gateway_str = NULL;
+ else {
+ if (!info->error) {
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid gateway '%s' for %s route"),
+ gateway_str, family == AF_INET ? "IPv4" : "IPv6");
+ }
+ return NULL;
+ }
+ }
+ } else
+ gateway_str = NULL;
+
+ /* parse metric, default to 0 */
+ if (metric_str) {
+ if (!get_one_int (info, property_name, metric_str, G_MAXUINT32, &metric))
+ return NULL;
+ }
+
+ route = nm_ip_route_new (family, dest_str, plen, gateway_str,
+ metric ? (gint64) metric : -1,
+ &error);
+ if (!route) {
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid %s route: %s"),
+ family == AF_INET ? "IPv4" : "IPv6",
+ error->message);
+ g_error_free (error);
+ }
+
+ return route;
+}
+
+/* On success, returns pointer to the zero-terminated field (original @current).
+ * The @current * pointer target is set to point to the rest of the input
+ * or %NULL if there is no more input. Sets error to %NULL for convenience.
+ *
+ * On failure, returns %NULL (unspecified). The @current pointer target is
+ * resets to its original value to allow skipping fields. The @error target
+ * is set to the character that breaks the parsing or %NULL if @current was %NULL.
+ *
+ * When @current target is %NULL, gracefully fail returning %NULL while
+ * leaving the @current target %NULL end setting @error to %NULL;
+ */
+static char *
+read_field (char **current, char **error, const char *characters, const char *delimiters)
+{
+ char *start;
+
+ g_return_val_if_fail (current, NULL);
+ g_return_val_if_fail (error, NULL);
+ g_return_val_if_fail (characters, NULL);
+ g_return_val_if_fail (delimiters, NULL);
+
+ *error = NULL;
+
+ if (!*current) {
+ /* graceful failure, leave '*current' NULL */
+ return NULL;
+ }
+
+ /* fail on empty input */
+ if (!**current)
+ return NULL;
+
+ /* remember beginning of input */
+ start = *current;
+
+ while (**current && strchr (characters, **current))
+ (*current)++;
+ if (**current)
+ if (strchr (delimiters, **current)) {
+ /* success, more data available */
+ *(*current)++ = '\0';
+ return start;
+ } else {
+ /* error, bad character */
+ *error = *current;
+ *current = start;
+ return NULL;
+ }
+ else {
+ /* success, end of input */
+ *current = NULL;
+ return start;
+ }
+}
+
+#define IP_ADDRESS_CHARS "0123456789abcdefABCDEF:.%"
+#define DIGITS "0123456789"
+#define DELIMITERS "/;,"
+
+
+/* The following IPv4 and IPv6 address formats are supported:
+ *
+ * address (DEPRECATED)
+ * address/plen
+ * address/gateway (DEPRECATED)
+ * address/plen,gateway
+ *
+ * The following IPv4 and IPv6 route formats are supported:
+ *
+ * address/plen (NETWORK dev DEVICE)
+ * address/plen,gateway (NETWORK via GATEWAY dev DEVICE)
+ * address/plen,,metric (NETWORK dev DEVICE metric METRIC)
+ * address/plen,gateway,metric (NETWORK via GATEWAY dev DEVICE metric METRIC)
+ *
+ * For backward, forward and sideward compatibility, slash (/),
+ * semicolon (;) and comma (,) are interchangable. The choice of
+ * separator in the above examples is therefore not significant.
+ *
+ * Leaving out the prefix length is discouraged and DEPRECATED. The
+ * default value of IPv6 prefix length was 64 and has not been
+ * changed. The default for IPv4 is now 24, which is the closest
+ * IPv4 equivalent. These defaults may just as well be changed to
+ * match the iproute2 defaults (32 for IPv4 and 128 for IPv6).
+ */
+static gpointer
+read_one_ip_address_or_route (KeyfileReaderInfo *info,
+ const char *property_name,
+ const char *setting_name,
+ const char *key_name,
+ gboolean ipv6,
+ gboolean route,
+ char **out_gateway,
+ NMSetting *setting)
+{
+ guint32 plen = G_MAXUINT32;
+ gpointer result;
+ char *address_str, *plen_str, *gateway_str, *metric_str, *current, *error;
+ gs_free char *value = NULL, *value_orig = NULL;
+
+#define VALUE_ORIG() (value_orig ? value_orig : (value_orig = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key_name, NULL)))
+
+ current = value = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key_name, NULL);
+ if (!value)
+ return NULL;
+
+ /* get address field */
+ address_str = read_field (&current, &error, IP_ADDRESS_CHARS, DELIMITERS);
+ if (error) {
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("unexpected character '%c' for address %s: '%s' (position %td)"),
+ *error, key_name, VALUE_ORIG (), error - current);
+ return NULL;
+ }
+ /* get prefix length field (skippable) */
+ plen_str = read_field (&current, &error, DIGITS, DELIMITERS);
+ /* get gateway field */
+ gateway_str = read_field (&current, &error, IP_ADDRESS_CHARS, DELIMITERS);
+ if (error) {
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("unexpected character '%c' for %s: '%s' (position %td)"),
+ *error, key_name, VALUE_ORIG (), error - current);
+ return NULL;
+ }
+ /* for routes, get metric */
+ if (route) {
+ metric_str = read_field (&current, &error, DIGITS, DELIMITERS);
+ if (error) {
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("unexpected character '%c' in prefix length for %s: '%s' (position %td)"),
+ *error, key_name, VALUE_ORIG (), error - current);
+ return NULL;
+ }
+ } else
+ metric_str = NULL;
+ if (current) {
+ /* there is still some data */
+ if (*current) {
+ /* another field follows */
+ handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("garbage at the end of value %s: '%s'"),
+ key_name, VALUE_ORIG ());
+ return NULL;
+ } else {
+ /* semicolon at the end of input */
+ if (!handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_INFO,
+ _("deprecated semicolon at the end of value %s: '%s'"),
+ key_name, VALUE_ORIG ()))
+ return NULL;
+ }
+ }
+
+#define DEFAULT_PREFIX(for_route, for_ipv6) ( (for_route) ? ( (for_ipv6) ? 128 : 24 ) : ( (for_ipv6) ? 64 : 24 ) )
+
+ /* parse plen, fallback to defaults */
+ if (plen_str) {
+ if (!get_one_int (info, property_name, plen_str, ipv6 ? 128 : 32, &plen)
+ || (route && plen == 0)) {
+ plen = DEFAULT_PREFIX (route, ipv6);
+ if ( info->error
+ || !handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid prefix length for %s '%s', defaulting to %d"),
+ key_name, VALUE_ORIG (), plen))
+ return NULL;
+ }
+ } else {
+ plen = DEFAULT_PREFIX (route, ipv6);
+ if (!handle_warn (info, property_name, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("missing prefix length for %s '%s', defaulting to %d"),
+ key_name, VALUE_ORIG (), plen))
+ return NULL;
+ }
+
+ /* build the appropriate data structure for NetworkManager settings */
+ if (route) {
+ result = build_route (info, property_name,
+ ipv6 ? AF_INET6 : AF_INET,
+ address_str, plen, gateway_str, metric_str);
+ } else {
+ result = build_address (info, ipv6 ? AF_INET6 : AF_INET,
+ address_str, plen, property_name);
+ if (!result)
+ return NULL;
+ if (out_gateway && gateway_str)
+ *out_gateway = g_strdup (gateway_str);
+ }
+
+#undef VALUE_ORIG
+
+ return result;
+}
+
+static void
+ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ gboolean ipv6 = !strcmp (setting_name, "ipv6");
+ gboolean routes = !strcmp (key, "routes");
+ static const char *key_names_routes[] = { "route", "routes", NULL };
+ static const char *key_names_addresses[] = { "address", "addresses", NULL };
+ const char **key_names = routes ? key_names_routes : key_names_addresses;
+ char *gateway = NULL;
+ GPtrArray *list;
+ GDestroyNotify free_func;
+ int i;
+
+ if (routes)
+ free_func = (GDestroyNotify) nm_ip_route_unref;
+ else
+ free_func = (GDestroyNotify) nm_ip_address_unref;
+ list = g_ptr_array_new_with_free_func (free_func);
+
+ for (i = -1; i < 1000; i++) {
+ const char **key_basename;
+
+ for (key_basename = key_names; *key_basename; key_basename++) {
+ char *key_name;
+ gpointer item;
+
+ /* -1 means no suffix */
+ if (i >= 0)
+ key_name = g_strdup_printf ("%s%d", *key_basename, i);
+ else
+ key_name = g_strdup (*key_basename);
+
+ item = read_one_ip_address_or_route (info, key, setting_name, key_name, ipv6, routes,
+ gateway ? NULL : &gateway, setting);
+ g_free (key_name);
+
+ if (info->error) {
+ g_ptr_array_unref (list);
+ g_free (gateway);
+ return;
+ }
+ if (item)
+ g_ptr_array_add (list, item);
+
+ }
+ }
+
+ if (list->len >= 1)
+ g_object_set (setting, key, list, NULL);
+
+ if (gateway) {
+ g_object_set (setting, "gateway", gateway, NULL);
+ g_free (gateway);
+ }
+
+ g_ptr_array_unref (list);
+}
+
+static void
+ip4_dns_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ GPtrArray *array;
+ gsize length;
+ char **list, **iter;
+ int ret;
+
+ list = nm_keyfile_plugin_kf_get_string_list (info->keyfile, setting_name, key, &length, NULL);
+ if (!list || !g_strv_length (list))
+ return;
+
+ array = g_ptr_array_sized_new (length + 1);
+ for (iter = list; *iter; iter++) {
+ guint32 addr;
+
+ ret = inet_pton (AF_INET, *iter, &addr);
+ if (ret <= 0) {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid DNS server IPv4 address '%s'"),
+ *iter)) {
+ g_ptr_array_unref (array);
+ g_strfreev (list);
+ return;
+ }
+ continue;
+ }
+
+ g_ptr_array_add (array, *iter);
+ }
+ g_ptr_array_add (array, NULL);
+
+ g_object_set (setting, key, array->pdata, NULL);
+ g_ptr_array_unref (array);
+ g_strfreev (list);
+}
+
+static void
+ip6_dns_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ GPtrArray *array = NULL;
+ gsize length;
+ char **list, **iter;
+ int ret;
+
+ list = nm_keyfile_plugin_kf_get_string_list (info->keyfile, setting_name, key, &length, NULL);
+ if (!list || !g_strv_length (list))
+ return;
+
+ array = g_ptr_array_sized_new (length + 1);
+
+ for (iter = list; *iter; iter++) {
+ struct in6_addr addr;
+
+ ret = inet_pton (AF_INET6, *iter, &addr);
+ if (ret <= 0) {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid DNS server IPv6 address '%s'"),
+ *iter)) {
+ g_ptr_array_unref (array);
+ g_strfreev (list);
+ return;
+ }
+ continue;
+ }
+
+ g_ptr_array_add (array, *iter);
+ }
+ g_ptr_array_add (array, NULL);
+
+ g_object_set (setting, key, array->pdata, NULL);
+ g_ptr_array_unref (array);
+ g_strfreev (list);
+}
+
+static void
+mac_address_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key, gsize enforce_length)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ char *tmp_string = NULL, *p, *mac_str;
+ gint *tmp_list;
+ GByteArray *array = NULL;
+ gsize length;
+
+ p = tmp_string = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
+ if (tmp_string && tmp_string[0]) {
+ /* Look for enough ':' characters to signify a MAC address */
+ guint i = 0;
+
+ while (*p) {
+ if (*p == ':')
+ i++;
+ p++;
+ }
+
+ if (enforce_length == 0 || enforce_length == i+1) {
+ /* If we found enough it's probably a string-format MAC address */
+ array = g_byte_array_sized_new (i+1);
+ g_byte_array_set_size (array, i+1);
+ if (!nm_utils_hwaddr_aton (tmp_string, array->data, array->len)) {
+ g_byte_array_unref (array);
+ array = NULL;
+ }
+ }
+ }
+ g_free (tmp_string);
+
+ if (array == NULL) {
+ /* Old format; list of ints */
+ tmp_list = nm_keyfile_plugin_kf_get_integer_list (info->keyfile, setting_name, key, &length, NULL);
+ if (length > 0 && (enforce_length == 0 || enforce_length == length)) {
+ gsize i;
+
+ array = g_byte_array_sized_new (length);
+ for (i = 0; i < length; i++) {
+ int val = tmp_list[i];
+ const guint8 v = (guint8) (val & 0xFF);
+
+ if (val < 0 || val > 255) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"),
+ val);
+ g_byte_array_free (array, TRUE);
+ g_free (tmp_list);
+ return;
+ }
+ g_byte_array_append (array, &v, 1);
+ }
+ }
+ g_free (tmp_list);
+ }
+
+ if (!array) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid MAC address"));
+ return;
+ }
+
+ mac_str = nm_utils_hwaddr_ntoa (array->data, array->len);
+ g_object_set (setting, key, mac_str, NULL);
+ g_free (mac_str);
+ g_byte_array_free (array, TRUE);
+}
+
+static void
+mac_address_parser_ETHER (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ mac_address_parser (info, setting, key, ETH_ALEN);
+}
+
+static void
+mac_address_parser_INFINIBAND (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ mac_address_parser (info, setting, key, INFINIBAND_ALEN);
+}
+
+static void
+read_hash_of_string (GKeyFile *file, NMSetting *setting, const char *key)
+{
+ char **keys, **iter;
+ char *value;
+ const char *setting_name = nm_setting_get_name (setting);
+
+ keys = nm_keyfile_plugin_kf_get_keys (file, setting_name, NULL, NULL);
+ if (!keys || !*keys)
+ return;
+
+ for (iter = keys; *iter; iter++) {
+ value = nm_keyfile_plugin_kf_get_string (file, setting_name, *iter, NULL);
+ if (!value)
+ continue;
+
+ if (NM_IS_SETTING_VPN (setting)) {
+ /* Add any item that's not a class property to the data hash */
+ if (!g_object_class_find_property (G_OBJECT_GET_CLASS (setting), *iter))
+ nm_setting_vpn_add_data_item (NM_SETTING_VPN (setting), *iter, value);
+ }
+ if (NM_IS_SETTING_BOND (setting)) {
+ if (strcmp (*iter, "interface-name"))
+ nm_setting_bond_add_option (NM_SETTING_BOND (setting), *iter, value);
+ }
+ g_free (value);
+ }
+ g_strfreev (keys);
+}
+
+static void
+unescape_semicolons (char *str)
+{
+ int i;
+ gsize len = strlen (str);
+
+ for (i = 0; i < len; i++) {
+ if (str[i] == '\\' && str[i+1] == ';') {
+ memmove(str + i, str + i + 1, len - (i + 1));
+ len--;
+ }
+ str[len] = '\0';
+ }
+}
+
+static GBytes *
+get_bytes (KeyfileReaderInfo *info,
+ const char *setting_name,
+ const char *key,
+ gboolean zero_terminate,
+ gboolean unescape_semicolon)
+{
+ GByteArray *array = NULL;
+ char *tmp_string;
+ gint *tmp_list;
+ gsize length;
+ int i;
+
+ if (!nm_keyfile_plugin_kf_has_key (info->keyfile, setting_name, key, NULL))
+ return NULL;
+
+ /* New format: just a string
+ * Old format: integer list; e.g. 11;25;38;
+ */
+ tmp_string = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
+ if (tmp_string) {
+ GRegex *regex;
+ GMatchInfo *match_info;
+ const char *pattern = "^[[:space:]]*[[:digit:]]{1,3}[[:space:]]*;([[:space:]]*[[:digit:]]{1,3}[[:space:]]*;)*([[:space:]]*)?$";
+
+ regex = g_regex_new (pattern, 0, 0, NULL);
+ g_regex_match (regex, tmp_string, 0, &match_info);
+ if (!g_match_info_matches (match_info)) {
+ /* Handle as a simple string (ie, new format) */
+ if (unescape_semicolon)
+ unescape_semicolons (tmp_string);
+ length = strlen (tmp_string);
+ if (zero_terminate)
+ length++;
+ array = g_byte_array_sized_new (length);
+ g_byte_array_append (array, (guint8 *) tmp_string, length);
+ }
+ g_match_info_free (match_info);
+ g_regex_unref (regex);
+ g_free (tmp_string);
+ }
+
+ if (!array) {
+ gboolean already_warned = FALSE;
+
+ /* Old format; list of ints */
+ tmp_list = nm_keyfile_plugin_kf_get_integer_list (info->keyfile, setting_name, key, &length, NULL);
+ if (!tmp_list) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid binary property"));
+ return NULL;
+ }
+ array = g_byte_array_sized_new (length);
+ for (i = 0; i < length; i++) {
+ int val = tmp_list[i];
+ unsigned char v = (unsigned char) (val & 0xFF);
+
+ if (val < 0 || val > 255) {
+ if ( !already_warned
+ && !handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"),
+ val)) {
+ g_free (tmp_list);
+ g_byte_array_free (array, TRUE);
+ return NULL;
+ }
+ already_warned = TRUE;
+ } else
+ g_byte_array_append (array, (const unsigned char *) &v, sizeof (v));
+ }
+ g_free (tmp_list);
+ }
+
+ if (array->len == 0) {
+ g_byte_array_free (array, TRUE);
+ return NULL;
+ } else
+ return g_byte_array_free_to_bytes (array);
+}
+
+static void
+ssid_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ GBytes *bytes;
+
+ bytes = get_bytes (info, setting_name, key, FALSE, TRUE);
+ if (bytes) {
+ g_object_set (setting, key, bytes, NULL);
+ g_bytes_unref (bytes);
+ } else if (!info->error) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid SSID"));
+ }
+}
+
+static void
+password_raw_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ GBytes *bytes;
+
+ bytes = get_bytes (info, setting_name, key, FALSE, TRUE);
+ if (bytes) {
+ g_object_set (setting, key, bytes, NULL);
+ g_bytes_unref (bytes);
+ } else if (!info->error) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid raw password"));
+ }
+}
+
+static char *
+get_cert_path (const char *base_dir, const guint8 *cert_path, gsize cert_path_len)
+{
+ const char *base;
+ char *p = NULL, *path, *tmp;
+
+ g_return_val_if_fail (base_dir != NULL, NULL);
+ g_return_val_if_fail (cert_path != NULL, NULL);
+
+ base = path = g_malloc0 (cert_path_len + 1);
+ memcpy (path, cert_path, cert_path_len);
+
+ if (path[0] == '/')
+ return path;
+
+ p = strrchr (path, '/');
+ if (p)
+ base = p + 1;
+
+ tmp = g_build_path ("/", base_dir, base, NULL);
+ g_free (path);
+ return tmp;
+}
+
+static const char *certext[] = { ".pem", ".cert", ".crt", ".cer", ".p12", ".der", ".key" };
+
+static gboolean
+has_cert_ext (const char *path)
+{
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (certext); i++) {
+ if (g_str_has_suffix (path, certext[i]))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+handle_as_scheme (KeyfileReaderInfo *info, GBytes *bytes, NMSetting *setting, const char *key)
+{
+ const char *data;
+ gsize data_len, bin_len;
+
+ data = g_bytes_get_data (bytes, &data_len);
+
+ g_return_val_if_fail (data && data_len > 0, FALSE);
+
+ /* to be a scheme, @data must be a zero terminated string, which is counted by @data_len */
+ if (data[data_len - 1] != '\0')
+ return FALSE;
+ data_len--;
+
+ /* It's the PATH scheme, can just set plain data.
+ * In this case, @data_len includes */
+ if ( data_len >= STRLEN (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH)
+ && g_str_has_prefix (data, NM_KEYFILE_CERT_SCHEME_PREFIX_PATH)) {
+ if (nm_setting_802_1x_check_cert_scheme (data, data_len + 1, NULL) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
+ const char *path = &data[STRLEN (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH)];
+ gs_free char *path_free = NULL;
+
+ if (path[0] != '/') {
+ /* we want to read absolute paths because we use keyfile as exchange
+ * between different processes which might not have the same cwd. */
+ path = path_free = get_cert_path (info->base_dir, (const guint8 *) path,
+ data_len - STRLEN (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH));
+ }
+
+ g_object_set (setting, key, bytes, NULL);
+ if (!g_file_test (path, G_FILE_TEST_EXISTS)) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE,
+ _("certificate or key file '%s' does not exist"),
+ path);
+ }
+ } else {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid key/cert value path \"%s\""), data);
+ }
+ return TRUE;
+ }
+ if ( data_len > STRLEN (NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB)
+ && g_str_has_prefix (data, NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB)) {
+ const char *cdata = data + STRLEN (NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB);
+ guchar *bin;
+ GBytes *bytes2;
+ gsize i;
+ gboolean valid_base64;
+
+ data_len -= STRLEN (NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB);
+
+ /* Let's be strict here. We expect valid base64, no funny stuff!!
+ * We didn't write such invalid data ourselfes and refuse to read it as blob. */
+ if ((valid_base64 = (data_len % 4 == 0))) {
+ for (i = 0; i < data_len; i++) {
+ char c = cdata[i];
+
+ if (!( (c >= 'a' && c <= 'z')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9')
+ || (c == '+' || c == '/'))) {
+ if (c != '=' || i < data_len - 2)
+ valid_base64 = FALSE;
+ else {
+ for (; i < data_len; i++) {
+ if (cdata[i] != '=')
+ valid_base64 = FALSE;
+ }
+ }
+ break;
+ }
+ }
+ }
+ if (!valid_base64) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid key/cert value data:;base64, is not base64"));
+ return TRUE;
+ }
+
+ bin = g_base64_decode (cdata, &bin_len);
+
+ g_return_val_if_fail (bin_len > 0, FALSE);
+ if (nm_setting_802_1x_check_cert_scheme (bin, bin_len, NULL) != NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+ /* The blob probably starts with "file://". Setting the cert data will confuse NMSetting8021x.
+ * In fact this is a limitation of NMSetting8021x which does not support setting blobs that start
+ * with file://. Just warn and return TRUE to signal that we ~handled~ the setting. */
+ g_free (bin);
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid key/cert value data:;base64,file://"));
+ } else {
+ bytes2 = g_bytes_new_take (bin, bin_len);
+ g_object_set (setting, key, bytes2, NULL);
+ g_bytes_unref (bytes2);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+char *
+nm_keyfile_detect_unqualified_path_scheme (const char *base_dir,
+ gconstpointer pdata,
+ gsize data_len,
+ gboolean consider_exists,
+ gboolean *out_exists)
+{
+ const char *data = pdata;
+ gboolean exists = FALSE;
+ gboolean success = FALSE;
+ gsize validate_len;
+ char *path;
+ GByteArray *tmp;
+
+ g_return_val_if_fail (base_dir && base_dir[0] == '/', NULL);
+
+ if (!pdata)
+ return NULL;
+ if (data_len == -1)
+ data_len = strlen (data);
+ if (data_len > 500 || data_len < 1)
+ return NULL;
+
+ /* If there's a trailing zero tell g_utf8_validate() to validate until the zero */
+ if (data[data_len - 1] == '\0') {
+ /* setting it to -1, would mean we accept data to contain NUL characters before the
+ * end. Don't accept any NUL in [0 .. data_len-1[ . */
+ validate_len = data_len - 1;
+ } else
+ validate_len = data_len;
+ if ( validate_len == 0
+ || g_utf8_validate ((const char *) data, validate_len, NULL) == FALSE)
+ return NULL;
+
+ /* Might be a bare path without the file:// prefix; in that case
+ * if it's an absolute path, use that, otherwise treat it as a
+ * relative path to the current directory.
+ */
+
+ path = get_cert_path (base_dir, (const guint8 *) data, data_len);
+ if ( !memchr (data, '/', data_len)
+ && !has_cert_ext (path)) {
+ if (!consider_exists)
+ goto out;
+ exists = g_file_test (path, G_FILE_TEST_EXISTS);
+ if (!exists)
+ goto out;
+ } else if (out_exists)
+ exists = g_file_test (path, G_FILE_TEST_EXISTS);
+
+ /* Construct the proper value as required for the PATH scheme */
+ tmp = g_byte_array_sized_new (strlen (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH) + strlen (path) + 1);
+ g_byte_array_append (tmp, (const guint8 *) NM_KEYFILE_CERT_SCHEME_PREFIX_PATH, strlen (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH));
+ g_byte_array_append (tmp, (const guint8 *) path, strlen (path) + 1);
+ if (nm_setting_802_1x_check_cert_scheme (tmp->data, tmp->len, NULL) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
+ g_free (path);
+ path = (char *) g_byte_array_free (tmp, FALSE);
+ /* when returning TRUE, we must also be sure that @data_len does not look like
+ * the deprecated format of list of integers. With this implementation that is the
+ * case, as long as @consider_exists is FALSE. */
+ success = TRUE;
+ } else
+ g_byte_array_unref (tmp);
+
+out:
+ if (!success) {
+ g_free (path);
+ return NULL;
+ }
+ if (out_exists)
+ *out_exists = exists;
+ return path;
+}
+
+static gboolean
+handle_as_path (KeyfileReaderInfo *info,
+ GBytes *bytes,
+ NMSetting *setting,
+ const char *key)
+{
+ const guint8 *data;
+ gsize data_len;
+ char *path;
+ gboolean exists = FALSE;
+ GBytes *val;
+
+ data = g_bytes_get_data (bytes, &data_len);
+
+ path = nm_keyfile_detect_unqualified_path_scheme (info->base_dir, data, data_len, TRUE, &exists);
+ if (!path)
+ return FALSE;
+
+ /* Construct the proper value as required for the PATH scheme */
+ val = g_bytes_new_take (path, strlen (path) + 1);
+ g_object_set (setting, key, val, NULL);
+
+ /* Warn if the certificate didn't exist */
+ if (!exists) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE,
+ _("certificate or key file '%s' does not exist"),
+ path);
+ }
+ g_bytes_unref (val);
+
+ return TRUE;
+}
+
+static void
+cert_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ gs_unref_bytes GBytes *bytes = NULL;
+ gsize bin_len;
+ const char *bin;
+
+ bytes = get_bytes (info, setting_name, key, TRUE, FALSE);
+ if (bytes) {
+ /* Try as a path + scheme (ie, starts with "file://") */
+ if (handle_as_scheme (info, bytes, setting, key))
+ return;
+ if (info->error)
+ return;
+
+ /* If not, it might be a plain path */
+ if (handle_as_path (info, bytes, setting, key))
+ return;
+ if (info->error)
+ return;
+
+ bin = g_bytes_get_data (bytes, &bin_len);
+ if (nm_setting_802_1x_check_cert_scheme (bin, bin_len, NULL) != NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+ /* The blob probably starts with "file://" but contains invalid characters for a path.
+ * Setting the cert data will confuse NMSetting8021x.
+ * In fact, NMSetting8021x does not support setting such binary data, so just warn and
+ * continue. */
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid key/cert value is not a valid blob"));
+ } else
+ g_object_set (setting, key, bytes, NULL);
+ } else if (!info->error) {
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid key/cert value"));
+ }
+}
+
+static void
+parity_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ NMSettingSerialParity parity;
+ int int_val;
+ gs_free char *str_val = NULL;
+
+ /* Keyfile traditionally stored this as the ASCII value for 'E', 'o', or 'n'.
+ * We now accept either that or the (case-insensitive) character itself (but
+ * still always write it the old way, for backward compatibility).
+ */
+ int_val = nm_keyfile_plugin_kf_get_integer (info->keyfile, setting_name, key, NULL);
+ if (!int_val) {
+ str_val = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
+ if (str_val) {
+ if (str_val[0] && !str_val[1])
+ int_val = str_val[0];
+ else {
+ /* This will hit the warning below */
+ int_val = 'X';
+ }
+ }
+ }
+
+ if (!int_val)
+ return;
+
+ switch (int_val) {
+ case 'E':
+ case 'e':
+ parity = NM_SETTING_SERIAL_PARITY_EVEN;
+ break;
+ case 'O':
+ case 'o':
+ parity = NM_SETTING_SERIAL_PARITY_ODD;
+ break;
+ case 'N':
+ case 'n':
+ parity = NM_SETTING_SERIAL_PARITY_NONE;
+ break;
+ default:
+ handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid parity value '%s'"),
+ str_val ? str_val : "");
+ return;
+ }
+
+ g_object_set (setting, key, parity, NULL);
+}
+
+typedef struct {
+ const char *setting_name;
+ const char *key;
+ gboolean check_for_key;
+ void (*parser) (KeyfileReaderInfo *info, NMSetting *setting, const char *key);
+} KeyParser;
+
+/* A table of keys that require further parsing/conversion because they are
+ * stored in a format that can't be automatically read using the key's type.
+ * i.e. IPv4 addresses, which are stored in NetworkManager as guint32, but are
+ * stored in keyfiles as strings, eg "10.1.1.2" or IPv6 addresses stored
+ * in struct in6_addr internally, but as string in keyfiles.
+ */
+static KeyParser key_parsers[] = {
+ { NM_SETTING_CONNECTION_SETTING_NAME,
+ NM_SETTING_CONNECTION_TYPE,
+ TRUE,
+ setting_alias_parser },
+ { NM_SETTING_BRIDGE_SETTING_NAME,
+ NM_SETTING_BRIDGE_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ADDRESSES,
+ FALSE,
+ ip_address_or_route_parser },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ADDRESSES,
+ FALSE,
+ ip_address_or_route_parser },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ROUTES,
+ FALSE,
+ ip_address_or_route_parser },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ROUTES,
+ FALSE,
+ ip_address_or_route_parser },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_DNS,
+ FALSE,
+ ip4_dns_parser },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_DNS,
+ FALSE,
+ ip6_dns_parser },
+ { NM_SETTING_WIRED_SETTING_NAME,
+ NM_SETTING_WIRED_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_WIRED_SETTING_NAME,
+ NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_WIRELESS_SETTING_NAME,
+ NM_SETTING_WIRELESS_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_WIRELESS_SETTING_NAME,
+ NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_WIRELESS_SETTING_NAME,
+ NM_SETTING_WIRELESS_BSSID,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_BLUETOOTH_SETTING_NAME,
+ NM_SETTING_BLUETOOTH_BDADDR,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_INFINIBAND_SETTING_NAME,
+ NM_SETTING_INFINIBAND_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_INFINIBAND },
+ { NM_SETTING_WIMAX_SETTING_NAME,
+ NM_SETTING_WIMAX_MAC_ADDRESS,
+ TRUE,
+ mac_address_parser_ETHER },
+ { NM_SETTING_WIRELESS_SETTING_NAME,
+ NM_SETTING_WIRELESS_SSID,
+ TRUE,
+ ssid_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PASSWORD_RAW,
+ TRUE,
+ password_raw_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_CA_CERT,
+ TRUE,
+ cert_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_CLIENT_CERT,
+ TRUE,
+ cert_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PRIVATE_KEY,
+ TRUE,
+ cert_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PHASE2_CA_CERT,
+ TRUE,
+ cert_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
+ TRUE,
+ cert_parser },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
+ TRUE,
+ cert_parser },
+ { NM_SETTING_SERIAL_SETTING_NAME,
+ NM_SETTING_SERIAL_PARITY,
+ TRUE,
+ parity_parser },
+ { NULL, NULL, FALSE }
+};
+
+static void
+read_one_setting_value (NMSetting *setting,
+ const char *key,
+ const GValue *value,
+ GParamFlags flags,
+ gpointer user_data)
+{
+ KeyfileReaderInfo *info = user_data;
+ GKeyFile *keyfile = info->keyfile;
+ const char *setting_name;
+ int errsv;
+ GType type;
+ gs_free_error GError *err = NULL;
+ gboolean check_for_key = TRUE;
+ KeyParser *parser = &key_parsers[0];
+
+ if (info->error)
+ return;
+
+ /* Property is not writable */
+ if (!(flags & G_PARAM_WRITABLE))
+ return;
+
+ /* Setting name gets picked up from the keyfile's section name instead */
+ if (!strcmp (key, NM_SETTING_NAME))
+ return;
+
+ /* Don't read the NMSettingConnection object's 'read-only' property */
+ if ( NM_IS_SETTING_CONNECTION (setting)
+ && !strcmp (key, NM_SETTING_CONNECTION_READ_ONLY))
+ return;
+
+ setting_name = nm_setting_get_name (setting);
+
+ /* Look through the list of handlers for non-standard format key values */
+ while (parser->setting_name) {
+ if (!strcmp (parser->setting_name, setting_name) && !strcmp (parser->key, key)) {
+ check_for_key = parser->check_for_key;
+ break;
+ }
+ parser++;
+ }
+
+ /* VPN properties don't have the exact key name */
+ if (NM_IS_SETTING_VPN (setting))
+ check_for_key = FALSE;
+
+ /* Bonding 'options' don't have the exact key name. The options are right under [bond] group. */
+ if (NM_IS_SETTING_BOND (setting))
+ check_for_key = FALSE;
+
+ /* Check for the exact key in the GKeyFile if required. Most setting
+ * properties map 1:1 to a key in the GKeyFile, but for those properties
+ * like IP addresses and routes where more than one value is actually
+ * encoded by the setting property, this won't be true.
+ */
+ if (check_for_key && !nm_keyfile_plugin_kf_has_key (keyfile, setting_name, key, &err)) {
+ /* Key doesn't exist or an error ocurred, thus nothing to do. */
+ if (err) {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("error loading setting value: %s"),
+ err->message))
+ goto out_error;
+ }
+ return;
+ }
+
+ /* If there's a custom parser for this key, handle that before the generic
+ * parsers below.
+ */
+ if (parser->setting_name) {
+ (*parser->parser) (info, setting, key);
+ return;
+ }
+
+ type = G_VALUE_TYPE (value);
+
+ if (type == G_TYPE_STRING) {
+ char *str_val;
+
+ str_val = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL);
+ g_object_set (setting, key, str_val, NULL);
+ g_free (str_val);
+ } else if (type == G_TYPE_UINT) {
+ int int_val;
+
+ int_val = nm_keyfile_plugin_kf_get_integer (keyfile, setting_name, key, NULL);
+ if (int_val < 0) {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid negative value (%i)"),
+ int_val))
+ goto out_error;
+ }
+ g_object_set (setting, key, int_val, NULL);
+ } else if (type == G_TYPE_INT) {
+ int int_val;
+
+ int_val = nm_keyfile_plugin_kf_get_integer (keyfile, setting_name, key, NULL);
+ g_object_set (setting, key, int_val, NULL);
+ } else if (type == G_TYPE_BOOLEAN) {
+ gboolean bool_val;
+
+ bool_val = nm_keyfile_plugin_kf_get_boolean (keyfile, setting_name, key, NULL);
+ g_object_set (setting, key, bool_val, NULL);
+ } else if (type == G_TYPE_CHAR) {
+ int int_val;
+
+ int_val = nm_keyfile_plugin_kf_get_integer (keyfile, setting_name, key, NULL);
+ if (int_val < G_MININT8 || int_val > G_MAXINT8) {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid char value (%i)"),
+ int_val))
+ goto out_error;
+ }
+
+ g_object_set (setting, key, int_val, NULL);
+ } else if (type == G_TYPE_UINT64) {
+ char *tmp_str;
+ guint64 uint_val;
+
+ tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, NULL);
+ uint_val = g_ascii_strtoull (tmp_str, NULL, 10);
+ g_free (tmp_str);
+ g_object_set (setting, key, uint_val, NULL);
+ } else if (type == G_TYPE_INT64) {
+ gs_free char *tmp_str = NULL;
+ gint64 int_val;
+
+ tmp_str = nm_keyfile_plugin_kf_get_value (keyfile, setting_name, key, NULL);
+ int_val = _nm_utils_ascii_str_to_int64 (tmp_str, 10, G_MININT64, G_MAXINT64, 0);
+ errsv = errno;
+ if (errsv) {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid int64 value (%s)"),
+ tmp_str))
+ goto out_error;
+ } else
+ g_object_set (setting, key, int_val, NULL);
+ } else if (type == G_TYPE_BYTES) {
+ gint *tmp;
+ GByteArray *array;
+ GBytes *bytes;
+ gsize length;
+ int i;
+ gboolean already_warned = FALSE;
+
+ tmp = nm_keyfile_plugin_kf_get_integer_list (keyfile, setting_name, key, &length, NULL);
+
+ array = g_byte_array_sized_new (length);
+ for (i = 0; i < length; i++) {
+ int val = tmp[i];
+ unsigned char v = (unsigned char) (val & 0xFF);
+
+ if (val < 0 || val > 255) {
+ if ( !already_warned
+ && !handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"),
+ val)) {
+ g_byte_array_unref (array);
+ g_free (tmp);
+ goto out_error;
+ }
+ already_warned = TRUE;
+ } else
+ g_byte_array_append (array, (const unsigned char *) &v, sizeof (v));
+ }
+
+ bytes = g_byte_array_free_to_bytes (array);
+ g_object_set (setting, key, bytes, NULL);
+ g_bytes_unref (bytes);
+ g_free (tmp);
+ } else if (type == G_TYPE_STRV) {
+ gchar **sa;
+ gsize length;
+
+ sa = nm_keyfile_plugin_kf_get_string_list (keyfile, setting_name, key, &length, NULL);
+ g_object_set (setting, key, sa, NULL);
+ g_strfreev (sa);
+ } else if (type == G_TYPE_HASH_TABLE) {
+ read_hash_of_string (keyfile, setting, key);
+ } else if (type == G_TYPE_ARRAY) {
+ read_array_of_uint (keyfile, setting, key);
+ } else if (G_VALUE_HOLDS_FLAGS (value)) {
+ guint64 uint_val;
+
+ /* Flags are guint but GKeyFile has no uint reader, just uint64 */
+ uint_val = nm_keyfile_plugin_kf_get_uint64 (keyfile, setting_name, key, &err);
+ if (!err) {
+ if (uint_val <= G_MAXUINT)
+ g_object_set (setting, key, (guint) uint_val, NULL);
+ else {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("too large FLAGS property '%s' (%llu)"),
+ G_VALUE_TYPE_NAME (value), (long long unsigned) uint_val))
+ goto out_error;
+ }
+ }
+ } else if (G_VALUE_HOLDS_ENUM (value)) {
+ gint int_val;
+
+ int_val = nm_keyfile_plugin_kf_get_integer (keyfile, setting_name, key, &err);
+ if (!err)
+ g_object_set (setting, key, (gint) int_val, NULL);
+ } else {
+ if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("unhandled setting property type '%s'"),
+ G_VALUE_TYPE_NAME (value)))
+ goto out_error;
+ }
+out_error:
+ return;
+}
+
+static NMSetting *
+read_setting (KeyfileReaderInfo *info)
+{
+ const char *alias;
+ GType type;
+
+ alias = nm_keyfile_plugin_get_setting_name_for_alias (info->group);
+ if (!alias)
+ alias = info->group;
+
+ type = nm_setting_lookup_type (alias);
+ if (type) {
+ NMSetting *setting = g_object_new (type, NULL);
+
+ info->setting = setting;
+ nm_setting_enumerate_values (setting, read_one_setting_value, info);
+ info->setting = NULL;
+ if (!info->error)
+ return setting;
+
+ g_object_unref (setting);
+ } else {
+ handle_warn (info, NULL, NM_KEYFILE_WARN_SEVERITY_WARN,
+ _("invalid setting name '%s'"), info->group);
+ }
+
+ return NULL;
+}
+
+static void
+read_vpn_secrets (KeyfileReaderInfo *info, NMSettingVpn *s_vpn)
+{
+ char **keys, **iter;
+
+ keys = nm_keyfile_plugin_kf_get_keys (info->keyfile, VPN_SECRETS_GROUP, NULL, NULL);
+ for (iter = keys; *iter; iter++) {
+ char *secret;
+
+ secret = nm_keyfile_plugin_kf_get_string (info->keyfile, VPN_SECRETS_GROUP, *iter, NULL);
+ if (secret) {
+ nm_setting_vpn_add_secret (s_vpn, *iter, secret);
+ g_free (secret);
+ }
+ }
+ g_strfreev (keys);
+}
+
+/**
+ * nm_keyfile_read:
+ * @keyfile: the keyfile from which to create the connection
+ * @keyfile_name: keyfile allows missing connection id and uuid
+ * and NetworkManager will create those when reading a connection
+ * from file. By providing a filename you can reproduce that behavior,
+ * but of course, it can only recreate the same UUID if you provide the
+ * same filename as NetworkManager core daemon would.
+ * @keyfile_name has only a relevance for setting the id or uuid if it
+ * is missing and as fallback for @base_dir.
+ * @base_dir: when reading certificates from files with relative name,
+ * the relative path is made absolute using @base_dir.
+ * If @base_dir is missing, first try to get the pathname from @keyfile_name
+ * (if it is given as absolute path). As last, fallback to the current path.
+ * @handler: read handler
+ * @user_data: user data for read handler
+ * @error: error
+ *
+ * Tries to create a NMConnection from a keyfile. The resulting keyfile is
+ * not normalized and might not even verify.
+ *
+ * Returns: (transfer full): on success, returns the created connection.
+ */
+NMConnection *
+nm_keyfile_read (GKeyFile *keyfile,
+ const char *keyfile_name,
+ const char *base_dir,
+ NMKeyfileReadHandler handler,
+ void *user_data,
+ GError **error)
+{
+ NMConnection *connection = NULL;
+ NMSettingConnection *s_con;
+ NMSetting *setting;
+ gchar **groups;
+ gsize length;
+ int i;
+ gboolean vpn_secrets = FALSE;
+ KeyfileReaderInfo info = { 0 };
+ gs_free char *base_dir_free = NULL;
+
+ g_return_val_if_fail (keyfile, NULL);
+ g_return_val_if_fail (!error || !*error, NULL);
+
+ if (!base_dir) {
+ /* basedir is not given. Prefer it from the keyfile_name */
+ if (keyfile_name && keyfile_name[0] == '/') {
+ base_dir = base_dir_free = g_path_get_dirname (keyfile_name);
+ } else {
+ /* if keyfile is not given or not an absolute path, fallback
+ * to current working directory. */
+ base_dir = base_dir_free = g_get_current_dir ();
+ }
+ } else
+ g_return_val_if_fail ("/", NULL);
+
+ connection = nm_simple_connection_new ();
+
+ info.connection = connection;
+ info.keyfile = (GKeyFile *) keyfile;
+ info.base_dir = base_dir;
+ info.handler = handler;
+ info.user_data = user_data;
+
+ groups = g_key_file_get_groups (keyfile, &length);
+ if (!groups)
+ length = 0;
+ for (i = 0; i < length; i++) {
+ /* Only read out secrets when needed */
+ if (!strcmp (groups[i], VPN_SECRETS_GROUP)) {
+ vpn_secrets = TRUE;
+ continue;
+ }
+
+ info.group = groups[i];
+ setting = read_setting (&info);
+ info.group = NULL;
+ if (info.error)
+ goto out_error;
+ if (setting)
+ nm_connection_add_setting (connection, setting);
+ }
+ g_strfreev (groups);
+
+ s_con = nm_connection_get_setting_connection (connection);
+ if (!s_con) {
+ s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+ nm_connection_add_setting (connection, NM_SETTING (s_con));
+ }
+
+ /* Make sure that we have 'id' even if not explictly specified in the keyfile */
+ if ( keyfile_name
+ && !nm_setting_connection_get_id (s_con)) {
+ char *base_name;
+
+ base_name = g_path_get_basename (keyfile_name);
+ g_object_set (s_con, NM_SETTING_CONNECTION_ID, base_name, NULL);
+ g_free (base_name);
+ }
+
+ /* Make sure that we have 'uuid' even if not explictly specified in the keyfile */
+ if ( keyfile_name
+ && !nm_setting_connection_get_uuid (s_con)) {
+ char *hashed_uuid;
+
+ hashed_uuid = _nm_utils_uuid_generate_from_strings ("keyfile", keyfile_name, NULL);
+ g_object_set (s_con, NM_SETTING_CONNECTION_UUID, hashed_uuid, NULL);
+ g_free (hashed_uuid);
+ }
+
+ /* Make sure that we have 'interface-name' even if it was specified in the
+ * "wrong" (ie, deprecated) group.
+ */
+ if ( !nm_setting_connection_get_interface_name (s_con)
+ && nm_setting_connection_get_connection_type (s_con)) {
+ char *interface_name;
+
+ interface_name = g_key_file_get_string (keyfile,
+ nm_setting_connection_get_connection_type (s_con),
+ "interface-name",
+ NULL);
+ if (interface_name) {
+ g_object_set (s_con, NM_SETTING_CONNECTION_INTERFACE_NAME, interface_name, NULL);
+ g_free (interface_name);
+ }
+ }
+
+ /* Handle vpn secrets after the 'vpn' setting was read */
+ if (vpn_secrets) {
+ NMSettingVpn *s_vpn;
+
+ s_vpn = nm_connection_get_setting_vpn (connection);
+ if (s_vpn) {
+ read_vpn_secrets (&info, s_vpn);
+ if (info.error)
+ goto out_error;
+ }
+ }
+
+ return connection;
+out_error:
+ g_propagate_error (error, info.error);
+ g_free (connection);
+ return NULL;
+}
diff --git a/libnm-core/nm-keyfile-utils.c b/libnm-core/nm-keyfile-utils.c
new file mode 100644
index 000000000..d04a3d1be
--- /dev/null
+++ b/libnm-core/nm-keyfile-utils.c
@@ -0,0 +1,342 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager system settings service
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2010 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gsystem-local-alloc.h"
+#include "nm-keyfile-utils.h"
+#include "nm-keyfile-internal.h"
+#include "nm-setting-wired.h"
+#include "nm-setting-wireless.h"
+#include "nm-setting-wireless-security.h"
+
+
+typedef struct {
+ const char *setting;
+ const char *alias;
+} SettingAlias;
+
+static const SettingAlias alias_list[] = {
+ { NM_SETTING_WIRED_SETTING_NAME, "ethernet" },
+ { NM_SETTING_WIRELESS_SETTING_NAME, "wifi" },
+ { NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, "wifi-security" },
+};
+
+const char *
+nm_keyfile_plugin_get_alias_for_setting_name (const char *setting_name)
+{
+ guint i;
+
+ g_return_val_if_fail (setting_name != NULL, NULL);
+
+ for (i = 0; i < G_N_ELEMENTS (alias_list); i++) {
+ if (strcmp (setting_name, alias_list[i].setting) == 0)
+ return alias_list[i].alias;
+ }
+ return NULL;
+}
+
+const char *
+nm_keyfile_plugin_get_setting_name_for_alias (const char *alias)
+{
+ guint i;
+
+ g_return_val_if_fail (alias != NULL, NULL);
+
+ for (i = 0; i < G_N_ELEMENTS (alias_list); i++) {
+ if (strcmp (alias, alias_list[i].alias) == 0)
+ return alias_list[i].setting;
+ }
+ return NULL;
+}
+
+/**********************************************************************/
+
+/* List helpers */
+#define DEFINE_KF_LIST_WRAPPER(stype, get_ctype, set_ctype) \
+get_ctype \
+nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ gsize *out_length, \
+ GError **error) \
+{ \
+ get_ctype list; \
+ const char *alias; \
+ GError *local = NULL; \
+ \
+ list = g_key_file_get_##stype##_list (kf, group, key, out_length, &local); \
+ if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
+ if (alias) { \
+ g_clear_error (&local); \
+ list = g_key_file_get_##stype##_list (kf, alias, key, out_length, &local); \
+ } \
+ } \
+ if (local) \
+ g_propagate_error (error, local); \
+ return list; \
+} \
+ \
+void \
+nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ set_ctype list[], \
+ gsize length) \
+{ \
+ const char *alias; \
+ \
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
+ g_key_file_set_##stype##_list (kf, alias ? alias : group, key, list, length); \
+}
+
+DEFINE_KF_LIST_WRAPPER(integer, gint*, gint);
+DEFINE_KF_LIST_WRAPPER(string, gchar **, const gchar* const);
+
+/* Single value helpers */
+#define DEFINE_KF_WRAPPER(stype, get_ctype, set_ctype) \
+get_ctype \
+nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ GError **error) \
+{ \
+ get_ctype val; \
+ const char *alias; \
+ GError *local = NULL; \
+ \
+ val = g_key_file_get_##stype (kf, group, key, &local); \
+ if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
+ if (alias) { \
+ g_clear_error (&local); \
+ val = g_key_file_get_##stype (kf, alias, key, &local); \
+ } \
+ } \
+ if (local) \
+ g_propagate_error (error, local); \
+ return val; \
+} \
+ \
+void \
+nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ set_ctype value) \
+{ \
+ const char *alias; \
+ \
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
+ g_key_file_set_##stype (kf, alias ? alias : group, key, value); \
+}
+
+DEFINE_KF_WRAPPER(string, gchar*, const gchar*);
+DEFINE_KF_WRAPPER(integer, gint, gint);
+DEFINE_KF_WRAPPER(uint64, guint64, guint64);
+DEFINE_KF_WRAPPER(boolean, gboolean, gboolean);
+DEFINE_KF_WRAPPER(value, gchar*, const gchar*);
+
+
+gchar **
+nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
+ const char *group,
+ gsize *out_length,
+ GError **error)
+{
+ gchar **keys;
+ const char *alias;
+ GError *local = NULL;
+
+ keys = g_key_file_get_keys (kf, group, out_length, &local);
+ if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
+ if (alias) {
+ g_clear_error (&local);
+ keys = g_key_file_get_keys (kf, alias, out_length, &local);
+ }
+ }
+ if (local)
+ g_propagate_error (error, local);
+ return keys;
+}
+
+gboolean
+nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
+ const char *group,
+ const char *key,
+ GError **error)
+{
+ gboolean has;
+ const char *alias;
+ GError *local = NULL;
+
+ has = g_key_file_has_key (kf, group, key, &local);
+ if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
+ if (alias) {
+ g_clear_error (&local);
+ has = g_key_file_has_key (kf, alias, key, &local);
+ }
+ }
+ if (local)
+ g_propagate_error (error, local);
+ return has;
+}
+
+/************************************************************************/
+
+void
+_nm_keyfile_copy (GKeyFile *dst, GKeyFile *src)
+{
+ gs_strfreev char **groups = NULL;
+ guint g, k;
+
+ groups = g_key_file_get_groups (src, NULL);
+ for (g = 0; groups && groups[g]; g++) {
+ const char *group = groups[g];
+ gs_strfreev char **keys = NULL;
+
+ keys = g_key_file_get_keys (src, group, NULL, NULL);
+ if (!keys)
+ continue;
+
+ for (k = 0; keys[k]; k++) {
+ const char *key = keys[k];
+ gs_free char *value = NULL;
+
+ value = g_key_file_get_value (src, group, key, NULL);
+ if (value)
+ g_key_file_set_value (dst, group, key, value);
+ else
+ g_key_file_remove_key (dst, group, key, NULL);
+ }
+ }
+}
+
+/************************************************************************/
+
+gboolean
+_nm_keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b)
+{
+ gs_strfreev char **groups = NULL;
+ guint i, j;
+
+ if (kf_a == kf_b)
+ return TRUE;
+ if (!kf_a || !kf_b)
+ return FALSE;
+
+ groups = g_key_file_get_groups (kf_a, NULL);
+ for (i = 0; groups && groups[i]; i++) {
+ gs_strfreev char **keys = NULL;
+
+ keys = g_key_file_get_keys (kf_a, groups[i], NULL, NULL);
+ if (!keys)
+ continue;
+
+ for (j = 0; keys[j]; j++) {
+ gs_free char *key_a = g_key_file_get_value (kf_a, groups[i], keys[j], NULL);
+ gs_free char *key_b = g_key_file_get_value (kf_b, groups[i], keys[j], NULL);
+
+ if (g_strcmp0 (key_a, key_b) != 0)
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+
+static gboolean
+_nm_keyfile_equals_ordered (GKeyFile *kf_a, GKeyFile *kf_b)
+{
+ gs_strfreev char **groups = NULL;
+ gs_strfreev char **groups_b = NULL;
+ guint i, j;
+
+ if (kf_a == kf_b)
+ return TRUE;
+ if (!kf_a || !kf_b)
+ return FALSE;
+
+ groups = g_key_file_get_groups (kf_a, NULL);
+ groups_b = g_key_file_get_groups (kf_b, NULL);
+ if (!groups && !groups_b)
+ return TRUE;
+ if (!groups || !groups_b)
+ return FALSE;
+ for (i = 0; groups[i] && groups_b[i] && !strcmp (groups[i], groups_b[i]); i++)
+ ;
+ if (groups[i] || groups_b[i])
+ return FALSE;
+
+ for (i = 0; groups[i]; i++) {
+ gs_strfreev char **keys = NULL;
+ gs_strfreev char **keys_b = NULL;
+
+ keys = g_key_file_get_keys (kf_a, groups[i], NULL, NULL);
+ keys_b = g_key_file_get_keys (kf_b, groups[i], NULL, NULL);
+
+ if ((!keys) != (!keys_b))
+ return FALSE;
+ if (!keys)
+ continue;
+
+ for (j = 0; keys[j] && keys_b[j] && !strcmp (keys[j], keys_b[j]); j++)
+ ;
+ if (keys[j] || keys_b[j])
+ return FALSE;
+
+ for (j = 0; keys[j]; j++) {
+ gs_free char *key_a = g_key_file_get_value (kf_a, groups[i], keys[j], NULL);
+ gs_free char *key_b = g_key_file_get_value (kf_b, groups[i], keys[j], NULL);
+
+ if (g_strcmp0 (key_a, key_b) != 0)
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+gboolean
+_nm_keyfile_equals (GKeyFile *kf_a, GKeyFile *kf_b, gboolean consider_order)
+{
+ if (!consider_order) {
+ return _nm_keyfile_a_contains_all_in_b (kf_a, kf_b)
+ && _nm_keyfile_a_contains_all_in_b (kf_b, kf_a);
+ } else {
+ return _nm_keyfile_equals_ordered (kf_a, kf_b);
+ }
+}
+
+gboolean
+_nm_keyfile_has_values (GKeyFile *keyfile)
+{
+ gs_strfreev char **groups = NULL;
+
+ g_return_val_if_fail (keyfile, FALSE);
+
+ groups = g_key_file_get_groups (keyfile, NULL);
+ return groups && groups[0];
+}
diff --git a/libnm-core/nm-keyfile-utils.h b/libnm-core/nm-keyfile-utils.h
new file mode 100644
index 000000000..fd4334d11
--- /dev/null
+++ b/libnm-core/nm-keyfile-utils.h
@@ -0,0 +1,79 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager system settings service
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2010-2015 Red Hat, Inc.
+ */
+
+#ifndef __NM_KEYFILE_UTILS_H__
+#define __NM_KEYFILE_UTILS_H__
+
+#include <glib.h>
+
+#define VPN_SECRETS_GROUP "vpn-secrets"
+
+const char *nm_keyfile_plugin_get_alias_for_setting_name (const char *setting_name);
+
+const char *nm_keyfile_plugin_get_setting_name_for_alias (const char *alias);
+
+/*********************************************************/
+
+/* List helpers */
+#define DEFINE_KF_LIST_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
+get_ctype nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ gsize *out_length, \
+ GError **error); \
+\
+void nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ set_ctype list[], \
+ gsize length);
+DEFINE_KF_LIST_WRAPPER_PROTO(integer, gint*, gint)
+DEFINE_KF_LIST_WRAPPER_PROTO(string, gchar**, const gchar* const)
+
+/* Single-value helpers */
+#define DEFINE_KF_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
+get_ctype nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ GError **error); \
+\
+void nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
+ const char *group, \
+ const char *key, \
+ set_ctype value);
+DEFINE_KF_WRAPPER_PROTO(string, gchar*, const gchar*)
+DEFINE_KF_WRAPPER_PROTO(integer, gint, gint)
+DEFINE_KF_WRAPPER_PROTO(uint64, guint64, guint64)
+DEFINE_KF_WRAPPER_PROTO(boolean, gboolean, gboolean)
+DEFINE_KF_WRAPPER_PROTO(value, gchar*, const gchar*)
+
+/* Misc */
+gchar ** nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
+ const char *group,
+ gsize *out_length,
+ GError **error);
+
+gboolean nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
+ const char *group,
+ const char *key,
+ GError **error);
+
+#endif /* __NM_KEYFILE_UTILS_H__ */
+
diff --git a/libnm-core/nm-keyfile-writer.c b/libnm-core/nm-keyfile-writer.c
new file mode 100644
index 000000000..ff433b264
--- /dev/null
+++ b/libnm-core/nm-keyfile-writer.c
@@ -0,0 +1,751 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager system settings service - keyfile plugin
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2008 Novell, Inc.
+ * Copyright (C) 2008 - 2015 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <glib/gi18n-lib.h>
+
+#include "nm-setting.h"
+#include "nm-setting-connection.h"
+#include "nm-setting-ip4-config.h"
+#include "nm-setting-ip6-config.h"
+#include "nm-setting-vpn.h"
+#include "nm-setting-wired.h"
+#include "nm-setting-wireless.h"
+#include "nm-setting-ip4-config.h"
+#include "nm-setting-bluetooth.h"
+#include "nm-setting-8021x.h"
+#include "nm-utils.h"
+
+#include "gsystem-local-alloc.h"
+#include "nm-glib-compat.h"
+#include "nm-keyfile-internal.h"
+#include "nm-keyfile-utils.h"
+
+typedef struct {
+ NMConnection *connection;
+ GKeyFile *keyfile;
+ GError *error;
+ NMKeyfileWriteHandler handler;
+ void *user_data;
+} KeyfileWriterInfo;
+
+
+/* Some setting properties also contain setting names, such as
+ * NMSettingConnection's 'type' property (which specifies the base type of the
+ * connection, eg ethernet or wifi) or the 802-11-wireless setting's
+ * 'security' property which specifies whether or not the AP requires
+ * encrpytion. This function handles translating those properties' values
+ * from the real setting name to the more-readable alias.
+ */
+static void
+setting_alias_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ const char *str, *alias;
+
+ str = g_value_get_string (value);
+ alias = nm_keyfile_plugin_get_alias_for_setting_name (str);
+ nm_keyfile_plugin_kf_set_string (info->keyfile,
+ nm_setting_get_name (setting),
+ key,
+ alias ? alias : str);
+}
+
+static void
+write_array_of_uint (GKeyFile *file,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ GArray *array;
+ int i;
+ int *tmp_array;
+
+ array = (GArray *) g_value_get_boxed (value);
+ if (!array || !array->len)
+ return;
+
+ tmp_array = g_new (gint, array->len);
+ for (i = 0; i < array->len; i++)
+ tmp_array[i] = g_array_index (array, int, i);
+
+ nm_keyfile_plugin_kf_set_integer_list (file, nm_setting_get_name (setting), key, tmp_array, array->len);
+ g_free (tmp_array);
+}
+
+static void
+dns_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ char **list;
+
+ list = g_value_get_boxed (value);
+ if (list && list[0]) {
+ nm_keyfile_plugin_kf_set_string_list (info->keyfile, nm_setting_get_name (setting), key,
+ (const char **) list, g_strv_length (list));
+ }
+}
+
+static void
+write_ip_values (GKeyFile *file,
+ const char *setting_name,
+ GPtrArray *array,
+ const char *gateway,
+ gboolean is_route)
+{
+ GString *output;
+ int family, i;
+ const char *addr, *gw;
+ guint32 plen, metric;
+ char key_name[30], *key_name_idx;
+
+ if (!array->len)
+ return;
+
+ family = !strcmp (setting_name, NM_SETTING_IP4_CONFIG_SETTING_NAME) ? AF_INET : AF_INET6;
+
+ strcpy (key_name, is_route ? "route" : "address");
+ key_name_idx = key_name + strlen (key_name);
+
+ output = g_string_sized_new (2*INET_ADDRSTRLEN + 10);
+ for (i = 0; i < array->len; i++) {
+ if (is_route) {
+ NMIPRoute *route = array->pdata[i];
+
+ addr = nm_ip_route_get_dest (route);
+ plen = nm_ip_route_get_prefix (route);
+ gw = nm_ip_route_get_next_hop (route);
+ metric = MAX (0, nm_ip_route_get_metric (route));
+ } else {
+ NMIPAddress *address = array->pdata[i];
+
+ addr = nm_ip_address_get_address (address);
+ plen = nm_ip_address_get_prefix (address);
+ gw = i == 0 ? gateway : NULL;
+ metric = 0;
+ }
+
+ g_string_set_size (output, 0);
+ g_string_append_printf (output, "%s/%u", addr, plen);
+ if (metric || gw) {
+ /* Older versions of the plugin do not support the form
+ * "a.b.c.d/plen,,metric", so, we always have to write the
+ * gateway, even if there isn't one.
+ * The current version supports reading of the above form.
+ */
+ if (!gw) {
+ if (family == AF_INET)
+ gw = "0.0.0.0";
+ else
+ gw = "::";
+ }
+
+ g_string_append_printf (output, ",%s", gw);
+ if (metric)
+ g_string_append_printf (output, ",%lu", (unsigned long) metric);
+ }
+
+ sprintf (key_name_idx, "%d", i + 1);
+ nm_keyfile_plugin_kf_set_string (file, setting_name, key_name, output->str);
+ }
+ g_string_free (output, TRUE);
+}
+
+static void
+addr_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ GPtrArray *array;
+ const char *setting_name = nm_setting_get_name (setting);
+ const char *gateway = nm_setting_ip_config_get_gateway (NM_SETTING_IP_CONFIG (setting));
+
+ array = (GPtrArray *) g_value_get_boxed (value);
+ if (array && array->len)
+ write_ip_values (info->keyfile, setting_name, array, gateway, FALSE);
+}
+
+static void
+ip4_addr_label_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ /* skip */
+}
+
+static void
+gateway_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ /* skip */
+}
+
+static void
+route_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ GPtrArray *array;
+ const char *setting_name = nm_setting_get_name (setting);
+
+ array = (GPtrArray *) g_value_get_boxed (value);
+ if (array && array->len)
+ write_ip_values (info->keyfile, setting_name, array, NULL, TRUE);
+}
+
+static void
+write_hash_of_string (GKeyFile *file,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ GHashTableIter iter;
+ const char *property = NULL, *data = NULL;
+ const char *group_name = nm_setting_get_name (setting);
+ gboolean vpn_secrets = FALSE;
+
+ /* Write VPN secrets out to a different group to keep them separate */
+ if (NM_IS_SETTING_VPN (setting) && !strcmp (key, NM_SETTING_VPN_SECRETS)) {
+ group_name = VPN_SECRETS_GROUP;
+ vpn_secrets = TRUE;
+ }
+
+ g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value));
+ while (g_hash_table_iter_next (&iter, (gpointer *) &property, (gpointer *) &data)) {
+ gboolean write_item = TRUE;
+
+ /* Handle VPN secrets specially; they are nested in the property's hash;
+ * we don't want to write them if the secret is not saved, not required,
+ * or owned by a user's secret agent.
+ */
+ if (vpn_secrets) {
+ NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+
+ nm_setting_get_secret_flags (setting, property, &secret_flags, NULL);
+ if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
+ write_item = FALSE;
+ }
+
+ if (write_item)
+ nm_keyfile_plugin_kf_set_string (file, group_name, property, data);
+ }
+}
+
+static void
+ssid_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ GBytes *bytes;
+ const guint8 *ssid_data;
+ gsize ssid_len;
+ const char *setting_name = nm_setting_get_name (setting);
+ gboolean new_format = TRUE;
+ unsigned int semicolons = 0;
+ int i, *tmp_array;
+ char *ssid;
+
+ g_return_if_fail (G_VALUE_HOLDS (value, G_TYPE_BYTES));
+
+ bytes = g_value_get_boxed (value);
+ if (!bytes)
+ return;
+ ssid_data = g_bytes_get_data (bytes, &ssid_len);
+ if (ssid_len == 0)
+ return;
+
+ /* Check whether each byte is printable. If not, we have to use an
+ * integer list, otherwise we can just use a string.
+ */
+ for (i = 0; i < ssid_len; i++) {
+ char c = ssid_data[i] & 0xFF;
+ if (!g_ascii_isprint (c)) {
+ new_format = FALSE;
+ break;
+ }
+ if (c == ';')
+ semicolons++;
+ }
+
+ if (new_format) {
+ ssid = g_malloc0 (ssid_len + semicolons + 1);
+ if (semicolons == 0)
+ memcpy (ssid, ssid_data, ssid_len);
+ else {
+ /* Escape semicolons with backslashes to make strings
+ * containing ';', such as '16;17;' unambiguous */
+ int j = 0;
+ for (i = 0; i < ssid_len; i++) {
+ if (ssid_data[i] == ';')
+ ssid[j++] = '\\';
+ ssid[j++] = ssid_data[i];
+ }
+ }
+ nm_keyfile_plugin_kf_set_string (info->keyfile, setting_name, key, ssid);
+ g_free (ssid);
+ } else {
+ tmp_array = g_new (gint, ssid_len);
+ for (i = 0; i < ssid_len; i++)
+ tmp_array[i] = (int) ssid_data[i];
+ nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, ssid_len);
+ g_free (tmp_array);
+ }
+}
+
+static void
+password_raw_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ const char *setting_name = nm_setting_get_name (setting);
+ GBytes *array;
+ int *tmp_array;
+ gsize i, len;
+ const char *data;
+
+ g_return_if_fail (G_VALUE_HOLDS (value, G_TYPE_BYTES));
+
+ array = (GBytes *) g_value_get_boxed (value);
+ if (!array)
+ return;
+ data = g_bytes_get_data (array, &len);
+ if (!data || !len)
+ return;
+
+ tmp_array = g_new (gint, len);
+ for (i = 0; i < len; i++)
+ tmp_array[i] = (int) data[i];
+ nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, len);
+ g_free (tmp_array);
+}
+
+typedef struct ObjectType {
+ const char *key;
+ const char *suffix;
+ NMSetting8021xCKScheme (*scheme_func) (NMSetting8021x *setting);
+ NMSetting8021xCKFormat (*format_func) (NMSetting8021x *setting);
+ const char * (*path_func) (NMSetting8021x *setting);
+ GBytes * (*blob_func) (NMSetting8021x *setting);
+} ObjectType;
+
+static const ObjectType objtypes[10] = {
+ { NM_SETTING_802_1X_CA_CERT,
+ "ca-cert",
+ nm_setting_802_1x_get_ca_cert_scheme,
+ NULL,
+ nm_setting_802_1x_get_ca_cert_path,
+ nm_setting_802_1x_get_ca_cert_blob },
+
+ { NM_SETTING_802_1X_PHASE2_CA_CERT,
+ "inner-ca-cert",
+ nm_setting_802_1x_get_phase2_ca_cert_scheme,
+ NULL,
+ nm_setting_802_1x_get_phase2_ca_cert_path,
+ nm_setting_802_1x_get_phase2_ca_cert_blob },
+
+ { NM_SETTING_802_1X_CLIENT_CERT,
+ "client-cert",
+ nm_setting_802_1x_get_client_cert_scheme,
+ NULL,
+ nm_setting_802_1x_get_client_cert_path,
+ nm_setting_802_1x_get_client_cert_blob },
+
+ { NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
+ "inner-client-cert",
+ nm_setting_802_1x_get_phase2_client_cert_scheme,
+ NULL,
+ nm_setting_802_1x_get_phase2_client_cert_path,
+ nm_setting_802_1x_get_phase2_client_cert_blob },
+
+ { NM_SETTING_802_1X_PRIVATE_KEY,
+ "private-key",
+ nm_setting_802_1x_get_private_key_scheme,
+ nm_setting_802_1x_get_private_key_format,
+ nm_setting_802_1x_get_private_key_path,
+ nm_setting_802_1x_get_private_key_blob },
+
+ { NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
+ "inner-private-key",
+ nm_setting_802_1x_get_phase2_private_key_scheme,
+ nm_setting_802_1x_get_phase2_private_key_format,
+ nm_setting_802_1x_get_phase2_private_key_path,
+ nm_setting_802_1x_get_phase2_private_key_blob },
+
+ { NULL },
+};
+
+/**************************************************************************/
+
+static void
+cert_writer_default (NMConnection *connection,
+ GKeyFile *file,
+ NMKeyfileWriteTypeDataCert *cert_data)
+{
+ const char *setting_name = nm_setting_get_name (NM_SETTING (cert_data->setting));
+ NMSetting8021xCKScheme scheme;
+
+ scheme = cert_data->scheme_func (cert_data->setting);
+ if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
+ const char *path;
+ char *path_free = NULL, *tmp;
+ gs_free char *base_dir = NULL;
+
+ path = cert_data->path_func (cert_data->setting);
+ g_assert (path);
+
+ /* If the path is relative, make it an absolute path.
+ * Relative paths make a keyfile not easily usable in another
+ * context. */
+ if (path[0] && path[0] != '/') {
+ base_dir = g_get_current_dir ();
+ path = path_free = g_strconcat (base_dir, "/", path, NULL);
+ } else
+ base_dir = g_path_get_dirname (path);
+
+ /* path cannot start with "file://" or "data:;base64,", because it is an absolute path.
+ * Still, make sure that a prefix-less path will be recognized. This can happen
+ * for example if the path is longer then 500 chars. */
+ tmp = nm_keyfile_detect_unqualified_path_scheme (base_dir, path, -1, FALSE, NULL);
+ if (tmp)
+ g_clear_pointer (&tmp, g_free);
+ else
+ path = tmp = g_strconcat (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH, path, NULL);
+
+ /* Path contains at least a '/', hence it cannot be recognized as the old
+ * binary format consisting of a list of integers. */
+
+ nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, path);
+ g_free (tmp);
+ g_free (path_free);
+ } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+ GBytes *blob;
+ const guint8 *blob_data;
+ gsize blob_len;
+ char *blob_base64, *val;
+
+ blob = cert_data->blob_func (cert_data->setting);
+ g_assert (blob);
+ blob_data = g_bytes_get_data (blob, &blob_len);
+
+ blob_base64 = g_base64_encode (blob_data, blob_len);
+ val = g_strconcat (NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB, blob_base64, NULL);
+
+ nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, val);
+ g_free (val);
+ g_free (blob_base64);
+ } else {
+ /* scheme_func() returns UNKNOWN in all other cases. The only valid case
+ * where a scheme is allowed to be UNKNOWN, is unsetting the value. In this
+ * case, we don't expect the writer to be called, because the default value
+ * will not be serialized.
+ * The only other reason for the scheme to be UNKNOWN is an invalid cert.
+ * But our connection verifies, so that cannot happen either. */
+ g_return_if_reached ();
+ }
+}
+
+static void
+cert_writer (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value)
+{
+ const ObjectType *objtype = NULL;
+ guint i;
+ NMKeyfileWriteTypeDataCert type_data = { 0 };
+
+ for (i = 0; i < G_N_ELEMENTS (objtypes) && objtypes[i].key; i++) {
+ if (g_strcmp0 (objtypes[i].key, key) == 0) {
+ objtype = &objtypes[i];
+ break;
+ }
+ }
+ if (!objtype)
+ g_return_if_reached ();
+
+ type_data.setting = NM_SETTING_802_1X (setting);
+ type_data.property_name = key;
+ type_data.suffix = objtype->suffix;
+ type_data.scheme_func = objtype->scheme_func;
+ type_data.format_func = objtype->format_func;
+ type_data.path_func = objtype->path_func;
+ type_data.blob_func = objtype->blob_func;
+
+ if (info->handler) {
+ if (info->handler (info->connection,
+ info->keyfile,
+ NM_KEYFILE_WRITE_TYPE_CERT,
+ &type_data,
+ info->user_data,
+ &info->error))
+ return;
+ if (info->error)
+ return;
+ }
+
+ cert_writer_default (info->connection, info->keyfile, &type_data);
+}
+
+/**************************************************************************/
+
+typedef struct {
+ const char *setting_name;
+ const char *key;
+ void (*writer) (KeyfileWriterInfo *info,
+ NMSetting *setting,
+ const char *key,
+ const GValue *value);
+} KeyWriter;
+
+/* A table of keys that require further parsing/conversion because they are
+ * stored in a format that can't be automatically read using the key's type.
+ * i.e. IPv4 addresses, which are stored in NetworkManager as guint32, but are
+ * stored in keyfiles as strings, eg "10.1.1.2" or IPv6 addresses stored
+ * in struct in6_addr internally, but as string in keyfiles.
+ */
+static KeyWriter key_writers[] = {
+ { NM_SETTING_CONNECTION_SETTING_NAME,
+ NM_SETTING_CONNECTION_TYPE,
+ setting_alias_writer },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ADDRESSES,
+ addr_writer },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ "address-labels",
+ ip4_addr_label_writer },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ADDRESSES,
+ addr_writer },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_GATEWAY,
+ gateway_writer },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_GATEWAY,
+ gateway_writer },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ROUTES,
+ route_writer },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_ROUTES,
+ route_writer },
+ { NM_SETTING_IP4_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_DNS,
+ dns_writer },
+ { NM_SETTING_IP6_CONFIG_SETTING_NAME,
+ NM_SETTING_IP_CONFIG_DNS,
+ dns_writer },
+ { NM_SETTING_WIRELESS_SETTING_NAME,
+ NM_SETTING_WIRELESS_SSID,
+ ssid_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PASSWORD_RAW,
+ password_raw_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_CA_CERT,
+ cert_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_CLIENT_CERT,
+ cert_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PRIVATE_KEY,
+ cert_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PHASE2_CA_CERT,
+ cert_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
+ cert_writer },
+ { NM_SETTING_802_1X_SETTING_NAME,
+ NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
+ cert_writer },
+ { NULL, NULL, NULL }
+};
+
+static void
+write_setting_value (NMSetting *setting,
+ const char *key,
+ const GValue *value,
+ GParamFlags flag,
+ gpointer user_data)
+{
+ KeyfileWriterInfo *info = user_data;
+ const char *setting_name;
+ GType type = G_VALUE_TYPE (value);
+ KeyWriter *writer = &key_writers[0];
+ GParamSpec *pspec;
+
+ if (info->error)
+ return;
+
+ /* Setting name gets picked up from the keyfile's section name instead */
+ if (!strcmp (key, NM_SETTING_NAME))
+ return;
+
+ /* Don't write the NMSettingConnection object's 'read-only' property */
+ if ( NM_IS_SETTING_CONNECTION (setting)
+ && !strcmp (key, NM_SETTING_CONNECTION_READ_ONLY))
+ return;
+
+ setting_name = nm_setting_get_name (setting);
+
+ /* If the value is the default value, remove the item from the keyfile */
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key);
+ if (pspec) {
+ if (g_param_value_defaults (pspec, (GValue *) value)) {
+ g_key_file_remove_key (info->keyfile, setting_name, key, NULL);
+ return;
+ }
+ }
+
+ /* Don't write secrets that are owned by user secret agents or aren't
+ * supposed to be saved. VPN secrets are handled specially though since
+ * the secret flags there are in a third-level hash in the 'secrets'
+ * property.
+ */
+ if (pspec && (pspec->flags & NM_SETTING_PARAM_SECRET) && !NM_IS_SETTING_VPN (setting)) {
+ NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
+
+ if (!nm_setting_get_secret_flags (setting, key, &secret_flags, NULL))
+ g_assert_not_reached ();
+ if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
+ return;
+ }
+
+ /* Look through the list of handlers for non-standard format key values */
+ while (writer->setting_name) {
+ if (!strcmp (writer->setting_name, setting_name) && !strcmp (writer->key, key)) {
+ (*writer->writer) (info, setting, key, value);
+ return;
+ }
+ writer++;
+ }
+
+ if (type == G_TYPE_STRING) {
+ const char *str;
+
+ str = g_value_get_string (value);
+ if (str)
+ nm_keyfile_plugin_kf_set_string (info->keyfile, setting_name, key, str);
+ } else if (type == G_TYPE_UINT)
+ nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, (int) g_value_get_uint (value));
+ else if (type == G_TYPE_INT)
+ nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, g_value_get_int (value));
+ else if (type == G_TYPE_UINT64) {
+ char *numstr;
+
+ numstr = g_strdup_printf ("%" G_GUINT64_FORMAT, g_value_get_uint64 (value));
+ nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr);
+ g_free (numstr);
+ } else if (type == G_TYPE_INT64) {
+ char *numstr;
+
+ numstr = g_strdup_printf ("%" G_GINT64_FORMAT, g_value_get_int64 (value));
+ nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr);
+ g_free (numstr);
+ } else if (type == G_TYPE_BOOLEAN) {
+ nm_keyfile_plugin_kf_set_boolean (info->keyfile, setting_name, key, g_value_get_boolean (value));
+ } else if (type == G_TYPE_CHAR) {
+ nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, (int) g_value_get_schar (value));
+ } else if (type == G_TYPE_BYTES) {
+ GBytes *bytes;
+ const guint8 *data;
+ gsize len = 0;
+
+ bytes = g_value_get_boxed (value);
+ data = bytes ? g_bytes_get_data (bytes, &len) : NULL;
+
+ if (data != NULL && len > 0) {
+ int *tmp_array;
+ int i;
+
+ tmp_array = g_new (gint, len);
+ for (i = 0; i < len; i++)
+ tmp_array[i] = (int) data[i];
+
+ nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, len);
+ g_free (tmp_array);
+ }
+ } else if (type == G_TYPE_STRV) {
+ char **array;
+
+ array = (char **) g_value_get_boxed (value);
+ nm_keyfile_plugin_kf_set_string_list (info->keyfile, setting_name, key, (const gchar **const) array, g_strv_length (array));
+ } else if (type == G_TYPE_HASH_TABLE) {
+ write_hash_of_string (info->keyfile, setting, key, value);
+ } else if (type == G_TYPE_ARRAY) {
+ write_array_of_uint (info->keyfile, setting, key, value);
+ } else if (G_VALUE_HOLDS_FLAGS (value)) {
+ /* Flags are guint but GKeyFile has no uint reader, just uint64 */
+ nm_keyfile_plugin_kf_set_uint64 (info->keyfile, setting_name, key, (guint64) g_value_get_flags (value));
+ } else if (G_VALUE_HOLDS_ENUM (value))
+ nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, (gint) g_value_get_enum (value));
+ else
+ g_warn_if_reached ();
+}
+
+GKeyFile *
+nm_keyfile_write (NMConnection *connection,
+ NMKeyfileWriteHandler handler,
+ void *user_data,
+ GError **error)
+{
+ KeyfileWriterInfo info = { 0 };
+
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (!error || !*error, NULL);
+
+ if (!nm_connection_verify (connection, error))
+ return NULL;
+
+ info.connection = connection;
+ info.keyfile = g_key_file_new ();
+ info.error = NULL;
+ info.handler = handler;
+ info.user_data = user_data;
+ nm_connection_for_each_setting_value (connection, write_setting_value, &info);
+
+ if (info.error) {
+ g_propagate_error (error, info.error);
+ g_key_file_unref (info.keyfile);
+ return NULL;
+ }
+ return info.keyfile;
+}
+
diff --git a/libnm-core/nm-setting-8021x.c b/libnm-core/nm-setting-8021x.c
index 41559e0c8..d53ae43b8 100644
--- a/libnm-core/nm-setting-8021x.c
+++ b/libnm-core/nm-setting-8021x.c
@@ -31,6 +31,8 @@
#include "nm-utils-private.h"
#include "nm-setting-private.h"
#include "nm-core-enum-types.h"
+#include "nm-macros-internal.h"
+#include "gsystem-local-alloc.h"
/**
* SECTION:nm-setting-8021x
@@ -60,8 +62,6 @@
* ISBN: 978-1587051548
**/
-#define SCHEME_PATH "file://"
-
G_DEFINE_TYPE_WITH_CODE (NMSetting8021x, nm_setting_802_1x, NM_TYPE_SETTING,
_nm_register_setting (802_1X, 2))
NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_802_1X)
@@ -400,25 +400,120 @@ nm_setting_802_1x_get_system_ca_certs (NMSetting8021x *setting)
}
static NMSetting8021xCKScheme
-get_cert_scheme (GBytes *bytes)
+get_cert_scheme (GBytes *bytes, GError **error)
{
- gconstpointer data;
+ const char *data;
gsize length;
- if (!bytes)
+ if (!bytes) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("data missing"));
return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
+ }
data = g_bytes_get_data (bytes, &length);
- if (!length)
+ return nm_setting_802_1x_check_cert_scheme (data, length, error);
+}
+
+/**
+ * nm_setting_802_1x_check_cert_scheme:
+ * @pdata: (allow-none): the data pointer
+ * @length: the length of the data
+ * @error: (allow-none): (out): validation reason
+ *
+ * Determines and verifies the blob type.
+ * When setting certificate properties of NMSetting8021x
+ * the blob must be not UNKNOWN (or NULL).
+ *
+ * Returns: the scheme of the blob or %NM_SETTING_802_1X_CK_SCHEME_UNKNOWN.
+ * For NULL it also returns NM_SETTING_802_1X_CK_SCHEME_UNKNOWN.
+ **/
+NMSetting8021xCKScheme
+nm_setting_802_1x_check_cert_scheme (gconstpointer pdata, gsize length, GError **error)
+{
+ const char *data = pdata;
+
+ g_return_val_if_fail (!length || data, NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
+
+ if (!length || !data) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("binary data missing"));
return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
+ }
+
+ /* interpret the blob as PATH if it starts with "file://". */
+ if ( length >= STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)
+ && !memcmp (data, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH))) {
+ /* But it must also be NUL terminated, contain at least
+ * one non-NUL character, and contain only one trailing NUL
+ * chracter.
+ * And ensure it's UTF-8 valid too so we can pass it through
+ * D-Bus and stuff like that. */
+
+ if (data[length - 1] != '\0') {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("file:// URI not NUL terminated"));
+ return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
+ }
+ length--;
+
+ if (length <= STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("file:// URI is empty"));
+ return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
+ }
+
+ if (!g_utf8_validate (data + STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH), length - STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH), NULL)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("file:// URI is not valid UTF-8"));
+ return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
+ }
- if ( (length > strlen (SCHEME_PATH))
- && !memcmp (data, SCHEME_PATH, strlen (SCHEME_PATH)))
return NM_SETTING_802_1X_CK_SCHEME_PATH;
+ }
return NM_SETTING_802_1X_CK_SCHEME_BLOB;
}
+static GByteArray *
+load_and_verify_certificate (const char *cert_path,
+ NMSetting8021xCKScheme scheme,
+ NMCryptoFileFormat *out_file_format,
+ GError **error)
+{
+ NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+ GByteArray *array;
+
+ array = crypto_load_and_verify_certificate (cert_path, &format, error);
+
+ if (!array || !array->len || format == NM_CRYPTO_FILE_FORMAT_UNKNOWN) {
+ /* the array is empty or the format is already unknown. */
+ format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+ } else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+ /* If we load the file as blob, we must ensure that the binary data does not
+ * start with file://. NMSetting8021x cannot represent blobs that start with
+ * file://.
+ * If that's the case, coerce the format to UNKNOWN. The callers will take care
+ * of that and not set the blob. */
+ if (nm_setting_802_1x_check_cert_scheme (array->data, array->len, NULL) != NM_SETTING_802_1X_CK_SCHEME_BLOB)
+ format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+ }
+
+ if (out_file_format)
+ *out_file_format = format;
+ return array;
+}
+
/**
* nm_setting_802_1x_get_ca_cert_scheme:
* @setting: the #NMSetting8021x
@@ -434,7 +529,7 @@ nm_setting_802_1x_get_ca_cert_scheme (NMSetting8021x *setting)
{
g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
- return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_cert);
+ return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_cert, NULL);
}
/**
@@ -488,20 +583,23 @@ nm_setting_802_1x_get_ca_cert_path (NMSetting8021x *setting)
g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL);
data = g_bytes_get_data (NM_SETTING_802_1X_GET_PRIVATE (setting)->ca_cert, NULL);
- return (const char *)data + strlen (SCHEME_PATH);
+ return (const char *)data + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
}
static GBytes *
path_to_scheme_value (const char *path)
{
GByteArray *array;
+ gsize len;
- g_return_val_if_fail (path != NULL, NULL);
+ g_return_val_if_fail (path != NULL && path[0], NULL);
- /* Add the path scheme tag to the front, then the fielname */
- array = g_byte_array_sized_new (strlen (path) + strlen (SCHEME_PATH) + 1);
- g_byte_array_append (array, (const guint8 *) SCHEME_PATH, strlen (SCHEME_PATH));
- g_byte_array_append (array, (const guint8 *) path, strlen (path));
+ len = strlen (path);
+
+ /* Add the path scheme tag to the front, then the filename */
+ array = g_byte_array_sized_new (len + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH) + 1);
+ g_byte_array_append (array, (const guint8 *) NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH));
+ g_byte_array_append (array, (const guint8 *) path, len);
g_byte_array_append (array, (const guint8 *) "\0", 1);
return g_byte_array_free_to_bytes (array);
@@ -558,7 +656,7 @@ nm_setting_802_1x_set_ca_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
/* wpa_supplicant can only use raw x509 CA certs */
if (format == NM_CRYPTO_FILE_FORMAT_X509) {
@@ -766,7 +864,7 @@ nm_setting_802_1x_get_client_cert_scheme (NMSetting8021x *setting)
{
g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
- return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->client_cert);
+ return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->client_cert, NULL);
}
/**
@@ -814,7 +912,7 @@ nm_setting_802_1x_get_client_cert_path (NMSetting8021x *setting)
g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL);
data = g_bytes_get_data (NM_SETTING_802_1X_GET_PRIVATE (setting)->client_cert, NULL);
- return (const char *)data + strlen (SCHEME_PATH);
+ return (const char *)data + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
}
/**
@@ -872,7 +970,7 @@ nm_setting_802_1x_set_client_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
gboolean valid = FALSE;
@@ -1029,7 +1127,7 @@ nm_setting_802_1x_get_phase2_ca_cert_scheme (NMSetting8021x *setting)
{
g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
- return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_cert);
+ return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_cert, NULL);
}
/**
@@ -1083,7 +1181,7 @@ nm_setting_802_1x_get_phase2_ca_cert_path (NMSetting8021x *setting)
g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL);
data = g_bytes_get_data (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_ca_cert, NULL);
- return (const char *)data + strlen (SCHEME_PATH);
+ return (const char *)data + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
}
/**
@@ -1137,7 +1235,7 @@ nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
/* wpa_supplicant can only use raw x509 CA certs */
if (format == NM_CRYPTO_FILE_FORMAT_X509) {
@@ -1349,7 +1447,7 @@ nm_setting_802_1x_get_phase2_client_cert_scheme (NMSetting8021x *setting)
{
g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
- return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_client_cert);
+ return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_client_cert, NULL);
}
/**
@@ -1397,7 +1495,7 @@ nm_setting_802_1x_get_phase2_client_cert_path (NMSetting8021x *setting)
g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL);
data = g_bytes_get_data (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_client_cert, NULL);
- return (const char *)data + strlen (SCHEME_PATH);
+ return (const char *)data + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
}
/**
@@ -1455,7 +1553,7 @@ nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
gboolean valid = FALSE;
@@ -1604,7 +1702,7 @@ nm_setting_802_1x_get_private_key_scheme (NMSetting8021x *setting)
{
g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
- return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key);
+ return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key, NULL);
}
/**
@@ -1656,7 +1754,7 @@ nm_setting_802_1x_get_private_key_path (NMSetting8021x *setting)
g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL);
data = g_bytes_get_data (NM_SETTING_802_1X_GET_PRIVATE (setting)->private_key, NULL);
- return (const char *)data + strlen (SCHEME_PATH);
+ return (const char *)data + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
}
static void
@@ -1678,7 +1776,7 @@ file_to_secure_bytes (const char *filename)
if (g_file_get_contents (filename, &contents, &length, NULL)) {
array = g_byte_array_sized_new (length);
g_byte_array_append (array, (guint8 *) contents, length);
- g_assert (array->len == length);
+ memset (contents, 0, length);
g_free (contents);
return g_bytes_new_with_free_func (array->data, array->len, free_secure_bytes, array);
}
@@ -1790,7 +1888,8 @@ nm_setting_802_1x_set_private_key (NMSetting8021x *setting,
priv->private_key_password = g_strdup (password);
if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
- /* Shouldn't fail this since we just verified the private key above */
+ /* FIXME: potential race after verifying the private key above */
+ /* FIXME: ensure blob doesn't start with file:// */
priv->private_key = file_to_secure_bytes (key_path);
g_assert (priv->private_key);
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
@@ -1941,7 +2040,7 @@ nm_setting_802_1x_get_phase2_private_key_scheme (NMSetting8021x *setting)
{
g_return_val_if_fail (NM_IS_SETTING_802_1X (setting), NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
- return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key);
+ return get_cert_scheme (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key, NULL);
}
/**
@@ -1993,7 +2092,7 @@ nm_setting_802_1x_get_phase2_private_key_path (NMSetting8021x *setting)
g_return_val_if_fail (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH, NULL);
data = g_bytes_get_data (NM_SETTING_802_1X_GET_PRIVATE (setting)->phase2_private_key, NULL);
- return (const char *)data + strlen (SCHEME_PATH);
+ return (const char *)data + strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
}
/**
@@ -2101,7 +2200,8 @@ nm_setting_802_1x_set_phase2_private_key (NMSetting8021x *setting,
priv->phase2_private_key_password = g_strdup (password);
if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
- /* Shouldn't fail this since we just verified the private key above */
+ /* FIXME: potential race after verifying the private key above */
+ /* FIXME: ensure blob doesn't start with file:// */
priv->phase2_private_key = file_to_secure_bytes (key_path);
g_assert (priv->phase2_private_key);
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH)
@@ -2575,35 +2675,18 @@ need_secrets (NMSetting *setting)
static gboolean
verify_cert (GBytes *bytes, const char *prop_name, GError **error)
{
- gconstpointer data;
- gsize length;
-
- if (!bytes)
- return TRUE;
+ GError *local = NULL;
- switch (get_cert_scheme (bytes)) {
- case NM_SETTING_802_1X_CK_SCHEME_BLOB:
+ if ( !bytes
+ || get_cert_scheme (bytes, &local) != NM_SETTING_802_1X_CK_SCHEME_UNKNOWN)
return TRUE;
- case NM_SETTING_802_1X_CK_SCHEME_PATH:
- /* For path-based schemes, verify that the path is zero-terminated */
- data = g_bytes_get_data (bytes, &length);
- if (((const guchar *)data)[length - 1] == '\0') {
- /* And ensure it's UTF-8 valid too so we can pass it through
- * D-Bus and stuff like that.
- */
- if (g_utf8_validate ((const char *)data + strlen (SCHEME_PATH), -1, NULL))
- return TRUE;
- }
- break;
- default:
- break;
- }
- g_set_error_literal (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("property is invalid"));
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("certificate is invalid: %s"), local->message);
g_prefix_error (error, "%s.%s: ", NM_SETTING_802_1X_SETTING_NAME, prop_name);
+ g_error_free (local);
return FALSE;
}
@@ -2805,7 +2888,7 @@ set_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_EAP:
g_slist_free_full (priv->eap, g_free);
- priv->eap = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->eap = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_IDENTITY:
g_free (priv->identity);
@@ -2839,7 +2922,7 @@ set_property (GObject *object, guint prop_id,
break;
case PROP_ALTSUBJECT_MATCHES:
g_slist_free_full (priv->altsubject_matches, g_free);
- priv->altsubject_matches = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->altsubject_matches = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_CLIENT_CERT:
if (priv->client_cert)
@@ -2891,7 +2974,7 @@ set_property (GObject *object, guint prop_id,
break;
case PROP_PHASE2_ALTSUBJECT_MATCHES:
g_slist_free_full (priv->phase2_altsubject_matches, g_free);
- priv->phase2_altsubject_matches = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->phase2_altsubject_matches = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_PHASE2_CLIENT_CERT:
if (priv->phase2_client_cert)
@@ -2977,7 +3060,7 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_EAP:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->eap));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->eap, TRUE));
break;
case PROP_IDENTITY:
g_value_set_string (value, priv->identity);
@@ -2998,7 +3081,7 @@ get_property (GObject *object, guint prop_id,
g_value_set_string (value, priv->subject_match);
break;
case PROP_ALTSUBJECT_MATCHES:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->altsubject_matches));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->altsubject_matches, TRUE));
break;
case PROP_CLIENT_CERT:
g_value_set_boxed (value, priv->client_cert);
@@ -3028,7 +3111,7 @@ get_property (GObject *object, guint prop_id,
g_value_set_string (value, priv->phase2_subject_match);
break;
case PROP_PHASE2_ALTSUBJECT_MATCHES:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->phase2_altsubject_matches));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->phase2_altsubject_matches, TRUE));
break;
case PROP_PHASE2_CLIENT_CERT:
g_value_set_boxed (value, priv->phase2_client_cert);
@@ -3848,7 +3931,10 @@ nm_setting_802_1x_class_init (NMSetting8021xClass *setting_class)
* specified at configure time with the --system-ca-path switch. The
* certificates in this directory are added to the verification chain in
* addition to any certificates specified by the #NMSetting8021x:ca-cert and
- * #NMSetting8021x:phase2-ca-cert properties.
+ * #NMSetting8021x:phase2-ca-cert properties. If the path provided with
+ * --system-ca-path is rather a file name (bundle of trusted CA certificates),
+ * it overrides #NMSetting8021x:ca-cert and #NMSetting8021x:phase2-ca-cert
+ * properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).
**/
/* ---ifcfg-rh---
* property: system-ca-certs
diff --git a/libnm-core/nm-setting-8021x.h b/libnm-core/nm-setting-8021x.h
index 43885daaa..3099fbd1d 100644
--- a/libnm-core/nm-setting-8021x.h
+++ b/libnm-core/nm-setting-8021x.h
@@ -31,6 +31,8 @@
G_BEGIN_DECLS
+#define NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH "file://"
+
/**
* NMSetting8021xCKFormat:
* @NM_SETTING_802_1X_CK_FORMAT_UNKNOWN: unknown file format
diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c
index 7bc927bc1..07b3401d1 100644
--- a/libnm-core/nm-setting-connection.c
+++ b/libnm-core/nm-setting-connection.c
@@ -27,6 +27,7 @@
#include "nm-utils.h"
#include "nm-utils-private.h"
+#include "nm-core-enum-types.h"
#include "nm-setting-connection.h"
#include "nm-connection-private.h"
#include "nm-setting-bond.h"
@@ -66,6 +67,7 @@ typedef struct {
char *type;
char *master;
char *slave_type;
+ NMSettingConnectionAutoconnectSlaves autoconnect_slaves;
GSList *permissions; /* list of Permission structs */
gboolean autoconnect;
gint autoconnect_priority;
@@ -90,6 +92,7 @@ enum {
PROP_ZONE,
PROP_MASTER,
PROP_SLAVE_TYPE,
+ PROP_AUTOCONNECT_SLAVES,
PROP_SECONDARIES,
PROP_GATEWAY_PING_TIMEOUT,
@@ -603,6 +606,25 @@ nm_setting_connection_is_slave_type (NMSettingConnection *setting,
}
/**
+ * nm_setting_connection_get_autoconnect_slaves:
+ * @setting: the #NMSettingConnection
+ *
+ * Returns the #NMSettingConnection:autoconnect-slaves property of the connection.
+ *
+ * Returns: whether slaves of the connection should be activated together
+ * with the connection.
+ *
+ * Since: 1.0.4
+ **/
+NMSettingConnectionAutoconnectSlaves
+nm_setting_connection_get_autoconnect_slaves (NMSettingConnection *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT);
+
+ return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->autoconnect_slaves;
+}
+
+/**
* nm_setting_connection_get_num_secondaries:
* @setting: the #NMSettingConnection
*
@@ -1122,9 +1144,12 @@ set_property (GObject *object, guint prop_id,
g_free (priv->slave_type);
priv->slave_type = g_value_dup_string (value);
break;
+ case PROP_AUTOCONNECT_SLAVES:
+ priv->autoconnect_slaves = g_value_get_enum (value);
+ break;
case PROP_SECONDARIES:
g_slist_free_full (priv->secondaries, g_free);
- priv->secondaries = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->secondaries = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_GATEWAY_PING_TIMEOUT:
priv->gateway_ping_timeout = g_value_get_uint (value);
@@ -1193,8 +1218,11 @@ get_property (GObject *object, guint prop_id,
case PROP_SLAVE_TYPE:
g_value_set_string (value, nm_setting_connection_get_slave_type (setting));
break;
+ case PROP_AUTOCONNECT_SLAVES:
+ g_value_set_enum (value, nm_setting_connection_get_autoconnect_slaves (setting));
+ break;
case PROP_SECONDARIES:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->secondaries));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->secondaries, TRUE));
break;
case PROP_GATEWAY_PING_TIMEOUT:
g_value_set_uint (value, priv->gateway_ping_timeout);
@@ -1524,6 +1552,37 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
G_PARAM_STATIC_STRINGS));
/**
+ * NMSettingConnection:autoconnect-slaves:
+ *
+ * Whether or not slaves of this connection should be automatically brought up
+ * when NetworkManager activates this connection. This only has a real effect
+ * for master connections.
+ * The permitted values are: 0: leave slave connections untouched,
+ * 1: activate all the slave connections with this connection, -1: default.
+ * If -1 (default) is set, global connection.autoconnect-slaves is read to
+ * determine the real value. If it is default as well, this fallbacks to 0.
+ *
+ * Since: 1.0.4
+ **/
+ /* ---ifcfg-rh---
+ * property: autoconnect-slaves
+ * variable: AUTOCONNECT-SLAVES(+)
+ * default: missing variable means global default
+ * description: Whether slaves of this connection should be auto-connected
+ * when this connection is activated.
+ * ---end---
+ */
+ g_object_class_install_property
+ (object_class, PROP_AUTOCONNECT_SLAVES,
+ g_param_spec_enum (NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES, "", "",
+ NM_TYPE_SETTING_CONNECTION_AUTOCONNECT_SLAVES,
+ NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ NM_SETTING_PARAM_FUZZY_IGNORE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
* NMSettingConnection:secondaries:
*
* List of connection UUIDs that should be activated when the base
@@ -1563,7 +1622,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
g_object_class_install_property
(object_class, PROP_GATEWAY_PING_TIMEOUT,
g_param_spec_uint (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, "", "",
- 0, 30, 0,
+ 0, 600, 0,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT |
G_PARAM_STATIC_STRINGS));
diff --git a/libnm-core/nm-setting-connection.h b/libnm-core/nm-setting-connection.h
index d1ad0fe1e..ff89d2008 100644
--- a/libnm-core/nm-setting-connection.h
+++ b/libnm-core/nm-setting-connection.h
@@ -56,9 +56,30 @@ G_BEGIN_DECLS
#define NM_SETTING_CONNECTION_ZONE "zone"
#define NM_SETTING_CONNECTION_MASTER "master"
#define NM_SETTING_CONNECTION_SLAVE_TYPE "slave-type"
+#define NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES "autoconnect-slaves"
#define NM_SETTING_CONNECTION_SECONDARIES "secondaries"
#define NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT "gateway-ping-timeout"
+/* Types for property values */
+/**
+ * NMSettingConnectionAutoconnectSlaves:
+ * @NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT: default value
+ * @NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO: slaves are not brought up when
+ * master is activated
+ * @NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES: slaves are brought up when
+ * master is activated
+ *
+ * #NMSettingConnectionAutoconnectSlaves values indicate whether slave connections
+ * should be activated when master is activated.
+ */
+NM_AVAILABLE_IN_1_0_4
+typedef enum {
+ NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT = -1,
+ NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO = 0,
+ NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES = 1,
+} NMSettingConnectionAutoconnectSlaves;
+
+
/**
* NMSettingConnection:
*
@@ -111,6 +132,8 @@ const char *nm_setting_connection_get_master (NMSettingConnection *set
gboolean nm_setting_connection_is_slave_type (NMSettingConnection *setting,
const char *type);
const char *nm_setting_connection_get_slave_type (NMSettingConnection *setting);
+NM_AVAILABLE_IN_1_0_4
+NMSettingConnectionAutoconnectSlaves nm_setting_connection_get_autoconnect_slaves (NMSettingConnection *setting);
guint32 nm_setting_connection_get_num_secondaries (NMSettingConnection *setting);
const char *nm_setting_connection_get_secondary (NMSettingConnection *setting, guint32 idx);
diff --git a/libnm-core/nm-setting-ip6-config.c b/libnm-core/nm-setting-ip6-config.c
index 29ca55152..7e3ae4d4d 100644
--- a/libnm-core/nm-setting-ip6-config.c
+++ b/libnm-core/nm-setting-ip6-config.c
@@ -504,9 +504,15 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *ip6_class)
* enabled, it makes the kernel generate a temporary IPv6 address in
* addition to the public one generated from MAC address via modified
* EUI-64. This enhances privacy, but could cause problems in some
- * applications, on the other hand. The permitted values are: 0: disabled,
- * 1: enabled (prefer public address), 2: enabled (prefer temporary
+ * applications, on the other hand. The permitted values are: -1: unknown,
+ * 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary
* addresses).
+ *
+ * Having a per-connection setting set to "-1" (unknown) means fallback to
+ * global configuration "ipv6.ip6-privacy".
+ *
+ * If also global configuration is unspecified or set to "-1", fallback to read
+ * "/proc/sys/net/ipv6/conf/default/use_tempaddr".
**/
/* ---ifcfg-rh---
* property: ip6-privacy
diff --git a/libnm-core/nm-setting-private.h b/libnm-core/nm-setting-private.h
index 2d34d509a..955608fae 100644
--- a/libnm-core/nm-setting-private.h
+++ b/libnm-core/nm-setting-private.h
@@ -155,4 +155,6 @@ gboolean _nm_setting_use_legacy_property (NMSetting *setting,
GPtrArray *_nm_setting_need_secrets (NMSetting *setting);
+NMSetting8021xCKScheme nm_setting_802_1x_check_cert_scheme (gconstpointer pdata, gsize length, GError **error);
+
#endif /* NM_SETTING_PRIVATE_H */
diff --git a/libnm-core/nm-setting-wireless-security.c b/libnm-core/nm-setting-wireless-security.c
index a56a8e975..6df5b4617 100644
--- a/libnm-core/nm-setting-wireless-security.c
+++ b/libnm-core/nm-setting-wireless-security.c
@@ -1132,15 +1132,15 @@ set_property (GObject *object, guint prop_id,
break;
case PROP_PROTO:
g_slist_free_full (priv->proto, g_free);
- priv->proto = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->proto = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_PAIRWISE:
g_slist_free_full (priv->pairwise, g_free);
- priv->pairwise = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->pairwise = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_GROUP:
g_slist_free_full (priv->group, g_free);
- priv->group = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->group = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_LEAP_USERNAME:
g_free (priv->leap_username);
@@ -1206,13 +1206,13 @@ get_property (GObject *object, guint prop_id,
g_value_set_string (value, priv->auth_alg);
break;
case PROP_PROTO:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->proto));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->proto, TRUE));
break;
case PROP_PAIRWISE:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->pairwise));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->pairwise, TRUE));
break;
case PROP_GROUP:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->group));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->group, TRUE));
break;
case PROP_LEAP_USERNAME:
g_value_set_string (value, priv->leap_username);
diff --git a/libnm-core/nm-setting-wireless.c b/libnm-core/nm-setting-wireless.c
index f8d22c2d0..ce3cf9a7e 100644
--- a/libnm-core/nm-setting-wireless.c
+++ b/libnm-core/nm-setting-wireless.c
@@ -911,7 +911,7 @@ set_property (GObject *object, guint prop_id,
break;
case PROP_SEEN_BSSIDS:
g_slist_free_full (priv->seen_bssids, g_free);
- priv->seen_bssids = _nm_utils_strv_to_slist (g_value_get_boxed (value));
+ priv->seen_bssids = _nm_utils_strv_to_slist (g_value_get_boxed (value), TRUE);
break;
case PROP_HIDDEN:
priv->hidden = g_value_get_boolean (value);
@@ -964,7 +964,7 @@ get_property (GObject *object, guint prop_id,
g_value_set_uint (value, nm_setting_wireless_get_mtu (setting));
break;
case PROP_SEEN_BSSIDS:
- g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->seen_bssids));
+ g_value_take_boxed (value, _nm_utils_slist_to_strv (priv->seen_bssids, TRUE));
break;
case PROP_HIDDEN:
g_value_set_boolean (value, nm_setting_wireless_get_hidden (setting));
diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c
index b78d9376f..e1e81b5de 100644
--- a/libnm-core/nm-setting.c
+++ b/libnm-core/nm-setting.c
@@ -91,7 +91,7 @@ _nm_gtype_hash (gconstpointer v)
return *((const GType *) v);
}
-static void __attribute__((constructor))
+static void
_ensure_registered (void)
{
if (G_UNLIKELY (registered_settings == NULL)) {
@@ -103,6 +103,12 @@ _ensure_registered (void)
}
}
+static void __attribute__((constructor))
+_ensure_registered_constructor (void)
+{
+ _ensure_registered ();
+}
+
#define _ensure_setting_info(self, priv) \
G_STMT_START { \
NMSettingPrivate *_priv_esi = (priv); \
@@ -1047,13 +1053,15 @@ compare_property (NMSetting *setting,
property = nm_setting_class_find_property (NM_SETTING_GET_CLASS (setting), prop_spec->name);
g_return_val_if_fail (property != NULL, FALSE);
- value1 = get_property_for_dbus (setting, property, FALSE);
- value2 = get_property_for_dbus (other, property, FALSE);
+ value1 = get_property_for_dbus (setting, property, TRUE);
+ value2 = get_property_for_dbus (other, property, TRUE);
cmp = nm_property_compare (value1, value2);
- g_variant_unref (value1);
- g_variant_unref (value2);
+ if (value1)
+ g_variant_unref (value1);
+ if (value2)
+ g_variant_unref (value2);
return cmp == 0;
}
diff --git a/libnm-core/nm-utils-private.h b/libnm-core/nm-utils-private.h
index 3854d6795..ffdc63156 100644
--- a/libnm-core/nm-utils-private.h
+++ b/libnm-core/nm-utils-private.h
@@ -40,12 +40,6 @@ GVariant * _nm_utils_bytes_to_dbus (const GValue *prop_value);
void _nm_utils_bytes_from_dbus (GVariant *dbus_value,
GValue *prop_value);
-GSList * _nm_utils_strv_to_slist (char **strv);
-char ** _nm_utils_slist_to_strv (GSList *slist);
-
-GPtrArray * _nm_utils_strv_to_ptrarray (char **strv);
-char ** _nm_utils_ptrarray_to_strv (GPtrArray *ptrarray);
-
char * _nm_utils_hwaddr_canonical_or_invalid (const char *mac, gssize length);
#endif
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index 5d4f11630..14686ed1f 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -22,6 +22,7 @@
#include "config.h"
#include <string.h>
+#include <errno.h>
#include <stdlib.h>
#include <netinet/ether.h>
#include <arpa/inet.h>
@@ -36,7 +37,7 @@
#include "nm-setting-private.h"
#include "crypto.h"
#include "gsystem-local-alloc.h"
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
#include "nm-setting-bond.h"
#include "nm-setting-bridge.h"
@@ -433,15 +434,85 @@ nm_utils_same_ssid (const guint8 *ssid1, gsize len1,
gboolean
_nm_utils_string_in_list (const char *str, const char **valid_strings)
{
- int i;
+ return _nm_utils_strv_find_first ((char **) valid_strings, -1, str) >= 0;
+}
- for (i = 0; valid_strings[i]; i++)
- if (strcmp (str, valid_strings[i]) == 0)
- break;
+/**
+ * _nm_utils_strv_find_first:
+ * @list: the strv list to search
+ * @len: the length of the list, or a negative value if @list is %NULL terminated.
+ * @needle: the value to search for. The search is done using strcmp().
+ *
+ * Searches @list for @needle and returns the index of the first match (based
+ * on strcmp()).
+ *
+ * For convenience, @list has type 'char**' instead of 'const char **'.
+ *
+ * Returns: index of first occurrence or -1 if @needle is not found in @list.
+ */
+gssize
+_nm_utils_strv_find_first (char **list, gssize len, const char *needle)
+{
+ gssize i;
+
+ if (len > 0) {
+ g_return_val_if_fail (list, -1);
+
+ if (!needle) {
+ /* if we search a list with known length, %NULL is a valid @needle. */
+ for (i = 0; i < len; i++) {
+ if (!list[i])
+ return i;
+ }
+ } else {
+ for (i = 0; i < len; i++) {
+ if (list[i] && !strcmp (needle, list[i]))
+ return i;
+ }
+ }
+ } else if (len < 0) {
+ g_return_val_if_fail (needle, -1);
- return valid_strings[i] != NULL;
+ if (list) {
+ for (i = 0; list[i]; i++) {
+ if (strcmp (needle, list[i]) == 0)
+ return i;
+ }
+ }
+ }
+ return -1;
}
+char **
+_nm_utils_strv_cleanup (char **strv,
+ gboolean strip_whitespace,
+ gboolean skip_empty,
+ gboolean skip_repeated)
+{
+ guint i, j;
+
+ if (!strv || !*strv)
+ return strv;
+
+ if (strip_whitespace) {
+ for (i = 0; strv[i]; i++)
+ g_strstrip (strv[i]);
+ }
+ if (!skip_empty && !skip_repeated)
+ return strv;
+ j = 0;
+ for (i = 0; strv[i]; i++) {
+ if ( (skip_empty && !*strv[i])
+ || (skip_repeated && _nm_utils_strv_find_first (strv, j, strv[i]) >= 0))
+ g_free (strv[i]);
+ else
+ strv[j++] = strv[i];
+ }
+ strv[j] = NULL;
+ return strv;
+}
+
+
gboolean
_nm_utils_string_slist_validate (GSList *list, const char **valid_values)
{
@@ -590,6 +661,65 @@ _nm_utils_copy_object_array (const GPtrArray *array)
return _nm_utils_copy_array (array, g_object_ref, g_object_unref);
}
+/* have @list of type 'gpointer *' instead of 'gconstpointer *' to
+ * reduce the necessity for annoying const-casts. */
+gssize
+_nm_utils_ptrarray_find_first (gpointer *list, gssize len, gconstpointer needle)
+{
+ gssize i;
+
+ if (len == 0)
+ return -1;
+
+ if (len > 0) {
+ g_return_val_if_fail (list, -1);
+ for (i = 0; i < len; i++) {
+ if (list[i] == needle)
+ return i;
+ }
+ } else {
+ g_return_val_if_fail (needle, -1);
+ for (i = 0; list && list[i]; i++) {
+ if (list[i] == needle)
+ return i;
+ }
+ }
+ return -1;
+}
+
+gssize
+_nm_utils_ptrarray_find_binary_search (gpointer *list, gsize len, gpointer needle, GCompareDataFunc cmpfcn, gpointer user_data)
+{
+ gssize imin, imax, imid;
+ int cmp;
+
+ g_return_val_if_fail (list || !len, ~((gssize) 0));
+ g_return_val_if_fail (cmpfcn, ~((gssize) 0));
+
+ imin = 0;
+ if (len == 0)
+ return ~imin;
+
+ imax = len - 1;
+
+ while (imin <= imax) {
+ imid = imin + (imax - imin) / 2;
+
+ cmp = cmpfcn (list[imid], needle, user_data);
+ if (cmp == 0)
+ return imid;
+
+ if (cmp < 0)
+ imin = imid + 1;
+ else
+ imax = imid - 1;
+ }
+
+ /* return the inverse of @imin. This is a negative number, but
+ * also is ~imin the position where the value should be inserted. */
+ return ~imin;
+}
+
GVariant *
_nm_utils_bytes_to_dbus (const GValue *prop_value)
{
@@ -625,21 +755,26 @@ _nm_utils_bytes_from_dbus (GVariant *dbus_value,
}
GSList *
-_nm_utils_strv_to_slist (char **strv)
+_nm_utils_strv_to_slist (char **strv, gboolean deep_copy)
{
int i;
GSList *list = NULL;
if (strv) {
- for (i = 0; strv[i]; i++)
- list = g_slist_prepend (list, g_strdup (strv[i]));
+ if (deep_copy) {
+ for (i = 0; strv[i]; i++)
+ list = g_slist_prepend (list, g_strdup (strv[i]));
+ } else {
+ for (i = 0; strv[i]; i++)
+ list = g_slist_prepend (list, strv[i]);
+ }
}
return g_slist_reverse (list);
}
char **
-_nm_utils_slist_to_strv (GSList *slist)
+_nm_utils_slist_to_strv (GSList *slist, gboolean deep_copy)
{
GSList *iter;
char **strv;
@@ -648,8 +783,13 @@ _nm_utils_slist_to_strv (GSList *slist)
len = g_slist_length (slist);
strv = g_new (char *, len + 1);
- for (i = 0, iter = slist; iter; iter = iter->next, i++)
- strv[i] = g_strdup (iter->data);
+ if (deep_copy) {
+ for (i = 0, iter = slist; iter; iter = iter->next, i++)
+ strv[i] = g_strdup (iter->data);
+ } else {
+ for (i = 0, iter = slist; iter; iter = iter->next, i++)
+ strv[i] = iter->data;
+ }
strv[i] = NULL;
return strv;
@@ -1942,6 +2082,8 @@ nm_utils_ip_routes_from_variant (GVariant *value,
return routes;
}
+/**********************************************************************************************/
+
/**
* nm_utils_uuid_generate:
*
@@ -2015,6 +2157,50 @@ nm_utils_uuid_generate_from_string (const char *s, gssize slen, int uuid_type, g
}
/**
+ * _nm_utils_uuid_generate_from_strings:
+ * @string1: a variadic list of strings. Must be NULL terminated.
+ *
+ * Returns a variant3 UUID based on the concatenated C strings.
+ * It does not simply concatenate them, but also includes the
+ * terminating '\0' character. For example "a", "b", gives
+ * "a\0b\0".
+ *
+ * This has the advantage, that the following invocations
+ * all give different UUIDs: (NULL), (""), ("",""), ("","a"), ("a",""),
+ * ("aa"), ("aa", ""), ("", "aa"), ...
+ */
+char *
+_nm_utils_uuid_generate_from_strings (const char *string1, ...)
+{
+ GString *str;
+ va_list args;
+ const char *s;
+ char *uuid;
+
+ if (!string1)
+ return nm_utils_uuid_generate_from_string (NULL, 0, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
+
+ str = g_string_sized_new (120); /* effectively allocates power of 2 (128)*/
+
+ g_string_append_len (str, string1, strlen (string1) + 1);
+
+ va_start (args, string1);
+ s = va_arg (args, const char *);
+ while (s) {
+ g_string_append_len (str, s, strlen (s) + 1);
+ s = va_arg (args, const char *);
+ }
+ va_end (args);
+
+ uuid = nm_utils_uuid_generate_from_string (str->str, str->len, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
+
+ g_string_free (str, TRUE);
+ return uuid;
+}
+
+/**********************************************************************************************/
+
+/**
* nm_utils_rsa_key_encrypt:
* @data: (array length=len): RSA private key data to be encrypted
* @len: length of @data
@@ -3278,3 +3464,79 @@ nm_utils_bond_mode_string_to_int (const char *mode)
}
return -1;
}
+
+/**********************************************************************************************/
+
+/* _nm_utils_ascii_str_to_int64:
+ *
+ * A wrapper for g_ascii_strtoll, that checks whether the whole string
+ * can be successfully converted to a number and is within a given
+ * range. On any error, @fallback will be returned and %errno will be set
+ * to a non-zero value. On success, %errno will be set to zero, check %errno
+ * for errors. Any trailing or leading (ascii) white space is ignored and the
+ * functions is locale independent.
+ *
+ * The function is guaranteed to return a value between @min and @max
+ * (inclusive) or @fallback. Also, the parsing is rather strict, it does
+ * not allow for any unrecognized characters, except leading and trailing
+ * white space.
+ **/
+gint64
+_nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback)
+{
+ gint64 v;
+ size_t len;
+ char buf[64], *s, *str_free = NULL;
+
+ if (str) {
+ while (g_ascii_isspace (str[0]))
+ str++;
+ }
+ if (!str || !str[0]) {
+ errno = EINVAL;
+ return fallback;
+ }
+
+ len = strlen (str);
+ if (g_ascii_isspace (str[--len])) {
+ /* backward search the first non-ws character.
+ * We already know that str[0] is non-ws. */
+ while (g_ascii_isspace (str[--len]))
+ ;
+
+ /* str[len] is now the last non-ws character... */
+ len++;
+
+ if (len >= sizeof (buf))
+ s = str_free = g_malloc (len + 1);
+ else
+ s = buf;
+
+ memcpy (s, str, len);
+ s[len] = 0;
+
+ nm_assert (len > 0 && len < strlen (str) && len == strlen (s));
+ nm_assert (!g_ascii_isspace (str[len-1]) && g_ascii_isspace (str[len]));
+ nm_assert (strncmp (str, s, len) == 0);
+
+ str = s;
+ }
+
+ errno = 0;
+ v = g_ascii_strtoll (str, &s, base);
+
+ if (errno != 0)
+ v = fallback;
+ else if (s[0] != 0) {
+ errno = EINVAL;
+ v = fallback;
+ } else if (v > max || v < min) {
+ errno = ERANGE;
+ v = fallback;
+ }
+
+ if (G_UNLIKELY (str_free))
+ g_free (str_free);
+ return v;
+}
+
diff --git a/libnm-core/nm-version.h b/libnm-core/nm-version.h
index 46103544b..e36d921e0 100644
--- a/libnm-core/nm-version.h
+++ b/libnm-core/nm-version.h
@@ -43,7 +43,7 @@
* Evaluates to the micro version number of NetworkManager which this source
* compiled against.
*/
-#define NM_MICRO_VERSION (2)
+#define NM_MICRO_VERSION (4)
/**
* NM_CHECK_VERSION:
@@ -67,9 +67,11 @@
#define NM_VERSION_0_9_8 (NM_ENCODE_VERSION (0, 9, 8))
#define NM_VERSION_0_9_10 (NM_ENCODE_VERSION (0, 9, 10))
#define NM_VERSION_1_0 (NM_ENCODE_VERSION (1, 0, 0))
+#define NM_VERSION_1_0_2 (NM_ENCODE_VERSION (1, 0, 2))
+#define NM_VERSION_1_0_4 (NM_ENCODE_VERSION (1, 0, 4))
-#define NM_VERSION_CUR_STABLE NM_VERSION_1_0
-#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0
+#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_2
+#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_4
#if !defined (NM_VERSION_MIN_REQUIRED) || (NM_VERSION_MIN_REQUIRED == 0)
# undef NM_VERSION_MIN_REQUIRED
@@ -120,4 +122,10 @@
# define NM_AVAILABLE_IN_1_0
#endif
+#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_0_4
+# define NM_AVAILABLE_IN_1_0_4 G_UNAVAILABLE(1,0.4)
+#else
+# define NM_AVAILABLE_IN_1_0_4
+#endif
+
#endif /* NM_VERSION_H */
diff --git a/libnm-core/nm-version.h.in b/libnm-core/nm-version.h.in
index bbbf993a9..9c9219e14 100644
--- a/libnm-core/nm-version.h.in
+++ b/libnm-core/nm-version.h.in
@@ -67,9 +67,11 @@
#define NM_VERSION_0_9_8 (NM_ENCODE_VERSION (0, 9, 8))
#define NM_VERSION_0_9_10 (NM_ENCODE_VERSION (0, 9, 10))
#define NM_VERSION_1_0 (NM_ENCODE_VERSION (1, 0, 0))
+#define NM_VERSION_1_0_2 (NM_ENCODE_VERSION (1, 0, 2))
+#define NM_VERSION_1_0_4 (NM_ENCODE_VERSION (1, 0, 4))
-#define NM_VERSION_CUR_STABLE NM_VERSION_1_0
-#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0
+#define NM_VERSION_CUR_STABLE NM_VERSION_1_0_2
+#define NM_VERSION_NEXT_STABLE NM_VERSION_1_0_4
#if !defined (NM_VERSION_MIN_REQUIRED) || (NM_VERSION_MIN_REQUIRED == 0)
# undef NM_VERSION_MIN_REQUIRED
@@ -120,4 +122,10 @@
# define NM_AVAILABLE_IN_1_0
#endif
+#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_0_4
+# define NM_AVAILABLE_IN_1_0_4 G_UNAVAILABLE(1,0.4)
+#else
+# define NM_AVAILABLE_IN_1_0_4
+#endif
+
#endif /* NM_VERSION_H */
diff --git a/libnm-core/tests/Makefile.am b/libnm-core/tests/Makefile.am
index 79aa73dbf..daa5825b5 100644
--- a/libnm-core/tests/Makefile.am
+++ b/libnm-core/tests/Makefile.am
@@ -15,6 +15,7 @@ noinst_PROGRAMS = \
test-compare \
test-crypto \
test-general \
+ test-keyfile \
test-secrets \
test-setting-8021x \
test-setting-dcb \
@@ -38,20 +39,22 @@ endif
# -name "test-pkcs12" \
# -out test-cert.p12
-EXTRA_DIST = \
- certs/test_ca_cert.pem \
- certs/test_ca_cert.der \
- certs/test_key_and_cert.pem \
- certs/test-cert.p12 \
- certs/test2_ca_cert.pem \
- certs/test2_key_and_cert.pem \
- certs/test2-cert.p12 \
- certs/ca-no-ending-newline.pem \
- certs/test-key-only.pem \
- certs/test-key-only-decrypted.der \
- certs/test-key-only-decrypted.pem \
- certs/pkcs8-enc-key.pem \
- certs/pkcs8-noenc-key.pem \
- certs/pkcs8-decrypted.der \
- certs/test-aes-key.pem
+EXTRA_DIST = \
+ certs/ca-no-ending-newline.pem \
+ certs/pkcs8-decrypted.der \
+ certs/pkcs8-enc-key.pem \
+ certs/pkcs8-noenc-key.pem \
+ certs/test2_ca_cert.pem \
+ certs/test2-cert.p12 \
+ certs/test2_key_and_cert.pem \
+ certs/test-aes-key.pem \
+ certs/test_ca_cert.der \
+ certs/test_ca_cert.pem \
+ certs/test-ca-cert.pem \
+ certs/test-cert.p12 \
+ certs/test_key_and_cert.pem \
+ certs/test-key-and-cert.pem \
+ certs/test-key-only-decrypted.der \
+ certs/test-key-only-decrypted.pem \
+ certs/test-key-only.pem
diff --git a/libnm-core/tests/Makefile.in b/libnm-core/tests/Makefile.in
index c2b15c6a6..edb6a50e8 100644
--- a/libnm-core/tests/Makefile.in
+++ b/libnm-core/tests/Makefile.in
@@ -90,7 +90,7 @@ build_triplet = @build@
host_triplet = @host@
@ENABLE_TESTS_TRUE@noinst_PROGRAMS = test-compare$(EXEEXT) \
@ENABLE_TESTS_TRUE@ test-crypto$(EXEEXT) test-general$(EXEEXT) \
-@ENABLE_TESTS_TRUE@ test-secrets$(EXEEXT) \
+@ENABLE_TESTS_TRUE@ test-keyfile$(EXEEXT) test-secrets$(EXEEXT) \
@ENABLE_TESTS_TRUE@ test-setting-8021x$(EXEEXT) \
@ENABLE_TESTS_TRUE@ test-setting-dcb$(EXEEXT) \
@ENABLE_TESTS_TRUE@ test-settings-defaults$(EXEEXT)
@@ -140,6 +140,12 @@ test_general_LDADD = $(LDADD)
@ENABLE_TESTS_TRUE@test_general_DEPENDENCIES = \
@ENABLE_TESTS_TRUE@ $(top_builddir)/libnm-core/libnm-core.la \
@ENABLE_TESTS_TRUE@ $(am__DEPENDENCIES_1)
+test_keyfile_SOURCES = test-keyfile.c
+test_keyfile_OBJECTS = test-keyfile.$(OBJEXT)
+test_keyfile_LDADD = $(LDADD)
+@ENABLE_TESTS_TRUE@test_keyfile_DEPENDENCIES = \
+@ENABLE_TESTS_TRUE@ $(top_builddir)/libnm-core/libnm-core.la \
+@ENABLE_TESTS_TRUE@ $(am__DEPENDENCIES_1)
test_secrets_SOURCES = test-secrets.c
test_secrets_OBJECTS = test-secrets.$(OBJEXT)
test_secrets_LDADD = $(LDADD)
@@ -198,12 +204,12 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
-SOURCES = test-compare.c test-crypto.c test-general.c test-secrets.c \
- test-setting-8021x.c test-setting-dcb.c \
- test-settings-defaults.c
-DIST_SOURCES = test-compare.c test-crypto.c test-general.c \
+SOURCES = test-compare.c test-crypto.c test-general.c test-keyfile.c \
test-secrets.c test-setting-8021x.c test-setting-dcb.c \
test-settings-defaults.c
+DIST_SOURCES = test-compare.c test-crypto.c test-general.c \
+ test-keyfile.c test-secrets.c test-setting-8021x.c \
+ test-setting-dcb.c test-settings-defaults.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -250,13 +256,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -370,6 +559,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -538,26 +728,28 @@ with_valgrind = @with_valgrind@
# -name "test-pkcs12" \
# -out test-cert.p12
EXTRA_DIST = \
- certs/test_ca_cert.pem \
- certs/test_ca_cert.der \
- certs/test_key_and_cert.pem \
- certs/test-cert.p12 \
- certs/test2_ca_cert.pem \
- certs/test2_key_and_cert.pem \
- certs/test2-cert.p12 \
- certs/ca-no-ending-newline.pem \
- certs/test-key-only.pem \
- certs/test-key-only-decrypted.der \
- certs/test-key-only-decrypted.pem \
- certs/pkcs8-enc-key.pem \
- certs/pkcs8-noenc-key.pem \
- certs/pkcs8-decrypted.der \
- certs/test-aes-key.pem
+ certs/ca-no-ending-newline.pem \
+ certs/pkcs8-decrypted.der \
+ certs/pkcs8-enc-key.pem \
+ certs/pkcs8-noenc-key.pem \
+ certs/test2_ca_cert.pem \
+ certs/test2-cert.p12 \
+ certs/test2_key_and_cert.pem \
+ certs/test-aes-key.pem \
+ certs/test_ca_cert.der \
+ certs/test_ca_cert.pem \
+ certs/test-ca-cert.pem \
+ certs/test-cert.p12 \
+ certs/test_key_and_cert.pem \
+ certs/test-key-and-cert.pem \
+ certs/test-key-only-decrypted.der \
+ certs/test-key-only-decrypted.pem \
+ certs/test-key-only.pem
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -609,6 +801,10 @@ test-general$(EXEEXT): $(test_general_OBJECTS) $(test_general_DEPENDENCIES) $(EX
@rm -f test-general$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_general_OBJECTS) $(test_general_LDADD) $(LIBS)
+test-keyfile$(EXEEXT): $(test_keyfile_OBJECTS) $(test_keyfile_DEPENDENCIES) $(EXTRA_test_keyfile_DEPENDENCIES)
+ @rm -f test-keyfile$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_keyfile_OBJECTS) $(test_keyfile_LDADD) $(LIBS)
+
test-secrets$(EXEEXT): $(test_secrets_OBJECTS) $(test_secrets_DEPENDENCIES) $(EXTRA_test_secrets_DEPENDENCIES)
@rm -f test-secrets$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_secrets_OBJECTS) $(test_secrets_LDADD) $(LIBS)
@@ -634,6 +830,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-compare.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-crypto.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-general.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-keyfile.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-secrets.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-setting-8021x.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-setting-dcb.Po@am__quote@
@@ -718,98 +915,217 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ color_start= color_end=; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
- else \
- skipped="($$skip tests were not run)"; \
- fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-compare.log: test-compare$(EXEEXT)
+ @p='test-compare$(EXEEXT)'; \
+ b='test-compare'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-crypto.log: test-crypto$(EXEEXT)
+ @p='test-crypto$(EXEEXT)'; \
+ b='test-crypto'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-general.log: test-general$(EXEEXT)
+ @p='test-general$(EXEEXT)'; \
+ b='test-general'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-keyfile.log: test-keyfile$(EXEEXT)
+ @p='test-keyfile$(EXEEXT)'; \
+ b='test-keyfile'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-secrets.log: test-secrets$(EXEEXT)
+ @p='test-secrets$(EXEEXT)'; \
+ b='test-secrets'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-setting-8021x.log: test-setting-8021x$(EXEEXT)
+ @p='test-setting-8021x$(EXEEXT)'; \
+ b='test-setting-8021x'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-setting-dcb.log: test-setting-dcb$(EXEEXT)
+ @p='test-setting-dcb$(EXEEXT)'; \
+ b='test-setting-dcb'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-settings-defaults.log: test-settings-defaults$(EXEEXT)
+ @p='test-settings-defaults$(EXEEXT)'; \
+ b='test-settings-defaults'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -866,6 +1182,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -961,7 +1280,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/libnm-core/tests/certs/test-ca-cert.pem b/libnm-core/tests/certs/test-ca-cert.pem
new file mode 100644
index 000000000..ef1be20d2
--- /dev/null
+++ b/libnm-core/tests/certs/test-ca-cert.pem
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEjzCCA3egAwIBAgIJAOvnZPt59yIZMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYD
+VQQGEwJVUzESMBAGA1UECBMJQmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcw
+FQYDVQQKEw5NeSBDb21wYW55IEx0ZDEQMA4GA1UECxMHVGVzdGluZzENMAsGA1UE
+AxMEdGVzdDEcMBoGCSqGSIb3DQEJARYNdGVzdEB0ZXN0LmNvbTAeFw0wOTAzMTAx
+NTEyMTRaFw0xOTAzMDgxNTEyMTRaMIGLMQswCQYDVQQGEwJVUzESMBAGA1UECBMJ
+QmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcwFQYDVQQKEw5NeSBDb21wYW55
+IEx0ZDEQMA4GA1UECxMHVGVzdGluZzENMAsGA1UEAxMEdGVzdDEcMBoGCSqGSIb3
+DQEJARYNdGVzdEB0ZXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKot9j+/+CX1/gZLgJHIXCRgCItKLGnf7qGbgqB9T2ACBqR0jllKWwDKrcWU
+xjXNIc+GF9Wnv+lX6G0Okn4Zt3/uRNobL+2b/yOF7M3Td3/9W873zdkQQX930YZc
+Rr8uxdRPP5bxiCgtcw632y21sSEbG9mjccAUnV/0jdvfmMNj0i8gN6E0fMBiJ9S3
+FkxX/KFvt9JWE9CtoyL7ki7UIDq+6vj7Gd5N0B3dOa1y+rRHZzKlJPcSXQSEYUS4
+HmKDwiKSVahft8c4tDn7KPi0vex91hlgZVd3usL2E/Vq7o5D9FAZ5kZY0AdFXwdm
+J4lO4Mj7ac7GE4vNERNcXVIX59sCAwEAAaOB8zCB8DAdBgNVHQ4EFgQUuDU3Mr7P
+T3n1e3Sy8hBauoDFahAwgcAGA1UdIwSBuDCBtYAUuDU3Mr7PT3n1e3Sy8hBauoDF
+ahChgZGkgY4wgYsxCzAJBgNVBAYTAlVTMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAO
+BgNVBAcTB05ld2J1cnkxFzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMRAwDgYDVQQL
+EwdUZXN0aW5nMQ0wCwYDVQQDEwR0ZXN0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRl
+c3QuY29tggkA6+dk+3n3IhkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
+AQEAVRG4aALIvCXCiKfe7K+iJxjBVRDFPEf7JWA9LGgbFOn6pNvbxonrR+0BETdc
+JV1ET4ct2xsE7QNFIkp9GKRC+6J32zCo8qtLCD5+v436r8TUG2/t2JRMkb9I2XVT
+p7RJoot6M0Ltf8KNQUPYh756xmKZ4USfQUwc58MOSDGY8VWEXJOYij9Pf0e0c52t
+qiCEjXH7uXiS8Pgq9TYm7AkWSOrglYhSa83x0f8mtT8Q15nBESIHZ6o8FAS2bBgn
+B0BkrKRjtBUkuJG3vTox+bYINh2Gxi1JZHWSV1tN5z3hd4VFcKqanW5OgQwToBqp
+3nniskIjbH0xjgZf/nVMyLnjxg==
+-----END CERTIFICATE-----
diff --git a/libnm-core/tests/certs/test-key-and-cert.pem b/libnm-core/tests/certs/test-key-and-cert.pem
new file mode 100644
index 000000000..dec9aa1b8
--- /dev/null
+++ b/libnm-core/tests/certs/test-key-and-cert.pem
@@ -0,0 +1,118 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,4DE0615F23D82107
+
+QPNCO5Dobvz9dDhN32KkZRoEifW+HDm2PCbRQhKDiscGwB6LgypvVjHNsZiFKwzz
+L4R51UqgQeJx7GSGJqE626e9z9J+UNBhop02aOO2X0eSPdvBzr/uJ6Umiyr1xqD7
+zWf7u9l5kXElDJRhK+87GMBewp4Ie9NeXDjhF8hzC5Kiulen4AH3AYnfH3S7DimU
+h8GFMg8inrudrTbcjBhCdPeHG2jCygOxw3InRFz7uaN6LIhOaPQvmvpP4Cc1WRnW
+ZPq9o+eU3fPWPD5t+Op/VzYLvKwgBy/yK1rQXUm6ZMO7MhhRJ94ZCsJv+nVWpJlv
+QyBlxDKxwfkfYbDELdnnDQdHdMbKatLqa0KhSkgpp8LywBtanPz731tyT0r7b3na
+eLdra59lRU7ZQLPEdS3lPZd2O/KQvWf8wbg7MjXS9LxQ7R5HOPu6DNJlwXVZBmmo
+cAfu2q8ubU2IePvWLD1GOrBi6hE9TiGvFJkw+wBK+t72sz3njv9Xm/zlxruaEk5m
+RW/kybU3FP4PtjriBbskz3/VZaaxuRN7OoOYTkmyHmG1ADgcRUV6fea19qqsBlN8
+xb+SRtoH28oT/JVWU5neE2dbNzk5LeVO+w70NNdR5s5xqkBhbGGaJxvXwNP4ltFr
+T06SMh8znOLKwWB00aRtwfU7jOwR3mOleQO4ugIHmau3zp1TqzAHW8XtpuV7qVeI
+ESZOZuf0vW43BtNzgLXt1+r+bmsMsRwhnyomL9M0TUyyBdVYY9GkzTG9pOESheRo
+RSvAZ8qKGUliTpgBcbt2v1+NqkszcHa6FxuvS8YU4uo5/GqsgTxHTNIB232hIrrZ
+EIm6QL9TC5oFXMjy6UNqoCm5Nb8DBJ6aErt7pt7aoktqUW3O3QIzQT3IbZ4nAcTt
+lVF4d7j29I9t7bcC8GOVU1neilguZUss4ghJg9x4zI5UZdR7hZ8fbFT47TyxB+j5
+r0YdmjbjVTaSyaN2JGh1wvb4TzawGNVx/U2EJE16HigOtPfsfQRJ3x+FROKBdVa4
+aIFYXkRBeIPxX6n9pcw0lBCsnXo6/5iTjQSk2VqO3rHO/wyWiEjNczhL33dY2A8W
+GG5ECMO5SqXZHQQzpABqK94dxe3UC8aEESO5NhEqDuV7qQGol0qPKrUA3wb0jb2e
+DrejJ9HS2m1SUDmjpvvmEGy6GN7CRibbKt5rNZdJNNvWArOF5d0F6wkixQLl73oE
+lq5gLQQk9n7ClleKLhlQpBCorxilBbzmSUekkJLi0eaZiBBFWBX9udqnUZloXTgO
+8qwuO8K/GPR9Jy1/UH2Vh1H+wivaqKTVgEb0NotzgzECgTEFKJafl7rUNs1OZRZ3
+VBjevi6+iDpxVFgF71kXfdUC4ph0E1XDl0ja2rrKQGivMkUhWJ57+4EV5+hBkAnt
+G0RV45NwHXLrK2bd8F9PlRk2XHW6mIcFRXsW1DjeBhk/sQjvlO9R01GRSgcXtekJ
+tmX17FWrMrzXHpvy1IC3fk4RVnSjpzQ8O+17YE8/la9wVaeZZzHyYFmMT7VXjIhW
+QozJQ0vJ2jxJRh5GYn3tpJzdaeRfvTBik0pChNdUTnWP+BJ35xoCTs8iwJbmgVZ1
+-----END RSA PRIVATE KEY-----
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=US, ST=Berkshire, L=Newbury, O=My Company Ltd, OU=Testing, CN=test/emailAddress=test@test.com
+ Validity
+ Not Before: Mar 10 15:13:16 2009 GMT
+ Not After : Mar 8 15:13:16 2019 GMT
+ Subject: C=US, ST=Berkshire, O=My Company Ltd, OU=Testing, CN=test1/emailAddress=test@test.com
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (2048 bit)
+ Modulus (2048 bit):
+ 00:cd:34:b1:2e:b0:04:c6:f4:2b:a2:c0:a0:39:7a:
+ 82:ed:96:c4:f7:19:83:91:5c:b4:e7:9c:de:ec:48:
+ ec:2d:e4:51:08:26:42:ac:d3:98:26:7a:72:f7:49:
+ c2:9e:66:05:c6:47:29:fe:3b:ac:6b:af:6f:5e:a8:
+ 03:5a:73:33:ba:19:03:00:35:f5:00:bc:a8:be:14:
+ ce:46:69:e3:6d:ed:34:37:85:55:87:62:b3:b7:c9:
+ c0:cc:9a:aa:61:05:5b:cd:a2:17:42:d3:e5:6f:1c:
+ 60:8d:c2:15:41:46:f8:12:54:d0:38:57:e1:fd:8d:
+ 44:c8:fb:56:b3:b9:6c:e9:f8:9e:21:11:57:1b:8b:
+ f9:cf:e3:17:e7:d8:fd:ac:d1:01:c6:92:30:f3:2d:
+ c9:d6:c1:f0:3d:fd:ca:30:dd:75:74:e7:d1:6b:75:
+ d8:c5:4d:43:61:fe:f6:ad:7e:4c:63:7c:03:17:a2:
+ 06:8f:d0:8b:69:d3:7a:07:0f:0b:a2:cf:0c:70:38:
+ ba:cc:55:35:60:84:58:d8:d2:be:1f:ef:76:a9:ba:
+ ae:6a:dc:08:97:80:de:42:00:b7:d4:ce:9a:b0:36:
+ 2a:c7:6f:45:04:7c:ea:41:19:d8:b9:19:04:1f:11:
+ a9:22:80:bd:69:08:15:0d:3c:de:cd:7e:88:6c:0f:
+ a3:43
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ Netscape Comment:
+ OpenSSL Generated Certificate
+ X509v3 Subject Key Identifier:
+ CE:03:7E:EF:E7:DE:C9:87:BF:DE:56:F4:C8:A3:40:F6:C8:6F:05:8C
+ X509v3 Authority Key Identifier:
+ keyid:B8:35:37:32:BE:CF:4F:79:F5:7B:74:B2:F2:10:5A:BA:80:C5:6A:10
+ DirName:/C=US/ST=Berkshire/L=Newbury/O=My Company Ltd/OU=Testing/CN=test/emailAddress=test@test.com
+ serial:EB:E7:64:FB:79:F7:22:19
+
+ Signature Algorithm: md5WithRSAEncryption
+ 7a:20:93:63:40:73:7d:33:01:2e:c0:13:52:a4:a7:e1:4d:82:
+ f4:fb:b2:7b:d0:2b:5a:3f:0e:3c:28:61:71:ab:01:4d:fe:89:
+ b5:cd:2f:97:59:93:53:9d:51:86:48:dd:b9:e4:73:5e:22:0b:
+ 12:0d:25:39:76:16:44:06:0c:40:45:21:6b:a6:b1:e0:bf:76:
+ 1b:36:f3:1e:41:82:57:d9:59:b7:60:40:43:1c:1d:79:f6:48:
+ 32:5c:4e:e2:06:89:96:41:d2:54:1f:4a:6f:f6:78:a5:3c:02:
+ 85:21:e2:65:e1:8a:6d:24:19:95:f8:c0:35:ab:bd:ff:3d:f1:
+ fb:50:2d:30:1e:67:a6:7c:50:f9:d5:77:66:77:5a:14:0f:5c:
+ cd:21:09:9b:a3:92:57:19:dd:01:a4:18:c5:f9:70:e4:17:43:
+ 8d:b1:e6:61:e9:50:89:83:4f:ce:a4:57:68:58:40:70:ae:71:
+ 1c:47:66:d2:30:54:50:ea:3a:87:32:64:3b:18:42:fe:5a:19:
+ 07:64:f7:f1:b1:10:07:fd:a7:d2:a7:a8:05:79:5b:25:ba:69:
+ 7b:1a:3e:b1:3e:e4:17:17:01:ba:eb:54:ae:83:00:ed:66:62:
+ 8d:c0:3e:8a:b4:27:5f:e9:01:ce:20:c3:34:a9:28:c0:6f:c7:
+ 3b:65:fe:f9
+-----BEGIN CERTIFICATE-----
+MIIEojCCA4qgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCVVMx
+EjAQBgNVBAgTCUJlcmtzaGlyZTEQMA4GA1UEBxMHTmV3YnVyeTEXMBUGA1UEChMO
+TXkgQ29tcGFueSBMdGQxEDAOBgNVBAsTB1Rlc3RpbmcxDTALBgNVBAMTBHRlc3Qx
+HDAaBgkqhkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wHhcNMDkwMzEwMTUxMzE2WhcN
+MTkwMzA4MTUxMzE2WjB6MQswCQYDVQQGEwJVUzESMBAGA1UECBMJQmVya3NoaXJl
+MRcwFQYDVQQKEw5NeSBDb21wYW55IEx0ZDEQMA4GA1UECxMHVGVzdGluZzEOMAwG
+A1UEAxMFdGVzdDExHDAaBgkqhkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNNLEusATG9CuiwKA5eoLtlsT3GYOR
+XLTnnN7sSOwt5FEIJkKs05gmenL3ScKeZgXGRyn+O6xrr29eqANaczO6GQMANfUA
+vKi+FM5GaeNt7TQ3hVWHYrO3ycDMmqphBVvNohdC0+VvHGCNwhVBRvgSVNA4V+H9
+jUTI+1azuWzp+J4hEVcbi/nP4xfn2P2s0QHGkjDzLcnWwfA9/cow3XV059FrddjF
+TUNh/vatfkxjfAMXogaP0Itp03oHDwuizwxwOLrMVTVghFjY0r4f73apuq5q3AiX
+gN5CALfUzpqwNirHb0UEfOpBGdi5GQQfEakigL1pCBUNPN7NfohsD6NDAgMBAAGj
+ggEfMIIBGzAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy
+YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUzgN+7+feyYe/3lb0yKNA9shvBYww
+gcAGA1UdIwSBuDCBtYAUuDU3Mr7PT3n1e3Sy8hBauoDFahChgZGkgY4wgYsxCzAJ
+BgNVBAYTAlVTMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAOBgNVBAcTB05ld2J1cnkx
+FzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMRAwDgYDVQQLEwdUZXN0aW5nMQ0wCwYD
+VQQDEwR0ZXN0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRlc3QuY29tggkA6+dk+3n3
+IhkwDQYJKoZIhvcNAQEEBQADggEBAHogk2NAc30zAS7AE1Kkp+FNgvT7snvQK1o/
+DjwoYXGrAU3+ibXNL5dZk1OdUYZI3bnkc14iCxINJTl2FkQGDEBFIWumseC/dhs2
+8x5BglfZWbdgQEMcHXn2SDJcTuIGiZZB0lQfSm/2eKU8AoUh4mXhim0kGZX4wDWr
+vf898ftQLTAeZ6Z8UPnVd2Z3WhQPXM0hCZujklcZ3QGkGMX5cOQXQ42x5mHpUImD
+T86kV2hYQHCucRxHZtIwVFDqOocyZDsYQv5aGQdk9/GxEAf9p9KnqAV5WyW6aXsa
+PrE+5BcXAbrrVK6DAO1mYo3APoq0J1/pAc4gwzSpKMBvxztl/vk=
+-----END CERTIFICATE-----
diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c
index 7df4e57aa..bd144f384 100644
--- a/libnm-core/tests/test-general.c
+++ b/libnm-core/tests/test-general.c
@@ -19,6 +19,8 @@
*
*/
+#define NM_GLIB_COMPAT_H_TEST
+
#include "config.h"
#include <glib.h>
@@ -57,6 +59,7 @@
#include "nm-setting-wireless.h"
#include "nm-setting-wireless-security.h"
#include "nm-simple-connection.h"
+#include "nm-glib-compat.h"
#include "nm-test-utils.h"
@@ -1963,6 +1966,7 @@ test_connection_diff_a_only (void)
{ NM_SETTING_CONNECTION_ZONE, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_MASTER, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_DIFF_RESULT_IN_A },
+ { NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_SECONDARIES, NM_SETTING_DIFF_RESULT_IN_A },
{ NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, NM_SETTING_DIFF_RESULT_IN_A },
{ NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }
@@ -4038,6 +4042,410 @@ test_nm_utils_uuid_generate_from_string (void)
_test_uuid (NM_UTILS_UUID_TYPE_VARIANT3, "002a0ada-f547-375a-bab5-896a11d1927e", "a\0b", 3, UUID_NS_DNS);
}
+/*******************************************/
+
+static void
+__test_uuid (const char *expected_uuid, const char *str, gssize slen, char *uuid_test)
+{
+ g_assert (uuid_test);
+ g_assert (nm_utils_is_uuid (uuid_test));
+
+ if (strcmp (uuid_test, expected_uuid)) {
+ g_error ("UUID test failed (1): text=%s, len=%lld, expected=%s, uuid_test=%s",
+ str, (long long) slen, expected_uuid, uuid_test);
+ }
+ g_free (uuid_test);
+
+ uuid_test = nm_utils_uuid_generate_from_string (str, slen, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
+
+ g_assert (uuid_test);
+ g_assert (nm_utils_is_uuid (uuid_test));
+
+ if (strcmp (uuid_test, expected_uuid)) {
+ g_error ("UUID test failed (2): text=%s; len=%lld, expected=%s, uuid2=%s",
+ str, (long long) slen, expected_uuid, uuid_test);
+ }
+ g_free (uuid_test);
+}
+
+#define _test_uuid(expected_uuid, str, strlen, ...) __test_uuid (expected_uuid, str, strlen, _nm_utils_uuid_generate_from_strings(__VA_ARGS__, NULL))
+
+static void
+test_nm_utils_uuid_generate_from_strings (void)
+{
+ _test_uuid ("b07c334a-399b-32de-8d50-58e4e08f98e3", "", 0, NULL);
+ _test_uuid ("b8a426cb-bcb5-30a3-bd8f-6786fea72df9", "\0", 1, "");
+ _test_uuid ("12a4a982-7aae-39e1-951e-41aeb1250959", "a\0", 2, "a");
+ _test_uuid ("69e22c7e-f89f-3a43-b239-1cb52ed8db69", "aa\0", 3, "aa");
+ _test_uuid ("59829fd3-5ad5-3d90-a7b0-4911747e4088", "\0\0", 2, "", "");
+ _test_uuid ("01ad0e06-6c50-3384-8d86-ddab81421425", "a\0\0", 3, "a", "");
+ _test_uuid ("e1ed8647-9ed3-3ec8-8c6d-e8204524d71d", "aa\0\0", 4, "aa", "");
+ _test_uuid ("fb1c7cd6-275c-3489-9382-83b900da8af0", "\0a\0", 3, "", "a");
+ _test_uuid ("5d79494e-c4ba-31a6-80a2-d6016ccd7e17", "a\0a\0", 4, "a", "a");
+ _test_uuid ("fd698d86-1b60-3ebe-855f-7aada9950a8d", "aa\0a\0", 5, "aa", "a");
+ _test_uuid ("8c573b48-0f01-30ba-bb94-c5f59f4fe517", "\0aa\0", 4, "", "aa");
+ _test_uuid ("2bdd3d46-eb83-3c53-a41b-a724d04b5544", "a\0aa\0", 5, "a", "aa");
+ _test_uuid ("13d4b780-07c1-3ba7-b449-81c4844ef039", "aa\0aa\0", 6, "aa", "aa");
+ _test_uuid ("dd265bf7-c05a-3037-9939-b9629858a477", "a\0b\0", 4, "a", "b");
+}
+
+/******************************************************************************/
+
+static void
+test_nm_utils_ascii_str_to_int64_check (const char *str, guint base, gint64 min,
+ gint64 max, gint64 fallback, int exp_errno,
+ gint64 exp_val)
+{
+ gint64 v;
+
+ errno = 1;
+ v = _nm_utils_ascii_str_to_int64 (str, base, min, max, fallback);
+ g_assert_cmpint (errno, ==, exp_errno);
+ g_assert_cmpint (v, ==, exp_val);
+}
+
+static void
+test_nm_utils_ascii_str_to_int64_do (const char *str, guint base, gint64 min,
+ gint64 max, gint64 fallback, int exp_errno,
+ gint64 exp_val)
+{
+ const char *sign = "";
+ const char *val;
+ static const char *whitespaces[] = {
+ "",
+ " ",
+ "\r\n\t",
+ " \r\n\t ",
+ " \r\n\t \t\r\n\t",
+ NULL,
+ };
+ static const char *nulls[] = {
+ "",
+ "0",
+ "00",
+ "0000",
+ "0000000000000000",
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ NULL,
+ };
+ const char **ws_pre, **ws_post, **null;
+ guint i;
+
+ if (str == NULL || exp_errno != 0) {
+ test_nm_utils_ascii_str_to_int64_check (str, base, min, max, fallback, exp_errno, exp_val);
+ return;
+ }
+
+ if (strncmp (str, "-", 1) == 0)
+ sign = "-";
+
+ val = str + strlen (sign);
+
+ for (ws_pre = whitespaces; *ws_pre; ws_pre++) {
+ for (ws_post = whitespaces; *ws_post; ws_post++) {
+ for (null = nulls; *null; null++) {
+ for (i = 0; ; i++) {
+ char *s;
+ const char *str_base = "";
+
+ if (base == 16) {
+ if (i == 1)
+ str_base = "0x";
+ else if (i > 1)
+ break;
+ } else if (base == 8) {
+ if (i == 1)
+ str_base = "0";
+ else if (i > 1)
+ break;
+ } else if (base == 0) {
+ if (i > 0)
+ break;
+ /* with base==0, a leading zero would be interpreted as octal. Only test without *null */
+ if ((*null)[0])
+ break;
+ } else {
+ if (i > 0)
+ break;
+ }
+
+ s = g_strdup_printf ("%s%s%s%s%s%s", *ws_pre, sign, str_base, *null, val, *ws_post);
+
+ test_nm_utils_ascii_str_to_int64_check (s, base, min, max, fallback, exp_errno, exp_val);
+ g_free (s);
+ }
+ }
+ }
+ }
+}
+
+static void
+test_nm_utils_ascii_str_to_int64 (void)
+{
+ test_nm_utils_ascii_str_to_int64_do (NULL, 10, 0, 10000, -1, EINVAL, -1);
+ test_nm_utils_ascii_str_to_int64_do ("", 10, 0, 10000, -1, EINVAL, -1);
+ test_nm_utils_ascii_str_to_int64_do ("1x", 10, 0, 10000, -1, EINVAL, -1);
+ test_nm_utils_ascii_str_to_int64_do ("4711", 10, 0, 10000, -1, 0, 4711);
+ test_nm_utils_ascii_str_to_int64_do ("10000", 10, 0, 10000, -1, 0, 10000);
+ test_nm_utils_ascii_str_to_int64_do ("10001", 10, 0, 10000, -1, ERANGE, -1);
+ test_nm_utils_ascii_str_to_int64_do ("FF", 16, 0, 10000, -1, 0, 255);
+ test_nm_utils_ascii_str_to_int64_do ("FF", 10, 0, 10000, -2, EINVAL, -2);
+ test_nm_utils_ascii_str_to_int64_do ("9223372036854775807", 10, 0, G_MAXINT64, -2, 0, G_MAXINT64);
+ test_nm_utils_ascii_str_to_int64_do ("7FFFFFFFFFFFFFFF", 16, 0, G_MAXINT64, -2, 0, G_MAXINT64);
+ test_nm_utils_ascii_str_to_int64_do ("9223372036854775808", 10, 0, G_MAXINT64, -2, ERANGE, -2);
+ test_nm_utils_ascii_str_to_int64_do ("-9223372036854775808", 10, G_MININT64, 0, -2, 0, G_MININT64);
+ test_nm_utils_ascii_str_to_int64_do ("-9223372036854775808", 10, G_MININT64+1, 0, -2, ERANGE, -2);
+ test_nm_utils_ascii_str_to_int64_do ("-9223372036854775809", 10, G_MININT64, 0, -2, ERANGE, -2);
+ test_nm_utils_ascii_str_to_int64_do ("1.0", 10, 1, 1, -1, EINVAL, -1);
+ test_nm_utils_ascii_str_to_int64_do ("1x0", 16, -10, 10, -100, EINVAL, -100);
+ test_nm_utils_ascii_str_to_int64_do ("0", 16, -10, 10, -100, 0, 0);
+ test_nm_utils_ascii_str_to_int64_do ("10001111", 2, -1000, 1000, -100000, 0, 0x8F);
+ test_nm_utils_ascii_str_to_int64_do ("-10001111", 2, -1000, 1000, -100000, 0, -0x8F);
+ test_nm_utils_ascii_str_to_int64_do ("1111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7F);
+ test_nm_utils_ascii_str_to_int64_do ("111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFF);
+ test_nm_utils_ascii_str_to_int64_do ("11111111111111111111111111111111111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFFFFFFFFFF);
+ test_nm_utils_ascii_str_to_int64_do ("111111111111111111111111111111111111111111111111111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFFFFFFFFFFFFFF);
+ test_nm_utils_ascii_str_to_int64_do ("100000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, 0, 0x4000000000000000);
+ test_nm_utils_ascii_str_to_int64_do ("1000000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, ERANGE, -1);
+ test_nm_utils_ascii_str_to_int64_do ("-100000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, 0, -0x4000000000000000);
+ test_nm_utils_ascii_str_to_int64_do ("111111111111111111111111111111111111111111111111111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFFFFFFFFFFFFFF);
+ test_nm_utils_ascii_str_to_int64_do ("-100000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, 0, -0x4000000000000000);
+ test_nm_utils_ascii_str_to_int64_do ("0x70", 10, G_MININT64, G_MAXINT64, -1, EINVAL, -1);
+ test_nm_utils_ascii_str_to_int64_do ("4711", 0, G_MININT64, G_MAXINT64, -1, 0, 4711);
+ test_nm_utils_ascii_str_to_int64_do ("04711", 0, G_MININT64, G_MAXINT64, -1, 0, 04711);
+ test_nm_utils_ascii_str_to_int64_do ("0x4711", 0, G_MININT64, G_MAXINT64, -1, 0, 0x4711);
+ test_nm_utils_ascii_str_to_int64_do ("080", 0, G_MININT64, G_MAXINT64, -1, EINVAL, -1);
+ test_nm_utils_ascii_str_to_int64_do ("070", 0, G_MININT64, G_MAXINT64, -1, 0, 7*8);
+ test_nm_utils_ascii_str_to_int64_do ("0x70", 0, G_MININT64, G_MAXINT64, -1, 0, 0x70);
+}
+
+/******************************************************************************/
+
+enum TEST_IS_POWER_OF_TWP_ENUM_SIGNED {
+ _DUMMY_1 = -1,
+};
+
+enum TEST_IS_POWER_OF_TWP_ENUM_UNSIGNED {
+ _DUMMY_2,
+};
+
+enum TEST_IS_POWER_OF_TWP_ENUM_SIGNED_64 {
+ _DUMMY_3 = (1LL << 40),
+};
+
+enum TEST_IS_POWER_OF_TWP_ENUM_UNSIGNED_64 {
+ _DUMMY_4a = -1,
+ _DUMMY_4b = (1LL << 40),
+};
+
+#define test_nm_utils_is_power_of_two_do(type, x, expect) \
+ G_STMT_START { \
+ typeof (x) x1 = (x); \
+ type x2 = (type) x1; \
+ \
+ if (((typeof (x1)) x2) == x1 && (x2 > 0 || x2 == 0)) { \
+ /* x2 equals @x, and is positive. Compare to @expect */ \
+ g_assert_cmpint (expect, ==, nm_utils_is_power_of_two (x2)); \
+ } else if (!(x2 > 0) && !(x2 == 0)) { \
+ /* a (signed) negative value is always FALSE. */ \
+ g_assert_cmpint (FALSE, ==, nm_utils_is_power_of_two (x2));\
+ } \
+ g_assert_cmpint (expect, ==, nm_utils_is_power_of_two (x1)); \
+ } G_STMT_END
+
+static void
+test_nm_utils_is_power_of_two (void)
+{
+ guint64 xyes, xno;
+ gint i, j;
+ GRand *rand = nmtst_get_rand ();
+ int numbits;
+
+ for (i = -1; i < 64; i++) {
+
+ /* find a (positive) x which is a power of two. */
+ if (i == -1)
+ xyes = 0;
+ else {
+ xyes = (1LL << i);
+ g_assert (xyes != 0);
+ }
+
+ xno = xyes;
+ if (xyes != 0) {
+again:
+ /* Find another @xno, that is not a power of two. Do that,
+ * by randomly setting bits. */
+ numbits = g_rand_int_range (rand, 1, 65);
+ while (xno != ~((guint64) 0) && numbits > 0) {
+ guint64 v = (1LL << g_rand_int_range (rand, 0, 65));
+
+ if ((xno | v) != xno) {
+ xno |= v;
+ --numbits;
+ }
+ }
+ if (xno == xyes)
+ goto again;
+ }
+
+ for (j = 0; j < 2; j++) {
+ gboolean expect = j == 0;
+ guint64 x = expect ? xyes : xno;
+
+ if (!expect && xno == 0)
+ continue;
+
+ /* check if @x is as @expect, when casted to a certain data type. */
+ test_nm_utils_is_power_of_two_do (gint8, x, expect);
+ test_nm_utils_is_power_of_two_do (guint8, x, expect);
+ test_nm_utils_is_power_of_two_do (gint16, x, expect);
+ test_nm_utils_is_power_of_two_do (guint16, x, expect);
+ test_nm_utils_is_power_of_two_do (gint32, x, expect);
+ test_nm_utils_is_power_of_two_do (guint32, x, expect);
+ test_nm_utils_is_power_of_two_do (gint64, x, expect);
+ test_nm_utils_is_power_of_two_do (guint64, x, expect);
+ test_nm_utils_is_power_of_two_do (char, x, expect);
+ test_nm_utils_is_power_of_two_do (unsigned char, x, expect);
+ test_nm_utils_is_power_of_two_do (signed char, x, expect);
+ test_nm_utils_is_power_of_two_do (enum TEST_IS_POWER_OF_TWP_ENUM_SIGNED, x, expect);
+ test_nm_utils_is_power_of_two_do (enum TEST_IS_POWER_OF_TWP_ENUM_UNSIGNED, x, expect);
+ test_nm_utils_is_power_of_two_do (enum TEST_IS_POWER_OF_TWP_ENUM_SIGNED_64, x, expect);
+ test_nm_utils_is_power_of_two_do (enum TEST_IS_POWER_OF_TWP_ENUM_UNSIGNED_64, x, expect);
+ }
+ }
+}
+
+/******************************************************************************/
+
+static void
+test_g_ptr_array_insert (void)
+{
+ /* this test only makes sense on a recent glib, where we compare our compat
+ * with the original implementation. */
+#if GLIB_CHECK_VERSION(2, 40, 0)
+ gs_unref_ptrarray GPtrArray *arr1 = g_ptr_array_new ();
+ gs_unref_ptrarray GPtrArray *arr2 = g_ptr_array_new ();
+ GRand *rand = nmtst_get_rand ();
+ guint i;
+
+ for (i = 0; i < 560; i++) {
+ gint32 idx = g_rand_int_range (rand, -1, arr1->len + 1);
+
+ g_ptr_array_insert (arr1, idx, GINT_TO_POINTER (i));
+ _nm_g_ptr_array_insert (arr2, idx, GINT_TO_POINTER (i));
+
+ g_assert_cmpint (arr1->len, ==, arr2->len);
+ g_assert (memcmp (arr1->pdata, arr2->pdata, arr1->len * sizeof (gpointer)) == 0);
+ }
+#endif
+}
+
+/******************************************************************************/
+
+static int
+_test_find_binary_search_cmp (gconstpointer a, gconstpointer b, gpointer dummy)
+{
+ int ia, ib;
+
+ ia = GPOINTER_TO_INT (a);
+ ib = GPOINTER_TO_INT (b);
+
+ if (ia == ib)
+ return 0;
+ if (ia < ib)
+ return -1;
+ return 1;
+}
+
+static void
+_test_find_binary_search_do (const int *array, gsize len)
+{
+ gsize i;
+ gssize idx;
+ gs_free gpointer *parray = g_new (gpointer, len);
+ const int needle = 0;
+ gpointer pneedle = GINT_TO_POINTER (needle);
+ gssize expected_result;
+
+ for (i = 0; i < len; i++)
+ parray[i] = GINT_TO_POINTER (array[i]);
+
+ expected_result = _nm_utils_ptrarray_find_first (parray, len, pneedle);
+
+ idx = _nm_utils_ptrarray_find_binary_search (parray, len, pneedle, _test_find_binary_search_cmp, NULL);
+ if (expected_result >= 0)
+ g_assert_cmpint (expected_result, ==, idx);
+ else {
+ gssize idx2 = ~idx;
+ g_assert_cmpint (idx, <, 0);
+
+ g_assert (idx2 >= 0);
+ g_assert (idx2 <= len);
+ g_assert (idx2 - 1 < 0 || _test_find_binary_search_cmp (parray[idx2 - 1], pneedle, NULL) < 0);
+ g_assert (idx2 >= len || _test_find_binary_search_cmp (parray[idx2], pneedle, NULL) > 0);
+ }
+ for (i = 0; i < len; i++) {
+ int cmp;
+
+ cmp = _test_find_binary_search_cmp (parray[i], pneedle, NULL);
+ if (cmp == 0) {
+ g_assert (pneedle == parray[i]);
+ g_assert (idx >= 0);
+ g_assert (i == idx);
+ } else {
+ g_assert (pneedle != parray[i]);
+ if (cmp < 0) {
+ if (idx < 0)
+ g_assert (i < ~idx);
+ else
+ g_assert (i < idx);
+ } else {
+ if (idx < 0)
+ g_assert (i >= ~idx);
+ else
+ g_assert (i >= idx);
+ }
+ }
+ }
+}
+#define test_find_binary_search_do(...) \
+ G_STMT_START { \
+ const int _array[] = { __VA_ARGS__ } ; \
+ _test_find_binary_search_do (_array, G_N_ELEMENTS (_array)); \
+ } G_STMT_END
+
+static void
+test_nm_utils_ptrarray_find_binary_search (void)
+{
+#define _NOT(idx) (~ ((gssize) (idx)))
+ test_find_binary_search_do ( 0);
+ test_find_binary_search_do ( -1, 0);
+ test_find_binary_search_do ( -2, -1, 0);
+ test_find_binary_search_do (-3, -2, -1, 0);
+ test_find_binary_search_do ( 0, 1);
+ test_find_binary_search_do ( 0, 1, 2);
+ test_find_binary_search_do ( -1, 0, 1, 2);
+ test_find_binary_search_do ( -2, -1, 0, 1, 2);
+ test_find_binary_search_do (-3, -2, -1, 0, 1, 2);
+ test_find_binary_search_do (-3, -2, -1, 0, 1, 2);
+ test_find_binary_search_do (-3, -2, -1, 0, 1, 2, 3);
+ test_find_binary_search_do (-3, -2, -1, 0, 1, 2, 3, 4);
+
+ test_find_binary_search_do ( -1);
+ test_find_binary_search_do ( -2, -1);
+ test_find_binary_search_do (-3, -2, -1);
+ test_find_binary_search_do ( 1);
+ test_find_binary_search_do ( 1, 2);
+ test_find_binary_search_do ( -1, 1, 2);
+ test_find_binary_search_do ( -2, -1, 1, 2);
+ test_find_binary_search_do (-3, -2, -1, 1, 2);
+ test_find_binary_search_do (-3, -2, -1, 1, 2);
+ test_find_binary_search_do (-3, -2, -1, 1, 2, 3);
+ test_find_binary_search_do (-3, -2, -1, 1, 2, 3, 4);
+}
+
/******************************************************************************/
NMTST_DEFINE ();
@@ -4137,6 +4545,12 @@ int main (int argc, char **argv)
g_test_add_func ("/core/general/hexstr2bin", test_hexstr2bin);
g_test_add_func ("/core/general/test_nm_utils_uuid_generate_from_string", test_nm_utils_uuid_generate_from_string);
+ g_test_add_func ("/core/general/_nm_utils_uuid_generate_from_strings", test_nm_utils_uuid_generate_from_strings);
+
+ g_test_add_func ("/core/general/_nm_utils_ascii_str_to_int64", test_nm_utils_ascii_str_to_int64);
+ g_test_add_func ("/core/general/nm_utils_is_power_of_two", test_nm_utils_is_power_of_two);
+ g_test_add_func ("/core/general/_glib_compat_g_ptr_array_insert", test_g_ptr_array_insert);
+ g_test_add_func ("/core/general/_nm_utils_ptrarray_find_binary_search", test_nm_utils_ptrarray_find_binary_search);
return g_test_run ();
}
diff --git a/libnm-core/tests/test-keyfile.c b/libnm-core/tests/test-keyfile.c
new file mode 100644
index 000000000..99f88ac54
--- /dev/null
+++ b/libnm-core/tests/test-keyfile.c
@@ -0,0 +1,534 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright 2015 Red Hat, Inc.
+ *
+ */
+
+#include "config.h"
+
+#include "nm-macros-internal.h"
+#include "nm-keyfile-utils.h"
+#include "nm-keyfile-internal.h"
+
+#include "nm-simple-connection.h"
+#include "nm-setting-connection.h"
+#include "nm-setting-wired.h"
+#include "nm-setting-8021x.h"
+
+#include "nm-test-utils.h"
+
+
+#define TEST_WIRED_TLS_CA_CERT TEST_CERT_DIR"/test-ca-cert.pem"
+#define TEST_WIRED_TLS_PRIVKEY TEST_CERT_DIR"/test-key-and-cert.pem"
+
+
+/******************************************************************************/
+
+#define CLEAR(con, keyfile) \
+ G_STMT_START { \
+ NMConnection **_con = (con); \
+ GKeyFile **_keyfile = (keyfile); \
+ \
+ g_clear_object (_con); \
+ g_clear_pointer (_keyfile, g_key_file_unref); \
+ } G_STMT_END
+
+static void
+_assert_gbytes (GBytes *bytes, gconstpointer data, gssize len)
+{
+ g_assert ((data && len > 0) || !len || (data && len == -1));
+
+ if (len == -1)
+ len = strlen (data);
+
+ if (!len)
+ g_assert (!bytes);
+ else {
+ g_assert_cmpint (g_bytes_get_size (bytes), ==, len);
+ g_assert (memcmp (g_bytes_get_data (bytes, NULL), data, len) == 0);
+ }
+}
+
+static GKeyFile *
+_keyfile_load_from_data (const char *str)
+{
+ GError *error = NULL;
+ gboolean success;
+ GKeyFile *keyfile;
+
+ g_assert (str);
+
+ keyfile = g_key_file_new ();
+ success = g_key_file_load_from_data (keyfile, str, strlen (str), G_KEY_FILE_NONE, &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+ return keyfile;
+}
+
+static GKeyFile *
+_nm_keyfile_write (NMConnection *connection,
+ NMKeyfileWriteHandler handler,
+ void *user_data)
+{
+ GError *error = NULL;
+ GKeyFile *kf;
+
+ g_assert (NM_IS_CONNECTION (connection));
+
+ kf = nm_keyfile_write (connection, handler, user_data, &error);
+ g_assert_no_error (error);
+ g_assert (kf);
+ return kf;
+}
+
+static NMConnection *
+_nm_keyfile_read (GKeyFile *keyfile,
+ const char *keyfile_name,
+ const char *base_dir,
+ NMKeyfileReadHandler read_handler,
+ void *read_data,
+ gboolean needs_normalization)
+{
+ GError *error = NULL;
+ NMConnection *con;
+
+ g_assert (keyfile);
+
+ con = nm_keyfile_read (keyfile, keyfile_name, base_dir, read_handler, read_data, &error);
+ g_assert_no_error (error);
+ g_assert (NM_IS_CONNECTION (con));
+ if (needs_normalization)
+ nmtst_assert_connection_verifies_after_normalization (con, 0, 0);
+ else
+ nmtst_assert_connection_verifies_without_normalization (con);
+ return con;
+}
+
+
+static void
+_keyfile_convert (NMConnection **con,
+ GKeyFile **keyfile,
+ const char *keyfile_name,
+ const char *base_dir,
+ NMKeyfileReadHandler read_handler,
+ void *read_data,
+ NMKeyfileWriteHandler write_handler,
+ void *write_data,
+ gboolean needs_normalization)
+{
+ NMConnection *c0;
+ GKeyFile *k0;
+ gs_unref_object NMConnection *c0_k1_c2 = NULL, *k0_c1 = NULL, *k0_c1_k2_c3 = NULL;
+ gs_unref_keyfile GKeyFile *k0_c1_k2 = NULL, *c0_k1 = NULL, *c0_k1_c2_k3 = NULL;
+
+ /* convert from @con to @keyfile and check that we can make
+ * full round trips and obtaining the same result. */
+
+ g_assert (con);
+ g_assert (keyfile);
+ g_assert (*con || *keyfile);
+
+ c0 = *con;
+ k0 = *keyfile;
+
+ if (c0) {
+ c0_k1 = _nm_keyfile_write (c0, write_handler, write_data);
+ c0_k1_c2 = _nm_keyfile_read (c0_k1, keyfile_name, base_dir, read_handler, read_data, FALSE);
+ c0_k1_c2_k3 = _nm_keyfile_write (c0_k1_c2, write_handler, write_data);
+
+ g_assert (_nm_keyfile_equals (c0_k1, c0_k1_c2_k3, TRUE));
+ }
+ if (k0) {
+ NMSetting8021x *s1, *s2;
+
+ k0_c1 = _nm_keyfile_read (k0, keyfile_name, base_dir, read_handler, read_data, needs_normalization);
+ k0_c1_k2 = _nm_keyfile_write (k0_c1, write_handler, write_data);
+ k0_c1_k2_c3 = _nm_keyfile_read (k0_c1_k2, keyfile_name, base_dir, read_handler, read_data, FALSE);
+
+ /* It is a expeced behavior, that if @k0 contains a relative path ca-cert, @k0_c1 will
+ * contain that path as relative. But @k0_c1_k2 and @k0_c1_k2_c3 will have absolute paths.
+ * In this case, hack up @k0_c1_k2_c3 to contain the same relative path. */
+ s1 = nm_connection_get_setting_802_1x (k0_c1);
+ s2 = nm_connection_get_setting_802_1x (k0_c1_k2_c3);
+ if (s1 || s2) {
+ g_assert_cmpint (nm_setting_802_1x_get_ca_cert_scheme (s1), ==, nm_setting_802_1x_get_ca_cert_scheme (s2));
+ switch (nm_setting_802_1x_get_ca_cert_scheme (s1)) {
+ case NM_SETTING_802_1X_CK_SCHEME_PATH:
+ {
+ const char *p1 = nm_setting_802_1x_get_ca_cert_path (s1);
+ const char *p2 = nm_setting_802_1x_get_ca_cert_path (s2);
+
+ nmtst_assert_resolve_relative_path_equals (p1, p2);
+ if (strcmp (p1, p2) != 0) {
+ gs_free char *puri = NULL;
+ gs_unref_bytes GBytes *pfile = NULL;
+
+ g_assert (p1[0] != '/' && p2[0] == '/');
+
+ /* one of the paths is a relative path and the other is absolute. This is an
+ * expected difference.
+ * Make the paths of s2 identical to s1... */
+ puri = g_strconcat (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, p1, NULL);
+ pfile = g_bytes_new (puri, strlen (puri) + 1);
+ g_object_set (s2, NM_SETTING_802_1X_CA_CERT, pfile, NULL);
+ }
+ }
+ break;
+ case NM_SETTING_802_1X_CK_SCHEME_BLOB: {
+ GBytes *b1, *b2;
+
+ b1 = nm_setting_802_1x_get_ca_cert_blob (s1);
+ b2 = nm_setting_802_1x_get_ca_cert_blob (s2);
+ g_assert_cmpint (g_bytes_get_size (b1), ==, g_bytes_get_size (b2));
+ g_assert (memcmp (g_bytes_get_data (b1, NULL), g_bytes_get_data (b2, NULL), g_bytes_get_size (b1)) == 0);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ nmtst_assert_connection_equals (k0_c1, FALSE, k0_c1_k2_c3, FALSE);
+ }
+
+ if (!k0)
+ *keyfile = g_key_file_ref (c0_k1);
+ else if (!c0)
+ *con = g_object_ref (k0_c1);
+ else {
+ /* finally, if both a keyfile and a connection are given, assert that they are equal
+ * after a round of conversion. */
+ g_assert (_nm_keyfile_equals (c0_k1, k0_c1_k2, TRUE));
+ nmtst_assert_connection_equals (k0_c1, FALSE, c0_k1_c2, FALSE);
+ }
+}
+
+/******************************************************************************/
+
+static void
+_test_8021x_cert_check (NMConnection *con,
+ NMSetting8021xCKScheme expected_scheme,
+ const void *value,
+ gssize val_len)
+{
+ GKeyFile *keyfile = NULL;
+ NMSetting8021x *s_8021x;
+ gs_free char *kval = NULL;
+
+ _keyfile_convert (&con, &keyfile, NULL, NULL, NULL, NULL, NULL, NULL, FALSE);
+
+ s_8021x = nm_connection_get_setting_802_1x (con);
+
+ g_assert (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == expected_scheme);
+
+ if (expected_scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
+ const char *path = nm_setting_802_1x_get_ca_cert_path (s_8021x);
+
+ g_assert_cmpstr (path, ==, value);
+ g_assert (val_len == -1 || strlen (path) == val_len);
+
+ kval = g_key_file_get_string (keyfile, "802-1x", "ca-cert", NULL);
+ g_assert (kval);
+ g_assert_cmpstr (kval, ==, value);
+ } else if (expected_scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+ GBytes *blob = nm_setting_802_1x_get_ca_cert_blob (s_8021x);
+ gs_free char *file_blob = NULL;
+
+ if (val_len == -1) {
+ gsize l;
+ gboolean success;
+
+ success = g_file_get_contents (value, &file_blob, &l, NULL);
+ g_assert (success);
+
+ value = file_blob;
+ val_len = l;
+ }
+
+ g_assert (blob);
+ g_assert_cmpint (g_bytes_get_size (blob), ==, val_len);
+ g_assert (!memcmp (g_bytes_get_data (blob, NULL), value, val_len));
+
+ kval = g_key_file_get_string (keyfile, "802-1x", "ca-cert", NULL);
+ g_assert (kval);
+ g_assert (g_str_has_prefix (kval, NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB));
+ }
+
+ g_key_file_unref (keyfile);
+}
+
+static void
+_test_8021x_cert_check_blob_full (NMConnection *con, const void *data, gsize len)
+{
+ GBytes *bytes;
+ NMSetting8021x *s_8021x = nm_connection_get_setting_802_1x (con);
+
+ bytes = g_bytes_new (data, len);
+ g_object_set (s_8021x,
+ NM_SETTING_802_1X_CA_CERT,
+ bytes,
+ NULL);
+ _test_8021x_cert_check (con, NM_SETTING_802_1X_CK_SCHEME_BLOB, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
+ g_bytes_unref (bytes);
+}
+#define _test_8021x_cert_check_blob(con, data) _test_8021x_cert_check_blob_full(con, data, STRLEN (data))
+
+static void
+test_8021x_cert (void)
+{
+ NMSetting8021x *s_8021x;
+ gs_unref_object NMConnection *con = nmtst_create_minimal_connection ("test-cert", NULL, NM_SETTING_WIRED_SETTING_NAME, NULL);
+ GError *error = NULL;
+ gboolean success;
+ NMSetting8021xCKScheme scheme = NM_SETTING_802_1X_CK_SCHEME_PATH;
+ gs_free char *full_TEST_WIRED_TLS_CA_CERT = nmtst_file_resolve_relative_path (TEST_WIRED_TLS_CA_CERT, NULL);
+ gs_free char *full_TEST_WIRED_TLS_PRIVKEY = nmtst_file_resolve_relative_path (TEST_WIRED_TLS_PRIVKEY, NULL);
+
+ /* test writing/reading of certificates of NMSetting8021x */
+
+ /* create a valid connection with NMSetting8021x */
+ s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
+ nm_setting_802_1x_add_eap_method (s_8021x, "tls");
+ g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, "Bill Smith", NULL);
+ success = nm_setting_802_1x_set_ca_cert (s_8021x,
+ full_TEST_WIRED_TLS_CA_CERT,
+ scheme,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (success);
+ success = nm_setting_802_1x_set_client_cert (s_8021x,
+ full_TEST_WIRED_TLS_CA_CERT,
+ scheme,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (success);
+ success = nm_setting_802_1x_set_private_key (s_8021x,
+ full_TEST_WIRED_TLS_PRIVKEY,
+ "test1",
+ scheme,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+
+ /* test reseting ca-cert to different values and see whether we can write/read. */
+
+ nm_connection_add_setting (con, NM_SETTING (s_8021x));
+ nmtst_assert_connection_verifies_and_normalizable (con);
+
+
+ _test_8021x_cert_check (con, scheme, full_TEST_WIRED_TLS_CA_CERT, -1);
+
+ scheme = NM_SETTING_802_1X_CK_SCHEME_BLOB;
+ success = nm_setting_802_1x_set_ca_cert (s_8021x,
+ full_TEST_WIRED_TLS_CA_CERT,
+ scheme,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (success);
+ _test_8021x_cert_check (con, scheme, full_TEST_WIRED_TLS_CA_CERT, -1);
+
+ _test_8021x_cert_check_blob (con, "a");
+ _test_8021x_cert_check_blob (con, "\0");
+ _test_8021x_cert_check_blob (con, "10");
+ _test_8021x_cert_check_blob (con, "data:;base64,a");
+ _test_8021x_cert_check_blob_full (con, "data:;base64,a", STRLEN ("data:;base64,a") + 1);
+ _test_8021x_cert_check_blob (con, "data:;base64,file://a");
+ _test_8021x_cert_check_blob (con, "123");
+
+}
+
+/******************************************************************************/
+
+static void
+test_8021x_cert_read (void)
+{
+ GKeyFile *keyfile = NULL;
+ gs_unref_object NMConnection *con = NULL;
+ NMSetting8021x *s_8021x;
+
+ con = nmtst_create_connection_from_keyfile (
+ "[connection]\n"
+ "type=ethernet",
+ "/test_8021x_cert_read/test0", NULL);
+ CLEAR (&con, &keyfile);
+
+
+ keyfile = _keyfile_load_from_data (
+ "[connection]\n"
+ "type=ethernet"
+ );
+ _keyfile_convert (&con, &keyfile, "/test_8021x_cert_read/test1", NULL, NULL, NULL, NULL, NULL, TRUE);
+ CLEAR (&con, &keyfile);
+
+ keyfile = _keyfile_load_from_data (
+ "[connection]\n"
+ "type=802-3-ethernet\n"
+
+ "[802-1x]\n"
+ "eap=tls;\n"
+ "identity=Bill Smith\n"
+ "ca-cert=48;130;2;52;48;130;1;161;2;16;2;173;102;126;78;69;254;94;87;111;60;152;25;94;221;192;48;13;6;9;42;134;72;134;247;13;1;1;2;5;0;48;95;49;11;48;9;6;3;85;4;6;19;2;85;83;49;32;48;30;6;3;85;4;10;19;23;82;83;65;32;68;97;116;97;32;83;101;99;117;114;105;116;121;44;32;73;110;99;46;49;46;48;44;6;3;85;4;11;19;37;83;101;99;117;114;101;32;83;101;114;118;101;114;32;67;101;114;116;105;102;105;99;97;116;105;111;110;32;65;117;116;104;111;114;105;116;121;48;30;23;13;57;52;49;49;48;57;48;48;48;48;48;48;90;23;13;49;48;48;49;48;55;50;51;53;57;53;57;90;48;95;49;11;48;9;6;3;85;4;6;19;2;85;83;49;32;48;30;6;3;85;4;10;19;23;82;83;65;32;68;97;116;97;32;83;101;99;117;114;105;116;121;44;32;73;110;99;46;49;46;48;44;6;3;85;4;11;19;37;83;101;99;117;114;101;32;83;101;114;118;101;114;32;67;101;114;116;105;102;105;99;97;116;105;111;110;32;65;117;116;104;111;114;105;116;121;48;129;155;48;13;6;9;42;134;72;134;247;13;1;1;1;5;0;3;129;137;0;48;129;133;2;126;0;146;206;122;193;174;131;62;90;170;137;131;87;172;37;1;118;12;173;174;142;44;55;206;235;53;120;100;84;3;229;132;64;81;201;191;143;8;226;138;130;8;210;22;134;55;85;233;177;33;2;173;118;104;129;154;5;162;75;201;75;37;102;34;86;108;136;7;143;247;129;89;109;132;7;101;112;19;113;118;62;155;119;76;227;80;137;86;152;72;185;29;167;41;26;19;46;74;17;89;156;30;21;213;73;84;44;115;58;105;130;177;151;57;156;109;112;103;72;229;221;45;214;200;30;123;2;3;1;0;1;48;13;6;9;42;134;72;134;247;13;1;1;2;5;0;3;126;0;101;221;126;225;178;236;176;226;58;224;236;113;70;154;25;17;184;211;199;160;180;3;64;38;2;62;9;156;225;18;179;209;90;246;55;165;183;97;3;182;91;22;105;59;198;68;8;12;136;83;12;107;151;73;199;62;53;220;108;185;187;170;223;92;187;58;47;147;96;182;169;75;77;242;32;247;205;95;127;100;123;142;220;0;92;215;250;119;202;57;22;89;111;14;234;211;181;131;127;77;77;66;86;118;180;201;95;4;248;56;248;235;210;95;117;95;205;123;252;229;142;128;124;252;80;\n"
+ "client-cert=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;\n"
+ "private-key=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;\n"
+ "private-key-password=12345testing\n"
+ );
+ _keyfile_convert (&con, &keyfile, "/test_8021x_cert_read/test2", NULL, NULL, NULL, NULL, NULL, TRUE);
+ CLEAR (&con, &keyfile);
+
+
+ keyfile = _keyfile_load_from_data (
+ "[connection]\n"
+ "type=802-3-ethernet\n"
+
+ "[802-1x]\n"
+ "eap=tls;\n"
+ "identity=Bill Smith\n"
+ /* unqualified strings are only recognized as path up to 500 chars*/
+ "ca-cert=" "/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
+ "/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
+ "/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
+ "/111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
+ "/11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\n"
+ "client-cert=/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221"
+ "/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221"
+ "/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221"
+ "/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221"
+ "/222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222\n"
+ "private-key=file://"
+ "/333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331"
+ "/333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331"
+ "/333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331"
+ "/333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331"
+ "/33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111111\n"
+ "private-key-password=12345testing\n"
+ );
+ _keyfile_convert (&con, &keyfile, "/test_8021x_cert_read/test2", NULL, NULL, NULL, NULL, NULL, TRUE);
+ s_8021x = nm_connection_get_setting_802_1x (con);
+
+ g_assert (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
+ g_assert (g_str_has_prefix (nm_setting_802_1x_get_ca_cert_path (s_8021x), "/111111111111"));
+ g_assert_cmpint (strlen (nm_setting_802_1x_get_ca_cert_path (s_8021x)), ==, 499);
+
+ g_assert (nm_setting_802_1x_get_client_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_BLOB);
+ g_assert (g_str_has_prefix (g_bytes_get_data (nm_setting_802_1x_get_client_cert_blob (s_8021x), NULL), "/2222222222"));
+ g_assert_cmpint (g_bytes_get_size (nm_setting_802_1x_get_client_cert_blob (s_8021x)), ==, 500 + 1 /* keyfile reader adds a trailing NUL */);
+
+ g_assert (nm_setting_802_1x_get_private_key_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
+ g_assert (g_str_has_prefix (nm_setting_802_1x_get_private_key_path (s_8021x), "/333333333"));
+ g_assert_cmpint (strlen (nm_setting_802_1x_get_private_key_path (s_8021x)), ==, 505);
+ CLEAR (&con, &keyfile);
+
+
+ keyfile = _keyfile_load_from_data (
+ "[connection]\n"
+ "type=802-3-ethernet\n"
+
+ "[802-1x]\n"
+ "eap=tls;\n"
+ "identity=Bill Smith\n"
+ "ca-cert=/\n"
+ "client-cert=a.pem\n"
+ "private-key=data:;base64,aGFsbG8=\n" // hallo
+ "private-key-password=12345testing\n"
+ );
+ _keyfile_convert (&con, &keyfile, "/test_8021x_cert_read/test2", NULL, NULL, NULL, NULL, NULL, TRUE);
+ s_8021x = nm_connection_get_setting_802_1x (con);
+
+ g_assert (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
+ g_assert_cmpstr (nm_setting_802_1x_get_ca_cert_path (s_8021x), ==, "/");
+
+ g_assert (nm_setting_802_1x_get_client_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
+ g_assert_cmpstr (nm_setting_802_1x_get_client_cert_path (s_8021x), ==, "/test_8021x_cert_read/a.pem");
+
+ g_assert (nm_setting_802_1x_get_private_key_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_BLOB);
+ _assert_gbytes (nm_setting_802_1x_get_private_key_blob (s_8021x), "hallo", -1);
+ CLEAR (&con, &keyfile);
+
+
+ keyfile = _keyfile_load_from_data (
+ "[connection]\n"
+ "type=802-3-ethernet\n"
+
+ "[802-1x]\n"
+ "eap=tls;\n"
+ "identity=Bill Smith\n"
+ "ca-cert=file://data:;base64,x\n"
+ "client-cert=abc.der\n"
+ "private-key=abc.deR\n"
+ "private-key-password=12345testing\n"
+ );
+ _keyfile_convert (&con, &keyfile, "/test_8021x_cert_read/test2", NULL, NULL, NULL, NULL, NULL, TRUE);
+ s_8021x = nm_connection_get_setting_802_1x (con);
+
+ g_assert (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
+ g_assert_cmpstr (nm_setting_802_1x_get_ca_cert_path (s_8021x), ==, "data:;base64,x");
+
+ g_assert (nm_setting_802_1x_get_client_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH);
+ g_assert_cmpstr (nm_setting_802_1x_get_client_cert_path (s_8021x), ==, "/test_8021x_cert_read/abc.der");
+
+ g_assert (nm_setting_802_1x_get_private_key_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_BLOB);
+ _assert_gbytes (nm_setting_802_1x_get_private_key_blob (s_8021x), "abc.deR\0", 8);
+ CLEAR (&con, &keyfile);
+
+
+ keyfile = _keyfile_load_from_data (
+ "[connection]\n"
+ "type=802-3-ethernet\n"
+
+ "[802-1x]\n"
+ "eap=tls;\n"
+ "identity=Bill Smith\n"
+ "ca-cert=104;97;108;108;111;\n" /* "hallo" without trailing NUL */
+ "client-cert=104;097;108;108;111;0;\n"
+ "private-key=hallo\n"
+ "private-key-password=12345testing\n"
+ );
+ _keyfile_convert (&con, &keyfile, "/test_8021x_cert_read/test2", NULL, NULL, NULL, NULL, NULL, TRUE);
+ s_8021x = nm_connection_get_setting_802_1x (con);
+
+ g_assert (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_BLOB);
+ _assert_gbytes (nm_setting_802_1x_get_ca_cert_blob (s_8021x), "hallo", 5);
+
+ g_assert (nm_setting_802_1x_get_client_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_BLOB);
+ _assert_gbytes (nm_setting_802_1x_get_client_cert_blob (s_8021x), "hallo\0", 6);
+
+ g_assert (nm_setting_802_1x_get_private_key_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_BLOB);
+ _assert_gbytes (nm_setting_802_1x_get_private_key_blob (s_8021x), "hallo\0", 6);
+ CLEAR (&con, &keyfile);
+}
+
+/******************************************************************************/
+
+NMTST_DEFINE ();
+
+int main (int argc, char **argv)
+{
+ nmtst_init (&argc, &argv, TRUE);
+
+ g_test_add_func ("/core/keyfile/test_8021x_cert", test_8021x_cert);
+ g_test_add_func ("/core/keyfile/test_8021x_cert_read", test_8021x_cert_read);
+
+ return g_test_run ();
+}
+
diff --git a/libnm-core/tests/test-secrets.c b/libnm-core/tests/test-secrets.c
index a915ae7d4..178fddd52 100644
--- a/libnm-core/tests/test-secrets.c
+++ b/libnm-core/tests/test-secrets.c
@@ -739,33 +739,23 @@ NMTST_DEFINE ();
int
main (int argc, char **argv)
{
- char *base;
-
-#if !GLIB_CHECK_VERSION (2, 35, 0)
- g_type_init ();
-#endif
-
nmtst_init (&argc, &argv, TRUE);
/* The tests */
- test_need_tls_secrets_path ();
- test_need_tls_secrets_blob ();
- test_need_tls_phase2_secrets_path ();
- test_need_tls_phase2_secrets_blob ();
-
- test_update_secrets_wifi_single_setting ();
- test_update_secrets_wifi_full_hash ();
- test_update_secrets_wifi_bad_setting_name ();
-
- test_update_secrets_whole_connection ();
- test_update_secrets_whole_connection_empty_hash ();
- test_update_secrets_whole_connection_bad_setting ();
- test_update_secrets_whole_connection_empty_base_setting ();
- test_update_secrets_null_setting_name_with_setting_hash ();
-
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
+ g_test_add_func ("/libnm/need_tls_secrets_path", test_need_tls_secrets_path);
+ g_test_add_func ("/libnm/need_tls_secrets_blob", test_need_tls_secrets_blob);
+ g_test_add_func ("/libnm/need_tls_phase2_secrets_path", test_need_tls_phase2_secrets_path);
+ g_test_add_func ("/libnm/need_tls_phase2_secrets_blob", test_need_tls_phase2_secrets_blob);
+
+ g_test_add_func ("/libnm/update_secrets_wifi_single_setting", test_update_secrets_wifi_single_setting);
+ g_test_add_func ("/libnm/update_secrets_wifi_full_hash", test_update_secrets_wifi_full_hash);
+ g_test_add_func ("/libnm/update_secrets_wifi_bad_setting_name", test_update_secrets_wifi_bad_setting_name);
+
+ g_test_add_func ("/libnm/update_secrets_whole_connection", test_update_secrets_whole_connection);
+ g_test_add_func ("/libnm/update_secrets_whole_connection_empty_hash", test_update_secrets_whole_connection_empty_hash);
+ g_test_add_func ("/libnm/update_secrets_whole_connection_bad_setting", test_update_secrets_whole_connection_bad_setting);
+ g_test_add_func ("/libnm/update_secrets_whole_connection_empty_base_setting", test_update_secrets_whole_connection_empty_base_setting);
+ g_test_add_func ("/libnm/update_secrets_null_setting_name_with_setting_hash", test_update_secrets_null_setting_name_with_setting_hash);
+
+ return g_test_run ();
}
-
diff --git a/libnm-core/tests/test-setting-8021x.c b/libnm-core/tests/test-setting-8021x.c
index 992379c7a..16f6016e2 100644
--- a/libnm-core/tests/test-setting-8021x.c
+++ b/libnm-core/tests/test-setting-8021x.c
@@ -57,15 +57,13 @@ compare_blob_data (const char *test,
g_free (contents);
}
-#define SCHEME_PATH "file://"
-
static void
check_scheme_path (GBytes *value, const char *path)
{
const guint8 *p = g_bytes_get_data (value, NULL);
- g_assert (memcmp (p, SCHEME_PATH, strlen (SCHEME_PATH)) == 0);
- p += strlen (SCHEME_PATH);
+ g_assert (memcmp (p, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) == 0);
+ p += strlen (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
g_assert (memcmp (p, path, strlen (path)) == 0);
p += strlen (path);
g_assert (*p == '\0');
diff --git a/libnm-core/tests/test-settings-defaults.c b/libnm-core/tests/test-settings-defaults.c
index 0e7861872..7d7715cbb 100644
--- a/libnm-core/tests/test-settings-defaults.c
+++ b/libnm-core/tests/test-settings-defaults.c
@@ -101,15 +101,9 @@ test_defaults (GType type, const char *name)
g_object_unref (setting);
}
-int
-main (int argc, char **argv)
+static void
+defaults (void)
{
- char *base;
-
-#if !GLIB_CHECK_VERSION (2, 35, 0)
- g_type_init ();
-#endif
-
/* The tests */
test_defaults (NM_TYPE_SETTING_CONNECTION, NM_SETTING_CONNECTION_SETTING_NAME);
test_defaults (NM_TYPE_SETTING_802_1X, NM_SETTING_802_1X_SETTING_NAME);
@@ -124,10 +118,17 @@ main (int argc, char **argv)
test_defaults (NM_TYPE_SETTING_WIRED, NM_SETTING_WIRED_SETTING_NAME);
test_defaults (NM_TYPE_SETTING_WIRELESS, NM_SETTING_WIRELESS_SETTING_NAME);
test_defaults (NM_TYPE_SETTING_WIRELESS_SECURITY, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME);
+}
+
+NMTST_DEFINE ();
+
+int
+main (int argc, char **argv)
+{
+ nmtst_init (&argc, &argv, TRUE);
+
+ g_test_add_func ("/libnm/defaults", defaults);
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
+ return g_test_run ();
}
diff --git a/libnm-glib/Makefile.in b/libnm-glib/Makefile.in
index 5c3254afe..5f7a3800e 100644
--- a/libnm-glib/Makefile.in
+++ b/libnm-glib/Makefile.in
@@ -334,6 +334,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -447,6 +448,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/libnm-glib/nm-client.c b/libnm-glib/nm-client.c
index d62a8b632..40add09c7 100644
--- a/libnm-glib/nm-client.c
+++ b/libnm-glib/nm-client.c
@@ -782,8 +782,9 @@ nm_client_deactivate_connection (NMClient *client, NMActiveConnection *active)
DBUS_TYPE_G_OBJECT_PATH, path,
G_TYPE_INVALID,
G_TYPE_INVALID)) {
- g_warning ("Could not deactivate connection '%s': %s", path, error->message);
- g_error_free (error);
+ g_warning ("Could not deactivate connection '%s': %s",
+ path, error ? error->message : "(unknown)");
+ g_clear_error (&error);
}
}
@@ -1094,8 +1095,9 @@ nm_client_networking_set_enabled (NMClient *client, gboolean enable)
G_TYPE_BOOLEAN, enable,
G_TYPE_INVALID,
G_TYPE_INVALID)) {
- g_warning ("Error enabling/disabling networking: %s", err->message);
- g_error_free (err);
+ g_warning ("Error enabling/disabling networking: %s",
+ err ? err->message : "(unknown)");
+ g_clear_error (&err);
}
}
diff --git a/libnm-glib/nm-remote-settings.c b/libnm-glib/nm-remote-settings.c
index d5f4ca67f..80a274f5e 100644
--- a/libnm-glib/nm-remote-settings.c
+++ b/libnm-glib/nm-remote-settings.c
@@ -469,6 +469,7 @@ connection_inited (GObject *source, GAsyncResult *result, gpointer user_data)
AddConnectionInfo *addinfo;
const char *path;
GError *error = NULL, *local;
+ static gboolean print_once = TRUE;
path = nm_connection_get_path (NM_CONNECTION (remote));
addinfo = add_connection_info_find (self, remote);
@@ -492,7 +493,7 @@ connection_inited (GObject *source, GAsyncResult *result, gpointer user_data)
local = g_error_new (NM_REMOTE_SETTINGS_ERROR,
NM_REMOTE_SETTINGS_ERROR_CONNECTION_UNAVAILABLE,
"Connection not visible or not available: %s",
- error ? error->message : "(unknown)");
+ error->message);
add_connection_info_complete (self, addinfo, local);
g_error_free (local);
}
@@ -504,6 +505,14 @@ connection_inited (GObject *source, GAsyncResult *result, gpointer user_data)
if (!dbus_g_error_has_name (error, "org.freedesktop.NetworkManager.Settings.PermissionDenied"))
g_hash_table_remove (priv->pending, path);
+ if (print_once && error->code == DBUS_GERROR_LIMITS_EXCEEDED) {
+ g_printerr ("Warning: libnm-glib:%s(): a D-Bus limit exceeded: %s. The application might not work properly.\n"
+ "Consider increasing max_replies_per_connection limit in /etc/dbus-1/system.d/org.freedesktop.NetworkManager.conf "
+ "like <limit name=\"max_replies_per_connection\">2048</limit>",
+ __func__, error->message);
+ print_once = FALSE;
+ }
+
g_error_free (error);
}
diff --git a/libnm-glib/tests/Makefile.am b/libnm-glib/tests/Makefile.am
index cea3b79a7..7168d3dd1 100644
--- a/libnm-glib/tests/Makefile.am
+++ b/libnm-glib/tests/Makefile.am
@@ -15,7 +15,7 @@ noinst_PROGRAMS = $(TESTS)
if WITH_VALGRIND
@VALGRIND_RULES@ --launch-dbus
else
-TESTS_ENVIRONMENT = $(srcdir)/libnm-glib-test-launch.sh
+LOG_COMPILER = $(srcdir)/libnm-glib-test-launch.sh
endif
TESTS = test-nm-client test-remote-settings-client
diff --git a/libnm-glib/tests/Makefile.in b/libnm-glib/tests/Makefile.in
index 825309784..029927af8 100644
--- a/libnm-glib/tests/Makefile.in
+++ b/libnm-glib/tests/Makefile.in
@@ -224,13 +224,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -344,6 +527,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -497,7 +681,7 @@ with_valgrind = @with_valgrind@
@ENABLE_TESTS_TRUE@ $(GLIB_CFLAGS) \
@ENABLE_TESTS_TRUE@ $(DBUS_CFLAGS)
-@ENABLE_TESTS_TRUE@@WITH_VALGRIND_FALSE@TESTS_ENVIRONMENT = $(srcdir)/libnm-glib-test-launch.sh
+@ENABLE_TESTS_TRUE@@WITH_VALGRIND_FALSE@LOG_COMPILER = $(srcdir)/libnm-glib-test-launch.sh
####### NMClient and non-settings tests #######
@ENABLE_TESTS_TRUE@test_nm_client_SOURCES = \
@@ -530,7 +714,7 @@ EXTRA_DIST = libnm-glib-test-launch.sh
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -667,98 +851,175 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-nm-client.log: test-nm-client$(EXEEXT)
+ @p='test-nm-client$(EXEEXT)'; \
+ b='test-nm-client'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-remote-settings-client.log: test-remote-settings-client$(EXEEXT)
+ @p='test-remote-settings-client$(EXEEXT)'; \
+ b='test-remote-settings-client'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -815,6 +1076,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -910,7 +1174,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/libnm-glib/tests/libnm-glib-test-launch.sh b/libnm-glib/tests/libnm-glib-test-launch.sh
index 42d9fbe26..980f8345e 100755
--- a/libnm-glib/tests/libnm-glib-test-launch.sh
+++ b/libnm-glib/tests/libnm-glib-test-launch.sh
@@ -1,9 +1,7 @@
#!/bin/sh
-# Spawn DBus if there's none
-if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
- eval `dbus-launch --sh-syntax`
- trap "kill $DBUS_SESSION_BUS_PID" EXIT
-fi
+# Spawn DBus
+eval `dbus-launch --sh-syntax`
+trap "kill $DBUS_SESSION_BUS_PID" EXIT
"$@"
diff --git a/libnm-util/Makefile.in b/libnm-util/Makefile.in
index 87271131a..327b3234c 100644
--- a/libnm-util/Makefile.in
+++ b/libnm-util/Makefile.in
@@ -325,6 +325,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -438,6 +439,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/libnm-util/NetworkManager.h b/libnm-util/NetworkManager.h
index 5a98b8e49..4fa861e88 100644
--- a/libnm-util/NetworkManager.h
+++ b/libnm-util/NetworkManager.h
@@ -472,6 +472,8 @@ typedef enum {
* @NM_DEVICE_STATE_REASON_MODEM_AVAILABLE: Modem now ready and available
* @NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT: SIM PIN was incorrect
* @NM_DEVICE_STATE_REASON_NEW_ACTIVATION: New connection activation was enqueued
+ * @NM_DEVICE_STATE_REASON_PARENT_CHANGED: the device's parent changed
+ * @NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED: the device parent's management changed
*
* Device state change reason codes
*
@@ -539,6 +541,8 @@ typedef enum {
NM_DEVICE_STATE_REASON_MODEM_AVAILABLE = 58,
NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT = 59,
NM_DEVICE_STATE_REASON_NEW_ACTIVATION = 60,
+ NM_DEVICE_STATE_REASON_PARENT_CHANGED = 61,
+ NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED = 62,
NM_DEVICE_STATE_REASON_LAST = 0xFFFF
} NMDeviceStateReason;
diff --git a/libnm-util/nm-setting-8021x.c b/libnm-util/nm-setting-8021x.c
index 6d5268a17..678d70ab7 100644
--- a/libnm-util/nm-setting-8021x.c
+++ b/libnm-util/nm-setting-8021x.c
@@ -33,6 +33,7 @@
#include "crypto.h"
#include "nm-utils-private.h"
#include "nm-setting-private.h"
+#include "nm-macros-internal.h"
/**
* SECTION:nm-setting-8021x
@@ -430,13 +431,52 @@ get_cert_scheme (GByteArray *array)
if (!array || !array->len)
return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
- if ( (array->len > strlen (SCHEME_PATH))
- && !memcmp (array->data, SCHEME_PATH, strlen (SCHEME_PATH)))
- return NM_SETTING_802_1X_CK_SCHEME_PATH;
+ /* interpret the blob as PATH if it starts with "file://". */
+ if ( array->len >= STRLEN (SCHEME_PATH)
+ && !memcmp (array->data, SCHEME_PATH, STRLEN (SCHEME_PATH))) {
+ /* But it must also be NUL terminated, contain at least
+ * one non-NUL character, and contain only one trailing NUL
+ * chracter.
+ * And ensure it's UTF-8 valid too so we can pass it through
+ * D-Bus and stuff like that. */
+ if ( array->len > STRLEN (SCHEME_PATH) + 1
+ && array->data[array->len - 1] == '\0'
+ && g_utf8_validate ((const char *) &array->data[STRLEN (SCHEME_PATH)], array->len - (STRLEN (SCHEME_PATH) + 1), NULL))
+ return NM_SETTING_802_1X_CK_SCHEME_PATH;
+ return NM_SETTING_802_1X_CK_SCHEME_UNKNOWN;
+ }
return NM_SETTING_802_1X_CK_SCHEME_BLOB;
}
+static GByteArray *
+load_and_verify_certificate (const char *cert_path,
+ NMSetting8021xCKScheme scheme,
+ NMCryptoFileFormat *out_file_format,
+ GError **error)
+{
+ NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+ GByteArray *array;
+
+ array = crypto_load_and_verify_certificate (cert_path, &format, error);
+
+ if (!array || !array->len || format == NM_CRYPTO_FILE_FORMAT_UNKNOWN)
+ format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+ else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+ /* If we load the file as blob, we must ensure that the binary data does not
+ * start with file://. NMSetting8021x cannot represent blobs that start with
+ * file://.
+ * If that's the case, coerce the format to UNKNOWN. The callers will take care
+ * of that and not set the blob. */
+ if (get_cert_scheme (array) != NM_SETTING_802_1X_CK_SCHEME_BLOB)
+ format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+ }
+
+ if (out_file_format)
+ *out_file_format = format;
+ return array;
+}
+
/**
* nm_setting_802_1x_get_ca_cert_scheme:
* @setting: the #NMSetting8021x
@@ -511,14 +551,16 @@ static GByteArray *
path_to_scheme_value (const char *path)
{
GByteArray *array;
+ gsize len;
+
+ g_return_val_if_fail (path != NULL && path[0], NULL);
- g_return_val_if_fail (path != NULL, NULL);
+ len = strlen (path);
- /* Add the path scheme tag to the front, then the fielname */
- array = g_byte_array_sized_new (strlen (path) + strlen (SCHEME_PATH) + 1);
- g_assert (array);
+ /* Add the path scheme tag to the front, then the filename */
+ array = g_byte_array_sized_new (len + strlen (SCHEME_PATH) + 1);
g_byte_array_append (array, (const guint8 *) SCHEME_PATH, strlen (SCHEME_PATH));
- g_byte_array_append (array, (const guint8 *) path, strlen (path));
+ g_byte_array_append (array, (const guint8 *) path, len);
g_byte_array_append (array, (const guint8 *) "\0", 1);
return array;
}
@@ -578,7 +620,7 @@ nm_setting_802_1x_set_ca_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
/* wpa_supplicant can only use raw x509 CA certs */
if (format == NM_CRYPTO_FILE_FORMAT_X509) {
@@ -894,7 +936,7 @@ nm_setting_802_1x_set_client_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
gboolean valid = FALSE;
@@ -1159,7 +1201,7 @@ nm_setting_802_1x_set_phase2_ca_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
/* wpa_supplicant can only use raw x509 CA certs */
if (format == NM_CRYPTO_FILE_FORMAT_X509) {
@@ -1479,7 +1521,7 @@ nm_setting_802_1x_set_phase2_client_cert (NMSetting8021x *setting,
return TRUE;
}
- data = crypto_load_and_verify_certificate (cert_path, &format, error);
+ data = load_and_verify_certificate (cert_path, scheme, &format, error);
if (data) {
gboolean valid = FALSE;
@@ -2604,25 +2646,9 @@ need_secrets (NMSetting *setting)
static gboolean
verify_cert (GByteArray *array, const char *prop_name, GError **error)
{
- if (!array)
- return TRUE;
-
- switch (get_cert_scheme (array)) {
- case NM_SETTING_802_1X_CK_SCHEME_BLOB:
+ if ( !array
+ || get_cert_scheme (array) != NM_SETTING_802_1X_CK_SCHEME_UNKNOWN)
return TRUE;
- case NM_SETTING_802_1X_CK_SCHEME_PATH:
- /* For path-based schemes, verify that the path is zero-terminated */
- if (array->data[array->len - 1] == '\0') {
- /* And ensure it's UTF-8 valid too so we can pass it through
- * D-Bus and stuff like that.
- */
- if (g_utf8_validate ((const char *) (array->data + strlen (SCHEME_PATH)), -1, NULL))
- return TRUE;
- }
- break;
- default:
- break;
- }
g_set_error_literal (error,
NM_SETTING_802_1X_ERROR,
diff --git a/libnm-util/nm-setting.c b/libnm-util/nm-setting.c
index 105981bc3..35ae01daf 100644
--- a/libnm-util/nm-setting.c
+++ b/libnm-util/nm-setting.c
@@ -99,7 +99,7 @@ _nm_gtype_hash (gconstpointer v)
return *((const GType *) v);
}
-static void __attribute__((constructor))
+static void
_ensure_registered (void)
{
if (G_UNLIKELY (registered_settings == NULL)) {
@@ -112,6 +112,12 @@ _ensure_registered (void)
}
}
+static void __attribute__((constructor))
+_ensure_registered_constructor (void)
+{
+ _ensure_registered ();
+}
+
#define _ensure_setting_info(self, priv) \
G_STMT_START { \
NMSettingPrivate *_priv_esi = (priv); \
diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c
index 022fa70f0..d0c2ca31f 100644
--- a/libnm-util/nm-utils.c
+++ b/libnm-util/nm-utils.c
@@ -37,7 +37,7 @@
#include "nm-dbus-glib-types.h"
#include "nm-setting-private.h"
#include "crypto.h"
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
/* Embed the commit id in the build binary */
static const char *const __nm_git_sha = STRLEN (NM_GIT_SHA) > 0 ? "NM_GIT_SHA:"NM_GIT_SHA : "";
diff --git a/libnm-util/tests/Makefile.in b/libnm-util/tests/Makefile.in
index 5ef0d87b9..0767e19a5 100644
--- a/libnm-util/tests/Makefile.in
+++ b/libnm-util/tests/Makefile.in
@@ -263,13 +263,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -383,6 +566,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -597,7 +781,7 @@ with_valgrind = @with_valgrind@
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -758,98 +942,203 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-settings-defaults.log: test-settings-defaults$(EXEEXT)
+ @p='test-settings-defaults$(EXEEXT)'; \
+ b='test-settings-defaults'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-crypto.log: test-crypto$(EXEEXT)
+ @p='test-crypto$(EXEEXT)'; \
+ b='test-crypto'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-secrets.log: test-secrets$(EXEEXT)
+ @p='test-secrets$(EXEEXT)'; \
+ b='test-secrets'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-general.log: test-general$(EXEEXT)
+ @p='test-general$(EXEEXT)'; \
+ b='test-general'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-setting-8021x.log: test-setting-8021x$(EXEEXT)
+ @p='test-setting-8021x$(EXEEXT)'; \
+ b='test-setting-8021x'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-setting-dcb.log: test-setting-dcb$(EXEEXT)
+ @p='test-setting-dcb$(EXEEXT)'; \
+ b='test-setting-dcb'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -906,6 +1195,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -1001,7 +1293,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c
index d8f9dcc4a..f365dc043 100644
--- a/libnm-util/tests/test-general.c
+++ b/libnm-util/tests/test-general.c
@@ -1703,9 +1703,9 @@ test_setting_compare_id (void)
}
static void
-test_setting_compare_secrets (NMSettingSecretFlags secret_flags,
- NMSettingCompareFlags comp_flags,
- gboolean remove_secret)
+_compare_secrets (NMSettingSecretFlags secret_flags,
+ NMSettingCompareFlags comp_flags,
+ gboolean remove_secret)
{
gs_unref_object NMSetting *old = NULL, *new = NULL;
gboolean success;
@@ -1735,9 +1735,18 @@ test_setting_compare_secrets (NMSettingSecretFlags secret_flags,
}
static void
-test_setting_compare_vpn_secrets (NMSettingSecretFlags secret_flags,
- NMSettingCompareFlags comp_flags,
- gboolean remove_secret)
+test_setting_compare_secrets (void)
+{
+ _compare_secrets (NM_SETTING_SECRET_FLAG_AGENT_OWNED, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS, TRUE);
+ _compare_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE);
+ _compare_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE);
+ _compare_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE);
+}
+
+static void
+_compare_vpn_secrets (NMSettingSecretFlags secret_flags,
+ NMSettingCompareFlags comp_flags,
+ gboolean remove_secret)
{
gs_unref_object NMSetting *old = NULL, *new = NULL;
gboolean success;
@@ -1768,6 +1777,15 @@ test_setting_compare_vpn_secrets (NMSettingSecretFlags secret_flags,
}
static void
+test_setting_compare_vpn_secrets (void)
+{
+ _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_AGENT_OWNED, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS, TRUE);
+ _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE);
+ _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE);
+ _compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE);
+}
+
+static void
test_hwaddr_aton_ether_normal (void)
{
guint8 buf[100];
@@ -2546,84 +2564,73 @@ NMTST_DEFINE ();
int main (int argc, char **argv)
{
- char *base;
-
nmtst_init (&argc, &argv, TRUE);
/* The tests */
- test_setting_vpn_items ();
- test_setting_vpn_update_secrets ();
- test_setting_vpn_modify_during_foreach ();
- test_setting_ip6_config_old_address_array ();
- test_setting_gsm_apn_spaces ();
- test_setting_gsm_apn_bad_chars ();
- test_setting_gsm_apn_underscore ();
- test_setting_gsm_without_number ();
- test_setting_to_hash_all ();
- test_setting_to_hash_no_secrets ();
- test_setting_to_hash_only_secrets ();
- test_setting_compare_id ();
- test_setting_compare_secrets (NM_SETTING_SECRET_FLAG_AGENT_OWNED, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS, TRUE);
- test_setting_compare_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE);
- test_setting_compare_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE);
- test_setting_compare_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE);
- test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_AGENT_OWNED, NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS, TRUE);
- test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NOT_SAVED, NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS, TRUE);
- test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_IGNORE_SECRETS, TRUE);
- test_setting_compare_vpn_secrets (NM_SETTING_SECRET_FLAG_NONE, NM_SETTING_COMPARE_FLAG_EXACT, FALSE);
- test_setting_old_uuid ();
-
- test_connection_to_hash_setting_name ();
- test_setting_new_from_hash ();
- test_connection_replace_settings ();
- test_connection_replace_settings_from_connection ();
- test_connection_new_from_hash ();
- test_connection_verify_sets_interface_name ();
- test_connection_normalize_virtual_iface_name ();
-
- test_setting_connection_permissions_helpers ();
- test_setting_connection_permissions_property ();
-
- test_connection_compare_same ();
- test_connection_compare_key_only_in_a ();
- test_connection_compare_setting_only_in_a ();
- test_connection_compare_key_only_in_b ();
- test_connection_compare_setting_only_in_b ();
-
- test_connection_diff_a_only ();
- test_connection_diff_same ();
- test_connection_diff_different ();
- test_connection_diff_no_secrets ();
- test_connection_diff_inferrable ();
- test_connection_good_base_types ();
- test_connection_bad_base_types ();
-
- test_hwaddr_aton_ether_normal ();
- test_hwaddr_aton_ib_normal ();
- test_hwaddr_aton_no_leading_zeros ();
- test_hwaddr_aton_malformed ();
- test_ip4_prefix_to_netmask ();
- test_ip4_netmask_to_prefix ();
-
- test_connection_changed_signal ();
- test_setting_connection_changed_signal ();
- test_setting_bond_changed_signal ();
- test_setting_ip4_changed_signal ();
- test_setting_ip6_changed_signal ();
- test_setting_vlan_changed_signal ();
- test_setting_vpn_changed_signal ();
- test_setting_wired_changed_signal ();
- test_setting_wireless_changed_signal ();
- test_setting_wireless_security_changed_signal ();
- test_setting_802_1x_changed_signal ();
-
- test_libnm_linking ();
-
- test_nm_utils_uuid_generate_from_string ();
-
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
+ g_test_add_func ("/libnm/setting_vpn_items", test_setting_vpn_items);
+ g_test_add_func ("/libnm/setting_vpn_update_secrets", test_setting_vpn_update_secrets);
+ g_test_add_func ("/libnm/setting_vpn_modify_during_foreach", test_setting_vpn_modify_during_foreach);
+ g_test_add_func ("/libnm/setting_ip6_config_old_address_array", test_setting_ip6_config_old_address_array);
+ g_test_add_func ("/libnm/setting_gsm_apn_spaces", test_setting_gsm_apn_spaces);
+ g_test_add_func ("/libnm/setting_gsm_apn_bad_chars", test_setting_gsm_apn_bad_chars);
+ g_test_add_func ("/libnm/setting_gsm_apn_underscore", test_setting_gsm_apn_underscore);
+ g_test_add_func ("/libnm/setting_gsm_without_number", test_setting_gsm_without_number);
+ g_test_add_func ("/libnm/setting_to_hash_all", test_setting_to_hash_all);
+ g_test_add_func ("/libnm/setting_to_hash_no_secrets", test_setting_to_hash_no_secrets);
+ g_test_add_func ("/libnm/setting_to_hash_only_secrets", test_setting_to_hash_only_secrets);
+ g_test_add_func ("/libnm/setting_compare_id", test_setting_compare_id);
+ g_test_add_func ("/libnm/setting_compare_secrets", test_setting_compare_secrets);
+ g_test_add_func ("/libnm/setting_compare_vpn_secrets", test_setting_compare_vpn_secrets);
+ g_test_add_func ("/libnm/setting_old_uuid", test_setting_old_uuid);
+
+ g_test_add_func ("/libnm/connection_to_hash_setting_name", test_connection_to_hash_setting_name);
+ g_test_add_func ("/libnm/setting_new_from_hash", test_setting_new_from_hash);
+ g_test_add_func ("/libnm/connection_replace_settings", test_connection_replace_settings);
+ g_test_add_func ("/libnm/connection_replace_settings_from_connection", test_connection_replace_settings_from_connection);
+ g_test_add_func ("/libnm/connection_new_from_hash", test_connection_new_from_hash);
+ g_test_add_func ("/libnm/connection_verify_sets_interface_name", test_connection_verify_sets_interface_name);
+ g_test_add_func ("/libnm/connection_normalize_virtual_iface_name", test_connection_normalize_virtual_iface_name);
+
+ g_test_add_func ("/libnm/setting_connection_permissions_helpers", test_setting_connection_permissions_helpers);
+ g_test_add_func ("/libnm/setting_connection_permissions_property", test_setting_connection_permissions_property);
+
+ g_test_add_func ("/libnm/connection_compare_same", test_connection_compare_same);
+ g_test_add_func ("/libnm/connection_compare_key_only_in_a", test_connection_compare_key_only_in_a);
+ g_test_add_func ("/libnm/connection_compare_setting_only_in_a", test_connection_compare_setting_only_in_a);
+ g_test_add_func ("/libnm/connection_compare_key_only_in_b", test_connection_compare_key_only_in_b);
+ g_test_add_func ("/libnm/connection_compare_setting_only_in_b", test_connection_compare_setting_only_in_b);
+
+ g_test_add_func ("/libnm/connection_diff_a_only", test_connection_diff_a_only);
+ g_test_add_func ("/libnm/connection_diff_same", test_connection_diff_same);
+ g_test_add_func ("/libnm/connection_diff_different", test_connection_diff_different);
+ g_test_add_func ("/libnm/connection_diff_no_secrets", test_connection_diff_no_secrets);
+ g_test_add_func ("/libnm/connection_diff_inferrable", test_connection_diff_inferrable);
+ g_test_add_func ("/libnm/connection_good_base_types", test_connection_good_base_types);
+ g_test_add_func ("/libnm/connection_bad_base_types", test_connection_bad_base_types);
+
+ g_test_add_func ("/libnm/hwaddr_aton_ether_normal", test_hwaddr_aton_ether_normal);
+ g_test_add_func ("/libnm/hwaddr_aton_ib_normal", test_hwaddr_aton_ib_normal);
+ g_test_add_func ("/libnm/hwaddr_aton_no_leading_zeros", test_hwaddr_aton_no_leading_zeros);
+ g_test_add_func ("/libnm/hwaddr_aton_malformed", test_hwaddr_aton_malformed);
+ g_test_add_func ("/libnm/ip4_prefix_to_netmask", test_ip4_prefix_to_netmask);
+ g_test_add_func ("/libnm/ip4_netmask_to_prefix", test_ip4_netmask_to_prefix);
+
+ g_test_add_func ("/libnm/connection_changed_signal", test_connection_changed_signal);
+ g_test_add_func ("/libnm/setting_connection_changed_signal", test_setting_connection_changed_signal);
+ g_test_add_func ("/libnm/setting_bond_changed_signal", test_setting_bond_changed_signal);
+ g_test_add_func ("/libnm/setting_ip4_changed_signal", test_setting_ip4_changed_signal);
+ g_test_add_func ("/libnm/setting_ip6_changed_signal", test_setting_ip6_changed_signal);
+ g_test_add_func ("/libnm/setting_vlan_changed_signal", test_setting_vlan_changed_signal);
+ g_test_add_func ("/libnm/setting_vpn_changed_signal", test_setting_vpn_changed_signal);
+ g_test_add_func ("/libnm/setting_wired_changed_signal", test_setting_wired_changed_signal);
+ g_test_add_func ("/libnm/setting_wireless_changed_signal", test_setting_wireless_changed_signal);
+ g_test_add_func ("/libnm/setting_wireless_security_changed_signal", test_setting_wireless_security_changed_signal);
+ g_test_add_func ("/libnm/setting_802_1x_changed_signal", test_setting_802_1x_changed_signal);
+
+ g_test_add_func ("/libnm/libnm_linking", test_libnm_linking);
+
+ g_test_add_func ("/libnm/nm_utils_uuid_generate_from_string", test_nm_utils_uuid_generate_from_string);
+
+ return g_test_run ();
}
diff --git a/libnm-util/tests/test-secrets.c b/libnm-util/tests/test-secrets.c
index a22edb0fb..adf3a94a3 100644
--- a/libnm-util/tests/test-secrets.c
+++ b/libnm-util/tests/test-secrets.c
@@ -734,37 +734,33 @@ test_update_secrets_null_setting_name_with_setting_hash (void)
g_object_unref (connection);
}
+NMTST_DEFINE ();
+
int main (int argc, char **argv)
{
GError *error = NULL;
- char *base;
-#if !GLIB_CHECK_VERSION (2, 35, 0)
- g_type_init ();
-#endif
+ nmtst_init (&argc, &argv, TRUE);
if (!nm_utils_init (&error))
FAIL ("nm-utils-init", "failed to initialize libnm-util: %s", error->message);
/* The tests */
- test_need_tls_secrets_path ();
- test_need_tls_secrets_blob ();
- test_need_tls_phase2_secrets_path ();
- test_need_tls_phase2_secrets_blob ();
-
- test_update_secrets_wifi_single_setting ();
- test_update_secrets_wifi_full_hash ();
- test_update_secrets_wifi_bad_setting_name ();
-
- test_update_secrets_whole_connection ();
- test_update_secrets_whole_connection_empty_hash ();
- test_update_secrets_whole_connection_bad_setting ();
- test_update_secrets_whole_connection_empty_base_setting ();
- test_update_secrets_null_setting_name_with_setting_hash ();
-
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
+ g_test_add_func ("/libnm/need_tls_secrets_path", test_need_tls_secrets_path);
+ g_test_add_func ("/libnm/need_tls_secrets_blob", test_need_tls_secrets_blob);
+ g_test_add_func ("/libnm/need_tls_phase2_secrets_path", test_need_tls_phase2_secrets_path);
+ g_test_add_func ("/libnm/need_tls_phase2_secrets_blob", test_need_tls_phase2_secrets_blob);
+
+ g_test_add_func ("/libnm/update_secrets_wifi_single_setting", test_update_secrets_wifi_single_setting);
+ g_test_add_func ("/libnm/update_secrets_wifi_full_hash", test_update_secrets_wifi_full_hash);
+ g_test_add_func ("/libnm/update_secrets_wifi_bad_setting_name", test_update_secrets_wifi_bad_setting_name);
+
+ g_test_add_func ("/libnm/update_secrets_whole_connection", test_update_secrets_whole_connection);
+ g_test_add_func ("/libnm/update_secrets_whole_connection_empty_hash", test_update_secrets_whole_connection_empty_hash);
+ g_test_add_func ("/libnm/update_secrets_whole_connection_bad_setting", test_update_secrets_whole_connection_bad_setting);
+ g_test_add_func ("/libnm/update_secrets_whole_connection_empty_base_setting", test_update_secrets_whole_connection_empty_base_setting);
+ g_test_add_func ("/libnm/update_secrets_null_setting_name_with_setting_hash", test_update_secrets_null_setting_name_with_setting_hash);
+
+ return g_test_run ();
}
diff --git a/libnm-util/tests/test-settings-defaults.c b/libnm-util/tests/test-settings-defaults.c
index 7441e1ff5..70a743cb0 100644
--- a/libnm-util/tests/test-settings-defaults.c
+++ b/libnm-util/tests/test-settings-defaults.c
@@ -101,18 +101,9 @@ test_defaults (GType type, const char *name)
g_object_unref (setting);
}
-int main (int argc, char **argv)
+static void
+defaults (void)
{
- GError *error = NULL;
- char *base;
-
-#if !GLIB_CHECK_VERSION (2, 35, 0)
- g_type_init ();
-#endif
-
- if (!nm_utils_init (&error))
- FAIL ("nm-utils-init", "failed to initialize libnm-util: %s", error->message);
-
/* The tests */
test_defaults (NM_TYPE_SETTING_CONNECTION, NM_SETTING_CONNECTION_SETTING_NAME);
test_defaults (NM_TYPE_SETTING_802_1X, NM_SETTING_802_1X_SETTING_NAME);
@@ -127,10 +118,16 @@ int main (int argc, char **argv)
test_defaults (NM_TYPE_SETTING_WIRED, NM_SETTING_WIRED_SETTING_NAME);
test_defaults (NM_TYPE_SETTING_WIRELESS, NM_SETTING_WIRELESS_SETTING_NAME);
test_defaults (NM_TYPE_SETTING_WIRELESS_SECURITY, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME);
-
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
}
+NMTST_DEFINE ();
+
+int
+main (int argc, char **argv)
+{
+ nmtst_init (&argc, &argv, TRUE);
+
+ g_test_add_func ("/libnm/defaults", defaults);
+
+ return g_test_run ();
+}
diff --git a/libnm/Makefile.in b/libnm/Makefile.in
index dd9a59521..73b569662 100644
--- a/libnm/Makefile.in
+++ b/libnm/Makefile.in
@@ -292,6 +292,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -405,6 +406,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -608,6 +610,8 @@ libnm_core_private_headers = \
$(core)/crypto.h \
$(core)/nm-connection-private.h \
$(core)/nm-core-internal.h \
+ $(core)/nm-keyfile-internal.h \
+ $(core)/nm-keyfile-utils.h \
$(core)/nm-property-compare.h \
$(core)/nm-setting-private.h \
$(core)/nm-utils-private.h
@@ -617,6 +621,9 @@ libnm_core_sources = \
$(core)/crypto.c \
$(core)/nm-connection.c \
$(core)/nm-errors.c \
+ $(core)/nm-keyfile-reader.c \
+ $(core)/nm-keyfile-utils.c \
+ $(core)/nm-keyfile-writer.c \
$(core)/nm-property-compare.c \
$(core)/nm-setting-8021x.c \
$(core)/nm-setting-adsl.c \
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index 82bcdb9f0..294bab410 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -844,3 +844,10 @@ global:
local:
*;
};
+
+libnm_1_0_4 {
+global:
+ nm_setting_connection_autoconnect_slaves_get_type;
+ nm_setting_connection_get_autoconnect_slaves;
+} libnm_1_0_0;
+
diff --git a/libnm/nm-dbus-helpers.c b/libnm/nm-dbus-helpers.c
index 6bfd4bbd8..45e09442e 100644
--- a/libnm/nm-dbus-helpers.c
+++ b/libnm/nm-dbus-helpers.c
@@ -22,6 +22,8 @@
#include <string.h>
#include <gio/gio.h>
+
+#include "nm-glib-compat.h"
#include "nm-dbus-helpers.h"
#include "nm-dbus-interface.h"
@@ -93,7 +95,8 @@ _nm_dbus_new_connection (GCancellable *cancellable, GError **error)
GDBusConnection *connection = NULL;
/* If running as root try the private bus first */
- if (0 == geteuid ()) {
+ if (0 == geteuid () && !g_test_initialized ()) {
+
GError *local = NULL;
GDBusConnection *p;
@@ -203,7 +206,7 @@ _nm_dbus_new_connection_async (GCancellable *cancellable,
simple = g_simple_async_result_new (NULL, callback, user_data, _nm_dbus_new_connection_async);
/* If running as root try the private bus first */
- if (0 == geteuid ()) {
+ if (0 == geteuid () && !g_test_initialized ()) {
GDBusConnection *p;
if (cancellable) {
diff --git a/libnm/nm-device.c b/libnm/nm-device.c
index e80ac707d..cd14c0e90 100644
--- a/libnm/nm-device.c
+++ b/libnm/nm-device.c
@@ -979,6 +979,9 @@ nm_device_get_type_description (NMDevice *device)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device);
const char *desc, *typename;
+ /* BEWARE: this function should return the same value
+ * as nm_device_get_type_description() in nm-core. */
+
g_return_val_if_fail (NM_IS_DEVICE (device), NULL);
if (priv->type_description)
diff --git a/libnm/nm-ifcfg-rh-docs.xml b/libnm/nm-ifcfg-rh-docs.xml
index 438f4b718..0c287f26d 100644
--- a/libnm/nm-ifcfg-rh-docs.xml
+++ b/libnm/nm-ifcfg-rh-docs.xml
@@ -86,6 +86,8 @@ the connection type."/>
<property name="slave-type" variable="MASTER, TEAM_MASTER, DEVICETYPE, BRIDGE" format="" values="" default="" example="" description="Slave type doesn&apos;t map directly to a variable, but it is
recognized using different variables. MASTER for bonding,
TEAM_MASTER and DEVICETYPE for teaming, BRIDGE for bridging."/>
+<property name="autoconnect-slaves" variable="AUTOCONNECT-SLAVES(+)" format="" values="" default="missing variable means global default" example="" description="Whether slaves of this connection should be auto-connected
+when this connection is activated."/>
<property name="secondaries" variable="SECONDARY_UUIDS(+)" format="" values="" default="" example="" description="UUID of VPN connections that should be activated
together with this connection."/>
<property name="gateway-ping-timeout" variable="GATEWAY_PING_TIMEOUT(+)" format="" values="" default="0" example="GATEWAY_PING_TIMEOUT=5" description="If greater than zero, the IP connectivity will be checked by
diff --git a/libnm/nm-property-docs.xml b/libnm/nm-property-docs.xml
index 5c84b7db9..7bbf97a1a 100644
--- a/libnm/nm-property-docs.xml
+++ b/libnm/nm-property-docs.xml
@@ -36,7 +36,7 @@
<property name="private-key-password" type="string" description="The password used to decrypt the private key specified in the &quot;private-key&quot; property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key." />
<property name="private-key-password-flags" type="NMSettingSecretFlags (uint32)" description="Flags indicating how to handle the &quot;private-key-password&quot; property." />
<property name="subject-match" type="string" description="Substring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed." />
- <property name="system-ca-certs" type="boolean" default="FALSE" description="When TRUE, overrides the &quot;ca-path&quot; and &quot;phase2-ca-path&quot; properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the &quot;ca-cert&quot; and &quot;phase2-ca-cert&quot; properties." />
+ <property name="system-ca-certs" type="boolean" default="FALSE" description="When TRUE, overrides the &quot;ca-path&quot; and &quot;phase2-ca-path&quot; properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the &quot;ca-cert&quot; and &quot;phase2-ca-cert&quot; properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides &quot;ca-cert&quot; and &quot;phase2-ca-cert&quot; properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant)." />
</setting>
<setting name="adsl">
<property name="encapsulation" type="string" description="Encapsulation of ADSL connection. Can be &quot;vcmux&quot; or &quot;llc&quot;." />
@@ -83,6 +83,7 @@
<setting name="connection">
<property name="autoconnect" type="boolean" default="TRUE" description="Whether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection." />
<property name="autoconnect-priority" type="int32" default="0" description="The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority." />
+ <property name="autoconnect-slaves" type="NMSettingConnectionAutoconnectSlaves (int32)" description="Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0." />
<property name="gateway-ping-timeout" type="uint32" default="0" description="If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping." />
<property name="id" type="string" description="A human readable unique identifier for the connection, like &quot;Work Wi-Fi&quot; or &quot;T-Mobile 3G&quot;." />
<property name="interface-name" type="string" description="The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface." />
@@ -164,7 +165,7 @@
<property name="gateway" type="string" description="The gateway associated with this configuration. This is only meaningful if &quot;addresses&quot; is also set." />
<property name="ignore-auto-dns" type="boolean" default="FALSE" description="When &quot;method&quot; is set to &quot;auto&quot; and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the &quot;dns&quot; and &quot;dns-search&quot; properties, if any, are used." />
<property name="ignore-auto-routes" type="boolean" default="FALSE" description="When &quot;method&quot; is set to &quot;auto&quot; and this property to TRUE, automatically configured routes are ignored and only routes specified in the &quot;routes&quot; property, if any, are used." />
- <property name="ip6-privacy" type="NMSettingIP6ConfigPrivacy (int32)" description="Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses)." />
+ <property name="ip6-privacy" type="NMSettingIP6ConfigPrivacy (int32)" description="Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to &quot;-1&quot; (unknown) means fallback to global configuration &quot;ipv6.ip6-privacy&quot;. If also global configuration is unspecified or set to &quot;-1&quot;, fallback to read &quot;/proc/sys/net/ipv6/conf/default/use_tempaddr&quot;." />
<property name="may-fail" type="boolean" default="TRUE" description="If TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully." />
<property name="method" type="string" description="IP configuration method. NMSettingIP4Config and NMSettingIP6Config both support &quot;auto&quot;, &quot;manual&quot;, and &quot;link-local&quot;. See the subclass-specific documentation for other values. In general, for the &quot;auto&quot; method, properties such as &quot;dns&quot; and &quot;routes&quot; specify information that is added on to the information returned from automatic configuration. The &quot;ignore-auto-routes&quot; and &quot;ignore-auto-dns&quot; properties modify this behavior. For methods that imply no upstream network, such as &quot;shared&quot; or &quot;link-local&quot;, these properties must be empty." />
<property name="name" type="string" default="ipv6" description="The setting's name, which uniquely identifies the setting within the connection. Each setting type has a name unique to that type, for example &quot;ppp&quot; or &quot;wireless&quot; or &quot;wired&quot;." />
diff --git a/libnm/nm-remote-connection.c b/libnm/nm-remote-connection.c
index 3afe7f8eb..98924973d 100644
--- a/libnm/nm-remote-connection.c
+++ b/libnm/nm-remote-connection.c
@@ -602,6 +602,8 @@ updated_get_settings_cb (GObject *proxy,
priv->visible = visible;
g_object_notify (G_OBJECT (self), NM_REMOTE_CONNECTION_VISIBLE);
}
+
+ g_object_unref (self);
}
static void
@@ -613,7 +615,8 @@ updated_cb (NMDBusSettingsConnection *proxy, gpointer user_data)
/* The connection got updated; request the replacement settings */
nmdbus_settings_connection_call_get_settings (priv->proxy,
NULL,
- updated_get_settings_cb, self);
+ updated_get_settings_cb,
+ g_object_ref (self));
}
/****************************************************************/
diff --git a/libnm/nm-secret-agent-old.c b/libnm/nm-secret-agent-old.c
index 5da8ef655..6df54d433 100644
--- a/libnm/nm-secret-agent-old.c
+++ b/libnm/nm-secret-agent-old.c
@@ -301,6 +301,7 @@ get_secrets_cb (NMSecretAgentOld *self,
if (error)
g_dbus_method_invocation_return_gerror (info->context, error);
else {
+ g_variant_take_ref (secrets);
g_dbus_method_invocation_return_value (info->context,
g_variant_new ("(@a{sa{sv}})", secrets));
}
diff --git a/libnm/nm-setting-docs.xml b/libnm/nm-setting-docs.xml
index 2e9814f8b..c2cb80edb 100644
--- a/libnm/nm-setting-docs.xml
+++ b/libnm/nm-setting-docs.xml
@@ -36,7 +36,7 @@
<property name="private-key-password" type="string" description="The password used to decrypt the private key specified in the &quot;private-key&quot; property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key." />
<property name="private-key-password-flags" type="NMSettingSecretFlags (uint32)" description="Flags indicating how to handle the &quot;private-key-password&quot; property." />
<property name="subject-match" type="string" description="Substring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed." />
- <property name="system-ca-certs" type="boolean" default="FALSE" description="When TRUE, overrides the &quot;ca-path&quot; and &quot;phase2-ca-path&quot; properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the &quot;ca-cert&quot; and &quot;phase2-ca-cert&quot; properties." />
+ <property name="system-ca-certs" type="boolean" default="FALSE" description="When TRUE, overrides the &quot;ca-path&quot; and &quot;phase2-ca-path&quot; properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the &quot;ca-cert&quot; and &quot;phase2-ca-cert&quot; properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides &quot;ca-cert&quot; and &quot;phase2-ca-cert&quot; properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant)." />
</setting>
<setting name="adsl">
<property name="encapsulation" type="string" description="Encapsulation of ADSL connection. Can be &quot;vcmux&quot; or &quot;llc&quot;." />
@@ -85,6 +85,7 @@
<setting name="connection">
<property name="autoconnect" type="boolean" default="TRUE" description="Whether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection." />
<property name="autoconnect-priority" type="int32" default="0" description="The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority." />
+ <property name="autoconnect-slaves" type="NMSettingConnectionAutoconnectSlaves (int32)" description="Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0." />
<property name="gateway-ping-timeout" type="uint32" default="0" description="If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping." />
<property name="id" type="string" description="A human readable unique identifier for the connection, like &quot;Work Wi-Fi&quot; or &quot;T-Mobile 3G&quot;." />
<property name="interface-name" type="string" description="The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface." />
@@ -169,7 +170,7 @@
<property name="gateway" type="string" description="The gateway associated with this configuration. This is only meaningful if &quot;addresses&quot; is also set." />
<property name="ignore-auto-dns" type="boolean" default="FALSE" description="When &quot;method&quot; is set to &quot;auto&quot; and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the &quot;dns&quot; and &quot;dns-search&quot; properties, if any, are used." />
<property name="ignore-auto-routes" type="boolean" default="FALSE" description="When &quot;method&quot; is set to &quot;auto&quot; and this property to TRUE, automatically configured routes are ignored and only routes specified in the &quot;routes&quot; property, if any, are used." />
- <property name="ip6-privacy" type="NMSettingIP6ConfigPrivacy (int32)" description="Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses)." />
+ <property name="ip6-privacy" type="NMSettingIP6ConfigPrivacy (int32)" description="Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to &quot;-1&quot; (unknown) means fallback to global configuration &quot;ipv6.ip6-privacy&quot;. If also global configuration is unspecified or set to &quot;-1&quot;, fallback to read &quot;/proc/sys/net/ipv6/conf/default/use_tempaddr&quot;." />
<property name="may-fail" type="boolean" default="TRUE" description="If TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully." />
<property name="method" type="string" description="IP configuration method. NMSettingIP4Config and NMSettingIP6Config both support &quot;auto&quot;, &quot;manual&quot;, and &quot;link-local&quot;. See the subclass-specific documentation for other values. In general, for the &quot;auto&quot; method, properties such as &quot;dns&quot; and &quot;routes&quot; specify information that is added on to the information returned from automatic configuration. The &quot;ignore-auto-routes&quot; and &quot;ignore-auto-dns&quot; properties modify this behavior. For methods that imply no upstream network, such as &quot;shared&quot; or &quot;link-local&quot;, these properties must be empty." />
<property name="name" type="string" default="ipv6" description="The setting's name, which uniquely identifies the setting within the connection. Each setting type has a name unique to that type, for example &quot;ppp&quot; or &quot;wireless&quot; or &quot;wired&quot;." />
diff --git a/libnm/nm-vpn-plugin-old.c b/libnm/nm-vpn-plugin-old.c
index e6843f7e1..b43c481c7 100644
--- a/libnm/nm-vpn-plugin-old.c
+++ b/libnm/nm-vpn-plugin-old.c
@@ -279,8 +279,8 @@ nm_vpn_plugin_old_set_config (NMVpnPluginOld *plugin,
priv->got_config = TRUE;
- g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_HAS_IP4, "b", &priv->has_ip4);
- g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_HAS_IP6, "b", &priv->has_ip6);
+ (void) g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_HAS_IP4, "b", &priv->has_ip4);
+ (void) g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_HAS_IP6, "b", &priv->has_ip6);
g_warn_if_fail (priv->has_ip4 || priv->has_ip6);
@@ -288,13 +288,13 @@ nm_vpn_plugin_old_set_config (NMVpnPluginOld *plugin,
* ip4config, for compatibility with older daemons.
*/
g_clear_pointer (&priv->banner, g_free);
- g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_BANNER, "&s", &priv->banner);
+ (void) g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_BANNER, "&s", &priv->banner);
g_clear_pointer (&priv->tundev, g_free);
- g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_TUNDEV, "&s", &priv->tundev);
+ (void) g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_TUNDEV, "&s", &priv->tundev);
g_clear_pointer (&priv->gateway, g_free);
- g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY, "&s", &priv->gateway);
+ (void) g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY, "&s", &priv->gateway);
g_clear_pointer (&priv->mtu, g_free);
- g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_MTU, "&s", &priv->mtu);
+ (void) g_variant_lookup (config, NM_VPN_PLUGIN_CONFIG_MTU, "&s", &priv->mtu);
g_signal_emit (plugin, signals[CONFIG], 0, config);
}
diff --git a/libnm/tests/Makefile.am b/libnm/tests/Makefile.am
index 56dd17d5f..a2dafec76 100644
--- a/libnm/tests/Makefile.am
+++ b/libnm/tests/Makefile.am
@@ -20,7 +20,7 @@ noinst_PROGRAMS = $(TESTS)
if WITH_VALGRIND
@VALGRIND_RULES@ --launch-dbus
else
-TESTS_ENVIRONMENT = $(srcdir)/libnm-test-launch.sh
+LOG_COMPILER = $(srcdir)/libnm-test-launch.sh
endif
TESTS = test-nm-client test-remote-settings-client test-secret-agent
diff --git a/libnm/tests/Makefile.in b/libnm/tests/Makefile.in
index 631e3c539..2ffb9641a 100644
--- a/libnm/tests/Makefile.in
+++ b/libnm/tests/Makefile.in
@@ -237,13 +237,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -357,6 +540,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -515,7 +699,7 @@ with_valgrind = @with_valgrind@
@ENABLE_TESTS_TRUE@ $(top_builddir)/libnm/libnm.la \
@ENABLE_TESTS_TRUE@ $(GLIB_LIBS)
-@ENABLE_TESTS_TRUE@@WITH_VALGRIND_FALSE@TESTS_ENVIRONMENT = $(srcdir)/libnm-test-launch.sh
+@ENABLE_TESTS_TRUE@@WITH_VALGRIND_FALSE@LOG_COMPILER = $(srcdir)/libnm-test-launch.sh
@ENABLE_TESTS_TRUE@test_nm_client_SOURCES = \
@ENABLE_TESTS_TRUE@ common.c \
@ENABLE_TESTS_TRUE@ common.h \
@@ -535,7 +719,7 @@ EXTRA_DIST = libnm-test-launch.sh
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -677,98 +861,182 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-nm-client.log: test-nm-client$(EXEEXT)
+ @p='test-nm-client$(EXEEXT)'; \
+ b='test-nm-client'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-remote-settings-client.log: test-remote-settings-client$(EXEEXT)
+ @p='test-remote-settings-client$(EXEEXT)'; \
+ b='test-remote-settings-client'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-secret-agent.log: test-secret-agent$(EXEEXT)
+ @p='test-secret-agent$(EXEEXT)'; \
+ b='test-secret-agent'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -825,6 +1093,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -920,7 +1191,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/libnm/tests/libnm-test-launch.sh b/libnm/tests/libnm-test-launch.sh
index 42d9fbe26..980f8345e 100755
--- a/libnm/tests/libnm-test-launch.sh
+++ b/libnm/tests/libnm-test-launch.sh
@@ -1,9 +1,7 @@
#!/bin/sh
-# Spawn DBus if there's none
-if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
- eval `dbus-launch --sh-syntax`
- trap "kill $DBUS_SESSION_BUS_PID" EXIT
-fi
+# Spawn DBus
+eval `dbus-launch --sh-syntax`
+trap "kill $DBUS_SESSION_BUS_PID" EXIT
"$@"
diff --git a/m4/ax_lib_readline.m4 b/m4/ax_lib_readline.m4
index fe56c5bfc..af32fdaff 100644
--- a/m4/ax_lib_readline.m4
+++ b/m4/ax_lib_readline.m4
@@ -87,7 +87,7 @@ AC_DEFUN([AX_LIB_READLINE], [
])
if test -z "$ax_cv_lib_readline"; then
- AC_MSG_ERROR([readline library with terminfo support is required (one of ncurses, curses, or termcap)])
+ AC_MSG_ERROR([readline library with terminfo support is required (one of readline, edit, or editline, AND one of ncurses, curses, or termcap)])
fi
ORIG_LIBS="$LIBS"
diff --git a/m4/compiler_warnings.m4 b/m4/compiler_warnings.m4
index 5c8d20777..a1c4e1288 100644
--- a/m4/compiler_warnings.m4
+++ b/m4/compiler_warnings.m4
@@ -22,7 +22,7 @@ AC_DEFUN([NM_COMPILER_WARNING], [
AC_DEFUN([NM_COMPILER_WARNINGS],
[AC_ARG_ENABLE(more-warnings,
AS_HELP_STRING([--enable-more-warnings], [Possible values: no/yes/error]),
- set_more_warnings="$enableval",set_more_warnings=error)
+ set_more_warnings="$enableval",set_more_warnings=yes)
AC_MSG_CHECKING(for more warnings)
if test "$GCC" = "yes" -a "$set_more_warnings" != "no"; then
AC_MSG_RESULT(yes)
diff --git a/man/Makefile.in b/man/Makefile.in
index 01a94a34e..d62aa0f81 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -186,6 +186,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -299,6 +300,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/man/NetworkManager.8 b/man/NetworkManager.8
index 9f8840d0b..6896f941b 100644
--- a/man/NetworkManager.8
+++ b/man/NetworkManager.8
@@ -2,7 +2,7 @@
.\" Title: NetworkManager
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\" Date: 05/05/2015
+.\" Date: 07/14/2015
.\" Manual: Network management daemons
.\" Source: NetworkManager 1.0
.\" Language: English
@@ -239,6 +239,17 @@ in
\fBNetworkManager.conf\fR(5)
for more information\&.
.RE
+.SH "UDEV PROPERTIES"
+.PP
+\fBudev\fR(7)
+device manager is used for the network device discovery\&. The following property influences how NetworkManager manages the devices:
+.PP
+\fINM_UNMANAGED\fR
+.RS 4
+No default connection will be created and automatic activation will not be attempted when this property of a device is set to a true value ("1" or "true")\&. You will still be able to attach a connection to the device manually or observe externally added configuration such as addresses or routes\&.
+.sp
+Create an udev rule that sets this property to prevent NetworkManager from interfering with virtual Ethernet device interfaces that are managed by virtualization tools\&.
+.RE
.SH "DEBUGGING"
.PP
The following environment variables are supported to help debugging\&. When used in conjunction with the
@@ -258,4 +269,4 @@ to enable debug logging inside NetworkManager itself\&.
\fBnm-online\fR(1),
\fBnm-settings\fR(5),
\fBnm-applet\fR(1),
-\fBnm-connection-editor\fR(1)
+\fBnm-connection-editor\fR(1)\fBudev\fR(7)
diff --git a/man/NetworkManager.conf.5 b/man/NetworkManager.conf.5
index 9cfcc93f3..ae18f4f6c 100644
--- a/man/NetworkManager.conf.5
+++ b/man/NetworkManager.conf.5
@@ -2,7 +2,7 @@
.\" Title: NetworkManager.conf
.\" Author:
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\" Date: 05/05/2015
+.\" Date: 07/14/2015
.\" Manual: Configuration
.\" Source: NetworkManager 1.0
.\" Language: English
@@ -50,7 +50,9 @@ directory\&. These will be read in order, with later files overriding earlier on
.PP
The configuration file format is so\-called key file (sort of ini\-style format)\&. It consists of sections (groups) of key\-value pairs\&. Lines beginning with a \*(Aq#\*(Aq and blank lines are considered comments\&. Sections are started by a header line containing the section enclosed in \*(Aq[\*(Aq and \*(Aq]\*(Aq, and ended implicitly by the start of the next section or the end of the file\&. Each key\-value pair must be contained in a section\&.
.PP
-For keys that take a list of devices as their value, you can specify devices by their MAC addresses or interface names, or "*" to specify all devices\&.
+For keys that take a list of devices as their value, you can specify devices by their MAC addresses or interface names, or "*" to specify all devices\&. See
+the section called \(lqDevice List Format\(rq
+below\&.
.PP
Minimal system settings configuration file looks like this:
.sp
@@ -73,6 +75,7 @@ As an extension to the normal keyfile format, you can also append a value to a p
.\}
.nf
plugins+=another\-plugin
+ plugins\-=remove\-me
.fi
.if n \{\
@@ -125,7 +128,7 @@ internal\&.
.PP
\fIno\-auto\-default\fR
.RS 4
-Comma\-separated list of devices for which NetworkManager shouldn\*(Aqt create default wired connection (Auto eth0)\&. By default, NetworkManager creates a temporary wired connection for any Ethernet device that is managed and doesn\*(Aqt have a connection configured\&. List a device in this option to inhibit creating the default connection for the device\&. May have the special value
+Specify devices for which NetworkManager shouldn\*(Aqt create default wired connection (Auto eth0)\&. By default, NetworkManager creates a temporary wired connection for any Ethernet device that is managed and doesn\*(Aqt have a connection configured\&. List a device in this option to inhibit creating the default connection for the device\&. May have the special value
*
to apply to all devices\&.
.sp
@@ -133,13 +136,19 @@ When the default wired connection is deleted or saved to a new persistent connec
/var/run/NetworkManager/no\-auto\-default\&.state
to prevent creating the default connection for that device again\&.
.sp
+See
+the section called \(lqDevice List Format\(rq
+for the syntax how to specify a device\&.
+.sp
+Example:
+.sp
.if n \{\
.RS 4
.\}
.nf
- no\-auto\-default=00:22:68:5c:5d:c4,00:1e:65:ff:aa:ee
- no\-auto\-default=eth0,eth1
- no\-auto\-default=*
+no\-auto\-default=00:22:68:5c:5d:c4,00:1e:65:ff:aa:ee
+no\-auto\-default=eth0,eth1
+no\-auto\-default=*
.fi
.if n \{\
@@ -150,15 +159,24 @@ to prevent creating the default connection for that device again\&.
.PP
\fIignore\-carrier\fR
.RS 4
-Comma\-separated list of devices for which NetworkManager will (partially) ignore the carrier state\&. Normally, for device types that support carrier\-detect, such as Ethernet and InfiniBand, NetworkManager will only allow a connection to be activated on the device if carrier is present (ie, a cable is plugged in), and it will deactivate the device if carrier drops for more than a few seconds\&.
+Specify devices for which NetworkManager will (partially) ignore the carrier state\&. Normally, for device types that support carrier\-detect, such as Ethernet and InfiniBand, NetworkManager will only allow a connection to be activated on the device if carrier is present (ie, a cable is plugged in), and it will deactivate the device if carrier drops for more than a few seconds\&.
.sp
Listing a device here will allow activating connections on that device even when it does not have carrier, provided that the connection uses only statically\-configured IP addresses\&. Additionally, it will allow any active connection (whether static or dynamic) to remain active on the device when carrier is lost\&.
.sp
-May have the special value
-*
-to apply to all devices\&.
-.sp
Note that the "carrier" property of NMDevices and device D\-Bus interfaces will still reflect the actual device state; it\*(Aqs just that NetworkManager will not make use of that information\&.
+.sp
+See
+the section called \(lqDevice List Format\(rq
+for the syntax how to specify a device\&.
+.RE
+.PP
+\fIassume\-ipv6ll\-only\fR
+.RS 4
+Specify devices for which NetworkManager will try to generate a connection based on initial configuration when the device only has an IPv6 link\-local address\&.
+.sp
+See
+the section called \(lqDevice List Format\(rq
+for the syntax how to specify a device\&.
.RE
.PP
\fIconfigure\-and\-quit\fR
@@ -205,19 +223,11 @@ Set a persistent hostname\&.
.PP
\fIunmanaged\-devices\fR
.RS 4
-Set devices that should be ignored by NetworkManager when using the
-keyfile
-plugin\&. Devices are specified in the following format:
+Set devices that should be ignored by NetworkManager\&.
.sp
-mac:<hwaddr>
-or
-interface\-name:<ifname>\&. Here
-hwaddr
-is the MAC address of the device to be ignored, in hex\-digits\-and\-colons notation\&.
-ifname
-is the interface name of the ignored device\&.
-.sp
-Multiple entries are separated with semicolons\&. No spaces are allowed in the value\&.
+See
+the section called \(lqDevice List Format\(rq
+for the syntax how to specify a device\&.
.sp
Example:
.sp
@@ -415,6 +425,86 @@ IP : shortcut for "IP4,IP6"
HW : deprecated alias for "PLATFORM"
.RE
.RE
+.SH "CONNECTION SECTION"
+.PP
+This section allows to specify default values for connections\&. Not all properties can be overwritten, only a selected list below\&. You can have multiple
+connection
+sections, by having different sections with a name that all start with "connection"\&.
+.PP
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+[connection]
+ipv6\&.ip6\-privacy=0
+connection\&.autoconnect\-slaves=1
+
+[connection\-wifi\-wlan0]
+match\-device=interface\-name:wlan0
+ipv4\&.route\-metric=50
+
+[connection\-wifi\-other]
+match\-device=type:wifi
+ipv4\&.route\-metric=55
+ipv6\&.ip6\-privacy=1
+.fi
+.if n \{\
+.RE
+.\}
+.PP
+The sections within one file are considered in order of appearance, with the exception that the
+[connection]
+section is always considered last\&. In the example above, this order is
+[connection\-wifi\-wlan0],
+[connection\-wlan\-other], and
+[connection]\&. When checking for a default configuration value, the section are searched until the requested value is found\&. In the example above, "ipv4\&.route\-metric" for wlan0 interface is set to 50, and for all other Wi\-Fi typed interfaces to 55\&. Also, Wi\-Fi devices would have IPv6 private addresses enabled by default, but other devices would have it disabled\&. Note that also "wlan0" gets "ipv6\&.ip6\-privacy=1", because although the section "[connection\-wifi\-wlan0]" matches the device, it does not contain that property and the search continues\&.
+.PP
+When having different sections in multiple files, sections from files that are read later have higher priority\&. So within one file the priority of the sections is top\-to\-bottom\&. Across multiple files later definitions take precedence\&.
+.PP
+.PP
+\fImatch\-device\fR
+.RS 4
+An optional device spec that restricts when the section applies\&. See
+the section called \(lqDevice List Format\(rq
+for the possible values\&.
+.RE
+.PP
+\fIstop\-match\fR
+.RS 4
+An optional boolean value which defaults to
+no\&. If the section matches (based on
+match\-device), further sections will not be considered even if the property in question is not present\&. In the example above, if
+[connection\-wifi\-wlan0]
+would have
+stop\-match
+set to
+yes, its
+ipv6\&.ip6\-privacy
+value would be unspecified\&.
+.RE
+.PP
+The following properties are supported to have their default values configured:
+.PP
+\fIipv4\&.route\-metric\fR
+.RS 4
+.RE
+.PP
+\fIipv6\&.ip6\-privacy\fR
+.RS 4
+If
+ipv6\&.ip6\-privacy
+is unset, use the content of "/proc/sys/net/ipv6/conf/default/use_tempaddr" as last fallback\&.
+.RE
+.PP
+\fIipv6\&.route\-metric\fR
+.RS 4
+.RE
+.PP
+\fIconnection\&.autoconnect\-slaves\fR
+.RS 4
+.RE
.SH "CONNECTIVITY SECTION"
.PP
This section controls NetworkManager\*(Aqs optional connectivity checking functionality\&. This allows NetworkManager to detect whether or not the system can actually access the internet or whether it is behind a captive portal\&.
@@ -479,6 +569,92 @@ plugin instead\&.
.RS 4
This plugin allows to read iBFT configuration (iSCSI Boot Firmware Table)\&. The configuration is read using /sbin/iscsiadm\&. Users are expected to configure iBFT connections via the firmware interfaces\&.
.RE
+.SH "APPENDIX"
+.SS "Device List Format"
+.PP
+The configuration options
+main\&.no\-auto\-default,
+main\&.ignore\-carrier, and
+keyfile\&.unmanaged\-devices
+select devices based on a list of matchings\&. Devices can be specified using the following format:
+.PP
+.PP
+*
+.RS 4
+Matches every device\&.
+.RE
+.PP
+IFNAME
+.RS 4
+Case sensitive match of interface name of the device\&. Globbing is not supported\&.
+.RE
+.PP
+HWADDR
+.RS 4
+Match the MAC address of the device\&. Globbing is not supported
+.RE
+.PP
+interface\-name:IFNAME, interface\-name:~IFNAME
+.RS 4
+Case sensitive match of interface name of the device\&. Simple globbing is supported with
+*
+and
+?\&. Ranges and escaping is not supported\&.
+.RE
+.PP
+interface\-name:=IFNAME
+.RS 4
+Case sensitive match of interface name of the device\&. Globbing is disabled and
+IFNAME
+is taken literally\&.
+.RE
+.PP
+mac:HWADDR
+.RS 4
+Match the MAC address of the device\&. Globbing is not supported
+.RE
+.PP
+s390\-subchannels:HWADDR
+.RS 4
+Match the device based on the subchannel address\&. Globbing is not supported
+.RE
+.PP
+type:TYPE
+.RS 4
+Match the device type\&. Valid type names are as reported by "nmcli \-f GENERAL\&.TYPE device show"\&. Globbing is not supported\&.
+.RE
+.PP
+except:SPEC
+.RS 4
+Negative match of a device\&.
+SPEC
+must be explicitly qualified with a prefix such as
+interface\-name:\&. A negative match has higher priority then the positive matches above\&.
+.RE
+.PP
+SPEC[,;]SPEC
+.RS 4
+Multiple specs can be concatenated with comman or semicolon\&. The order does not matter as matches are either positive (inclusive) or negative, with negative matches having higher priority\&.
+.sp
+Backslash is supported to escape the separators \*(Aq;\*(Aq and \*(Aq,\*(Aq, and to express special characters such as newline (\*(Aq\en\*(Aq), tabulator (\*(Aq\et\*(Aq), whitespace (\*(Aq\es\*(Aq) and backslash (\*(Aq\e\e\*(Aq)\&. The globbing of interface names cannot be escaped\&. Whitespace is taken literally so usually the specs will be concatenated without spaces\&.
+.RE
+.PP
+Example:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+interface\-name:em4
+mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface\-name:eth2
+interface\-name:vboxnet*,except:interface\-name:vboxnet2
+*,except:mac:00:22:68:1c:59:b1
+
+.fi
+.if n \{\
+.RE
+.\}
+.sp
.SH "SEE ALSO"
.PP
\fBNetworkManager\fR(8),
diff --git a/man/NetworkManager.conf.xml.in b/man/NetworkManager.conf.xml.in
index 7c6b95516..40fa49dd7 100644
--- a/man/NetworkManager.conf.xml.in
+++ b/man/NetworkManager.conf.xml.in
@@ -62,7 +62,8 @@ Copyright 2010 - 2014 Red Hat, Inc.
<para>
For keys that take a list of devices as their value, you can
specify devices by their MAC addresses or interface names, or
- "*" to specify all devices.
+ "*" to specify all devices. See <xref linkend="device-spec"/>
+ below.
</para>
<para>
Minimal system settings configuration file looks like this:
@@ -76,6 +77,7 @@ Copyright 2010 - 2014 Red Hat, Inc.
append a value to a previously-set list-valued key by doing:
<programlisting>
plugins+=another-plugin
+ plugins-=remove-me
</programlisting>
</para>
</refsect1>
@@ -148,7 +150,7 @@ Copyright 2010 - 2014 Red Hat, Inc.
</varlistentry>
<varlistentry>
<term><varname>no-auto-default</varname></term>
- <listitem><para>Comma-separated list of devices for which
+ <listitem><para>Specify devices for which
NetworkManager shouldn't create default wired connection
(Auto eth0). By default, NetworkManager creates a temporary
wired connection for any Ethernet device that is managed and
@@ -162,11 +164,15 @@ Copyright 2010 - 2014 Red Hat, Inc.
<filename>/var/run/NetworkManager/no-auto-default.state</filename>
to prevent creating the default connection for that device
again.</para>
+ <para>See <xref linkend="device-spec"/> for the syntax how to
+ specify a device.
+ </para>
<para>
+ Example:
<programlisting>
- no-auto-default=00:22:68:5c:5d:c4,00:1e:65:ff:aa:ee
- no-auto-default=eth0,eth1
- no-auto-default=*
+no-auto-default=00:22:68:5c:5d:c4,00:1e:65:ff:aa:ee
+no-auto-default=eth0,eth1
+no-auto-default=*
</programlisting>
</para>
</listitem>
@@ -176,8 +182,8 @@ Copyright 2010 - 2014 Red Hat, Inc.
<term><varname>ignore-carrier</varname></term>
<listitem>
<para>
- Comma-separated list of devices for which NetworkManager
- will (partially) ignore the carrier state. Normally, for
+ Specify devices for which NetworkManager will (partially)
+ ignore the carrier state. Normally, for
device types that support carrier-detect, such as Ethernet
and InfiniBand, NetworkManager will only allow a
connection to be activated on the device if carrier is
@@ -194,14 +200,27 @@ Copyright 2010 - 2014 Red Hat, Inc.
the device when carrier is lost.
</para>
<para>
- May have the special value <literal>*</literal> to apply
- to all devices.
- </para>
- <para>
Note that the "carrier" property of NMDevices and device D-Bus
interfaces will still reflect the actual device state; it's just
that NetworkManager will not make use of that information.
</para>
+ <para>See <xref linkend="device-spec"/> for the syntax how to
+ specify a device.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>assume-ipv6ll-only</varname></term>
+ <listitem>
+ <para>
+ Specify devices for which NetworkManager will try to
+ generate a connection based on initial configuration when
+ the device only has an IPv6 link-local address.
+ </para>
+ <para>See <xref linkend="device-spec"/> for the syntax how to
+ specify a device.
+ </para>
</listitem>
</varlistentry>
@@ -287,17 +306,11 @@ Copyright 2010 - 2014 Red Hat, Inc.
<varlistentry>
<term><varname>unmanaged-devices</varname></term>
<listitem><para>Set devices that should be ignored by
- NetworkManager when using the <literal>keyfile</literal>
- plugin. Devices are specified in the following
- format:</para>
- <para><literal>mac:&lt;hwaddr&gt;</literal> or
- <literal>interface-name:&lt;ifname&gt;</literal>. Here
- <literal>hwaddr</literal> is the MAC address of the device
- to be ignored, in hex-digits-and-colons notation.
- <literal>ifname</literal> is the interface name of the
- ignored device.</para>
- <para>Multiple entries are separated with semicolons. No
- spaces are allowed in the value.</para>
+ NetworkManager.
+ </para>
+ <para>See <xref linkend="device-spec"/> for the syntax how to
+ specify a device.
+ </para>
<para>
Example:
<programlisting>
@@ -429,6 +442,97 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth
</refsect1>
<refsect1>
+ <title><literal>connection</literal> section</title>
+ <para>This section allows to specify default values for
+ connections. Not all properties can be overwritten, only a selected
+ list below. You can have multiple <literal>connection</literal>
+ sections, by having different sections with a name that all start
+ with "connection".</para>
+ <para>
+ Example:
+<programlisting>
+[connection]
+ipv6.ip6-privacy=0
+connection.autoconnect-slaves=1
+
+[connection-wifi-wlan0]
+match-device=interface-name:wlan0
+ipv4.route-metric=50
+
+[connection-wifi-other]
+match-device=type:wifi
+ipv4.route-metric=55
+ipv6.ip6-privacy=1
+</programlisting>
+ </para>
+
+ <para>
+ The sections within one file are considered in order of appearance, with the
+ exception that the <literal>[connection]</literal> section is always
+ considered last. In the example above, this order is <literal>[connection-wifi-wlan0]</literal>,
+ <literal>[connection-wlan-other]</literal>, and <literal>[connection]</literal>.
+ When checking for a default configuration value, the section are searched until
+ the requested value is found.
+ In the example above, "ipv4.route-metric" for wlan0 interface is set to 50,
+ and for all other Wi-Fi typed interfaces to 55. Also, Wi-Fi devices would have
+ IPv6 private addresses enabled by default, but other devices would have it disabled.
+ Note that also "wlan0" gets "ipv6.ip6-privacy=1", because although the section
+ "[connection-wifi-wlan0]" matches the device, it does not contain that property
+ and the search continues.
+ </para>
+ <para>
+ When having different sections in multiple files, sections from files that are read
+ later have higher priority. So within one file the priority of the sections is
+ top-to-bottom. Across multiple files later definitions take precedence.
+ </para>
+
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term><varname>match-device</varname></term>
+ <listitem><para>An optional device spec that restricts
+ when the section applies. See <xref linkend="device-spec"/>
+ for the possible values.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>stop-match</varname></term>
+ <listitem><para>An optional boolean value which defaults to
+ <literal>no</literal>. If the section matches (based on
+ <literal>match-device</literal>), further sections will not be
+ considered even if the property in question is not present. In
+ the example above, if <literal>[connection-wifi-wlan0]</literal> would
+ have <literal>stop-match</literal> set to <literal>yes</literal>,
+ its <literal>ipv6.ip6-privacy</literal> value would be
+ unspecified.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ <para>
+ The following properties are supported to have their default values configured:
+ <variablelist>
+ <varlistentry>
+ <term><varname>ipv4.route-metric</varname></term>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>ipv6.ip6-privacy</varname></term>
+ <listitem><para>If <literal>ipv6.ip6-privacy</literal> is unset, use the content of
+ "/proc/sys/net/ipv6/conf/default/use_tempaddr" as last fallback.
+ </para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>ipv6.route-metric</varname></term>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>connection.autoconnect-slaves</varname></term>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </refsect1>
+
+ <refsect1>
<title><literal>connectivity</literal> section</title>
<para>This section controls NetworkManager's optional connectivity
checking functionality. This allows NetworkManager to detect
@@ -554,6 +658,82 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth
</refsect1>
<refsect1>
+ <title>Appendix</title>
+ <refsect2 id="device-spec">
+ <title>Device List Format</title>
+ <para>
+ The configuration options <literal>main.no-auto-default</literal>, <literal>main.ignore-carrier</literal>,
+ and <literal>keyfile.unmanaged-devices</literal> select devices based on a list of matchings.
+ Devices can be specified using the following format:
+ </para>
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term>*</term>
+ <listitem><para>Matches every device.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>IFNAME</term>
+ <listitem><para>Case sensitive match of interface name of the device. Globbing is not supported.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>HWADDR</term>
+ <listitem><para>Match the MAC address of the device. Globbing is not supported</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>interface-name:IFNAME</term>
+ <term>interface-name:~IFNAME</term>
+ <listitem><para>Case sensitive match of interface name of the device. Simple globbing is supported with
+ <literal>*</literal> and <literal>?</literal>. Ranges and escaping is not supported.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>interface-name:=IFNAME</term>
+ <listitem><para>Case sensitive match of interface name of the device. Globbing is disabled and <literal>IFNAME</literal>
+ is taken literally.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>mac:HWADDR</term>
+ <listitem><para>Match the MAC address of the device. Globbing is not supported</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>s390-subchannels:HWADDR</term>
+ <listitem><para>Match the device based on the subchannel address. Globbing is not supported</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>type:TYPE</term>
+ <listitem><para>Match the device type. Valid type names are as reported by "<literal>nmcli -f GENERAL.TYPE device show</literal>".
+ Globbing is not supported.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>except:SPEC</term>
+ <listitem><para>Negative match of a device. <literal>SPEC</literal> must be explicitly qualified with
+ a prefix such as <literal>interface-name:</literal>. A negative match has higher priority then the positive
+ matches above.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>SPEC[,;]SPEC</term>
+ <listitem><para>Multiple specs can be concatenated with comman or semicolon. The order does not matter as
+ matches are either positive (inclusive) or negative, with negative matches having higher priority.</para>
+ <para>Backslash is supported to escape the separators ';' and ',', and to express special
+ characters such as newline ('\n'), tabulator ('\t'), whitespace ('\s') and backslash ('\\'). The globbing of
+ interface names cannot be escaped. Whitespace is taken literally so usually the specs will be concatenated
+ without spaces.</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ <para>
+ Example:
+ <programlisting>
+interface-name:em4
+mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth2
+interface-name:vboxnet*,except:interface-name:vboxnet2
+*,except:mac:00:22:68:1c:59:b1
+ </programlisting>
+ </para>
+ </refsect2>
+ </refsect1>
+
+ <refsect1>
<title>See Also</title>
<para>
<citerefentry><refentrytitle>NetworkManager</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
diff --git a/man/nm-settings-ifcfg-rh.5 b/man/nm-settings-ifcfg-rh.5
index 6d394e915..e31d9a9d6 100644
--- a/man/nm-settings-ifcfg-rh.5
+++ b/man/nm-settings-ifcfg-rh.5
@@ -2,12 +2,12 @@
.\" Title: nm-settings-ifcfg-rh
.\" Author: [see the "AUTHOR" section]
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\" Date: 05 May 2015
+.\" Date: 14 July 2015
.\" Manual: Configuration
-.\" Source: NetworkManager 1.0.2
+.\" Source: NetworkManager 1.0.4
.\" Language: English
.\"
-.TH "NM\-SETTINGS\-IFCFG\" "5" "" "NetworkManager 1\&.0\&.2" "Configuration"
+.TH "NM\-SETTINGS\-IFCFG\" "5" "" "NetworkManager 1\&.0\&.4" "Configuration"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -897,6 +897,7 @@ l l l l
l l l l
l l l l
l l l l
+l l l l
l l l l.
T{
id
@@ -1001,6 +1002,15 @@ T}:T{
Slave type doesn\*(Aqt map directly to a variable, but it is recognized using different variables\&. MASTER for bonding, TEAM_MASTER and DEVICETYPE for teaming, BRIDGE for bridging\&.
T}
T{
+autoconnect\-slaves
+T}:T{
+AUTOCONNECT\-SLAVES\fI(+)\fR
+T}:T{
+missing variable means global default
+T}:T{
+Whether slaves of this connection should be auto\-connected when this connection is activated\&.
+T}
+T{
secondaries
T}:T{
SECONDARY_UUIDS\fI(+)\fR
diff --git a/man/nm-settings-ifcfg-rh.xml b/man/nm-settings-ifcfg-rh.xml
index 362bd68b6..7146cb43a 100644
--- a/man/nm-settings-ifcfg-rh.xml
+++ b/man/nm-settings-ifcfg-rh.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
-<refentry id="nm-settings-ifcfg-rh"><refentryinfo><date>05 May 2015</date></refentryinfo><refmeta><refentrytitle>nm-settings-ifcfg-rh</refentrytitle><manvolnum>5</manvolnum><refmiscinfo class="source">NetworkManager</refmiscinfo><refmiscinfo class="manual">Configuration</refmiscinfo><refmiscinfo class="version">1.0.2</refmiscinfo></refmeta><refnamediv><refname>nm-settings-ifcfg-rh</refname><refpurpose>Description of <emphasis>ifcfg-rh</emphasis> settings plugin</refpurpose></refnamediv><refsect1><title>DESCRIPTION</title><para>
+<refentry id="nm-settings-ifcfg-rh"><refentryinfo><date>14 July 2015</date></refentryinfo><refmeta><refentrytitle>nm-settings-ifcfg-rh</refentrytitle><manvolnum>5</manvolnum><refmiscinfo class="source">NetworkManager</refmiscinfo><refmiscinfo class="manual">Configuration</refmiscinfo><refmiscinfo class="version">1.0.4</refmiscinfo></refmeta><refnamediv><refname>nm-settings-ifcfg-rh</refname><refpurpose>Description of <emphasis>ifcfg-rh</emphasis> settings plugin</refpurpose></refnamediv><refsect1><title>DESCRIPTION</title><para>
NetworkManager is based on the concept of connection profiles that contain
network configuration (see <citerefentry><refentrytitle>nm-settings</refentrytitle><manvolnum>5</manvolnum></citerefentry> for details). The profiles can be
stored in various formats. NetworkManager uses plugins for reading and writing
@@ -233,7 +233,7 @@ Example: </emphasis>AUTOCONNECT_PRIORITY=20<emphasis role="bold">
Allowed values: </emphasis>-999 to 999</entry></row><row><entry align="left">zone</entry><entry align="left">ZONE<emphasis>(+)</emphasis></entry><entry align="left"/><entry align="left">Trust level of this connection. The string is usually used for a firewall.<emphasis role="bold">
-Example: </emphasis>ZONE=Work</entry></row><row><entry align="left">master</entry><entry align="left">MASTER, TEAM_MASTER, BRIDGE</entry><entry align="left"/><entry align="left">Reference to master connection. The variable used depends on the connection type.</entry></row><row><entry align="left">slave-type</entry><entry align="left">MASTER, TEAM_MASTER, DEVICETYPE, BRIDGE</entry><entry align="left"/><entry align="left">Slave type doesn't map directly to a variable, but it is recognized using different variables. MASTER for bonding, TEAM_MASTER and DEVICETYPE for teaming, BRIDGE for bridging.</entry></row><row><entry align="left">secondaries</entry><entry align="left">SECONDARY_UUIDS<emphasis>(+)</emphasis></entry><entry align="left"/><entry align="left">UUID of VPN connections that should be activated together with this connection.</entry></row><row><entry align="left">gateway-ping-timeout</entry><entry align="left">GATEWAY_PING_TIMEOUT<emphasis>(+)</emphasis></entry><entry align="left">0</entry><entry align="left">If greater than zero, the IP connectivity will be checked by pinging the gateway and waiting for the specified timeout (in seconds).<emphasis role="bold">
+Example: </emphasis>ZONE=Work</entry></row><row><entry align="left">master</entry><entry align="left">MASTER, TEAM_MASTER, BRIDGE</entry><entry align="left"/><entry align="left">Reference to master connection. The variable used depends on the connection type.</entry></row><row><entry align="left">slave-type</entry><entry align="left">MASTER, TEAM_MASTER, DEVICETYPE, BRIDGE</entry><entry align="left"/><entry align="left">Slave type doesn't map directly to a variable, but it is recognized using different variables. MASTER for bonding, TEAM_MASTER and DEVICETYPE for teaming, BRIDGE for bridging.</entry></row><row><entry align="left">autoconnect-slaves</entry><entry align="left">AUTOCONNECT-SLAVES<emphasis>(+)</emphasis></entry><entry align="left">missing variable means global default</entry><entry align="left">Whether slaves of this connection should be auto-connected when this connection is activated.</entry></row><row><entry align="left">secondaries</entry><entry align="left">SECONDARY_UUIDS<emphasis>(+)</emphasis></entry><entry align="left"/><entry align="left">UUID of VPN connections that should be activated together with this connection.</entry></row><row><entry align="left">gateway-ping-timeout</entry><entry align="left">GATEWAY_PING_TIMEOUT<emphasis>(+)</emphasis></entry><entry align="left">0</entry><entry align="left">If greater than zero, the IP connectivity will be checked by pinging the gateway and waiting for the specified timeout (in seconds).<emphasis role="bold">
Example: </emphasis>GATEWAY_PING_TIMEOUT=5</entry></row></tbody></tgroup></table><table><title>dcb setting</title><tgroup cols="4"><thead><row><entry>Property</entry><entry>Ifcfg-rh Variable</entry><entry>Default</entry><entry>Description</entry></row></thead><tbody><row><entry align="left">app-fcoe-flags</entry><entry align="left">DCB_APP_FCOE_ENABLE, DCB_APP_FCOE_ADVERTISE, DCB_APP_FCOE_WILLING</entry><entry align="left">no</entry><entry align="left">FCOE flags.<emphasis role="bold">
diff --git a/man/nm-settings-keyfile.5 b/man/nm-settings-keyfile.5
index ba6f63116..1343bc157 100644
--- a/man/nm-settings-keyfile.5
+++ b/man/nm-settings-keyfile.5
@@ -2,12 +2,12 @@
.\" Title: nm-settings-keyfile
.\" Author: [see the "AUTHOR" section]
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\" Date: 05 May 2015
+.\" Date: 14 July 2015
.\" Manual: Configuration
-.\" Source: NetworkManager 1.0.2
+.\" Source: NetworkManager 1.0.4
.\" Language: English
.\"
-.TH "NM\-SETTINGS\-KEYFIL" "5" "" "NetworkManager 1\&.0\&.2" "Configuration"
+.TH "NM\-SETTINGS\-KEYFIL" "5" "" "NetworkManager 1\&.0\&.4" "Configuration"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/man/nm-settings-keyfile.xml b/man/nm-settings-keyfile.xml
index 8f49a8fc2..2ab07314c 100644
--- a/man/nm-settings-keyfile.xml
+++ b/man/nm-settings-keyfile.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
-<refentry id="nm-settings-keyfile"><refentryinfo><date>05 May 2015</date></refentryinfo><refmeta><refentrytitle>nm-settings-keyfile</refentrytitle><manvolnum>5</manvolnum><refmiscinfo class="source">NetworkManager</refmiscinfo><refmiscinfo class="manual">Configuration</refmiscinfo><refmiscinfo class="version">1.0.2</refmiscinfo></refmeta><refnamediv><refname>nm-settings-keyfile</refname><refpurpose>Description of <emphasis>keyfile</emphasis> settings plugin</refpurpose></refnamediv><refsect1><title>DESCRIPTION</title><para>
+<refentry id="nm-settings-keyfile"><refentryinfo><date>14 July 2015</date></refentryinfo><refmeta><refentrytitle>nm-settings-keyfile</refentrytitle><manvolnum>5</manvolnum><refmiscinfo class="source">NetworkManager</refmiscinfo><refmiscinfo class="manual">Configuration</refmiscinfo><refmiscinfo class="version">1.0.4</refmiscinfo></refmeta><refnamediv><refname>nm-settings-keyfile</refname><refpurpose>Description of <emphasis>keyfile</emphasis> settings plugin</refpurpose></refnamediv><refsect1><title>DESCRIPTION</title><para>
NetworkManager is based on the concept of connection profiles that contain
network configuration (see <citerefentry><refentrytitle>nm-settings</refentrytitle><manvolnum>5</manvolnum></citerefentry> for details). The profiles can be
stored in various formats. NetworkManager uses plugins for reading and writing
diff --git a/man/nm-settings.5 b/man/nm-settings.5
index 2e1d1be96..35b24d153 100644
--- a/man/nm-settings.5
+++ b/man/nm-settings.5
@@ -2,12 +2,12 @@
.\" Title: nm-settings
.\" Author: [see the "AUTHOR" section]
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
-.\" Date: 05 May 2015
+.\" Date: 14 July 2015
.\" Manual: Configuration
-.\" Source: NetworkManager 1.0.2
+.\" Source: NetworkManager 1.0.4
.\" Language: English
.\"
-.TH "NM\-SETTINGS" "5" "" "NetworkManager 1\&.0\&.2" "Configuration"
+.TH "NM\-SETTINGS" "5" "" "NetworkManager 1\&.0\&.4" "Configuration"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -405,7 +405,7 @@ boolean
T}:T{
FALSE
T}:T{
-When TRUE, overrides the "ca\-path" and "phase2\-ca\-path" properties using the system CA directory specified at configure time with the \-\-system\-ca\-path switch\&. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca\-cert" and "phase2\-ca\-cert" properties\&.
+When TRUE, overrides the "ca\-path" and "phase2\-ca\-path" properties using the system CA directory specified at configure time with the \-\-system\-ca\-path switch\&. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca\-cert" and "phase2\-ca\-cert" properties\&. If the path provided with \-\-system\-ca\-path is rather a file name (bundle of trusted CA certificates), it overrides "ca\-cert" and "phase2\-ca\-cert" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant)\&.
T}
.TE
.sp 1
@@ -888,6 +888,7 @@ l l l l
l l l l
l l l l
l l l l
+l l l l
l l l l.
T{
autoconnect
@@ -908,6 +909,15 @@ T}:T{
The autoconnect priority\&. If the connection is set to autoconnect, connections with higher priority will be preferred\&. Defaults to 0\&. The higher number means higher priority\&.
T}
T{
+autoconnect\-slaves
+T}:T{
+NMSettingConnectionAutoconnectSlaves (int32)
+T}:T{
+\ \&
+T}:T{
+Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection\&. This only has a real effect for master connections\&. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, \-1: default\&. If \-1 (default) is set, global connection\&.autoconnect\-slaves is read to determine the real value\&. If it is default as well, this fallbacks to 0\&.
+T}
+T{
gateway\-ping\-timeout
T}:T{
uint32
@@ -1755,7 +1765,7 @@ NMSettingIP6ConfigPrivacy (int32)
T}:T{
\ \&
T}:T{
-Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941\&. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI\-64\&. This enhances privacy, but could cause problems in some applications, on the other hand\&. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses)\&.
+Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941\&. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI\-64\&. This enhances privacy, but could cause problems in some applications, on the other hand\&. The permitted values are: \-1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses)\&. Having a per\-connection setting set to "\-1" (unknown) means fallback to global configuration "ipv6\&.ip6\-privacy"\&. If also global configuration is unspecified or set to "\-1", fallback to read "/proc/sys/net/ipv6/conf/default/use_tempaddr"\&.
T}
T{
may\-fail
diff --git a/man/nm-settings.xml b/man/nm-settings.xml
index d70b1771c..d289d2d3e 100644
--- a/man/nm-settings.xml
+++ b/man/nm-settings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
-<refentry id="nm-settings"><refentryinfo><date>05 May 2015</date></refentryinfo><refmeta><refentrytitle>nm-settings</refentrytitle><manvolnum>5</manvolnum><refmiscinfo class="source">NetworkManager</refmiscinfo><refmiscinfo class="manual">Configuration</refmiscinfo><refmiscinfo class="version">1.0.2</refmiscinfo></refmeta><refnamediv><refname>nm-settings</refname><refpurpose>Description of settings and properties of NetworkManager connection profiles</refpurpose></refnamediv><refsect1><title>DESCRIPTION</title><para>
+<refentry id="nm-settings"><refentryinfo><date>14 July 2015</date></refentryinfo><refmeta><refentrytitle>nm-settings</refentrytitle><manvolnum>5</manvolnum><refmiscinfo class="source">NetworkManager</refmiscinfo><refmiscinfo class="manual">Configuration</refmiscinfo><refmiscinfo class="version">1.0.4</refmiscinfo></refmeta><refnamediv><refname>nm-settings</refname><refpurpose>Description of settings and properties of NetworkManager connection profiles</refpurpose></refnamediv><refsect1><title>DESCRIPTION</title><para>
NetworkManager is based on a concept of connection profiles, sometimes referred to as
connections only. These connection profiles contain a network configuration. When
NetworkManager activates a connection profile on a network device the configuration will
@@ -66,7 +66,7 @@
<row><entry align="left">private-key-password</entry><entry align="left">string</entry><entry align="left"/><entry>The password used to decrypt the private key specified in the "private-key" property when the private key either uses the path scheme, or if the private key is a PKCS#12 format key.</entry></row>
<row><entry align="left">private-key-password-flags</entry><entry align="left">NMSettingSecretFlags (uint32)</entry><entry align="left"/><entry>Flags indicating how to handle the "private-key-password" property. (see <xref linkend="secrets-flags"/> for flag values)</entry></row>
<row><entry align="left">subject-match</entry><entry align="left">string</entry><entry align="left"/><entry>Substring to be matched against the subject of the certificate presented by the authentication server. When unset, no verification of the authentication server certificate's subject is performed.</entry></row>
- <row><entry align="left">system-ca-certs</entry><entry align="left">boolean</entry><entry align="left">FALSE</entry><entry>When TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties.</entry></row>
+ <row><entry align="left">system-ca-certs</entry><entry align="left">boolean</entry><entry align="left">FALSE</entry><entry>When TRUE, overrides the "ca-path" and "phase2-ca-path" properties using the system CA directory specified at configure time with the --system-ca-path switch. The certificates in this directory are added to the verification chain in addition to any certificates specified by the "ca-cert" and "phase2-ca-cert" properties. If the path provided with --system-ca-path is rather a file name (bundle of trusted CA certificates), it overrides "ca-cert" and "phase2-ca-cert" properties instead (sets ca_cert/ca_cert2 options for wpa_supplicant).</entry></row>
</tbody></tgroup></table>
<table><title>adsl setting</title><tgroup cols="4"><thead><row><entry>Key Name</entry><entry>Value Type</entry><entry>Default Value</entry><entry>Value Description</entry></row></thead><tbody>
<row><entry align="left">encapsulation</entry><entry align="left">string</entry><entry align="left"/><entry>Encapsulation of ADSL connection. Can be "vcmux" or "llc".</entry></row>
@@ -115,6 +115,7 @@
<table><title>connection setting</title><tgroup cols="4"><thead><row><entry>Key Name</entry><entry>Value Type</entry><entry>Default Value</entry><entry>Value Description</entry></row></thead><tbody>
<row><entry align="left">autoconnect</entry><entry align="left">boolean</entry><entry align="left">TRUE</entry><entry>Whether or not the connection should be automatically connected by NetworkManager when the resources for the connection are available. TRUE to automatically activate the connection, FALSE to require manual intervention to activate the connection.</entry></row>
<row><entry align="left">autoconnect-priority</entry><entry align="left">int32</entry><entry align="left">0</entry><entry>The autoconnect priority. If the connection is set to autoconnect, connections with higher priority will be preferred. Defaults to 0. The higher number means higher priority.</entry></row>
+ <row><entry align="left">autoconnect-slaves</entry><entry align="left">NMSettingConnectionAutoconnectSlaves (int32)</entry><entry align="left"/><entry>Whether or not slaves of this connection should be automatically brought up when NetworkManager activates this connection. This only has a real effect for master connections. The permitted values are: 0: leave slave connections untouched, 1: activate all the slave connections with this connection, -1: default. If -1 (default) is set, global connection.autoconnect-slaves is read to determine the real value. If it is default as well, this fallbacks to 0.</entry></row>
<row><entry align="left">gateway-ping-timeout</entry><entry align="left">uint32</entry><entry align="left">0</entry><entry>If greater than zero, delay success of IP addressing until either the timeout is reached, or an IP gateway replies to a ping.</entry></row>
<row><entry align="left">id</entry><entry align="left">string</entry><entry align="left"/><entry>A human readable unique identifier for the connection, like "Work Wi-Fi" or "T-Mobile 3G".</entry></row>
<row><entry align="left">interface-name</entry><entry align="left">string</entry><entry align="left"/><entry>The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface.</entry></row>
@@ -199,7 +200,7 @@
<row><entry align="left">gateway</entry><entry align="left">string</entry><entry align="left"/><entry>The gateway associated with this configuration. This is only meaningful if "addresses" is also set.</entry></row>
<row><entry align="left">ignore-auto-dns</entry><entry align="left">boolean</entry><entry align="left">FALSE</entry><entry>When "method" is set to "auto" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the "dns" and "dns-search" properties, if any, are used.</entry></row>
<row><entry align="left">ignore-auto-routes</entry><entry align="left">boolean</entry><entry align="left">FALSE</entry><entry>When "method" is set to "auto" and this property to TRUE, automatically configured routes are ignored and only routes specified in the "routes" property, if any, are used.</entry></row>
- <row><entry align="left">ip6-privacy</entry><entry align="left">NMSettingIP6ConfigPrivacy (int32)</entry><entry align="left"/><entry>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses).</entry></row>
+ <row><entry align="left">ip6-privacy</entry><entry align="left">NMSettingIP6ConfigPrivacy (int32)</entry><entry align="left"/><entry>Configure IPv6 Privacy Extensions for SLAAC, described in RFC4941. If enabled, it makes the kernel generate a temporary IPv6 address in addition to the public one generated from MAC address via modified EUI-64. This enhances privacy, but could cause problems in some applications, on the other hand. The permitted values are: -1: unknown, 0: disabled, 1: enabled (prefer public address), 2: enabled (prefer temporary addresses). Having a per-connection setting set to "-1" (unknown) means fallback to global configuration "ipv6.ip6-privacy". If also global configuration is unspecified or set to "-1", fallback to read "/proc/sys/net/ipv6/conf/default/use_tempaddr".</entry></row>
<row><entry align="left">may-fail</entry><entry align="left">boolean</entry><entry align="left">TRUE</entry><entry>If TRUE, allow overall network configuration to proceed even if the configuration specified by this property times out. Note that at least one IP configuration must succeed or overall network configuration will still fail. For example, in IPv6-only networks, setting this property to TRUE on the NMSettingIP4Config allows the overall network configuration to succeed if IPv4 configuration fails but IPv6 configuration completes successfully.</entry></row>
<row><entry align="left">method</entry><entry align="left">string</entry><entry align="left"/><entry>IP configuration method. NMSettingIP4Config and NMSettingIP6Config both support "auto", "manual", and "link-local". See the subclass-specific documentation for other values. In general, for the "auto" method, properties such as "dns" and "routes" specify information that is added on to the information returned from automatic configuration. The "ignore-auto-routes" and "ignore-auto-dns" properties modify this behavior. For methods that imply no upstream network, such as "shared" or "link-local", these properties must be empty.</entry></row>
<row><entry align="left">name</entry><entry align="left">string</entry><entry align="left">ipv6</entry><entry>The setting's name, which uniquely identifies the setting within the connection. Each setting type has a name unique to that type, for example "ppp" or "wireless" or "wired".</entry></row>
diff --git a/man/nmcli.1.in b/man/nmcli.1.in
index f6df1b0af..335b65117 100644
--- a/man/nmcli.1.in
+++ b/man/nmcli.1.in
@@ -398,6 +398,8 @@ If <ID> is ambiguous, a keyword \fIid\fP, \fIuuid\fP, \fIpath\fP or
\fIapath\fP can be used.
.br
See \fBconnection show\fP above for the description of the <ID>-specifying keywords.
+.br
+If '--wait' option is not specified, the default timeout will be 10 seconds.
.TP
.B add COMMON_OPTIONS TYPE_SPECIFIC_OPTIONS IP_OPTIONS
.br
@@ -686,6 +688,8 @@ its name, UUID or D-Bus path. If <ID> is ambiguous, a keyword \fIid\fP,
\fIuuid\fP or \fIpath\fP can be used.
.br
See \fBconnection show\fP above for the description of the <ID>-specifying keywords.
+.br
+If '--wait' option is not specified, the default timeout will be 10 seconds.
.TP
.B reload
.br
@@ -730,14 +734,15 @@ will be activated. It will also consider connections that are not set to auto co
.br
If '--wait' option is not specified, the default timeout will be 90 seconds.
.TP
-.B disconnect <ifname>
+.B disconnect <ifname> ...
.br
Disconnect a device and prevent the device from automatically activating further
-connections without user/manual intervention.
+connections without user/manual intervention. Note that disconnecting software
+devices may mean that the devices will disappear.
.br
If '--wait' option is not specified, the default timeout will be 10 seconds.
.TP
-.B delete <ifname>
+.B delete <ifname> ...
.br
Delete a device. The command removes the interface from the system. Note that
this only works for software devices like bonds, bridges, teams, etc.
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 926dd6c39..6c09b21ff 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -48,6 +48,8 @@ libnm-core/crypto.c
libnm-core/crypto_gnutls.c
libnm-core/crypto_nss.c
libnm-core/nm-connection.c
+libnm-core/nm-keyfile-reader.c
+libnm-core/nm-keyfile-writer.c
libnm-core/nm-setting-8021x.c
libnm-core/nm-setting-adsl.c
libnm-core/nm-setting-bluetooth.c
diff --git a/po/pl.po b/po/pl.po
index c0be7c575..e76babf7c 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -9,13 +9,12 @@
# Tomasz Dominikowski <dominikowski@gmail.com>, 2008-2010.
# Piotr Drąg <piotrdrag@gmail.com>, 2009-2015.
# Aviary.pl <gnomepl@aviary.pl>, 2007-2015.
-#: ../src/nm-iface-helper.c:307
msgid ""
msgstr ""
"Project-Id-Version: NetworkManager\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-01-25 20:28+0100\n"
-"PO-Revision-Date: 2015-01-25 20:29+0100\n"
+"POT-Creation-Date: 2015-07-06 00:19+0200\n"
+"PO-Revision-Date: 2015-07-06 00:20+0200\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n"
@@ -112,9 +111,9 @@ msgstr "Błąd: zainicjowanie agenta polkit się nie powiodło: %s"
msgid "nmcli successfully registered as a polkit agent.\n"
msgstr "Pomyślnie zarejestrowano program nmcli jako agenta polkit.\n"
-#: ../clients/cli/agent.c:209 ../clients/cli/connections.c:8779
-#: ../clients/cli/connections.c:8805 ../clients/cli/connections.c:8943
-#: ../clients/cli/devices.c:2832 ../clients/cli/general.c:325
+#: ../clients/cli/agent.c:209 ../clients/cli/connections.c:8928
+#: ../clients/cli/connections.c:8954 ../clients/cli/connections.c:9095
+#: ../clients/cli/devices.c:2961 ../clients/cli/general.c:325
#: ../clients/cli/general.c:463
#, c-format
msgid "Error: NetworkManager is not running."
@@ -127,7 +126,7 @@ msgstr "Błąd: polecenie \"agent\" \"%s\" jest nieprawidłowe."
#: ../clients/cli/common.c:40 ../clients/cli/common.c:53
#: ../clients/cli/common.c:61 ../clients/cli/common.c:73
-#: ../clients/cli/connections.c:172 ../clients/cli/connections.c:194
+#: ../clients/cli/connections.c:173 ../clients/cli/connections.c:195
msgid "GROUP"
msgstr "GRUPA"
@@ -139,7 +138,7 @@ msgstr "ADRES"
#. 1
#. 2
#: ../clients/cli/common.c:42 ../clients/cli/common.c:63
-#: ../clients/cli/connections.c:197
+#: ../clients/cli/connections.c:198
msgid "GATEWAY"
msgstr "BRAMA"
@@ -241,7 +240,7 @@ msgstr "łączenie (uruchamianie drugorzędnych połączeń)"
msgid "connected"
msgstr "połączono"
-#: ../clients/cli/common.c:516 ../clients/cli/connections.c:538
+#: ../clients/cli/common.c:516 ../clients/cli/connections.c:540
msgid "deactivating"
msgstr "deaktywowanie"
@@ -249,13 +248,14 @@ msgstr "deaktywowanie"
msgid "connection failed"
msgstr "połączenie się nie powiodło"
-#: ../clients/cli/common.c:520 ../clients/cli/connections.c:543
-#: ../clients/cli/connections.c:566 ../clients/cli/connections.c:1705
-#: ../clients/cli/devices.c:878 ../clients/cli/general.c:263
+#: ../clients/cli/common.c:520 ../clients/cli/connections.c:545
+#: ../clients/cli/connections.c:568 ../clients/cli/connections.c:1708
+#: ../clients/cli/devices.c:886 ../clients/cli/devices.c:927
+#: ../clients/cli/devices.c:929 ../clients/cli/general.c:263
#: ../clients/cli/general.c:281 ../clients/cli/general.c:411
-#: ../clients/cli/general.c:427 ../clients/cli/settings.c:717
-#: ../clients/cli/settings.c:779 ../clients/cli/settings.c:1072
-#: ../clients/cli/utils.c:1145 ../src/main.c:309 ../src/main.c:337
+#: ../clients/cli/general.c:427 ../clients/cli/settings.c:725
+#: ../clients/cli/settings.c:810 ../clients/cli/settings.c:1111
+#: ../clients/cli/utils.c:1164 ../src/main.c:363 ../src/main.c:413
msgid "unknown"
msgstr "nieznane"
@@ -263,7 +263,7 @@ msgstr "nieznane"
msgid "No reason given"
msgstr "Nie podano przyczyny"
-#: ../clients/cli/common.c:532 ../clients/cli/connections.c:2705
+#: ../clients/cli/common.c:532 ../clients/cli/connections.c:2721
#, c-format
msgid "Unknown error"
msgstr "Nieznany błąd"
@@ -504,28 +504,40 @@ msgstr "Modem jest teraz gotowy i dostępny"
msgid "SIM PIN was incorrect"
msgstr "Kod PIN karty SIM był niepoprawny"
+#: ../clients/cli/common.c:709
+msgid "New connection activation was enqueued"
+msgstr "Dodano aktywację nowego połączenia do kolejki"
+
+#: ../clients/cli/common.c:712
+msgid "The device's parent changed"
+msgstr "Zmieniono urządzenie nadrzędne urządzenia"
+
+#: ../clients/cli/common.c:715
+msgid "The device parent's management changed"
+msgstr "Zmieniono zarządzanie urządzenia nadrzędnego urządzenia"
+
#. TRANSLATORS: Unknown reason for a device state change (NMDeviceStateReason)
-#: ../clients/cli/common.c:710 ../clients/cli/devices.c:619
-#: ../libnm-glib/nm-device.c:1813 ../libnm/nm-device.c:1635
+#: ../clients/cli/common.c:719 ../clients/cli/devices.c:625
+#: ../libnm-glib/nm-device.c:1813 ../libnm/nm-device.c:1638
msgid "Unknown"
msgstr "Nieznane"
-#: ../clients/cli/common.c:752
+#: ../clients/cli/common.c:761
#, c-format
msgid "invalid priority map '%s'"
msgstr "nieprawidłowa mapa priorytetów \"%s\""
-#: ../clients/cli/common.c:759 ../clients/cli/common.c:765
+#: ../clients/cli/common.c:768 ../clients/cli/common.c:774
#, c-format
msgid "priority '%s' is not valid (<0-%ld>)"
msgstr "priorytet \"%s\" jest nieprawidłowy (<0-%ld>)"
-#: ../clients/cli/common.c:832
+#: ../clients/cli/common.c:841
#, c-format
msgid "'%s' is not a valid team configuration or file name."
msgstr "\"%s\" nie jest prawidłową konfiguracją zespołu lub nazwą pliku."
-#: ../clients/cli/common.c:933
+#: ../clients/cli/common.c:942
#, c-format
msgid ""
"Warning: password for '%s' not given in 'passwd-file' and nmcli cannot ask "
@@ -572,20 +584,24 @@ msgstr "\"Master\" mostku: "
msgid "Connection (name, UUID, or path): "
msgstr "Połączenie (nazwa, UUID lub ścieżka): "
+#: ../clients/cli/connections.c:53
+msgid "Connection(s) (name, UUID, or path): "
+msgstr "Połączenia (nazwa, UUID lub ścieżka): "
+
#. 0
-#: ../clients/cli/connections.c:60 ../clients/cli/connections.c:173
-#: ../clients/cli/devices.c:57 ../clients/cli/devices.c:86
-#: ../clients/cli/devices.c:96 ../clients/cli/devices.c:107
-#: ../clients/cli/devices.c:116 ../clients/cli/devices.c:131
-#: ../clients/cli/devices.c:144 ../clients/cli/devices.c:170
-#: ../clients/cli/devices.c:185 ../clients/cli/devices.c:194
-#: ../clients/cli/devices.c:204
+#: ../clients/cli/connections.c:61 ../clients/cli/connections.c:174
+#: ../clients/cli/devices.c:58 ../clients/cli/devices.c:90
+#: ../clients/cli/devices.c:100 ../clients/cli/devices.c:111
+#: ../clients/cli/devices.c:120 ../clients/cli/devices.c:137
+#: ../clients/cli/devices.c:150 ../clients/cli/devices.c:176
+#: ../clients/cli/devices.c:191 ../clients/cli/devices.c:200
+#: ../clients/cli/devices.c:210
msgid "NAME"
msgstr "NAZWA"
#. 0
#. 1
-#: ../clients/cli/connections.c:61 ../clients/cli/connections.c:174
+#: ../clients/cli/connections.c:62 ../clients/cli/connections.c:175
msgid "UUID"
msgstr "UUID"
@@ -593,35 +609,35 @@ msgstr "UUID"
#. 0
#. 1
#. 2
-#: ../clients/cli/connections.c:62 ../clients/cli/connections.c:195
-#: ../clients/cli/devices.c:43 ../clients/cli/devices.c:59
-#: ../clients/cli/devices.c:173
+#: ../clients/cli/connections.c:63 ../clients/cli/connections.c:196
+#: ../clients/cli/devices.c:44 ../clients/cli/devices.c:60
+#: ../clients/cli/devices.c:179
msgid "TYPE"
msgstr "TYP"
#. 2
-#: ../clients/cli/connections.c:63
+#: ../clients/cli/connections.c:64
msgid "TIMESTAMP"
msgstr "OKRES-CZASU"
#. 3
-#: ../clients/cli/connections.c:64
+#: ../clients/cli/connections.c:65
msgid "TIMESTAMP-REAL"
msgstr "RZECZYWISTY-OKRES-CZASU"
#. 4
-#. 15
-#: ../clients/cli/connections.c:65 ../clients/cli/devices.c:73
+#. 16
+#: ../clients/cli/connections.c:66 ../clients/cli/devices.c:75
msgid "AUTOCONNECT"
msgstr "ŁĄCZENIE-AUTOMATYCZNE"
#. 5
-#: ../clients/cli/connections.c:66
+#: ../clients/cli/connections.c:67
msgid "AUTOCONNECT-PRIORITY"
msgstr "PRIORYTET-AUTOMATYCZNEGO-ŁĄCZENIA"
#. 6
-#: ../clients/cli/connections.c:67
+#: ../clients/cli/connections.c:68
msgid "READONLY"
msgstr "TYLKO-DO-ODCZYTU"
@@ -630,17 +646,17 @@ msgstr "TYLKO-DO-ODCZYTU"
#. 2
#. 15
#. 5
-#: ../clients/cli/connections.c:68 ../clients/cli/connections.c:181
-#: ../clients/cli/devices.c:45 ../clients/cli/devices.c:160
-#: ../clients/cli/devices.c:176
+#: ../clients/cli/connections.c:69 ../clients/cli/connections.c:182
+#: ../clients/cli/devices.c:46 ../clients/cli/devices.c:166
+#: ../clients/cli/devices.c:182
msgid "DBUS-PATH"
msgstr "ŚCIEŻKA-DBUS"
#. 8
#. 13
#. 4
-#: ../clients/cli/connections.c:69 ../clients/cli/devices.c:158
-#: ../clients/cli/devices.c:175
+#: ../clients/cli/connections.c:70 ../clients/cli/devices.c:164
+#: ../clients/cli/devices.c:181
msgid "ACTIVE"
msgstr "AKTYWNOŚĆ"
@@ -648,124 +664,124 @@ msgstr "AKTYWNOŚĆ"
#. 0
#. 12
#. 3
-#: ../clients/cli/connections.c:70 ../clients/cli/devices.c:42
-#: ../clients/cli/devices.c:58 ../clients/cli/devices.c:157
-#: ../clients/cli/devices.c:174
+#: ../clients/cli/connections.c:71 ../clients/cli/devices.c:43
+#: ../clients/cli/devices.c:59 ../clients/cli/devices.c:163
+#: ../clients/cli/devices.c:180
msgid "DEVICE"
msgstr "URZĄDZENIE"
#. 10
#. 3
#. 1
-#. 9
+#. 10
#. 1
-#: ../clients/cli/connections.c:71 ../clients/cli/connections.c:176
-#: ../clients/cli/devices.c:44 ../clients/cli/devices.c:67
+#: ../clients/cli/connections.c:72 ../clients/cli/connections.c:177
+#: ../clients/cli/devices.c:45 ../clients/cli/devices.c:69
#: ../clients/cli/general.c:37
msgid "STATE"
msgstr "STAN"
#. 11
-#: ../clients/cli/connections.c:72
+#: ../clients/cli/connections.c:73
msgid "ACTIVE-PATH"
msgstr "AKTYWNA-ŚCIEŻKA"
#. 2
-#: ../clients/cli/connections.c:175
+#: ../clients/cli/connections.c:176
msgid "DEVICES"
msgstr "URZĄDZENIA"
#. 4
-#: ../clients/cli/connections.c:177
+#: ../clients/cli/connections.c:178
msgid "DEFAULT"
msgstr "DOMYŚLNE"
#. 5
-#: ../clients/cli/connections.c:178
+#: ../clients/cli/connections.c:179
msgid "DEFAULT6"
msgstr "DOMYŚLNE6"
#. 6
-#: ../clients/cli/connections.c:179
+#: ../clients/cli/connections.c:180
msgid "SPEC-OBJECT"
msgstr "KONKRETNY-OBIEKT"
#. 7
#. 4
#. Ask for optional 'vpn' arguments.
-#: ../clients/cli/connections.c:180 ../clients/cli/connections.c:218
-#: ../clients/cli/connections.c:3816 ../clients/tui/nm-editor-utils.c:234
+#: ../clients/cli/connections.c:181 ../clients/cli/connections.c:219
+#: ../clients/cli/connections.c:3832 ../clients/tui/nm-editor-utils.c:234
#: ../clients/tui/nmt-connect-connection-list.c:406
msgid "VPN"
msgstr "VPN"
#. 9
#. 5
-#. 19
-#: ../clients/cli/connections.c:182 ../clients/cli/devices.c:48
-#: ../clients/cli/devices.c:77
+#. 21
+#: ../clients/cli/connections.c:183 ../clients/cli/devices.c:49
+#: ../clients/cli/devices.c:80
msgid "CON-PATH"
msgstr "ŚCIEŻKA-POŁĄCZENIA"
#. 10
-#: ../clients/cli/connections.c:183
+#: ../clients/cli/connections.c:184
msgid "ZONE"
msgstr "STREFA"
#. 11
-#: ../clients/cli/connections.c:184
+#: ../clients/cli/connections.c:185
msgid "MASTER-PATH"
msgstr "GŁÓWNA-ŚCIEŻKA"
#. 1
-#: ../clients/cli/connections.c:196
+#: ../clients/cli/connections.c:197
msgid "USERNAME"
msgstr "NAZWA-UŻYTKOWNIKA"
#. 3
-#: ../clients/cli/connections.c:198
+#: ../clients/cli/connections.c:199
msgid "BANNER"
msgstr "BANER"
#. 4
-#: ../clients/cli/connections.c:199
+#: ../clients/cli/connections.c:200
msgid "VPN-STATE"
msgstr "STAN-VPN"
#. 5
-#: ../clients/cli/connections.c:200
+#: ../clients/cli/connections.c:201
msgid "CFG"
msgstr "KONFIGURACJA"
-#: ../clients/cli/connections.c:213 ../clients/cli/devices.c:219
+#: ../clients/cli/connections.c:214 ../clients/cli/devices.c:225
msgid "GENERAL"
msgstr "OGÓLNE"
#. 0
#. 6
-#: ../clients/cli/connections.c:214 ../clients/cli/devices.c:226
+#: ../clients/cli/connections.c:215 ../clients/cli/devices.c:232
msgid "IP4"
msgstr "IP4"
#. 1
#. 7
-#: ../clients/cli/connections.c:215 ../clients/cli/devices.c:227
+#: ../clients/cli/connections.c:216 ../clients/cli/devices.c:233
msgid "DHCP4"
msgstr "DHCP4"
#. 2
#. 8
-#: ../clients/cli/connections.c:216 ../clients/cli/devices.c:228
+#: ../clients/cli/connections.c:217 ../clients/cli/devices.c:234
msgid "IP6"
msgstr "IP6"
#. 3
#. 9
-#: ../clients/cli/connections.c:217 ../clients/cli/devices.c:229
+#: ../clients/cli/connections.c:218 ../clients/cli/devices.c:235
msgid "DHCP6"
msgstr "DHCP6"
-#: ../clients/cli/connections.c:251
+#: ../clients/cli/connections.c:253
#, c-format
msgid ""
"Usage: nmcli connection { COMMAND | help }\n"
@@ -828,7 +844,7 @@ msgstr ""
" load <nazwa_pliku> [ <nazwa_pliku>... ]\n"
"\n"
-#: ../clients/cli/connections.c:272
+#: ../clients/cli/connections.c:274
#, c-format
msgid ""
"Usage: nmcli connection show { ARGUMENTS | help }\n"
@@ -871,7 +887,7 @@ msgstr ""
"więcej informacji. Podanie opcji --active spowoduje uwzględnienie tylko\n"
"aktywnych profili. Opcja --show-secrets ujawni także powiązane hasła.\n"
-#: ../clients/cli/connections.c:293
+#: ../clients/cli/connections.c:295
#, c-format
msgid ""
"Usage: nmcli connection up { ARGUMENTS | help }\n"
@@ -915,7 +931,7 @@ msgstr ""
"passwd-file - plik z hasłami wymaganymi do aktywowania połączenia\n"
"\n"
-#: ../clients/cli/connections.c:314
+#: ../clients/cli/connections.c:316
#, c-format
msgid ""
"Usage: nmcli connection down { ARGUMENTS | help }\n"
@@ -937,7 +953,7 @@ msgstr ""
"swojej nazwie, UUID lub ścieżce D-Bus.\n"
"\n"
-#: ../clients/cli/connections.c:326
+#: ../clients/cli/connections.c:328
#, c-format
msgid ""
"Usage: nmcli connection add { ARGUMENTS | help }\n"
@@ -1141,7 +1157,7 @@ msgstr ""
" [ip4 <adres IPv4>] [gw4 <brama IPv4>]\n"
" [ip6 <adres IPv6>] [gw6 <brama IPv6>]\n"
-#: ../clients/cli/connections.c:406
+#: ../clients/cli/connections.c:408
#, c-format
msgid ""
"Usage: nmcli connection modify { ARGUMENTS | help }\n"
@@ -1188,7 +1204,7 @@ msgstr ""
"nmcli con mod bond0 -bond.options downdelay\n"
"\n"
-#: ../clients/cli/connections.c:429
+#: ../clients/cli/connections.c:431
#, c-format
msgid ""
"Usage: nmcli connection edit { ARGUMENTS | help }\n"
@@ -1216,7 +1232,7 @@ msgstr ""
"Dodaje nowy profil połączenia w interaktywnym edytorze.\n"
"\n"
-#: ../clients/cli/connections.c:444
+#: ../clients/cli/connections.c:446
#, c-format
msgid ""
"Usage: nmcli connection delete { ARGUMENTS | help }\n"
@@ -1235,7 +1251,7 @@ msgstr ""
"Profil jest identyfikowany po swojej nazwie, UUID lub ścieżce D-Bus.\n"
"\n"
-#: ../clients/cli/connections.c:455
+#: ../clients/cli/connections.c:457
#, c-format
msgid ""
"Usage: nmcli connection reload { help }\n"
@@ -1248,7 +1264,7 @@ msgstr ""
"Wczytuje ponownie wszystkie pliki połączeń z dysku.\n"
"\n"
-#: ../clients/cli/connections.c:463
+#: ../clients/cli/connections.c:465
#, c-format
msgid ""
"Usage: nmcli connection load { ARGUMENTS | help }\n"
@@ -1270,142 +1286,144 @@ msgstr ""
"usługa NetworkManager zna jego najnowszy stan.\n"
"\n"
-#: ../clients/cli/connections.c:534
+#: ../clients/cli/connections.c:536
msgid "activating"
msgstr "aktywowanie"
-#: ../clients/cli/connections.c:536
+#: ../clients/cli/connections.c:538
msgid "activated"
msgstr "aktywowano"
-#: ../clients/cli/connections.c:540
+#: ../clients/cli/connections.c:542
msgid "deactivated"
msgstr "deaktywowano"
-#: ../clients/cli/connections.c:552
+#: ../clients/cli/connections.c:554
msgid "VPN connecting (prepare)"
msgstr "Łączenie z VPN (przygotowanie)"
-#: ../clients/cli/connections.c:554
+#: ../clients/cli/connections.c:556
msgid "VPN connecting (need authentication)"
msgstr "Łączenie z VPN (wymaga uwierzytelnienia)"
-#: ../clients/cli/connections.c:556
+#: ../clients/cli/connections.c:558
msgid "VPN connecting"
msgstr "Łączenie z VPN"
-#: ../clients/cli/connections.c:558
+#: ../clients/cli/connections.c:560
msgid "VPN connecting (getting IP configuration)"
msgstr "Łączenie z VPN (pobieranie konfiguracji adresu IP)"
-#: ../clients/cli/connections.c:560
+#: ../clients/cli/connections.c:562
msgid "VPN connected"
msgstr "Połączono z VPN"
-#: ../clients/cli/connections.c:562
+#: ../clients/cli/connections.c:564
msgid "VPN connection failed"
msgstr "Połączenie z VPN się nie powiodło"
-#: ../clients/cli/connections.c:564
+#: ../clients/cli/connections.c:566
msgid "VPN disconnected"
msgstr "Rozłączono z VPN"
-#: ../clients/cli/connections.c:634
+#: ../clients/cli/connections.c:636
#, c-format
msgid "Error updating secrets for %s: %s\n"
msgstr "Błąd podczas aktualizowania haseł dla %s: %s\n"
-#: ../clients/cli/connections.c:654
+#: ../clients/cli/connections.c:656
msgid "Connection profile details"
msgstr "Szczegóły profilu połączenia"
-#: ../clients/cli/connections.c:666 ../clients/cli/connections.c:1075
+#: ../clients/cli/connections.c:668 ../clients/cli/connections.c:1077
#, c-format
msgid "Error: 'connection show': %s"
msgstr "Błąd: \"connection show\": %s"
-#: ../clients/cli/connections.c:812
+#: ../clients/cli/connections.c:814
msgid "never"
msgstr "nigdy"
#. "CAPABILITIES"
-#: ../clients/cli/connections.c:813 ../clients/cli/connections.c:815
-#: ../clients/cli/connections.c:817 ../clients/cli/connections.c:849
-#: ../clients/cli/connections.c:916 ../clients/cli/connections.c:917
-#: ../clients/cli/connections.c:919 ../clients/cli/connections.c:3111
-#: ../clients/cli/connections.c:6949 ../clients/cli/connections.c:6950
-#: ../clients/cli/devices.c:589 ../clients/cli/devices.c:639
-#: ../clients/cli/devices.c:846 ../clients/cli/devices.c:847
-#: ../clients/cli/devices.c:848 ../clients/cli/devices.c:849
-#: ../clients/cli/devices.c:882 ../clients/cli/devices.c:884
-#: ../clients/cli/devices.c:912 ../clients/cli/devices.c:913
-#: ../clients/cli/devices.c:914 ../clients/cli/devices.c:915
-#: ../clients/cli/devices.c:916 ../clients/cli/devices.c:917
-#: ../clients/cli/devices.c:918 ../clients/cli/general.c:421
+#: ../clients/cli/connections.c:815 ../clients/cli/connections.c:817
+#: ../clients/cli/connections.c:819 ../clients/cli/connections.c:851
+#: ../clients/cli/connections.c:918 ../clients/cli/connections.c:919
+#: ../clients/cli/connections.c:921 ../clients/cli/connections.c:3127
+#: ../clients/cli/connections.c:7084 ../clients/cli/connections.c:7085
+#: ../clients/cli/devices.c:595 ../clients/cli/devices.c:645
+#: ../clients/cli/devices.c:853 ../clients/cli/devices.c:854
+#: ../clients/cli/devices.c:855 ../clients/cli/devices.c:856
+#: ../clients/cli/devices.c:890 ../clients/cli/devices.c:892
+#: ../clients/cli/devices.c:920 ../clients/cli/devices.c:921
+#: ../clients/cli/devices.c:922 ../clients/cli/devices.c:923
+#: ../clients/cli/devices.c:924 ../clients/cli/devices.c:925
+#: ../clients/cli/devices.c:926 ../clients/cli/devices.c:928
+#: ../clients/cli/devices.c:930 ../clients/cli/general.c:421
msgid "yes"
msgstr "tak"
-#: ../clients/cli/connections.c:813 ../clients/cli/connections.c:815
-#: ../clients/cli/connections.c:817 ../clients/cli/connections.c:916
-#: ../clients/cli/connections.c:917 ../clients/cli/connections.c:919
-#: ../clients/cli/connections.c:3112 ../clients/cli/connections.c:6949
-#: ../clients/cli/connections.c:6950 ../clients/cli/devices.c:589
-#: ../clients/cli/devices.c:639 ../clients/cli/devices.c:846
-#: ../clients/cli/devices.c:847 ../clients/cli/devices.c:848
-#: ../clients/cli/devices.c:849 ../clients/cli/devices.c:882
-#: ../clients/cli/devices.c:884 ../clients/cli/devices.c:912
-#: ../clients/cli/devices.c:913 ../clients/cli/devices.c:914
-#: ../clients/cli/devices.c:915 ../clients/cli/devices.c:916
-#: ../clients/cli/devices.c:917 ../clients/cli/devices.c:918
+#: ../clients/cli/connections.c:815 ../clients/cli/connections.c:817
+#: ../clients/cli/connections.c:819 ../clients/cli/connections.c:918
+#: ../clients/cli/connections.c:919 ../clients/cli/connections.c:921
+#: ../clients/cli/connections.c:3128 ../clients/cli/connections.c:7084
+#: ../clients/cli/connections.c:7085 ../clients/cli/devices.c:595
+#: ../clients/cli/devices.c:645 ../clients/cli/devices.c:853
+#: ../clients/cli/devices.c:854 ../clients/cli/devices.c:855
+#: ../clients/cli/devices.c:856 ../clients/cli/devices.c:890
+#: ../clients/cli/devices.c:892 ../clients/cli/devices.c:920
+#: ../clients/cli/devices.c:921 ../clients/cli/devices.c:922
+#: ../clients/cli/devices.c:923 ../clients/cli/devices.c:924
+#: ../clients/cli/devices.c:925 ../clients/cli/devices.c:926
+#: ../clients/cli/devices.c:928 ../clients/cli/devices.c:930
#: ../clients/cli/general.c:423
msgid "no"
msgstr "nie"
-#: ../clients/cli/connections.c:1063
+#: ../clients/cli/connections.c:1065
msgid "Activate connection details"
msgstr "Szczegóły aktywowania połączenia"
-#: ../clients/cli/connections.c:1299
+#: ../clients/cli/connections.c:1301
#, c-format
msgid "invalid field '%s'; allowed fields: %s and %s, or %s,%s"
msgstr "nieprawidłowe pole \"%s\"; dozwolone pola: %s i %s, albo %s,%s"
-#: ../clients/cli/connections.c:1314 ../clients/cli/connections.c:1322
+#: ../clients/cli/connections.c:1316 ../clients/cli/connections.c:1324
#, c-format
msgid "'%s' has to be alone"
msgstr "\"%s\" musi być same"
#. Add headers
-#: ../clients/cli/connections.c:1377
+#: ../clients/cli/connections.c:1379
msgid "NetworkManager active profiles"
msgstr "Aktywne profile usługi NetworkManager"
-#: ../clients/cli/connections.c:1378
+#: ../clients/cli/connections.c:1380
msgid "NetworkManager connection profiles"
msgstr "Profile połączeń usługi NetworkManager"
-#: ../clients/cli/connections.c:1418 ../clients/cli/connections.c:2145
-#: ../clients/cli/connections.c:2167 ../clients/cli/connections.c:2176
-#: ../clients/cli/connections.c:2186 ../clients/cli/connections.c:2196
-#: ../clients/cli/connections.c:2346 ../clients/cli/connections.c:8499
-#: ../clients/cli/connections.c:8716 ../clients/cli/devices.c:1909
-#: ../clients/cli/devices.c:1917 ../clients/cli/devices.c:2233
-#: ../clients/cli/devices.c:2240 ../clients/cli/devices.c:2254
-#: ../clients/cli/devices.c:2261 ../clients/cli/devices.c:2278
-#: ../clients/cli/devices.c:2286 ../clients/cli/devices.c:2474
-#: ../clients/cli/devices.c:2570 ../clients/cli/devices.c:2577
+#: ../clients/cli/connections.c:1420 ../clients/cli/connections.c:2148
+#: ../clients/cli/connections.c:2170 ../clients/cli/connections.c:2179
+#: ../clients/cli/connections.c:2189 ../clients/cli/connections.c:2199
+#: ../clients/cli/connections.c:2361 ../clients/cli/connections.c:8652
+#: ../clients/cli/connections.c:8857 ../clients/cli/devices.c:2023
+#: ../clients/cli/devices.c:2031 ../clients/cli/devices.c:2353
+#: ../clients/cli/devices.c:2360 ../clients/cli/devices.c:2374
+#: ../clients/cli/devices.c:2381 ../clients/cli/devices.c:2398
+#: ../clients/cli/devices.c:2406 ../clients/cli/devices.c:2594
+#: ../clients/cli/devices.c:2696 ../clients/cli/devices.c:2703
#, c-format
msgid "Error: %s argument is missing."
msgstr "Błąd: brak parametru %s."
-#: ../clients/cli/connections.c:1433
+#: ../clients/cli/connections.c:1435
#, c-format
msgid "Error: %s - no such connection profile."
msgstr "Błąd: %s - nie ma takiego profilu połączenia."
-#: ../clients/cli/connections.c:1492 ../clients/cli/connections.c:2219
-#: ../clients/cli/connections.c:9016 ../clients/cli/devices.c:2453
-#: ../clients/cli/devices.c:2921 ../clients/cli/general.c:518
+#: ../clients/cli/connections.c:1494 ../clients/cli/connections.c:2222
+#: ../clients/cli/connections.c:9168 ../clients/cli/devices.c:2573
+#: ../clients/cli/devices.c:3050 ../clients/cli/general.c:518
#: ../clients/cli/general.c:567 ../clients/cli/general.c:584
#: ../clients/cli/general.c:623 ../clients/cli/general.c:637
#: ../clients/cli/general.c:755 ../clients/cli/general.c:802
@@ -1414,81 +1432,81 @@ msgstr "Błąd: %s - nie ma takiego profilu połączenia."
msgid "Error: %s."
msgstr "Błąd: %s."
-#: ../clients/cli/connections.c:1587
+#: ../clients/cli/connections.c:1590
#, c-format
msgid "no active connection on device '%s'"
msgstr "brak aktywnych połączeń na urządzeniu \"%s\""
-#: ../clients/cli/connections.c:1595
+#: ../clients/cli/connections.c:1598
msgid "no active connection or device"
msgstr "brak aktywnych połączeń na urządzeń"
-#: ../clients/cli/connections.c:1666
+#: ../clients/cli/connections.c:1669
#, c-format
msgid "device '%s' not compatible with connection '%s'"
msgstr "urządzenie \"%s\" nie jest zgodne z połączeniem \"%s\""
-#: ../clients/cli/connections.c:1669
+#: ../clients/cli/connections.c:1672
#, c-format
msgid "no device found for connection '%s'"
msgstr "nie odnaleziono urządzenia dla połączenia \"%s\""
-#: ../clients/cli/connections.c:1681
+#: ../clients/cli/connections.c:1684
msgid "unknown reason"
msgstr "nieznany powód"
-#: ../clients/cli/connections.c:1683 ../clients/cli/general.c:272
+#: ../clients/cli/connections.c:1686 ../clients/cli/general.c:272
msgid "none"
msgstr "brak"
-#: ../clients/cli/connections.c:1685
+#: ../clients/cli/connections.c:1688
msgid "the user was disconnected"
msgstr "użytkownik został rozłączony"
-#: ../clients/cli/connections.c:1687
+#: ../clients/cli/connections.c:1690
msgid "the base network connection was interrupted"
msgstr "podstawowe połączenie sieciowe zostało przerwane"
-#: ../clients/cli/connections.c:1689
+#: ../clients/cli/connections.c:1692
msgid "the VPN service stopped unexpectedly"
msgstr "usługa VPN została nieoczekiwanie zatrzymana"
-#: ../clients/cli/connections.c:1691
+#: ../clients/cli/connections.c:1694
msgid "the VPN service returned invalid configuration"
msgstr "usługa VPN zwróciła nieprawidłową konfigurację"
-#: ../clients/cli/connections.c:1693
+#: ../clients/cli/connections.c:1696
msgid "the connection attempt timed out"
msgstr "próba połączenia przekroczyła czas oczekiwania"
-#: ../clients/cli/connections.c:1695
+#: ../clients/cli/connections.c:1698
msgid "the VPN service did not start in time"
msgstr "usługa VPN nie została uruchomiona w czasie"
-#: ../clients/cli/connections.c:1697
+#: ../clients/cli/connections.c:1700
msgid "the VPN service failed to start"
msgstr "uruchomienie usługi VPN się nie powiodło"
-#: ../clients/cli/connections.c:1699
+#: ../clients/cli/connections.c:1702
msgid "no valid VPN secrets"
msgstr "brak prawidłowych haseł VPN"
-#: ../clients/cli/connections.c:1701
+#: ../clients/cli/connections.c:1704
msgid "invalid VPN secrets"
msgstr "nieprawidłowe hasła VPN"
-#: ../clients/cli/connections.c:1703
+#: ../clients/cli/connections.c:1706
msgid "the connection was removed"
msgstr "połączenie zostało usunięte"
-#: ../clients/cli/connections.c:1725 ../clients/cli/connections.c:1753
-#: ../clients/cli/connections.c:1914 ../clients/cli/connections.c:6840
+#: ../clients/cli/connections.c:1728 ../clients/cli/connections.c:1756
+#: ../clients/cli/connections.c:1917 ../clients/cli/connections.c:6975
#, c-format
msgid "Connection successfully activated (D-Bus active path: %s)\n"
msgstr ""
"Połączenie zostało pomyślnie aktywowane (ścieżka aktywacji D-Bus: %s)\n"
-#: ../clients/cli/connections.c:1732
+#: ../clients/cli/connections.c:1735
#, c-format
msgid ""
"Connection successfully activated (master waiting for slaves) (D-Bus active "
@@ -1497,176 +1515,181 @@ msgstr ""
"Połączenie zostało pomyślnie aktywowane (główne oczekujące na podrzędne) "
"(ścieżka aktywacji D-Bus: %s)\n"
-#: ../clients/cli/connections.c:1736 ../clients/cli/connections.c:1758
+#: ../clients/cli/connections.c:1739 ../clients/cli/connections.c:1761
#, c-format
msgid "Error: Connection activation failed."
msgstr "Błąd: aktywacja połączenia się nie powiodła."
-#: ../clients/cli/connections.c:1809
+#: ../clients/cli/connections.c:1812
#, c-format
msgid "VPN connection successfully activated (D-Bus active path: %s)\n"
msgstr ""
"Połączenie VPN zostało pomyślnie aktywowane (ścieżka aktywacji D-Bus: %s)\n"
-#: ../clients/cli/connections.c:1817
+#: ../clients/cli/connections.c:1820
#, c-format
msgid "Error: Connection activation failed: %s."
msgstr "Błąd: aktywacja połączenia się nie powiodła: %s."
-#: ../clients/cli/connections.c:1836 ../clients/cli/devices.c:1322
+#: ../clients/cli/connections.c:1839 ../clients/cli/devices.c:1334
#, c-format
msgid "Error: Timeout %d sec expired."
msgstr "Błąd: przekroczono czas oczekiwania o %d sekund."
-#: ../clients/cli/connections.c:1896
+#: ../clients/cli/connections.c:1899
#, c-format
msgid "Error: Connection activation failed: %s"
msgstr "Błąd: aktywacja połączenia się nie powiodła: %s"
-#: ../clients/cli/connections.c:1981
+#: ../clients/cli/connections.c:1984
#, c-format
msgid "failed to read passwd-file '%s': %s"
msgstr "odczytanie passwd-file \"%s\" się nie powiodło: %s"
-#: ../clients/cli/connections.c:1993
+#: ../clients/cli/connections.c:1996
#, c-format
msgid "missing colon in 'password' entry '%s'"
msgstr "brak dwukropka we wpisie \"password\" \"%s\""
-#: ../clients/cli/connections.c:2001
+#: ../clients/cli/connections.c:2004
#, c-format
msgid "missing dot in 'password' entry '%s'"
msgstr "brak kropki we wpisie \"password\" \"%s\""
-#: ../clients/cli/connections.c:2014
+#: ../clients/cli/connections.c:2017
#, c-format
msgid "invalid setting name in 'password' entry '%s'"
msgstr "nieprawidłowa nazwa ustawienia we wpisie \"password\" \"%s\""
-#: ../clients/cli/connections.c:2061 ../clients/cli/connections.c:2220
+#: ../clients/cli/connections.c:2064 ../clients/cli/connections.c:2223
msgid "unknown error"
msgstr "nieznany błąd"
-#: ../clients/cli/connections.c:2070
+#: ../clients/cli/connections.c:2073
#, c-format
msgid "unknown device '%s'."
msgstr "nieznane urządzenie \"%s\"."
-#: ../clients/cli/connections.c:2075
+#: ../clients/cli/connections.c:2078
msgid "neither a valid connection nor device given"
msgstr "nie podano prawidłowego połączenia ani urządzenia"
-#: ../clients/cli/connections.c:2158
+#: ../clients/cli/connections.c:2161
#, c-format
msgid "Error: Connection '%s' does not exist."
msgstr "Błąd: połączenie \"%s\" nie istnieje."
-#: ../clients/cli/connections.c:2204 ../clients/cli/devices.c:1221
-#: ../clients/cli/devices.c:1923 ../clients/cli/devices.c:2297
-#: ../clients/cli/devices.c:2583
+#: ../clients/cli/connections.c:2207 ../clients/cli/devices.c:1233
+#: ../clients/cli/devices.c:2037 ../clients/cli/devices.c:2417
+#: ../clients/cli/devices.c:2709
#, c-format
msgid "Unknown parameter: %s\n"
msgstr "Nieznany parametr: %s\n"
-#: ../clients/cli/connections.c:2228
+#: ../clients/cli/connections.c:2231
msgid "preparing"
msgstr "przygotowywanie"
-#: ../clients/cli/connections.c:2267
+#: ../clients/cli/connections.c:2255
+#, c-format
+msgid "Connection '%s' (%s) successfully deleted.\n"
+msgstr "Pomyślnie usunięto połączenie \"%s\" (%s).\n"
+
+#: ../clients/cli/connections.c:2271
#, c-format
msgid "Connection '%s' successfully deactivated (D-Bus active path: %s)\n"
msgstr ""
"Połączenie \"%s\" zostało pomyślnie deaktywowane (ścieżka aktywacji D-Bus: "
"%s)\n"
-#: ../clients/cli/connections.c:2325 ../clients/cli/connections.c:8697
-#: ../clients/cli/connections.c:8811
+#: ../clients/cli/connections.c:2343 ../clients/cli/connections.c:8843
+#: ../clients/cli/connections.c:8960
#, c-format
msgid "Error: No connection specified."
msgstr "Błąd: nie podano połączenia."
-#: ../clients/cli/connections.c:2356
+#: ../clients/cli/connections.c:2375
#, c-format
msgid "Error: '%s' is not an active connection.\n"
msgstr "Błąd: \"%s\" nie jest aktywnym połączeniem.\n"
-#: ../clients/cli/connections.c:2357
+#: ../clients/cli/connections.c:2376 ../clients/cli/connections.c:8872
#, c-format
msgid "Error: not all active connections found."
msgstr "Błąd: nie odnaleziono wszystkich aktywnych połączeń."
-#: ../clients/cli/connections.c:2366
+#: ../clients/cli/connections.c:2385
#, c-format
msgid "Error: no active connection provided."
msgstr "Błąd: nie podano aktywnego połączenia."
-#: ../clients/cli/connections.c:2684 ../clients/cli/utils.c:516
+#: ../clients/cli/connections.c:2700 ../clients/cli/utils.c:533
#, c-format
msgid "'%s' not among [%s]"
msgstr "\"%s\" nie jest w [%s]"
-#: ../clients/cli/connections.c:2763
+#: ../clients/cli/connections.c:2779
#, c-format
msgid "Error: '%s': '%s' is not a valid %s MAC address."
msgstr "Błąd: \"%s\": \"%s\" nie jest prawidłowym adresem MAC %s."
#. Ask for optional arguments
-#: ../clients/cli/connections.c:2764 ../clients/cli/connections.c:3226
-#: ../clients/tui/nm-editor-utils.c:164 ../libnm-core/nm-connection.c:1573
-#: ../libnm-glib/nm-device.c:1801 ../libnm/nm-device.c:1623
+#: ../clients/cli/connections.c:2780 ../clients/cli/connections.c:3242
+#: ../clients/tui/nm-editor-utils.c:164 ../libnm-core/nm-connection.c:1613
+#: ../libnm-glib/nm-device.c:1801 ../libnm/nm-device.c:1626
msgid "InfiniBand"
msgstr "InfiniBand"
-#: ../clients/cli/connections.c:2764 ../clients/tui/nm-editor-utils.c:147
-#: ../libnm-glib/nm-device.c:1789 ../libnm/nm-device.c:1611
+#: ../clients/cli/connections.c:2780 ../clients/tui/nm-editor-utils.c:147
+#: ../libnm-glib/nm-device.c:1789 ../libnm/nm-device.c:1614
msgid "Ethernet"
msgstr "Ethernet"
-#: ../clients/cli/connections.c:2784
+#: ../clients/cli/connections.c:2800
#, c-format
msgid "Error: 'mtu': '%s' is not a valid MTU."
msgstr "Błąd: \"mtu\": \"%s\" nie jest prawidłowym MTU."
-#: ../clients/cli/connections.c:2800
+#: ../clients/cli/connections.c:2816
#, c-format
msgid "Error: 'parent': '%s' is not a valid interface name."
msgstr "Błąd: \"parent\": \"%s\" nie jest prawidłową nazwą interfejsu."
-#: ../clients/cli/connections.c:2821
+#: ../clients/cli/connections.c:2837
#, c-format
msgid "Error: 'p-key': '%s' is not a valid InfiniBand P_KEY."
msgstr "Błąd: \"p-key\": \"%s\" nie jest prawidłowym P_KEY InfiniBand."
-#: ../clients/cli/connections.c:2866
+#: ../clients/cli/connections.c:2882
#, c-format
msgid "Error: '%s': '%s' is not a valid %s %s."
msgstr "Błąd: \"%s\": \"%s\" nie jest prawidłowym %s %s."
-#: ../clients/cli/connections.c:2879
+#: ../clients/cli/connections.c:2895
msgid "Wi-Fi mode"
msgstr "Tryb Wi-Fi"
-#: ../clients/cli/connections.c:2888
+#: ../clients/cli/connections.c:2904
msgid "InfiniBand transport mode"
msgstr "Tryb przesyłania InfiniBand"
-#: ../clients/cli/connections.c:2901
+#: ../clients/cli/connections.c:2917
#, c-format
msgid "Error: 'flags': '%s' is not valid; use <0-7>."
msgstr "Błąd: \"flags\": \"%s\" jest nieprawidłowe; należy użyć <0-7>."
-#: ../clients/cli/connections.c:2923
+#: ../clients/cli/connections.c:2939
#, c-format
msgid "Error: '%s': '%s' is not valid; %s "
msgstr "Błąd: \"%s\": \"%s\" jest nieprawidłowe; %s "
-#: ../clients/cli/connections.c:3102
+#: ../clients/cli/connections.c:3118
#, c-format
msgid "Error: '%s': '%s' is not valid; use <%u-%u>."
msgstr "Błąd: \"%s\": \"%s\" jest nieprawidłowe; należy użyć <%u-%u>."
#. Ask for optional arguments.
-#: ../clients/cli/connections.c:3158
+#: ../clients/cli/connections.c:3174
#, c-format
msgid "There is %d optional argument for '%s' connection type.\n"
msgid_plural "There are %d optional arguments for '%s' connection type.\n"
@@ -1674,7 +1697,7 @@ msgstr[0] "Istnieje %d opcjonalny parametr dla typu połączenia \"%s\".\n"
msgstr[1] "Istnieją %d opcjonalne parametry dla typu połączenia \"%s\".\n"
msgstr[2] "Istnieje %d opcjonalnych parametrów dla typu połączenia \"%s\".\n"
-#: ../clients/cli/connections.c:3161
+#: ../clients/cli/connections.c:3177
#, c-format
msgid "Do you want to provide it? %s"
msgid_plural "Do you want to provide them? %s"
@@ -1683,468 +1706,468 @@ msgstr[1] "Podać je? %s"
msgstr[2] "Podać je? %s"
#. Ask for optional arguments
-#: ../clients/cli/connections.c:3178
+#: ../clients/cli/connections.c:3194
msgid "ethernet"
msgstr "ethernet"
-#: ../clients/cli/connections.c:3183 ../clients/cli/connections.c:3231
-#: ../clients/cli/connections.c:3365 ../clients/cli/connections.c:3444
+#: ../clients/cli/connections.c:3199 ../clients/cli/connections.c:3247
+#: ../clients/cli/connections.c:3381 ../clients/cli/connections.c:3460
msgid "MTU [auto]: "
msgstr "MTU [auto]: "
-#: ../clients/cli/connections.c:3194 ../clients/cli/connections.c:3242
-#: ../clients/cli/connections.c:3337 ../clients/cli/connections.c:3376
-#: ../clients/cli/connections.c:3748
+#: ../clients/cli/connections.c:3210 ../clients/cli/connections.c:3258
+#: ../clients/cli/connections.c:3353 ../clients/cli/connections.c:3392
+#: ../clients/cli/connections.c:3764
msgid "MAC [none]: "
msgstr "MAC [none]: "
-#: ../clients/cli/connections.c:3205
+#: ../clients/cli/connections.c:3221
msgid "Cloned MAC [none]: "
msgstr "Sklonowany MAC [none]: "
-#: ../clients/cli/connections.c:3253
+#: ../clients/cli/connections.c:3269
#, c-format
msgid "Transport mode %s"
msgstr "Tryb przesyłania %s"
-#: ../clients/cli/connections.c:3266
+#: ../clients/cli/connections.c:3282
msgid "Parent interface [none]: "
msgstr "Interfejs nadrzędny [none]: "
-#: ../clients/cli/connections.c:3277
+#: ../clients/cli/connections.c:3293
msgid "P_KEY [none]: "
msgstr "P_KEY [none]: "
-#: ../clients/cli/connections.c:3287
+#: ../clients/cli/connections.c:3303
#, c-format
msgid "Error: 'p-key' is mandatory when 'parent' is specified.\n"
msgstr "Błąd: \"p-key\" jest wymagane, kiedy podano \"parent\".\n"
#. Ask for optional arguments
-#: ../clients/cli/connections.c:3304 ../clients/tui/nm-editor-utils.c:155
-#: ../libnm-glib/nm-device.c:1791 ../libnm/nm-device.c:1613
+#: ../clients/cli/connections.c:3320 ../clients/tui/nm-editor-utils.c:155
+#: ../libnm-glib/nm-device.c:1791 ../libnm/nm-device.c:1616
msgid "Wi-Fi"
msgstr "Wi-Fi"
-#: ../clients/cli/connections.c:3312
+#: ../clients/cli/connections.c:3328
#, c-format
msgid "Mode %s"
msgstr "Tryb %s"
#. Ask for optional 'wimax' arguments.
-#: ../clients/cli/connections.c:3332 ../libnm-glib/nm-device.c:1797
-#: ../libnm/nm-device.c:1619
+#: ../clients/cli/connections.c:3348 ../libnm-glib/nm-device.c:1797
+#: ../libnm/nm-device.c:1622
msgid "WiMAX"
msgstr "WiMAX"
#. Ask for optional 'pppoe' arguments.
-#: ../clients/cli/connections.c:3355
+#: ../clients/cli/connections.c:3371
msgid "PPPoE"
msgstr "PPPoE"
-#: ../clients/cli/connections.c:3359 ../clients/cli/connections.c:3397
+#: ../clients/cli/connections.c:3375 ../clients/cli/connections.c:3413
msgid "Password [none]: "
msgstr "Hasło [none]: "
-#: ../clients/cli/connections.c:3361
+#: ../clients/cli/connections.c:3377
msgid "Service [none]: "
msgstr "Usługa [none]: "
#. Ask for optional 'gsm' or 'cdma' arguments.
-#: ../clients/cli/connections.c:3391
+#: ../clients/cli/connections.c:3407
msgid "mobile broadband"
msgstr "komórkowe"
-#: ../clients/cli/connections.c:3395 ../clients/cli/connections.c:3820
+#: ../clients/cli/connections.c:3411 ../clients/cli/connections.c:3836
msgid "Username [none]: "
msgstr "Nazwa użytkownika [none]: "
#. Ask for optional 'bluetooth' arguments.
-#: ../clients/cli/connections.c:3410
+#: ../clients/cli/connections.c:3426
msgid "bluetooth"
msgstr "bluetooth"
-#: ../clients/cli/connections.c:3417
+#: ../clients/cli/connections.c:3433
#, c-format
msgid "Bluetooth type %s"
msgstr "Typ Bluetooth %s"
-#: ../clients/cli/connections.c:3423
+#: ../clients/cli/connections.c:3439
#, c-format
msgid "Error: 'bt-type': '%s' is not a valid bluetooth type.\n"
msgstr "Błąd: \"bt-type\": \"%s\" nie jest prawidłowym typem Bluetooth.\n"
#. Ask for optional 'vlan' arguments.
#. 13
-#: ../clients/cli/connections.c:3439 ../clients/cli/devices.c:233
+#: ../clients/cli/connections.c:3455 ../clients/cli/devices.c:239
#: ../clients/tui/nm-editor-utils.c:218 ../clients/tui/nmt-page-vlan.c:97
-#: ../libnm-core/nm-connection.c:1571 ../libnm-glib/nm-device.c:1809
-#: ../libnm-util/nm-connection.c:1614 ../libnm/nm-device.c:1631
+#: ../libnm-core/nm-connection.c:1611 ../libnm-glib/nm-device.c:1809
+#: ../libnm-util/nm-connection.c:1614 ../libnm/nm-device.c:1634
msgid "VLAN"
msgstr "VLAN"
-#: ../clients/cli/connections.c:3455
+#: ../clients/cli/connections.c:3471
msgid "VLAN flags (<0-7>) [none]: "
msgstr "Flagi VLAN= (<0-7>) [none]: "
-#: ../clients/cli/connections.c:3466
+#: ../clients/cli/connections.c:3482
msgid "Ingress priority maps [none]: "
msgstr "Wejściowe mapy priorytetów [none]: "
-#: ../clients/cli/connections.c:3477
+#: ../clients/cli/connections.c:3493
msgid "Egress priority maps [none]: "
msgstr "Wyjściowe mapy priorytetów [none]: "
-#: ../clients/cli/connections.c:3488
+#: ../clients/cli/connections.c:3504
msgid "Bonding mode [balance-rr]: "
msgstr "Tryb wiązania [balance-rr]: "
#. Ask for optional 'bond' arguments.
-#: ../clients/cli/connections.c:3504
+#: ../clients/cli/connections.c:3520
msgid "bond"
msgstr "wiązanie"
-#: ../clients/cli/connections.c:3526
+#: ../clients/cli/connections.c:3542
msgid "Bonding primary interface [none]: "
msgstr "Interfejs nadrzędny wiązania [none]: "
-#: ../clients/cli/connections.c:3529
+#: ../clients/cli/connections.c:3545
#, c-format
msgid "Error: 'primary': '%s' is not a valid interface name.\n"
msgstr "Błąd: \"primary\": \"%s\" nie jest prawidłową nazwą interfejsu.\n"
-#: ../clients/cli/connections.c:3537
+#: ../clients/cli/connections.c:3553
#, c-format
msgid "Bonding monitoring mode %s"
msgstr "Tryb monitorowania wiązania %s"
-#: ../clients/cli/connections.c:3543
+#: ../clients/cli/connections.c:3559
#, c-format
msgid "Error: '%s' is not a valid monitoring mode; use '%s' or '%s'.\n"
msgstr ""
"Błąd: \"%s\" nie jest prawidłowym trybem monitorowania; należy użyć \"%s\" "
"lub \"%s\".\n"
-#: ../clients/cli/connections.c:3552
+#: ../clients/cli/connections.c:3568
msgid "Bonding miimon [100]: "
msgstr "miimon wiązania [100]: "
-#: ../clients/cli/connections.c:3555
+#: ../clients/cli/connections.c:3571
#, c-format
msgid "Error: 'miimon': '%s' is not a valid number <0-%u>.\n"
msgstr "Błąd: \"miimon\": \"%s\" nie jest prawidłową liczbą <0-%u>.\n"
-#: ../clients/cli/connections.c:3563
+#: ../clients/cli/connections.c:3579
msgid "Bonding downdelay [0]: "
msgstr "downdelay wiązania [0]: "
-#: ../clients/cli/connections.c:3566
+#: ../clients/cli/connections.c:3582
#, c-format
msgid "Error: 'downdelay': '%s' is not a valid number <0-%u>.\n"
msgstr "Błąd: \"downdelay\": \"%s\" nie jest prawidłową liczbą <0-%u>.\n"
-#: ../clients/cli/connections.c:3574
+#: ../clients/cli/connections.c:3590
msgid "Bonding updelay [0]: "
msgstr "updelay wiązania [0]: "
-#: ../clients/cli/connections.c:3577
+#: ../clients/cli/connections.c:3593
#, c-format
msgid "Error: 'updelay': '%s' is not a valid number <0-%u>.\n"
msgstr "Błąd: \"updelay\": \"%s\" nie jest prawidłową liczbą <0-%u>.\n"
-#: ../clients/cli/connections.c:3586
+#: ../clients/cli/connections.c:3602
msgid "Bonding arp-interval [0]: "
msgstr "arp-interval wiązania [0]: "
-#: ../clients/cli/connections.c:3589
+#: ../clients/cli/connections.c:3605
#, c-format
msgid "Error: 'arp-interval': '%s' is not a valid number <0-%u>.\n"
msgstr "Błąd: \"arp-interval\": \"%s\" nie jest prawidłową liczbą <0-%u>.\n"
#. FIXME: verify the string
-#: ../clients/cli/connections.c:3597
+#: ../clients/cli/connections.c:3613
msgid "Bonding arp-ip-target [none]: "
msgstr "arp-ip-target wiązania [none]: "
-#: ../clients/cli/connections.c:3604
+#: ../clients/cli/connections.c:3620
msgid "LACP rate ('slow' or 'fast') [slow]: "
msgstr "Prędkość LACP (\"slow\" lub \"fast\") [slow]: "
-#: ../clients/cli/connections.c:3610
+#: ../clients/cli/connections.c:3626
#, c-format
msgid "Error: 'lacp_rate': '%s' is invalid ('slow' or 'fast').\n"
msgstr ""
"Błąd: \"lacp_rate\": \"%s\" jest nieprawidłowe (\"slow\" lub \"fast\").\n"
-#: ../clients/cli/connections.c:3633
+#: ../clients/cli/connections.c:3649
msgid "Team JSON configuration [none]: "
msgstr "Konfiguracja JSON zespołu [none]: "
-#: ../clients/cli/connections.c:3650
+#: ../clients/cli/connections.c:3666
msgid "team"
msgstr "zespół"
-#: ../clients/cli/connections.c:3656
+#: ../clients/cli/connections.c:3672
msgid "team-slave"
msgstr "podrzędny-zespołu"
#. Ask for optional 'bridge' arguments.
-#: ../clients/cli/connections.c:3668
+#: ../clients/cli/connections.c:3684
msgid "bridge"
msgstr "mostek"
-#: ../clients/cli/connections.c:3674
+#: ../clients/cli/connections.c:3690
#, c-format
msgid "Enable STP %s"
msgstr "Włączenie STP %s"
-#: ../clients/cli/connections.c:3679
+#: ../clients/cli/connections.c:3695
#, c-format
msgid "Error: 'stp': %s.\n"
msgstr "Błąd: \"stp\": %s.\n"
-#: ../clients/cli/connections.c:3687
+#: ../clients/cli/connections.c:3703
msgid "STP priority [32768]: "
msgstr "Priorytet STP [32768]: "
-#: ../clients/cli/connections.c:3691
+#: ../clients/cli/connections.c:3707
#, c-format
msgid "Error: 'priority': '%s' is not a valid number <0-%d>.\n"
msgstr "Błąd: \"priority\": \"%s\" nie jest prawidłową liczbą <0-%d>.\n"
-#: ../clients/cli/connections.c:3699
+#: ../clients/cli/connections.c:3715
msgid "Forward delay [15]: "
msgstr "Forward-delay [15]: "
-#: ../clients/cli/connections.c:3703
+#: ../clients/cli/connections.c:3719
#, c-format
msgid "Error: 'forward-delay': '%s' is not a valid number <2-30>.\n"
msgstr "Błąd: \"forward-delay\": \"%s\" nie jest prawidłową liczbą <2-30>.\n"
-#: ../clients/cli/connections.c:3712
+#: ../clients/cli/connections.c:3728
msgid "Hello time [2]: "
msgstr "Hello-time [2]: "
-#: ../clients/cli/connections.c:3716
+#: ../clients/cli/connections.c:3732
#, c-format
msgid "Error: 'hello-time': '%s' is not a valid number <1-10>.\n"
msgstr "Błąd: \"hello-time\": \"%s\" nie jest prawidłową liczbą <1-10>.\n"
-#: ../clients/cli/connections.c:3724
+#: ../clients/cli/connections.c:3740
msgid "Max age [20]: "
msgstr "Max-age [20]: "
-#: ../clients/cli/connections.c:3728
+#: ../clients/cli/connections.c:3744
#, c-format
msgid "Error: 'max-age': '%s' is not a valid number <6-40>.\n"
msgstr "Błąd: \"max-age\": \"%s\" nie jest prawidłową liczbą <6-40>.\n"
-#: ../clients/cli/connections.c:3736
+#: ../clients/cli/connections.c:3752
msgid "MAC address ageing time [300]: "
msgstr "Czas starzenia adresu MAC [300]: "
-#: ../clients/cli/connections.c:3740
+#: ../clients/cli/connections.c:3756
#, c-format
msgid "Error: 'ageing-time': '%s' is not a valid number <0-1000000>.\n"
msgstr ""
"Błąd: \"ageing-time\": \"%s\" nie jest prawidłową liczbą <0-1000000>.\n"
#. Ask for optional 'bridge-slave' arguments.
-#: ../clients/cli/connections.c:3767
+#: ../clients/cli/connections.c:3783
msgid "bridge-slave"
msgstr "podrzędny-mostku"
-#: ../clients/cli/connections.c:3772
+#: ../clients/cli/connections.c:3788
msgid "Bridge port priority [32]: "
msgstr "Priorytet portu mostku [32]: "
-#: ../clients/cli/connections.c:3785
+#: ../clients/cli/connections.c:3801
msgid "Bridge port STP path cost [100]: "
msgstr "Koszt ścieżki STP portu mostku [100]: "
-#: ../clients/cli/connections.c:3799
+#: ../clients/cli/connections.c:3815
#, c-format
msgid "Hairpin %s"
msgstr "Hairpin %s"
-#: ../clients/cli/connections.c:3804
+#: ../clients/cli/connections.c:3820
#, c-format
msgid "Error: 'hairpin': %s.\n"
msgstr "Błąd: \"hairpin\": %s.\n"
#. Ask for optional 'olpc' arguments.
-#: ../clients/cli/connections.c:3831 ../libnm-glib/nm-device.c:1795
-#: ../libnm/nm-device.c:1617
+#: ../clients/cli/connections.c:3847 ../libnm-glib/nm-device.c:1795
+#: ../libnm/nm-device.c:1620
msgid "OLPC Mesh"
msgstr "Kratowe OLPC"
-#: ../clients/cli/connections.c:3836
+#: ../clients/cli/connections.c:3852
msgid "OLPC Mesh channel [1]: "
msgstr "Kanał sieci kratowej OLPC [1]: "
-#: ../clients/cli/connections.c:3839
+#: ../clients/cli/connections.c:3855
#, c-format
msgid "Error: 'channel': '%s' is not a valid number <1-13>.\n"
msgstr "Błąd: \"channel\": \"%s\" nie jest prawidłową liczbą <1-13>.\n"
-#: ../clients/cli/connections.c:3847
+#: ../clients/cli/connections.c:3863
msgid "DHCP anycast MAC address [none]: "
msgstr "Adres MAC \"anycast\" DHCP [none]: "
-#: ../clients/cli/connections.c:3889
+#: ../clients/cli/connections.c:3905
msgid "IPv4 address (IP[/plen]) [none]: "
msgstr "Adres IPv4 (IP[/plen]) [none]: "
-#: ../clients/cli/connections.c:3891
+#: ../clients/cli/connections.c:3907
msgid "IPv6 address (IP[/plen]) [none]: "
msgstr "Adres IPv6 (IP[/plen]) [none]: "
-#: ../clients/cli/connections.c:3905
+#: ../clients/cli/connections.c:3921
#, c-format
msgid " Address successfully added: %s\n"
msgstr " Pomyślnie dodano adres: %s\n"
-#: ../clients/cli/connections.c:3907
+#: ../clients/cli/connections.c:3923
#, c-format
msgid " Warning: address already present: %s\n"
msgstr " Ostrzeżenie: adres jest już obecny: %s\n"
-#: ../clients/cli/connections.c:3909
+#: ../clients/cli/connections.c:3925
#, c-format
msgid " Warning: ignoring garbage at the end: '%s'\n"
msgstr " Ostrzeżenie: ignorowanie śmieci na końcu: \"%s\"\n"
-#: ../clients/cli/connections.c:3911 ../clients/cli/connections.c:4791
-#: ../clients/cli/connections.c:4852 ../clients/cli/connections.c:5253
-#: ../clients/cli/connections.c:5286
+#: ../clients/cli/connections.c:3927 ../clients/cli/connections.c:4807
+#: ../clients/cli/connections.c:4868 ../clients/cli/connections.c:5269
+#: ../clients/cli/connections.c:5302
msgid "Error: "
msgstr "Błąd: "
-#: ../clients/cli/connections.c:3931
+#: ../clients/cli/connections.c:3947
msgid "IPv4 gateway [none]: "
msgstr "Brama IPv4 [none]: "
-#: ../clients/cli/connections.c:3934
+#: ../clients/cli/connections.c:3950
msgid "IPv6 gateway [none]: "
msgstr "Brama IPv6 [none]: "
-#: ../clients/cli/connections.c:3954
+#: ../clients/cli/connections.c:3970
#, c-format
msgid "Error: invalid gateway address '%s'\n"
msgstr "Błąd: nieprawidłowy adres bramy \"%s\"\n"
#. Ask for IP addresses
-#: ../clients/cli/connections.c:3967
+#: ../clients/cli/connections.c:3983
#, c-format
msgid "Do you want to add IP addresses? %s"
msgstr "Dodać adresy IP? %s"
-#: ../clients/cli/connections.c:3975
+#: ../clients/cli/connections.c:3991
#, c-format
msgid "Press <Enter> to finish adding addresses.\n"
msgstr "Naciśnięcie klawisza <Enter> zakończy dodawanie adresów.\n"
-#: ../clients/cli/connections.c:4113
+#: ../clients/cli/connections.c:4129
#, c-format
msgid "Error: 'parent': not valid without 'p-key'."
msgstr "Błąd: \"parent\": nieprawidłowe bez \"p-key\"."
-#: ../clients/cli/connections.c:4168 ../clients/cli/connections.c:5173
+#: ../clients/cli/connections.c:4184 ../clients/cli/connections.c:5189
msgid "SSID: "
msgstr "SSID: "
-#: ../clients/cli/connections.c:4171 ../clients/cli/connections.c:5176
+#: ../clients/cli/connections.c:4187 ../clients/cli/connections.c:5192
msgid "Error: 'ssid' is required."
msgstr "Błąd: \"ssid\" jest wymagane."
-#: ../clients/cli/connections.c:4235
+#: ../clients/cli/connections.c:4251
msgid "WiMAX NSP name: "
msgstr "Nazwa NSP sieci WiMAX: "
-#: ../clients/cli/connections.c:4238
+#: ../clients/cli/connections.c:4254
msgid "Error: 'nsp' is required."
msgstr "Błąd: \"nsp\" jest wymagane."
-#: ../clients/cli/connections.c:4290
+#: ../clients/cli/connections.c:4306
msgid "PPPoE username: "
msgstr "Nazwa użytkownika PPPoE: "
-#: ../clients/cli/connections.c:4293
+#: ../clients/cli/connections.c:4309
msgid "Error: 'username' is required."
msgstr "Błąd: \"username\" jest wymagane."
-#: ../clients/cli/connections.c:4362
+#: ../clients/cli/connections.c:4378
msgid "APN: "
msgstr "APN: "
-#: ../clients/cli/connections.c:4365
+#: ../clients/cli/connections.c:4381
msgid "Error: 'apn' is required."
msgstr "Błąd: \"apn\" jest wymagane."
-#: ../clients/cli/connections.c:4423
+#: ../clients/cli/connections.c:4439
msgid "Bluetooth device address: "
msgstr "Adres urządzenia Bluetooth: "
-#: ../clients/cli/connections.c:4426
+#: ../clients/cli/connections.c:4442
msgid "Error: 'addr' is required."
msgstr "Błąd: \"addr\" jest wymagane."
-#: ../clients/cli/connections.c:4467
+#: ../clients/cli/connections.c:4483
#, c-format
msgid "Error: 'bt-type': '%s' not valid; use [%s, %s (%s), %s]."
msgstr ""
"Błąd: \"bt-type\": \"%s\" jest nieprawidłowe; należy użyć [%s, %s (%s), %s]."
-#: ../clients/cli/connections.c:4511
+#: ../clients/cli/connections.c:4527
msgid "VLAN parent device or connection UUID: "
msgstr "Urządzenie nadrzędne VLAN lub UUID połączenia: "
-#: ../clients/cli/connections.c:4514
+#: ../clients/cli/connections.c:4530
msgid "Error: 'dev' is required."
msgstr "Błąd: \"dev\" jest wymagane."
-#: ../clients/cli/connections.c:4518
+#: ../clients/cli/connections.c:4534
msgid "VLAN ID <0-4095>: "
msgstr "Identyfikator VLAN <0-4095>: "
-#: ../clients/cli/connections.c:4521
+#: ../clients/cli/connections.c:4537
msgid "Error: 'id' is required."
msgstr "Błąd: \"id\" jest wymagane."
-#: ../clients/cli/connections.c:4527
+#: ../clients/cli/connections.c:4543
#, c-format
msgid "Error: 'id': '%s' is not valid; use <0-4095>."
msgstr "Błąd: \"id\": \"%s\" jest nieprawidłowe; należy użyć <0-4095>."
-#: ../clients/cli/connections.c:4537
+#: ../clients/cli/connections.c:4553
#, c-format
msgid "Error: 'dev': '%s' is neither UUID, interface name, nor MAC."
msgstr "Błąd: \"dev\": \"%s\" nie jest UUID, nazwą interfejsu ani MAC."
-#: ../clients/cli/connections.c:4671
+#: ../clients/cli/connections.c:4687
#, c-format
msgid "Error: 'mode': %s."
msgstr "Błąd: \"mode\": %s."
-#: ../clients/cli/connections.c:4680
+#: ../clients/cli/connections.c:4696
#, c-format
msgid "Error: 'primary': '%s' is not a valid interface name."
msgstr "Błąd: \"primary\": \"%s\" nie jest prawidłową nazwą interfejsu."
-#: ../clients/cli/connections.c:4732 ../clients/cli/connections.c:4830
-#: ../clients/cli/connections.c:5032
+#: ../clients/cli/connections.c:4748 ../clients/cli/connections.c:4846
+#: ../clients/cli/connections.c:5048
msgid "Error: 'master' is required."
msgstr "Błąd: \"master\" jest wymagane."
-#: ../clients/cli/connections.c:4738 ../clients/cli/connections.c:4836
-#: ../clients/cli/connections.c:5038
+#: ../clients/cli/connections.c:4754 ../clients/cli/connections.c:4852
+#: ../clients/cli/connections.c:5054
#, c-format
msgid "Warning: master='%s' doesn't refer to any existing profile.\n"
msgstr ""
"Ostrzeżenie: master=\"%s\" nie odnosi się do żadnego istniejącego profilu.\n"
-#: ../clients/cli/connections.c:4741 ../clients/cli/connections.c:4844
-#: ../clients/cli/connections.c:5041
+#: ../clients/cli/connections.c:4757 ../clients/cli/connections.c:4860
+#: ../clients/cli/connections.c:5057
#, c-format
msgid ""
"Warning: 'type' is currently ignored. We only support ethernet slaves for "
@@ -2153,110 +2176,110 @@ msgstr ""
"Ostrzeżenie: \"type\" jest obecnie ignorowane. W tej chwili obsługiwane są "
"tylko podrzędne Ethernet.\n"
-#: ../clients/cli/connections.c:4938
+#: ../clients/cli/connections.c:4954
#, c-format
msgid "Error: 'stp': %s."
msgstr "Błąd: \"stp\": %s."
-#: ../clients/cli/connections.c:5068
+#: ../clients/cli/connections.c:5084
#, c-format
msgid "Error: 'hairpin': %s."
msgstr "Błąd: \"hairpin\": %s."
-#: ../clients/cli/connections.c:5121
+#: ../clients/cli/connections.c:5137
msgid "Error: 'vpn-type' is required."
msgstr "Błąd: \"vpn-type\" jest wymagane."
-#: ../clients/cli/connections.c:5128
+#: ../clients/cli/connections.c:5144
#, c-format
msgid "Warning: 'vpn-type': %s not known.\n"
msgstr "Błąd: \"vpn-type\": nieznane %s.\n"
-#: ../clients/cli/connections.c:5189
+#: ../clients/cli/connections.c:5205
#, c-format
msgid "Error: 'channel': '%s' is not valid; use <1-13>."
msgstr "Błąd: \"channel\": \"%s\" jest nieprawidłowe; należy użyć <1-13>."
-#: ../clients/cli/connections.c:5221
+#: ../clients/cli/connections.c:5237
#, c-format
msgid "Error: '%s' is not a valid connection type."
msgstr "Błąd: \"%s\" nie jest prawidłowym typem połączenia."
-#: ../clients/cli/connections.c:5265
+#: ../clients/cli/connections.c:5281
#, c-format
msgid "Error: IPv4 gateway specified without IPv4 addresses"
msgstr "Błąd: podano bramę IPv4 bez adresów IPv4"
-#: ../clients/cli/connections.c:5269
+#: ../clients/cli/connections.c:5285
#, c-format
msgid "Error: multiple IPv4 gateways specified"
msgstr "Błąd: podano wiele bram IPv4"
-#: ../clients/cli/connections.c:5273
+#: ../clients/cli/connections.c:5289
#, c-format
msgid "Error: Invalid IPv4 gateway '%s'"
msgstr "Błąd: nieprawidłowa brama IPv4 \"%s\""
-#: ../clients/cli/connections.c:5298
+#: ../clients/cli/connections.c:5314
#, c-format
msgid "Error: IPv6 gateway specified without IPv6 addresses"
msgstr "Błąd: podano bramę IPv6 bez adresów IPv6"
-#: ../clients/cli/connections.c:5302
+#: ../clients/cli/connections.c:5318
#, c-format
msgid "Error: multiple IPv6 gateways specified"
msgstr "Błąd: podano wiele bram IPv6"
-#: ../clients/cli/connections.c:5306
+#: ../clients/cli/connections.c:5322
#, c-format
msgid "Error: Invalid IPv6 gateway '%s'"
msgstr "Błąd: nieprawidłowa brama IPv6 \"%s\""
-#: ../clients/cli/connections.c:5366
+#: ../clients/cli/connections.c:5382
#, c-format
msgid "Error: Failed to add '%s' connection: %s"
msgstr "Błąd: dodanie połączenia \"%s\" się nie powiodło: %s"
-#: ../clients/cli/connections.c:5371
+#: ../clients/cli/connections.c:5387
#, c-format
msgid "Connection '%s' (%s) successfully added.\n"
msgstr "Pomyślnie dodano połączenie \"%s\" (%s).\n"
-#: ../clients/cli/connections.c:5591
+#: ../clients/cli/connections.c:5607
#, c-format
msgid "Error: 'type' argument is required."
msgstr "Błąd: parametr \"type\" jest wymagany."
-#: ../clients/cli/connections.c:5599
+#: ../clients/cli/connections.c:5615
#, c-format
msgid "Error: invalid connection type; %s."
msgstr "Błąd: nieznany typ połączenia; %s."
-#: ../clients/cli/connections.c:5608
+#: ../clients/cli/connections.c:5624
#, c-format
msgid "Error: 'autoconnect': %s."
msgstr "Błąd: \"autoconnect\": %s."
-#: ../clients/cli/connections.c:5618
+#: ../clients/cli/connections.c:5634
#, c-format
msgid "Error: 'save': %s."
msgstr "Błąd: \"save\": %s."
-#: ../clients/cli/connections.c:5634
+#: ../clients/cli/connections.c:5650
msgid "Interface name [*]: "
msgstr "Nazwa interfejsu [*]: "
-#: ../clients/cli/connections.c:5639
+#: ../clients/cli/connections.c:5655
#, c-format
msgid "Error: 'ifname' argument is required."
msgstr "Błąd: parametr \"ifname\" jest wymagany."
-#: ../clients/cli/connections.c:5646
+#: ../clients/cli/connections.c:5662
#, c-format
msgid "Error: 'ifname': '%s' is not a valid interface nor '*'."
msgstr "Błąd: \"ifname\": \"%s\" nie jest prawidłowym interfejsem ani \"*\"."
-#: ../clients/cli/connections.c:6422
+#: ../clients/cli/connections.c:6557
#, c-format
msgid "['%s' setting values]\n"
msgstr "[wartości ustawienia \"%s\"]\n"
@@ -2264,7 +2287,7 @@ msgstr "[wartości ustawienia \"%s\"]\n"
#. TRANSLATORS: do not translate command names and keywords before ::
#. * However, you should translate terms enclosed in <>.
#.
-#: ../clients/cli/connections.c:6504
+#: ../clients/cli/connections.c:6639
#, c-format
msgid ""
"---[ Main menu ]---\n"
@@ -2301,7 +2324,7 @@ msgstr ""
"nmcli <opcja-konfiguracji> <wartość> :: konfiguracja nmcli\n"
"quit :: kończy działanie nmcli\n"
-#: ../clients/cli/connections.c:6531
+#: ../clients/cli/connections.c:6666
#, c-format
msgid ""
"goto <setting>[.<prop>] | <prop> :: enter setting/property for editing\n"
@@ -2322,7 +2345,7 @@ msgstr ""
" nmcli connection> goto secondaries\n"
" nmcli> goto ipv4.addresses\n"
-#: ../clients/cli/connections.c:6538
+#: ../clients/cli/connections.c:6673
#, c-format
msgid ""
"remove <setting>[.<prop>] :: remove setting or reset property value\n"
@@ -2343,7 +2366,7 @@ msgstr ""
"Przykłady: nmcli> remove wifi-sec\n"
" nmcli> remove eth.mtu\n"
-#: ../clients/cli/connections.c:6545
+#: ../clients/cli/connections.c:6680
#, c-format
msgid ""
"set [<setting>.<prop> <value>] :: set property value\n"
@@ -2358,7 +2381,7 @@ msgstr ""
"\n"
"Przykład: nmcli> set con.id Moje połączenie\n"
-#: ../clients/cli/connections.c:6550
+#: ../clients/cli/connections.c:6685
#, c-format
msgid ""
"describe [<setting>.<prop>] :: describe property\n"
@@ -2371,7 +2394,7 @@ msgstr ""
"Wyświetla opis właściwości. Wszystkie ustawienia i właściwości usługi NM\n"
"można znaleźć na stronie podręcznika nm-settings(5).\n"
-#: ../clients/cli/connections.c:6555
+#: ../clients/cli/connections.c:6690
#, c-format
msgid ""
"print [all] :: print setting or connection values\n"
@@ -2386,7 +2409,7 @@ msgstr ""
"\n"
"Przykład: nmcli ipv4> print all\n"
-#: ../clients/cli/connections.c:6560
+#: ../clients/cli/connections.c:6695
#, c-format
msgid ""
"verify [all | fix] :: verify setting or connection validity\n"
@@ -2411,7 +2434,7 @@ msgstr ""
" nmcli> verify fix\n"
" nmcli bond> verify\n"
-#: ../clients/cli/connections.c:6569
+#: ../clients/cli/connections.c:6704
#, c-format
msgid ""
"save [persistent|temporary] :: save the connection\n"
@@ -2437,7 +2460,7 @@ msgstr ""
"między ponownymi uruchomieniami. Aby w pełni usunąć trwałe połączenie,\n"
"należy usunąć profil połączenia.\n"
-#: ../clients/cli/connections.c:6580
+#: ../clients/cli/connections.c:6715
#, c-format
msgid ""
"activate [<ifname>] [/<ap>|<nsp>] :: activate the connection\n"
@@ -2458,7 +2481,7 @@ msgstr ""
"/<ap>|<nsp> - AP (Wi-Fi) lub NSP (WiMAX) (należy poprzedzić\n"
" znakiem /, kiedy nie podano <nazwy-interfejsu>)\n"
-#: ../clients/cli/connections.c:6587 ../clients/cli/connections.c:6745
+#: ../clients/cli/connections.c:6722 ../clients/cli/connections.c:6880
#, c-format
msgid ""
"back :: go to upper menu level\n"
@@ -2467,7 +2490,7 @@ msgstr ""
"back :: przechodzi do menu wyższego poziomu\n"
"\n"
-#: ../clients/cli/connections.c:6590
+#: ../clients/cli/connections.c:6725
#, c-format
msgid ""
"help/? [<command>] :: help for the nmcli commands\n"
@@ -2476,7 +2499,7 @@ msgstr ""
"help/? [<polecenie>] :: pomoc dla poleceń nmcli\n"
"\n"
-#: ../clients/cli/connections.c:6593
+#: ../clients/cli/connections.c:6728
#, c-format
msgid ""
"nmcli [<conf-option> <value>] :: nmcli configuration\n"
@@ -2521,7 +2544,7 @@ msgstr ""
" nmcli> nmcli save-confirmation no\n"
" nmcli> nmcli prompt-color 3\n"
-#: ../clients/cli/connections.c:6614 ../clients/cli/connections.c:6751
+#: ../clients/cli/connections.c:6749 ../clients/cli/connections.c:6886
#, c-format
msgid ""
"quit :: exit nmcli\n"
@@ -2534,8 +2557,8 @@ msgstr ""
"To polecenie kończy działanie nmcli. Jeśli modyfikowane połączenie nie jest "
"zapisane, użytkownik zostanie poproszony o potwierdzenie działania.\n"
-#: ../clients/cli/connections.c:6619 ../clients/cli/connections.c:6756
-#: ../clients/cli/connections.c:7167 ../clients/cli/connections.c:8083
+#: ../clients/cli/connections.c:6754 ../clients/cli/connections.c:6891
+#: ../clients/cli/connections.c:7314 ../clients/cli/connections.c:8236
#, c-format
msgid "Unknown command: '%s'\n"
msgstr "Nieznane polecenie: \"%s\"\n"
@@ -2543,7 +2566,7 @@ msgstr "Nieznane polecenie: \"%s\"\n"
#. TRANSLATORS: do not translate command names and keywords before ::
#. * However, you should translate terms enclosed in <>.
#.
-#: ../clients/cli/connections.c:6685
+#: ../clients/cli/connections.c:6820
#, c-format
msgid ""
"---[ Property menu ]---\n"
@@ -2570,7 +2593,7 @@ msgstr ""
"help/? [<polecenie>] :: wyświetla tę pomoc lub opis polecenia\n"
"quit :: kończy działanie nmcli\n"
-#: ../clients/cli/connections.c:6710
+#: ../clients/cli/connections.c:6845
#, c-format
msgid ""
"set [<value>] :: set new value\n"
@@ -2581,7 +2604,7 @@ msgstr ""
"\n"
"To polecenie ustawia podaną <wartość> tej właściwości\n"
-#: ../clients/cli/connections.c:6714
+#: ../clients/cli/connections.c:6849
#, c-format
msgid ""
"add [<value>] :: append new value to the property\n"
@@ -2596,7 +2619,7 @@ msgstr ""
"jest typu kontener. W przypadku właściwości zawierających jedną wartość "
"zastępuje tę wartość (podobnie jak \"set\").\n"
-#: ../clients/cli/connections.c:6720
+#: ../clients/cli/connections.c:6855
#, c-format
msgid ""
"change :: change current value\n"
@@ -2607,7 +2630,7 @@ msgstr ""
"\n"
"Wyświetla bieżącą wartość i umożliwia jej modyfikację.\n"
-#: ../clients/cli/connections.c:6724
+#: ../clients/cli/connections.c:6859
#, c-format
msgid ""
"remove [<value>|<index>|<option name>] :: delete the value\n"
@@ -2640,7 +2663,7 @@ msgstr ""
" nmcli bond.options> remove downdelay\n"
"\n"
-#: ../clients/cli/connections.c:6735
+#: ../clients/cli/connections.c:6870
#, c-format
msgid ""
"describe :: describe property\n"
@@ -2653,7 +2676,7 @@ msgstr ""
"Wyświetla opis właściwości. Wszystkie ustawienia i właściwości usługi NM "
"można znaleźć na stronie podręcznika nm-settings(5).\n"
-#: ../clients/cli/connections.c:6740
+#: ../clients/cli/connections.c:6875
#, c-format
msgid ""
"print [property|setting|connection] :: print property (setting, connection) "
@@ -2668,7 +2691,7 @@ msgstr ""
"Wyświetla wartość właściwości. Podając parametr można także wyświetlić "
"wartości dla całego ustawienia lub połączenia.\n"
-#: ../clients/cli/connections.c:6748
+#: ../clients/cli/connections.c:6883
#, c-format
msgid ""
"help/? [<command>] :: help for nmcli commands\n"
@@ -2677,28 +2700,28 @@ msgstr ""
"help/? [<polecenie>] :: pomoc dla poleceń nmcli\n"
"\n"
-#: ../clients/cli/connections.c:6846
+#: ../clients/cli/connections.c:6981
#, c-format
msgid "Error: Connection activation failed.\n"
msgstr "Błąd: aktywacja połączenia się nie powiodła.\n"
-#: ../clients/cli/connections.c:6929
+#: ../clients/cli/connections.c:7064
#, c-format
msgid "Error: setting '%s' is mandatory and cannot be removed.\n"
msgstr "Błąd: ustawienie \"%s\" jest wymagane i nie może być usuwane.\n"
#. TRANSLATORS: status line in nmcli connection editor
-#: ../clients/cli/connections.c:6947
+#: ../clients/cli/connections.c:7082
#, c-format
msgid "[ Type: %s | Name: %s | UUID: %s | Dirty: %s | Temp: %s ]\n"
msgstr "[ Typ: %s | nazwa: %s | UUID: %s | dirty: %s | tymczasowe: %s ]\n"
-#: ../clients/cli/connections.c:6983
+#: ../clients/cli/connections.c:7118
#, c-format
msgid "The connection is not saved. Do you really want to quit? %s"
msgstr "Połączenie nie jest zapisane. Na pewno zakończyć? %s"
-#: ../clients/cli/connections.c:7028
+#: ../clients/cli/connections.c:7166
#, c-format
msgid ""
"The connection profile has been removed from another client. You may type "
@@ -2707,60 +2730,66 @@ msgstr ""
"Profil połączenia został usunięty z innego klienta. Można wpisać \"save\" w "
"głównym oknie, aby go przywrócić.\n"
-#: ../clients/cli/connections.c:7050 ../clients/cli/connections.c:7471
-#: ../clients/cli/connections.c:7526
+#: ../clients/cli/connections.c:7191 ../clients/cli/connections.c:7617
+#: ../clients/cli/connections.c:7675
+#, c-format
+msgid "Allowed values for '%s' property: %s\n"
+msgstr "Dozwolone wartości dla właściwości \"%s\": %s\n"
+
+#: ../clients/cli/connections.c:7195 ../clients/cli/connections.c:7621
+#: ../clients/cli/connections.c:7679
#, c-format
msgid "Enter '%s' value: "
msgstr "Proszę podać wartość \"%s\": "
-#: ../clients/cli/connections.c:7065 ../clients/cli/connections.c:7087
-#: ../clients/cli/connections.c:7475 ../clients/cli/connections.c:7531
+#: ../clients/cli/connections.c:7210 ../clients/cli/connections.c:7232
+#: ../clients/cli/connections.c:7625 ../clients/cli/connections.c:7684
#, c-format
msgid "Error: failed to set '%s' property: %s\n"
msgstr "Błąd: ustawienie właściwości \"%s\" się nie powiodło: %s\n"
-#: ../clients/cli/connections.c:7081
+#: ../clients/cli/connections.c:7226
#, c-format
msgid "Edit '%s' value: "
msgstr "Modyfikacja wartości \"%s\": "
-#: ../clients/cli/connections.c:7110
+#: ../clients/cli/connections.c:7255
#, c-format
msgid "Error: %s\n"
msgstr "Błąd: %s\n"
-#: ../clients/cli/connections.c:7116 ../clients/cli/connections.c:7610
-#: ../clients/cli/connections.c:7651
+#: ../clients/cli/connections.c:7261 ../clients/cli/connections.c:7763
+#: ../clients/cli/connections.c:7804
#, c-format
msgid "Error: failed to remove value of '%s': %s\n"
msgstr "Błąd: usunięcie wartości \"%s\" się nie powiodło: %s\n"
-#: ../clients/cli/connections.c:7137
+#: ../clients/cli/connections.c:7282
#, c-format
msgid "Unknown command argument: '%s'\n"
msgstr "Nieznany parametr polecenia: \"%s\"\n"
-#: ../clients/cli/connections.c:7263
+#: ../clients/cli/connections.c:7410
#, c-format
msgid "Available settings: %s\n"
msgstr "Dostępne ustawienia: %s\n"
-#: ../clients/cli/connections.c:7272
+#: ../clients/cli/connections.c:7419
#, c-format
msgid "Error: invalid setting name; %s\n"
msgstr "Błąd: nieprawidłowa nazwa ustawienia; %s\n"
-#: ../clients/cli/connections.c:7289
+#: ../clients/cli/connections.c:7436
#, c-format
msgid "Available properties: %s\n"
msgstr "Dostępne właściwości: %s\n"
-#: ../clients/cli/connections.c:7297
+#: ../clients/cli/connections.c:7444
#, c-format
msgid "Error: property %s\n"
msgstr "Błąd: właściwość %s\n"
-#: ../clients/cli/connections.c:7338
+#: ../clients/cli/connections.c:7485
#, c-format
msgid ""
"Saving the connection with 'autoconnect=yes'. That might result in an "
@@ -2771,12 +2800,12 @@ msgstr ""
"natychmiastową aktywację połączenia.\n"
"Na pewno zapisać? %s"
-#: ../clients/cli/connections.c:7413
+#: ../clients/cli/connections.c:7560
#, c-format
msgid "You may edit the following settings: %s\n"
msgstr "Można modyfikować następujące ustawienia: %s\n"
-#: ../clients/cli/connections.c:7440
+#: ../clients/cli/connections.c:7587
#, c-format
msgid ""
"The connection profile has been removed from another client. You may type "
@@ -2785,225 +2814,220 @@ msgstr ""
"Profil połączenia został usunięty z innego klienta. Można wpisać \"save\", "
"aby go przywrócić.\n"
-#: ../clients/cli/connections.c:7469 ../clients/cli/connections.c:7524
-#, c-format
-msgid "Allowed values for '%s' property: %s\n"
-msgstr "Dozwolone wartości dla właściwości \"%s\": %s\n"
-
-#: ../clients/cli/connections.c:7479 ../clients/cli/connections.c:7693
+#: ../clients/cli/connections.c:7629 ../clients/cli/connections.c:7846
#, c-format
msgid "Error: no setting selected; valid are [%s]\n"
msgstr "Błąd: nie wybrano ustawienia; prawidłowe to [%s]\n"
-#: ../clients/cli/connections.c:7480
+#: ../clients/cli/connections.c:7630
#, c-format
msgid "use 'goto <setting>' first, or 'set <setting>.<property>'\n"
msgstr ""
"należy najpierw użyć \"goto <ustawienie>\" lub \"set <ustawienie>."
"<właściwość>\"\n"
-#: ../clients/cli/connections.c:7494 ../clients/cli/connections.c:7630
-#: ../clients/cli/connections.c:7710
+#: ../clients/cli/connections.c:7644 ../clients/cli/connections.c:7783
+#: ../clients/cli/connections.c:7863
#, c-format
msgid "Error: invalid setting argument '%s'; valid are [%s]\n"
msgstr "Błąd: nieprawidłowy parametr ustawienia \"%s\"; prawidłowe to [%s]\n"
-#: ../clients/cli/connections.c:7504
+#: ../clients/cli/connections.c:7654
#, c-format
msgid "Error: missing setting for '%s' property\n"
msgstr "Błąd: brak ustawienia dla właściwości \"%s\"\n"
-#: ../clients/cli/connections.c:7511
+#: ../clients/cli/connections.c:7661
#, c-format
msgid "Error: invalid property: %s\n"
msgstr "Błąd: nieprawidłowa właściwość: %s\n"
-#: ../clients/cli/connections.c:7558
+#: ../clients/cli/connections.c:7711
#, c-format
msgid "Error: unknown setting '%s'\n"
msgstr "Błąd: nieznane ustawienie \"%s\"\n"
-#: ../clients/cli/connections.c:7571
+#: ../clients/cli/connections.c:7724
#, c-format
msgid "You may edit the following properties: %s\n"
msgstr "Można modyfikować następujące właściwości: %s\n"
-#: ../clients/cli/connections.c:7615
+#: ../clients/cli/connections.c:7768
#, c-format
msgid "Error: no argument given; valid are [%s]\n"
msgstr "Błąd: nie podano żadnego parametru; prawidłowe to [%s]\n"
-#: ../clients/cli/connections.c:7628
+#: ../clients/cli/connections.c:7781
#, c-format
msgid "Setting '%s' is not present in the connection.\n"
msgstr "Ustawienie \"%s\" nie jest obecne w połączeniu.\n"
-#: ../clients/cli/connections.c:7669
+#: ../clients/cli/connections.c:7822
#, c-format
msgid "Error: %s properties, nor it is a setting name.\n"
msgstr "Błąd: właściwości %s, ani nie jest nazwą ustawiania.\n"
-#: ../clients/cli/connections.c:7694
+#: ../clients/cli/connections.c:7847
#, c-format
msgid "use 'goto <setting>' first, or 'describe <setting>.<property>'\n"
msgstr ""
"należy najpierw użyć \"goto <ustawienie>\" lub \"describe <ustawienie>."
"<właściwość>\"\n"
-#: ../clients/cli/connections.c:7735
+#: ../clients/cli/connections.c:7888
#, c-format
msgid "Error: invalid property: %s, neither a valid setting name.\n"
msgstr "Błąd: nieprawidłowa właściwość: %s: ani prawidłową nazwą ustawienia.\n"
-#: ../clients/cli/connections.c:7764
+#: ../clients/cli/connections.c:7917
#, c-format
msgid "Error: unknown setting: '%s'\n"
msgstr "Błąd: nieznane ustawienie: \"%s\"\n"
-#: ../clients/cli/connections.c:7769
+#: ../clients/cli/connections.c:7922
#, c-format
msgid "Error: '%s' setting not present in the connection\n"
msgstr "Błąd: ustawienie \"%s\" nie jest obecne w połączeniu\n"
-#: ../clients/cli/connections.c:7794
+#: ../clients/cli/connections.c:7947
#, c-format
msgid "Error: invalid property: %s%s\n"
msgstr "Błąd: nieprawidłowa właściwość: %s%s\n"
-#: ../clients/cli/connections.c:7796
+#: ../clients/cli/connections.c:7949
msgid ", neither a valid setting name"
msgstr ", ani prawidłową nazwą ustawienia"
-#: ../clients/cli/connections.c:7813
+#: ../clients/cli/connections.c:7966
#, c-format
msgid "Invalid verify option: %s\n"
msgstr "Nieprawidłowa opcja sprawdzania: %s\n"
-#: ../clients/cli/connections.c:7821
+#: ../clients/cli/connections.c:7974
#, c-format
msgid "Verify setting '%s': %s\n"
msgstr "Sprawdzenie ustawienia \"%s\": %s\n"
-#: ../clients/cli/connections.c:7836
+#: ../clients/cli/connections.c:7989
#, c-format
msgid "Verify connection: %s\n"
msgstr "Sprawdzenie połączenia: %s\n"
-#: ../clients/cli/connections.c:7839
+#: ../clients/cli/connections.c:7992
#, c-format
msgid "The error cannot be fixed automatically.\n"
msgstr "Nie można automatycznie naprawić błędu.\n"
-#: ../clients/cli/connections.c:7856
+#: ../clients/cli/connections.c:8009
#, c-format
msgid "Error: invalid argument '%s'\n"
msgstr "Błąd: nieprawidłowy parametr \"%s\"\n"
-#: ../clients/cli/connections.c:7889
+#: ../clients/cli/connections.c:8042
#, c-format
msgid "Error: Failed to save '%s' (%s) connection: %s\n"
msgstr "Błąd: zapisanie połączenia \"%s\" (%s) się nie powiodło: %s\n"
-#: ../clients/cli/connections.c:7896
+#: ../clients/cli/connections.c:8049
#, c-format
msgid "Connection '%s' (%s) successfully saved.\n"
msgstr "Pomyślnie zapisano połączenie \"%s\" (%s).\n"
-#: ../clients/cli/connections.c:7897
+#: ../clients/cli/connections.c:8050
#, c-format
msgid "Connection '%s' (%s) successfully updated.\n"
msgstr "Pomyślnie zaktualizowano połączenie \"%s\" (%s).\n"
-#: ../clients/cli/connections.c:7930
+#: ../clients/cli/connections.c:8083
#, c-format
msgid "Error: connection verification failed: %s\n"
msgstr "Błąd: sprawdzenie połączenia się nie powiodło: %s\n"
-#: ../clients/cli/connections.c:7931
+#: ../clients/cli/connections.c:8084
msgid "(unknown error)"
msgstr "(nieznany błąd)"
-#: ../clients/cli/connections.c:7932
+#: ../clients/cli/connections.c:8085
#, c-format
msgid "You may try running 'verify fix' to fix errors.\n"
msgstr "Można spróbować wykonać \"verify fix\", aby naprawić błędy.\n"
-#: ../clients/cli/connections.c:7954
+#: ../clients/cli/connections.c:8107
#, c-format
msgid "Error: connection is not saved. Type 'save' first.\n"
msgstr "Błąd: połączenie nie jest zapisane. Należy najpierw wpisać \"save\".\n"
-#: ../clients/cli/connections.c:7958
+#: ../clients/cli/connections.c:8111
#, c-format
msgid "Error: connection is not valid: %s\n"
msgstr "Błąd: połączenie jest nieprawidłowe: %s\n"
-#: ../clients/cli/connections.c:7968
+#: ../clients/cli/connections.c:8121
#, c-format
msgid "Error: Cannot activate connection: %s.\n"
msgstr "Błąd: nie można aktywować połączenia: %s.\n"
-#: ../clients/cli/connections.c:7978
+#: ../clients/cli/connections.c:8131
#, c-format
msgid "Error: Failed to activate '%s' (%s) connection: %s\n"
msgstr "Błąd: aktywowanie połączenia \"%s\" (%s) się nie powiodło: %s\n"
-#: ../clients/cli/connections.c:7984
+#: ../clients/cli/connections.c:8137
#, c-format
msgid "Monitoring connection activation (press any key to continue)\n"
msgstr ""
"Aktywacja monitorowania połączenia (naciśnięcie dowolnego klawisza "
"kontynuuje)\n"
-#: ../clients/cli/connections.c:8022
+#: ../clients/cli/connections.c:8175
#, c-format
msgid "Error: status-line: %s\n"
msgstr "Błąd: status-line: %s\n"
-#: ../clients/cli/connections.c:8030
+#: ../clients/cli/connections.c:8183
#, c-format
msgid "Error: save-confirmation: %s\n"
msgstr "Błąd: save-confirmation: %s\n"
-#: ../clients/cli/connections.c:8038
+#: ../clients/cli/connections.c:8191
#, c-format
msgid "Error: show-secrets: %s\n"
msgstr "Błąd: show-secrets: %s\n"
-#: ../clients/cli/connections.c:8046
+#: ../clients/cli/connections.c:8199
#, c-format
msgid "Error: bad color number: '%s'; use <0-8>\n"
msgstr "Błąd: błędny numer koloru: \"%s\"; należy użyć <0-8>\n"
-#: ../clients/cli/connections.c:8058
+#: ../clients/cli/connections.c:8211
#, c-format
msgid "Current nmcli configuration:\n"
msgstr "Obecna konfiguracja nmcli:\n"
-#: ../clients/cli/connections.c:8068
+#: ../clients/cli/connections.c:8221
#, c-format
msgid "Invalid configuration option '%s'; allowed [%s]\n"
msgstr "Nieprawidłowa opcja konfiguracji \"%s\"; dozwolone [%s]\n"
-#: ../clients/cli/connections.c:8315
+#: ../clients/cli/connections.c:8468
#, c-format
msgid "Error: only one of 'id', uuid, or 'path' can be provided."
msgstr "Błąd: tylko jedno z \"id\", UUID lub \"path\" może być podane."
-#: ../clients/cli/connections.c:8327 ../clients/cli/connections.c:8514
-#: ../clients/cli/connections.c:8521
+#: ../clients/cli/connections.c:8480 ../clients/cli/connections.c:8667
+#: ../clients/cli/connections.c:8674
#, c-format
msgid "Error: Unknown connection '%s'."
msgstr "Błąd: nieznane połączenie \"%s\"."
-#: ../clients/cli/connections.c:8345
+#: ../clients/cli/connections.c:8498
#, c-format
msgid "Warning: editing existing connection '%s'; 'type' argument is ignored\n"
msgstr ""
"Ostrzeżenie: modyfikowanie istniejącego połączenia \"%s\"; parametr \"type\" "
"jest ignorowany\n"
-#: ../clients/cli/connections.c:8348
+#: ../clients/cli/connections.c:8501
#, c-format
msgid ""
"Warning: editing existing connection '%s'; 'con-name' argument is ignored\n"
@@ -3011,130 +3035,140 @@ msgstr ""
"Ostrzeżenie: modyfikowanie istniejącego połączenia \"%s\"; parametr \"con-"
"name\" jest ignorowany\n"
-#: ../clients/cli/connections.c:8362
+#: ../clients/cli/connections.c:8515
#, c-format
msgid "Valid connection types: %s\n"
msgstr "Prawidłowe typy połączeń: %s\n"
-#: ../clients/cli/connections.c:8364
+#: ../clients/cli/connections.c:8517
#, c-format
msgid "Error: invalid connection type; %s\n"
msgstr "Błąd: nieznany typ połączenia; %s\n"
-#: ../clients/cli/connections.c:8403
+#: ../clients/cli/connections.c:8556
#, c-format
msgid "===| nmcli interactive connection editor |==="
msgstr "===| interaktywny edytor połączeń nmcli |==="
-#: ../clients/cli/connections.c:8406
+#: ../clients/cli/connections.c:8559
#, c-format
msgid "Editing existing '%s' connection: '%s'"
msgstr "Modyfikowanie istniejącego połączenia \"%s\": \"%s\""
-#: ../clients/cli/connections.c:8408
+#: ../clients/cli/connections.c:8561
#, c-format
msgid "Adding a new '%s' connection"
msgstr "Dodawanie nowego połączenia \"%s\""
-#: ../clients/cli/connections.c:8410
+#: ../clients/cli/connections.c:8563
#, c-format
msgid "Type 'help' or '?' for available commands."
msgstr "Wpisanie \"help\" lub \"?\" wyświetla dostępne polecenia."
-#: ../clients/cli/connections.c:8412
+#: ../clients/cli/connections.c:8565
#, c-format
msgid "Type 'describe [<setting>.<prop>]' for detailed property description."
msgstr ""
"Wpisanie \"describe [<ustawienie>.<właściwość>]\" wyświetla szczegółowy opis "
"właściwości."
-#: ../clients/cli/connections.c:8450
+#: ../clients/cli/connections.c:8603
#, c-format
msgid "Error: Failed to modify connection '%s': %s"
msgstr "Błąd: zmodyfikowanie połączenia \"%s\" się nie powiodło: %s"
-#: ../clients/cli/connections.c:8457
+#: ../clients/cli/connections.c:8610
#, c-format
msgid "Connection '%s' (%s) successfully modified.\n"
msgstr "Pomyślnie zmodyfikowano połączenie \"%s\" (%s).\n"
-#: ../clients/cli/connections.c:8489
+#: ../clients/cli/connections.c:8642
#, c-format
msgid "Error: No arguments provided."
msgstr "Błąd: nie podano żadnych parametrów."
-#: ../clients/cli/connections.c:8508
+#: ../clients/cli/connections.c:8661
#, c-format
msgid "Error: connection ID is missing."
msgstr "Błąd: brak identyfikatora połączenia."
-#: ../clients/cli/connections.c:8530 ../clients/cli/connections.c:8543
+#: ../clients/cli/connections.c:8683 ../clients/cli/connections.c:8696
#, c-format
msgid "Error: <setting>.<property> argument is missing."
msgstr "Błąd: brak parametru <ustawienie>.<właściwość>."
-#: ../clients/cli/connections.c:8548
+#: ../clients/cli/connections.c:8701
#, c-format
msgid "Error: value for '%s' is missing."
msgstr "Błąd: brak wartości dla \"%s\"."
-#: ../clients/cli/connections.c:8566
+#: ../clients/cli/connections.c:8719
#, c-format
msgid "Error: invalid <setting>.<property> '%s'."
msgstr "Błąd: nieprawidłowe <ustawienie>.<właściwość> \"%s\"."
-#: ../clients/cli/connections.c:8574
+#: ../clients/cli/connections.c:8727
#, c-format
msgid "Error: invalid or not allowed setting '%s': %s."
msgstr "Błąd: nieprawidłowe lub niedozwolone ustawienie \"%s\": %s."
-#: ../clients/cli/connections.c:8595
+#: ../clients/cli/connections.c:8748
#, c-format
msgid "Error: invalid property '%s': %s."
msgstr "Błąd: nieprawidłowa właściwość \"%s\": %s."
-#: ../clients/cli/connections.c:8606
+#: ../clients/cli/connections.c:8759
#, c-format
msgid "Error: failed to modify %s.%s: %s."
msgstr "Błąd: zmodyfikowanie %s.%s się nie powiodło: %s."
-#: ../clients/cli/connections.c:8624
+#: ../clients/cli/connections.c:8777
#, c-format
msgid "Error: failed to remove a value from %s.%s: %s."
msgstr "Błąd: usunięcie wartości z %s.%s się nie powiodło: %s."
-#: ../clients/cli/connections.c:8661
+#: ../clients/cli/connections.c:8808
+#, c-format
+msgid "Error: not all connections deleted."
+msgstr "Błąd: nie usunięto wszystkich połączeń."
+
+#: ../clients/cli/connections.c:8809
#, c-format
msgid "Error: Connection deletion failed: %s"
msgstr "Błąd: usunięcie połączenia się nie powiodło: %s"
-#: ../clients/cli/connections.c:8725
+#: ../clients/cli/connections.c:8871
#, c-format
-msgid "Error: unknown connection: %s\n"
-msgstr "Błąd: nieznane połączenie: %s\n"
+msgid "Error: unknown connection '%s'\n"
+msgstr "Błąd: nieznane połączenie \"%s\"\n"
+
+#: ../clients/cli/connections.c:8885
+#, c-format
+msgid "Error: no connection provided."
+msgstr "Błąd: nie podano połączenia."
#. truncate trailing ", "
-#: ../clients/cli/connections.c:8762
+#: ../clients/cli/connections.c:8910
#, c-format
msgid "Error: cannot delete unknown connection(s): %s."
msgstr "Błąd: nie można usunąć nieznanych połączeń: %s."
-#: ../clients/cli/connections.c:8785
+#: ../clients/cli/connections.c:8934
#, c-format
msgid "Error: failed to reload connections: %s."
msgstr "Błąd: ponowne wczytanie połączeń się nie powiodło: %s."
-#: ../clients/cli/connections.c:8824
+#: ../clients/cli/connections.c:8973
#, c-format
msgid "Error: failed to load connection: %s."
msgstr "Błąd: wczytanie połączeń się nie powiodło: %s."
-#: ../clients/cli/connections.c:8832
+#: ../clients/cli/connections.c:8981
#, c-format
msgid "Could not load file '%s'\n"
msgstr "Nie można wczytać pliku \"%s\"\n"
-#: ../clients/cli/connections.c:9008
+#: ../clients/cli/connections.c:9160
#, c-format
msgid "Error: '%s' is not valid 'connection' command."
msgstr "Błąd: \"%s\" nie jest prawidłowym poleceniem \"connection\"."
@@ -3144,305 +3178,329 @@ msgstr "Błąd: \"%s\" nie jest prawidłowym poleceniem \"connection\"."
msgid "Interface: "
msgstr "Interfejs: "
+#: ../clients/cli/devices.c:39
+msgid "Interface(s): "
+msgstr "Interfejsy: "
+
#. 3
-#. 17
-#: ../clients/cli/devices.c:46 ../clients/cli/devices.c:75
+#. 19
+#: ../clients/cli/devices.c:47 ../clients/cli/devices.c:78
msgid "CONNECTION"
msgstr "POŁĄCZENIE"
#. 4
-#. 18
-#: ../clients/cli/devices.c:47 ../clients/cli/devices.c:76
+#. 20
+#: ../clients/cli/devices.c:48 ../clients/cli/devices.c:79
msgid "CON-UUID"
msgstr "UUID-POŁĄCZENIA"
#. 2
-#: ../clients/cli/devices.c:60
+#: ../clients/cli/devices.c:61
+msgid "NM-TYPE"
+msgstr "TYP-NM"
+
+#. 3
+#: ../clients/cli/devices.c:62
msgid "VENDOR"
msgstr "PRODUCENT"
-#. 3
-#: ../clients/cli/devices.c:61
+#. 4
+#: ../clients/cli/devices.c:63
msgid "PRODUCT"
msgstr "PRODUKT"
-#. 4
-#: ../clients/cli/devices.c:62
+#. 5
+#: ../clients/cli/devices.c:64
msgid "DRIVER"
msgstr "STEROWNIK"
-#. 5
-#: ../clients/cli/devices.c:63
+#. 6
+#: ../clients/cli/devices.c:65
msgid "DRIVER-VERSION"
msgstr "WERSJA-STEROWNIKA"
-#. 6
-#: ../clients/cli/devices.c:64
+#. 7
+#: ../clients/cli/devices.c:66
msgid "FIRMWARE-VERSION"
msgstr "WERSJA-OPROGRAMOWANIA-SPRZĘTOWEGO"
-#. 7
-#: ../clients/cli/devices.c:65
+#. 8
+#: ../clients/cli/devices.c:67
msgid "HWADDR"
msgstr "ADRES-SPRZĘTOWY"
-#. 8
-#: ../clients/cli/devices.c:66 ../clients/tui/nmt-page-ethernet.c:86
+#. 9
+#: ../clients/cli/devices.c:68 ../clients/tui/nmt-page-ethernet.c:86
#: ../clients/tui/nmt-page-infiniband.c:97 ../clients/tui/nmt-page-vlan.c:131
#: ../clients/tui/nmt-page-wifi.c:373
msgid "MTU"
msgstr "MTU"
-#. 10
-#: ../clients/cli/devices.c:68
+#. 11
+#: ../clients/cli/devices.c:70
msgid "REASON"
msgstr "PRZYCZYNA"
-#. 11
-#: ../clients/cli/devices.c:69
+#. 12
+#: ../clients/cli/devices.c:71
msgid "UDI"
msgstr "UDI"
-#. 12
-#: ../clients/cli/devices.c:70
+#. 13
+#: ../clients/cli/devices.c:72
msgid "IP-IFACE"
msgstr "INTERFEJS-IP"
-#. 13
+#. 14
#. 2
-#: ../clients/cli/devices.c:71 ../clients/cli/devices.c:99
+#: ../clients/cli/devices.c:73 ../clients/cli/devices.c:103
msgid "IS-SOFTWARE"
msgstr "JEST-PROGRAMOWE"
-#. 14
-#: ../clients/cli/devices.c:72
+#. 15
+#: ../clients/cli/devices.c:74
msgid "NM-MANAGED"
msgstr "ZARZĄDZANE-PRZEZ-NM"
-#. 16
-#: ../clients/cli/devices.c:74
+#. 17
+#: ../clients/cli/devices.c:76
msgid "FIRMWARE-MISSING"
msgstr "BRAK-OPROGRAMOWANIA-SPRZĘTOWEGO"
+#. 18
+#: ../clients/cli/devices.c:77
+msgid "PHYS-PORT-ID"
+msgstr "IDENTYFIKATOR-FIZYCZNEGO-PORTU"
+
#. 0
-#: ../clients/cli/devices.c:87
+#: ../clients/cli/devices.c:91
msgid "AVAILABLE-CONNECTION-PATHS"
msgstr "DOSTĘPNE-ŚCIEŻKI-POŁĄCZEŃ"
#. 1
-#: ../clients/cli/devices.c:88
+#: ../clients/cli/devices.c:92
msgid "AVAILABLE-CONNECTIONS"
msgstr "DOSTĘPNE-POŁĄCZENIA"
#. 0
-#: ../clients/cli/devices.c:97
+#: ../clients/cli/devices.c:101
msgid "CARRIER-DETECT"
msgstr "WYKRYWANIE-OPERATORA"
#. 1
-#: ../clients/cli/devices.c:98
+#: ../clients/cli/devices.c:102
msgid "SPEED"
msgstr "PRĘDKOŚĆ"
#. 0
-#: ../clients/cli/devices.c:108
+#: ../clients/cli/devices.c:112
msgid "CARRIER"
msgstr "OPERATOR"
#. 0
-#: ../clients/cli/devices.c:117 ../clients/cli/devices.c:548
+#: ../clients/cli/devices.c:121 ../clients/cli/devices.c:554
msgid "WEP"
msgstr "WEP"
#. 1
-#: ../clients/cli/devices.c:118
+#: ../clients/cli/devices.c:122
msgid "WPA"
msgstr "WPA"
#. 2
-#: ../clients/cli/devices.c:119 ../clients/cli/devices.c:556
+#: ../clients/cli/devices.c:123 ../clients/cli/devices.c:562
msgid "WPA2"
msgstr "WPA2"
#. 3
-#: ../clients/cli/devices.c:120
+#: ../clients/cli/devices.c:124
msgid "TKIP"
msgstr "TKIP"
#. 4
-#: ../clients/cli/devices.c:121
+#: ../clients/cli/devices.c:125
msgid "CCMP"
msgstr "CCMP"
#. 5
#. 2
-#: ../clients/cli/devices.c:122 ../clients/cli/devices.c:222
+#: ../clients/cli/devices.c:126 ../clients/cli/devices.c:228
msgid "AP"
msgstr "PUNKT-DOSTĘPOWY"
#. 6
-#: ../clients/cli/devices.c:123
+#: ../clients/cli/devices.c:127
msgid "ADHOC"
msgstr "ADHOC"
+#. 7
+#: ../clients/cli/devices.c:128
+msgid "2GHZ"
+msgstr "2GHZ"
+
+#. 8
+#: ../clients/cli/devices.c:129
+msgid "5GHZ"
+msgstr "5GHZ"
+
#. 0
-#: ../clients/cli/devices.c:132
+#: ../clients/cli/devices.c:138
msgid "CTR-FREQ"
msgstr "CZĘSTOTLIWOŚĆ-CTR"
#. 1
-#: ../clients/cli/devices.c:133
+#: ../clients/cli/devices.c:139
msgid "RSSI"
msgstr "RSSI"
#. 2
-#: ../clients/cli/devices.c:134
+#: ../clients/cli/devices.c:140
msgid "CINR"
msgstr "CINR"
#. 3
-#: ../clients/cli/devices.c:135
+#: ../clients/cli/devices.c:141
msgid "TX-POW"
msgstr "TX-POW"
#. 4
-#: ../clients/cli/devices.c:136
+#: ../clients/cli/devices.c:142
msgid "BSID"
msgstr "BSID"
#. 0
-#: ../clients/cli/devices.c:145 ../clients/tui/nmt-page-wifi.c:227
+#: ../clients/cli/devices.c:151 ../clients/tui/nmt-page-wifi.c:227
msgid "SSID"
msgstr "SSID"
#. 1
-#: ../clients/cli/devices.c:146
+#: ../clients/cli/devices.c:152
msgid "SSID-HEX"
msgstr "SZESNASTKOWY-SSID"
#. 2
-#: ../clients/cli/devices.c:147 ../clients/tui/nmt-page-wifi.c:361
+#: ../clients/cli/devices.c:153 ../clients/tui/nmt-page-wifi.c:361
msgid "BSSID"
msgstr "BSSID"
#. 3
-#: ../clients/cli/devices.c:148
+#: ../clients/cli/devices.c:154
msgid "MODE"
msgstr "TRYB"
#. 4
-#: ../clients/cli/devices.c:149
+#: ../clients/cli/devices.c:155
msgid "CHAN"
msgstr "KANAŁ"
#. 5
-#: ../clients/cli/devices.c:150
+#: ../clients/cli/devices.c:156
msgid "FREQ"
msgstr "CZĘSTOTLIWOŚĆ"
#. 6
-#: ../clients/cli/devices.c:151
+#: ../clients/cli/devices.c:157
msgid "RATE"
msgstr "OCENA"
#. 7
#. 1
-#: ../clients/cli/devices.c:152 ../clients/cli/devices.c:172
+#: ../clients/cli/devices.c:158 ../clients/cli/devices.c:178
msgid "SIGNAL"
msgstr "SYGNAŁ"
#. 8
-#: ../clients/cli/devices.c:153
+#: ../clients/cli/devices.c:159
msgid "BARS"
msgstr "PASKI"
#. 9
-#: ../clients/cli/devices.c:154
+#: ../clients/cli/devices.c:160
msgid "SECURITY"
msgstr "ZABEZPIECZENIA"
#. 10
-#: ../clients/cli/devices.c:155
+#: ../clients/cli/devices.c:161
msgid "WPA-FLAGS"
msgstr "FLAGI-WPA"
#. 11
-#: ../clients/cli/devices.c:156
+#: ../clients/cli/devices.c:162
msgid "RSN-FLAGS"
msgstr "FLAGI-RSN"
#. 14
-#: ../clients/cli/devices.c:159
+#: ../clients/cli/devices.c:165
msgid "*"
msgstr "*"
#. 0
#. 5
-#: ../clients/cli/devices.c:171 ../clients/cli/devices.c:225
+#: ../clients/cli/devices.c:177 ../clients/cli/devices.c:231
msgid "NSP"
msgstr "NSP"
#. 0
-#: ../clients/cli/devices.c:186
+#: ../clients/cli/devices.c:192
msgid "SLAVES"
msgstr "PODRZĘDNE"
#. 0
-#: ../clients/cli/devices.c:195
+#: ../clients/cli/devices.c:201
msgid "PARENT"
msgstr "NADRZĘDNE"
#. 1
-#: ../clients/cli/devices.c:196
+#: ../clients/cli/devices.c:202
msgid "ID"
msgstr "ID"
#. 0
-#: ../clients/cli/devices.c:205 ../clients/cli/devices.c:220
+#: ../clients/cli/devices.c:211 ../clients/cli/devices.c:226
msgid "CAPABILITIES"
msgstr "MOŻLIWOŚCI"
#. 1
-#: ../clients/cli/devices.c:221
+#: ../clients/cli/devices.c:227
msgid "WIFI-PROPERTIES"
msgstr "WŁAŚCIWOŚCI-WIFI"
#. 3
-#: ../clients/cli/devices.c:223
+#: ../clients/cli/devices.c:229
msgid "WIRED-PROPERTIES"
msgstr "WŁAŚCIWOŚCI-POŁĄCZENIA-PRZEWODOWEGO"
#. 4
-#: ../clients/cli/devices.c:224
+#: ../clients/cli/devices.c:230
msgid "WIMAX-PROPERTIES"
msgstr "WŁAŚCIWOŚCI-WIMAX"
#. 10
-#: ../clients/cli/devices.c:230 ../clients/tui/nmt-page-bond.c:354
+#: ../clients/cli/devices.c:236 ../clients/tui/nmt-page-bond.c:354
msgid "BOND"
msgstr "WIĄZANE"
#. 11
-#: ../clients/cli/devices.c:231 ../clients/tui/nmt-page-team.c:148
+#: ../clients/cli/devices.c:237 ../clients/tui/nmt-page-team.c:148
msgid "TEAM"
msgstr "ZESPÓŁ"
#. 12
-#: ../clients/cli/devices.c:232 ../clients/tui/nmt-page-bridge.c:77
+#: ../clients/cli/devices.c:238 ../clients/tui/nmt-page-bridge.c:77
msgid "BRIDGE"
msgstr "MOSTEK"
#. 14
-#: ../clients/cli/devices.c:234
+#: ../clients/cli/devices.c:240
msgid "BLUETOOTH"
msgstr "BLUETOOTH"
#. 15
-#: ../clients/cli/devices.c:235
+#: ../clients/cli/devices.c:241
msgid "CONNECTIONS"
msgstr "POŁĄCZENIA"
-#: ../clients/cli/devices.c:259
+#: ../clients/cli/devices.c:265
#, c-format
msgid ""
"Usage: nmcli device { COMMAND | help }\n"
@@ -3457,9 +3515,9 @@ msgid ""
"\n"
" connect <ifname>\n"
"\n"
-" disconnect <ifname>\n"
+" disconnect <ifname> ...\n"
"\n"
-" delete <ifname>\n"
+" delete <ifname> ...\n"
"\n"
" wifi [list [ifname <ifname>] [bssid <BSSID>]]\n"
"\n"
@@ -3485,9 +3543,9 @@ msgstr ""
"\n"
" connect <nazwa-interfejsu>\n"
"\n"
-" disconnect <nazwa-interfejsu>\n"
+" disconnect <nazwa-interfejsu> ...\n"
"\n"
-" delete <nazwa-interfejsu>\n"
+" delete <nazwa-interfejsu> ...\n"
"\n"
" wifi [list [ifname <nazwa-interfejsu>] [bssid <BSSID>]]\n"
"\n"
@@ -3501,7 +3559,7 @@ msgstr ""
" wimax [list [ifname <nazwa-interfejsu>] [nsp <nazwa>]]\n"
"\n"
-#: ../clients/cli/devices.c:283
+#: ../clients/cli/devices.c:289
#, c-format
msgid ""
"Usage: nmcli device status { help }\n"
@@ -3531,7 +3589,7 @@ msgstr ""
"device\" wywołuje \"nmcli device status\".\n"
"\n"
-#: ../clients/cli/devices.c:298
+#: ../clients/cli/devices.c:304
#, c-format
msgid ""
"Usage: nmcli device show { ARGUMENTS | help }\n"
@@ -3550,7 +3608,7 @@ msgstr ""
"Polecenie wyświetla szczegóły dla wszystkich urządzeń lub tylko podanego.\n"
"\n"
-#: ../clients/cli/devices.c:309
+#: ../clients/cli/devices.c:315
#, c-format
msgid ""
"Usage: nmcli device connect { ARGUMENTS | help }\n"
@@ -3573,43 +3631,43 @@ msgstr ""
"automatyczne łączenie.\n"
"\n"
-#: ../clients/cli/devices.c:321
+#: ../clients/cli/devices.c:327
#, c-format
msgid ""
"Usage: nmcli device disconnect { ARGUMENTS | help }\n"
"\n"
-"ARGUMENTS := <ifname>\n"
+"ARGUMENTS := <ifname> ...\n"
"\n"
-"Disconnect the device.\n"
+"Disconnect devices.\n"
"The command disconnects the device and prevents it from auto-activating\n"
"further connections without user/manual intervention.\n"
"\n"
msgstr ""
"Użycie: nmcli device disconnect { PARAMETRY | help }\n"
"\n"
-"PARAMETRY := <nazwa-interfejsu>\n"
+"PARAMETRY := <nazwa-interfejsu> ...\n"
"\n"
"Rozłącza urządzenie.\n"
"Polecenie rozłącza urządzenie i uniemożliwia mu dalsze automatyczne\n"
"aktywowanie połączeń bez działania użytkownika.\n"
"\n"
-#: ../clients/cli/devices.c:333
+#: ../clients/cli/devices.c:339
#, c-format
msgid ""
"Usage: nmcli device delete { ARGUMENTS | help }\n"
"\n"
-"ARGUMENTS := <ifname>\n"
+"ARGUMENTS := <ifname> ...\n"
"\n"
-"Deletes the software device.\n"
-"The command removes the interface. It only works for software devices\n"
+"Delete the software devices.\n"
+"The command removes the interfaces. It only works for software devices\n"
"(like bonds, bridges, etc.). Hardware devices cannot be deleted by the\n"
"command.\n"
"\n"
msgstr ""
"Użycie: nmcli device delete { PARAMETRY | help }\n"
"\n"
-"PARAMETRY := [<nazwa-interfejsu>]\n"
+"PARAMETRY := <nazwa-interfejsu> ...\n"
"\n"
"Usuwa urządzenie programowe.\n"
"Polecenie usuwa interfejs. Działa tylko dla urządzeń programowych (takich\n"
@@ -3617,7 +3675,7 @@ msgstr ""
"tym poleceniem.\n"
"\n"
-#: ../clients/cli/devices.c:346
+#: ../clients/cli/devices.c:352
#, c-format
msgid ""
"Usage: nmcli device wifi { ARGUMENTS | help }\n"
@@ -3686,7 +3744,7 @@ msgstr ""
"należy użyć \"nmcli device wifi list\".\n"
"\n"
-#: ../clients/cli/devices.c:379
+#: ../clients/cli/devices.c:385
#, c-format
msgid ""
"Usage: nmcli device wimax { ARGUMENTS | help }\n"
@@ -3710,217 +3768,259 @@ msgstr ""
"NSP.\n"
"\n"
-#: ../clients/cli/devices.c:468 ../clients/cli/devices.c:659
+#: ../clients/cli/devices.c:474 ../clients/cli/devices.c:665
msgid "(none)"
msgstr "(brak)"
-#: ../clients/cli/devices.c:536
+#: ../clients/cli/devices.c:542
#, c-format
msgid "%u MHz"
msgstr "%u MHz"
-#: ../clients/cli/devices.c:537
+#: ../clients/cli/devices.c:543
#, c-format
msgid "%u Mbit/s"
msgstr "%u Mbit/s"
-#: ../clients/cli/devices.c:552
+#: ../clients/cli/devices.c:558
msgid "WPA1"
msgstr "WPA1"
-#: ../clients/cli/devices.c:561
+#: ../clients/cli/devices.c:567
msgid "802.1X"
msgstr "802.1X"
-#: ../clients/cli/devices.c:577
+#: ../clients/cli/devices.c:583
msgid "Ad-Hoc"
msgstr "Ad-hoc"
-#: ../clients/cli/devices.c:578
+#: ../clients/cli/devices.c:584
msgid "Infra"
msgstr "Infrastruktura"
-#: ../clients/cli/devices.c:579
+#: ../clients/cli/devices.c:585
msgid "N/A"
msgstr "Nie dotyczy"
-#: ../clients/cli/devices.c:610
+#: ../clients/cli/devices.c:616
msgid "Home"
msgstr "Dom"
-#: ../clients/cli/devices.c:613
+#: ../clients/cli/devices.c:619
msgid "Partner"
msgstr "Partner"
-#: ../clients/cli/devices.c:616
+#: ../clients/cli/devices.c:622
msgid "Roaming"
msgstr "Roaming"
-#: ../clients/cli/devices.c:774
+#: ../clients/cli/devices.c:780
msgid "Device details"
msgstr "Informacje o urządzeniu"
-#: ../clients/cli/devices.c:786
+#: ../clients/cli/devices.c:792
#, c-format
msgid "Error: 'device show': %s"
msgstr "Błąd: \"device show\": %s"
-#: ../clients/cli/devices.c:837 ../clients/cli/devices.c:840
+#: ../clients/cli/devices.c:844 ../clients/cli/devices.c:847
msgid "(unknown)"
msgstr "(nieznane)"
-#: ../clients/cli/devices.c:878
+#: ../clients/cli/devices.c:886
#, c-format
msgid "%u Mb/s"
msgstr "%u Mb/s"
-#: ../clients/cli/devices.c:964
+#: ../clients/cli/devices.c:976
msgid "on"
msgstr "włączone"
-#: ../clients/cli/devices.c:964
+#: ../clients/cli/devices.c:976
msgid "off"
msgstr "wyłączone"
-#: ../clients/cli/devices.c:1238
+#: ../clients/cli/devices.c:1250
#, c-format
msgid "Error: 'device status': %s"
msgstr "Błąd: \"device status\": %s"
#. Add headers
-#: ../clients/cli/devices.c:1245
+#: ../clients/cli/devices.c:1257
msgid "Status of devices"
msgstr "Stan urządzenia"
-#: ../clients/cli/devices.c:1276
+#: ../clients/cli/devices.c:1288
#, c-format
msgid "Error: invalid extra argument '%s'."
msgstr "Błąd: nieprawidłowy dodatkowy parametr \"%s\"."
-#: ../clients/cli/devices.c:1293 ../clients/cli/devices.c:1591
-#: ../clients/cli/devices.c:1741 ../clients/cli/devices.c:1828
-#: ../clients/cli/devices.c:1961 ../clients/cli/devices.c:2622
+#: ../clients/cli/devices.c:1305 ../clients/cli/devices.c:1603
+#: ../clients/cli/devices.c:2075 ../clients/cli/devices.c:2748
#, c-format
msgid "Error: Device '%s' not found."
msgstr "Błąd: nie odnaleziono urządzenia \"%s\"."
-#: ../clients/cli/devices.c:1371
+#: ../clients/cli/devices.c:1383
#, c-format
msgid "Device '%s' successfully activated with '%s'.\n"
msgstr "Pomyślnie aktywowano urządzenie \"%s\" za pomocą \"%s\".\n"
-#: ../clients/cli/devices.c:1377
+#: ../clients/cli/devices.c:1389
#, c-format
msgid "Error: Connection activation failed: (%d) %s.\n"
msgstr "Błąd: aktywacja połączenia się nie powiodła: (%d) %s.\n"
-#: ../clients/cli/devices.c:1411
+#: ../clients/cli/devices.c:1423
#, c-format
msgid "Error: Failed to add/activate new connection: %s"
msgstr "Błąd: dodanie/aktywacja nowego połączenia się nie powiodła: %s"
-#: ../clients/cli/devices.c:1420
+#: ../clients/cli/devices.c:1432
#, c-format
msgid "Error: Failed to add/activate new connection: Unknown error"
msgstr ""
"Błąd: dodanie/aktywacja nowego połączenia się nie powiodła: nieznany błąd"
-#: ../clients/cli/devices.c:1431
+#: ../clients/cli/devices.c:1443
#, c-format
msgid "Connection with UUID '%s' created and activated on device '%s'\n"
msgstr "Utworzono i aktywowano połączenie o UUID \"%s\" na urządzeniu \"%s\"\n"
-#: ../clients/cli/devices.c:1495
+#: ../clients/cli/devices.c:1507
#, c-format
msgid "Error: Device activation failed: %s"
msgstr "Błąd: aktywacja urządzenia się nie powiodła: %s"
-#: ../clients/cli/devices.c:1504
+#: ../clients/cli/devices.c:1516
#, c-format
msgid "Error: Device activation failed: device was disconnected"
msgstr ""
"Błąd: aktywacja urządzenia się nie powiodła: urządzenie zostało rozłączone"
-#: ../clients/cli/devices.c:1519
+#: ../clients/cli/devices.c:1531
#, c-format
msgid "Device '%s' has been connected.\n"
msgstr "Urządzenie \"%s\" zostało połączone.\n"
-#: ../clients/cli/devices.c:1560 ../clients/cli/devices.c:1569
-#: ../clients/cli/devices.c:1710 ../clients/cli/devices.c:1719
-#: ../clients/cli/devices.c:1798 ../clients/cli/devices.c:1806
+#: ../clients/cli/devices.c:1572 ../clients/cli/devices.c:1581
+#: ../clients/cli/devices.c:1782 ../clients/cli/devices.c:1897
#, c-format
msgid "Error: No interface specified."
msgstr "Błąd: nie podano żadnego interfejsu."
-#: ../clients/cli/devices.c:1575 ../clients/cli/devices.c:1725
-#: ../clients/cli/devices.c:1812
+#: ../clients/cli/devices.c:1587
#, c-format
msgid "Error: extra argument not allowed: '%s'."
msgstr "Błąd: niedozwolony dodatkowy parametr: \"%s\"."
-#: ../clients/cli/devices.c:1639 ../clients/cli/devices.c:1650
+#: ../clients/cli/devices.c:1671 ../clients/cli/devices.c:1686
+#: ../clients/cli/devices.c:1750
#, c-format
msgid "Device '%s' successfully disconnected.\n"
msgstr "Pomyślnie rozłączono urządzenie \"%s\".\n"
-#: ../clients/cli/devices.c:1664
+#: ../clients/cli/devices.c:1674
+#, c-format
+msgid "Device '%s' successfully removed.\n"
+msgstr "Pomyślnie usunięto urządzenie \"%s\".\n"
+
+#: ../clients/cli/devices.c:1734
+#, c-format
+msgid "Error: not all devices disconnected."
+msgstr "Błąd: nie rozłączono wszystkich połączeń."
+
+#: ../clients/cli/devices.c:1735
+#, c-format
+msgid "Error: Device '%s' (%s) disconnecting failed: %s\n"
+msgstr "Błąd: rozłączenie urządzenia \"%s\" (%s) się nie powiodło: %s\n"
+
+#: ../clients/cli/devices.c:1802 ../clients/cli/devices.c:1924
#, c-format
-msgid "Error: Device '%s' (%s) disconnecting failed: %s"
-msgstr "Błąd: rozłączenie urządzenia \"%s\" (%s) się nie powiodło: %s"
+msgid "Warning: argument '%s' is duplicated.\n"
+msgstr "Ostrzeżenie: podwójny parametr \"%s\".\n"
-#: ../clients/cli/devices.c:1679
+#: ../clients/cli/devices.c:1804 ../clients/cli/devices.c:1926
#, c-format
-msgid "Device '%s' has been disconnected.\n"
-msgstr "Urządzenie \"%s\" zostało rozłączone.\n"
+msgid "Error: Device '%s' not found.\n"
+msgstr "Błąd: nie odnaleziono urządzenia \"%s\".\n"
-#: ../clients/cli/devices.c:1770
+#: ../clients/cli/devices.c:1805 ../clients/cli/devices.c:1927
#, c-format
-msgid "Error: Device '%s' (%s) deletion failed: %s"
-msgstr "Błąd: usunięcie urządzenia \"%s\" (%s) się nie powiodło: %s"
+msgid "Error: not all devices found."
+msgstr "Błąd: nie odnaleziono wszystkich urządzeń."
-#: ../clients/cli/devices.c:1834
+#: ../clients/cli/devices.c:1815 ../clients/cli/devices.c:1937
#, c-format
-msgid "Error: Device '%s' is a hardware device. It can't be deleted."
+msgid "Error: no valid device provided."
+msgstr "Błąd: nie podano prawidłowego urządzenia."
+
+#: ../clients/cli/devices.c:1859
+#, c-format
+msgid "Error: not all devices deleted."
+msgstr "Błąd: nie usunięto wszystkich urządzeń."
+
+#: ../clients/cli/devices.c:1860
+#, c-format
+msgid "Error: Device '%s' (%s) deletion failed: %s\n"
+msgstr "Błąd: usunięcie urządzenia \"%s\" (%s) się nie powiodło: %s\n"
+
+#: ../clients/cli/devices.c:1918
+#, c-format
+msgid "Error: Device '%s' is a hardware device. It can't be deleted.\n"
msgstr ""
"Błąd: urządzenie \"%s\" jest urządzeniem sprzętowym i nie może zostać "
-"usunięte."
+"usunięte.\n"
+
+#: ../clients/cli/devices.c:1920
+#, c-format
+msgid "Error: not all devices valid."
+msgstr "Błąd: nie wszystkie urządzenia są prawidłowe."
-#: ../clients/cli/devices.c:1904
+#: ../clients/cli/devices.c:2018
msgid "Wi-Fi scan list"
msgstr "Lista skanowania sieci Wi-Fi"
-#: ../clients/cli/devices.c:1942
+#: ../clients/cli/devices.c:2056
#, c-format
msgid "Error: 'device wifi': %s"
msgstr "Błąd: \"device wifi\": %s"
-#: ../clients/cli/devices.c:1984 ../clients/cli/devices.c:2059
+#: ../clients/cli/devices.c:2098 ../clients/cli/devices.c:2179
#, c-format
msgid "Error: Access point with bssid '%s' not found."
msgstr "Błąd: nie odnaleziono punktu dostępowego z BSSID \"%s\"."
-#: ../clients/cli/devices.c:2008 ../clients/cli/devices.c:2325
-#: ../clients/cli/devices.c:2489
+#: ../clients/cli/devices.c:2125 ../clients/cli/devices.c:2612
+#, c-format
+msgid ""
+"Error: Device '%s' was not recognized as a Wi-Fi device, check "
+"NetworkManager Wi-Fi plugin."
+msgstr ""
+"Błąd: urządzenie \"%s\" nie zostało rozpoznane jako urządzenie Wi-Fi. Proszę "
+"sprawdzić poprawność instalacji wtyczki Wi-Fi usługi NetworkManager."
+
+#: ../clients/cli/devices.c:2127 ../clients/cli/devices.c:2445
+#: ../clients/cli/devices.c:2614
#, c-format
msgid "Error: Device '%s' is not a Wi-Fi device."
msgstr "Błąd: urządzenie \"%s\" nie jest urządzeniem WiFi."
-#: ../clients/cli/devices.c:2218
+#: ../clients/cli/devices.c:2338
msgid "SSID or BSSID: "
msgstr "SSID lub BSSID: "
-#: ../clients/cli/devices.c:2223
+#: ../clients/cli/devices.c:2343
#, c-format
msgid "Error: SSID or BSSID are missing."
msgstr "Błąd: brak SSID lub BSSID."
-#: ../clients/cli/devices.c:2247
+#: ../clients/cli/devices.c:2367
#, c-format
msgid "Error: bssid argument value '%s' is not a valid BSSID."
msgstr "Błąd: wartość parametru BSSID \"%s\" nie jest prawidłowym BSSID."
-#: ../clients/cli/devices.c:2271
+#: ../clients/cli/devices.c:2391
#, c-format
msgid ""
"Error: wep-key-type argument value '%s' is invalid, use 'key' or 'phrase'."
@@ -3928,75 +4028,75 @@ msgstr ""
"Błąd: wartość \"%s\" parametru wep-key-type jest nieprawidłowa, należy użyć "
"\"key\" lub \"phrase\"."
-#: ../clients/cli/devices.c:2291
+#: ../clients/cli/devices.c:2411
#, c-format
msgid "Error: %s: %s."
msgstr "Błąd: %s: %s."
-#: ../clients/cli/devices.c:2306
+#: ../clients/cli/devices.c:2426
#, c-format
msgid "Error: BSSID to connect to (%s) differs from bssid argument (%s)."
msgstr "Błąd: BSSID do połączenia (%s) różni się od parametru BSSID (%s)."
-#: ../clients/cli/devices.c:2312
+#: ../clients/cli/devices.c:2432
#, c-format
msgid "Error: Parameter '%s' is neither SSID nor BSSID."
msgstr "Błąd: parametr \"%s\" nie wynosi SSID ani BSSID."
-#: ../clients/cli/devices.c:2327 ../clients/cli/devices.c:2491
+#: ../clients/cli/devices.c:2447 ../clients/cli/devices.c:2617
#, c-format
msgid "Error: No Wi-Fi device found."
msgstr "Błąd: nie odnaleziono urządzenia WiFi."
-#: ../clients/cli/devices.c:2345
+#: ../clients/cli/devices.c:2465
#, c-format
msgid "Error: No network with SSID '%s' found."
msgstr "Błąd: nie odnaleziono sieci z SSID \"%s\"."
-#: ../clients/cli/devices.c:2347
+#: ../clients/cli/devices.c:2467
#, c-format
msgid "Error: No access point with BSSID '%s' found."
msgstr "Błąd: nie odnaleziono punktu dostępowego z BSSID \"%s\"."
-#: ../clients/cli/devices.c:2386
+#: ../clients/cli/devices.c:2506
msgid "Password: "
msgstr "Hasło: "
-#: ../clients/cli/devices.c:2518
+#: ../clients/cli/devices.c:2644
#, c-format
msgid "Error: 'device wifi' command '%s' is not valid."
msgstr "Błąd: polecenie \"device wifi\" \"%s\" jest nieprawidłowe."
-#: ../clients/cli/devices.c:2565
+#: ../clients/cli/devices.c:2691
msgid "WiMAX NSP list"
msgstr "Lista NSP sieci WiMAX"
-#: ../clients/cli/devices.c:2602
+#: ../clients/cli/devices.c:2728
#, c-format
msgid "Error: 'device wimax': %s"
msgstr "Błąd: \"device wimax\": %s"
-#: ../clients/cli/devices.c:2645
+#: ../clients/cli/devices.c:2771
#, c-format
msgid "Error: NSP with name '%s' not found."
msgstr "Błąd: nie odnaleziono NSP o nazwie \"%s\"."
-#: ../clients/cli/devices.c:2658
+#: ../clients/cli/devices.c:2784
#, c-format
msgid "Error: Device '%s' is not a WiMAX device."
msgstr "Błąd: urządzenie \"%s\" nie jest urządzeniem WiMAX."
-#: ../clients/cli/devices.c:2702
+#: ../clients/cli/devices.c:2828
#, c-format
msgid "Error: Access point with nsp '%s' not found."
msgstr "Błąd: nie odnaleziono punktu dostępowego z NSP \"%s\"."
-#: ../clients/cli/devices.c:2739
+#: ../clients/cli/devices.c:2865
#, c-format
msgid "Error: 'device wimax' command '%s' is not valid."
msgstr "Błąd: polecenie \"device wimax\" \"%s\" jest nieprawidłowe."
-#: ../clients/cli/devices.c:2912
+#: ../clients/cli/devices.c:3041
#, c-format
msgid "Error: 'dev' command '%s' is not valid."
msgstr "Błąd: polecenie \"dev\" \"%s\" jest nieprawidłowe."
@@ -4662,108 +4762,123 @@ msgstr "Błąd uwierzytelnienia: %s\n"
msgid "Warning: polkit agent initialization failed: %s\n"
msgstr "Ostrzeżenie: zainicjowanie agenta polkit się nie powiodło: %s\n"
-#: ../clients/cli/settings.c:670
+#: ../clients/cli/settings.c:678
#, c-format
msgid "%d (key)"
msgstr "%d (klucz)"
-#: ../clients/cli/settings.c:672
+#: ../clients/cli/settings.c:680
#, c-format
msgid "%d (passphrase)"
msgstr "%d (hasło)"
-#: ../clients/cli/settings.c:675 ../clients/cli/settings.c:756
+#: ../clients/cli/settings.c:683 ../clients/cli/settings.c:767
#, c-format
msgid "%d (unknown)"
msgstr "%d (nieznane)"
-#: ../clients/cli/settings.c:704
+#: ../clients/cli/settings.c:712
msgid "0 (NONE)"
msgstr "0 (BRAK)"
-#: ../clients/cli/settings.c:710
+#: ../clients/cli/settings.c:718
msgid "REORDER_HEADERS, "
msgstr "ZMIANA_KOLEJNOŚCI_NAGŁÓWKÓW, "
-#: ../clients/cli/settings.c:712
+#: ../clients/cli/settings.c:720
msgid "GVRP, "
msgstr "GVRP, "
-#: ../clients/cli/settings.c:714
+#: ../clients/cli/settings.c:722
msgid "LOOSE_BINDING, "
msgstr "LUŹNE_DOWIĄZANIE, "
-#: ../clients/cli/settings.c:750
+#: ../clients/cli/settings.c:761
#, c-format
msgid "%d (disabled)"
msgstr "%d (wyłączone)"
-#: ../clients/cli/settings.c:752
+#: ../clients/cli/settings.c:763
#, c-format
msgid "%d (enabled, prefer public IP)"
msgstr "%d (włączone, preferowanie publicznego adresu IP)"
-#: ../clients/cli/settings.c:754
+#: ../clients/cli/settings.c:765
#, c-format
msgid "%d (enabled, prefer temporary IP)"
msgstr "%d (włączone, preferowanie tymczasowego adresu IP)"
-#: ../clients/cli/settings.c:766
+#: ../clients/cli/settings.c:779
+#, c-format
+msgid "%d (no)"
+msgstr "%d (nie)"
+
+#: ../clients/cli/settings.c:781
+#, c-format
+msgid "%d (yes)"
+msgstr "%d (tak)"
+
+#: ../clients/cli/settings.c:784
+#, c-format
+msgid "%d (default)"
+msgstr "%d (domyślne)"
+
+#: ../clients/cli/settings.c:797
msgid "0 (none)"
msgstr "0 (brak)"
-#: ../clients/cli/settings.c:772
+#: ../clients/cli/settings.c:803
msgid "agent-owned, "
msgstr "posiadane przez agenta, "
-#: ../clients/cli/settings.c:774
+#: ../clients/cli/settings.c:805
msgid "not saved, "
msgstr "niezapisane, "
-#: ../clients/cli/settings.c:776
+#: ../clients/cli/settings.c:807
msgid "not required, "
msgstr "niewymagane, "
-#: ../clients/cli/settings.c:1059
+#: ../clients/cli/settings.c:1098
msgid "0 (disabled)"
msgstr "0 (wyłączone)"
-#: ../clients/cli/settings.c:1065
+#: ../clients/cli/settings.c:1104
msgid "enabled, "
msgstr "włączone, "
-#: ../clients/cli/settings.c:1067
+#: ../clients/cli/settings.c:1106
msgid "advertise, "
msgstr "rozgłaszanie, "
-#: ../clients/cli/settings.c:1069
+#: ../clients/cli/settings.c:1108
msgid "willing, "
msgstr "chętne, "
-#: ../clients/cli/settings.c:1097
+#: ../clients/cli/settings.c:1136
msgid "-1 (unset)"
msgstr "-1 (usunięcie ustawienia)"
-#: ../clients/cli/settings.c:1194 ../clients/cli/settings.c:1481
-#: ../clients/cli/settings.c:1523
+#: ../clients/cli/settings.c:1233 ../clients/cli/settings.c:1509
+#: ../clients/cli/settings.c:1551
msgid "auto"
msgstr "automatyczne"
-#: ../clients/cli/settings.c:1207
+#: ../clients/cli/settings.c:1246
msgid "default"
msgstr "domyślne"
-#: ../clients/cli/settings.c:1651
+#: ../clients/cli/settings.c:1682
#, c-format
msgid "Do you also want to set '%s' to '%s'? [yes]: "
msgstr "Ustawić \"%s\" na \"%s\"? [yes]: "
-#: ../clients/cli/settings.c:1653
+#: ../clients/cli/settings.c:1684
#, c-format
msgid "Do you also want to clear '%s'? [yes]: "
msgstr "Wyczyścić \"%s\"? [yes]: "
-#: ../clients/cli/settings.c:1814
+#: ../clients/cli/settings.c:1845
#, c-format
msgid ""
"Warning: %s.%s set to '%s', but it might be ignored in infrastructure mode\n"
@@ -4771,76 +4886,81 @@ msgstr ""
"Ostrzeżenie: ustawiono %s.%s na \"%s\", ale może zostać zignorowane w trybie "
"infrastruktury\n"
-#: ../clients/cli/settings.c:1833
+#: ../clients/cli/settings.c:1864
#, c-format
msgid "Warning: setting %s.%s requires removing ipv4 and ipv6 settings\n"
msgstr "Ostrzeżenie: ustawienie %s.%s wymaga usunięcia ustawień IPv4 i IPv6\n"
-#: ../clients/cli/settings.c:1835
+#: ../clients/cli/settings.c:1866
msgid "Do you want to remove them? [yes] "
msgstr "Usunąć je? [yes] "
-#: ../clients/cli/settings.c:1931 ../clients/cli/settings.c:2253
-#: ../clients/cli/settings.c:4365
+#: ../clients/cli/settings.c:1962 ../clients/cli/settings.c:2297
+#: ../clients/cli/settings.c:4354
#, c-format
msgid "'%s' is not valid"
msgstr "\"%s\" jest nieprawidłowe"
-#: ../clients/cli/settings.c:1954
+#: ../clients/cli/settings.c:1985
#, c-format
msgid "'%d' is not valid; use <%d-%d>"
msgstr "\"%d\" jest nieprawidłowe; należy użyć <%d-%d>"
-#: ../clients/cli/settings.c:1976
+#: ../clients/cli/settings.c:2007
#, c-format
msgid "'%lld' is not valid; use <%lld-%lld>"
msgstr "\"%lld\" jest nieprawidłowe; należy użyć <%lld-%lld>"
-#: ../clients/cli/settings.c:1998
+#: ../clients/cli/settings.c:2029
#, c-format
msgid "'%u' is not valid; use <%u-%u>"
msgstr "\"%u\" jest nieprawidłowe; należy użyć <%u-%u>"
-#: ../clients/cli/settings.c:2064
+#: ../clients/cli/settings.c:2095
#, c-format
msgid "'%s' is not valid; use <option>=<value>"
msgstr "\"%s\" jest nieprawidłowe; należy użyć <opcja>=<wartość>"
-#: ../clients/cli/settings.c:2098
+#: ../clients/cli/settings.c:2129
#, c-format
msgid "index '%s' is not valid"
msgstr "indeks \"%s\" jest nieprawidłowy"
-#: ../clients/cli/settings.c:2103 ../clients/cli/settings.c:2128
+#: ../clients/cli/settings.c:2134 ../clients/cli/settings.c:2159
msgid "no item to remove"
msgstr "brak elementu do usunięcia"
-#: ../clients/cli/settings.c:2107 ../clients/cli/settings.c:2132
+#: ../clients/cli/settings.c:2138 ../clients/cli/settings.c:2163
#, c-format
msgid "index '%d' is not in range <0-%d>"
msgstr "indeks \"%d\" jest poza zakresem <0-%d>"
-#: ../clients/cli/settings.c:2147
+#: ../clients/cli/settings.c:2178
#, c-format
msgid "invalid option '%s'"
msgstr "nieprawidłowa opcja \"%s\""
-#: ../clients/cli/settings.c:2149
+#: ../clients/cli/settings.c:2180
msgid "missing option"
msgstr "brak opcji"
-#: ../clients/cli/settings.c:2179 ../clients/cli/settings.c:2199
-#: ../clients/cli/settings.c:2219
+#: ../clients/cli/settings.c:2207 ../clients/cli/settings.c:2227
+#: ../clients/cli/settings.c:2247
#, c-format
msgid "'%s' is not a valid number (or out of range)"
msgstr "\"%s\" nie jest prawidłową liczbą (lub jest poza zakresem)"
-#: ../clients/cli/settings.c:2269
+#: ../clients/cli/settings.c:2281
+#, c-format
+msgid "'%s' is not a valid value; use -1, 0 or 1"
+msgstr "\"%s\" nie jest prawidłową wartością; należy użyć -1, 0 lub 1"
+
+#: ../clients/cli/settings.c:2313
#, c-format
msgid "'%s' is not a valid Ethernet MAC"
msgstr "\"%s\" nie jest prawidłowym adresem MAC Ethernetu"
-#: ../clients/cli/settings.c:2294 ../libnm-core/nm-setting-connection.c:795
+#: ../clients/cli/settings.c:2338 ../libnm-core/nm-setting-connection.c:817
#: ../libnm-core/nm-setting-infiniband.c:256
#: ../libnm-util/nm-setting-connection.c:835
#: ../libnm-util/nm-setting-infiniband.c:270
@@ -4848,40 +4968,40 @@ msgstr "\"%s\" nie jest prawidłowym adresem MAC Ethernetu"
msgid "'%s' is not a valid interface name"
msgstr "\"%s\" nie jest prawidłową nazwą interfejsu"
-#: ../clients/cli/settings.c:2318
+#: ../clients/cli/settings.c:2362
#, c-format
msgid "'%s' is not a valid flag number; use <0-%d>"
msgstr "\"%s\" nie jest prawidłowym numerem flagi; należy użyć <0-%d>"
-#: ../clients/cli/settings.c:2330
+#: ../clients/cli/settings.c:2374
#, c-format
msgid "Warning: '%s' sum is higher than all flags => all flags set\n"
msgstr ""
"Ostrzeżenie: suma \"%s\" jest wyższa niż wszystkie flagi => wszystkie "
"ustawione flagi\n"
-#: ../clients/cli/settings.c:2371
+#: ../clients/cli/settings.c:2415
#, c-format
msgid "'%s' is not a valid hex character"
msgstr "\"%s\" nie jest prawidłowym znakiem szesnastkowym"
-#: ../clients/cli/settings.c:2401
+#: ../clients/cli/settings.c:2445
#, c-format
msgid "'%s' is not a valid MAC"
msgstr "\"%s\" nie jest prawidłowym adresem MAC"
-#: ../clients/cli/settings.c:2438 ../libnm-core/nm-setting-connection.c:784
+#: ../clients/cli/settings.c:2471 ../libnm-core/nm-setting-connection.c:806
#: ../libnm-util/nm-setting-connection.c:792
#, c-format
msgid "'%s' is not a valid UUID"
msgstr "\"%s\" nie jest prawidłowym UUID"
-#: ../clients/cli/settings.c:2505
+#: ../clients/cli/settings.c:2538
#, c-format
msgid "the property doesn't contain permission '%s'"
msgstr "właściwość nie zawiera uprawnienia \"%s\""
-#: ../clients/cli/settings.c:2517
+#: ../clients/cli/settings.c:2550
msgid ""
"Enter a list of user permissions. This is a list of user names formatted "
"as:\n"
@@ -4898,40 +5018,40 @@ msgstr ""
"\n"
"Przykład: alice bob charlie\n"
-#: ../clients/cli/settings.c:2536
+#: ../clients/cli/settings.c:2569
#, c-format
msgid "'%s' is not valid master; use ifname or connection UUID"
msgstr ""
"\"%s\" nie jest prawidłowym \"master\"; należy użyć nazwy interfejsu lub "
"UUID połączenia"
-#: ../clients/cli/settings.c:2580
+#: ../clients/cli/settings.c:2613
#, c-format
msgid "Warning: %s is not an UUID of any existing connection profile\n"
msgstr ""
"Ostrzeżenie: %s nie jest UUID żadnego istniejącego profilu połączenia\n"
-#: ../clients/cli/settings.c:2584 ../clients/cli/settings.c:2600
+#: ../clients/cli/settings.c:2617 ../clients/cli/settings.c:2633
#, c-format
msgid "'%s' is not a VPN connection profile"
msgstr "\"%s\" nie jest profilem połączenia VPN"
-#: ../clients/cli/settings.c:2593
+#: ../clients/cli/settings.c:2626
#, c-format
msgid "'%s' is not a name of any exiting profile"
msgstr "\"%s\" nie jest nazwą żadnego istniejącego profilu"
-#: ../clients/cli/settings.c:2627
+#: ../clients/cli/settings.c:2660
#, c-format
msgid "the value '%s' is not a valid UUID"
msgstr "wartość \"%s\" nie jest prawidłowym UUID"
-#: ../clients/cli/settings.c:2634
+#: ../clients/cli/settings.c:2667
#, c-format
msgid "the property doesn't contain UUID '%s'"
msgstr "właściwość nie zawiera UUID \"%s\""
-#: ../clients/cli/settings.c:2646
+#: ../clients/cli/settings.c:2679
msgid ""
"Enter secondary connections that should be activated when this connection "
"is\n"
@@ -4952,16 +5072,16 @@ msgstr ""
"\n"
"Przykład: private-openvpn, fe6ba5d8-c2fc-4aae-b2e3-97efddd8d9a7\n"
-#: ../clients/cli/settings.c:2723
+#: ../clients/cli/settings.c:2754
msgid "private key password not provided"
msgstr "nie podano hasła klucza prywatnego"
-#: ../clients/cli/settings.c:2750
+#: ../clients/cli/settings.c:2782
#, c-format
msgid "the property doesn't contain EAP method '%s'"
msgstr "właściwość nie zawiera metody EAP \"%s\""
-#: ../clients/cli/settings.c:2765
+#: ../clients/cli/settings.c:2799
msgid ""
"Enter file path to CA certificate (optionally prefixed with file://).\n"
" [file://]<file path>\n"
@@ -4975,12 +5095,12 @@ msgstr ""
"danych typu blob.\n"
"Przykład: /home/cimrman/cacert.crt\n"
-#: ../clients/cli/settings.c:2784
+#: ../clients/cli/settings.c:2818
#, c-format
msgid "the property doesn't contain alternative subject match '%s'"
msgstr "właściwość nie zawiera alternatywnego dopasowania tematu \"%s\""
-#: ../clients/cli/settings.c:2800
+#: ../clients/cli/settings.c:2834
msgid ""
"Enter file path to client certificate (optionally prefixed with file://).\n"
" [file://]<file path>\n"
@@ -4994,7 +5114,7 @@ msgstr ""
"danych typu blob.\n"
"Przykład: /home/cimrman/jara.crt\n"
-#: ../clients/cli/settings.c:2812
+#: ../clients/cli/settings.c:2846
msgid ""
"Enter file path to CA certificate for inner authentication (optionally "
"prefixed\n"
@@ -5010,13 +5130,13 @@ msgstr ""
"danych typu blob.\n"
"Przykład: /home/cimrman/ca-zweite-phase.crt\n"
-#: ../clients/cli/settings.c:2832
+#: ../clients/cli/settings.c:2866
#, c-format
msgid "the property doesn't contain \"phase2\" alternative subject match '%s'"
msgstr ""
"właściwość nie zawiera alternatywnego dopasowania tematu \"phase2\" \"%s\""
-#: ../clients/cli/settings.c:2848
+#: ../clients/cli/settings.c:2882
msgid ""
"Enter file path to client certificate for inner authentication (optionally "
"prefixed\n"
@@ -5032,7 +5152,7 @@ msgstr ""
"danych typu blob.\n"
"Przykład: /home/cimrman/jara-zweite-phase.crt\n"
-#: ../clients/cli/settings.c:2868
+#: ../clients/cli/settings.c:2902
msgid ""
"Enter path to a private key and the key password (if not set yet):\n"
" [file://]<file path> [<password>]\n"
@@ -5046,7 +5166,7 @@ msgstr ""
"surowych danych typu blob.\n"
"Przykład: /home/cimrman/jara-priv-key Dardanely\n"
-#: ../clients/cli/settings.c:2939
+#: ../clients/cli/settings.c:2973
msgid ""
"Enter bytes as a list of hexadecimal values.\n"
"Two formats are accepted:\n"
@@ -5067,7 +5187,7 @@ msgstr ""
"Przykłady: ab0455a6ea3a74C2\n"
" ab 4 55 0xa6 ea 3a 74 C2\n"
-#: ../clients/cli/settings.c:3042
+#: ../clients/cli/settings.c:3076
#, c-format
msgid ""
"Enter a list of bonding options formatted as:\n"
@@ -5098,33 +5218,33 @@ msgstr ""
"\n"
"Przykład: mode=2,miimon=120\n"
-#: ../clients/cli/settings.c:3080
+#: ../clients/cli/settings.c:3107
#, c-format
msgid "'%s' is not a valid InfiniBand MAC"
msgstr "\"%s\" nie jest prawidłowym adresem MAC InfiniBand"
-#: ../clients/cli/settings.c:3117
+#: ../clients/cli/settings.c:3144
#, c-format
msgid "'%s' is not a valid IBoIP P_Key"
msgstr "\"%s\" nie jest prawidłowym P_Key IBoIP"
-#: ../clients/cli/settings.c:3148
+#: ../clients/cli/settings.c:3175
#, c-format
msgid "'%s' is not valid (the format is: ip[/prefix] [next-hop] [metric])"
msgstr ""
"\"%s\" jest nieprawidłowe (format: ip[/przedrostek] [next-hop] [parametry])"
-#: ../clients/cli/settings.c:3196 ../clients/cli/settings.c:3215
+#: ../clients/cli/settings.c:3223 ../clients/cli/settings.c:3242
#, c-format
msgid "invalid IPv4 address '%s'"
msgstr "nieprawidłowy adres IPv4 \"%s\""
-#: ../clients/cli/settings.c:3221 ../clients/cli/settings.c:3522
+#: ../clients/cli/settings.c:3248 ../clients/cli/settings.c:3518
#, c-format
msgid "the property doesn't contain DNS server '%s'"
msgstr "właściwość nie zawiera serwera DNS \"%s\""
-#: ../clients/cli/settings.c:3233
+#: ../clients/cli/settings.c:3260
msgid ""
"Enter a list of IPv4 addresses of DNS servers.\n"
"\n"
@@ -5134,17 +5254,17 @@ msgstr ""
"\n"
"Przykład: 8.8.8.8, 8.8.4.4\n"
-#: ../clients/cli/settings.c:3269 ../clients/cli/settings.c:3576
+#: ../clients/cli/settings.c:3296 ../clients/cli/settings.c:3572
#, c-format
msgid "the property doesn't contain DNS search domain '%s'"
msgstr "właściwość nie zawiera domeny wyszukiwania DNS \"%s\""
-#: ../clients/cli/settings.c:3323 ../clients/cli/settings.c:3629
+#: ../clients/cli/settings.c:3350 ../clients/cli/settings.c:3625
#, c-format
msgid "the property doesn't contain IP address '%s'"
msgstr "właściwość nie zawiera adresu IP \"%s\""
-#: ../clients/cli/settings.c:3336
+#: ../clients/cli/settings.c:3363
msgid ""
"Enter a list of IPv4 addresses formatted as:\n"
" ip[/prefix], ip[/prefix],...\n"
@@ -5158,17 +5278,17 @@ msgstr ""
"\n"
"Przykład: 192.168.1.5/24, 10.0.0.11/24\n"
-#: ../clients/cli/settings.c:3352 ../clients/cli/settings.c:3658
+#: ../clients/cli/settings.c:3379 ../clients/cli/settings.c:3654
#, c-format
msgid "invalid gateway address '%s'"
msgstr "nieprawidłowy adres bramy \"%s\""
-#: ../clients/cli/settings.c:3407 ../clients/cli/settings.c:3713
+#: ../clients/cli/settings.c:3434 ../clients/cli/settings.c:3709
#, c-format
msgid "the property doesn't contain route '%s'"
msgstr "właściwość nie zawiera trasy \"%s\""
-#: ../clients/cli/settings.c:3420
+#: ../clients/cli/settings.c:3447
msgid ""
"Enter a list of IPv4 routes formatted as:\n"
" ip[/prefix] [next-hop] [metric],...\n"
@@ -5191,12 +5311,12 @@ msgstr ""
"Przykłady: 192.168.2.0/24 192.168.2.1 3, 10.1.0.0/16 10.0.0.254\n"
" 10.1.2.0/24\n"
-#: ../clients/cli/settings.c:3497 ../clients/cli/settings.c:3516
+#: ../clients/cli/settings.c:3493 ../clients/cli/settings.c:3512
#, c-format
msgid "invalid IPv6 address '%s'"
msgstr "nieprawidłowy adres IPv6 \"%s\""
-#: ../clients/cli/settings.c:3534
+#: ../clients/cli/settings.c:3530
msgid ""
"Enter a list of IPv6 addresses of DNS servers. If the IPv6 configuration "
"method is 'auto' these DNS servers are appended to those (if any) returned "
@@ -5217,7 +5337,7 @@ msgstr ""
"\n"
"Przykład: 2607:f0d0:1002:51::4, 2607:f0d0:1002:51::1\n"
-#: ../clients/cli/settings.c:3642
+#: ../clients/cli/settings.c:3638
msgid ""
"Enter a list of IPv6 addresses formatted as:\n"
" ip[/prefix], ip[/prefix],...\n"
@@ -5231,7 +5351,7 @@ msgstr ""
"\n"
"Przykład: 2607:f0d0:1002:51::4/64, 1050:0:0:0:5:600:300c:326b\n"
-#: ../clients/cli/settings.c:3726
+#: ../clients/cli/settings.c:3722
msgid ""
"Enter a list of IPv6 routes formatted as:\n"
" ip[/prefix] [next-hop] [metric],...\n"
@@ -5256,28 +5376,28 @@ msgstr ""
"db8:beef::3 2\n"
" abbe::/64 55\n"
-#: ../clients/cli/settings.c:3743 ../libnm-core/nm-setting-gsm.c:317
-#: ../libnm-util/nm-setting-gsm.c:374
+#: ../clients/cli/settings.c:3739 ../libnm-core/nm-setting-gsm.c:308
+#: ../libnm-util/nm-setting-gsm.c:365
#, c-format
msgid "'%s' is not a number"
msgstr "\"%s\" nie jest liczbą"
-#: ../clients/cli/settings.c:3750
+#: ../clients/cli/settings.c:3746
#, c-format
msgid "'%s' is not valid; use 0, 1, or 2"
msgstr "\"%s\" jest nieprawidłowe; należy użyć 0, 1 lub 2"
-#: ../clients/cli/settings.c:3767
+#: ../clients/cli/settings.c:3763
#, c-format
msgid "'%s' is not a valid channel; use <1-13>"
msgstr "\"%s\" nie jest prawidłowym kanałem; należy użyć <1-13>"
-#: ../clients/cli/settings.c:3804
+#: ../clients/cli/settings.c:3800
#, c-format
msgid "'%s' is not valid; use [e, o, n]"
msgstr "\"%s\" jest nieprawidłowe; należy użyć [e, o, n]"
-#: ../clients/cli/settings.c:3832
+#: ../clients/cli/settings.c:3828
msgid ""
"nmcli can accepts both direct JSON configuration data and a file name "
"containing the configuration. In the latter case the file is read and the "
@@ -5295,16 +5415,16 @@ msgstr ""
"\"roundrobin\"}, \"ports\": {\"eth1\": {}, \"eth2\": {}} }\n"
" set team.config /etc/mój-zespół.conf\n"
-#: ../clients/cli/settings.c:3872
+#: ../clients/cli/settings.c:3868
msgid "no priority to remove"
msgstr "brak priorytetu do usunięcia"
-#: ../clients/cli/settings.c:3876
+#: ../clients/cli/settings.c:3872
#, c-format
msgid "index '%d' is not in the range of <0-%d>"
msgstr "indeks \"%d\" jest poza zakresem <0-%d>"
-#: ../clients/cli/settings.c:3915
+#: ../clients/cli/settings.c:3911
#, c-format
msgid ""
"Warning: only one mapping at a time is supported; taking the first one (%s)\n"
@@ -5312,33 +5432,33 @@ msgstr ""
"Ostrzeżenie: obsługiwane jest tylko jedno mapowanie na raz; przyjmowanie "
"pierwszego (%s)\n"
-#: ../clients/cli/settings.c:3922
+#: ../clients/cli/settings.c:3918
#, c-format
msgid "the property doesn't contain mapping '%s'"
msgstr "właściwość nie zawiera mapowania \"%s\""
-#: ../clients/cli/settings.c:4031 ../clients/cli/settings.c:4194
-#: ../libnm-core/nm-setting-wired.c:607
+#: ../clients/cli/settings.c:4027 ../clients/cli/settings.c:4183
+#: ../libnm-core/nm-setting-wired.c:604
#: ../libnm-core/nm-setting-wireless.c:785
#: ../libnm-core/nm-setting-wireless.c:797
-#: ../libnm-util/nm-setting-wired.c:650
+#: ../libnm-util/nm-setting-wired.c:647
#: ../libnm-util/nm-setting-wireless.c:842
#: ../libnm-util/nm-setting-wireless.c:856
#, c-format
msgid "'%s' is not a valid MAC address"
msgstr "\"%s\" nie jest prawidłowym adresem MAC"
-#: ../clients/cli/settings.c:4037 ../clients/cli/settings.c:4200
+#: ../clients/cli/settings.c:4033 ../clients/cli/settings.c:4189
#, c-format
msgid "the property doesn't contain MAC address '%s'"
msgstr "właściwość nie zawiera adresu MAC \"%s\""
-#: ../clients/cli/settings.c:4056
+#: ../clients/cli/settings.c:4052
#, c-format
msgid "'%s' is not valid; 2 or 3 strings should be provided"
msgstr "\"%s\" jest nieprawidłowe; powinny zostać podane dwa lub trzy ciągi"
-#: ../clients/cli/settings.c:4070
+#: ../clients/cli/settings.c:4066
msgid ""
"Enter a list of subchannels (comma or space separated).\n"
"\n"
@@ -5348,7 +5468,7 @@ msgstr ""
"\n"
"Przykład: 0.0.0e20 0.0.0e21 0.0.0e22\n"
-#: ../clients/cli/settings.c:4120
+#: ../clients/cli/settings.c:4109
#, c-format
msgid ""
"Enter a list of S/390 options formatted as:\n"
@@ -5359,23 +5479,23 @@ msgstr ""
" opcja = <wartość>, opcja = <wartość>,...\n"
"Prawidłowe opcje: %s\n"
-#: ../clients/cli/settings.c:4166
+#: ../clients/cli/settings.c:4155
#, c-format
msgid "'%s' is not a valid channel"
msgstr "\"%s\" nie jest prawidłowym kanałem"
-#: ../clients/cli/settings.c:4172
+#: ../clients/cli/settings.c:4161
#, c-format
msgid "'%ld' is not a valid channel"
msgstr "\"%ld\" nie jest prawidłowym kanałem"
-#: ../clients/cli/settings.c:4259 ../clients/cli/settings.c:4297
-#: ../clients/cli/settings.c:4335
+#: ../clients/cli/settings.c:4248 ../clients/cli/settings.c:4286
+#: ../clients/cli/settings.c:4324
#, c-format
msgid "the property doesn't contain protocol '%s'"
msgstr "właściwość nie zawiera protokołu \"%s\""
-#: ../clients/cli/settings.c:4374
+#: ../clients/cli/settings.c:4363
#, c-format
msgid ""
"'%s' not compatible with %s '%s', please change the key or set the right %s "
@@ -5384,23 +5504,23 @@ msgstr ""
"\"%s\" nie jest zgodne z %s \"%s\", proszę zmienić klucz lub ustawić "
"najpierw właściwe %s."
-#: ../clients/cli/settings.c:4382
+#: ../clients/cli/settings.c:4371
#, c-format
msgid "WEP key is guessed to be of '%s'\n"
msgstr "Klucz WEP jest prawdopodobnie typu \"%s\"\n"
-#: ../clients/cli/settings.c:4384
+#: ../clients/cli/settings.c:4373
#, c-format
msgid "WEP key index set to '%d'\n"
msgstr "Ustawiono indeks klucza WEP na \"%d\"\n"
-#: ../clients/cli/settings.c:4407
+#: ../clients/cli/settings.c:4396
#, c-format
msgid "'%s' not among [0 (unknown), 1 (key), 2 (passphrase)]"
msgstr "\"%s\" nie jest jednym z [0 (unknown), 1 (key), 2 (passphrase)]"
-#: ../clients/cli/settings.c:4423 ../clients/cli/settings.c:4426
-#: ../clients/cli/settings.c:4429 ../clients/cli/settings.c:4432
+#: ../clients/cli/settings.c:4412 ../clients/cli/settings.c:4415
+#: ../clients/cli/settings.c:4418 ../clients/cli/settings.c:4421
#, c-format
msgid ""
"Warning: '%s' is not compatible with '%s' type, please change or delete the "
@@ -5409,7 +5529,7 @@ msgstr ""
"Ostrzeżenie: \"%s\" nie jest zgodne z typem \"%s\", proszę zmienić lub "
"usunąć klucz.\n"
-#: ../clients/cli/settings.c:4445
+#: ../clients/cli/settings.c:4434
#, c-format
msgid ""
"Enter the type of WEP keys. The accepted values are: 0 or unknown, 1 or key, "
@@ -5418,36 +5538,36 @@ msgstr ""
"Proszę podać typ kluczy WEP. Możliwe wartości: 0 lub \"unknown\", 1 lub \"key"
"\" i 2 lub \"passphrase\".\n"
-#: ../clients/cli/settings.c:4458
+#: ../clients/cli/settings.c:4447
#, c-format
msgid "'%s' is not a valid PSK"
msgstr "\"%s\" nie jest prawidłowym PSK"
-#: ../clients/cli/settings.c:4502
+#: ../clients/cli/settings.c:4491
#, c-format
msgid "'%s' is not a valid DCB flag"
msgstr "\"%s\" nie jest prawidłową flagą DCB"
-#: ../clients/cli/settings.c:4525
+#: ../clients/cli/settings.c:4514
#, c-format
msgid "'%s' is not a DCB app priority"
msgstr "\"%s\" nie jest prawidłowym priorytetem aplikacji DCB"
-#: ../clients/cli/settings.c:4551
+#: ../clients/cli/settings.c:4540
msgid "must contain 8 comma-separated numbers"
msgstr "musi zawierać osiem liczb oddzielonych przecinkami"
-#: ../clients/cli/settings.c:4568
+#: ../clients/cli/settings.c:4557
#, c-format
msgid "'%s' not a number between 0 and %u (inclusive) or %u"
msgstr "\"%s\" nie jest liczbą między 0 a %u (włącznie) lub %u"
-#: ../clients/cli/settings.c:4571
+#: ../clients/cli/settings.c:4560
#, c-format
msgid "'%s' not a number between 0 and %u (inclusive)"
msgstr "\"%s\" nie jest liczbą między 0 a %u (włącznie)"
-#: ../clients/cli/settings.c:4593
+#: ../clients/cli/settings.c:4582
#, c-format
msgid ""
"Warning: changes will have no effect until '%s' includes 1 (enabled)\n"
@@ -5457,33 +5577,33 @@ msgstr ""
"(włączone)\n"
"\n"
-#: ../clients/cli/settings.c:4646
+#: ../clients/cli/settings.c:4635
#, c-format
msgid "bandwidth percentages must total 100%%"
msgstr "procenty szerokości pasma muszą razem wynosić 100%%"
-#: ../clients/cli/settings.c:6340
+#: ../clients/cli/settings.c:6336
msgid "don't know how to get the property value"
msgstr "nie wiadomo, jak uzyskać wartość właściwości"
-#: ../clients/cli/settings.c:6393 ../clients/cli/settings.c:6433
+#: ../clients/cli/settings.c:6389 ../clients/cli/settings.c:6429
msgid "the property can't be changed"
msgstr "nie można zmieniać tej właściwości"
-#: ../clients/cli/settings.c:6516
+#: ../clients/cli/settings.c:6513
msgid "(not available)"
msgstr "(niedostępne)"
-#: ../clients/cli/settings.c:6541
+#: ../clients/cli/settings.c:6538
msgid "[NM property description]"
msgstr "[opis właściwości NM]"
-#: ../clients/cli/settings.c:6546
+#: ../clients/cli/settings.c:6543
msgid "[nmcli specific description]"
msgstr "[konkretny opis nmcli]"
#. ----------------------------------------------------------------------------
-#: ../clients/cli/settings.c:6595
+#: ../clients/cli/settings.c:6592
msgid "<hidden>"
msgstr "<ukryte>"
@@ -5522,37 +5642,37 @@ msgstr "\"%s\" jest niejednoznaczne (on x off)"
msgid "'%s' is not valid; use [%s] or [%s]"
msgstr "\"%s\" jest nieprawidłowy; należy użyć [%s] lub [%s]"
-#: ../clients/cli/utils.c:502
+#: ../clients/cli/utils.c:519
#, c-format
msgid "'%s' is ambiguous (%s x %s)"
msgstr "\"%s\" jest niejednoznaczne (%s x %s)"
-#: ../clients/cli/utils.c:514
+#: ../clients/cli/utils.c:531
#, c-format
msgid "missing name, try one of [%s]"
msgstr "brak nazwy, należy spróbować jednej z [%s]"
-#: ../clients/cli/utils.c:753
+#: ../clients/cli/utils.c:772
#, c-format
msgid "field '%s' has to be alone"
msgstr "pole \"%s\" musi być same"
-#: ../clients/cli/utils.c:756
+#: ../clients/cli/utils.c:775
#, c-format
msgid "invalid field '%s'; allowed fields: %s"
msgstr "nieprawidłowe pole \"%s\"; dozwolone pola: %s"
-#: ../clients/cli/utils.c:813
+#: ../clients/cli/utils.c:832
msgid "Option '--terse' requires specifying '--fields'"
msgstr "Opcja \"--terse\" wymaga podania opcji \"--fields\""
-#: ../clients/cli/utils.c:817
+#: ../clients/cli/utils.c:836
#, c-format
msgid "Option '--terse' requires specific '--fields' option values , not '%s'"
msgstr ""
"Opcja \"--terse\" wymaga konkretnej wartości opcji \"--fields\", nie \"%s\""
-#: ../clients/cli/utils.c:1135
+#: ../clients/cli/utils.c:1154
#, c-format
msgid ""
"Warning: nmcli (%s) and NetworkManager (%s) versions don't match. Use --"
@@ -5561,7 +5681,7 @@ msgstr ""
"Ostrzeżenie: wersje programu nmcli (%s) i usługi NetworkManager (%s) się nie "
"zgadzają. Użycie opcji --nocheck ukrywa ostrzeżenie.\n"
-#: ../clients/cli/utils.c:1144
+#: ../clients/cli/utils.c:1163
#, c-format
msgid ""
"Error: nmcli (%s) and NetworkManager (%s) versions don't match. Force "
@@ -5752,7 +5872,7 @@ msgid "InfiniBand connection %d"
msgstr "Połączenie InfiniBand %d"
#: ../clients/tui/nm-editor-utils.c:173 ../libnm-glib/nm-device.c:1799
-#: ../libnm/nm-device.c:1621
+#: ../libnm/nm-device.c:1624
msgid "Mobile Broadband"
msgstr "Komórkowe"
@@ -5770,9 +5890,9 @@ msgstr "DSL"
msgid "DSL connection %d"
msgstr "Połączenie DSL %d"
-#: ../clients/tui/nm-editor-utils.c:191 ../libnm-core/nm-connection.c:1565
+#: ../clients/tui/nm-editor-utils.c:191 ../libnm-core/nm-connection.c:1605
#: ../libnm-glib/nm-device.c:1803 ../libnm-util/nm-connection.c:1608
-#: ../libnm/nm-device.c:1625 ../src/settings/plugins/ifcfg-rh/reader.c:3931
+#: ../libnm/nm-device.c:1628 ../src/settings/plugins/ifcfg-rh/reader.c:3922
msgid "Bond"
msgstr "Wiązane"
@@ -5781,9 +5901,9 @@ msgstr "Wiązane"
msgid "Bond connection %d"
msgstr "Połączenie wiązane %d"
-#: ../clients/tui/nm-editor-utils.c:200 ../libnm-core/nm-connection.c:1569
+#: ../clients/tui/nm-editor-utils.c:200 ../libnm-core/nm-connection.c:1609
#: ../libnm-glib/nm-device.c:1807 ../libnm-util/nm-connection.c:1612
-#: ../libnm/nm-device.c:1629 ../src/settings/plugins/ifcfg-rh/reader.c:4222
+#: ../libnm/nm-device.c:1632 ../src/settings/plugins/ifcfg-rh/reader.c:4213
msgid "Bridge"
msgstr "Mostek"
@@ -5792,9 +5912,9 @@ msgstr "Mostek"
msgid "Bridge connection %d"
msgstr "Połączenie mostkowane %d"
-#: ../clients/tui/nm-editor-utils.c:209 ../libnm-core/nm-connection.c:1567
+#: ../clients/tui/nm-editor-utils.c:209 ../libnm-core/nm-connection.c:1607
#: ../libnm-glib/nm-device.c:1805 ../libnm-util/nm-connection.c:1610
-#: ../libnm/nm-device.c:1627 ../src/settings/plugins/ifcfg-rh/reader.c:4037
+#: ../libnm/nm-device.c:1630 ../src/settings/plugins/ifcfg-rh/reader.c:4028
msgid "Team"
msgstr "Zespół"
@@ -6796,58 +6916,58 @@ msgstr "Nie można zweryfikować pliku PKCS#12: %d"
msgid "Could not generate random data."
msgstr "Nie można utworzyć losowych danych."
-#: ../libnm-core/nm-connection.c:225
+#: ../libnm-core/nm-connection.c:226
msgid "wrong type; should be a list of strings."
msgstr "błędny typ; powinien być listą ciągów."
-#: ../libnm-core/nm-connection.c:280
+#: ../libnm-core/nm-connection.c:281
msgid "unknown setting name"
msgstr "nieznana nazwa ustawienia"
-#: ../libnm-core/nm-connection.c:802
+#: ../libnm-core/nm-connection.c:805
msgid "setting not found"
msgstr "nie odnaleziono ustawienia"
-#: ../libnm-core/nm-connection.c:866
+#: ../libnm-core/nm-connection.c:869
msgid "setting not allowed in slave connection"
msgstr "ustawienie nie jest dozwolone w połączeniu podrzędnym"
-#: ../libnm-core/nm-connection.c:877
+#: ../libnm-core/nm-connection.c:880
msgid "setting is required for non-slave connections"
msgstr "wymagane jest ustawienie dla niepodrzędnych połączeń"
-#: ../libnm-core/nm-connection.c:943
+#: ../libnm-core/nm-connection.c:946
msgid "Unexpected failure to verify the connection"
msgstr "Sprawdzenie połączenia niespodziewanie się nie powiodło"
-#: ../libnm-core/nm-connection.c:976
+#: ../libnm-core/nm-connection.c:979
msgid "Unexpected failure to normalize the connection"
msgstr "Znormalizowanie połączenia niespodziewanie się nie powiodło"
-#: ../libnm-core/nm-connection.c:1440 ../libnm-core/nm-setting-8021x.c:2273
-#: ../libnm-core/nm-setting-8021x.c:2290 ../libnm-core/nm-setting-8021x.c:2321
-#: ../libnm-core/nm-setting-8021x.c:2338 ../libnm-core/nm-setting-8021x.c:2380
-#: ../libnm-core/nm-setting-8021x.c:2392 ../libnm-core/nm-setting-8021x.c:2410
-#: ../libnm-core/nm-setting-8021x.c:2422 ../libnm-core/nm-setting-8021x.c:2446
-#: ../libnm-core/nm-setting-8021x.c:2628 ../libnm-core/nm-setting-adsl.c:190
+#: ../libnm-core/nm-connection.c:1480 ../libnm-core/nm-setting-8021x.c:2375
+#: ../libnm-core/nm-setting-8021x.c:2392 ../libnm-core/nm-setting-8021x.c:2423
+#: ../libnm-core/nm-setting-8021x.c:2440 ../libnm-core/nm-setting-8021x.c:2482
+#: ../libnm-core/nm-setting-8021x.c:2494 ../libnm-core/nm-setting-8021x.c:2512
+#: ../libnm-core/nm-setting-8021x.c:2524 ../libnm-core/nm-setting-8021x.c:2548
+#: ../libnm-core/nm-setting-8021x.c:2713 ../libnm-core/nm-setting-adsl.c:190
#: ../libnm-core/nm-setting-bluetooth.c:121
#: ../libnm-core/nm-setting-bluetooth.c:139
#: ../libnm-core/nm-setting-cdma.c:142
-#: ../libnm-core/nm-setting-connection.c:768
-#: ../libnm-core/nm-setting-connection.c:807
-#: ../libnm-core/nm-setting-connection.c:908
+#: ../libnm-core/nm-setting-connection.c:790
+#: ../libnm-core/nm-setting-connection.c:829
+#: ../libnm-core/nm-setting-connection.c:930
#: ../libnm-core/nm-setting-ip-config.c:1841
#: ../libnm-core/nm-setting-olpc-mesh.c:113
#: ../libnm-core/nm-setting-pppoe.c:143 ../libnm-core/nm-setting-vpn.c:400
#: ../libnm-core/nm-setting-wimax.c:117
#: ../libnm-core/nm-setting-wireless-security.c:862
-#: ../libnm-core/nm-setting-wireless.c:694 ../libnm-util/nm-setting.c:1366
-#: ../libnm-util/nm-setting.c:1385 ../libnm-util/nm-setting.c:1403
-#: ../libnm-util/nm-setting-8021x.c:2284 ../libnm-util/nm-setting-8021x.c:2301
-#: ../libnm-util/nm-setting-8021x.c:2342 ../libnm-util/nm-setting-8021x.c:2359
-#: ../libnm-util/nm-setting-8021x.c:2411 ../libnm-util/nm-setting-8021x.c:2423
-#: ../libnm-util/nm-setting-8021x.c:2441 ../libnm-util/nm-setting-8021x.c:2453
-#: ../libnm-util/nm-setting-8021x.c:2477 ../libnm-util/nm-setting-8021x.c:2655
+#: ../libnm-core/nm-setting-wireless.c:694 ../libnm-util/nm-setting.c:1372
+#: ../libnm-util/nm-setting.c:1391 ../libnm-util/nm-setting.c:1409
+#: ../libnm-util/nm-setting-8021x.c:2326 ../libnm-util/nm-setting-8021x.c:2343
+#: ../libnm-util/nm-setting-8021x.c:2384 ../libnm-util/nm-setting-8021x.c:2401
+#: ../libnm-util/nm-setting-8021x.c:2453 ../libnm-util/nm-setting-8021x.c:2465
+#: ../libnm-util/nm-setting-8021x.c:2483 ../libnm-util/nm-setting-8021x.c:2495
+#: ../libnm-util/nm-setting-8021x.c:2519 ../libnm-util/nm-setting-8021x.c:2681
#: ../libnm-util/nm-setting-adsl.c:210
#: ../libnm-util/nm-setting-bluetooth.c:143
#: ../libnm-util/nm-setting-bluetooth.c:161
@@ -6856,8 +6976,8 @@ msgstr "Znormalizowanie połączenia niespodziewanie się nie powiodło"
#: ../libnm-util/nm-setting-connection.c:785
#: ../libnm-util/nm-setting-connection.c:846
#: ../libnm-util/nm-setting-ip4-config.c:852
-#: ../libnm-util/nm-setting-ip6-config.c:833
-#: ../libnm-util/nm-setting-ip6-config.c:897
+#: ../libnm-util/nm-setting-ip6-config.c:835
+#: ../libnm-util/nm-setting-ip6-config.c:899
#: ../libnm-util/nm-setting-olpc-mesh.c:124
#: ../libnm-util/nm-setting-pppoe.c:164 ../libnm-util/nm-setting-vpn.c:424
#: ../libnm-util/nm-setting-wimax.c:139
@@ -6866,130 +6986,302 @@ msgstr "Znormalizowanie połączenia niespodziewanie się nie powiodło"
msgid "property is missing"
msgstr "brak właściwości"
-#: ../libnm-core/nm-setting-8021x.c:579 ../libnm-util/nm-setting-8021x.c:598
+#: ../libnm-core/nm-keyfile-reader.c:141
+msgid "ignoring missing number"
+msgstr "ignorowanie brakującej liczby"
+
+#: ../libnm-core/nm-keyfile-reader.c:150
+#, c-format
+msgid "ignoring invalid number '%s'"
+msgstr "ignorowanie nieprawidłowej liczby \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:170
+#, c-format
+msgid "ignoring invalid %s address: %s"
+msgstr "ignorowanie nieprawidłowego adresu %s: %s"
+
+#: ../libnm-core/nm-keyfile-reader.c:210
+#, c-format
+msgid "ignoring invalid gateway '%s' for %s route"
+msgstr "ignorowanie nieprawidłowej bramy \"%s\" dla trasy %s"
+
+#: ../libnm-core/nm-keyfile-reader.c:230
+#, c-format
+msgid "ignoring invalid %s route: %s"
+msgstr "ignorowanie nieprawidłowej trasy %s: %s"
+
+#: ../libnm-core/nm-keyfile-reader.c:348
+#, c-format
+msgid "unexpected character '%c' for address %s: '%s' (position %td)"
+msgstr "nieoczekiwany znak \"%c\" dla adresu %s: \"%s\" (położenie %td)"
+
+#: ../libnm-core/nm-keyfile-reader.c:358
+#, c-format
+msgid "unexpected character '%c' for %s: '%s' (position %td)"
+msgstr "nieoczekiwany znak \"%c\" dla %s: \"%s\" (położenie %td)"
+
+#: ../libnm-core/nm-keyfile-reader.c:367
+#, c-format
+msgid "unexpected character '%c' in prefix length for %s: '%s' (position %td)"
+msgstr ""
+"nieoczekiwany znak \"%c\" w długości przedrostka dla %s: \"%s\" (położenie "
+"%td)"
+
+#: ../libnm-core/nm-keyfile-reader.c:378
+#, c-format
+msgid "garbage at the end of value %s: '%s'"
+msgstr "śmiecie na końcu wartości %s: \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:384
+#, c-format
+msgid "deprecated semicolon at the end of value %s: '%s'"
+msgstr "przestarzały średnik na końcu wartości %s: \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:399
+#, c-format
+msgid "invalid prefix length for %s '%s', defaulting to %d"
+msgstr "nieprawidłowa długość przedrostka dla %s \"%s\", domyślnie %d"
+
+#: ../libnm-core/nm-keyfile-reader.c:406
+#, c-format
+msgid "missing prefix length for %s '%s', defaulting to %d"
+msgstr "brak długości przedrostka dla %s \"%s\", domyślnie %d"
+
+#: ../libnm-core/nm-keyfile-reader.c:509
+#, c-format
+msgid "ignoring invalid DNS server IPv4 address '%s'"
+msgstr "ignorowanie nieprawidłowego adresu IPv4 serwera DNS \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:548
+#, c-format
+msgid "ignoring invalid DNS server IPv6 address '%s'"
+msgstr "ignorowanie nieprawidłowego adresu IPv6 serwera DNS \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:611 ../libnm-core/nm-keyfile-reader.c:752
+#: ../libnm-core/nm-keyfile-reader.c:1411
+#, c-format
+msgid "ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"
+msgstr ""
+"ignorowanie nieprawidłowego elementu bajtu \"%d\" (nie jest między 0 a 255, "
+"włącznie)"
+
+#: ../libnm-core/nm-keyfile-reader.c:625
+msgid "ignoring invalid MAC address"
+msgstr "ignorowanie nieprawidłowego adresu MAC"
+
+#: ../libnm-core/nm-keyfile-reader.c:741
+msgid "ignoring invalid binary property"
+msgstr "ignorowanie nieprawidłowej właściwości binarnej"
+
+#: ../libnm-core/nm-keyfile-reader.c:784
+msgid "ignoring invalid SSID"
+msgstr "ignorowanie nieprawidłowego SSID"
+
+#: ../libnm-core/nm-keyfile-reader.c:800
+msgid "ignoring invalid raw password"
+msgstr "ignorowanie nieprawidłowego surowego hasła"
+
+#: ../libnm-core/nm-keyfile-reader.c:875
+#: ../libnm-core/nm-keyfile-reader.c:1041
+#, c-format
+msgid "certificate or key file '%s' does not exist"
+msgstr "certyfikat lub plik klucza \"%s\" nie istnieje"
+
+#: ../libnm-core/nm-keyfile-reader.c:880
+#, c-format
+msgid "invalid key/cert value path \"%s\""
+msgstr "nieprawidłowa ścieżka wartości klucz/certyfikat \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:918
+msgid "invalid key/cert value data:;base64, is not base64"
+msgstr "nieprawidłowe dane wartości klucz/certyfikat:;base64, nie jest base64"
+
+#: ../libnm-core/nm-keyfile-reader.c:931
+msgid "invalid key/cert value data:;base64,file://"
+msgstr "nieprawidłowe dane wartości klucz/certyfikat:;base64,file://"
+
+#: ../libnm-core/nm-keyfile-reader.c:1078
+msgid "invalid key/cert value is not a valid blob"
+msgstr ""
+"nieprawidłowa wartość klucz/certyfikat nie jest prawidłowymi danymi typu blob"
+
+#: ../libnm-core/nm-keyfile-reader.c:1083
+msgid "invalid key/cert value"
+msgstr "nieprawidłowa wartość klucz/certyfikat"
+
+#: ../libnm-core/nm-keyfile-reader.c:1130
+#, c-format
+msgid "invalid parity value '%s'"
+msgstr "nieprawidłowa wartość parzystości \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:1315
+#, c-format
+msgid "error loading setting value: %s"
+msgstr "błąd podczas wczytywania wartości ustawienia: %s"
+
+#: ../libnm-core/nm-keyfile-reader.c:1344
+#, c-format
+msgid "invalid negative value (%i)"
+msgstr "nieprawidłowa wartość ujemna (%i)"
+
+#: ../libnm-core/nm-keyfile-reader.c:1365
+#, c-format
+msgid "invalid char value (%i)"
+msgstr "nieprawidłowa wartość znaku (%i)"
+
+#: ../libnm-core/nm-keyfile-reader.c:1388
+#, c-format
+msgid "invalid int64 value (%s)"
+msgstr "nieprawidłowa wartość int64 (%s)"
+
+#: ../libnm-core/nm-keyfile-reader.c:1447
+#, c-format
+msgid "too large FLAGS property '%s' (%llu)"
+msgstr "za duża właściwość FLAGS \"%s\" (%llu)"
+
+#: ../libnm-core/nm-keyfile-reader.c:1460
+#, c-format
+msgid "unhandled setting property type '%s'"
+msgstr "nieobsłużony typ właściwości ustawienia \"%s\""
+
+#: ../libnm-core/nm-keyfile-reader.c:1491
+#, c-format
+msgid "invalid setting name '%s'"
+msgstr "nieprawidłowa nazwa ustawienia \"%s\""
+
+#: ../libnm-core/nm-setting-8021x.c:412
+msgid "data missing"
+msgstr "brak danych"
+
+#: ../libnm-core/nm-setting-8021x.c:444
+msgid "binary data missing"
+msgstr "brak danych binarnych"
+
+#: ../libnm-core/nm-setting-8021x.c:461
+msgid "file:// URI not NUL terminated"
+msgstr "adres URI file:// nie kończy się NUL"
+
+#: ../libnm-core/nm-setting-8021x.c:470
+msgid "file:// URI is empty"
+msgstr "adres URI file:// jest pusty"
+
+#: ../libnm-core/nm-setting-8021x.c:478
+msgid "file:// URI is not valid UTF-8"
+msgstr "adres URI file:// nie jest prawidłowym UTF-8"
+
+#: ../libnm-core/nm-setting-8021x.c:677 ../libnm-util/nm-setting-8021x.c:640
msgid "CA certificate must be in X.509 format"
msgstr "Certyfikat CA musi być w formacie X.509"
-#: ../libnm-core/nm-setting-8021x.c:894 ../libnm-core/nm-setting-8021x.c:1158
-#: ../libnm-core/nm-setting-8021x.c:1478 ../libnm-util/nm-setting-8021x.c:916
-#: ../libnm-util/nm-setting-8021x.c:1179 ../libnm-util/nm-setting-8021x.c:1502
+#: ../libnm-core/nm-setting-8021x.c:992 ../libnm-core/nm-setting-8021x.c:1256
+#: ../libnm-core/nm-setting-8021x.c:1576 ../libnm-util/nm-setting-8021x.c:958
+#: ../libnm-util/nm-setting-8021x.c:1221 ../libnm-util/nm-setting-8021x.c:1544
msgid "invalid certificate format"
msgstr "nieprawidłowy format certyfikatu"
-#: ../libnm-core/nm-setting-8021x.c:1761 ../libnm-util/nm-setting-8021x.c:1771
+#: ../libnm-core/nm-setting-8021x.c:1859 ../libnm-util/nm-setting-8021x.c:1813
msgid "invalid private key"
msgstr "nieprawidłowy klucz prywatny"
-#: ../libnm-core/nm-setting-8021x.c:2071 ../libnm-util/nm-setting-8021x.c:2082
+#: ../libnm-core/nm-setting-8021x.c:2171 ../libnm-util/nm-setting-8021x.c:2124
msgid "invalid phase2 private key"
msgstr "nieprawidłowy klucz prywatny drugiego etapu"
-#: ../libnm-core/nm-setting-8021x.c:2280 ../libnm-core/nm-setting-8021x.c:2297
-#: ../libnm-core/nm-setting-8021x.c:2328 ../libnm-core/nm-setting-8021x.c:2345
-#: ../libnm-core/nm-setting-8021x.c:2386 ../libnm-core/nm-setting-8021x.c:2398
-#: ../libnm-core/nm-setting-8021x.c:2416 ../libnm-core/nm-setting-8021x.c:2428
-#: ../libnm-core/nm-setting-8021x.c:2453 ../libnm-core/nm-setting-adsl.c:197
-#: ../libnm-core/nm-setting-adsl.c:206 ../libnm-core/nm-setting-cdma.c:158
-#: ../libnm-core/nm-setting-cdma.c:167
-#: ../libnm-core/nm-setting-connection.c:775
-#: ../libnm-core/nm-setting-connection.c:818
+#: ../libnm-core/nm-setting-8021x.c:2382 ../libnm-core/nm-setting-8021x.c:2399
+#: ../libnm-core/nm-setting-8021x.c:2430 ../libnm-core/nm-setting-8021x.c:2447
+#: ../libnm-core/nm-setting-8021x.c:2488 ../libnm-core/nm-setting-8021x.c:2500
+#: ../libnm-core/nm-setting-8021x.c:2518 ../libnm-core/nm-setting-8021x.c:2530
+#: ../libnm-core/nm-setting-8021x.c:2555 ../libnm-core/nm-setting-adsl.c:197
+#: ../libnm-core/nm-setting-cdma.c:158
+#: ../libnm-core/nm-setting-connection.c:797
+#: ../libnm-core/nm-setting-connection.c:840
#: ../libnm-core/nm-setting-gsm.c:226 ../libnm-core/nm-setting-gsm.c:283
-#: ../libnm-core/nm-setting-gsm.c:292
#: ../libnm-core/nm-setting-ip-config.c:1848
#: ../libnm-core/nm-setting-ip4-config.c:178
#: ../libnm-core/nm-setting-pppoe.c:150 ../libnm-core/nm-setting-pppoe.c:159
#: ../libnm-core/nm-setting-vpn.c:409 ../libnm-core/nm-setting-vpn.c:419
#: ../libnm-core/nm-setting-wimax.c:126
#: ../libnm-core/nm-setting-wireless-security.c:892
-#: ../libnm-core/nm-setting-wireless-security.c:900
-#: ../libnm-core/nm-setting-wireless-security.c:924
-#: ../libnm-util/nm-setting-8021x.c:2291 ../libnm-util/nm-setting-8021x.c:2308
-#: ../libnm-util/nm-setting-8021x.c:2349 ../libnm-util/nm-setting-8021x.c:2366
-#: ../libnm-util/nm-setting-8021x.c:2417 ../libnm-util/nm-setting-8021x.c:2429
-#: ../libnm-util/nm-setting-8021x.c:2447 ../libnm-util/nm-setting-8021x.c:2459
-#: ../libnm-util/nm-setting-8021x.c:2484 ../libnm-util/nm-setting-adsl.c:217
-#: ../libnm-util/nm-setting-adsl.c:226 ../libnm-util/nm-setting-cdma.c:179
-#: ../libnm-util/nm-setting-cdma.c:188
+#: ../libnm-core/nm-setting-wireless-security.c:916
+#: ../libnm-util/nm-setting-8021x.c:2333 ../libnm-util/nm-setting-8021x.c:2350
+#: ../libnm-util/nm-setting-8021x.c:2391 ../libnm-util/nm-setting-8021x.c:2408
+#: ../libnm-util/nm-setting-8021x.c:2459 ../libnm-util/nm-setting-8021x.c:2471
+#: ../libnm-util/nm-setting-8021x.c:2489 ../libnm-util/nm-setting-8021x.c:2501
+#: ../libnm-util/nm-setting-8021x.c:2526 ../libnm-util/nm-setting-adsl.c:217
+#: ../libnm-util/nm-setting-cdma.c:179
#: ../libnm-util/nm-setting-connection.c:776
#: ../libnm-util/nm-setting-connection.c:853
#: ../libnm-util/nm-setting-gsm.c:283 ../libnm-util/nm-setting-gsm.c:340
-#: ../libnm-util/nm-setting-gsm.c:349
#: ../libnm-util/nm-setting-ip4-config.c:917
#: ../libnm-util/nm-setting-ip4-config.c:926
#: ../libnm-util/nm-setting-pppoe.c:171 ../libnm-util/nm-setting-pppoe.c:180
#: ../libnm-util/nm-setting-vpn.c:433 ../libnm-util/nm-setting-vpn.c:443
#: ../libnm-util/nm-setting-wimax.c:148
#: ../libnm-util/nm-setting-wireless-security.c:922
-#: ../libnm-util/nm-setting-wireless-security.c:930
-#: ../libnm-util/nm-setting-wireless-security.c:954
+#: ../libnm-util/nm-setting-wireless-security.c:946
msgid "property is empty"
msgstr "właściwość jest pusta"
-#: ../libnm-core/nm-setting-8021x.c:2310 ../libnm-core/nm-setting-8021x.c:2358
-#: ../libnm-util/nm-setting-8021x.c:2319 ../libnm-util/nm-setting-8021x.c:2331
-#: ../libnm-util/nm-setting-8021x.c:2377 ../libnm-util/nm-setting-8021x.c:2389
+#: ../libnm-core/nm-setting-8021x.c:2412 ../libnm-core/nm-setting-8021x.c:2460
+#: ../libnm-util/nm-setting-8021x.c:2361 ../libnm-util/nm-setting-8021x.c:2373
+#: ../libnm-util/nm-setting-8021x.c:2419 ../libnm-util/nm-setting-8021x.c:2431
#, c-format
msgid "has to match '%s' property for PKCS#12"
msgstr "musi pasować do właściwości \"%s\" dla PKCS#12"
-#: ../libnm-core/nm-setting-8021x.c:2603 ../libnm-core/nm-setting-8021x.c:2637
+#: ../libnm-core/nm-setting-8021x.c:2687
+#, c-format
+msgid "certificate is invalid: %s"
+msgstr "certyfikat jest nieprawidłowy: %s"
+
+#: ../libnm-core/nm-setting-8021x.c:2722
#: ../libnm-core/nm-setting-bluetooth.c:130
#: ../libnm-core/nm-setting-infiniband.c:193
#: ../libnm-core/nm-setting-infiniband.c:208
#: ../libnm-core/nm-setting-ip4-config.c:169
#: ../libnm-core/nm-setting-ip6-config.c:166
#: ../libnm-core/nm-setting-olpc-mesh.c:142
-#: ../libnm-core/nm-setting-wimax.c:135 ../libnm-core/nm-setting-wired.c:621
-#: ../libnm-core/nm-setting-wired.c:631
-#: ../libnm-core/nm-setting-wireless-security.c:943
-#: ../libnm-core/nm-setting-wireless-security.c:952
-#: ../libnm-core/nm-setting-wireless-security.c:960
-#: ../libnm-core/nm-setting-wireless-security.c:968
-#: ../libnm-core/nm-setting-wireless-security.c:976
-#: ../libnm-core/nm-setting-wireless-security.c:985
-#: ../libnm-core/nm-setting-wireless-security.c:994
-#: ../libnm-core/nm-setting-wireless-security.c:1003
-#: ../libnm-core/nm-setting-wireless-security.c:1039
-#: ../libnm-core/nm-setting-wireless-security.c:1049
+#: ../libnm-core/nm-setting-wimax.c:135 ../libnm-core/nm-setting-wired.c:618
+#: ../libnm-core/nm-setting-wired.c:628
+#: ../libnm-core/nm-setting-wireless-security.c:935
+#: ../libnm-core/nm-setting-wireless-security.c:944
+#: ../libnm-core/nm-setting-wireless-security.c:953
+#: ../libnm-core/nm-setting-wireless-security.c:989
+#: ../libnm-core/nm-setting-wireless-security.c:999
#: ../libnm-core/nm-setting-wireless.c:755
#: ../libnm-core/nm-setting-wireless.c:764
-#: ../libnm-core/nm-setting-wireless.c:773 ../libnm-util/nm-setting.c:1376
-#: ../libnm-util/nm-setting.c:1394 ../libnm-util/nm-setting.c:1413
-#: ../libnm-util/nm-setting-8021x.c:2630 ../libnm-util/nm-setting-8021x.c:2664
+#: ../libnm-core/nm-setting-wireless.c:773 ../libnm-util/nm-setting.c:1382
+#: ../libnm-util/nm-setting.c:1400 ../libnm-util/nm-setting.c:1419
+#: ../libnm-util/nm-setting-8021x.c:2656 ../libnm-util/nm-setting-8021x.c:2690
#: ../libnm-util/nm-setting-bluetooth.c:152
#: ../libnm-util/nm-setting-infiniband.c:206
#: ../libnm-util/nm-setting-infiniband.c:222
#: ../libnm-util/nm-setting-ip4-config.c:908
-#: ../libnm-util/nm-setting-ip6-config.c:888
+#: ../libnm-util/nm-setting-ip6-config.c:890
#: ../libnm-util/nm-setting-olpc-mesh.c:152
-#: ../libnm-util/nm-setting-wimax.c:157 ../libnm-util/nm-setting-wired.c:662
-#: ../libnm-util/nm-setting-wired.c:671
-#: ../libnm-util/nm-setting-wireless-security.c:973
-#: ../libnm-util/nm-setting-wireless-security.c:982
-#: ../libnm-util/nm-setting-wireless-security.c:990
-#: ../libnm-util/nm-setting-wireless-security.c:998
-#: ../libnm-util/nm-setting-wireless-security.c:1006
-#: ../libnm-util/nm-setting-wireless-security.c:1015
-#: ../libnm-util/nm-setting-wireless-security.c:1024
-#: ../libnm-util/nm-setting-wireless-security.c:1033
-#: ../libnm-util/nm-setting-wireless-security.c:1069
-#: ../libnm-util/nm-setting-wireless-security.c:1079
+#: ../libnm-util/nm-setting-wimax.c:157 ../libnm-util/nm-setting-wired.c:659
+#: ../libnm-util/nm-setting-wired.c:668
+#: ../libnm-util/nm-setting-wireless-security.c:965
+#: ../libnm-util/nm-setting-wireless-security.c:974
+#: ../libnm-util/nm-setting-wireless-security.c:983
+#: ../libnm-util/nm-setting-wireless-security.c:1019
+#: ../libnm-util/nm-setting-wireless-security.c:1029
#: ../libnm-util/nm-setting-wireless.c:812
#: ../libnm-util/nm-setting-wireless.c:821
#: ../libnm-util/nm-setting-wireless.c:830
msgid "property is invalid"
msgstr "właściwość jest nieprawidłowa"
-#: ../libnm-core/nm-setting-8021x.c:2662 ../libnm-core/nm-setting-8021x.c:2672
-#: ../libnm-core/nm-setting-8021x.c:2682 ../libnm-core/nm-setting-8021x.c:2692
-#: ../libnm-core/nm-setting-8021x.c:2702 ../libnm-core/nm-setting-adsl.c:218
-#: ../libnm-core/nm-setting-adsl.c:230
+#: ../libnm-core/nm-setting-8021x.c:2747 ../libnm-core/nm-setting-8021x.c:2757
+#: ../libnm-core/nm-setting-8021x.c:2767 ../libnm-core/nm-setting-8021x.c:2777
+#: ../libnm-core/nm-setting-8021x.c:2787 ../libnm-core/nm-setting-adsl.c:209
+#: ../libnm-core/nm-setting-adsl.c:221
#: ../libnm-core/nm-setting-bluetooth.c:147
#: ../libnm-core/nm-setting-wireless-security.c:871
-#: ../libnm-util/nm-setting-8021x.c:2689 ../libnm-util/nm-setting-8021x.c:2699
-#: ../libnm-util/nm-setting-8021x.c:2709 ../libnm-util/nm-setting-8021x.c:2719
-#: ../libnm-util/nm-setting-8021x.c:2729 ../libnm-util/nm-setting-adsl.c:238
-#: ../libnm-util/nm-setting-adsl.c:250
+#: ../libnm-util/nm-setting-8021x.c:2715 ../libnm-util/nm-setting-8021x.c:2725
+#: ../libnm-util/nm-setting-8021x.c:2735 ../libnm-util/nm-setting-8021x.c:2745
+#: ../libnm-util/nm-setting-8021x.c:2755 ../libnm-util/nm-setting-adsl.c:229
+#: ../libnm-util/nm-setting-adsl.c:241
#: ../libnm-util/nm-setting-bluetooth.c:169
#: ../libnm-util/nm-setting-wireless-security.c:901
#, c-format
@@ -7099,9 +7391,9 @@ msgstr ""
msgid "value '%d' is out of range <%d-%d>"
msgstr "wartość \"%d\" jest poza zakresem <%d-%d>"
-#: ../libnm-core/nm-setting-bridge.c:227 ../libnm-core/nm-setting-wired.c:595
-#: ../libnm-core/nm-setting-wired.c:655 ../libnm-util/nm-setting-bridge.c:287
-#: ../libnm-util/nm-setting-wired.c:637 ../libnm-util/nm-setting-wired.c:695
+#: ../libnm-core/nm-setting-bridge.c:227 ../libnm-core/nm-setting-wired.c:592
+#: ../libnm-core/nm-setting-wired.c:652 ../libnm-util/nm-setting-bridge.c:287
+#: ../libnm-util/nm-setting-wired.c:634 ../libnm-util/nm-setting-wired.c:692
msgid "is not a valid MAC address"
msgstr "nie jest prawidłowym adresem MAC"
@@ -7109,43 +7401,45 @@ msgstr "nie jest prawidłowym adresem MAC"
msgid "property is empty'"
msgstr "właściwość jest pusta\""
-#: ../libnm-core/nm-setting-connection.c:747
+#: ../libnm-core/nm-setting-connection.c:769
#, c-format
msgid "setting required for connection of type '%s'"
msgstr "wymagane jest ustawienie dla połączenia typu \"%s\"."
-#: ../libnm-core/nm-setting-connection.c:828
+#: ../libnm-core/nm-setting-connection.c:850
#, c-format
msgid "connection type '%s' is not valid"
msgstr "typ połączenia \"%s\" jest nieprawidłowy"
-#: ../libnm-core/nm-setting-connection.c:863
+#: ../libnm-core/nm-setting-connection.c:885
#: ../libnm-util/nm-setting-connection.c:878
#, c-format
msgid "Unknown slave type '%s'"
msgstr "Nieznany typ podrzędny \"%s\""
-#: ../libnm-core/nm-setting-connection.c:873
+#: ../libnm-core/nm-setting-connection.c:895
+#: ../libnm-util/nm-setting-connection.c:888
#, c-format
msgid "Slave connections need a valid '%s' property"
msgstr "Połączenia podrzędne wymagają prawidłowej właściwości \"%s\""
-#: ../libnm-core/nm-setting-connection.c:894
+#: ../libnm-core/nm-setting-connection.c:916
+#: ../libnm-util/nm-setting-connection.c:898
#, c-format
msgid "Cannot set '%s' without '%s'"
msgstr "Nie można ustawić \"%s\" bez \"%s\""
-#: ../libnm-core/nm-setting-connection.c:917
+#: ../libnm-core/nm-setting-connection.c:939
#, c-format
msgid "property type should be set to '%s'"
msgstr "typ właściwości powinien zostać ustawiony na \"%s\""
-#: ../libnm-core/nm-setting-connection.c:932
+#: ../libnm-core/nm-setting-connection.c:954
#, c-format
msgid "slave-type '%s' requires a '%s' setting in the connection"
msgstr "slave-type \"%s\" wymaga ustawienia \"%s\" w połączeniu"
-#: ../libnm-core/nm-setting-connection.c:942
+#: ../libnm-core/nm-setting-connection.c:964
#, c-format
msgid ""
"Detect a slave connection with '%s' set and a port type '%s'. '%s' should be "
@@ -7194,7 +7488,7 @@ msgstr "wartość właściwości \"%s\" jest pusta lub za długa (>64)"
msgid "'%s' contains invalid char(s) (use [A-Za-z._-])"
msgstr "\"%s\" zawiera nieprawidłowe znaki (należy używać [A-Za-z._-])"
-#: ../libnm-core/nm-setting-gsm.c:306 ../libnm-util/nm-setting-gsm.c:363
+#: ../libnm-core/nm-setting-gsm.c:297 ../libnm-util/nm-setting-gsm.c:354
#, c-format
msgid "'%s' length is invalid (should be 5 or 6 digits)"
msgstr "długość \"%s\" jest nieprawidłowa (powinna mieć 5 lub 6 cyfr)"
@@ -7284,7 +7578,6 @@ msgid "gateway is invalid"
msgstr "brama jest nieprawidłowa"
#: ../libnm-core/nm-setting-ip-config.c:1935
-#: ../libnm-util/nm-setting-ip4-config.c:966
#, c-format
msgid "%d. route is invalid"
msgstr "%d. trasa jest nieprawidłowa"
@@ -7297,7 +7590,7 @@ msgstr "%d trasa nie może być domyślną trasą"
#: ../libnm-core/nm-setting-ip4-config.c:123
#: ../libnm-core/nm-setting-ip6-config.c:121
#: ../libnm-util/nm-setting-ip4-config.c:862
-#: ../libnm-util/nm-setting-ip6-config.c:843
+#: ../libnm-util/nm-setting-ip6-config.c:845
#, c-format
msgid "this property cannot be empty for '%s=%s'"
msgstr "ta właściwość nie może być pusta dla \"%s=%s\""
@@ -7311,15 +7604,15 @@ msgstr "ta właściwość nie może być pusta dla \"%s=%s\""
#: ../libnm-util/nm-setting-ip4-config.c:874
#: ../libnm-util/nm-setting-ip4-config.c:884
#: ../libnm-util/nm-setting-ip4-config.c:896
-#: ../libnm-util/nm-setting-ip6-config.c:856
-#: ../libnm-util/nm-setting-ip6-config.c:866
-#: ../libnm-util/nm-setting-ip6-config.c:876
+#: ../libnm-util/nm-setting-ip6-config.c:858
+#: ../libnm-util/nm-setting-ip6-config.c:868
+#: ../libnm-util/nm-setting-ip6-config.c:878
#, c-format
msgid "this property is not allowed for '%s=%s'"
msgstr "ta właściwość nie jest dozwolona dla \"%s=%s\""
#: ../libnm-core/nm-setting-ip6-config.c:133
-#: ../libnm-util/nm-setting-ip6-config.c:855
+#: ../libnm-util/nm-setting-ip6-config.c:857
#, c-format
msgid "'%s' not allowed for %s=%s"
msgstr "\"%s\" nie jest dozwolone dla %s=%s"
@@ -7382,7 +7675,7 @@ msgstr "ustawienie zawierało hasło o pustej nazwie"
msgid "secret value was empty"
msgstr "wartość hasła jest pusta"
-#: ../libnm-core/nm-setting-vpn.c:526 ../libnm-core/nm-setting.c:1606
+#: ../libnm-core/nm-setting-vpn.c:526 ../libnm-core/nm-setting.c:1650
msgid "not a secret property"
msgstr "nie jest właściwością hasła"
@@ -7399,17 +7692,17 @@ msgstr "przekonwertowanie wartości \"%s\" na uint się nie powiodło"
msgid "secret flags property not found"
msgstr "nie odnaleziono właściwości flag hasła"
-#: ../libnm-core/nm-setting-wired.c:575 ../libnm-util/nm-setting-wired.c:617
+#: ../libnm-core/nm-setting-wired.c:572 ../libnm-util/nm-setting-wired.c:614
#, c-format
msgid "'%s' is not a valid Ethernet port value"
msgstr "\"%s\" nie jest prawidłową wartością portu Ethernet"
-#: ../libnm-core/nm-setting-wired.c:585 ../libnm-util/nm-setting-wired.c:627
+#: ../libnm-core/nm-setting-wired.c:582 ../libnm-util/nm-setting-wired.c:624
#, c-format
msgid "'%s' is not a valid duplex value"
msgstr "\"%s\" nie jest prawidłową wartością dupleksu"
-#: ../libnm-core/nm-setting-wired.c:644 ../libnm-util/nm-setting-wired.c:684
+#: ../libnm-core/nm-setting-wired.c:641 ../libnm-util/nm-setting-wired.c:681
#, c-format
msgid "invalid '%s' or its value '%s'"
msgstr "nieprawidłowe \"%s\" lub jego wartość \"%s\""
@@ -7420,26 +7713,26 @@ msgstr "nieprawidłowe \"%s\" lub jego wartość \"%s\""
msgid "'%s' security requires '%s=%s'"
msgstr "zabezpieczenie \"%s\" wymaga \"%s=%s\""
-#: ../libnm-core/nm-setting-wireless-security.c:912
-#: ../libnm-util/nm-setting-wireless-security.c:942
+#: ../libnm-core/nm-setting-wireless-security.c:904
+#: ../libnm-util/nm-setting-wireless-security.c:934
#, c-format
msgid "'%s' security requires '%s' setting presence"
msgstr "zabezpieczenie \"%s\" wymaga obecności ustawienia \"%s\""
-#: ../libnm-core/nm-setting-wireless-security.c:933
-#: ../libnm-util/nm-setting-wireless-security.c:963
+#: ../libnm-core/nm-setting-wireless-security.c:925
+#: ../libnm-util/nm-setting-wireless-security.c:955
#, c-format
msgid "'%d' value is out of range <0-3>"
msgstr "wartość \"%d\" jest poza zakresem <0-3>"
-#: ../libnm-core/nm-setting-wireless-security.c:1030
-#: ../libnm-util/nm-setting-wireless-security.c:1060
+#: ../libnm-core/nm-setting-wireless-security.c:980
+#: ../libnm-util/nm-setting-wireless-security.c:1010
#, c-format
msgid "'%s' connections require '%s' in this property"
msgstr "połączenia \"%s\" wymagają \"%s\" w tej właściwości"
-#: ../libnm-core/nm-setting-wireless-security.c:1060
-#: ../libnm-util/nm-setting-wireless-security.c:1090
+#: ../libnm-core/nm-setting-wireless-security.c:1010
+#: ../libnm-util/nm-setting-wireless-security.c:1040
#, c-format
msgid "'%s' can only be used with '%s=%s' (WEP)"
msgstr "\"%s\" może być używane tylko z \"%s=%s\" (WEP)"
@@ -7461,41 +7754,41 @@ msgstr "\"%s\" nie jest prawidłowym pasmem"
msgid "'%s' requires setting '%s' property"
msgstr "\"%s\" wymaga ustawienia właściwości \"%s\""
-#: ../libnm-core/nm-setting.c:827
+#: ../libnm-core/nm-setting.c:833
#, c-format
msgid "can't set property of type '%s' from value of type '%s'"
msgstr "nie można ustawić właściwości typu \"%s\" z wartości typu \"%s\""
-#: ../libnm-core/nm-setting.c:1504
+#: ../libnm-core/nm-setting.c:1548
msgid "secret not found"
msgstr "nie odnaleziono hasła"
-#: ../libnm-core/nm-setting.c:1596
+#: ../libnm-core/nm-setting.c:1640
msgid "secret is not set"
msgstr "nie ustawiono hasła"
-#: ../libnm-core/nm-utils.c:2275 ../libnm-util/nm-utils.c:1813
+#: ../libnm-core/nm-utils.c:2465 ../libnm-util/nm-utils.c:1813
#, c-format
msgid "Could not find \"%s\" binary"
msgstr "Nie można odnaleźć pliku binarnego \"%s\""
-#: ../libnm-glib/nm-device.c:1793 ../libnm/nm-device.c:1615
+#: ../libnm-glib/nm-device.c:1793 ../libnm/nm-device.c:1618
msgid "Bluetooth"
msgstr "Bluetooth"
-#: ../libnm-glib/nm-device.c:1811 ../libnm/nm-device.c:1633
+#: ../libnm-glib/nm-device.c:1811 ../libnm/nm-device.c:1636
msgid "ADSL"
msgstr "ADSL"
-#: ../libnm-glib/nm-device.c:1839 ../libnm/nm-device.c:1661
+#: ../libnm-glib/nm-device.c:1839 ../libnm/nm-device.c:1664
msgid "Wired"
msgstr "Przewodowe"
-#: ../libnm-glib/nm-device.c:1870 ../libnm/nm-device.c:1692
+#: ../libnm-glib/nm-device.c:1870 ../libnm/nm-device.c:1695
msgid "PCI"
msgstr "PCI"
-#: ../libnm-glib/nm-device.c:1872 ../libnm/nm-device.c:1694
+#: ../libnm-glib/nm-device.c:1872 ../libnm/nm-device.c:1697
msgid "USB"
msgstr "USB"
@@ -7506,7 +7799,7 @@ msgstr "USB"
#. * the strings otherwise.
#.
#: ../libnm-glib/nm-device.c:1968 ../libnm-glib/nm-device.c:1987
-#: ../libnm/nm-device.c:1788 ../libnm/nm-device.c:1807
+#: ../libnm/nm-device.c:1791 ../libnm/nm-device.c:1810
#, c-format
msgctxt "long device name"
msgid "%s %s"
@@ -7541,14 +7834,6 @@ msgstr "wymaga ustawienia \"%s\" lub \"%s\""
msgid "requires presence of '%s' setting in the connection"
msgstr "wymaga obecności ustawienia \"%s\" w połączeniu"
-#: ../libnm-util/nm-setting-connection.c:888
-msgid "Slave connections need a valid '"
-msgstr "Połączenia podrzędne wymagają prawidłowego \""
-
-#: ../libnm-util/nm-setting-connection.c:897
-msgid "Cannot set '"
-msgstr "Nie można ustawić \""
-
#: ../libnm-util/nm-setting-ip4-config.c:940
#, c-format
msgid "%d. IPv4 address is invalid"
@@ -7559,11 +7844,22 @@ msgstr "%d. adres IPv4 jest nieprawidłowy"
msgid "%d. IPv4 address has invalid prefix"
msgstr "%d. adres IPv4 posiada nieprawidłowy przedrostek"
-#: ../libnm-util/nm-setting-ip4-config.c:976
+#: ../libnm-util/nm-setting-ip4-config.c:966
+#: ../libnm-util/nm-setting-ip6-config.c:939
#, c-format
msgid "%d. route has invalid prefix"
msgstr "%d. trasa posiada nieprawidłowy przedrostek"
+#: ../libnm-util/nm-setting-ip6-config.c:913
+#, c-format
+msgid "%d. IPv6 address is invalid"
+msgstr "%d. adres IPv6 jest nieprawidłowy"
+
+#: ../libnm-util/nm-setting-ip6-config.c:923
+#, c-format
+msgid "%d. IPv6 address has invalid prefix"
+msgstr "%d. adres IPv6 posiada nieprawidłowy przedrostek"
+
#: ../libnm-util/nm-setting-vpn.c:583
#, c-format
msgid "Failed to convert '%s' value '%s' to uint"
@@ -7685,12 +7981,12 @@ msgstr ""
msgid "The connection was not a WiMAX connection."
msgstr "Połączenie nie jest połączeniem WiMAX."
-#: ../libnm/nm-device.c:2133
+#: ../libnm/nm-device.c:2136
#, c-format
msgid "The connection was not valid: %s"
msgstr "Połączenie jest nieprawidłowe: %s"
-#: ../libnm/nm-device.c:2142
+#: ../libnm/nm-device.c:2145
#, c-format
msgid "The interface names of the device and the connection didn't match."
msgstr "Nazwy interfejsu urządzenia i połączenia się nie zgadzają."
@@ -7703,7 +7999,7 @@ msgstr "Nie można podłączyć aktywnego połączenia do urządzenia"
msgid "Active connection removed before it was initialized"
msgstr "Usunięto aktywne połączenie przed jego inicjacją"
-#: ../libnm/nm-object.c:1439 ../libnm/nm-object.c:1585
+#: ../libnm/nm-object.c:1442 ../libnm/nm-object.c:1588
msgid "Caller did not specify D-Bus path for object"
msgstr "Dzwoniący nie podał ścieżki D-Bus do obiektu"
@@ -7825,57 +8121,49 @@ msgstr ""
#. * as "Wired Connection" or "VPN Connection". The %d is a number
#. * that is combined with the first argument to create a unique
#. * connection id.
-#: ../src/NetworkManagerUtils.c:1139
+#: ../src/NetworkManagerUtils.c:1660
#, c-format
msgctxt "connection id fallback"
msgid "%s %d"
msgstr "%s %d"
#. Logging/debugging
-#: ../src/main.c:221 ../src/nm-iface-helper.c:310
+#: ../src/main.c:235 ../src/nm-iface-helper.c:299
msgid "Print NetworkManager version and exit"
msgstr "Wyświetla wersję usługi NetworkManager i kończy działanie"
-#: ../src/main.c:222 ../src/nm-iface-helper.c:311
+#: ../src/main.c:236 ../src/nm-iface-helper.c:300
msgid "Don't become a daemon"
msgstr "Bez zmiany w usługę"
-#: ../src/main.c:223 ../src/nm-iface-helper.c:312
+#: ../src/main.c:237 ../src/nm-iface-helper.c:301
msgid "Don't become a daemon, and log to stderr"
msgstr ""
"Bez zmiany w usługę i zapisywanie dziennika do standardowego wyjścia błędów"
-#: ../src/main.c:224 ../src/nm-iface-helper.c:313
+#: ../src/main.c:238 ../src/nm-iface-helper.c:302
#, c-format
msgid "Log level: one of [%s]"
msgstr "Poziom dziennika: jeden z [%s]"
-#: ../src/main.c:226 ../src/nm-iface-helper.c:315
+#: ../src/main.c:240 ../src/nm-iface-helper.c:304
#, c-format
msgid "Log domains separated by ',': any combination of [%s]"
msgstr "Domeny dziennika oddzielone przez \",\": dowolne połączenie [%s]"
-#: ../src/main.c:228 ../src/nm-iface-helper.c:317
+#: ../src/main.c:242 ../src/nm-iface-helper.c:306
msgid "Make all warnings fatal"
msgstr "Wszystkie ostrzeżenia jako krytyczne"
-#: ../src/main.c:229
+#: ../src/main.c:243
msgid "Specify the location of a PID file"
msgstr "Podaje położenie pliku PID"
-#: ../src/main.c:229
-msgid "filename"
-msgstr "nazwa pliku"
-
-#: ../src/main.c:230
+#: ../src/main.c:244
msgid "State file location"
msgstr "Położenie pliku stanu"
-#: ../src/main.c:230
-msgid "/path/to/state.file"
-msgstr "/ścieżka/do/pliku.stanu"
-
-#: ../src/main.c:244
+#: ../src/main.c:256
msgid ""
"NetworkManager monitors all network connections and automatically\n"
"chooses the best connection to use. It also allows the user to\n"
@@ -7887,84 +8175,74 @@ msgstr ""
"wybranie bezprzewodowych punktów dostępowych, z którymi karty\n"
"sieciowe w komputerze powinny być powiązane."
-#: ../src/main.c:257 ../src/main-utils.c:271 ../src/nm-iface-helper.c:346
+#: ../src/main.c:346 ../src/main-utils.c:246 ../src/nm-iface-helper.c:383
#, c-format
msgid "%s. Please use --help to see a list of valid options.\n"
msgstr "%s. Parametr --help wyświetli listę prawidłowych opcji.\n"
-#: ../src/main.c:262 ../src/nm-iface-helper.c:351
+#: ../src/main.c:351 ../src/nm-iface-helper.c:388
#, c-format
msgid "Ignoring unrecognized log domain(s) '%s' passed on command line.\n"
msgstr ""
"Ignorowanie nierozpoznanych domen dziennika \"%s\" przekazanych w wierszu "
"poleceń.\n"
-#: ../src/main.c:307
+#: ../src/main.c:361
#, c-format
msgid "Failed to read configuration: (%d) %s\n"
msgstr "Odczytanie konfiguracji się nie powiodło: (%d) %s\n"
-#: ../src/main.c:321
+#: ../src/main.c:377
#, c-format
msgid "Error in configuration file: %s.\n"
msgstr "Błąd w pliku konfiguracji: %s.\n"
-#: ../src/main.c:326
+#: ../src/main.c:382
#, c-format
msgid "Ignoring unrecognized log domain(s) '%s' from config files.\n"
msgstr ""
"Ignorowanie nierozpoznanych domen dziennika \"%s\" z plików konfiguracji.\n"
-#: ../src/main.c:334
-#, c-format
-msgid "State file %s parsing failed: (%d) %s\n"
-msgstr "Przetworzenie pliku stanu %s się nie powiodło: (%d) %s\n"
-
-#: ../src/main.c:347 ../src/nm-iface-helper.c:368
+#: ../src/main.c:393 ../src/nm-iface-helper.c:398
#, c-format
msgid "Could not daemonize: %s [error %u]\n"
msgstr "Nie można zmienić w usługę: %s [błąd %u]\n"
-#: ../src/main-utils.c:115
-#, c-format
-msgid "Failed to set signal mask: %d"
-msgstr "Ustawienie maski sygnału nie powiodło: %d"
-
-#: ../src/main-utils.c:124
-#, c-format
-msgid "Failed to create signal handling thread: %d"
-msgstr "Utworzenie wątku obsługującego sygnały się nie powiodło: %d"
-
-#: ../src/main-utils.c:139
+#: ../src/main-utils.c:101
#, c-format
msgid "Opening %s failed: %s\n"
msgstr "Otwarcie %s się nie powiodło: %s\n"
-#: ../src/main-utils.c:145
+#: ../src/main-utils.c:107
#, c-format
msgid "Writing to %s failed: %s\n"
msgstr "Zapisanie do %s się nie powiodło: %s\n"
-#: ../src/main-utils.c:150
+#: ../src/main-utils.c:112
#, c-format
msgid "Closing %s failed: %s\n"
msgstr "Zamknięcie %s się nie powiodło: %s\n"
-#: ../src/main-utils.c:206
+#: ../src/main-utils.c:122
+#, c-format
+msgid "Cannot create '%s': %s"
+msgstr "Nie można utworzyć \"%s\": %s"
+
+#: ../src/main-utils.c:174
#, c-format
msgid "%s is already running (pid %ld)\n"
msgstr "%s jest już uruchomione (PID %ld)\n"
-#: ../src/main-utils.c:248
+#: ../src/main-utils.c:184
#, c-format
msgid "You must be root to run %s!\n"
msgstr "Tylko root może uruchamiać %s.\n"
-#: ../src/dhcp-manager/nm-dhcp-dhclient-utils.c:205
+#: ../src/dhcp-manager/nm-dhcp-dhclient-utils.c:210
msgid "# Created by NetworkManager\n"
msgstr "# Utworzony przez usługę NetworkManager\n"
-#: ../src/dhcp-manager/nm-dhcp-dhclient-utils.c:212
+#: ../src/dhcp-manager/nm-dhcp-dhclient-utils.c:217
#, c-format
msgid ""
"# Merged from %s\n"
@@ -7982,11 +8260,11 @@ msgstr "Nie odnaleziono lub nie włączono obsługi \"%s\"."
msgid "no usable DHCP client could be found."
msgstr "nie odnaleziono używalnego klienta DHCP."
-#: ../src/dns-manager/nm-dns-manager.c:374
+#: ../src/dns-manager/nm-dns-manager.c:364
msgid "NOTE: the libc resolver may not support more than 3 nameservers."
msgstr "UWAGA: obsługa nazw libc nie obsługuje więcej niż 3 serwery nazw."
-#: ../src/dns-manager/nm-dns-manager.c:376
+#: ../src/dns-manager/nm-dns-manager.c:366
msgid "The nameservers listed below may not be recognized."
msgstr "Poniższe serwery nazw nie mogą nie zostać rozpoznane."
@@ -7999,45 +8277,45 @@ msgstr "Połączenie ADSL"
msgid "%s Network"
msgstr "Sieć %s"
-#: ../src/devices/bluetooth/nm-device-bt.c:254
+#: ../src/devices/bluetooth/nm-device-bt.c:255
msgid "PAN requested, but Bluetooth device does not support NAP"
msgstr "Zażądano PAN, ale urządzenie Bluetooth nie obsługuje NAP"
-#: ../src/devices/bluetooth/nm-device-bt.c:264
+#: ../src/devices/bluetooth/nm-device-bt.c:265
msgid "PAN connections cannot specify GSM, CDMA, or serial settings"
msgstr "Połączenia PAN nie mogą podawać ustawień GSM, CDMA lub szeregowych"
-#: ../src/devices/bluetooth/nm-device-bt.c:277
+#: ../src/devices/bluetooth/nm-device-bt.c:278
msgid "PAN connection"
msgstr "Połączenie PAN"
-#: ../src/devices/bluetooth/nm-device-bt.c:284
+#: ../src/devices/bluetooth/nm-device-bt.c:285
msgid "DUN requested, but Bluetooth device does not support DUN"
msgstr "Zażądano DUN, ale urządzenie Bluetooth go nie obsługuje"
-#: ../src/devices/bluetooth/nm-device-bt.c:294
+#: ../src/devices/bluetooth/nm-device-bt.c:295
msgid "DUN connection must include a GSM or CDMA setting"
msgstr "Połączenie DUN musi zawierać ustawienie GSM lub CDMA"
-#: ../src/devices/bluetooth/nm-device-bt.c:304
-#: ../src/devices/wwan/nm-modem-broadband.c:488
+#: ../src/devices/bluetooth/nm-device-bt.c:305
+#: ../src/devices/wwan/nm-modem-broadband.c:540
msgid "GSM connection"
msgstr "Połączenie GSM"
-#: ../src/devices/bluetooth/nm-device-bt.c:308
-#: ../src/devices/wwan/nm-modem-broadband.c:511
+#: ../src/devices/bluetooth/nm-device-bt.c:309
+#: ../src/devices/wwan/nm-modem-broadband.c:563
msgid "CDMA connection"
msgstr "Połączenie CDMA"
-#: ../src/devices/bluetooth/nm-device-bt.c:316
+#: ../src/devices/bluetooth/nm-device-bt.c:317
msgid "Unknown/unhandled Bluetooth connection type"
msgstr "Nieznany/nieobsługiwany typ połączenia Bluetooth"
-#: ../src/devices/bluetooth/nm-device-bt.c:336
-#: ../src/devices/nm-device-ethernet.c:1442
-#: ../src/devices/nm-device-infiniband.c:196
-#: ../src/devices/wifi/nm-device-wifi.c:1123
-#: ../src/devices/wimax/nm-device-wimax.c:450
+#: ../src/devices/bluetooth/nm-device-bt.c:337
+#: ../src/devices/nm-device-ethernet.c:1376
+#: ../src/devices/nm-device-infiniband.c:204
+#: ../src/devices/wifi/nm-device-wifi.c:1115
+#: ../src/devices/wimax/nm-device-wimax.c:454
msgid "connection does not match device"
msgstr "połączenie nie pasuje do urządzenia"
@@ -8045,15 +8323,15 @@ msgstr "połączenie nie pasuje do urządzenia"
msgid "Bond connection"
msgstr "Połączenie wiązane"
-#: ../src/devices/nm-device-bridge.c:131
+#: ../src/devices/nm-device-bridge.c:130
msgid "Bridge connection"
msgstr "Połączenie mostkowane"
-#: ../src/devices/nm-device-ethernet.c:1425
+#: ../src/devices/nm-device-ethernet.c:1357
msgid "PPPoE connection"
msgstr "Połączenie PPPoE"
-#: ../src/devices/nm-device-ethernet.c:1425
+#: ../src/devices/nm-device-ethernet.c:1357
msgid "Wired connection"
msgstr "Połączenie przewodowe"
@@ -8062,15 +8340,15 @@ msgstr "Połączenie przewodowe"
msgid "Wired connection %d"
msgstr "Połączenie przewodowe %d"
-#: ../src/devices/nm-device-infiniband.c:178
+#: ../src/devices/nm-device-infiniband.c:186
msgid "InfiniBand connection"
msgstr "Połączenie InfiniBand"
-#: ../src/devices/nm-device-vlan.c:218
+#: ../src/devices/nm-device-vlan.c:306
msgid "VLAN connection"
msgstr "Połączenie VLAN"
-#: ../src/devices/team/nm-device-team.c:132
+#: ../src/devices/team/nm-device-team.c:133
msgid "Team connection"
msgstr "Połączenie zespołowe"
@@ -8078,7 +8356,7 @@ msgstr "Połączenie zespołowe"
msgid "Mesh"
msgstr "Sieć kratowa"
-#: ../src/devices/wifi/nm-device-wifi.c:1093
+#: ../src/devices/wifi/nm-device-wifi.c:1083
msgid "WPA Ad-Hoc disabled due to kernel bugs"
msgstr "Wyłączono WPA Ad-Hoc z powodu błędów jądra"
@@ -8245,121 +8523,113 @@ msgstr ""
msgid "Failed to determine AP security information"
msgstr "Ustalenie informacji o zabezpieczeniach AP się nie powiodło"
-#: ../src/devices/wwan/nm-modem-broadband.c:475
+#: ../src/devices/wwan/nm-modem-broadband.c:527
msgid "GSM mobile broadband connection requires a 'gsm' setting"
msgstr "Połączenie komórkowe GSM wymaga ustawienia \"gsm\""
-#: ../src/nm-config.c:356
+#: ../src/nm-config.c:463
msgid "Config file location"
msgstr "Położenie pliku konfiguracji"
-#: ../src/nm-config.c:356
-msgid "/path/to/config.file"
-msgstr "/ścieżka/do/pliku.konfiguracji"
-
-#: ../src/nm-config.c:357
+#: ../src/nm-config.c:464
msgid "Config directory location"
msgstr "Położenie katalogu konfiguracji"
-#: ../src/nm-config.c:357
-msgid "/path/to/config/dir"
-msgstr "/ścieżka/do/katalogu/konfiguracji"
+#: ../src/nm-config.c:465
+msgid "State file for no-auto-default devices"
+msgstr "Plik stanu dla urządzeń \"no-auto-default\""
-#: ../src/nm-config.c:359
+#: ../src/nm-config.c:466
msgid "List of plugins separated by ','"
msgstr "Lista wtyczek oddzielonych \",\""
-#: ../src/nm-config.c:359
-msgid "plugin1,plugin2"
-msgstr "wtyczka1,wtyczka2"
+#: ../src/nm-config.c:467
+msgid "Quit after initial configuration"
+msgstr "Kończy działanie po początkowej konfiguracji"
#. These three are hidden for now, and should eventually just go away.
-#: ../src/nm-config.c:362
+#: ../src/nm-config.c:470
msgid "An http(s) address for checking internet connectivity"
msgstr "Adres http(s) do sprawdzania łączności internetowej"
-#: ../src/nm-config.c:363
+#: ../src/nm-config.c:471
msgid "The interval between connectivity checks (in seconds)"
msgstr "Czas między sprawdzaniem łączności (w sekundach)"
-#: ../src/nm-config.c:364
+#: ../src/nm-config.c:472
msgid "The expected start of the response"
msgstr "Oczekiwany początek odpowiedzi"
-#: ../src/nm-config.c:364
-msgid "Bingo!"
-msgstr "Bingo!"
-
#. Interface/IP config
-#: ../src/nm-iface-helper.c:296
+#: ../src/nm-iface-helper.c:285
msgid "The interface to manage"
msgstr "Interfejs do zarządzania"
-#: ../src/nm-iface-helper.c:296
+#: ../src/nm-iface-helper.c:285
msgid "eth0"
msgstr "eth0"
-#: ../src/nm-iface-helper.c:297
+#: ../src/nm-iface-helper.c:286
msgid "Connection UUID"
msgstr "UUID połączenia"
-#: ../src/nm-iface-helper.c:297
+#: ../src/nm-iface-helper.c:286
msgid "661e8cd0-b618-46b8-9dc9-31a52baaa16b"
msgstr "661e8cd0-b618-46b8-9dc9-31a52baaa16b"
-#: ../src/nm-iface-helper.c:298
+#: ../src/nm-iface-helper.c:287
msgid "Whether to manage IPv6 SLAAC"
msgstr "Czy zarządzać SLAAC IPv6"
-#: ../src/nm-iface-helper.c:299
+#: ../src/nm-iface-helper.c:288
msgid "Whether SLAAC must be successful"
msgstr "Czy SLAAC musi się powieść"
-#: ../src/nm-iface-helper.c:300
+#: ../src/nm-iface-helper.c:289
msgid "Use an IPv6 temporary privacy address"
msgstr "Użycie tymczasowego adresu prywatnego IPv6"
-#: ../src/nm-iface-helper.c:301
+#: ../src/nm-iface-helper.c:290
msgid "Current DHCPv4 address"
msgstr "Bieżący adres DHCPv4"
-#: ../src/nm-iface-helper.c:302
+#: ../src/nm-iface-helper.c:291
msgid "Whether DHCPv4 must be successful"
msgstr "Czy DHCPv4 musi się powieść"
-#: ../src/nm-iface-helper.c:303
+#: ../src/nm-iface-helper.c:292
msgid "Hex-encoded DHCPv4 client ID"
msgstr "Identyfikator klienta DHCPv4 zakodowany szesnastkowo"
-#: ../src/nm-iface-helper.c:304
+#: ../src/nm-iface-helper.c:293
msgid "Hostname to send to DHCP server"
msgstr "Nazwa komputera wysyłana do serwera DHCP"
-#: ../src/nm-iface-helper.c:304
+#: ../src/nm-iface-helper.c:293
msgid "barbar"
msgstr "barbar"
-#: ../src/nm-iface-helper.c:305
+#: ../src/nm-iface-helper.c:294
msgid "Route priority for IPv4"
msgstr "Priorytet trasy dla IPv4"
-#: ../src/nm-iface-helper.c:305
+#: ../src/nm-iface-helper.c:294
msgid "0"
msgstr "0"
-#: ../src/nm-iface-helper.c:306
+#: ../src/nm-iface-helper.c:295
msgid "Route priority for IPv6"
msgstr "Priorytet trasy dla IPv6"
-#: ../src/nm-iface-helper.c:306
+#: ../src/nm-iface-helper.c:295
msgid "1024"
msgstr "1024"
-#: ../src/nm-iface-helper.c:307
+#: ../src/nm-iface-helper.c:296
msgid "Hex-encoded Interface Identifier"
msgstr "Identyfikator interfejsu zakodowany szesnastkowo"
-#: ../src/nm-iface-helper.c:328
+#: ../src/nm-iface-helper.c:316
msgid ""
"nm-iface-helper is a small, standalone process that manages a single network "
"interface."
@@ -8367,17 +8637,17 @@ msgstr ""
"nm-iface-helper to mały, samodzielny proces zarządzający pojedynczym "
"interfejsem sieciowym."
-#: ../src/nm-iface-helper.c:337
+#: ../src/nm-iface-helper.c:364
#, c-format
msgid "An interface name and UUID are required\n"
msgstr "Wymagana jest nazwa interfejsu i UUID\n"
-#: ../src/nm-iface-helper.c:402
+#: ../src/nm-iface-helper.c:370
#, c-format
-msgid "Failed to find interface index for %s\n"
-msgstr "Odnalezienie indeksu interfejsu dla %s się nie powiodło\n"
+msgid "Failed to find interface index for %s (%s)\n"
+msgstr "Odnalezienie indeksu interfejsu dla %s (%s) się nie powiodło\n"
-#: ../src/nm-iface-helper.c:418
+#: ../src/nm-iface-helper.c:430
#, c-format
msgid "(%s): Invalid IID %s\n"
msgstr "(%s): nieprawidłowy IID %s\n"
@@ -8392,7 +8662,7 @@ msgstr "Nieznany poziom dziennika \"%s\""
msgid "Unknown log domain '%s'"
msgstr "Nieznana domena dziennika \"%s\""
-#: ../src/nm-manager.c:3413
+#: ../src/nm-manager.c:3367
msgid "VPN connection"
msgstr "Połączenie VPN"
@@ -8400,21 +8670,6 @@ msgstr "Połączenie VPN"
msgid "NetworkManager needs to turn off networks"
msgstr "Usługa NetworkManager musi wyłączyć sieci"
-#: ../src/settings/plugins/ibft/plugin.c:66
-#, c-format
-msgid "ibft: failed to read iscsiadm records: %s"
-msgstr "ibft: odczytanie wpisów iscsiadm się nie powiodło: %s"
-
-#: ../src/settings/plugins/ibft/plugin.c:74
-#, c-format
-msgid "ibft: read connection '%s'"
-msgstr "ibft: odczytanie połączenia \"%s\""
-
-#: ../src/settings/plugins/ibft/plugin.c:80
-#, c-format
-msgid "ibft: failed to read iscsiadm record: %s"
-msgstr "ibft: odczytanie wpisu iscsiadm się nie powiodło: %s"
-
#: ../src/settings/plugins/ifcfg-rh/reader.c:112
msgid "System"
msgstr "Systemowe"
diff --git a/policy/Makefile.in b/policy/Makefile.in
index f5242cd86..69d4d9c4a 100644
--- a/policy/Makefile.in
+++ b/policy/Makefile.in
@@ -166,6 +166,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -279,6 +280,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/Makefile.am b/src/Makefile.am
index a24ac6c4f..7339058c6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,7 +5,6 @@ include $(GLIB_MAKEFILE)
SUBDIRS = \
. \
devices/adsl \
- devices/wifi \
dhcp-manager \
ppp-manager \
settings/plugins
@@ -16,6 +15,10 @@ SUBDIRS += \
devices/bluetooth
endif
+if WITH_WIFI
+SUBDIRS += devices/wifi
+endif
+
if WITH_WIMAX
SUBDIRS += devices/wimax
endif
@@ -217,6 +220,10 @@ nm_sources = \
platform/nm-linux-platform.h \
platform/nm-platform.c \
platform/nm-platform.h \
+ platform/nm-platform-utils.c \
+ platform/nm-platform-utils.h \
+ platform/nmp-object.c \
+ platform/nmp-object.h \
platform/wifi/wifi-utils-nl80211.c \
platform/wifi/wifi-utils-nl80211.h \
platform/wifi/wifi-utils-private.h \
@@ -269,8 +276,6 @@ nm_sources = \
supplicant-manager/nm-supplicant-settings-verify.c \
supplicant-manager/nm-supplicant-settings-verify.h \
supplicant-manager/nm-supplicant-types.h \
- supplicant-manager/nm-call-store.c \
- supplicant-manager/nm-call-store.h \
\
vpn-manager/nm-vpn-connection.c \
vpn-manager/nm-vpn-connection.h \
@@ -285,6 +290,8 @@ nm_sources = \
nm-active-connection.h \
nm-config.c \
nm-config.h \
+ nm-config-data.c \
+ nm-config-data.h \
nm-connection-provider.c \
nm-connection-provider.h \
nm-connectivity.c \
@@ -293,6 +300,8 @@ nm_sources = \
nm-dbus-manager.h \
nm-dcb.c \
nm-dcb.h \
+ nm-route-manager.c \
+ nm-route-manager.h \
nm-default-route-manager.c \
nm-default-route-manager.h \
nm-dhcp4-config.c \
@@ -319,10 +328,10 @@ nm_sources = \
nm-auth-utils.h \
nm-manager.c \
nm-manager.h \
+ nm-multi-index.c \
+ nm-multi-index.h \
nm-policy.c \
nm-policy.h \
- nm-posix-signals.c \
- nm-posix-signals.h \
nm-properties-changed-signal.c \
nm-properties-changed-signal.h \
nm-rfkill-manager.c \
@@ -474,6 +483,10 @@ libnm_iface_helper_la_SOURCES = \
platform/nm-linux-platform.h \
platform/nm-platform.c \
platform/nm-platform.h \
+ platform/nm-platform-utils.c \
+ platform/nm-platform-utils.h \
+ platform/nmp-object.c \
+ platform/nmp-object.h \
platform/wifi/wifi-utils-nl80211.c \
platform/wifi/wifi-utils-nl80211.h \
platform/wifi/wifi-utils-private.h \
@@ -487,6 +500,9 @@ libnm_iface_helper_la_SOURCES = \
rdisc/nm-rdisc.c \
rdisc/nm-rdisc.h \
\
+ nm-route-manager.c \
+ nm-route-manager.h \
+ \
nm-ip4-config.c \
nm-ip4-config.h \
nm-ip6-config.c \
@@ -496,8 +512,8 @@ libnm_iface_helper_la_SOURCES = \
nm-enum-types.h \
nm-logging.c \
nm-logging.h \
- nm-posix-signals.c \
- nm-posix-signals.h \
+ nm-multi-index.c \
+ nm-multi-index.h \
NetworkManagerUtils.c \
NetworkManagerUtils.h
diff --git a/src/Makefile.in b/src/Makefile.in
index da3052097..2b9999691 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -94,9 +94,10 @@ host_triplet = @host@
@WITH_MODEM_MANAGER_1_TRUE@ devices/wwan \
@WITH_MODEM_MANAGER_1_TRUE@ devices/bluetooth
-@WITH_WIMAX_TRUE@am__append_2 = devices/wimax
-@WITH_TEAMDCTL_TRUE@am__append_3 = devices/team
-@ENABLE_TESTS_TRUE@am__append_4 = \
+@WITH_WIFI_TRUE@am__append_2 = devices/wifi
+@WITH_WIMAX_TRUE@am__append_3 = devices/wimax
+@WITH_TEAMDCTL_TRUE@am__append_4 = devices/team
+@ENABLE_TESTS_TRUE@am__append_5 = \
@ENABLE_TESTS_TRUE@ dhcp-manager/tests \
@ENABLE_TESTS_TRUE@ dnsmasq-manager/tests \
@ENABLE_TESTS_TRUE@ platform \
@@ -105,21 +106,21 @@ host_triplet = @host@
@ENABLE_TESTS_TRUE@ tests
sbin_PROGRAMS = NetworkManager$(EXEEXT)
-@SESSION_TRACKING_SYSTEMD_TRUE@am__append_5 = nm-session-monitor-systemd.c
-@SESSION_TRACKING_CK_TRUE@@SESSION_TRACKING_SYSTEMD_FALSE@am__append_6 = nm-session-monitor-ck.c
-@SESSION_TRACKING_CK_FALSE@@SESSION_TRACKING_SYSTEMD_FALSE@am__append_7 = nm-session-monitor-null.c
-@SUSPEND_RESUME_SYSTEMD_TRUE@am__append_8 = nm-sleep-monitor-systemd.c
+@SESSION_TRACKING_SYSTEMD_TRUE@am__append_6 = nm-session-monitor-systemd.c
+@SESSION_TRACKING_CK_TRUE@@SESSION_TRACKING_SYSTEMD_FALSE@am__append_7 = nm-session-monitor-ck.c
+@SESSION_TRACKING_CK_FALSE@@SESSION_TRACKING_SYSTEMD_FALSE@am__append_8 = nm-session-monitor-null.c
+@SUSPEND_RESUME_SYSTEMD_TRUE@am__append_9 = nm-sleep-monitor-systemd.c
# UPower suspend/resume used whenever systemd is not enabled
-@SUSPEND_RESUME_SYSTEMD_FALSE@am__append_9 = nm-sleep-monitor-upower.c
-@WITH_WEXT_TRUE@am__append_10 = \
+@SUSPEND_RESUME_SYSTEMD_FALSE@am__append_10 = nm-sleep-monitor-upower.c
+@WITH_WEXT_TRUE@am__append_11 = \
@WITH_WEXT_TRUE@ platform/wifi/wifi-utils-wext.c \
@WITH_WEXT_TRUE@ platform/wifi/wifi-utils-wext.h
-@WITH_WIMAX_TRUE@am__append_11 = devices/wimax/nm-device-wimax.h
-@WITH_WIMAX_TRUE@am__append_12 = -I$(top_srcdir)/src/devices/wimax
-@SESSION_TRACKING_CK_TRUE@am__append_13 = -DCKDB_PATH=\"${CKDB_PATH}\"
-@WITH_LIBSOUP_TRUE@am__append_14 = $(LIBSOUP_LIBS)
-@WITH_WEXT_TRUE@am__append_15 = \
+@WITH_WIMAX_TRUE@am__append_12 = devices/wimax/nm-device-wimax.h
+@WITH_WIMAX_TRUE@am__append_13 = -I$(top_srcdir)/src/devices/wimax
+@SESSION_TRACKING_CK_TRUE@am__append_14 = -DCKDB_PATH=\"${CKDB_PATH}\"
+@WITH_LIBSOUP_TRUE@am__append_15 = $(LIBSOUP_LIBS)
+@WITH_WEXT_TRUE@am__append_16 = \
@WITH_WEXT_TRUE@ platform/wifi/wifi-utils-wext.c \
@WITH_WEXT_TRUE@ platform/wifi/wifi-utils-wext.h
@@ -185,7 +186,9 @@ am__libNetworkManager_la_SOURCES_DIST = devices/nm-device-bond.h \
dnsmasq-manager/nm-dnsmasq-utils.h platform/nm-fake-platform.c \
platform/nm-fake-platform.h platform/nm-linux-platform.c \
platform/nm-linux-platform.h platform/nm-platform.c \
- platform/nm-platform.h platform/wifi/wifi-utils-nl80211.c \
+ platform/nm-platform.h platform/nm-platform-utils.c \
+ platform/nm-platform-utils.h platform/nmp-object.c \
+ platform/nmp-object.h platform/wifi/wifi-utils-nl80211.c \
platform/wifi/wifi-utils-nl80211.h \
platform/wifi/wifi-utils-private.h platform/wifi/wifi-utils.c \
platform/wifi/wifi-utils.h rdisc/nm-fake-rdisc.c \
@@ -220,30 +223,30 @@ am__libNetworkManager_la_SOURCES_DIST = devices/nm-device-bond.h \
supplicant-manager/nm-supplicant-settings-verify.c \
supplicant-manager/nm-supplicant-settings-verify.h \
supplicant-manager/nm-supplicant-types.h \
- supplicant-manager/nm-call-store.c \
- supplicant-manager/nm-call-store.h \
vpn-manager/nm-vpn-connection.c \
vpn-manager/nm-vpn-connection.h vpn-manager/nm-vpn-manager.c \
vpn-manager/nm-vpn-manager.h vpn-manager/nm-vpn-service.c \
vpn-manager/nm-vpn-service.h nm-activation-request.c \
nm-activation-request.h nm-active-connection.c \
nm-active-connection.h nm-config.c nm-config.h \
- nm-connection-provider.c nm-connection-provider.h \
- nm-connectivity.c nm-connectivity.h nm-dbus-manager.c \
- nm-dbus-manager.h nm-dcb.c nm-dcb.h nm-default-route-manager.c \
- nm-default-route-manager.h nm-dhcp4-config.c nm-dhcp4-config.h \
- nm-dhcp6-config.c nm-dhcp6-config.h nm-dispatcher.c \
- nm-dispatcher.h nm-enum-types.c nm-enum-types.h \
- nm-firewall-manager.c nm-firewall-manager.h nm-ip4-config.c \
- nm-ip4-config.h nm-ip6-config.c nm-ip6-config.h nm-logging.c \
- nm-logging.h nm-auth-manager.c nm-auth-manager.h \
- nm-auth-subject.c nm-auth-subject.h nm-auth-utils.c \
- nm-auth-utils.h nm-manager.c nm-manager.h nm-policy.c \
- nm-policy.h nm-posix-signals.c nm-posix-signals.h \
- nm-properties-changed-signal.c nm-properties-changed-signal.h \
- nm-rfkill-manager.c nm-rfkill-manager.h nm-session-monitor.h \
- nm-session-utils.c nm-session-utils.h nm-sleep-monitor.h \
- nm-types.h NetworkManagerUtils.c NetworkManagerUtils.h \
+ nm-config-data.c nm-config-data.h nm-connection-provider.c \
+ nm-connection-provider.h nm-connectivity.c nm-connectivity.h \
+ nm-dbus-manager.c nm-dbus-manager.h nm-dcb.c nm-dcb.h \
+ nm-route-manager.c nm-route-manager.h \
+ nm-default-route-manager.c nm-default-route-manager.h \
+ nm-dhcp4-config.c nm-dhcp4-config.h nm-dhcp6-config.c \
+ nm-dhcp6-config.h nm-dispatcher.c nm-dispatcher.h \
+ nm-enum-types.c nm-enum-types.h nm-firewall-manager.c \
+ nm-firewall-manager.h nm-ip4-config.c nm-ip4-config.h \
+ nm-ip6-config.c nm-ip6-config.h nm-logging.c nm-logging.h \
+ nm-auth-manager.c nm-auth-manager.h nm-auth-subject.c \
+ nm-auth-subject.h nm-auth-utils.c nm-auth-utils.h nm-manager.c \
+ nm-manager.h nm-multi-index.c nm-multi-index.h nm-policy.c \
+ nm-policy.h nm-properties-changed-signal.c \
+ nm-properties-changed-signal.h nm-rfkill-manager.c \
+ nm-rfkill-manager.h nm-session-monitor.h nm-session-utils.c \
+ nm-session-utils.h nm-sleep-monitor.h nm-types.h \
+ NetworkManagerUtils.c NetworkManagerUtils.h \
nm-session-monitor-systemd.c nm-session-monitor-ck.c \
nm-session-monitor-null.c nm-sleep-monitor-systemd.c \
nm-sleep-monitor-upower.c platform/wifi/wifi-utils-wext.c \
@@ -276,27 +279,27 @@ am__objects_8 = $(am__objects_1) $(am__objects_1) nm-device.lo \
nm-dns-unbound.lo nm-dns-manager.lo nm-dns-plugin.lo \
nm-dns-utils.lo nm-dnsmasq-manager.lo nm-dnsmasq-utils.lo \
nm-fake-platform.lo nm-linux-platform.lo nm-platform.lo \
- wifi-utils-nl80211.lo wifi-utils.lo nm-fake-rdisc.lo \
- nm-lndp-rdisc.lo nm-rdisc.lo nm-ppp-manager.lo \
- nm-agent-manager.lo nm-inotify-helper.lo nm-secret-agent.lo \
- nm-settings-connection.lo nm-settings.lo \
+ nm-platform-utils.lo nmp-object.lo wifi-utils-nl80211.lo \
+ wifi-utils.lo nm-fake-rdisc.lo nm-lndp-rdisc.lo nm-rdisc.lo \
+ nm-ppp-manager.lo nm-agent-manager.lo nm-inotify-helper.lo \
+ nm-secret-agent.lo nm-settings-connection.lo nm-settings.lo \
nm-system-config-interface.lo nm-keyfile-connection.lo \
plugin.lo reader.lo utils.lo writer.lo nm-supplicant-config.lo \
nm-supplicant-interface.lo nm-supplicant-manager.lo \
- nm-supplicant-settings-verify.lo nm-call-store.lo \
- nm-vpn-connection.lo nm-vpn-manager.lo nm-vpn-service.lo \
- nm-activation-request.lo nm-active-connection.lo nm-config.lo \
+ nm-supplicant-settings-verify.lo nm-vpn-connection.lo \
+ nm-vpn-manager.lo nm-vpn-service.lo nm-activation-request.lo \
+ nm-active-connection.lo nm-config.lo nm-config-data.lo \
nm-connection-provider.lo nm-connectivity.lo \
- nm-dbus-manager.lo nm-dcb.lo nm-default-route-manager.lo \
- nm-dhcp4-config.lo nm-dhcp6-config.lo nm-dispatcher.lo \
- nm-enum-types.lo nm-firewall-manager.lo nm-ip4-config.lo \
- nm-ip6-config.lo nm-logging.lo nm-auth-manager.lo \
- nm-auth-subject.lo nm-auth-utils.lo nm-manager.lo nm-policy.lo \
- nm-posix-signals.lo nm-properties-changed-signal.lo \
- nm-rfkill-manager.lo nm-session-utils.lo \
- NetworkManagerUtils.lo $(am__objects_2) $(am__objects_3) \
- $(am__objects_4) $(am__objects_5) $(am__objects_6) \
- $(am__objects_7)
+ nm-dbus-manager.lo nm-dcb.lo nm-route-manager.lo \
+ nm-default-route-manager.lo nm-dhcp4-config.lo \
+ nm-dhcp6-config.lo nm-dispatcher.lo nm-enum-types.lo \
+ nm-firewall-manager.lo nm-ip4-config.lo nm-ip6-config.lo \
+ nm-logging.lo nm-auth-manager.lo nm-auth-subject.lo \
+ nm-auth-utils.lo nm-manager.lo nm-multi-index.lo nm-policy.lo \
+ nm-properties-changed-signal.lo nm-rfkill-manager.lo \
+ nm-session-utils.lo NetworkManagerUtils.lo $(am__objects_2) \
+ $(am__objects_3) $(am__objects_4) $(am__objects_5) \
+ $(am__objects_6) $(am__objects_7)
am_libNetworkManager_la_OBJECTS = $(am__objects_8) $(am__objects_1)
libNetworkManager_la_OBJECTS = $(am_libNetworkManager_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
@@ -315,23 +318,26 @@ am__libnm_iface_helper_la_SOURCES_DIST = \
dhcp-manager/nm-dhcp-manager.c dhcp-manager/nm-dhcp-manager.h \
platform/nm-linux-platform.c platform/nm-linux-platform.h \
platform/nm-platform.c platform/nm-platform.h \
+ platform/nm-platform-utils.c platform/nm-platform-utils.h \
+ platform/nmp-object.c platform/nmp-object.h \
platform/wifi/wifi-utils-nl80211.c \
platform/wifi/wifi-utils-nl80211.h \
platform/wifi/wifi-utils-private.h platform/wifi/wifi-utils.c \
platform/wifi/wifi-utils.h rdisc/nm-fake-rdisc.c \
rdisc/nm-fake-rdisc.h rdisc/nm-lndp-rdisc.c \
rdisc/nm-lndp-rdisc.h rdisc/nm-rdisc.c rdisc/nm-rdisc.h \
- nm-ip4-config.c nm-ip4-config.h nm-ip6-config.c \
- nm-ip6-config.h nm-enum-types.c nm-enum-types.h nm-logging.c \
- nm-logging.h nm-posix-signals.c nm-posix-signals.h \
- NetworkManagerUtils.c NetworkManagerUtils.h \
- platform/wifi/wifi-utils-wext.c \
+ nm-route-manager.c nm-route-manager.h nm-ip4-config.c \
+ nm-ip4-config.h nm-ip6-config.c nm-ip6-config.h \
+ nm-enum-types.c nm-enum-types.h nm-logging.c nm-logging.h \
+ nm-multi-index.c nm-multi-index.h NetworkManagerUtils.c \
+ NetworkManagerUtils.h platform/wifi/wifi-utils-wext.c \
platform/wifi/wifi-utils-wext.h
am_libnm_iface_helper_la_OBJECTS = nm-dhcp-client.lo nm-dhcp-utils.lo \
nm-dhcp-manager.lo nm-linux-platform.lo nm-platform.lo \
- wifi-utils-nl80211.lo wifi-utils.lo nm-fake-rdisc.lo \
- nm-lndp-rdisc.lo nm-rdisc.lo nm-ip4-config.lo nm-ip6-config.lo \
- nm-enum-types.lo nm-logging.lo nm-posix-signals.lo \
+ nm-platform-utils.lo nmp-object.lo wifi-utils-nl80211.lo \
+ wifi-utils.lo nm-fake-rdisc.lo nm-lndp-rdisc.lo nm-rdisc.lo \
+ nm-route-manager.lo nm-ip4-config.lo nm-ip6-config.lo \
+ nm-enum-types.lo nm-logging.lo nm-multi-index.lo \
NetworkManagerUtils.lo $(am__objects_7)
libnm_iface_helper_la_OBJECTS = $(am_libnm_iface_helper_la_OBJECTS)
libsystemd_dhcp_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
@@ -493,10 +499,11 @@ am__define_uniq_tagged_files = \
done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
-DIST_SUBDIRS = . devices/adsl devices/wifi dhcp-manager ppp-manager \
- settings/plugins devices/wwan devices/bluetooth devices/wimax \
- devices/team dhcp-manager/tests dnsmasq-manager/tests platform \
- rdisc supplicant-manager/tests tests
+DIST_SUBDIRS = . devices/adsl dhcp-manager ppp-manager \
+ settings/plugins devices/wwan devices/bluetooth devices/wifi \
+ devices/wimax devices/team dhcp-manager/tests \
+ dnsmasq-manager/tests platform rdisc supplicant-manager/tests \
+ tests
am__DIST_COMMON = $(srcdir)/Makefile.in \
$(top_srcdir)/build-aux/depcomp
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -529,6 +536,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -642,6 +650,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -785,9 +794,9 @@ with_dhcpcd = @with_dhcpcd@
with_netconfig = @with_netconfig@
with_resolvconf = @with_resolvconf@
with_valgrind = @with_valgrind@
-SUBDIRS = . devices/adsl devices/wifi dhcp-manager ppp-manager \
- settings/plugins $(am__append_1) $(am__append_2) \
- $(am__append_3) $(am__append_4)
+SUBDIRS = . devices/adsl dhcp-manager ppp-manager settings/plugins \
+ $(am__append_1) $(am__append_2) $(am__append_3) \
+ $(am__append_4) $(am__append_5)
# add each subdirectory that contains a libNM source file. $(sort) is being used
# primarily for its side effect of removing duplicates.
@@ -798,7 +807,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libnm-core \
-DNM_VERSION_MAX_ALLOWED=NM_VERSION_NEXT_STABLE $(foreach \
d,$(sort $(dir \
$(libNetworkManager_la_SOURCES))),-I$(top_srcdir)/src/$d) \
- $(am__append_12) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GUDEV_CFLAGS) \
+ $(am__append_13) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GUDEV_CFLAGS) \
$(LIBNL_CFLAGS) $(LIBNDP_CFLAGS) $(LIBSOUP_CFLAGS) \
$(SYSTEMD_LOGIN_CFLAGS) $(SYSTEMD_DHCP_CFLAGS) \
-DBINDIR=\"$(bindir)\" -DDATADIR=\"$(datadir)\" \
@@ -812,7 +821,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libnm-core \
-DDHCLIENT_PATH=\"$(DHCLIENT_PATH)\" \
-DDHCPCD_PATH=\"$(DHCPCD_PATH)\" \
-DPPPD_PLUGIN_DIR=\"$(PPPD_PLUGIN_DIR)\" $(NULL) \
- $(am__append_13)
+ $(am__append_14)
noinst_LTLIBRARIES = \
libNetworkManager.la \
libnm-iface-helper.la \
@@ -952,7 +961,9 @@ nm_sources = $(nm_device_headers) $(nm_dhcp_client_headers) \
dnsmasq-manager/nm-dnsmasq-utils.h platform/nm-fake-platform.c \
platform/nm-fake-platform.h platform/nm-linux-platform.c \
platform/nm-linux-platform.h platform/nm-platform.c \
- platform/nm-platform.h platform/wifi/wifi-utils-nl80211.c \
+ platform/nm-platform.h platform/nm-platform-utils.c \
+ platform/nm-platform-utils.h platform/nmp-object.c \
+ platform/nmp-object.h platform/wifi/wifi-utils-nl80211.c \
platform/wifi/wifi-utils-nl80211.h \
platform/wifi/wifi-utils-private.h platform/wifi/wifi-utils.c \
platform/wifi/wifi-utils.h rdisc/nm-fake-rdisc.c \
@@ -987,36 +998,36 @@ nm_sources = $(nm_device_headers) $(nm_dhcp_client_headers) \
supplicant-manager/nm-supplicant-settings-verify.c \
supplicant-manager/nm-supplicant-settings-verify.h \
supplicant-manager/nm-supplicant-types.h \
- supplicant-manager/nm-call-store.c \
- supplicant-manager/nm-call-store.h \
vpn-manager/nm-vpn-connection.c \
vpn-manager/nm-vpn-connection.h vpn-manager/nm-vpn-manager.c \
vpn-manager/nm-vpn-manager.h vpn-manager/nm-vpn-service.c \
vpn-manager/nm-vpn-service.h nm-activation-request.c \
nm-activation-request.h nm-active-connection.c \
nm-active-connection.h nm-config.c nm-config.h \
- nm-connection-provider.c nm-connection-provider.h \
- nm-connectivity.c nm-connectivity.h nm-dbus-manager.c \
- nm-dbus-manager.h nm-dcb.c nm-dcb.h nm-default-route-manager.c \
- nm-default-route-manager.h nm-dhcp4-config.c nm-dhcp4-config.h \
- nm-dhcp6-config.c nm-dhcp6-config.h nm-dispatcher.c \
- nm-dispatcher.h nm-enum-types.c nm-enum-types.h \
- nm-firewall-manager.c nm-firewall-manager.h nm-ip4-config.c \
- nm-ip4-config.h nm-ip6-config.c nm-ip6-config.h nm-logging.c \
- nm-logging.h nm-auth-manager.c nm-auth-manager.h \
- nm-auth-subject.c nm-auth-subject.h nm-auth-utils.c \
- nm-auth-utils.h nm-manager.c nm-manager.h nm-policy.c \
- nm-policy.h nm-posix-signals.c nm-posix-signals.h \
- nm-properties-changed-signal.c nm-properties-changed-signal.h \
- nm-rfkill-manager.c nm-rfkill-manager.h nm-session-monitor.h \
- nm-session-utils.c nm-session-utils.h nm-sleep-monitor.h \
- nm-types.h NetworkManagerUtils.c NetworkManagerUtils.h \
- $(am__append_5) $(am__append_6) $(am__append_7) \
- $(am__append_8) $(am__append_9) $(am__append_10)
+ nm-config-data.c nm-config-data.h nm-connection-provider.c \
+ nm-connection-provider.h nm-connectivity.c nm-connectivity.h \
+ nm-dbus-manager.c nm-dbus-manager.h nm-dcb.c nm-dcb.h \
+ nm-route-manager.c nm-route-manager.h \
+ nm-default-route-manager.c nm-default-route-manager.h \
+ nm-dhcp4-config.c nm-dhcp4-config.h nm-dhcp6-config.c \
+ nm-dhcp6-config.h nm-dispatcher.c nm-dispatcher.h \
+ nm-enum-types.c nm-enum-types.h nm-firewall-manager.c \
+ nm-firewall-manager.h nm-ip4-config.c nm-ip4-config.h \
+ nm-ip6-config.c nm-ip6-config.h nm-logging.c nm-logging.h \
+ nm-auth-manager.c nm-auth-manager.h nm-auth-subject.c \
+ nm-auth-subject.h nm-auth-utils.c nm-auth-utils.h nm-manager.c \
+ nm-manager.h nm-multi-index.c nm-multi-index.h nm-policy.c \
+ nm-policy.h nm-properties-changed-signal.c \
+ nm-properties-changed-signal.h nm-rfkill-manager.c \
+ nm-rfkill-manager.h nm-session-monitor.h nm-session-utils.c \
+ nm-session-utils.h nm-sleep-monitor.h nm-types.h \
+ NetworkManagerUtils.c NetworkManagerUtils.h $(am__append_6) \
+ $(am__append_7) $(am__append_8) $(am__append_9) \
+ $(am__append_10) $(am__append_11)
GLIB_GENERATED = nm-enum-types.h nm-enum-types.c
GLIB_MKENUMS_H_FLAGS = --identifier-prefix NM --fhead '\#include <nm-core-enum-types.h>\n'
GLIB_MKENUMS_C_FLAGS = --identifier-prefix NM
-nm_enum_types_sources = $(nm_sources) $(am__append_11)
+nm_enum_types_sources = $(nm_sources) $(am__append_12)
BUILT_SOURCES = $(GLIB_GENERATED) $(glue_sources)
glue_sources = \
nm-access-point-glue.h \
@@ -1052,7 +1063,7 @@ libNetworkManager_la_LIBADD = \
$(top_builddir)/libnm-core/libnm-core.la libsystemd-dhcp.la \
$(DBUS_LIBS) $(GLIB_LIBS) $(GUDEV_LIBS) $(LIBNL_LIBS) \
$(SYSTEMD_LOGIN_LIBS) $(LIBNDP_LIBS) $(LIBDL) $(LIBM) \
- $(am__append_14)
+ $(am__append_15)
NetworkManager_LDFLAGS = -rdynamic
######################
@@ -1061,16 +1072,19 @@ libnm_iface_helper_la_SOURCES = dhcp-manager/nm-dhcp-client.c \
dhcp-manager/nm-dhcp-utils.h dhcp-manager/nm-dhcp-manager.c \
dhcp-manager/nm-dhcp-manager.h platform/nm-linux-platform.c \
platform/nm-linux-platform.h platform/nm-platform.c \
- platform/nm-platform.h platform/wifi/wifi-utils-nl80211.c \
+ platform/nm-platform.h platform/nm-platform-utils.c \
+ platform/nm-platform-utils.h platform/nmp-object.c \
+ platform/nmp-object.h platform/wifi/wifi-utils-nl80211.c \
platform/wifi/wifi-utils-nl80211.h \
platform/wifi/wifi-utils-private.h platform/wifi/wifi-utils.c \
platform/wifi/wifi-utils.h rdisc/nm-fake-rdisc.c \
rdisc/nm-fake-rdisc.h rdisc/nm-lndp-rdisc.c \
rdisc/nm-lndp-rdisc.h rdisc/nm-rdisc.c rdisc/nm-rdisc.h \
- nm-ip4-config.c nm-ip4-config.h nm-ip6-config.c \
- nm-ip6-config.h nm-enum-types.c nm-enum-types.h nm-logging.c \
- nm-logging.h nm-posix-signals.c nm-posix-signals.h \
- NetworkManagerUtils.c NetworkManagerUtils.h $(am__append_15)
+ nm-route-manager.c nm-route-manager.h nm-ip4-config.c \
+ nm-ip4-config.h nm-ip6-config.c nm-ip6-config.h \
+ nm-enum-types.c nm-enum-types.h nm-logging.c nm-logging.h \
+ nm-multi-index.c nm-multi-index.h NetworkManagerUtils.c \
+ NetworkManagerUtils.h $(am__append_16)
libnm_iface_helper_la_LIBADD = \
$(top_builddir)/libnm-core/libnm-core.la \
libsystemd-dhcp.la \
@@ -1311,7 +1325,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-auth-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-auth-subject.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-auth-utils.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-call-store.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-config-data.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-config.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-connection-provider.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-connectivity.Plo@am__quote@
@@ -1363,13 +1377,15 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-lndp-rdisc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-logging.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-manager.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-multi-index.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-platform-utils.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-platform.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-policy.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-posix-signals.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-ppp-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-properties-changed-signal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-rdisc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-rfkill-manager.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-route-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-secret-agent.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-session-monitor-ck.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-session-monitor-null.Plo@am__quote@
@@ -1387,6 +1403,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-vpn-connection.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-vpn-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-vpn-service.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nmp-object.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@
@@ -1542,6 +1559,20 @@ nm-platform.lo: platform/nm-platform.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-platform.lo `test -f 'platform/nm-platform.c' || echo '$(srcdir)/'`platform/nm-platform.c
+nm-platform-utils.lo: platform/nm-platform-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-platform-utils.lo -MD -MP -MF $(DEPDIR)/nm-platform-utils.Tpo -c -o nm-platform-utils.lo `test -f 'platform/nm-platform-utils.c' || echo '$(srcdir)/'`platform/nm-platform-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-platform-utils.Tpo $(DEPDIR)/nm-platform-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='platform/nm-platform-utils.c' object='nm-platform-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-platform-utils.lo `test -f 'platform/nm-platform-utils.c' || echo '$(srcdir)/'`platform/nm-platform-utils.c
+
+nmp-object.lo: platform/nmp-object.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nmp-object.lo -MD -MP -MF $(DEPDIR)/nmp-object.Tpo -c -o nmp-object.lo `test -f 'platform/nmp-object.c' || echo '$(srcdir)/'`platform/nmp-object.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nmp-object.Tpo $(DEPDIR)/nmp-object.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='platform/nmp-object.c' object='nmp-object.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nmp-object.lo `test -f 'platform/nmp-object.c' || echo '$(srcdir)/'`platform/nmp-object.c
+
wifi-utils-nl80211.lo: platform/wifi/wifi-utils-nl80211.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wifi-utils-nl80211.lo -MD -MP -MF $(DEPDIR)/wifi-utils-nl80211.Tpo -c -o wifi-utils-nl80211.lo `test -f 'platform/wifi/wifi-utils-nl80211.c' || echo '$(srcdir)/'`platform/wifi/wifi-utils-nl80211.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wifi-utils-nl80211.Tpo $(DEPDIR)/wifi-utils-nl80211.Plo
@@ -1689,13 +1720,6 @@ nm-supplicant-settings-verify.lo: supplicant-manager/nm-supplicant-settings-veri
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-supplicant-settings-verify.lo `test -f 'supplicant-manager/nm-supplicant-settings-verify.c' || echo '$(srcdir)/'`supplicant-manager/nm-supplicant-settings-verify.c
-nm-call-store.lo: supplicant-manager/nm-call-store.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-call-store.lo -MD -MP -MF $(DEPDIR)/nm-call-store.Tpo -c -o nm-call-store.lo `test -f 'supplicant-manager/nm-call-store.c' || echo '$(srcdir)/'`supplicant-manager/nm-call-store.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-call-store.Tpo $(DEPDIR)/nm-call-store.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='supplicant-manager/nm-call-store.c' object='nm-call-store.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nm-call-store.lo `test -f 'supplicant-manager/nm-call-store.c' || echo '$(srcdir)/'`supplicant-manager/nm-call-store.c
-
nm-vpn-connection.lo: vpn-manager/nm-vpn-connection.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nm-vpn-connection.lo -MD -MP -MF $(DEPDIR)/nm-vpn-connection.Tpo -c -o nm-vpn-connection.lo `test -f 'vpn-manager/nm-vpn-connection.c' || echo '$(srcdir)/'`vpn-manager/nm-vpn-connection.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nm-vpn-connection.Tpo $(DEPDIR)/nm-vpn-connection.Plo
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 24cb949c6..4f8424944 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -47,8 +47,8 @@
#include "nm-setting-wireless.h"
#include "nm-setting-wireless-security.h"
#include "nm-auth-utils.h"
-#include "nm-posix-signals.h"
#include "nm-dbus-glib-types.h"
+#include "gsystem-local-alloc.h"
/*
* Some toolchains (E.G. uClibc 0.9.33 and earlier) don't export
@@ -59,6 +59,60 @@
#define CLOCK_BOOTTIME 7
#endif
+G_STATIC_ASSERT (sizeof (NMUtilsTestFlags) <= sizeof (int));
+int _nm_utils_testing = 0;
+
+gboolean
+nm_utils_get_testing_initialized ()
+{
+ NMUtilsTestFlags flags;
+
+ flags = (NMUtilsTestFlags) _nm_utils_testing;
+ if (flags == NM_UTILS_TEST_NONE)
+ flags = (NMUtilsTestFlags) g_atomic_int_get (&_nm_utils_testing);
+ return flags != NM_UTILS_TEST_NONE;
+}
+
+NMUtilsTestFlags
+nm_utils_get_testing ()
+{
+ NMUtilsTestFlags flags;
+
+ flags = (NMUtilsTestFlags) _nm_utils_testing;
+ if (flags != NM_UTILS_TEST_NONE) {
+ /* Flags already initialized. Return them. */
+ return flags & NM_UTILS_TEST_ALL;
+ }
+
+ /* Accessing nm_utils_get_testing() causes us to set the flags to initialized.
+ * Detecting running tests also based on g_test_initialized(). */
+ flags = _NM_UTILS_TEST_INITIALIZED;
+ if (g_test_initialized ())
+ flags |= _NM_UTILS_TEST_GENERAL;
+
+ if (g_atomic_int_compare_and_exchange (&_nm_utils_testing, 0, (int) flags)) {
+ /* Done. We set it. */
+ return flags & NM_UTILS_TEST_ALL;
+ }
+ /* It changed in the meantime (??). Re-read the value. */
+ return ((NMUtilsTestFlags) _nm_utils_testing) & NM_UTILS_TEST_ALL;
+}
+
+void
+_nm_utils_set_testing (NMUtilsTestFlags flags)
+{
+ g_assert (!NM_FLAGS_ANY (flags, ~NM_UTILS_TEST_ALL));
+
+ /* mask out everything except ALL, and always set GENERAL. */
+ flags = (flags & NM_UTILS_TEST_ALL) | (_NM_UTILS_TEST_GENERAL | _NM_UTILS_TEST_INITIALIZED);
+
+ if (!g_atomic_int_compare_and_exchange (&_nm_utils_testing, 0, (int) flags)) {
+ /* We only allow setting _nm_utils_set_testing() once, before fetching the
+ * value with nm_utils_get_testing(). */
+ g_return_if_reached ();
+ }
+}
+
/*
* nm_ethernet_address_is_valid:
* @addr: pointer to a binary or ASCII Ethernet address
@@ -150,6 +204,80 @@ nm_utils_ip6_address_clear_host_address (struct in6_addr *dst, const struct in6_
return dst;
}
+void
+nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete, gsize len)
+{
+ gsize elt_size;
+ guint index_to_delete;
+ guint i_src;
+ guint mm_src, mm_dst, mm_len;
+ gsize i_itd;
+ guint res_length;
+
+ g_return_if_fail (array);
+ if (!len)
+ return;
+ g_return_if_fail (indexes_to_delete);
+
+ elt_size = g_array_get_element_size (array);
+
+ i_itd = 0;
+ index_to_delete = indexes_to_delete[0];
+ if (index_to_delete >= array->len)
+ g_return_if_reached ();
+
+ res_length = array->len - 1;
+
+ mm_dst = index_to_delete;
+ mm_src = index_to_delete;
+ mm_len = 0;
+
+ for (i_src = index_to_delete; i_src < array->len; i_src++) {
+ if (i_src < index_to_delete)
+ mm_len++;
+ else {
+ /* we require indexes_to_delete to contain non-repeated, ascending
+ * indexes. Otherwise we would need to presort the indexes. */
+ while (TRUE) {
+ guint dd;
+
+ if (i_itd + 1 >= len) {
+ index_to_delete = G_MAXUINT;
+ break;
+ }
+
+ dd = indexes_to_delete[++i_itd];
+ if (dd > index_to_delete) {
+ if (dd >= array->len)
+ g_warn_if_reached ();
+ else {
+ g_assert (res_length > 0);
+ res_length--;
+ }
+ index_to_delete = dd;
+ break;
+ }
+ g_warn_if_reached ();
+ }
+
+ if (mm_len) {
+ memmove (&array->data[mm_dst * elt_size],
+ &array->data[mm_src * elt_size],
+ mm_len * elt_size);
+ mm_dst += mm_len;
+ mm_src += mm_len + 1;
+ mm_len = 0;
+ } else
+ mm_src++;
+ }
+ }
+ if (mm_len) {
+ memmove (&array->data[mm_dst * elt_size],
+ &array->data[mm_src * elt_size],
+ mm_len * elt_size);
+ }
+ g_array_set_size (array, res_length);
+}
int
nm_spawn_process (const char *args, GError **error)
@@ -163,7 +291,7 @@ nm_spawn_process (const char *args, GError **error)
g_return_val_if_fail (!error || !*error, -1);
if (g_shell_parse_argv (args, &num_args, &argv, &local)) {
- g_spawn_sync ("/", argv, NULL, 0, nm_unblock_posix_signals, NULL, NULL, NULL, &status, &local);
+ g_spawn_sync ("/", argv, NULL, 0, NULL, NULL, NULL, NULL, &status, &local);
g_strfreev (argv);
}
@@ -175,9 +303,62 @@ nm_spawn_process (const char *args, GError **error)
return status;
}
+static const char *
+_trunk_first_line (char *str)
+{
+ char *s;
+
+ s = strchr (str, '\n');
+ if (s)
+ s[0] = '\0';
+ return str;
+}
+
+int
+nm_utils_modprobe (GError **error, gboolean suppress_error_logging, const char *arg1, ...)
+{
+ gs_unref_ptrarray GPtrArray *argv = NULL;
+ int exit_status;
+ gs_free char *_log_str = NULL;
+#define ARGV_TO_STR(argv) (_log_str ? _log_str : (_log_str = g_strjoinv (" ", (char **) argv->pdata)))
+ GError *local = NULL;
+ va_list ap;
+ NMLogLevel llevel = suppress_error_logging ? LOGL_DEBUG : LOGL_ERR;
+ gs_free char *std_out = NULL, *std_err = NULL;
+
+ g_return_val_if_fail (!error || !*error, -1);
+ g_return_val_if_fail (arg1, -1);
+
+ /* construct the argument list */
+ argv = g_ptr_array_sized_new (4);
+ g_ptr_array_add (argv, "/sbin/modprobe");
+ g_ptr_array_add (argv, (char *) arg1);
+
+ va_start (ap, arg1);
+ while ((arg1 = va_arg (ap, const char *)))
+ g_ptr_array_add (argv, (char *) arg1);
+ va_end (ap);
+
+ g_ptr_array_add (argv, NULL);
+
+ nm_log_dbg (LOGD_CORE, "modprobe: '%s'", ARGV_TO_STR (argv));
+ if (!g_spawn_sync (NULL, (char **) argv->pdata, NULL, 0, NULL, NULL, &std_out, &std_err, &exit_status, &local)) {
+ nm_log (llevel, LOGD_CORE, "modprobe: '%s' failed: %s", ARGV_TO_STR (argv), local->message);
+ g_propagate_error (error, local);
+ return -1;
+ } else if (exit_status != 0)
+ nm_log (llevel, LOGD_CORE, "modprobe: '%s' exited with error %d%s%s%s%s%s%s", ARGV_TO_STR (argv), exit_status,
+ std_out&&*std_out ? " (" : "", std_out&&*std_out ? _trunk_first_line (std_out) : "", std_out&&*std_out ? ")" : "",
+ std_err&&*std_err ? " (" : "", std_err&&*std_err ? _trunk_first_line (std_err) : "", std_err&&*std_err ? ")" : "");
+
+ return exit_status;
+}
+
/**
* nm_utils_get_start_time_for_pid:
* @pid: the process identifier
+ * @out_state: return the state character, like R, S, Z. See `man 5 proc`.
+ * @out_ppid: parent process id
*
* Originally copied from polkit source (src/polkit/polkitunixprocess.c)
* and adjusted.
@@ -188,16 +369,18 @@ nm_spawn_process (const char *args, GError **error)
* The returned start time counts since boot, in the unit HZ (with HZ usually being (1/100) seconds)
**/
guint64
-nm_utils_get_start_time_for_pid (pid_t pid)
+nm_utils_get_start_time_for_pid (pid_t pid, char *out_state, pid_t *out_ppid)
{
guint64 start_time;
- gchar *filename;
- gchar *contents;
+ gs_free gchar *filename = NULL;
+ gs_free gchar *contents = NULL;
size_t length;
- gchar **tokens;
+ gs_strfreev gchar **tokens = NULL;
guint num_tokens;
gchar *p;
gchar *endp;
+ char state = '\0';
+ gint64 ppid = 0;
start_time = 0;
contents = NULL;
@@ -220,6 +403,8 @@ nm_utils_get_start_time_for_pid (pid_t pid)
if (p - contents >= (int) length)
goto out;
+ state = p[0];
+
tokens = g_strsplit (p, " ", 0);
num_tokens = g_strv_length (tokens);
@@ -227,15 +412,19 @@ nm_utils_get_start_time_for_pid (pid_t pid)
if (num_tokens < 20)
goto out;
- start_time = strtoull (tokens[19], &endp, 10);
- if (endp == tokens[19])
- goto out;
+ if (out_ppid)
+ ppid = _nm_utils_ascii_str_to_int64 (tokens[1], 10, 1, G_MAXINT, 0);
- g_strfreev (tokens);
+ errno = 0;
+ start_time = strtoull (tokens[19], &endp, 10);
+ if (*endp != '\0' || errno != 0)
+ start_time = 0;
- out:
- g_free (filename);
- g_free (contents);
+out:
+ if (out_state)
+ *out_state = state;
+ if (out_ppid)
+ *out_ppid = ppid;
return start_time;
}
@@ -514,13 +703,15 @@ _sleep_duration_convert_ms_to_us (guint32 sleep_duration_msec)
* sent unless the child already exited. If the child does not exit within @wait_before_kill_msec milliseconds,
* the function will send %SIGKILL and waits for the child indefinitly. If @wait_before_kill_msec is zero, no
* %SIGKILL signal will be sent.
+ *
+ * In case of error, errno is preserved to contain the last reason of failure.
**/
gboolean
nm_utils_kill_child_sync (pid_t pid, int sig, guint64 log_domain, const char *log_name,
int *child_status, guint32 wait_before_kill_msec,
guint32 sleep_duration_msec)
{
- int status = 0, errsv;
+ int status = 0, errsv = 0;
pid_t ret;
gboolean success = FALSE;
gboolean was_waiting = FALSE, send_kill = FALSE;
@@ -666,6 +857,7 @@ nm_utils_kill_child_sync (pid_t pid, int sig, guint64 log_domain, const char *lo
out:
if (child_status)
*child_status = success ? status : -1;
+ errno = success ? 0 : errsv;
return success;
}
@@ -681,30 +873,36 @@ out:
* @log_name: name of the process to kill for logging.
* @wait_before_kill_msec: Waittime in milliseconds before sending %SIGKILL signal. Set this value
* to zero, not to send %SIGKILL. If @sig is already %SIGKILL, this parameter has no effect.
+ * If @max_wait_msec is set but less then @wait_before_kill_msec, the final %SIGKILL will also
+ * not be send.
* @sleep_duration_msec: the synchronous function sleeps repeatedly waiting for the child to terminate.
* Set to zero, to use the default (meaning 20 wakeups per seconds).
+ * @max_wait_msec: if 0, waits indefinitely until the process is gone (or a zombie). Otherwise, this
+ * is the maxium wait time until returning. If @max_wait_msec is non-zero but smaller then @wait_before_kill_msec,
+ * we will not send a final %SIGKILL.
*
* Kill a non-child process synchronously and wait. This function will not return before the
- * process with PID @pid is gone.
+ * process with PID @pid is gone, the process is a zombie, or @max_wait_msec expires.
**/
void
nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_domain,
const char *log_name, guint32 wait_before_kill_msec,
- guint32 sleep_duration_msec)
+ guint32 sleep_duration_msec, guint32 max_wait_msec)
{
int errsv;
guint64 start_time0;
- gint64 wait_until, now, wait_start_us;
+ gint64 wait_until_sigkill, now, wait_start_us, max_wait_until;
gulong sleep_time, sleep_duration_usec;
int loop_count = 0;
gboolean was_waiting = FALSE;
char buf_wait[KC_WAITED_TO_STRING];
+ char p_state;
g_return_if_fail (pid > 0);
g_return_if_fail (log_name != NULL);
g_return_if_fail (wait_before_kill_msec > 0);
- start_time0 = nm_utils_get_start_time_for_pid (pid);
+ start_time0 = nm_utils_get_start_time_for_pid (pid, &p_state, NULL);
if (start_time0 == 0) {
nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": cannot kill process %ld because it seems already gone",
LOG_NAME_ARGS, (long int) pid);
@@ -716,6 +914,17 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_
return;
}
+ switch (p_state) {
+ case 'Z':
+ case 'x':
+ case 'X':
+ nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": cannot kill process %ld because it is already a zombie (%c)",
+ LOG_NAME_ARGS, (long int) pid, p_state);
+ return;
+ default:
+ break;
+ }
+
if (kill (pid, sig) != 0) {
errsv = errno;
/* ESRCH means, process does not exist or is already a zombie. */
@@ -734,10 +943,19 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_
wait_start_us = nm_utils_get_monotonic_timestamp_us ();
sleep_duration_usec = _sleep_duration_convert_ms_to_us (sleep_duration_msec);
- wait_until = wait_start_us + (((gint64) wait_before_kill_msec) * 1000L);
+ if (sig != SIGKILL)
+ wait_until_sigkill = wait_start_us + (((gint64) wait_before_kill_msec) * 1000L);
+ else
+ wait_until_sigkill = 0;
+ if (max_wait_msec > 0) {
+ max_wait_until = wait_start_us + (((gint64) max_wait_msec) * 1000L);
+ if (wait_until_sigkill > 0 && wait_until_sigkill > max_wait_msec)
+ wait_until_sigkill = 0;
+ } else
+ max_wait_until = 0;
while (TRUE) {
- start_time = nm_utils_get_start_time_for_pid (pid);
+ start_time = nm_utils_get_start_time_for_pid (pid, &p_state, NULL);
if (start_time != start_time0) {
nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": process is gone after sending signal %s%s",
@@ -745,6 +963,17 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_
was_waiting ? _kc_waited_to_string (buf_wait, wait_start_us) : "");
return;
}
+ switch (p_state) {
+ case 'Z':
+ case 'x':
+ case 'X':
+ nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": process is a zombie (%c) after sending signal %s%s",
+ LOG_NAME_ARGS, p_state, _kc_signal_to_string (sig),
+ was_waiting ? _kc_waited_to_string (buf_wait, wait_start_us) : "");
+ return;
+ default:
+ break;
+ }
if (kill (pid, 0) != 0) {
errsv = errno;
@@ -762,9 +991,25 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_
}
sleep_time = sleep_duration_usec;
- if (wait_until != 0) {
- now = nm_utils_get_monotonic_timestamp_us ();
- if (sig != SIGKILL && now >= wait_until) {
+ now = nm_utils_get_monotonic_timestamp_us ();
+
+ if ( max_wait_until != 0
+ && now >= max_wait_until) {
+ if (wait_until_sigkill != 0) {
+ /* wait_before_kill_msec is not larger then max_wait_until but we did not yet send
+ * SIGKILL. Although we already reached our timeout, we don't want to skip sending
+ * the signal. Even if we don't wait for the process to disappear. */
+ nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": sending SIGKILL", LOG_NAME_ARGS);
+ kill (pid, SIGKILL);
+ }
+ nm_log_warn (log_domain, LOG_NAME_PROCESS_FMT ": timeout %u msec waiting for process to disappear (after sending %s)%s",
+ LOG_NAME_ARGS, (unsigned) max_wait_until, _kc_signal_to_string (sig),
+ was_waiting ? _kc_waited_to_string (buf_wait, wait_start_us) : "");
+ return;
+ }
+
+ if (wait_until_sigkill != 0) {
+ if (now >= wait_until_sigkill) {
/* Still not dead. SIGKILL now... */
nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": sending SIGKILL", LOG_NAME_ARGS);
if (kill (pid, SIGKILL) != 0) {
@@ -781,17 +1026,24 @@ nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_
return;
}
sig = SIGKILL;
- was_waiting = TRUE;
- wait_until = 0;
+ wait_until_sigkill = 0;
loop_count = 0; /* reset the loop_count. Now we really expect the process to die quickly. */
+ } else
+ sleep_time = MIN (wait_until_sigkill - now, sleep_duration_usec);
+ }
+
+ if (!was_waiting) {
+ if (wait_until_sigkill != 0) {
+ nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": waiting up to %ld milliseconds for process to disappear before sending KILL signal after sending %s...",
+ LOG_NAME_ARGS, (long) wait_before_kill_msec, _kc_signal_to_string (sig));
+ } else if (max_wait_until != 0) {
+ nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": waiting up to %ld milliseconds for process to disappear after sending %s...",
+ LOG_NAME_ARGS, (long) max_wait_msec, _kc_signal_to_string (sig));
} else {
- if (!was_waiting) {
- nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": waiting up to %ld milliseconds for process to disappear after sending %s...",
- LOG_NAME_ARGS, (long) wait_before_kill_msec, _kc_signal_to_string (sig));
- was_waiting = TRUE;
- }
- sleep_time = MIN (wait_until - now, sleep_duration_usec);
+ nm_log_dbg (log_domain, LOG_NAME_PROCESS_FMT ": waiting for process to disappear after sending %s...",
+ LOG_NAME_ARGS, _kc_signal_to_string (sig));
}
+ was_waiting = TRUE;
}
if (loop_count < 20) {
@@ -827,55 +1079,133 @@ nm_utils_find_helper(const char *progname, const char *try_first, GError **error
/******************************************************************************************/
-gboolean
-nm_match_spec_string (const GSList *specs, const char *match)
+#define MAC_TAG "mac:"
+#define INTERFACE_NAME_TAG "interface-name:"
+#define DEVICE_TYPE_TAG "type:"
+#define SUBCHAN_TAG "s390-subchannels:"
+#define EXCEPT_TAG "except:"
+
+static const char *
+_match_except (const char *spec_str, gboolean *out_except)
+{
+ if (!g_ascii_strncasecmp (spec_str, EXCEPT_TAG, STRLEN (EXCEPT_TAG))) {
+ spec_str += STRLEN (EXCEPT_TAG);
+ *out_except = TRUE;
+ } else
+ *out_except = FALSE;
+ return spec_str;
+}
+
+NMMatchSpecMatchType
+nm_match_spec_device_type (const GSList *specs, const char *device_type)
{
const GSList *iter;
+ NMMatchSpecMatchType match = NM_MATCH_SPEC_NO_MATCH;
+
+ if (!device_type || !*device_type)
+ return NM_MATCH_SPEC_NO_MATCH;
for (iter = specs; iter; iter = g_slist_next (iter)) {
- if (!g_ascii_strcasecmp ((const char *) iter->data, match))
- return TRUE;
- }
+ const char *spec_str = iter->data;
+ gboolean except;
- return FALSE;
+ if (!spec_str || !*spec_str)
+ continue;
+
+ spec_str = _match_except (spec_str, &except);
+
+ if (g_ascii_strncasecmp (spec_str, DEVICE_TYPE_TAG, STRLEN (DEVICE_TYPE_TAG)) != 0)
+ continue;
+
+ spec_str += STRLEN (DEVICE_TYPE_TAG);
+ if (strcmp (spec_str, device_type) == 0) {
+ if (except)
+ return NM_MATCH_SPEC_NEG_MATCH;
+ match = NM_MATCH_SPEC_MATCH;
+ }
+ }
+ return match;
}
-gboolean
+NMMatchSpecMatchType
nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr)
{
const GSList *iter;
+ NMMatchSpecMatchType match = NM_MATCH_SPEC_NO_MATCH;
- g_return_val_if_fail (hwaddr != NULL, FALSE);
+ g_return_val_if_fail (hwaddr != NULL, NM_MATCH_SPEC_NO_MATCH);
for (iter = specs; iter; iter = g_slist_next (iter)) {
const char *spec_str = iter->data;
+ gboolean except;
- if ( !g_ascii_strncasecmp (spec_str, "mac:", 4)
- && nm_utils_hwaddr_matches (spec_str + 4, -1, hwaddr, -1))
- return TRUE;
+ if (!spec_str || !*spec_str)
+ continue;
- if (nm_utils_hwaddr_matches (spec_str, -1, hwaddr, -1))
- return TRUE;
- }
+ spec_str = _match_except (spec_str, &except);
- return FALSE;
+ if ( !g_ascii_strncasecmp (spec_str, INTERFACE_NAME_TAG, STRLEN (INTERFACE_NAME_TAG))
+ || !g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG))
+ || !g_ascii_strncasecmp (spec_str, DEVICE_TYPE_TAG, STRLEN (DEVICE_TYPE_TAG)))
+ continue;
+
+ if (!g_ascii_strncasecmp (spec_str, MAC_TAG, STRLEN (MAC_TAG)))
+ spec_str += STRLEN (MAC_TAG);
+ else if (except)
+ continue;
+
+ if (nm_utils_hwaddr_matches (spec_str, -1, hwaddr, -1)) {
+ if (except)
+ return NM_MATCH_SPEC_NEG_MATCH;
+ match = NM_MATCH_SPEC_MATCH;
+ }
+ }
+ return match;
}
-gboolean
+NMMatchSpecMatchType
nm_match_spec_interface_name (const GSList *specs, const char *interface_name)
{
- char *iface_match;
- gboolean matched;
+ const GSList *iter;
+ NMMatchSpecMatchType match = NM_MATCH_SPEC_NO_MATCH;
- g_return_val_if_fail (interface_name != NULL, FALSE);
+ g_return_val_if_fail (interface_name != NULL, NM_MATCH_SPEC_NO_MATCH);
- if (nm_match_spec_string (specs, interface_name))
- return TRUE;
+ for (iter = specs; iter; iter = g_slist_next (iter)) {
+ const char *spec_str = iter->data;
+ gboolean use_pattern = FALSE;
+ gboolean except;
+
+ if (!spec_str || !*spec_str)
+ continue;
+
+ spec_str = _match_except (spec_str, &except);
+
+ if ( !g_ascii_strncasecmp (spec_str, MAC_TAG, STRLEN (MAC_TAG))
+ || !g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG))
+ || !g_ascii_strncasecmp (spec_str, DEVICE_TYPE_TAG, STRLEN (DEVICE_TYPE_TAG)))
+ continue;
- iface_match = g_strdup_printf ("interface-name:%s", interface_name);
- matched = nm_match_spec_string (specs, iface_match);
- g_free (iface_match);
- return matched;
+ if (!g_ascii_strncasecmp (spec_str, INTERFACE_NAME_TAG, STRLEN (INTERFACE_NAME_TAG))) {
+ spec_str += STRLEN (INTERFACE_NAME_TAG);
+ if (spec_str[0] == '=')
+ spec_str += 1;
+ else {
+ if (spec_str[0] == '~')
+ spec_str += 1;
+ use_pattern=TRUE;
+ }
+ } else if (except)
+ continue;
+
+ if ( !strcmp (spec_str, interface_name)
+ || (use_pattern && g_pattern_match_simple (spec_str, interface_name))) {
+ if (except)
+ return NM_MATCH_SPEC_NEG_MATCH;
+ match = NM_MATCH_SPEC_MATCH;
+ }
+ }
+ return match;
}
#define BUFSIZE 10
@@ -944,33 +1274,225 @@ parse_subchannels (const char *subchannels, guint32 *a, guint32 *b, guint32 *c)
return TRUE;
}
-#define SUBCHAN_TAG "s390-subchannels:"
-
-gboolean
+NMMatchSpecMatchType
nm_match_spec_s390_subchannels (const GSList *specs, const char *subchannels)
{
const GSList *iter;
guint32 a = 0, b = 0, c = 0;
guint32 spec_a = 0, spec_b = 0, spec_c = 0;
+ NMMatchSpecMatchType match = NM_MATCH_SPEC_NO_MATCH;
- g_return_val_if_fail (subchannels != NULL, FALSE);
+ g_return_val_if_fail (subchannels != NULL, NM_MATCH_SPEC_NO_MATCH);
if (!parse_subchannels (subchannels, &a, &b, &c))
- return FALSE;
+ return NM_MATCH_SPEC_NO_MATCH;
for (iter = specs; iter; iter = g_slist_next (iter)) {
- const char *spec = iter->data;
+ const char *spec_str = iter->data;
+ gboolean except;
+
+ if (!spec_str || !*spec_str)
+ continue;
+
+ spec_str = _match_except (spec_str, &except);
- if (!strncmp (spec, SUBCHAN_TAG, strlen (SUBCHAN_TAG))) {
- spec += strlen (SUBCHAN_TAG);
- if (parse_subchannels (spec, &spec_a, &spec_b, &spec_c)) {
- if (a == spec_a && b == spec_b && c == spec_c)
- return TRUE;
+ if (!g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG))) {
+ spec_str += STRLEN (SUBCHAN_TAG);
+ if (parse_subchannels (spec_str, &spec_a, &spec_b, &spec_c)) {
+ if (a == spec_a && b == spec_b && c == spec_c) {
+ if (except)
+ return NM_MATCH_SPEC_NEG_MATCH;
+ match = NM_MATCH_SPEC_MATCH;
+ }
}
}
}
+ return match;
+}
- return FALSE;
+/**
+ * nm_match_spec_split:
+ * @value: the string of device specs
+ *
+ * Splits the specs from the string and returns them as individual
+ * entires in a #GSList.
+ *
+ * It does not validate any specs, it basically just does a special
+ * strsplit with ',' or ';' as separators and supporting '\\' as
+ * escape character.
+ *
+ * Leading and trailing spaces of each entry are removed. But the user
+ * can preserve them by specifying "\\s has 2 leading" or "has 2 trailing \\s".
+ *
+ * Specs can have a qualifier like "interface-name:". We still don't strip
+ * any whitespace after the colon, so "interface-name: X" matches an interface
+ * named " X".
+ *
+ * Returns: (transfer-full): the list of device specs.
+ */
+GSList *
+nm_match_spec_split (const char *value)
+{
+ char *string_value, *p, *q0, *q;
+ GSList *pieces = NULL;
+ int trailing_ws;
+
+ if (!value || !*value)
+ return NULL;
+
+ /* Copied from glibs g_key_file_parse_value_as_string() function
+ * and adjusted. */
+
+ string_value = g_new (gchar, strlen (value) + 1);
+
+ p = (gchar *) value;
+
+ /* skip over leading whitespace */
+ while (g_ascii_isspace (*p))
+ p++;
+
+ q0 = q = string_value;
+ trailing_ws = 0;
+ while (*p) {
+ if (*p == '\\') {
+ p++;
+
+ switch (*p) {
+ case 's':
+ *q = ' ';
+ break;
+ case 'n':
+ *q = '\n';
+ break;
+ case 't':
+ *q = '\t';
+ break;
+ case 'r':
+ *q = '\r';
+ break;
+ case '\\':
+ *q = '\\';
+ break;
+ case '\0':
+ break;
+ default:
+ if (NM_IN_SET (*p, ',', ';'))
+ *q = *p;
+ else {
+ *q++ = '\\';
+ *q = *p;
+ }
+ break;
+ }
+ if (*p == '\0')
+ break;
+ p++;
+ trailing_ws = 0;
+ } else {
+ *q = *p;
+ if (*p == '\0')
+ break;
+ if (g_ascii_isspace (*p)) {
+ trailing_ws++;
+ p++;
+ } else if (NM_IN_SET (*p, ',', ';')) {
+ if (q0 < q - trailing_ws)
+ pieces = g_slist_prepend (pieces, g_strndup (q0, (q - q0) - trailing_ws));
+ q0 = q + 1;
+ p++;
+ trailing_ws = 0;
+ while (g_ascii_isspace (*p))
+ p++;
+ } else
+ p++;
+ }
+ q++;
+ }
+
+ *q = '\0';
+ if (q0 < q - trailing_ws)
+ pieces = g_slist_prepend (pieces, g_strndup (q0, (q - q0) - trailing_ws));
+ g_free (string_value);
+ return g_slist_reverse (pieces);
+}
+
+/**
+ * nm_match_spec_join:
+ * @specs: the device specs to join
+ *
+ * This is based on g_key_file_parse_string_as_value(), analog to
+ * nm_match_spec_split() which is based on g_key_file_parse_value_as_string().
+ *
+ * Returns: (transfer-full): a joined list of device specs that can be
+ * split again with nm_match_spec_split(). Note that
+ * nm_match_spec_split (nm_match_spec_join (specs)) yields the original
+ * result (which is not true the other way around because there are multiple
+ * ways to encode the same joined specs string).
+ */
+char *
+nm_match_spec_join (GSList *specs)
+{
+ const char *p;
+ GString *str;
+
+ str = g_string_new ("");
+
+ for (; specs; specs = specs->next) {
+ p = specs->data;
+
+ if (!p || !*p)
+ continue;
+
+ if (str->len > 0)
+ g_string_append_c (str, ',');
+
+ /* escape leading whitespace */
+ switch (*p) {
+ case ' ':
+ g_string_append (str, "\\s");
+ p++;
+ break;
+ case '\t':
+ g_string_append (str, "\\t");
+ p++;
+ break;
+ }
+
+ for (; *p; p++) {
+ switch (*p) {
+ case '\n':
+ g_string_append (str, "\\n");
+ break;
+ case '\r':
+ g_string_append (str, "\\r");
+ break;
+ case '\\':
+ g_string_append (str, "\\\\");
+ break;
+ case ',':
+ g_string_append (str, "\\,");
+ break;
+ case ';':
+ g_string_append (str, "\\;");
+ break;
+ default:
+ g_string_append_c (str, *p);
+ break;
+ }
+ }
+
+ /* escape trailing whitespaces */
+ switch (str->str[str->len - 1]) {
+ case ' ':
+ g_string_overwrite (str, str->len - 1, "\\s");
+ break;
+ case '\t':
+ g_string_overwrite (str, str->len - 1, "\\t");
+ break;
+ }
+ }
+
+ return g_string_free (str, FALSE);
}
const char *
@@ -1165,7 +1687,7 @@ get_new_connection_ifname (const GSList *existing,
for (i = 0; i < 500; i++) {
name = g_strdup_printf ("%s%d", prefix, i);
- if (nm_platform_link_exists (name))
+ if (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, name))
goto next;
for (iter = existing, found = FALSE; iter; iter = g_slist_next (iter)) {
@@ -1204,7 +1726,8 @@ nm_utils_get_ip_config_method (NMConnection *connection,
return NM_SETTING_IP4_CONFIG_METHOD_DISABLED;
else {
s_ip4 = nm_connection_get_setting_ip4_config (connection);
- g_return_val_if_fail (s_ip4 != NULL, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
+ if (!s_ip4)
+ return NM_SETTING_IP4_CONFIG_METHOD_DISABLED;
method = nm_setting_ip_config_get_method (s_ip4);
g_return_val_if_fail (method != NULL, NM_SETTING_IP4_CONFIG_METHOD_AUTO);
@@ -1218,7 +1741,8 @@ nm_utils_get_ip_config_method (NMConnection *connection,
return NM_SETTING_IP6_CONFIG_METHOD_IGNORE;
else {
s_ip6 = nm_connection_get_setting_ip6_config (connection);
- g_return_val_if_fail (s_ip6 != NULL, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+ if (!s_ip6)
+ return NM_SETTING_IP6_CONFIG_METHOD_IGNORE;
method = nm_setting_ip_config_get_method (s_ip6);
g_return_val_if_fail (method != NULL, NM_SETTING_IP6_CONFIG_METHOD_AUTO);
@@ -1642,123 +2166,6 @@ nm_utils_cmp_connection_by_autoconnect_priority (NMConnection **a, NMConnection
return 0;
}
-/* nm_utils_ascii_str_to_int64:
- *
- * A wrapper for g_ascii_strtoll, that checks whether the whole string
- * can be successfully converted to a number and is within a given
- * range. On any error, @fallback will be returned and %errno will be set
- * to a non-zero value. On success, %errno will be set to zero, check %errno
- * for errors. Any trailing or leading (ascii) white space is ignored and the
- * functions is locale independent.
- *
- * The function is guaranteed to return a value between @min and @max
- * (inclusive) or @fallback. Also, the parsing is rather strict, it does
- * not allow for any unrecognized characters, except leading and trailing
- * white space.
- **/
-gint64
-nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback)
-{
- gint64 v;
- size_t len;
- char buf[64], *s, *str_free = NULL;
-
- if (str) {
- while (g_ascii_isspace (str[0]))
- str++;
- }
- if (!str || !str[0]) {
- errno = EINVAL;
- return fallback;
- }
-
- len = strlen (str);
- if (g_ascii_isspace (str[--len])) {
- /* backward search the first non-ws character.
- * We already know that str[0] is non-ws. */
- while (g_ascii_isspace (str[--len]))
- ;
-
- /* str[len] is now the last non-ws character... */
- len++;
-
- if (len >= sizeof (buf))
- s = str_free = g_malloc (len + 1);
- else
- s = buf;
-
- memcpy (s, str, len);
- s[len] = 0;
-
- /*
- g_assert (len > 0 && len < strlen (str) && len == strlen (s));
- g_assert (!g_ascii_isspace (str[len-1]) && g_ascii_isspace (str[len]));
- g_assert (strncmp (str, s, len) == 0);
- */
-
- str = s;
- }
-
- errno = 0;
- v = g_ascii_strtoll (str, &s, base);
-
- if (errno != 0)
- v = fallback;
- else if (s[0] != 0) {
- errno = EINVAL;
- v = fallback;
- } else if (v > max || v < min) {
- errno = ERANGE;
- v = fallback;
- }
-
- if (G_UNLIKELY (str_free))
- g_free (str_free);
- return v;
-}
-
-/**
- * nm_utils_uuid_generate_from_strings:
- * @string1: a variadic list of strings. Must be NULL terminated.
- *
- * Returns a variant3 UUID based on the concatenated C strings.
- * It does not simply concatenate them, but also includes the
- * terminating '\0' character. For example "a", "b", gives
- * "a\0b\0".
- *
- * This has the advantage, that the following invocations
- * all give different UUIDs: (NULL), (""), ("",""), ("","a"), ("a",""),
- * ("aa"), ("aa", ""), ("", "aa"), ...
- */
-char *
-nm_utils_uuid_generate_from_strings (const char *string1, ...)
-{
- GString *str;
- va_list args;
- const char *s;
- char *uuid;
-
- if (!string1)
- return nm_utils_uuid_generate_from_string (NULL, 0, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
-
- str = g_string_sized_new (120); /* effectively allocates power of 2 (128)*/
-
- g_string_append_len (str, string1, strlen (string1) + 1);
-
- va_start (args, string1);
- s = va_arg (args, const char *);
- while (s) {
- g_string_append_len (str, s, strlen (s) + 1);
- s = va_arg (args, const char *);
- }
- va_end (args);
-
- uuid = nm_utils_uuid_generate_from_string (str->str, str->len, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
-
- g_string_free (str, TRUE);
- return uuid;
-}
-
/**************************************************************************/
static gint64 monotonic_timestamp_offset_sec;
@@ -2253,11 +2660,10 @@ ASSERT_VALID_PATH_COMPONENT (const char *name)
return name;
fail:
- if (name)
- nm_log_err (LOGD_CORE, "Failed asserting path component: NULL");
- else
- nm_log_err (LOGD_CORE, "Failed asserting path component: \"%s\"", name);
- g_error ("FATAL: Failed asserting path component: %s", name ? name : "(null)");
+ nm_log_err (LOGD_CORE, "Failed asserting path component: %s%s%s",
+ NM_PRINT_FMT_QUOTED (name, "\"", name, "\"", "(null)"));
+ g_error ("FATAL: Failed asserting path component: %s%s%s",
+ NM_PRINT_FMT_QUOTED (name, "\"", name, "\"", "(null)"));
g_assert_not_reached ();
}
@@ -2555,3 +2961,21 @@ nm_utils_ip6_routes_from_gvalue (const GValue *value)
return g_slist_reverse (list);
}
+
+/**
+ * nm_utils_setpgid:
+ * @unused: unused
+ *
+ * This can be passed as a child setup function to the g_spawn*() family
+ * of functions, to ensure that the child is in its own process group
+ * (and thus, in some situations, will not be killed when NetworkManager
+ * is killed).
+ */
+void
+nm_utils_setpgid (gpointer unused G_GNUC_UNUSED)
+{
+ pid_t pid;
+
+ pid = getpid ();
+ setpgid (pid, pid);
+}
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index ae1edd820..1864547f5 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -51,14 +51,7 @@ nm_utils_ip6_route_metric_normalize (guint32 metric)
int nm_spawn_process (const char *args, GError **error);
-/* check if @flags has exactly one flag (@check) set. You should call this
- * only with @check being a compile time constant and a power of two. */
-#define NM_FLAGS_HAS(flags, check) \
- ( (G_STATIC_ASSERT_EXPR ( ((check) != 0) && ((check) & ((check)-1)) == 0 )), (NM_FLAGS_ANY ((flags), (check))) )
-
-#define NM_FLAGS_ANY(flags, check) ( ( ((flags) & (check)) != 0 ) ? TRUE : FALSE )
-#define NM_FLAGS_ALL(flags, check) ( ( ((flags) & (check)) == (check) ) ? TRUE : FALSE )
-
+int nm_utils_modprobe (GError **error, gboolean suppress_error_loggin, const char *arg1, ...) G_GNUC_NULL_TERMINATED;
/**
* str_if_set:
@@ -76,11 +69,11 @@ str_if_set (const char *str, const char *fallback)
return str ? str : fallback;
}
-guint64 nm_utils_get_start_time_for_pid (pid_t pid);
+guint64 nm_utils_get_start_time_for_pid (pid_t pid, char *out_state, pid_t *out_ppid);
void nm_utils_kill_process_sync (pid_t pid, guint64 start_time, int sig, guint64 log_domain,
const char *log_name, guint32 wait_before_kill_msec,
- guint32 sleep_duration_msec);
+ guint32 sleep_duration_msec, guint32 max_wait_msec);
typedef void (*NMUtilsKillChildAsyncCb) (pid_t pid, gboolean success, int child_status, void *user_data);
void nm_utils_kill_child_async (pid_t pid, int sig, guint64 log_domain, const char *log_name,
@@ -94,10 +87,18 @@ const char *nm_utils_find_helper (const char *progname,
const char *try_first,
GError **error);
-gboolean nm_match_spec_string (const GSList *specs, const char *string);
-gboolean nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr);
-gboolean nm_match_spec_s390_subchannels (const GSList *specs, const char *subchannels);
-gboolean nm_match_spec_interface_name (const GSList *specs, const char *interface_name);
+typedef enum {
+ NM_MATCH_SPEC_NO_MATCH = 0,
+ NM_MATCH_SPEC_MATCH = 1,
+ NM_MATCH_SPEC_NEG_MATCH = 2,
+} NMMatchSpecMatchType;
+
+NMMatchSpecMatchType nm_match_spec_device_type (const GSList *specs, const char *device_type);
+NMMatchSpecMatchType nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr);
+NMMatchSpecMatchType nm_match_spec_s390_subchannels (const GSList *specs, const char *subchannels);
+NMMatchSpecMatchType nm_match_spec_interface_name (const GSList *specs, const char *interface_name);
+GSList *nm_match_spec_split (const char *value);
+char *nm_match_spec_join (GSList *specs);
const char *nm_utils_get_shared_wifi_permission (NMConnection *connection);
@@ -155,19 +156,13 @@ int nm_utils_cmp_connection_by_autoconnect_priority (NMConnection **a, NMConnect
void nm_utils_log_connection_diff (NMConnection *connection, NMConnection *diff_base, guint32 level, guint64 domain, const char *name, const char *prefix);
-gint64 nm_utils_ascii_str_to_int64 (const char *str, guint base, gint64 min, gint64 max, gint64 fallback);
-
-#define NM_UTILS_UUID_NS "b425e9fb-7598-44b4-9e3b-5a2e3aaa4905"
-
-char *nm_utils_uuid_generate_from_strings (const char *string1, ...) G_GNUC_NULL_TERMINATED;
-
#define NM_UTILS_NS_PER_SECOND ((gint64) 1000000000)
gint64 nm_utils_get_monotonic_timestamp_ns (void);
gint64 nm_utils_get_monotonic_timestamp_us (void);
gint64 nm_utils_get_monotonic_timestamp_ms (void);
gint32 nm_utils_get_monotonic_timestamp_s (void);
-const char *ASSERT_VALID_PATH_COMPONENT (const char *name) G_GNUC_WARN_UNUSED_RESULT;
+const char *ASSERT_VALID_PATH_COMPONENT (const char *name);
const char *nm_utils_ip6_property_path (const char *ifname, const char *property);
const char *nm_utils_ip4_property_path (const char *ifname, const char *property);
@@ -184,12 +179,12 @@ gboolean nm_utils_is_specific_hostname (const char *name);
* and should not normally be treated as a %guint64, but this is done for
* convenience of validity checking and initialization.
*/
-typedef struct {
+struct _NMUtilsIPv6IfaceId {
union {
guint64 id;
guint8 id_u8[8];
};
-} NMUtilsIPv6IfaceId;
+};
#define NM_UTILS_IPV6_IFACE_ID_INIT { .id = 0 }
@@ -211,4 +206,28 @@ GHashTable *nm_utils_connection_dict_to_hash (GVariant *dict);
GSList *nm_utils_ip4_routes_from_gvalue (const GValue *value);
GSList *nm_utils_ip6_routes_from_gvalue (const GValue *value);
+void nm_utils_array_remove_at_indexes (GArray *array, const guint *indexes_to_delete, gsize len);
+
+void nm_utils_setpgid (gpointer unused);
+
+typedef enum {
+ NM_UTILS_TEST_NONE = 0,
+
+ /* Internal flag, marking that either nm_utils_get_testing() or _nm_utils_set_testing() was called. */
+ _NM_UTILS_TEST_INITIALIZED = (1LL << 0),
+
+ /* Indicate that test mode is enabled in general. Explicitly calling _nm_utils_set_testing() will always set this flag. */
+ _NM_UTILS_TEST_GENERAL = (1LL << 1),
+
+ /* Don't check the owner of keyfiles during testing. */
+ NM_UTILS_TEST_NO_KEYFILE_OWNER_CHECK = (1LL << 2),
+
+ _NM_UTILS_TEST_LAST,
+ NM_UTILS_TEST_ALL = (((_NM_UTILS_TEST_LAST - 1) << 1) - 1) & ~(_NM_UTILS_TEST_INITIALIZED),
+} NMUtilsTestFlags;
+
+gboolean nm_utils_get_testing_initialized (void);
+NMUtilsTestFlags nm_utils_get_testing (void);
+void _nm_utils_set_testing (NMUtilsTestFlags flags);
+
#endif /* __NETWORKMANAGER_UTILS_H__ */
diff --git a/src/devices/adsl/Makefile.in b/src/devices/adsl/Makefile.in
index 02da85e77..6f7fe1749 100644
--- a/src/devices/adsl/Makefile.in
+++ b/src/devices/adsl/Makefile.in
@@ -223,6 +223,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -336,6 +337,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/devices/adsl/nm-atm-manager.c b/src/devices/adsl/nm-atm-manager.c
index 6f34c02bb..0830f85d1 100644
--- a/src/devices/adsl/nm-atm-manager.c
+++ b/src/devices/adsl/nm-atm-manager.c
@@ -25,6 +25,7 @@
#include <gmodule.h>
#include "nm-atm-manager.h"
+#include "nm-setting-adsl.h"
#include "nm-device-adsl.h"
#include "nm-device-factory.h"
#include "nm-logging.h"
@@ -203,11 +204,9 @@ handle_uevent (GUdevClient *client,
adsl_remove (self, device);
}
-static NMDeviceType
-get_device_type (NMDeviceFactory *factory)
-{
- return NM_DEVICE_TYPE_ADSL;
-}
+NM_DEVICE_FACTORY_DECLARE_TYPES (
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_ADSL_SETTING_NAME)
+)
/*********************************************************************/
@@ -224,7 +223,7 @@ nm_atm_manager_init (NMAtmManager *self)
static void
device_factory_interface_init (NMDeviceFactory *factory_iface)
{
- factory_iface->get_device_type = get_device_type;
+ factory_iface->get_supported_types = get_supported_types;
factory_iface->start = start;
}
diff --git a/src/devices/adsl/nm-device-adsl.c b/src/devices/adsl/nm-device-adsl.c
index e664ff485..4d2cac5be 100644
--- a/src/devices/adsl/nm-device-adsl.c
+++ b/src/devices/adsl/nm-device-adsl.c
@@ -73,7 +73,7 @@ typedef struct {
/**************************************************************/
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *dev)
{
return ( NM_DEVICE_CAP_CARRIER_DETECT
@@ -144,7 +144,7 @@ set_nas_iface (NMDeviceAdsl *self, int idx, const char *name)
g_return_if_fail (name != NULL);
g_warn_if_fail (priv->nas_ifindex <= 0);
- priv->nas_ifindex = idx > 0 ? idx : nm_platform_link_get_ifindex (name);
+ priv->nas_ifindex = idx > 0 ? idx : nm_platform_link_get_ifindex (NM_PLATFORM_GET, name);
g_warn_if_fail (priv->nas_ifindex > 0);
g_warn_if_fail (priv->nas_ifname == NULL);
@@ -295,7 +295,7 @@ error:
}
static void
-link_changed_cb (NMPlatform *platform, int ifindex, NMPlatformLink *info, NMPlatformSignalChangeType change_type, NMPlatformReason reason, NMDeviceAdsl *self)
+link_changed_cb (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformLink *info, NMPlatformSignalChangeType change_type, NMPlatformReason reason, NMDeviceAdsl *self)
{
if (change_type == NM_PLATFORM_SIGNAL_REMOVED) {
NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (self);
@@ -352,7 +352,7 @@ act_stage2_config (NMDevice *device, NMDeviceStateReason *out_reason)
_LOGD (LOGD_ADSL, "ATM setup successful");
/* otherwise we're good for stage3 */
- nm_platform_link_set_up (priv->nas_ifindex);
+ nm_platform_link_set_up (NM_PLATFORM_GET, priv->nas_ifindex, NULL);
ret = NM_ACT_STAGE_RETURN_SUCCESS;
} else if (g_strcmp0 (protocol, NM_SETTING_ADSL_PROTOCOL_PPPOA) == 0) {
@@ -492,7 +492,7 @@ carrier_update_cb (gpointer user_data)
path = g_strdup_printf ("/sys/class/atm/%s/carrier",
ASSERT_VALID_PATH_COMPONENT (nm_device_get_iface (NM_DEVICE (self))));
- carrier = (int) nm_platform_sysctl_get_int_checked (path, 10, 0, 1, -1);
+ carrier = (int) nm_platform_sysctl_get_int_checked (NM_PLATFORM_GET, path, 10, 0, 1, -1);
g_free (path);
if (carrier != -1)
@@ -526,7 +526,7 @@ get_atm_index (const char *iface)
path = g_strdup_printf ("/sys/class/atm/%s/atmindex",
ASSERT_VALID_PATH_COMPONENT (iface));
- idx = (int) nm_platform_sysctl_get_int_checked (path, 10, 0, G_MAXINT, -1);
+ idx = (int) nm_platform_sysctl_get_int_checked (NM_PLATFORM_GET, path, 10, 0, G_MAXINT, -1);
g_free (path);
return idx;
diff --git a/src/devices/bluetooth/Makefile.in b/src/devices/bluetooth/Makefile.in
index b8e6dcdab..6233a7510 100644
--- a/src/devices/bluetooth/Makefile.in
+++ b/src/devices/bluetooth/Makefile.in
@@ -243,6 +243,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -356,6 +357,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/devices/bluetooth/nm-bluez-device.c b/src/devices/bluetooth/nm-bluez-device.c
index fe1a97bba..d5426052f 100644
--- a/src/devices/bluetooth/nm-bluez-device.c
+++ b/src/devices/bluetooth/nm-bluez-device.c
@@ -28,6 +28,7 @@
#include "nm-core-internal.h"
+#include "nm-bt-error.h"
#include "nm-bluez-common.h"
#include "nm-bluez-device.h"
#include "nm-logging.h"
@@ -436,8 +437,6 @@ nm_bluez_device_disconnect (NMBluezDevice *self)
} else if (priv->bluez_version == 5) {
#if WITH_BLUEZ5_DUN
nm_bluez5_dun_cleanup (priv->b5_dun_context);
-#else
- g_assert_not_reached ();
#endif
priv->connected = FALSE;
goto out;
@@ -559,7 +558,11 @@ nm_bluez_device_connect_async (NMBluezDevice *self,
priv->b5_dun_context = nm_bluez5_dun_new (priv->adapter_address, priv->address);
nm_bluez5_dun_connect (priv->b5_dun_context, bluez5_dun_connect_cb, simple);
#else
- g_assert_not_reached ();
+ g_simple_async_result_set_error (simple,
+ NM_BT_ERROR,
+ NM_BT_ERROR_DUN_CONNECT_FAILED,
+ "NetworkManager built without support for Bluez 5");
+ g_simple_async_result_complete (simple);
#endif
return;
}
diff --git a/src/devices/bluetooth/nm-bluez-manager.c b/src/devices/bluetooth/nm-bluez-manager.c
index e176a4b46..df4eb46d9 100644
--- a/src/devices/bluetooth/nm-bluez-manager.c
+++ b/src/devices/bluetooth/nm-bluez-manager.c
@@ -29,6 +29,7 @@
#include "nm-logging.h"
#include "nm-bluez-manager.h"
#include "nm-device-factory.h"
+#include "nm-setting-bluetooth.h"
#include "nm-bluez4-manager.h"
#include "nm-bluez5-manager.h"
#include "nm-bluez-device.h"
@@ -37,6 +38,7 @@
#include "nm-device-bt.h"
#include "nm-dbus-manager.h"
+#include "nm-platform.h"
typedef struct {
int bluez_version;
@@ -368,11 +370,10 @@ start (NMDeviceFactory *factory)
check_bluez_and_try_setup (NM_BLUEZ_MANAGER (factory));
}
-static NMDeviceType
-get_device_type (NMDeviceFactory *factory)
-{
- return NM_DEVICE_TYPE_BT;
-}
+NM_DEVICE_FACTORY_DECLARE_TYPES (
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_BNEP)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_BLUETOOTH_SETTING_NAME)
+)
/*********************************************************************/
@@ -405,10 +406,19 @@ nm_bluez_manager_init (NMBluezManager *self)
g_assert (priv->provider);
}
+static NMDevice *
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
+{
+ g_warn_if_fail (plink->type == NM_LINK_TYPE_BNEP);
+ *out_ignore = TRUE;
+ return NULL;
+}
+
static void
device_factory_interface_init (NMDeviceFactory *factory_iface)
{
- factory_iface->get_device_type = get_device_type;
+ factory_iface->get_supported_types = get_supported_types;
+ factory_iface->new_link = new_link;
factory_iface->start = start;
}
diff --git a/src/devices/bluetooth/nm-device-bt.c b/src/devices/bluetooth/nm-device-bt.c
index 61371ddde..88033e2e8 100644
--- a/src/devices/bluetooth/nm-device-bt.c
+++ b/src/devices/bluetooth/nm-device-bt.c
@@ -124,7 +124,7 @@ get_connection_bt_type (NMConnection *connection)
return NM_BT_CAPABILITY_NONE;
}
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *device)
{
return NM_DEVICE_CAP_IS_NON_KERNEL;
@@ -479,6 +479,13 @@ device_state_changed (NMDevice *device,
if (priv->modem)
nm_modem_device_state_changed (priv->modem, new_state, old_state, reason);
+
+ /* Need to recheck available connections whenever MM appears or disappears,
+ * since the device could be both DUN and NAP capable and thus may not
+ * change state (which rechecks available connections) when MM comes and goes.
+ */
+ if (priv->mm_running && (priv->capabilities & NM_BT_CAPABILITY_DUN))
+ nm_device_recheck_available_connections (device);
}
static void
@@ -944,60 +951,19 @@ is_available (NMDevice *dev, NMDeviceCheckDevAvailableFlags flags)
}
static void
-handle_availability_change (NMDeviceBt *self,
- gboolean old_available,
- NMDeviceStateReason unavailable_reason)
-{
- NMDevice *device = NM_DEVICE (self);
- NMDeviceState state;
- gboolean available;
-
- state = nm_device_get_state (device);
- if (state < NM_DEVICE_STATE_UNAVAILABLE) {
- _LOGD (LOGD_BT, "availability blocked by UNMANAGED state");
- return;
- }
-
- available = nm_device_is_available (device, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE);
- if (available == old_available)
- return;
-
- if (available) {
- if (state != NM_DEVICE_STATE_UNAVAILABLE)
- _LOGW (LOGD_CORE | LOGD_BT, "not in expected unavailable state!");
-
- nm_device_state_changed (device,
- NM_DEVICE_STATE_DISCONNECTED,
- NM_DEVICE_STATE_REASON_NONE);
- } else {
- nm_device_state_changed (device,
- NM_DEVICE_STATE_UNAVAILABLE,
- unavailable_reason);
- }
-}
-
-static void
set_mm_running (NMDeviceBt *self, gboolean running)
{
NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (self);
- gboolean old_available;
- if (priv->mm_running == running)
- return;
-
- _LOGD (LOGD_BT, "ModemManager now %s",
- running ? "available" : "unavailable");
+ if (priv->mm_running != running) {
+ _LOGD (LOGD_BT, "ModemManager now %s",
+ running ? "available" : "unavailable");
- old_available = nm_device_is_available (NM_DEVICE (self), NM_DEVICE_CHECK_DEV_AVAILABLE_NONE);
- priv->mm_running = running;
- handle_availability_change (self, old_available, NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE);
-
- /* Need to recheck available connections whenever MM appears or disappears,
- * since the device could be both DUN and NAP capable and thus may not
- * change state (which rechecks available connections) when MM comes and goes.
- */
- if (priv->capabilities & NM_BT_CAPABILITY_DUN)
- nm_device_recheck_available_connections (NM_DEVICE (self));
+ priv->mm_running = running;
+ nm_device_queue_recheck_available (NM_DEVICE (self),
+ NM_DEVICE_STATE_REASON_NONE,
+ NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE);
+ }
}
static void
diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c
index 0b2c97d14..7f1394248 100644
--- a/src/devices/nm-device-bond.c
+++ b/src/devices/nm-device-bond.c
@@ -37,6 +37,7 @@
#include "nm-enum-types.h"
#include "nm-device-factory.h"
#include "nm-core-internal.h"
+#include "nm-ip4-config.h"
#include "nm-device-bond-glue.h"
@@ -60,18 +61,16 @@ enum {
/******************************************************************/
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *dev)
{
- return NM_DEVICE_CAP_CARRIER_DETECT;
+ return NM_DEVICE_CAP_CARRIER_DETECT | NM_DEVICE_CAP_IS_SOFTWARE;
}
static gboolean
is_available (NMDevice *dev, NMDeviceCheckDevAvailableFlags flags)
{
- if (NM_DEVICE_GET_CLASS (dev)->is_up)
- return NM_DEVICE_GET_CLASS (dev)->is_up (dev);
- return FALSE;
+ return TRUE;
}
static gboolean
@@ -144,7 +143,7 @@ set_bond_attr (NMDevice *device, const char *attr, const char *value)
gboolean ret;
int ifindex = nm_device_get_ifindex (device);
- ret = nm_platform_master_set_option (ifindex, attr, value);
+ ret = nm_platform_master_set_option (NM_PLATFORM_GET, ifindex, attr, value);
if (!ret)
_LOGW (LOGD_HW, "failed to set bonding attribute '%s' to '%s'", attr, value);
return ret;
@@ -178,7 +177,7 @@ update_connection (NMDevice *device, NMConnection *connection)
/* Read bond options from sysfs and update the Bond setting to match */
options = nm_setting_bond_get_valid_options (s_bond);
while (options && *options) {
- gs_free char *value = nm_platform_master_get_option (ifindex, *options);
+ gs_free char *value = nm_platform_master_get_option (NM_PLATFORM_GET, ifindex, *options);
const char *defvalue = nm_setting_bond_get_option_default (s_bond, *options);
if (value && !ignore_if_zero (*options, value) && (g_strcmp0 (value, defvalue) != 0)) {
@@ -334,7 +333,7 @@ apply_bonding_config (NMDevice *device)
}
/* Clear ARP targets */
- contents = nm_platform_master_get_option (ifindex, "arp_ip_target");
+ contents = nm_platform_master_get_option (NM_PLATFORM_GET, ifindex, "arp_ip_target");
set_arp_targets (device, contents, " \n", "-");
g_free (contents);
@@ -377,6 +376,25 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
return ret;
}
+static void
+ip4_config_pre_commit (NMDevice *self, NMIP4Config *config)
+{
+ NMConnection *connection;
+ NMSettingWired *s_wired;
+ guint32 mtu;
+
+ connection = nm_device_get_connection (self);
+ g_assert (connection);
+ s_wired = nm_connection_get_setting_wired (connection);
+
+ if (s_wired) {
+ /* MTU override */
+ mtu = nm_setting_wired_get_mtu (s_wired);
+ if (mtu)
+ nm_ip4_config_set_mtu (config, mtu, NM_IP_CONFIG_SOURCE_USER);
+ }
+}
+
static gboolean
enslave_slave (NMDevice *device,
NMDevice *slave,
@@ -391,7 +409,8 @@ enslave_slave (NMDevice *device,
if (configure) {
nm_device_take_down (slave, TRUE);
- success = nm_platform_link_enslave (nm_device_get_ip_ifindex (device),
+ success = nm_platform_link_enslave (NM_PLATFORM_GET,
+ nm_device_get_ip_ifindex (device),
nm_device_get_ip_ifindex (slave));
nm_device_bring_up (slave, TRUE, &no_firmware);
@@ -415,7 +434,8 @@ release_slave (NMDevice *device,
gboolean success = TRUE, no_firmware = FALSE;
if (configure) {
- success = nm_platform_link_release (nm_device_get_ip_ifindex (device),
+ success = nm_platform_link_release (NM_PLATFORM_GET,
+ nm_device_get_ip_ifindex (device),
nm_device_get_ip_ifindex (slave));
if (success) {
@@ -510,6 +530,7 @@ nm_device_bond_class_init (NMDeviceBondClass *klass)
parent_class->master_update_slave_connection = master_update_slave_connection;
parent_class->act_stage1_prepare = act_stage1_prepare;
+ parent_class->ip4_config_pre_commit = ip4_config_pre_commit;
parent_class->enslave_slave = enslave_slave;
parent_class->release_slave = release_slave;
@@ -532,18 +553,15 @@ nm_device_bond_class_init (NMDeviceBondClass *klass)
#define NM_BOND_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_BOND_FACTORY, NMBondFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_BOND) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_BOND,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_DRIVER, "bonding",
- NM_DEVICE_TYPE_DESC, "Bond",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BOND,
- NM_DEVICE_IS_MASTER, TRUE,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_BOND,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_DRIVER, "bonding",
+ NM_DEVICE_TYPE_DESC, "Bond",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BOND,
+ NM_DEVICE_IS_MASTER, TRUE,
+ NULL);
}
static NMDevice *
@@ -552,19 +570,18 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NMDevice *parent,
GError **error)
{
- const char *iface;
-
- if (!nm_connection_is_type (connection, NM_SETTING_BOND_SETTING_NAME))
- return NULL;
-
- iface = nm_connection_get_interface_name (connection);
- g_return_val_if_fail (iface != NULL, NULL);
-
- if ( !nm_platform_bond_add (iface)
- && nm_platform_get_error () != NM_PLATFORM_ERROR_EXISTS) {
- nm_log_warn (LOGD_DEVICE | LOGD_BOND, "(%s): failed to create bonding master interface for '%s': %s",
- iface, nm_connection_get_id (connection),
- nm_platform_get_error_msg ());
+ const char *iface = nm_connection_get_interface_name (connection);
+ NMPlatformError plerr;
+
+ g_assert (iface);
+
+ plerr = nm_platform_bond_add (NM_PLATFORM_GET, iface, NULL);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS && plerr != NM_PLATFORM_ERROR_EXISTS) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create bond interface '%s' for '%s': %s",
+ iface,
+ nm_connection_get_id (connection),
+ nm_platform_error_to_string (plerr));
return NULL;
}
@@ -577,7 +594,9 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL(BOND, Bond, bond,
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (BOND, Bond, bond,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_BOND)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_BOND_SETTING_NAME),
factory_iface->new_link = new_link;
factory_iface->create_virtual_device_for_connection = create_virtual_device_for_connection;
)
diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c
index a2ed4b417..e1cafd604 100644
--- a/src/devices/nm-device-bridge.c
+++ b/src/devices/nm-device-bridge.c
@@ -59,18 +59,16 @@ enum {
/******************************************************************/
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *dev)
{
- return NM_DEVICE_CAP_CARRIER_DETECT;
+ return NM_DEVICE_CAP_CARRIER_DETECT | NM_DEVICE_CAP_IS_SOFTWARE;
}
static gboolean
is_available (NMDevice *dev, NMDeviceCheckDevAvailableFlags flags)
{
- if (NM_DEVICE_GET_CLASS (dev)->is_up)
- return NM_DEVICE_GET_CLASS (dev)->is_up (dev);
- return FALSE;
+ return TRUE;
}
static gboolean
@@ -213,9 +211,9 @@ commit_option (NMDevice *device, NMSetting *setting, const Option *option, gbool
value = g_strdup_printf ("%u", uval);
if (slave)
- nm_platform_slave_set_option (ifindex, option->sysname, value);
+ nm_platform_slave_set_option (NM_PLATFORM_GET, ifindex, option->sysname, value);
else
- nm_platform_master_set_option (ifindex, option->sysname, value);
+ nm_platform_master_set_option (NM_PLATFORM_GET, ifindex, option->sysname, value);
}
static void
@@ -259,7 +257,7 @@ update_connection (NMDevice *device, NMConnection *connection)
}
for (option = master_options; option->name; option++) {
- gs_free char *str = nm_platform_master_get_option (ifindex, option->sysname);
+ gs_free char *str = nm_platform_master_get_option (NM_PLATFORM_GET, ifindex, option->sysname);
int value;
if (str) {
@@ -298,7 +296,7 @@ master_update_slave_connection (NMDevice *device,
}
for (option = slave_options; option->name; option++) {
- gs_free char *str = nm_platform_slave_get_option (ifindex_slave, option->sysname);
+ gs_free char *str = nm_platform_slave_get_option (NM_PLATFORM_GET, ifindex_slave, option->sysname);
int value;
if (str) {
@@ -346,7 +344,7 @@ enslave_slave (NMDevice *device,
NMDeviceBridge *self = NM_DEVICE_BRIDGE (device);
if (configure) {
- if (!nm_platform_link_enslave (nm_device_get_ip_ifindex (device), nm_device_get_ip_ifindex (slave)))
+ if (!nm_platform_link_enslave (NM_PLATFORM_GET, nm_device_get_ip_ifindex (device), nm_device_get_ip_ifindex (slave)))
return FALSE;
commit_slave_options (slave, nm_connection_get_setting_bridge_port (connection));
@@ -372,7 +370,8 @@ release_slave (NMDevice *device,
gboolean success = TRUE;
if (configure) {
- success = nm_platform_link_release (nm_device_get_ip_ifindex (device),
+ success = nm_platform_link_release (NM_PLATFORM_GET,
+ nm_device_get_ip_ifindex (device),
nm_device_get_ip_ifindex (slave));
if (success) {
@@ -477,18 +476,15 @@ nm_device_bridge_class_init (NMDeviceBridgeClass *klass)
#define NM_BRIDGE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_BRIDGE_FACTORY, NMBridgeFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_BRIDGE) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_BRIDGE,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_DRIVER, "bridge",
- NM_DEVICE_TYPE_DESC, "Bridge",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BRIDGE,
- NM_DEVICE_IS_MASTER, TRUE,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_BRIDGE,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_DRIVER, "bridge",
+ NM_DEVICE_TYPE_DESC, "Bridge",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BRIDGE,
+ NM_DEVICE_IS_MASTER, TRUE,
+ NULL);
}
static NMDevice *
@@ -497,21 +493,16 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NMDevice *parent,
GError **error)
{
- const char *iface;
+ const char *iface = nm_connection_get_interface_name (connection);
NMSettingBridge *s_bridge;
const char *mac_address_str;
guint8 mac_address[NM_UTILS_HWADDR_LEN_MAX];
+ NMPlatformError plerr;
- if (!nm_connection_is_type (connection, NM_SETTING_BRIDGE_SETTING_NAME))
- return NULL;
-
- g_return_val_if_fail (connection != NULL, NULL);
-
- iface = nm_connection_get_interface_name (connection);
- g_return_val_if_fail (iface != NULL, NULL);
+ g_assert (iface);
s_bridge = nm_connection_get_setting_bridge (connection);
- g_return_val_if_fail (s_bridge, NULL);
+ g_assert (s_bridge);
mac_address_str = nm_setting_bridge_get_mac_address (s_bridge);
if (mac_address_str) {
@@ -519,13 +510,17 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
mac_address_str = NULL;
}
- if ( !nm_platform_bridge_add (iface,
+ plerr = nm_platform_bridge_add (NM_PLATFORM_GET,
+ iface,
mac_address_str ? mac_address : NULL,
- mac_address_str ? ETH_ALEN : 0)
- && nm_platform_get_error () != NM_PLATFORM_ERROR_EXISTS) {
- nm_log_warn (LOGD_DEVICE | LOGD_BRIDGE, "(%s): failed to create bridge master interface for '%s': %s",
- iface, nm_connection_get_id (connection),
- nm_platform_get_error_msg ());
+ mac_address_str ? ETH_ALEN : 0,
+ NULL);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS && plerr != NM_PLATFORM_ERROR_EXISTS) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create bridge interface '%s' for '%s': %s",
+ iface,
+ nm_connection_get_id (connection),
+ nm_platform_error_to_string (plerr));
return NULL;
}
@@ -538,7 +533,9 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL(BRIDGE, Bridge, bridge,
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (BRIDGE, Bridge, bridge,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_BRIDGE)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_BRIDGE_SETTING_NAME),
factory_iface->new_link = new_link;
factory_iface->create_virtual_device_for_connection = create_virtual_device_for_connection;
)
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index ac408d3d9..af2cb8f26 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -26,10 +26,6 @@
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
-#include <linux/sockios.h>
-#include <linux/ethtool.h>
-#include <linux/version.h>
-#include <sys/ioctl.h>
#include <unistd.h>
#include <errno.h>
@@ -48,6 +44,7 @@
#include "nm-enum-types.h"
#include "nm-dbus-manager.h"
#include "nm-platform.h"
+#include "nm-platform-utils.h"
#include "nm-dcb.h"
#include "nm-settings-connection.h"
#include "nm-config.h"
@@ -55,6 +52,7 @@
#include "nm-connection-provider.h"
#include "nm-device-factory.h"
#include "nm-core-internal.h"
+#include "NetworkManagerUtils.h"
#include "nm-device-ethernet-glue.h"
@@ -99,9 +97,6 @@ typedef enum {
} DcbWait;
typedef struct {
- char * perm_hw_addr; /* Permanent MAC address */
- char * initial_hw_addr; /* Initial MAC address (as seen when NM starts) */
-
guint32 speed;
Supplicant supplicant;
@@ -156,26 +151,21 @@ static void
_update_s390_subchannels (NMDeviceEthernet *self)
{
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
- GUdevClient *client;
GUdevDevice *dev;
GUdevDevice *parent = NULL;
const char *parent_path, *item, *driver;
- const char *subsystems[] = { "net", NULL };
+ int ifindex;
GDir *dir;
GError *error = NULL;
- client = g_udev_client_new (subsystems);
- if (!client) {
- _LOGW (LOGD_DEVICE | LOGD_HW, "failed to initialize GUdev client");
- return;
- }
-
- dev = g_udev_client_query_by_subsystem_and_name (client, "net",
- nm_device_get_iface (NM_DEVICE (self)));
+ ifindex = nm_device_get_ifindex (NM_DEVICE (self));
+ dev = (GUdevDevice *) nm_platform_link_get_udev_device (NM_PLATFORM_GET, ifindex);
if (!dev) {
- _LOGW (LOGD_DEVICE | LOGD_HW, "failed to find device with udev");
+ _LOGW (LOGD_DEVICE | LOGD_HW, "failed to find device %d '%s' with udev",
+ ifindex, str_if_set (nm_device_get_iface (NM_DEVICE (self)), "(null)"));
goto out;
}
+ g_object_ref (dev);
/* Try for the "ccwgroup" parent */
parent = g_udev_device_get_parent_with_subsystem (dev, "ccwgroup", NULL);
@@ -210,7 +200,7 @@ _update_s390_subchannels (NMDeviceEthernet *self)
|| !strcmp (item, "portno")) {
char *path, *value;
path = g_strdup_printf ("%s/%s", parent_path, item);
- value = nm_platform_sysctl_get (path);
+ value = nm_platform_sysctl_get (NM_PLATFORM_GET, path);
if (value && *value)
g_hash_table_insert (priv->s390_options, g_strdup (item), g_strdup (value));
else
@@ -247,7 +237,6 @@ out:
g_object_unref (parent);
if (dev)
g_object_unref (dev);
- g_object_unref (client);
}
static GObject*
@@ -263,7 +252,7 @@ constructor (GType type,
if (object) {
#ifndef G_DISABLE_ASSERT
int ifindex = nm_device_get_ifindex (NM_DEVICE (object));
- NMLinkType link_type = nm_platform_link_get_type (ifindex);
+ NMLinkType link_type = nm_platform_link_get_type (NM_PLATFORM_GET, ifindex);
g_assert ( link_type == NM_LINK_TYPE_ETHERNET
|| link_type == NM_LINK_TYPE_VETH
@@ -310,72 +299,12 @@ nm_device_ethernet_init (NMDeviceEthernet *self)
priv->s390_options = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
}
-static void
-update_permanent_hw_address (NMDevice *dev)
-{
- NMDeviceEthernet *self = NM_DEVICE_ETHERNET (dev);
- NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
- struct ifreq req;
- struct ethtool_perm_addr *epaddr = NULL;
- int fd, ret, errsv;
- const char *mac;
-
- g_return_if_fail (priv->perm_hw_addr == NULL);
-
- fd = socket (PF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
- _LOGW (LOGD_HW, "couldn't open control socket.");
- return;
- }
-
- /* Get permanent MAC address */
- memset (&req, 0, sizeof (struct ifreq));
- strncpy (req.ifr_name, nm_device_get_iface (dev), IFNAMSIZ);
-
- epaddr = g_malloc0 (sizeof (struct ethtool_perm_addr) + ETH_ALEN);
- epaddr->cmd = ETHTOOL_GPERMADDR;
- epaddr->size = ETH_ALEN;
- req.ifr_data = (void *) epaddr;
-
- errno = 0;
- ret = ioctl (fd, SIOCETHTOOL, &req);
- errsv = errno;
- if ((ret < 0) || !nm_ethernet_address_is_valid (epaddr->data, ETH_ALEN)) {
- _LOGD (LOGD_HW | LOGD_ETHER, "unable to read permanent MAC address (error %d)", errsv);
- /* Fall back to current address */
- mac = nm_device_get_hw_address (dev);
- if (mac)
- nm_utils_hwaddr_aton (mac, epaddr->data, ETH_ALEN);
- else
- memset (epaddr->data, 0, ETH_ALEN);
- }
-
- priv->perm_hw_addr = nm_utils_hwaddr_ntoa (epaddr->data, ETH_ALEN);
-
- g_free (epaddr);
- close (fd);
-}
-
-static void
-update_initial_hw_address (NMDevice *dev)
-{
- NMDeviceEthernet *self = NM_DEVICE_ETHERNET (dev);
- NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
-
- /* This sets initial MAC address from current MAC address. It should only
- * be called from NMDevice constructor() to really get the initial address.
- */
- priv->initial_hw_addr = g_strdup (nm_device_get_hw_address (dev));
-
- _LOGD (LOGD_DEVICE | LOGD_ETHER, "read initial MAC address %s", priv->initial_hw_addr);
-}
-
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *device)
{
NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device);
- if (nm_platform_link_supports_carrier_detect (nm_device_get_ifindex (device)))
+ if (nm_platform_link_supports_carrier_detect (NM_PLATFORM_GET, nm_device_get_ifindex (device)))
return NM_DEVICE_CAP_CARRIER_DETECT;
else {
_LOGI (LOGD_HW, "driver '%s' does not support carrier detection.",
@@ -421,7 +350,6 @@ static gboolean
check_connection_compatible (NMDevice *device, NMConnection *connection)
{
NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device);
- NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
NMSettingWired *s_wired;
if (!NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->check_connection_compatible (device, connection))
@@ -438,7 +366,7 @@ check_connection_compatible (NMDevice *device, NMConnection *connection)
return FALSE;
if (s_wired) {
- const char *mac;
+ const char *mac, *perm_hw_addr;
gboolean try_mac = TRUE;
const char * const *mac_blacklist;
int i;
@@ -446,21 +374,25 @@ check_connection_compatible (NMDevice *device, NMConnection *connection)
if (!match_subchans (self, s_wired, &try_mac))
return FALSE;
+ perm_hw_addr = nm_device_get_permanent_hw_address (device);
mac = nm_setting_wired_get_mac_address (s_wired);
- if (try_mac && mac && !nm_utils_hwaddr_matches (mac, -1, priv->perm_hw_addr, -1))
- return FALSE;
-
- /* Check for MAC address blacklist */
- mac_blacklist = nm_setting_wired_get_mac_address_blacklist (s_wired);
- for (i = 0; mac_blacklist[i]; i++) {
- if (!nm_utils_hwaddr_valid (mac_blacklist[i], ETH_ALEN)) {
- g_warn_if_reached ();
+ if (perm_hw_addr) {
+ if (try_mac && mac && !nm_utils_hwaddr_matches (mac, -1, perm_hw_addr, -1))
return FALSE;
- }
- if (nm_utils_hwaddr_matches (mac_blacklist[i], -1, priv->perm_hw_addr, -1))
- return FALSE;
- }
+ /* Check for MAC address blacklist */
+ mac_blacklist = nm_setting_wired_get_mac_address_blacklist (s_wired);
+ for (i = 0; mac_blacklist[i]; i++) {
+ if (!nm_utils_hwaddr_valid (mac_blacklist[i], ETH_ALEN)) {
+ g_warn_if_reached ();
+ return FALSE;
+ }
+
+ if (nm_utils_hwaddr_matches (mac_blacklist[i], -1, perm_hw_addr, -1))
+ return FALSE;
+ }
+ } else if (mac)
+ return FALSE;
}
return TRUE;
@@ -1160,7 +1092,7 @@ dcb_state (NMDevice *device, gboolean timeout)
g_return_if_fail (nm_device_get_state (device) == NM_DEVICE_STATE_CONFIG);
- carrier = nm_platform_link_is_connected (nm_device_get_ifindex (device));
+ carrier = nm_platform_link_is_connected (NM_PLATFORM_GET, nm_device_get_ifindex (device));
_LOGD (LOGD_DCB, "dcb_state() wait %d carrier %d timeout %d", priv->dcb_wait, carrier, timeout);
switch (priv->dcb_wait) {
@@ -1278,7 +1210,7 @@ act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
s_dcb = (NMSettingDcb *) device_get_setting (device, NM_TYPE_SETTING_DCB);
if (s_dcb) {
/* lldpad really really wants the carrier to be up */
- if (nm_platform_link_is_connected (nm_device_get_ifindex (device))) {
+ if (nm_platform_link_is_connected (NM_PLATFORM_GET, nm_device_get_ifindex (device))) {
if (!dcb_enable (device)) {
*reason = NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED;
return NM_ACT_STAGE_RETURN_FAILURE;
@@ -1391,8 +1323,8 @@ deactivate (NMDevice *device)
NM_DEVICE_ETHERNET_GET_PRIVATE (device)->last_pppoe_time = nm_utils_get_monotonic_timestamp_s ();
/* Reset MAC address back to initial address */
- if (priv->initial_hw_addr)
- nm_device_set_hw_addr (device, priv->initial_hw_addr, "reset", LOGD_ETHER);
+ if (nm_device_get_initial_hw_address (device))
+ nm_device_set_hw_addr (device, nm_device_get_initial_hw_address (device), "reset", LOGD_ETHER);
}
static gboolean
@@ -1402,10 +1334,10 @@ complete_connection (NMDevice *device,
const GSList *existing_connections,
GError **error)
{
- NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (device);
NMSettingWired *s_wired;
NMSettingPppoe *s_pppoe;
const char *setting_mac;
+ const char *perm_hw_addr;
s_pppoe = nm_connection_get_setting_pppoe (connection);
@@ -1432,21 +1364,22 @@ complete_connection (NMDevice *device,
nm_connection_add_setting (connection, NM_SETTING (s_wired));
}
- setting_mac = nm_setting_wired_get_mac_address (s_wired);
- if (setting_mac) {
- /* Make sure the setting MAC (if any) matches the device's permanent MAC */
- if (!nm_utils_hwaddr_matches (setting_mac, -1, priv->perm_hw_addr, -1)) {
- g_set_error_literal (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("connection does not match device"));
- g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MAC_ADDRESS);
- return FALSE;
- }
- } else {
- if (!nm_utils_hwaddr_matches (priv->perm_hw_addr, -1, NULL, ETH_ALEN)) {
+ perm_hw_addr = nm_device_get_permanent_hw_address (device);
+ if (perm_hw_addr) {
+ setting_mac = nm_setting_wired_get_mac_address (s_wired);
+ if (setting_mac) {
+ /* Make sure the setting MAC (if any) matches the device's permanent MAC */
+ if (!nm_utils_hwaddr_matches (setting_mac, -1, perm_hw_addr, -1)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("connection does not match device"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_WIRED_MAC_ADDRESS);
+ return FALSE;
+ }
+ } else {
g_object_set (G_OBJECT (s_wired),
- NM_SETTING_WIRED_MAC_ADDRESS, priv->perm_hw_addr,
+ NM_SETTING_WIRED_MAC_ADDRESS, perm_hw_addr,
NULL);
}
}
@@ -1463,7 +1396,7 @@ new_default_connection (NMDevice *self)
const char *hw_address;
char *defname, *uuid;
- if (!nm_config_get_ethernet_can_auto_default (nm_config_get (), self))
+ if (nm_config_get_no_auto_default_for_device (nm_config_get (), self))
return NULL;
hw_address = nm_device_get_hw_address (self);
@@ -1495,15 +1428,19 @@ new_default_connection (NMDevice *self)
return connection;
}
-static gboolean
+static NMMatchSpecMatchType
spec_match_list (NMDevice *device, const GSList *specs)
{
+ NMMatchSpecMatchType matched = NM_MATCH_SPEC_NO_MATCH, m;
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (device);
- if (priv->subchannels && nm_match_spec_s390_subchannels (specs, priv->subchannels))
- return TRUE;
-
- return NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->spec_match_list (device, specs);
+ if (priv->subchannels)
+ matched = nm_match_spec_s390_subchannels (specs, priv->subchannels);
+ if (matched != NM_MATCH_SPEC_NEG_MATCH) {
+ m = NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->spec_match_list (device, specs);
+ matched = MAX (matched, m);
+ }
+ return matched;
}
static void
@@ -1511,6 +1448,7 @@ update_connection (NMDevice *device, NMConnection *connection)
{
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (device);
NMSettingWired *s_wired = nm_connection_get_setting_wired (connection);
+ const char *perm_hw_addr = nm_device_get_permanent_hw_address (device);
const char *mac = nm_device_get_hw_address (device);
const char *mac_prop = NM_SETTING_WIRED_MAC_ADDRESS;
GHashTableIter iter;
@@ -1524,11 +1462,11 @@ update_connection (NMDevice *device, NMConnection *connection)
/* If the device reports a permanent address, use that for the MAC address
* and the current MAC, if different, is the cloned MAC.
*/
- if (!nm_utils_hwaddr_matches (priv->perm_hw_addr, -1, NULL, ETH_ALEN)) {
- g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, priv->perm_hw_addr, NULL);
+ if (perm_hw_addr) {
+ g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, perm_hw_addr, NULL);
mac_prop = NULL;
- if (mac && !nm_utils_hwaddr_matches (priv->perm_hw_addr, -1, mac, -1))
+ if (mac && !nm_utils_hwaddr_matches (perm_hw_addr, -1, mac, -1))
mac_prop = NM_SETTING_WIRED_CLONED_MAC_ADDRESS;
}
@@ -1562,37 +1500,10 @@ get_link_speed (NMDevice *device)
{
NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device);
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
- struct ifreq ifr;
- struct ethtool_cmd edata = {
- .cmd = ETHTOOL_GSET,
- };
guint32 speed;
- int fd;
- fd = socket (PF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
- _LOGW (LOGD_HW | LOGD_ETHER, "couldn't open ethtool control socket.");
+ if (!nmp_utils_ethtool_get_link_speed (nm_device_get_iface (device), &speed))
return;
- }
-
- memset (&ifr, 0, sizeof (struct ifreq));
- strncpy (ifr.ifr_name, nm_device_get_iface (device), IFNAMSIZ);
- ifr.ifr_data = (char *) &edata;
-
- if (ioctl (fd, SIOCETHTOOL, &ifr) < 0) {
- close (fd);
- return;
- }
- close (fd);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
- speed = edata.speed;
-#else
- speed = ethtool_cmd_speed (&edata);
-#endif
- if (speed == G_MAXUINT16 || speed == G_MAXUINT32)
- speed = 0;
-
if (priv->speed == speed)
return;
@@ -1612,6 +1523,17 @@ carrier_changed (NMDevice *device, gboolean carrier)
}
static void
+link_changed (NMDevice *device, NMPlatformLink *info)
+{
+ NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device);
+ NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
+
+ NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->link_changed (device, info);
+ if (!priv->subchan1 && info->initialized)
+ _update_s390_subchannels (self);
+}
+
+static void
dispose (GObject *object)
{
NMDeviceEthernet *self = NM_DEVICE_ETHERNET (object);
@@ -1634,8 +1556,6 @@ finalize (GObject *object)
NMDeviceEthernet *self = NM_DEVICE_ETHERNET (object);
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
- g_free (priv->perm_hw_addr);
- g_free (priv->initial_hw_addr);
g_clear_object (&priv->supplicant.mgr);
g_free (priv->subchan1);
g_free (priv->subchan2);
@@ -1656,7 +1576,7 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_PERM_HW_ADDRESS:
- g_value_set_string (value, priv->perm_hw_addr);
+ g_value_set_string (value, nm_device_get_permanent_hw_address (NM_DEVICE (object)));
break;
case PROP_SPEED:
g_value_set_uint (value, priv->speed);
@@ -1696,8 +1616,6 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *klass)
object_class->set_property = set_property;
parent_class->get_generic_capabilities = get_generic_capabilities;
- parent_class->update_permanent_hw_address = update_permanent_hw_address;
- parent_class->update_initial_hw_address = update_initial_hw_address;
parent_class->check_connection_compatible = check_connection_compatible;
parent_class->complete_connection = complete_connection;
parent_class->new_default_connection = new_default_connection;
@@ -1710,6 +1628,7 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *klass)
parent_class->spec_match_list = spec_match_list;
parent_class->update_connection = update_connection;
parent_class->carrier_changed = carrier_changed;
+ parent_class->link_changed = link_changed;
parent_class->state_changed = device_state_changed;
@@ -1739,19 +1658,18 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *klass)
#define NM_ETHERNET_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_ETHERNET_FACTORY, NMEthernetFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_ETHERNET) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_ETHERNET,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_TYPE_DESC, "Ethernet",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_ETHERNET,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_ETHERNET,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_TYPE_DESC, "Ethernet",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_ETHERNET,
+ NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL(ETHERNET, Ethernet, ethernet, \
- factory_iface->new_link = new_link; \
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (ETHERNET, Ethernet, ethernet,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_ETHERNET)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_WIRED_SETTING_NAME, NM_SETTING_PPPOE_SETTING_NAME),
+ factory_iface->new_link = new_link;
)
diff --git a/src/devices/nm-device-factory.c b/src/devices/nm-device-factory.c
index abfb8d4a6..130348085 100644
--- a/src/devices/nm-device-factory.c
+++ b/src/devices/nm-device-factory.c
@@ -19,8 +19,19 @@
*/
#include "config.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <string.h>
+
+#include <gmodule.h>
#include "nm-device-factory.h"
+#include "nm-logging.h"
+#include "nm-platform.h"
+
+const NMLinkType _nm_device_factory_no_default_links[] = { NM_LINK_TYPE_NONE };
+const char *_nm_device_factory_no_default_settings[] = { NULL };
enum {
DEVICE_ADDED,
@@ -29,130 +40,509 @@ enum {
};
static guint signals[LAST_SIGNAL] = { 0 };
-static GSList *internal_types = NULL;
+gboolean
+nm_device_factory_emit_component_added (NMDeviceFactory *factory, GObject *component)
+{
+ gboolean consumed = FALSE;
+
+ g_signal_emit (factory, signals[COMPONENT_ADDED], 0, component, &consumed);
+ return consumed;
+}
void
-_nm_device_factory_internal_register_type (GType factory_type)
+nm_device_factory_get_supported_types (NMDeviceFactory *factory,
+ const NMLinkType **out_link_types,
+ const char ***out_setting_types)
{
- g_return_if_fail (g_slist_find (internal_types, GUINT_TO_POINTER (factory_type)) == NULL);
- internal_types = g_slist_prepend (internal_types, GUINT_TO_POINTER (factory_type));
+ const NMLinkType *link_types_fallback;
+ const char **setting_types_fallback;
+
+ g_return_if_fail (factory != NULL);
+
+ if (!out_link_types)
+ out_link_types = &link_types_fallback;
+ if (!out_setting_types)
+ out_setting_types = &setting_types_fallback;
+
+ NM_DEVICE_FACTORY_GET_INTERFACE (factory)->get_supported_types (factory,
+ out_link_types,
+ out_setting_types);
}
-const GSList *
-nm_device_factory_get_internal_factory_types (void)
+void
+nm_device_factory_start (NMDeviceFactory *factory)
{
- return internal_types;
+ g_return_if_fail (factory != NULL);
+
+ if (NM_DEVICE_FACTORY_GET_INTERFACE (factory)->start)
+ NM_DEVICE_FACTORY_GET_INTERFACE (factory)->start (factory);
}
-gboolean
-nm_device_factory_emit_component_added (NMDeviceFactory *factory, GObject *component)
+NMDevice *
+nm_device_factory_new_link (NMDeviceFactory *factory,
+ NMPlatformLink *plink,
+ gboolean *out_ignore,
+ GError **error)
{
- gboolean consumed = FALSE;
+ NMDeviceFactory *interface;
+ const NMLinkType *link_types = NULL;
+ const char **setting_types = NULL;
+ int i;
- g_signal_emit (factory, signals[COMPONENT_ADDED], 0, component, &consumed);
- return consumed;
+ g_return_val_if_fail (factory != NULL, NULL);
+ g_return_val_if_fail (plink != NULL, NULL);
+
+ /* Ensure the factory can create interfaces for this connection */
+ nm_device_factory_get_supported_types (factory, &link_types, &setting_types);
+ for (i = 0; link_types[i] > NM_LINK_TYPE_UNKNOWN; i++) {
+ if (plink->type == link_types[i])
+ break;
+ }
+
+ if (link_types[i] == NM_LINK_TYPE_UNKNOWN) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Device factory %s does not support link type %s (%d)",
+ G_OBJECT_TYPE_NAME (factory),
+ plink->kind, plink->type);
+ return NULL;
+ }
+
+ interface = NM_DEVICE_FACTORY_GET_INTERFACE (factory);
+ if (!interface->new_link) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Device factory %s cannot manage new devices",
+ G_OBJECT_TYPE_NAME (factory));
+ return NULL;
+ }
+
+ return interface->new_link (factory, plink, out_ignore, error);
}
-static void
-interface_init (gpointer g_iface)
+NMDevice *
+nm_device_factory_create_virtual_device_for_connection (NMDeviceFactory *factory,
+ NMConnection *connection,
+ NMDevice *parent,
+ GError **error)
{
- GType iface_type = G_TYPE_FROM_INTERFACE (g_iface);
- static gboolean initialized = FALSE;
+ NMDeviceFactory *interface;
+ const char **setting_types = NULL;
+ gboolean found = FALSE;
+ int i;
- if (G_LIKELY (initialized))
- return;
+ g_return_val_if_fail (factory, NULL);
+ g_return_val_if_fail (connection, NULL);
+ g_return_val_if_fail (!error || !*error, NULL);
+
+ /* Ensure the factory can create interfaces for this connection */
+ nm_device_factory_get_supported_types (factory, NULL, &setting_types);
+ for (i = 0; setting_types && setting_types[i]; i++) {
+ if (nm_connection_is_type (connection, setting_types[i])) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
+ "Device factory %s does not support connection type %s",
+ G_OBJECT_TYPE_NAME (factory),
+ nm_connection_get_connection_type (connection));
+ return NULL;
+ }
+
+ interface = NM_DEVICE_FACTORY_GET_INTERFACE (factory);
+ if (!interface->create_virtual_device_for_connection) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Device factory %s cannot create virtual devices",
+ G_OBJECT_TYPE_NAME (factory));
+ return NULL;
+ }
+
+ return interface->create_virtual_device_for_connection (factory, connection, parent, error);
+}
+
+const char *
+nm_device_factory_get_connection_parent (NMDeviceFactory *factory,
+ NMConnection *connection)
+{
+ g_return_val_if_fail (factory != NULL, NULL);
+ g_return_val_if_fail (connection != NULL, NULL);
+
+ if (!nm_connection_is_virtual (connection))
+ return NULL;
+
+ if (NM_DEVICE_FACTORY_GET_INTERFACE (factory)->get_connection_parent)
+ return NM_DEVICE_FACTORY_GET_INTERFACE (factory)->get_connection_parent (factory, connection);
+ return NULL;
+}
+
+static char *
+get_virtual_iface_name (NMDeviceFactory *factory,
+ NMConnection *connection,
+ const char *parent_iface)
+{
+ const char *iface;
+
+ /* For any other virtual connection, NMSettingConnection:interface-name is
+ * the virtual device name.
+ */
+ iface = nm_connection_get_interface_name (connection);
+ g_return_val_if_fail (iface != NULL, NULL);
+ return g_strdup (iface);
+}
+
+char *
+nm_device_factory_get_virtual_iface_name (NMDeviceFactory *factory,
+ NMConnection *connection,
+ const char *parent_iface)
+{
+ g_return_val_if_fail (factory != NULL, NULL);
+ g_return_val_if_fail (connection != NULL, NULL);
+
+ if (!nm_connection_is_virtual (connection))
+ return NULL;
+
+ if (NM_DEVICE_FACTORY_GET_INTERFACE (factory)->get_virtual_iface_name)
+ return NM_DEVICE_FACTORY_GET_INTERFACE (factory)->get_virtual_iface_name (factory, connection, parent_iface);
+ return NULL;
+}
+
+/*******************************************************************/
+
+static void
+default_init (NMDeviceFactory *factory_iface)
+{
+ factory_iface->get_virtual_iface_name = get_virtual_iface_name;
/* Signals */
signals[DEVICE_ADDED] = g_signal_new (NM_DEVICE_FACTORY_DEVICE_ADDED,
- iface_type,
+ NM_TYPE_DEVICE_FACTORY,
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMDeviceFactory, device_added),
NULL, NULL, NULL,
G_TYPE_NONE, 1, NM_TYPE_DEVICE);
signals[COMPONENT_ADDED] = g_signal_new (NM_DEVICE_FACTORY_COMPONENT_ADDED,
- iface_type,
+ NM_TYPE_DEVICE_FACTORY,
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NMDeviceFactory, component_added),
g_signal_accumulator_true_handled, NULL, NULL,
G_TYPE_BOOLEAN, 1, G_TYPE_OBJECT);
-
- initialized = TRUE;
}
GType
nm_device_factory_get_type (void)
{
- static GType device_factory_type = 0;
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ GType g_define_type_id =
+ g_type_register_static_simple (G_TYPE_INTERFACE,
+ g_intern_static_string ("NMDeviceFactory"),
+ sizeof (NMDeviceFactory),
+ (GClassInitFunc) default_init,
+ 0,
+ (GInstanceInitFunc) NULL,
+ (GTypeFlags) 0);
+ g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+
+/*******************************************************************/
+
+static GSList *internal_types = NULL;
+static GHashTable *factories_by_link = NULL;
+static GHashTable *factories_by_setting = NULL;
+
+void
+_nm_device_factory_internal_register_type (GType factory_type)
+{
+ g_return_if_fail (g_slist_find (internal_types, GUINT_TO_POINTER (factory_type)) == NULL);
+ internal_types = g_slist_prepend (internal_types, GUINT_TO_POINTER (factory_type));
+}
+
+static void __attribute__((destructor))
+_cleanup (void)
+{
+ g_clear_pointer (&internal_types, g_slist_free);
+ g_clear_pointer (&factories_by_link, g_hash_table_unref);
+ g_clear_pointer (&factories_by_setting, g_hash_table_unref);
+}
- if (!device_factory_type) {
- const GTypeInfo device_factory_info = {
- sizeof (NMDeviceFactory), /* class_size */
- interface_init, /* base_init */
- NULL, /* base_finalize */
- NULL,
- NULL, /* class_finalize */
- NULL, /* class_data */
- 0,
- 0, /* n_preallocs */
- NULL
- };
+static NMDeviceFactory *
+find_factory (const NMLinkType *needle_link_types,
+ const char **needle_setting_types)
+{
+ NMDeviceFactory *found;
+ guint i;
- device_factory_type = g_type_register_static (G_TYPE_INTERFACE,
- "NMDeviceFactory",
- &device_factory_info,
- 0);
- g_type_interface_add_prerequisite (device_factory_type, G_TYPE_OBJECT);
+ g_return_val_if_fail (factories_by_link, NULL);
+ g_return_val_if_fail (factories_by_setting, NULL);
+
+ /* NMLinkType search */
+ for (i = 0; needle_link_types && needle_link_types[i] > NM_LINK_TYPE_UNKNOWN; i++) {
+ found = g_hash_table_lookup (factories_by_link, GUINT_TO_POINTER (needle_link_types[i]));
+ if (found)
+ return found;
+ }
+
+ /* NMSetting name search */
+ for (i = 0; needle_setting_types && needle_setting_types[i]; i++) {
+ found = g_hash_table_lookup (factories_by_setting, needle_setting_types[i]);
+ if (found)
+ return found;
}
- return device_factory_type;
+ return NULL;
}
-NMDeviceType
-nm_device_factory_get_device_type (NMDeviceFactory *factory)
+NMDeviceFactory *
+nm_device_factory_manager_find_factory_for_link_type (NMLinkType link_type)
{
- g_return_val_if_fail (factory != NULL, NM_DEVICE_TYPE_UNKNOWN);
+ const NMLinkType ltypes[2] = { link_type, NM_LINK_TYPE_NONE };
- return NM_DEVICE_FACTORY_GET_INTERFACE (factory)->get_device_type (factory);
+ if (link_type == NM_LINK_TYPE_UNKNOWN)
+ return NULL;
+ g_return_val_if_fail (link_type > NM_LINK_TYPE_UNKNOWN, NULL);
+ return find_factory (ltypes, NULL);
+}
+
+NMDeviceFactory *
+nm_device_factory_manager_find_factory_for_connection (NMConnection *connection)
+{
+ const char *stypes[2] = { nm_connection_get_connection_type (connection), NULL };
+
+ g_assert (stypes[0]);
+ return find_factory (NULL, stypes);
}
void
-nm_device_factory_start (NMDeviceFactory *factory)
+nm_device_factory_manager_for_each_factory (NMDeviceFactoryManagerFactoryFunc callback,
+ gpointer user_data)
{
- g_return_if_fail (factory != NULL);
+ GHashTableIter iter;
+ NMDeviceFactory *factory;
+ GSList *list_iter, *list = NULL;
- if (NM_DEVICE_FACTORY_GET_INTERFACE (factory)->start)
- NM_DEVICE_FACTORY_GET_INTERFACE (factory)->start (factory);
+ g_return_if_fail (factories_by_link);
+ g_return_if_fail (factories_by_setting);
+
+ g_hash_table_iter_init (&iter, factories_by_link);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer) &factory)) {
+ if (!g_slist_find (list, factory))
+ list = g_slist_prepend (list, factory);
+ }
+
+ g_hash_table_iter_init (&iter, factories_by_setting);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer) &factory)) {
+ if (!g_slist_find (list, factory))
+ list = g_slist_prepend (list, factory);
+ }
+
+ for (list_iter = list; list_iter; list_iter = list_iter->next)
+ callback (list_iter->data, user_data);
+
+ g_slist_free (list);
}
-NMDevice *
-nm_device_factory_new_link (NMDeviceFactory *factory,
- NMPlatformLink *plink,
- GError **error)
+#define PLUGIN_PREFIX "libnm-device-plugin-"
+#define PLUGIN_PATH_TAG "NMManager-plugin-path"
+
+struct read_device_factory_paths_data {
+ char *path;
+ struct stat st;
+};
+
+static gint
+read_device_factory_paths_sort_fcn (gconstpointer a, gconstpointer b)
{
- g_return_val_if_fail (factory != NULL, NULL);
- g_return_val_if_fail (plink != NULL, NULL);
+ const struct read_device_factory_paths_data *da = a;
+ const struct read_device_factory_paths_data *db = b;
+ time_t ta, tb;
- if (NM_DEVICE_FACTORY_GET_INTERFACE (factory)->new_link)
- return NM_DEVICE_FACTORY_GET_INTERFACE (factory)->new_link (factory, plink, error);
- return NULL;
+ ta = MAX (da->st.st_mtime, da->st.st_ctime);
+ tb = MAX (db->st.st_mtime, db->st.st_ctime);
+
+ if (ta < tb)
+ return 1;
+ if (ta > tb)
+ return -1;
+ return 0;
}
-NMDevice *
-nm_device_factory_create_virtual_device_for_connection (NMDeviceFactory *factory,
- NMConnection *connection,
- NMDevice *parent,
- GError **error)
+static char**
+read_device_factory_paths (void)
{
- NMDeviceFactory *interface;
+ GDir *dir;
+ GError *error = NULL;
+ const char *item;
+ GArray *paths;
+ char **result;
+ guint i;
- g_return_val_if_fail (factory, NULL);
- g_return_val_if_fail (connection, NULL);
- g_return_val_if_fail (!error || !*error, NULL);
+ dir = g_dir_open (NMPLUGINDIR, 0, &error);
+ if (!dir) {
+ nm_log_warn (LOGD_HW, "device plugin: failed to open directory %s: %s",
+ NMPLUGINDIR,
+ (error && error->message) ? error->message : "(unknown)");
+ g_clear_error (&error);
+ return NULL;
+ }
- interface = NM_DEVICE_FACTORY_GET_INTERFACE (factory);
- if (interface->create_virtual_device_for_connection)
- return interface->create_virtual_device_for_connection (factory, connection, parent, error);
- return NULL;
+ paths = g_array_new (FALSE, FALSE, sizeof (struct read_device_factory_paths_data));
+
+ while ((item = g_dir_read_name (dir))) {
+ int errsv;
+ struct read_device_factory_paths_data data;
+
+ if (!g_str_has_prefix (item, PLUGIN_PREFIX))
+ continue;
+ if (g_str_has_suffix (item, ".la"))
+ continue;
+
+ data.path = g_build_filename (NMPLUGINDIR, item, NULL);
+
+ if (stat (data.path, &data.st) != 0) {
+ errsv = errno;
+ nm_log_warn (LOGD_HW, "device plugin: skip invalid file %s (error during stat: %s)", data.path, strerror (errsv));
+ goto NEXT;
+ }
+ if (!S_ISREG (data.st.st_mode))
+ goto NEXT;
+ if (data.st.st_uid != 0) {
+ nm_log_warn (LOGD_HW, "device plugin: skip invalid file %s (file must be owned by root)", data.path);
+ goto NEXT;
+ }
+ if (data.st.st_mode & (S_IWGRP | S_IWOTH | S_ISUID)) {
+ nm_log_warn (LOGD_HW, "device plugin: skip invalid file %s (invalid file permissions)", data.path);
+ goto NEXT;
+ }
+
+ g_array_append_val (paths, data);
+ continue;
+NEXT:
+ g_free (data.path);
+ }
+ g_dir_close (dir);
+
+ /* sort filenames by modification time. */
+ g_array_sort (paths, read_device_factory_paths_sort_fcn);
+
+ result = g_new (char *, paths->len + 1);
+ for (i = 0; i < paths->len; i++)
+ result[i] = g_array_index (paths, struct read_device_factory_paths_data, i).path;
+ result[i] = NULL;
+
+ g_array_free (paths, TRUE);
+ return result;
+}
+
+static gboolean
+_add_factory (NMDeviceFactory *factory,
+ gboolean check_duplicates,
+ const char *path,
+ NMDeviceFactoryManagerFactoryFunc callback,
+ gpointer user_data)
+{
+ NMDeviceFactory *found = NULL;
+ const NMLinkType *link_types = NULL;
+ const char **setting_types = NULL;
+ int i;
+
+ g_return_val_if_fail (factories_by_link, FALSE);
+ g_return_val_if_fail (factories_by_setting, FALSE);
+
+ nm_device_factory_get_supported_types (factory, &link_types, &setting_types);
+ if (check_duplicates) {
+ found = find_factory (link_types, setting_types);
+ if (found) {
+ nm_log_warn (LOGD_HW, "Loading device plugin failed: multiple plugins "
+ "for same type (using '%s' instead of '%s')",
+ (char *) g_object_get_data (G_OBJECT (found), PLUGIN_PATH_TAG),
+ path);
+ return FALSE;
+ }
+ }
+
+ g_object_set_data_full (G_OBJECT (factory), PLUGIN_PATH_TAG, g_strdup (path), g_free);
+ for (i = 0; link_types && link_types[i] > NM_LINK_TYPE_UNKNOWN; i++)
+ g_hash_table_insert (factories_by_link, GUINT_TO_POINTER (link_types[i]), g_object_ref (factory));
+ for (i = 0; setting_types && setting_types[i]; i++)
+ g_hash_table_insert (factories_by_setting, (char *) setting_types[i], g_object_ref (factory));
+
+ callback (factory, user_data);
+
+ nm_log_info (LOGD_HW, "Loaded device plugin: %s (%s)", G_OBJECT_TYPE_NAME (factory), path);
+ return TRUE;
+}
+
+void
+nm_device_factory_manager_load_factories (NMDeviceFactoryManagerFactoryFunc callback,
+ gpointer user_data)
+{
+ NMDeviceFactory *factory;
+ const GSList *iter;
+ GError *error = NULL;
+ char **path, **paths;
+
+ g_return_if_fail (factories_by_link == NULL);
+ g_return_if_fail (factories_by_setting == NULL);
+
+ factories_by_link = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
+ factories_by_setting = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
+
+ /* Register internal factories first */
+ for (iter = internal_types; iter; iter = iter->next) {
+ GType ftype = (GType) GPOINTER_TO_SIZE (iter->data);
+
+ factory = (NMDeviceFactory *) g_object_new (ftype, NULL);
+ g_assert (factory);
+ _add_factory (factory, FALSE, "internal", callback, user_data);
+ }
+
+ paths = read_device_factory_paths ();
+ if (!paths)
+ return;
+
+ for (path = paths; *path; path++) {
+ GModule *plugin;
+ NMDeviceFactoryCreateFunc create_func;
+ const char *item;
+
+ item = strrchr (*path, '/');
+ g_assert (item);
+
+ plugin = g_module_open (*path, G_MODULE_BIND_LOCAL);
+
+ if (!plugin) {
+ nm_log_warn (LOGD_HW, "(%s): failed to load plugin: %s", item, g_module_error ());
+ continue;
+ }
+
+ if (!g_module_symbol (plugin, "nm_device_factory_create", (gpointer) &create_func)) {
+ nm_log_warn (LOGD_HW, "(%s): failed to find device factory creator: %s", item, g_module_error ());
+ g_module_close (plugin);
+ continue;
+ }
+
+ factory = create_func (&error);
+ if (!factory) {
+ nm_log_warn (LOGD_HW, "(%s): failed to initialize device factory: %s",
+ item, error ? error->message : "unknown");
+ g_clear_error (&error);
+ g_module_close (plugin);
+ continue;
+ }
+ g_clear_error (&error);
+
+ if (_add_factory (factory, TRUE, g_module_name (plugin), callback, user_data))
+ g_module_make_resident (plugin);
+ else
+ g_module_close (plugin);
+
+ g_object_unref (factory);
+ }
+ g_strfreev (paths);
}
diff --git a/src/devices/nm-device-factory.h b/src/devices/nm-device-factory.h
index ce672b8bf..34c056d20 100644
--- a/src/devices/nm-device-factory.h
+++ b/src/devices/nm-device-factory.h
@@ -66,14 +66,19 @@ struct _NMDeviceFactory {
GTypeInterface g_iface;
/**
- * get_device_type:
+ * get_supported_types:
* @factory: the #NMDeviceFactory
+ * @out_link_types: on return, a %NM_LINK_TYPE_NONE terminated
+ * list of #NMLinkType that the plugin supports
+ * @out_setting_types: on return, a %NULL terminated list of
+ * base-type #NMSetting names that the plugin can create devices for
*
- * This function MUST be implemented.
- *
- * Returns: the #NMDeviceType that this plugin creates
+ * Returns the #NMLinkType and #NMSetting names that this plugin
+ * supports. This function MUST be implemented.
*/
- NMDeviceType (*get_device_type) (NMDeviceFactory *factory);
+ void (*get_supported_types) (NMDeviceFactory *factory,
+ const NMLinkType **out_link_types,
+ const char ***out_setting_types);
/**
* start:
@@ -87,20 +92,27 @@ struct _NMDeviceFactory {
/**
* new_link:
* @factory: the #NMDeviceFactory
- * @link: the new link
+ * @plink: the new link
+ * @out_ignore: on return, %TRUE if the link should be ignored
* @error: error if the link could be claimed but an error occurred
*
* The NetworkManager core was notified of a new link which the plugin
* may want to claim and create a #NMDevice subclass for. If the link
- * represents a device the factory is capable of claiming, but the device
- * could not be created, %NULL should be returned and @error should be set.
- * %NULL should always be returned and @error should never be set if the
- * factory cannot create devices for the type which @link represents.
+ * represents a device which the factory does not support, or the link
+ * is supported but the device could not be created, %NULL should be
+ * returned and @error should be set.
+ *
+ * If the plugin cannot create a #NMDevice for the link and wants the
+ * core to ignore it, set @out_ignore to %TRUE and return no error.
+ *
+ * @plink is guaranteed to be one of the types the factory returns in
+ * get_supported_types().
*
* Returns: the #NMDevice if the link was claimed and created, %NULL if not
*/
NMDevice * (*new_link) (NMDeviceFactory *factory,
NMPlatformLink *plink,
+ gboolean *out_ignore,
GError **error);
/**
@@ -121,6 +133,34 @@ struct _NMDeviceFactory {
NMDevice *parent,
GError **error);
+ /**
+ * get_connection_parent:
+ * @factory: the #NMDeviceFactory
+ * @connection: the #NMConnection to return the parent name for, if supported
+ *
+ * Given a connection, returns the a parent interface name, parent connection
+ * UUID, or parent device hardware address for @connection.
+ *
+ * Returns: the parent interface name, parent connection UUID, parent
+ * device hardware address, or %NULL
+ */
+ const char * (*get_connection_parent) (NMDeviceFactory *factory,
+ NMConnection *connection);
+
+ /**
+ * get_virtual_iface_name:
+ * @factory: the #NMDeviceFactory
+ * @connection: the #NMConnection to return the virtual interface name for
+ * @parent_iface: parent interface name
+ *
+ * Given a connection, returns the interface name that a device activating
+ * that connection would have.
+ *
+ * Returns: the interface name, or %NULL
+ */
+ char * (*get_virtual_iface_name) (NMDeviceFactory *factory,
+ NMConnection *connection,
+ const char *parent_iface);
/* Signals */
@@ -151,12 +191,22 @@ struct _NMDeviceFactory {
GType nm_device_factory_get_type (void);
-NMDeviceType nm_device_factory_get_device_type (NMDeviceFactory *factory);
+void nm_device_factory_get_supported_types (NMDeviceFactory *factory,
+ const NMLinkType **out_link_types,
+ const char ***out_setting_types);
+
+const char *nm_device_factory_get_connection_parent (NMDeviceFactory *factory,
+ NMConnection *connection);
+
+char * nm_device_factory_get_virtual_iface_name (NMDeviceFactory *factory,
+ NMConnection *connection,
+ const char *parent_iface);
void nm_device_factory_start (NMDeviceFactory *factory);
NMDevice * nm_device_factory_new_link (NMDeviceFactory *factory,
NMPlatformLink *plink,
+ gboolean *out_ignore,
GError **error);
NMDevice * nm_device_factory_create_virtual_device_for_connection (NMDeviceFactory *factory,
@@ -168,15 +218,33 @@ NMDevice * nm_device_factory_create_virtual_device_for_connection (NMDeviceFacto
gboolean nm_device_factory_emit_component_added (NMDeviceFactory *factory,
GObject *component);
+#define NM_DEVICE_FACTORY_DECLARE_LINK_TYPES(...) \
+ { static const NMLinkType _df_links[] = { __VA_ARGS__, NM_LINK_TYPE_NONE }; *out_link_types = _df_links; }
+#define NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES(...) \
+ { static const char *_df_settings[] = { __VA_ARGS__, NULL }; *out_setting_types = _df_settings; }
+
+extern const NMLinkType _nm_device_factory_no_default_links[];
+extern const char *_nm_device_factory_no_default_settings[];
+
+#define NM_DEVICE_FACTORY_DECLARE_TYPES(...) \
+ static void \
+ get_supported_types (NMDeviceFactory *factory, \
+ const NMLinkType **out_link_types, \
+ const char ***out_setting_types) \
+ { \
+ *out_link_types = _nm_device_factory_no_default_links; \
+ *out_setting_types = _nm_device_factory_no_default_settings; \
+ \
+ { __VA_ARGS__; } \
+ } \
+ \
+
/**************************************************************************
* INTERNAL DEVICE FACTORY FUNCTIONS - devices provided by plugins should
* not use these functions.
**************************************************************************/
-#define DEFINE_DEVICE_FACTORY_INTERNAL(upper, mixed, lower, dfi_code) \
- DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(upper, mixed, lower, upper, dfi_code)
-
-#define DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(upper, mixed, lower, devtype, dfi_code) \
+#define NM_DEVICE_FACTORY_DEFINE_INTERNAL(upper, mixed, lower, st_code, dfi_code) \
typedef GObject NM##mixed##Factory; \
typedef GObjectClass NM##mixed##FactoryClass; \
\
@@ -198,16 +266,12 @@ gboolean nm_device_factory_emit_component_added (NMDeviceFactory *factory,
g_type_ensure (NM_TYPE_##upper##_FACTORY); \
} \
\
- static NMDeviceType \
- get_device_type (NMDeviceFactory *factory) \
- { \
- return NM_DEVICE_TYPE_##devtype; \
- } \
+ NM_DEVICE_FACTORY_DECLARE_TYPES(st_code) \
\
static void \
device_factory_interface_init (NMDeviceFactory *factory_iface) \
{ \
- factory_iface->get_device_type = get_device_type; \
+ factory_iface->get_supported_types = get_supported_types; \
dfi_code \
} \
\
@@ -222,6 +286,22 @@ gboolean nm_device_factory_emit_component_added (NMDeviceFactory *factory,
}
void _nm_device_factory_internal_register_type (GType factory_type);
-const GSList *nm_device_factory_get_internal_factory_types (void);
+
+/**************************************************************************
+ * PRIVATE FACTORY FUNCTIONS - for factory consumers (eg, NMManager).
+ **************************************************************************/
+
+typedef void (*NMDeviceFactoryManagerFactoryFunc) (NMDeviceFactory *factory,
+ gpointer user_data);
+
+void nm_device_factory_manager_load_factories (NMDeviceFactoryManagerFactoryFunc callback,
+ gpointer user_data);
+
+NMDeviceFactory * nm_device_factory_manager_find_factory_for_link_type (NMLinkType link_type);
+
+NMDeviceFactory * nm_device_factory_manager_find_factory_for_connection (NMConnection *connection);
+
+void nm_device_factory_manager_for_each_factory (NMDeviceFactoryManagerFactoryFunc callback,
+ gpointer user_data);
#endif /* __NETWORKMANAGER_DEVICE_FACTORY_H__ */
diff --git a/src/devices/nm-device-generic.c b/src/devices/nm-device-generic.c
index f103ef830..5841d834f 100644
--- a/src/devices/nm-device-generic.c
+++ b/src/devices/nm-device-generic.c
@@ -45,15 +45,23 @@ enum {
LAST_PROP
};
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *dev)
{
- if (nm_platform_link_supports_carrier_detect (nm_device_get_ifindex (dev)))
+ if (nm_platform_link_supports_carrier_detect (NM_PLATFORM_GET, nm_device_get_ifindex (dev)))
return NM_DEVICE_CAP_CARRIER_DETECT;
else
return NM_DEVICE_CAP_NONE;
}
+static const char *
+get_type_description (NMDevice *device)
+{
+ if (NM_DEVICE_GENERIC_GET_PRIVATE (device)->type_description)
+ return NM_DEVICE_GENERIC_GET_PRIVATE (device)->type_description;
+ return NM_DEVICE_CLASS (nm_device_generic_parent_class)->get_type_description (device);
+}
+
static gboolean
check_connection_compatible (NMDevice *device, NMConnection *connection)
{
@@ -117,7 +125,7 @@ constructed (GObject *object)
int ifindex = nm_device_get_ip_ifindex (NM_DEVICE (self));
if (ifindex != 0)
- priv->type_description = g_strdup (nm_platform_link_get_type_name (ifindex));
+ priv->type_description = g_strdup (nm_platform_link_get_type_name (NM_PLATFORM_GET, ifindex));
}
G_OBJECT_CLASS (nm_device_generic_parent_class)->constructed (object);
@@ -184,6 +192,7 @@ nm_device_generic_class_init (NMDeviceGenericClass *klass)
object_class->set_property = set_property;
parent_class->get_generic_capabilities = get_generic_capabilities;
+ parent_class->get_type_description = get_type_description;
parent_class->check_connection_compatible = check_connection_compatible;
parent_class->update_connection = update_connection;
diff --git a/src/devices/nm-device-gre.c b/src/devices/nm-device-gre.c
index 9c25b398c..b3510d2e2 100644
--- a/src/devices/nm-device-gre.c
+++ b/src/devices/nm-device-gre.c
@@ -71,7 +71,7 @@ update_properties (NMDevice *device)
GObject *object = G_OBJECT (device);
NMPlatformGreProperties props;
- if (!nm_platform_gre_get_properties (nm_device_get_ifindex (device), &props)) {
+ if (!nm_platform_gre_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (device), &props)) {
_LOGW (LOGD_HW, "could not read gre properties");
return;
}
@@ -267,19 +267,17 @@ nm_device_gre_class_init (NMDeviceGreClass *klass)
#define NM_GRE_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_GRE_FACTORY, NMGreFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_GRE || plink->type == NM_LINK_TYPE_GRETAP) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_GRE,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_TYPE_DESC, "Gre",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_GENERIC,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_GRE,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_TYPE_DESC, "Gre",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_GENERIC,
+ NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(GRE, Gre, gre, ETHERNET, \
- factory_iface->new_link = new_link; \
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (GRE, Gre, gre,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_GRE, NM_LINK_TYPE_GRETAP),
+ factory_iface->new_link = new_link;
)
diff --git a/src/devices/nm-device-infiniband.c b/src/devices/nm-device-infiniband.c
index e1af89950..2e2483c0c 100644
--- a/src/devices/nm-device-infiniband.c
+++ b/src/devices/nm-device-infiniband.c
@@ -44,12 +44,15 @@ G_DEFINE_TYPE (NMDeviceInfiniband, nm_device_infiniband, NM_TYPE_DEVICE)
#define NM_DEVICE_INFINIBAND_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_INFINIBAND, NMDeviceInfinibandPrivate))
+#define NM_DEVICE_INFINIBAND_IS_PARTITION "is-partition"
+
typedef struct {
- int dummy;
+ gboolean is_partition;
} NMDeviceInfinibandPrivate;
enum {
PROP_0,
+ PROP_IS_PARTITION,
LAST_PROP
};
@@ -59,10 +62,15 @@ nm_device_infiniband_init (NMDeviceInfiniband * self)
{
}
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *dev)
{
- return NM_DEVICE_CAP_CARRIER_DETECT;
+ guint32 caps = NM_DEVICE_CAP_CARRIER_DETECT;
+
+ if (NM_DEVICE_INFINIBAND_GET_PRIVATE (dev)->is_partition)
+ caps |= NM_DEVICE_CAP_IS_SOFTWARE;
+
+ return caps;
}
static NMActStageReturn
@@ -105,7 +113,7 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
}
}
- ok = nm_platform_sysctl_set (mode_path, transport_mode);
+ ok = nm_platform_sysctl_set (NM_PLATFORM_GET, mode_path, transport_mode);
g_free (mode_path);
if (!ok) {
@@ -213,8 +221,8 @@ update_connection (NMDevice *device, NMConnection *connection)
{
NMSettingInfiniband *s_infiniband = nm_connection_get_setting_infiniband (connection);
const char *mac = nm_device_get_hw_address (device);
- char *mode_path, *contents = NULL;
const char *transport_mode = "datagram";
+ int ifindex;
if (!s_infiniband) {
s_infiniband = (NMSettingInfiniband *) nm_setting_infiniband_new ();
@@ -224,16 +232,10 @@ update_connection (NMDevice *device, NMConnection *connection)
if (mac && !nm_utils_hwaddr_matches (mac, -1, NULL, INFINIBAND_ALEN))
g_object_set (s_infiniband, NM_SETTING_INFINIBAND_MAC_ADDRESS, mac, NULL);
- mode_path = g_strdup_printf ("/sys/class/net/%s/mode",
- ASSERT_VALID_PATH_COMPONENT (nm_device_get_iface (device)));
- contents = nm_platform_sysctl_get (mode_path);
- g_free (mode_path);
- if (contents) {
- if (strstr (contents, "datagram"))
+ ifindex = nm_device_get_ifindex (device);
+ if (ifindex > 0) {
+ if (!nm_platform_infiniband_get_info (NM_PLATFORM_GET, ifindex, NULL, NULL, &transport_mode))
transport_mode = "datagram";
- else if (strstr (contents, "connected"))
- transport_mode = "connected";
- g_free (contents);
}
g_object_set (G_OBJECT (s_infiniband), NM_SETTING_INFINIBAND_TRANSPORT_MODE, transport_mode, NULL);
}
@@ -243,6 +245,9 @@ get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
switch (prop_id) {
+ case PROP_IS_PARTITION:
+ g_value_set_boolean (value, NM_DEVICE_INFINIBAND_GET_PRIVATE (object)->is_partition);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -254,6 +259,9 @@ set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
switch (prop_id) {
+ case PROP_IS_PARTITION:
+ NM_DEVICE_INFINIBAND_GET_PRIVATE (object)->is_partition = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -281,6 +289,12 @@ nm_device_infiniband_class_init (NMDeviceInfinibandClass *klass)
parent_class->ip4_config_pre_commit = ip4_config_pre_commit;
/* properties */
+ g_object_class_install_property
+ (object_class, PROP_IS_PARTITION,
+ g_param_spec_boolean (NM_DEVICE_INFINIBAND_IS_PARTITION, "", "",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
nm_dbus_manager_register_exported_type (nm_dbus_manager_get (),
G_TYPE_FROM_CLASS (klass),
@@ -293,16 +307,14 @@ nm_device_infiniband_class_init (NMDeviceInfinibandClass *klass)
#define NM_INFINIBAND_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_INFINIBAND_FACTORY, NMInfinibandFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_INFINIBAND) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_INFINIBAND,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_TYPE_DESC, "InfiniBand",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_INFINIBAND,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_INFINIBAND,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_TYPE_DESC, "InfiniBand",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_INFINIBAND,
+ NM_DEVICE_INFINIBAND_IS_PARTITION, (plink->parent > 0),
+ NULL);
}
static NMDevice *
@@ -314,25 +326,30 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NMSettingInfiniband *s_infiniband;
int p_key, parent_ifindex;
const char *iface;
+ NMPlatformError plerr;
- if (!nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME))
+ if (!NM_IS_DEVICE_INFINIBAND (parent)) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Parent interface %s must be an InfiniBand interface",
+ nm_device_get_iface (parent));
return NULL;
-
- g_return_val_if_fail (NM_IS_DEVICE_INFINIBAND (parent), NULL);
+ }
s_infiniband = nm_connection_get_setting_infiniband (connection);
iface = nm_setting_infiniband_get_virtual_interface_name (s_infiniband);
- g_return_val_if_fail (iface != NULL, NULL);
+ g_assert (iface);
parent_ifindex = nm_device_get_ifindex (parent);
p_key = nm_setting_infiniband_get_p_key (s_infiniband);
- if ( !nm_platform_infiniband_partition_add (parent_ifindex, p_key)
- && nm_platform_get_error () != NM_PLATFORM_ERROR_EXISTS) {
- nm_log_warn (LOGD_DEVICE | LOGD_INFINIBAND, "(%s): failed to add InfiniBand P_Key interface for '%s': %s",
- iface, nm_connection_get_id (connection),
- nm_platform_get_error_msg ());
+ plerr = nm_platform_infiniband_partition_add (NM_PLATFORM_GET, parent_ifindex, p_key, NULL);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS && plerr != NM_PLATFORM_ERROR_EXISTS) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create InfiniBand P_Key interface '%s' for '%s': %s",
+ iface,
+ nm_connection_get_id (connection),
+ nm_platform_error_to_string (plerr));
return NULL;
}
@@ -341,11 +358,49 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NM_DEVICE_DRIVER, nm_device_get_driver (parent),
NM_DEVICE_TYPE_DESC, "InfiniBand",
NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_INFINIBAND,
+ NM_DEVICE_INFINIBAND_IS_PARTITION, TRUE,
NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL(INFINIBAND, Infiniband, infiniband, \
- factory_iface->new_link = new_link; \
+static const char *
+get_connection_parent (NMDeviceFactory *factory, NMConnection *connection)
+{
+ NMSettingInfiniband *s_infiniband;
+
+ g_return_val_if_fail (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME), NULL);
+
+ s_infiniband = nm_connection_get_setting_infiniband (connection);
+ g_assert (s_infiniband);
+
+ return nm_setting_infiniband_get_parent (s_infiniband);
+}
+
+static char *
+get_virtual_iface_name (NMDeviceFactory *factory,
+ NMConnection *connection,
+ const char *parent_iface)
+{
+ NMSettingInfiniband *s_infiniband;
+
+ g_return_val_if_fail (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME), NULL);
+
+ s_infiniband = nm_connection_get_setting_infiniband (connection);
+ g_assert (s_infiniband);
+
+ if (!parent_iface)
+ return NULL;
+
+ g_return_val_if_fail (g_strcmp0 (parent_iface, nm_setting_infiniband_get_parent (s_infiniband)) == 0, NULL);
+
+ return g_strdup (nm_setting_infiniband_get_virtual_interface_name (s_infiniband));
+}
+
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (INFINIBAND, Infiniband, infiniband,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_INFINIBAND)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_INFINIBAND_SETTING_NAME),
+ factory_iface->new_link = new_link;
factory_iface->create_virtual_device_for_connection = create_virtual_device_for_connection;
+ factory_iface->get_connection_parent = get_connection_parent;
+ factory_iface->get_virtual_iface_name = get_virtual_iface_name;
)
diff --git a/src/devices/nm-device-macvlan.c b/src/devices/nm-device-macvlan.c
index bcd386177..0bfe3fe9f 100644
--- a/src/devices/nm-device-macvlan.c
+++ b/src/devices/nm-device-macvlan.c
@@ -64,7 +64,7 @@ update_properties (NMDevice *device)
GObject *object = G_OBJECT (device);
NMPlatformMacvlanProperties props;
- if (!nm_platform_macvlan_get_properties (nm_device_get_ifindex (device), &props)) {
+ if (!nm_platform_macvlan_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (device), &props)) {
_LOGW (LOGD_HW, "could not read macvlan properties");
return;
}
@@ -175,19 +175,17 @@ nm_device_macvlan_class_init (NMDeviceMacvlanClass *klass)
#define NM_MACVLAN_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_MACVLAN_FACTORY, NMMacvlanFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_MACVLAN || plink->type == NM_LINK_TYPE_MACVTAP) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_MACVLAN,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_TYPE_DESC, "Macvlan",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_GENERIC,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_MACVLAN,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_TYPE_DESC, "Macvlan",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_GENERIC,
+ NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(MACVLAN, Macvlan, macvlan, ETHERNET, \
- factory_iface->new_link = new_link; \
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (MACVLAN, Macvlan, macvlan,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_MACVLAN, NM_LINK_TYPE_MACVTAP),
+ factory_iface->new_link = new_link;
)
diff --git a/src/devices/nm-device-private.h b/src/devices/nm-device-private.h
index 1f781bbc0..f34969ac3 100644
--- a/src/devices/nm-device-private.h
+++ b/src/devices/nm-device-private.h
@@ -97,6 +97,9 @@ void nm_device_set_carrier (NMDevice *self, gboolean carrier);
void nm_device_emit_recheck_auto_activate (NMDevice *device);
void nm_device_queue_recheck_assume (NMDevice *device);
+void nm_device_queue_recheck_available (NMDevice *device,
+ NMDeviceStateReason available_reason,
+ NMDeviceStateReason unavailable_reason);
void nm_device_set_wwan_ip4_config (NMDevice *device, NMIP4Config *config);
void nm_device_set_wwan_ip6_config (NMDevice *device, NMIP6Config *config);
diff --git a/src/devices/nm-device-tun.c b/src/devices/nm-device-tun.c
index 9a3fab5ec..5aaff8b1a 100644
--- a/src/devices/nm-device-tun.c
+++ b/src/devices/nm-device-tun.c
@@ -65,7 +65,7 @@ reload_tun_properties (NMDeviceTun *self)
GObject *object = G_OBJECT (self);
NMPlatformTunProperties props;
- if (!nm_platform_tun_get_properties (nm_device_get_ifindex (NM_DEVICE (self)), &props)) {
+ if (!nm_platform_tun_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (NM_DEVICE (self)), &props)) {
_LOGD (LOGD_HW, "could not read tun properties");
return;
}
@@ -123,7 +123,7 @@ constructed (GObject *object)
gboolean properties_read;
NMDeviceTunPrivate *priv = NM_DEVICE_TUN_GET_PRIVATE (self);
- properties_read = nm_platform_tun_get_properties (nm_device_get_ifindex (NM_DEVICE (self)), &priv->props);
+ properties_read = nm_platform_tun_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (NM_DEVICE (self)), &priv->props);
G_OBJECT_CLASS (nm_device_tun_parent_class)->constructed (object);
@@ -270,7 +270,7 @@ nm_device_tun_class_init (NMDeviceTunClass *klass)
#define NM_TUN_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_TUN_FACTORY, NMTunFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
const char *mode = NULL;
@@ -278,8 +278,10 @@ new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
mode = "tun";
else if (plink->type == NM_LINK_TYPE_TAP)
mode = "tap";
- else
- return NULL;
+ else {
+ g_warn_if_reached ();
+ mode = "unknown";
+ }
return (NMDevice *) g_object_new (NM_TYPE_DEVICE_TUN,
NM_DEVICE_PLATFORM_DEVICE, plink,
@@ -289,7 +291,8 @@ new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(TUN, Tun, tun, GENERIC, \
- factory_iface->new_link = new_link; \
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (TUN, Tun, tun,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_TUN, NM_LINK_TYPE_TAP),
+ factory_iface->new_link = new_link;
)
diff --git a/src/devices/nm-device-veth.c b/src/devices/nm-device-veth.c
index db29c00d2..04f03fbbe 100644
--- a/src/devices/nm-device-veth.c
+++ b/src/devices/nm-device-veth.c
@@ -82,7 +82,7 @@ get_peer (NMDeviceVeth *self)
if (priv->ever_had_peer)
return priv->peer;
- if (!nm_platform_veth_get_properties (nm_device_get_ifindex (device), &props)) {
+ if (!nm_platform_veth_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (device), &props)) {
_LOGW (LOGD_HW, "could not read veth properties");
return NULL;
}
@@ -96,13 +96,21 @@ get_peer (NMDeviceVeth *self)
return priv->peer;
}
+static gboolean
+can_unmanaged_external_down (NMDevice *self)
+{
+ /* Unless running in a container, an udev rule causes these to be
+ * unmanaged. If there's no udev then we're probably in a container
+ * and should IFF_UP and configure the veth ourselves even if we
+ * didn't create it. */
+ return FALSE;
+}
/**************************************************************/
static void
nm_device_veth_init (NMDeviceVeth *self)
{
- nm_device_set_initial_unmanaged_flag (NM_DEVICE (self), NM_UNMANAGED_DEFAULT, TRUE);
}
static void
@@ -141,12 +149,15 @@ static void
nm_device_veth_class_init (NMDeviceVethClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
g_type_class_add_private (klass, sizeof (NMDeviceVethPrivate));
object_class->get_property = get_property;
object_class->dispose = dispose;
+ device_class->can_unmanaged_external_down = can_unmanaged_external_down;
+
/* properties */
g_object_class_install_property
(object_class, PROP_PEER,
@@ -166,19 +177,17 @@ nm_device_veth_class_init (NMDeviceVethClass *klass)
#define NM_VETH_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VETH_FACTORY, NMVethFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_VETH) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_VETH,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_TYPE_DESC, "Veth",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_ETHERNET,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_VETH,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_TYPE_DESC, "Veth",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_ETHERNET,
+ NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(VETH, Veth, veth, ETHERNET, \
- factory_iface->new_link = new_link; \
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (VETH, Veth, veth,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_VETH),
+ factory_iface->new_link = new_link;
)
diff --git a/src/devices/nm-device-vlan.c b/src/devices/nm-device-vlan.c
index c69bcdedd..158e7de5b 100644
--- a/src/devices/nm-device-vlan.c
+++ b/src/devices/nm-device-vlan.c
@@ -40,6 +40,7 @@
#include "nm-device-factory.h"
#include "nm-manager.h"
#include "nm-core-internal.h"
+#include "gsystem-local-alloc.h"
#include "nm-device-vlan-glue.h"
@@ -51,14 +52,10 @@ G_DEFINE_TYPE (NMDeviceVlan, nm_device_vlan, NM_TYPE_DEVICE)
#define NM_DEVICE_VLAN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_DEVICE_VLAN, NMDeviceVlanPrivate))
typedef struct {
- char *initial_hw_addr;
-
- gboolean disposed;
gboolean invalid;
NMDevice *parent;
guint parent_state_id;
-
int vlan_id;
} NMDeviceVlanPrivate;
@@ -75,20 +72,68 @@ enum {
/******************************************************************/
static void
-update_initial_hw_address (NMDevice *dev)
+parent_state_changed (NMDevice *parent,
+ NMDeviceState new_state,
+ NMDeviceState old_state,
+ NMDeviceStateReason reason,
+ gpointer user_data)
+{
+ NMDeviceVlan *self = NM_DEVICE_VLAN (user_data);
+
+ /* We'll react to our own carrier state notifications. Ignore the parent's. */
+ if (reason == NM_DEVICE_STATE_REASON_CARRIER)
+ return;
+
+ nm_device_set_unmanaged (NM_DEVICE (self), NM_UNMANAGED_PARENT, !nm_device_get_managed (parent), reason);
+}
+
+static void
+nm_device_vlan_set_parent (NMDeviceVlan *self, NMDevice *parent, gboolean construct)
{
- NMDeviceVlan *self = NM_DEVICE_VLAN (dev);
NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
+ NMDevice *device = NM_DEVICE (self);
+
+ if (parent == priv->parent)
+ return;
+
+ if (priv->parent_state_id) {
+ g_signal_handler_disconnect (priv->parent, priv->parent_state_id);
+ priv->parent_state_id = 0;
+ }
+ g_clear_object (&priv->parent);
- priv->initial_hw_addr = g_strdup (nm_device_get_hw_address (dev));
- _LOGD (LOGD_DEVICE | LOGD_VLAN, "read initial MAC address %s", priv->initial_hw_addr);
+ if (parent) {
+ priv->parent = g_object_ref (parent);
+ priv->parent_state_id = g_signal_connect (priv->parent,
+ "state-changed",
+ G_CALLBACK (parent_state_changed),
+ device);
+
+ /* Set parent-dependent unmanaged flag */
+ if (construct) {
+ nm_device_set_initial_unmanaged_flag (device,
+ NM_UNMANAGED_PARENT,
+ !nm_device_get_managed (parent));
+ } else {
+ nm_device_set_unmanaged (device,
+ NM_UNMANAGED_PARENT,
+ !nm_device_get_managed (parent),
+ NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED);
+ }
+ }
+
+ /* Recheck availability now that the parent has changed */
+ nm_device_queue_recheck_available (self,
+ NM_DEVICE_STATE_REASON_PARENT_CHANGED,
+ NM_DEVICE_STATE_REASON_PARENT_CHANGED);
+ g_object_notify (G_OBJECT (device), NM_DEVICE_VLAN_PARENT);
}
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *dev)
{
/* We assume VLAN interfaces always support carrier detect */
- return NM_DEVICE_CAP_CARRIER_DETECT;
+ return NM_DEVICE_CAP_CARRIER_DETECT | NM_DEVICE_CAP_IS_SOFTWARE;
}
static gboolean
@@ -108,12 +153,55 @@ bring_up (NMDevice *dev, gboolean *no_firmware)
/******************************************************************/
static gboolean
+is_available (NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
+{
+ if (!NM_DEVICE_VLAN_GET_PRIVATE (device)->parent)
+ return FALSE;
+
+ return NM_DEVICE_CLASS (nm_device_vlan_parent_class)->is_available (device, flags);
+}
+
+static gboolean
+component_added (NMDevice *device, GObject *component)
+{
+ NMDeviceVlan *self = NM_DEVICE_VLAN (device);
+ NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
+ NMDevice *added_device;
+ int parent_ifindex = -1;
+
+ if (priv->parent)
+ return FALSE;
+
+ if (!NM_IS_DEVICE (component))
+ return FALSE;
+ added_device = NM_DEVICE (component);
+
+ if (!nm_platform_vlan_get_info (NM_PLATFORM_GET, nm_device_get_ifindex (device), &parent_ifindex, NULL)) {
+ _LOGW (LOGD_VLAN, "failed to get VLAN interface info while checking added component.");
+ return FALSE;
+ }
+
+ if (nm_device_get_ifindex (added_device) != parent_ifindex)
+ return FALSE;
+
+ nm_device_vlan_set_parent (self, added_device, FALSE);
+
+ /* Don't claim parent exclusively */
+ return FALSE;
+}
+
+/******************************************************************/
+
+static gboolean
match_parent (NMDeviceVlan *self, const char *parent)
{
NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
g_return_val_if_fail (parent != NULL, FALSE);
+ if (!priv->parent)
+ return FALSE;
+
if (nm_utils_is_uuid (parent)) {
NMActRequest *parent_req;
NMConnection *parent_connection;
@@ -239,32 +327,6 @@ complete_connection (NMDevice *device,
return TRUE;
}
-static void parent_state_changed (NMDevice *parent, NMDeviceState new_state,
- NMDeviceState old_state,
- NMDeviceStateReason reason,
- gpointer user_data);
-
-static void
-nm_device_vlan_set_parent (NMDeviceVlan *device, NMDevice *parent)
-{
- NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (device);
-
- if (priv->parent_state_id) {
- g_signal_handler_disconnect (priv->parent, priv->parent_state_id);
- priv->parent_state_id = 0;
- }
- g_clear_object (&priv->parent);
-
- if (parent) {
- priv->parent = g_object_ref (parent);
- priv->parent_state_id = g_signal_connect (priv->parent,
- "state-changed",
- G_CALLBACK (parent_state_changed),
- device);
- }
- g_object_notify (G_OBJECT (device), NM_DEVICE_VLAN_PARENT);
-}
-
static void
update_connection (NMDevice *device, NMConnection *connection)
{
@@ -281,7 +343,7 @@ update_connection (NMDevice *device, NMConnection *connection)
nm_connection_add_setting (connection, (NMSetting *) s_vlan);
}
- if (!nm_platform_vlan_get_info (ifindex, &parent_ifindex, &vlan_id)) {
+ if (!nm_platform_vlan_get_info (NM_PLATFORM_GET, ifindex, &parent_ifindex, &vlan_id)) {
_LOGW (LOGD_VLAN, "failed to get VLAN interface info while updating connection.");
return;
}
@@ -296,8 +358,7 @@ update_connection (NMDevice *device, NMConnection *connection)
parent = nm_manager_get_device_by_ifindex (nm_manager_get (), parent_ifindex);
g_assert (parent);
- if (priv->parent != parent)
- nm_device_vlan_set_parent (NM_DEVICE_VLAN (device), parent);
+ nm_device_vlan_set_parent (NM_DEVICE_VLAN (device), parent, FALSE);
/* Update parent in the connection; default to parent's interface name */
new_parent = nm_device_get_iface (parent);
@@ -353,12 +414,12 @@ act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason)
num = nm_setting_vlan_get_num_priorities (s_vlan, NM_VLAN_INGRESS_MAP);
for (i = 0; i < num; i++) {
if (nm_setting_vlan_get_priority (s_vlan, NM_VLAN_INGRESS_MAP, i, &from, &to))
- nm_platform_vlan_set_ingress_map (ifindex, from, to);
+ nm_platform_vlan_set_ingress_map (NM_PLATFORM_GET, ifindex, from, to);
}
num = nm_setting_vlan_get_num_priorities (s_vlan, NM_VLAN_EGRESS_MAP);
for (i = 0; i < num; i++) {
if (nm_setting_vlan_get_priority (s_vlan, NM_VLAN_EGRESS_MAP, i, &from, &to))
- nm_platform_vlan_set_egress_map (ifindex, from, to);
+ nm_platform_vlan_set_egress_map (NM_PLATFORM_GET, ifindex, from, to);
}
}
@@ -386,30 +447,9 @@ ip4_config_pre_commit (NMDevice *device, NMIP4Config *config)
static void
deactivate (NMDevice *device)
{
- NMDeviceVlan *self = NM_DEVICE_VLAN (device);
- NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
-
/* Reset MAC address back to initial address */
- if (priv->initial_hw_addr)
- nm_device_set_hw_addr (device, priv->initial_hw_addr, "reset", LOGD_VLAN);
-}
-
-/******************************************************************/
-
-static void
-parent_state_changed (NMDevice *parent,
- NMDeviceState new_state,
- NMDeviceState old_state,
- NMDeviceStateReason reason,
- gpointer user_data)
-{
- NMDeviceVlan *self = NM_DEVICE_VLAN (user_data);
-
- /* We'll react to our own carrier state notifications. Ignore the parent's. */
- if (reason == NM_DEVICE_STATE_REASON_CARRIER)
- return;
-
- nm_device_set_unmanaged (NM_DEVICE (self), NM_UNMANAGED_PARENT, !nm_device_get_managed (parent), reason);
+ if (nm_device_get_initial_hw_address (device))
+ nm_device_set_hw_addr (device, nm_device_get_initial_hw_address (device), "reset", LOGD_VLAN);
}
/******************************************************************/
@@ -431,37 +471,40 @@ constructed (GObject *object)
if (G_OBJECT_CLASS (nm_device_vlan_parent_class)->constructed)
G_OBJECT_CLASS (nm_device_vlan_parent_class)->constructed (object);
- if (!priv->parent) {
- _LOGE (LOGD_VLAN, "no parent specified.");
- priv->invalid = TRUE;
- return;
- }
-
- itype = nm_platform_link_get_type (ifindex);
+ itype = nm_platform_link_get_type (NM_PLATFORM_GET, ifindex);
if (itype != NM_LINK_TYPE_VLAN) {
_LOGE (LOGD_VLAN, "failed to get VLAN interface type.");
priv->invalid = TRUE;
return;
}
- if (!nm_platform_vlan_get_info (ifindex, &parent_ifindex, &vlan_id)) {
+ if (!nm_platform_vlan_get_info (NM_PLATFORM_GET, ifindex, &parent_ifindex, &vlan_id)) {
_LOGW (LOGD_VLAN, "failed to get VLAN interface info.");
priv->invalid = TRUE;
return;
}
- if ( parent_ifindex < 0
- || parent_ifindex != nm_device_get_ip_ifindex (priv->parent)
- || vlan_id < 0) {
+ if (parent_ifindex < 0 || vlan_id < 0) {
_LOGW (LOGD_VLAN, "VLAN parent ifindex (%d) or VLAN ID (%d) invalid.",
parent_ifindex, priv->vlan_id);
priv->invalid = TRUE;
return;
}
+ if (priv->parent && parent_ifindex != nm_device_get_ip_ifindex (priv->parent)) {
+ _LOGW (LOGD_VLAN, "VLAN parent %s (%d) and parent ifindex %d don't match.",
+ nm_device_get_iface (priv->parent),
+ nm_device_get_ifindex (priv->parent),
+ parent_ifindex);
+ priv->invalid = TRUE;
+ return;
+ }
+
priv->vlan_id = vlan_id;
- _LOGI (LOGD_HW | LOGD_VLAN, "VLAN ID %d with parent %s",
- priv->vlan_id, nm_device_get_iface (priv->parent));
+ _LOGI (LOGD_HW | LOGD_VLAN, "VLAN ID %d with parent %s (%d)",
+ priv->vlan_id,
+ priv->parent ? nm_device_get_iface (priv->parent) : "unknown",
+ parent_ifindex);
}
static void
@@ -494,7 +537,7 @@ set_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_INT_PARENT_DEVICE:
- nm_device_vlan_set_parent (NM_DEVICE_VLAN (object), g_value_get_object (value));
+ nm_device_vlan_set_parent (NM_DEVICE_VLAN (object), g_value_get_object (value), TRUE);
break;
case PROP_VLAN_ID:
priv->vlan_id = g_value_get_uint (value);
@@ -508,32 +551,12 @@ set_property (GObject *object, guint prop_id,
static void
dispose (GObject *object)
{
- NMDeviceVlan *self = NM_DEVICE_VLAN (object);
- NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
-
- if (priv->disposed) {
- G_OBJECT_CLASS (nm_device_vlan_parent_class)->dispose (object);
- return;
- }
- priv->disposed = TRUE;
-
- nm_device_vlan_set_parent (self, NULL);
+ nm_device_vlan_set_parent (NM_DEVICE_VLAN (object), NULL, FALSE);
G_OBJECT_CLASS (nm_device_vlan_parent_class)->dispose (object);
}
static void
-finalize (GObject *object)
-{
- NMDeviceVlan *self = NM_DEVICE_VLAN (object);
- NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
-
- g_free (priv->initial_hw_addr);
-
- G_OBJECT_CLASS (nm_device_vlan_parent_class)->finalize (object);
-}
-
-static void
nm_device_vlan_class_init (NMDeviceVlanClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -548,14 +571,14 @@ nm_device_vlan_class_init (NMDeviceVlanClass *klass)
object_class->get_property = get_property;
object_class->set_property = set_property;
object_class->dispose = dispose;
- object_class->finalize = finalize;
- parent_class->update_initial_hw_address = update_initial_hw_address;
parent_class->get_generic_capabilities = get_generic_capabilities;
parent_class->bring_up = bring_up;
parent_class->act_stage1_prepare = act_stage1_prepare;
parent_class->ip4_config_pre_commit = ip4_config_pre_commit;
parent_class->deactivate = deactivate;
+ parent_class->is_available = is_available;
+ parent_class->component_added = component_added;
parent_class->check_connection_compatible = check_connection_compatible;
parent_class->complete_connection = complete_connection;
@@ -594,30 +617,18 @@ nm_device_vlan_class_init (NMDeviceVlanClass *klass)
#define NM_VLAN_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VLAN_FACTORY, NMVlanFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
int parent_ifindex = -1;
NMDevice *parent, *device;
- if (plink->type != NM_LINK_TYPE_VLAN)
- return NULL;
-
- /* Have to find the parent device */
- if (!nm_platform_vlan_get_info (plink->ifindex, &parent_ifindex, NULL)) {
- nm_log_err (LOGD_HW, "(%s): failed to get VLAN parent ifindex", plink->name);
+ /* Find the parent device */
+ if (!nm_platform_vlan_get_info (NM_PLATFORM_GET, plink->ifindex, &parent_ifindex, NULL)) {
+ g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "VLAN parent ifindex unknown");
return NULL;
}
-
parent = nm_manager_get_device_by_ifindex (nm_manager_get (), parent_ifindex);
- if (!parent) {
- /* If udev signaled the VLAN interface before it signaled
- * the VLAN's parent at startup we may not know about the
- * parent device yet. But we'll find it on the second pass
- * from nm_manager_start().
- */
- nm_log_dbg (LOGD_HW, "(%s): VLAN parent interface unknown", plink->name);
- return NULL;
- }
device = (NMDevice *) g_object_new (NM_TYPE_DEVICE_VLAN,
NM_DEVICE_PLATFORM_DEVICE, plink,
@@ -627,14 +638,12 @@ new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_VLAN,
NULL);
if (NM_DEVICE_VLAN_GET_PRIVATE (device)->invalid) {
+ g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "VLAN initialization failed");
g_object_unref (device);
device = NULL;
}
- /* Set initial parent-dependent unmanaged flag */
- if (device)
- nm_device_set_initial_unmanaged_flag (device, NM_UNMANAGED_PARENT, !nm_device_get_managed (parent));
-
return device;
}
@@ -646,15 +655,17 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
{
NMDevice *device;
NMSettingVlan *s_vlan;
- char *iface;
+ gs_free char *iface = NULL;
+ NMPlatformError plerr;
- if (!nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME))
+ if (!NM_IS_DEVICE (parent)) {
+ g_set_error_literal (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "VLAN interfaces must have parents");
return NULL;
-
- g_return_val_if_fail (NM_IS_DEVICE (parent), NULL);
+ }
s_vlan = nm_connection_get_setting_vlan (connection);
- g_return_val_if_fail (s_vlan != NULL, NULL);
+ g_assert (s_vlan);
iface = g_strdup (nm_connection_get_interface_name (connection));
if (!iface) {
@@ -662,14 +673,18 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
nm_setting_vlan_get_id (s_vlan));
}
- if ( !nm_platform_vlan_add (iface,
+ plerr = nm_platform_vlan_add (NM_PLATFORM_GET,
+ iface,
nm_device_get_ifindex (parent),
nm_setting_vlan_get_id (s_vlan),
- nm_setting_vlan_get_flags (s_vlan))
- && nm_platform_get_error () != NM_PLATFORM_ERROR_EXISTS) {
- nm_log_warn (LOGD_DEVICE | LOGD_VLAN, "(%s) failed to add VLAN interface for '%s'",
- iface, nm_connection_get_id (connection));
- g_free (iface);
+ nm_setting_vlan_get_flags (s_vlan),
+ NULL);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS && plerr != NM_PLATFORM_ERROR_EXISTS) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create VLAN interface '%s' for '%s': %s",
+ iface,
+ nm_connection_get_id (connection),
+ nm_platform_error_to_string (plerr));
return NULL;
}
@@ -680,21 +695,74 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NM_DEVICE_TYPE_DESC, "VLAN",
NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_VLAN,
NULL);
- g_free (iface);
if (NM_DEVICE_VLAN_GET_PRIVATE (device)->invalid) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create VLAN interface '%s' for '%s': initialization failed",
+ iface, nm_connection_get_id (connection));
g_object_unref (device);
device = NULL;
}
- /* Set initial parent-dependent unmanaged flag */
- if (device)
- nm_device_set_initial_unmanaged_flag (device, NM_UNMANAGED_PARENT, !nm_device_get_managed (parent));
-
return device;
}
-DEFINE_DEVICE_FACTORY_INTERNAL(VLAN, Vlan, vlan, \
- factory_iface->new_link = new_link; \
+static const char *
+get_connection_parent (NMDeviceFactory *factory, NMConnection *connection)
+{
+ NMSettingVlan *s_vlan;
+ NMSettingWired *s_wired;
+ const char *parent = NULL;
+
+ g_return_val_if_fail (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME), NULL);
+
+ s_vlan = nm_connection_get_setting_vlan (connection);
+ g_assert (s_vlan);
+
+ parent = nm_setting_vlan_get_parent (s_vlan);
+ if (parent)
+ return parent;
+
+ /* Try the hardware address from the VLAN connection's hardware setting */
+ s_wired = nm_connection_get_setting_wired (connection);
+ if (s_wired)
+ return nm_setting_wired_get_mac_address (s_wired);
+
+ return NULL;
+}
+
+static char *
+get_virtual_iface_name (NMDeviceFactory *factory,
+ NMConnection *connection,
+ const char *parent_iface)
+{
+ const char *ifname;
+ NMSettingVlan *s_vlan;
+
+ g_return_val_if_fail (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME), NULL);
+
+ s_vlan = nm_connection_get_setting_vlan (connection);
+ g_assert (s_vlan);
+
+ if (!parent_iface)
+ return NULL;
+
+ ifname = nm_connection_get_interface_name (connection);
+ if (ifname)
+ return g_strdup (ifname);
+
+ /* If the connection doesn't specify the interface name for the VLAN
+ * device, we create one for it using the VLAN ID and the parent
+ * interface's name.
+ */
+ return nm_utils_new_vlan_name (parent_iface, nm_setting_vlan_get_id (s_vlan));
+}
+
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (VLAN, Vlan, vlan,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_VLAN)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_VLAN_SETTING_NAME),
+ factory_iface->new_link = new_link;
factory_iface->create_virtual_device_for_connection = create_virtual_device_for_connection;
+ factory_iface->get_connection_parent = get_connection_parent;
+ factory_iface->get_virtual_iface_name = get_virtual_iface_name;
)
diff --git a/src/devices/nm-device-vxlan.c b/src/devices/nm-device-vxlan.c
index ed6b8fa05..186e00de0 100644
--- a/src/devices/nm-device-vxlan.c
+++ b/src/devices/nm-device-vxlan.c
@@ -76,7 +76,7 @@ update_properties (NMDevice *device)
GObject *object = G_OBJECT (device);
NMPlatformVxlanProperties props;
- if (!nm_platform_vxlan_get_properties (nm_device_get_ifindex (device), &props)) {
+ if (!nm_platform_vxlan_get_properties (NM_PLATFORM_GET, nm_device_get_ifindex (device), &props)) {
_LOGW (LOGD_HW, "could not read vxlan properties");
return;
}
@@ -199,7 +199,7 @@ get_property (GObject *object, guint prop_id,
g_value_set_uint (value, priv->props.src_port_max);
break;
case PROP_PROXY:
- g_value_set_uint (value, priv->props.proxy);
+ g_value_set_boolean (value, priv->props.proxy);
break;
case PROP_RSC:
g_value_set_boolean (value, priv->props.rsc);
@@ -353,19 +353,17 @@ nm_device_vxlan_class_init (NMDeviceVxlanClass *klass)
#define NM_VXLAN_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_VXLAN_FACTORY, NMVxlanFactory))
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_VXLAN) {
- return (NMDevice *) g_object_new (NM_TYPE_DEVICE_VXLAN,
- NM_DEVICE_PLATFORM_DEVICE, plink,
- NM_DEVICE_TYPE_DESC, "Vxlan",
- NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_GENERIC,
- NULL);
- }
- return NULL;
+ return (NMDevice *) g_object_new (NM_TYPE_DEVICE_VXLAN,
+ NM_DEVICE_PLATFORM_DEVICE, plink,
+ NM_DEVICE_TYPE_DESC, "Vxlan",
+ NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_GENERIC,
+ NULL);
}
-DEFINE_DEVICE_FACTORY_INTERNAL_WITH_DEVTYPE(VXLAN, Vxlan, vxlan, GENERIC, \
- factory_iface->new_link = new_link; \
+NM_DEVICE_FACTORY_DEFINE_INTERNAL (VXLAN, Vxlan, vxlan,
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_VXLAN),
+ factory_iface->new_link = new_link;
)
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 47526281d..c5d4c2039 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -28,8 +28,6 @@
#include <string.h>
#include <unistd.h>
#include <errno.h>
-#include <linux/sockios.h>
-#include <linux/ethtool.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <sys/types.h>
@@ -62,7 +60,6 @@
#include "nm-enum-types.h"
#include "nm-settings-connection.h"
#include "nm-connection-provider.h"
-#include "nm-posix-signals.h"
#include "nm-auth-utils.h"
#include "nm-dbus-glib-types.h"
#include "nm-dispatcher.h"
@@ -70,12 +67,14 @@
#include "nm-dns-manager.h"
#include "nm-core-internal.h"
#include "nm-default-route-manager.h"
+#include "nm-route-manager.h"
#include "nm-device-logging.h"
_LOG_DECLARE_SELF (NMDevice);
static void impl_device_disconnect (NMDevice *self, DBusGMethodInvocation *context);
static void impl_device_delete (NMDevice *self, DBusGMethodInvocation *context);
+static void ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data);
#include "nm-device-glue.h"
@@ -139,6 +138,12 @@ enum {
#define PENDING_ACTION_AUTOCONF6 "autoconf6"
typedef enum {
+ CLEANUP_TYPE_DECONFIGURE,
+ CLEANUP_TYPE_KEEP,
+ CLEANUP_TYPE_REMOVED,
+} CleanupType;
+
+typedef enum {
IP_NONE = 0,
IP_WAIT,
IP_CONF,
@@ -164,6 +169,9 @@ typedef struct {
guint timeout;
guint watch;
GPid pid;
+ const char *binary;
+ const char *address;
+ guint deadline;
} PingInfo;
typedef struct {
@@ -175,23 +183,28 @@ typedef struct {
typedef struct {
gboolean in_state_changed;
gboolean initialized;
+ gboolean platform_link_initialized;
+
+ guint device_link_changed_id;
+ guint device_ip_link_changed_id;
NMDeviceState state;
NMDeviceStateReason state_reason;
QueuedState queued_state;
- guint queued_ip_config_id;
+ guint queued_ip4_config_id;
+ guint queued_ip6_config_id;
GSList *pending_actions;
char * udi;
char * path;
char * iface; /* may change, could be renamed by user */
int ifindex;
- gboolean is_software;
char * ip_iface;
int ip_ifindex;
NMDeviceType type;
char * type_desc;
- guint32 capabilities;
+ char * type_description;
+ NMDeviceCapabilities capabilities;
char * driver;
char * driver_version;
char * firmware_version;
@@ -200,6 +213,8 @@ typedef struct {
GHashTable * available_connections;
char * hw_addr;
guint hw_addr_len;
+ char * perm_hw_addr;
+ char * initial_hw_addr;
char * physical_port_id;
guint dev_id;
@@ -220,6 +235,11 @@ typedef struct {
gpointer act_source6_func;
guint recheck_assume_id;
struct {
+ guint call_id;
+ NMDeviceStateReason available_reason;
+ NMDeviceStateReason unavailable_reason;
+ } recheck_available;
+ struct {
guint call_id;
NMDeviceState post_state;
NMDeviceStateReason post_state_reason;
@@ -242,16 +262,18 @@ typedef struct {
/* IP4 configuration info */
NMIP4Config * ip4_config; /* Combined config from VPN, settings, and device */
IpState ip4_state;
+ NMIP4Config * con_ip4_config; /* config from the setting */
NMIP4Config * dev_ip4_config; /* Config from DHCP, PPP, LLv4, etc */
NMIP4Config * ext_ip4_config; /* Stuff added outside NM */
- gboolean ext_ip4_config_had_any_addresses;
NMIP4Config * wwan_ip4_config; /* WWAN configuration */
struct {
gboolean v4_has;
gboolean v4_is_assumed;
+ gboolean v4_configure_first_time;
NMPlatformIP4Route v4;
gboolean v6_has;
gboolean v6_is_assumed;
+ gboolean v6_configure_first_time;
NMPlatformIP6Route v6;
} default_route;
@@ -279,11 +301,12 @@ typedef struct {
/* IP6 configuration info */
NMIP6Config * ip6_config;
IpState ip6_state;
+ NMIP6Config * con_ip6_config; /* config from the setting */
NMIP6Config * vpn6_config; /* routes added by a VPN which uses this device */
NMIP6Config * wwan_ip6_config;
NMIP6Config * ext_ip6_config; /* Stuff added outside NM */
- gboolean ext_ip6_config_had_any_addresses;
gboolean nm_ipv6ll; /* TRUE if NM handles the device's IPv6LL address */
+ guint32 ip6_mtu;
NMRDisc * rdisc;
gulong rdisc_changed_id;
@@ -322,6 +345,7 @@ static gboolean nm_device_set_ip4_config (NMDevice *self,
NMIP4Config *config,
guint32 default_route_metric,
gboolean commit,
+ gboolean routes_full_sync,
NMDeviceStateReason *reason);
static gboolean ip4_config_merge_and_apply (NMDevice *self,
NMIP4Config *config,
@@ -331,6 +355,7 @@ static gboolean ip4_config_merge_and_apply (NMDevice *self,
static gboolean nm_device_set_ip6_config (NMDevice *self,
NMIP6Config *config,
gboolean commit,
+ gboolean routes_full_sync,
NMDeviceStateReason *reason);
static gboolean nm_device_master_add_slave (NMDevice *self, NMDevice *slave, gboolean configure);
@@ -448,6 +473,8 @@ static const char *reason_table[] = {
[NM_DEVICE_STATE_REASON_MODEM_AVAILABLE] = "modem-available",
[NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT] = "sim-pin-incorrect",
[NM_DEVICE_STATE_REASON_NEW_ACTIVATION] = "new-activation",
+ [NM_DEVICE_STATE_REASON_PARENT_CHANGED] = "parent-changed",
+ [NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED] = "parent-managed-changed",
};
static const char *
@@ -463,13 +490,19 @@ reason_to_string (NMDeviceStateReason reason)
gboolean
nm_device_ipv6_sysctl_set (NMDevice *self, const char *property, const char *value)
{
- return nm_platform_sysctl_set (nm_utils_ip6_property_path (nm_device_get_ip_iface (self), property), value);
+ return nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip6_property_path (nm_device_get_ip_iface (self), property), value);
}
-static gboolean
-device_has_capability (NMDevice *self, NMDeviceCapabilities caps)
+static guint32
+nm_device_ipv6_sysctl_get_int32 (NMDevice *self, const char *property, gint32 fallback)
{
- return !!(NM_DEVICE_GET_PRIVATE (self)->capabilities & caps);
+ return nm_platform_sysctl_get_int32 (NM_PLATFORM_GET, nm_utils_ip6_property_path (nm_device_get_ip_iface (self), property), fallback);
+}
+
+gboolean
+nm_device_has_capability (NMDevice *self, NMDeviceCapabilities caps)
+{
+ return NM_FLAGS_ANY (NM_DEVICE_GET_PRIVATE (self)->capabilities, caps);
}
/***********************************************************/
@@ -486,7 +519,7 @@ nm_device_dbus_export (NMDevice *self)
g_return_if_fail (priv->path == NULL);
priv->path = g_strdup_printf ("/org/freedesktop/NetworkManager/Devices/%d", devcount++);
- _LOGI (LOGD_DEVICE, "exported as %s", priv->path);
+ _LOGD (LOGD_DEVICE, "exported as %s", priv->path);
nm_dbus_manager_register_object (nm_dbus_manager_get (), priv->path, self);
}
@@ -509,7 +542,7 @@ nm_device_get_udi (NMDevice *self)
const char *
nm_device_get_iface (NMDevice *self)
{
- g_return_val_if_fail (NM_IS_DEVICE (self), 0);
+ g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
return NM_DEVICE_GET_PRIVATE (self)->iface;
}
@@ -525,9 +558,7 @@ nm_device_get_ifindex (NMDevice *self)
gboolean
nm_device_is_software (NMDevice *self)
{
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
-
- return priv->is_software;
+ return NM_FLAGS_HAS (NM_DEVICE_GET_PRIVATE (self)->capabilities, NM_DEVICE_CAP_IS_SOFTWARE);
}
const char *
@@ -550,7 +581,7 @@ nm_device_get_ip_ifindex (NMDevice *self)
g_return_val_if_fail (self != NULL, 0);
priv = NM_DEVICE_GET_PRIVATE (self);
- /* If it's not set, default to iface */
+ /* If it's not set, default to ifindex */
return priv->ip_iface ? priv->ip_ifindex : priv->ifindex;
}
@@ -571,13 +602,13 @@ nm_device_set_ip_iface (NMDevice *self, const char *iface)
priv->ip_iface = g_strdup (iface);
if (priv->ip_iface) {
- priv->ip_ifindex = nm_platform_link_get_ifindex (priv->ip_iface);
+ priv->ip_ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, priv->ip_iface);
if (priv->ip_ifindex > 0) {
- if (nm_platform_check_support_user_ipv6ll ())
- nm_platform_link_set_user_ipv6ll_enabled (priv->ip_ifindex, TRUE);
+ if (nm_platform_check_support_user_ipv6ll (NM_PLATFORM_GET))
+ nm_platform_link_set_user_ipv6ll_enabled (NM_PLATFORM_GET, priv->ip_ifindex, TRUE);
- if (!nm_platform_link_is_up (priv->ip_ifindex))
- nm_platform_link_set_up (priv->ip_ifindex);
+ if (!nm_platform_link_is_up (NM_PLATFORM_GET, priv->ip_ifindex))
+ nm_platform_link_set_up (NM_PLATFORM_GET, priv->ip_ifindex, NULL);
} else {
/* Device IP interface must always be a kernel network interface */
_LOGW (LOGD_HW, "failed to look up interface index");
@@ -607,10 +638,10 @@ get_ip_iface_identifier (NMDevice *self, NMUtilsIPv6IfaceId *out_iid)
ifindex = nm_device_get_ip_ifindex (self);
g_assert (ifindex);
- link_type = nm_platform_link_get_type (ifindex);
+ link_type = nm_platform_link_get_type (NM_PLATFORM_GET, ifindex);
g_return_val_if_fail (link_type > NM_LINK_TYPE_UNKNOWN, 0);
- hwaddr = nm_platform_link_get_address (ifindex, &hwaddr_len);
+ hwaddr = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, &hwaddr_len);
if (!hwaddr_len)
return FALSE;
@@ -724,50 +755,63 @@ nm_device_get_priority (NMDevice *self)
return 11000;
}
-guint32
-nm_device_get_ip4_route_metric (NMDevice *self)
+static guint32
+_get_ipx_route_metric (NMDevice *self,
+ gboolean is_v4)
{
+ char *value;
+ gint64 route_metric;
+ NMSettingIPConfig *s_ip;
NMConnection *connection;
- NMSettingIPConfig *s_ip = NULL;
- gint64 route_metric = -1;
g_return_val_if_fail (NM_IS_DEVICE (self), G_MAXUINT32);
connection = nm_device_get_connection (self);
- if (connection)
- s_ip = nm_connection_get_setting_ip4_config (connection);
+ if (connection) {
+ s_ip = is_v4
+ ? nm_connection_get_setting_ip4_config (connection)
+ : nm_connection_get_setting_ip6_config (connection);
- /* Slave interfaces don't have IP settings, but we may get here when
- * external changes are made or when noticing IP changes when starting
- * the slave connection.
- */
- if (s_ip)
- route_metric = nm_setting_ip_config_get_route_metric (s_ip);
+ /* Slave interfaces don't have IP settings, but we may get here when
+ * external changes are made or when noticing IP changes when starting
+ * the slave connection.
+ */
+ if (s_ip) {
+ route_metric = nm_setting_ip_config_get_route_metric (s_ip);
+ if (route_metric >= 0)
+ goto out;
+ }
+ }
- return route_metric >= 0 ? route_metric : nm_device_get_priority (self);
+ /* use the current NMConfigData, which makes this configuration reloadable.
+ * Note that that means that the route-metric might change between SIGHUP.
+ * You must cache the returned value if that is a problem. */
+ value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+ is_v4 ? "ipv4.route-metric" : "ipv6.route-metric", self);
+ if (value) {
+ route_metric = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, -1);
+ g_free (value);
+
+ if (route_metric >= 0)
+ goto out;
+ }
+ route_metric = nm_device_get_priority (self);
+out:
+ if (!is_v4)
+ route_metric = nm_utils_ip6_route_metric_normalize (route_metric);
+ return route_metric;
}
guint32
-nm_device_get_ip6_route_metric (NMDevice *self)
+nm_device_get_ip4_route_metric (NMDevice *self)
{
- NMConnection *connection;
- NMSettingIPConfig *s_ip = NULL;
- gint64 route_metric = -1;
-
- g_return_val_if_fail (NM_IS_DEVICE (self), G_MAXUINT32);
-
- connection = nm_device_get_connection (self);
- if (connection)
- s_ip = nm_connection_get_setting_ip6_config (connection);
-
- /* Slave interfaces don't have IP settings, but we may get here when
- * external changes are made or when noticing IP changes when starting
- * the slave connection.
- */
- if (s_ip)
- route_metric = nm_setting_ip_config_get_route_metric (s_ip);
+ return _get_ipx_route_metric (self, TRUE);
+}
- return route_metric >= 0 ? route_metric : nm_device_get_priority (self);
+guint32
+nm_device_get_ip6_route_metric (NMDevice *self)
+{
+ return _get_ipx_route_metric (self, FALSE);
}
const NMPlatformIP4Route *
@@ -808,6 +852,34 @@ nm_device_get_type_desc (NMDevice *self)
return NM_DEVICE_GET_PRIVATE (self)->type_desc;
}
+const char *
+nm_device_get_type_description (NMDevice *self)
+{
+ g_return_val_if_fail (self != NULL, NULL);
+
+ /* Beware: this function should return the same
+ * value as nm_device_get_type_description() in libnm. */
+
+ return NM_DEVICE_GET_CLASS (self)->get_type_description (self);
+}
+
+static const char *
+get_type_description (NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ if (!priv->type_description) {
+ const char *typename;
+
+ typename = G_OBJECT_TYPE_NAME (self);
+ if (g_str_has_prefix (typename, "NMDevice"))
+ typename += 8;
+ priv->type_description = g_ascii_strdown (typename, -1);
+ }
+
+ return priv->type_description;
+}
+
gboolean
nm_device_has_carrier (NMDevice *self)
{
@@ -1012,8 +1084,15 @@ nm_device_release_one_slave (NMDevice *self, NMDevice *slave, gboolean configure
return success;
}
+/**
+ * can_unmanaged_external_down:
+ * @self: the device
+ *
+ * Check whether the device should stay NM_UNMANAGED_EXTERNAL_DOWN unless
+ * IFF_UP-ed externally.
+ */
static gboolean
-is_software_external (NMDevice *self)
+can_unmanaged_external_down (NMDevice *self)
{
return nm_device_is_software (self)
&& !nm_device_get_is_nm_owned (self);
@@ -1030,22 +1109,75 @@ void
nm_device_finish_init (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ gboolean platform_unmanaged = FALSE;
g_assert (priv->initialized == FALSE);
/* Do not manage externally created software devices until they are IFF_UP */
- if ( is_software_external (self)
- && !nm_platform_link_is_up (priv->ifindex)
+ if ( NM_DEVICE_GET_CLASS (self)->can_unmanaged_external_down (self)
+ && !nm_platform_link_is_up (NM_PLATFORM_GET, priv->ifindex)
&& priv->ifindex > 0)
nm_device_set_initial_unmanaged_flag (self, NM_UNMANAGED_EXTERNAL_DOWN, TRUE);
if (priv->master)
nm_device_enslave_slave (priv->master, self, NULL);
+ if (priv->ifindex > 0) {
+ if (priv->ifindex == 1) {
+ /* keep 'lo' as default-unmanaged. */
+
+ /* FIXME: either find a better way to unmange 'lo' that cannot be changed
+ * by user configuration (NM_UNMANGED_LOOPBACK?) or fix managing 'lo'.
+ * Currently it can happen that NM deletes 127.0.0.1 address. */
+ nm_device_set_initial_unmanaged_flag (self, NM_UNMANAGED_DEFAULT, TRUE);
+ } else if (priv->platform_link_initialized || (priv->is_nm_owned && nm_device_is_software (self))) {
+ nm_platform_link_get_unmanaged (NM_PLATFORM_GET, priv->ifindex, &platform_unmanaged);
+ nm_device_set_initial_unmanaged_flag (self, NM_UNMANAGED_DEFAULT, platform_unmanaged);
+ } else {
+ /* Hardware and externally-created software links stay unmanaged
+ * until they are fully initialized by the platform. NM created
+ * links must be available for activation immediately and thus
+ * do not get the PLATFORM_INIT unmanaged flag set.
+ */
+ nm_device_set_initial_unmanaged_flag (self, NM_UNMANAGED_PLATFORM_INIT, TRUE);
+ }
+ }
+
priv->initialized = TRUE;
}
static void
+update_dynamic_ip_setup (NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ g_hash_table_remove_all (priv->ip6_saved_properties);
+
+ if (priv->dhcp4_client) {
+ if (!nm_device_dhcp4_renew (self, FALSE)) {
+ nm_device_state_changed (self,
+ NM_DEVICE_STATE_FAILED,
+ NM_DEVICE_STATE_REASON_DHCP_FAILED);
+ return;
+ }
+ }
+ if (priv->dhcp6_client) {
+ if (!nm_device_dhcp6_renew (self, FALSE)) {
+ nm_device_state_changed (self,
+ NM_DEVICE_STATE_FAILED,
+ NM_DEVICE_STATE_REASON_DHCP_FAILED);
+ return;
+ }
+ }
+ if (priv->rdisc) {
+ /* FIXME: todo */
+ }
+ if (priv->dnsmasq_manager) {
+ /* FIXME: todo */
+ }
+}
+
+static void
carrier_changed (NMDevice *self, gboolean carrier)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -1094,6 +1226,12 @@ carrier_changed (NMDevice *self, gboolean carrier)
* the device.
*/
nm_device_emit_recheck_auto_activate (self);
+ } else if (priv->state == NM_DEVICE_STATE_ACTIVATED) {
+ /* If the device is active without a carrier (probably because it is
+ * tagged for carrier ignore) ensure that when the carrier appears we
+ * renew DHCP leases and such.
+ */
+ update_dynamic_ip_setup (self);
}
} else {
g_return_if_fail (priv->state >= NM_DEVICE_STATE_UNAVAILABLE);
@@ -1176,37 +1314,6 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
}
static void
-update_for_ip_ifname_change (NMDevice *self)
-{
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
-
- g_hash_table_remove_all (priv->ip6_saved_properties);
-
- if (priv->dhcp4_client) {
- if (!nm_device_dhcp4_renew (self, FALSE)) {
- nm_device_state_changed (self,
- NM_DEVICE_STATE_FAILED,
- NM_DEVICE_STATE_REASON_DHCP_FAILED);
- return;
- }
- }
- if (priv->dhcp6_client) {
- if (!nm_device_dhcp6_renew (self, FALSE)) {
- nm_device_state_changed (self,
- NM_DEVICE_STATE_FAILED,
- NM_DEVICE_STATE_REASON_DHCP_FAILED);
- return;
- }
- }
- if (priv->rdisc) {
- /* FIXME: todo */
- }
- if (priv->dnsmasq_manager) {
- /* FIXME: todo */
- }
-}
-
-static void
device_set_master (NMDevice *self, int ifindex)
{
NMDevice *master;
@@ -1223,35 +1330,58 @@ device_set_master (NMDevice *self, int ifindex)
} else {
_LOGW (LOGD_DEVICE, "enslaved to unknown device %d %s",
ifindex,
- nm_platform_link_get_name (ifindex));
+ nm_platform_link_get_name (NM_PLATFORM_GET, ifindex));
}
}
-static void
-device_link_changed (NMDevice *self, NMPlatformLink *info)
+static gboolean
+device_link_changed (NMDevice *self)
{
NMDeviceClass *klass = NM_DEVICE_GET_CLASS (self);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NMUtilsIPv6IfaceId token_iid;
gboolean ip_ifname_changed = FALSE;
+ gboolean platform_unmanaged = FALSE;
+ const char *udi;
+ NMPlatformLink info;
+ const NMPlatformLink *pllink;
+ int ifindex;
+
+ priv->device_link_changed_id = 0;
+
+ ifindex = nm_device_get_ifindex (self);
+ pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex);
+ if (!pllink)
+ return G_SOURCE_REMOVE;
- if (info->udi && g_strcmp0 (info->udi, priv->udi)) {
+ info = *pllink;
+
+ udi = nm_platform_link_get_udi (NM_PLATFORM_GET, info.ifindex);
+ if (udi && g_strcmp0 (udi, priv->udi)) {
/* Update UDI to what udev gives us */
g_free (priv->udi);
- priv->udi = g_strdup (info->udi);
+ priv->udi = g_strdup (udi);
g_object_notify (G_OBJECT (self), NM_DEVICE_UDI);
}
+ if (g_strcmp0 (info.driver, priv->driver)) {
+ /* Update driver to what udev gives us */
+ g_free (priv->driver);
+ priv->driver = g_strdup (info.driver);
+ g_object_notify (G_OBJECT (self), NM_DEVICE_DRIVER);
+ }
+
/* Update MTU if it has changed. */
- if (priv->mtu != info->mtu) {
- priv->mtu = info->mtu;
+ if (priv->mtu != info.mtu) {
+ priv->mtu = info.mtu;
g_object_notify (G_OBJECT (self), NM_DEVICE_MTU);
}
- if (info->name[0] && strcmp (priv->iface, info->name) != 0) {
+ if (info.name[0] && strcmp (priv->iface, info.name) != 0) {
_LOGI (LOGD_DEVICE, "interface index %d renamed iface from '%s' to '%s'",
- priv->ifindex, priv->iface, info->name);
+ priv->ifindex, priv->iface, info.name);
g_free (priv->iface);
- priv->iface = g_strdup (info->name);
+ priv->iface = g_strdup (info.name);
/* If the device has no explicit ip_iface, then changing iface changes ip_iface too. */
ip_ifname_changed = !priv->ip_iface;
@@ -1270,30 +1400,36 @@ device_link_changed (NMDevice *self, NMPlatformLink *info)
}
/* Update slave status for external changes */
- if (priv->enslaved && info->master != nm_device_get_ifindex (priv->master))
+ if (priv->enslaved && info.master != nm_device_get_ifindex (priv->master))
nm_device_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_NONE);
- if (info->master && !priv->enslaved) {
- device_set_master (self, info->master);
+ if (info.master && !priv->enslaved) {
+ device_set_master (self, info.master);
if (priv->master)
nm_device_enslave_slave (priv->master, self, NULL);
}
+ if (priv->rdisc && nm_platform_link_get_ipv6_token (NM_PLATFORM_GET, priv->ifindex, &token_iid)) {
+ _LOGD (LOGD_DEVICE, "IPv6 tokenized identifier present on device %s", priv->iface);
+ if (nm_rdisc_set_iid (priv->rdisc, token_iid))
+ nm_rdisc_start (priv->rdisc);
+ }
+
if (klass->link_changed)
- klass->link_changed (self, info);
+ klass->link_changed (self, &info);
/* Update DHCP, etc, if needed */
if (ip_ifname_changed)
- update_for_ip_ifname_change (self);
+ update_dynamic_ip_setup (self);
- if (priv->up != info->up) {
- priv->up = info->up;
+ if (priv->up != NM_FLAGS_HAS (info.flags, IFF_UP)) {
+ priv->up = NM_FLAGS_HAS (info.flags, IFF_UP);
/* Manage externally-created software interfaces only when they are IFF_UP */
g_assert (priv->ifindex > 0);
- if (is_software_external (self)) {
+ if (NM_DEVICE_GET_CLASS (self)->can_unmanaged_external_down (self)) {
gboolean external_down = nm_device_get_unmanaged_flag (self, NM_UNMANAGED_EXTERNAL_DOWN);
- if (external_down && info->up) {
+ if (external_down && NM_FLAGS_HAS (info.flags, IFF_UP)) {
if (nm_device_get_state (self) < NM_DEVICE_STATE_DISCONNECTED) {
/* Ensure the assume check is queued before any queued state changes
* from the transition to UNAVAILABLE.
@@ -1316,7 +1452,7 @@ device_link_changed (NMDevice *self, NMPlatformLink *info)
*/
priv->unmanaged_flags &= ~NM_UNMANAGED_EXTERNAL_DOWN;
}
- } else if (!external_down && !info->up && nm_device_get_state (self) <= NM_DEVICE_STATE_DISCONNECTED) {
+ } else if (!external_down && !NM_FLAGS_HAS (info.flags, IFF_UP) && nm_device_get_state (self) <= NM_DEVICE_STATE_DISCONNECTED) {
/* If the device is already disconnected and is set !IFF_UP,
* unmanage it.
*/
@@ -1327,57 +1463,120 @@ device_link_changed (NMDevice *self, NMPlatformLink *info)
}
}
}
+
+ if (priv->ifindex > 0 && !priv->platform_link_initialized && info.initialized) {
+ priv->platform_link_initialized = TRUE;
+
+ if (nm_platform_link_get_unmanaged (NM_PLATFORM_GET, priv->ifindex, &platform_unmanaged)) {
+ nm_device_set_unmanaged (self,
+ NM_UNMANAGED_DEFAULT,
+ platform_unmanaged,
+ NM_DEVICE_STATE_REASON_USER_REQUESTED);
+ }
+
+ nm_device_set_unmanaged (self,
+ NM_UNMANAGED_PLATFORM_INIT,
+ FALSE,
+ NM_DEVICE_STATE_REASON_NOW_MANAGED);
+ }
+
+ return G_SOURCE_REMOVE;
}
-static void
-device_ip_link_changed (NMDevice *self, NMPlatformLink *info)
+static gboolean
+device_ip_link_changed (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ const NMPlatformLink *pllink;
+ int ip_ifindex;
+
+ priv->device_ip_link_changed_id = 0;
- if (info->name[0] && g_strcmp0 (priv->ip_iface, info->name)) {
+ ip_ifindex = nm_device_get_ip_ifindex (self);
+ pllink = nm_platform_link_get (NM_PLATFORM_GET, ip_ifindex);
+ if (!pllink)
+ return G_SOURCE_REMOVE;
+
+ if (pllink->name[0] && g_strcmp0 (priv->ip_iface, pllink->name)) {
_LOGI (LOGD_DEVICE, "interface index %d renamed ip_iface (%d) from '%s' to '%s'",
priv->ifindex, nm_device_get_ip_ifindex (self),
- priv->ip_iface, info->name);
+ priv->ip_iface, pllink->name);
g_free (priv->ip_iface);
- priv->ip_iface = g_strdup (info->name);
+ priv->ip_iface = g_strdup (pllink->name);
g_object_notify (G_OBJECT (self), NM_DEVICE_IP_IFACE);
- update_for_ip_ifname_change (self);
+ update_dynamic_ip_setup (self);
}
+ return G_SOURCE_REMOVE;
}
static void
link_changed_cb (NMPlatform *platform,
+ NMPObjectType obj_type,
int ifindex,
NMPlatformLink *info,
NMPlatformSignalChangeType change_type,
NMPlatformReason reason,
NMDevice *self)
{
+ NMDevicePrivate *priv;
+
if (change_type != NM_PLATFORM_SIGNAL_CHANGED)
return;
+ priv = NM_DEVICE_GET_PRIVATE (self);
+
/* We don't filter by 'reason' because we are interested in *all* link
* changes. For example a call to nm_platform_link_set_up() may result
* in an internal carrier change (i.e. we ask the kernel to set IFF_UP
* and it results in also setting IFF_LOWER_UP.
*/
- if (ifindex == nm_device_get_ifindex (self))
- device_link_changed (self, info);
- else if (ifindex == nm_device_get_ip_ifindex (self))
- device_ip_link_changed (self, info);
+ if (ifindex == nm_device_get_ifindex (self)) {
+ if (!priv->device_link_changed_id) {
+ priv->device_link_changed_id = g_idle_add ((GSourceFunc) device_link_changed, self);
+ _LOGD (LOGD_DEVICE, "queued link change for ifindex %d", ifindex);
+ }
+ } else if (ifindex == nm_device_get_ip_ifindex (self)) {
+ if (!priv->device_ip_link_changed_id) {
+ priv->device_ip_link_changed_id = g_idle_add ((GSourceFunc) device_ip_link_changed, self);
+ _LOGD (LOGD_DEVICE, "queued link change for ip-ifindex %d", ifindex);
+ }
+ }
}
static void
link_changed (NMDevice *self, NMPlatformLink *info)
{
/* Update carrier from link event if applicable. */
- if ( device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)
- && !device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER))
+ if ( nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)
+ && !nm_device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER))
nm_device_set_carrier (self, info->connected);
}
+static void
+config_changed_update_ignore_carrier (NMConfig *config,
+ NMConfigData *config_data,
+ NMConfigChangeFlags changes,
+ NMConfigData *old_data,
+ NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ if ( priv->state <= NM_DEVICE_STATE_DISCONNECTED
+ || priv->state > NM_DEVICE_STATE_ACTIVATED)
+ priv->ignore_carrier = nm_config_data_get_ignore_carrier (config_data, self);
+}
+
+static void
+check_carrier (NMDevice *self)
+{
+ int ifindex = nm_device_get_ip_ifindex (self);
+
+ if (!nm_device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER))
+ nm_device_set_carrier (self, nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
+}
+
/**
* nm_device_notify_component_added():
* @self: the #NMDevice
@@ -1965,7 +2164,7 @@ device_has_config (NMDevice *self)
return TRUE;
/* Slaves are also configured by definition */
- if (nm_platform_link_get_master (priv->ifindex) > 0)
+ if (nm_platform_link_get_master (NM_PLATFORM_GET, priv->ifindex) > 0)
return TRUE;
return FALSE;
@@ -2103,6 +2302,20 @@ nm_device_generate_connection (NMDevice *self, NMDevice *master)
connection = NULL;
}
+ /* Ignore any IPv6LL-only, not master connections without slaves,
+ * unless they are in the assume-ipv6ll-only list.
+ */
+ if ( connection
+ && g_strcmp0 (ip4_method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED) == 0
+ && g_strcmp0 (ip6_method, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL) == 0
+ && !nm_setting_connection_get_master (NM_SETTING_CONNECTION (s_con))
+ && !priv->slaves
+ && !nm_config_data_get_assume_ipv6ll_only (NM_CONFIG_GET_DATA, self)) {
+ _LOGD (LOGD_DEVICE, "ignoring generated connection (IPv6LL-only and not in master-slave relationship)");
+ g_object_unref (connection);
+ connection = NULL;
+ }
+
return connection;
}
@@ -2274,6 +2487,47 @@ nm_device_queue_recheck_assume (NMDevice *self)
priv->recheck_assume_id = g_idle_add (nm_device_emit_recheck_assume, self);
}
+static gboolean
+recheck_available (gpointer user_data)
+{
+ NMDevice *self = NM_DEVICE (user_data);
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ gboolean now_available = nm_device_is_available (self, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE);
+ NMDeviceState state = nm_device_get_state (self);
+ NMDeviceState new_state = NM_DEVICE_STATE_UNKNOWN;
+
+ priv->recheck_available.call_id = 0;
+
+ if (state == NM_DEVICE_STATE_UNAVAILABLE && now_available) {
+ new_state = NM_DEVICE_STATE_DISCONNECTED;
+ nm_device_queue_state (self, new_state, priv->recheck_available.available_reason);
+ } else if (state >= NM_DEVICE_STATE_DISCONNECTED && !now_available) {
+ new_state = NM_DEVICE_STATE_UNAVAILABLE;
+ nm_device_queue_state (self, new_state, priv->recheck_available.unavailable_reason);
+ }
+ _LOGD (LOGD_DEVICE, "device is %savailable, %s %s",
+ now_available ? "" : "not ",
+ new_state == NM_DEVICE_STATE_UNAVAILABLE ? "no change required for" : "will transition to",
+ state_to_string (new_state == NM_DEVICE_STATE_UNAVAILABLE ? state : new_state));
+
+ priv->recheck_available.available_reason = NM_DEVICE_STATE_REASON_NONE;
+ priv->recheck_available.unavailable_reason = NM_DEVICE_STATE_REASON_NONE;
+ return G_SOURCE_REMOVE;
+}
+
+void
+nm_device_queue_recheck_available (NMDevice *self,
+ NMDeviceStateReason available_reason,
+ NMDeviceStateReason unavailable_reason)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ priv->recheck_available.available_reason = available_reason;
+ priv->recheck_available.unavailable_reason = unavailable_reason;
+ if (!priv->recheck_available.call_id)
+ priv->recheck_available.call_id = g_idle_add (recheck_available, self);
+}
+
void
nm_device_emit_recheck_auto_activate (NMDevice *self)
{
@@ -2432,7 +2686,7 @@ nm_device_activate_stage1_device_prepare (gpointer user_data)
/* Notify the new ActiveConnection along with the state change */
g_object_notify (G_OBJECT (self), NM_DEVICE_ACTIVE_CONNECTION);
- _LOGI (LOGD_DEVICE, "Activation: Stage 1 of 5 (Device Prepare) started...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 1 of 5 (Device Prepare) started...");
nm_device_state_changed (self, NM_DEVICE_STATE_PREPARE, NM_DEVICE_STATE_REASON_NONE);
/* Assumed connections were already set up outside NetworkManager */
@@ -2466,7 +2720,7 @@ nm_device_activate_stage1_device_prepare (gpointer user_data)
nm_device_activate_schedule_stage2_device_config (self);
out:
- _LOGI (LOGD_DEVICE, "Activation: Stage 1 of 5 (Device Prepare) complete.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 1 of 5 (Device Prepare) complete.");
return FALSE;
}
@@ -2489,7 +2743,7 @@ nm_device_activate_schedule_stage1_device_prepare (NMDevice *self)
activation_source_schedule (self, nm_device_activate_stage1_device_prepare, 0);
- _LOGI (LOGD_DEVICE, "Activation: Stage 1 of 5 (Device Prepare) scheduled...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 1 of 5 (Device Prepare) scheduled...");
}
static NMActStageReturn
@@ -2520,7 +2774,7 @@ nm_device_activate_stage2_device_config (gpointer user_data)
/* Clear the activation source ID now that this stage has run */
activation_source_clear (self, FALSE, 0);
- _LOGI (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) starting...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) starting...");
nm_device_state_changed (self, NM_DEVICE_STATE_CONFIG, NM_DEVICE_STATE_REASON_NONE);
/* Assumed connections were already set up outside NetworkManager */
@@ -2555,12 +2809,12 @@ nm_device_activate_stage2_device_config (gpointer user_data)
nm_device_queue_recheck_assume (info->slave);
}
- _LOGI (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) successful.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) successful.");
nm_device_activate_schedule_stage3_ip_config_start (self);
out:
- _LOGI (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) complete.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) complete.");
return FALSE;
}
@@ -2583,7 +2837,7 @@ nm_device_activate_schedule_stage2_device_config (NMDevice *self)
activation_source_schedule (self, nm_device_activate_stage2_device_config, 0);
- _LOGI (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) scheduled...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 2 of 5 (Device Configure) scheduled...");
}
/*********************************************/
@@ -2759,23 +3013,6 @@ aipd_timeout_cb (gpointer user_data)
return FALSE;
}
-static void
-aipd_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point.
- * Give child it's own program group for signal
- * separation.
- */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for avahi-autoipd here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
/* default to installed helper, but can be modified for testing */
const char *nm_device_autoipd_helper_path = LIBEXECDIR "/nm-avahi-autoipd.action";
@@ -2815,7 +3052,7 @@ aipd_start (NMDevice *self, NMDeviceStateReason *reason)
g_free (cmdline);
if (!g_spawn_async ("/", (char **) argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
- &aipd_child_setup, NULL, &(priv->aipd_pid), &error)) {
+ nm_utils_setpgid, NULL, &(priv->aipd_pid), &error)) {
_LOGW (LOGD_DEVICE | LOGD_AUTOIP4,
"Activation: Stage 3 of 5 (IP Configure Start) failed"
" to start avahi-autoipd: %s",
@@ -2825,7 +3062,7 @@ aipd_start (NMDevice *self, NMDeviceStateReason *reason)
return NM_ACT_STAGE_RETURN_FAILURE;
}
- _LOGI (LOGD_DEVICE | LOGD_AUTOIP4,
+ _LOGD (LOGD_DEVICE | LOGD_AUTOIP4,
"Activation: Stage 3 of 5 (IP Configure Start) started"
" avahi-autoipd...");
@@ -2848,9 +3085,9 @@ _device_get_default_route_from_platform (NMDevice *self, int addr_family, NMPlat
GArray *routes;
if (addr_family == AF_INET)
- routes = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT);
+ routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT);
else
- routes = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT);
+ routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT);
if (routes) {
guint route_metric = G_MAXUINT32, m;
@@ -2885,10 +3122,62 @@ _device_get_default_route_from_platform (NMDevice *self, int addr_family, NMPlat
}
/*********************************************/
+
+static void
+ensure_con_ip4_config (NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NMConnection *connection;
+
+ if (priv->con_ip4_config)
+ return;
+
+ connection = nm_device_get_connection (self);
+ if (!connection)
+ return;
+
+ priv->con_ip4_config = nm_ip4_config_new ();
+ nm_ip4_config_merge_setting (priv->con_ip4_config,
+ nm_connection_get_setting_ip4_config (connection),
+ nm_device_get_ip4_route_metric (self));
+
+ if (nm_device_uses_assumed_connection (self)) {
+ /* For assumed connections ignore all addresses and routes. */
+ nm_ip4_config_reset_addresses (priv->con_ip4_config);
+ nm_ip4_config_reset_routes (priv->con_ip4_config);
+ }
+}
+
+static void
+ensure_con_ip6_config (NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ NMConnection *connection;
+
+ if (priv->con_ip6_config)
+ return;
+
+ connection = nm_device_get_connection (self);
+ if (!connection)
+ return;
+
+ priv->con_ip6_config = nm_ip6_config_new ();
+ nm_ip6_config_merge_setting (priv->con_ip6_config,
+ nm_connection_get_setting_ip6_config (connection),
+ nm_device_get_ip6_route_metric (self));
+
+ if (nm_device_uses_assumed_connection (self)) {
+ /* For assumed connections ignore all addresses and routes. */
+ nm_ip6_config_reset_addresses (priv->con_ip6_config);
+ nm_ip6_config_reset_routes (priv->con_ip6_config);
+ }
+}
+
+/*********************************************/
/* DHCPv4 stuff */
static void
-dhcp4_cleanup (NMDevice *self, gboolean stop, gboolean release)
+dhcp4_cleanup (NMDevice *self, CleanupType cleanup_type, gboolean release)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -2901,7 +3190,8 @@ dhcp4_cleanup (NMDevice *self, gboolean stop, gboolean release)
nm_device_remove_pending_action (self, PENDING_ACTION_DHCP4, FALSE);
- if (stop)
+ if ( cleanup_type == CLEANUP_TYPE_DECONFIGURE
+ || cleanup_type == CLEANUP_TYPE_REMOVED)
nm_dhcp_client_stop (priv->dhcp4_client, release);
g_clear_object (&priv->dhcp4_client);
@@ -2923,7 +3213,11 @@ ip4_config_merge_and_apply (NMDevice *self,
NMConnection *connection;
gboolean success;
NMIP4Config *composite;
+ gboolean has_direct_route;
const guint32 default_route_metric = nm_device_get_ip4_route_metric (self);
+ guint32 gateway;
+ gboolean connection_has_default_route, connection_is_never_default;
+ gboolean routes_full_sync;
/* Merge all the configs into the composite config */
if (config) {
@@ -2932,6 +3226,10 @@ ip4_config_merge_and_apply (NMDevice *self,
}
composite = nm_ip4_config_new ();
+
+ if (commit)
+ ensure_con_ip4_config (self);
+
if (priv->dev_ip4_config)
nm_ip4_config_merge (composite, priv->dev_ip4_config);
if (priv->vpn4_config)
@@ -2945,73 +3243,120 @@ ip4_config_merge_and_apply (NMDevice *self,
if (priv->wwan_ip4_config)
nm_ip4_config_merge (composite, priv->wwan_ip4_config);
- /* Merge user overrides into the composite config. Generated+assumed
- * connections come from the system not the user and merging them would
- * be redundant, so don't bother.
- */
+ /* Apply ignore-auto-routes and ignore-auto-dns settings */
connection = nm_device_get_connection (self);
+ if (connection) {
+ NMSettingIPConfig *s_ip4 = nm_connection_get_setting_ip4_config (connection);
+
+ if (s_ip4) {
+ if (nm_setting_ip_config_get_ignore_auto_routes (s_ip4))
+ nm_ip4_config_reset_routes (composite);
+ if (nm_setting_ip_config_get_ignore_auto_dns (s_ip4)) {
+ nm_ip4_config_reset_nameservers (composite);
+ nm_ip4_config_reset_domains (composite);
+ nm_ip4_config_reset_searches (composite);
+ }
+ }
+ }
+
+ /* Merge user overrides into the composite config. For assumed connections,
+ * con_ip4_config is empty. */
+ if (priv->con_ip4_config)
+ nm_ip4_config_merge (composite, priv->con_ip4_config);
+
+
+ /* Add the default route.
+ *
+ * We keep track of the default route of a device in a private field.
+ * NMDevice needs to know the default route at this point, because the gateway
+ * might require a direct route (see below).
+ *
+ * But also, we don't want to add the default route to priv->ip4_config,
+ * because the default route from the setting might not be the same that
+ * NMDefaultRouteManager eventually configures (because the it might
+ * tweak the effective metric).
+ */
+
+ /* unless we come to a different conclusion below, we have no default route and
+ * the route is assumed. */
priv->default_route.v4_has = FALSE;
priv->default_route.v4_is_assumed = TRUE;
- if (connection) {
- gboolean assumed = nm_device_uses_assumed_connection (self);
- NMPlatformIP4Route *route = &priv->default_route.v4;
- if (!nm_settings_connection_get_nm_generated_assumed (NM_SETTINGS_CONNECTION (connection))) {
- nm_ip4_config_merge_setting (composite,
- nm_connection_get_setting_ip4_config (connection),
- default_route_metric);
- }
+ routes_full_sync = commit
+ && priv->default_route.v4_configure_first_time
+ && !nm_device_uses_assumed_connection (self);
- /* Add the default route.
- *
- * We keep track of the default route of a device in a private field.
- * NMDevice needs to know the default route at this point, because the gateway
- * might require a direct route (see below).
- *
- * But also, we don't want to add the default route to priv->ip4_config,
- * because the default route from the setting might not be the same that
- * NMDefaultRouteManager eventually configures (because the it might
- * tweak the effective metric).
+ if (!commit) {
+ /* during a non-commit event, we always pickup whatever is configured. */
+ goto END_ADD_DEFAULT_ROUTE;
+ }
+
+ connection_has_default_route
+ = nm_default_route_manager_ip4_connection_has_default_route (nm_default_route_manager_get (),
+ connection, &connection_is_never_default);
+
+ if ( !priv->default_route.v4_configure_first_time
+ && !nm_device_uses_assumed_connection (self)
+ && connection_is_never_default) {
+ /* If the connection is explicitly configured as never-default, we enforce the (absense of the)
+ * default-route only once. That allows the user to configure a connection as never-default,
+ * but he can add default routes externally (via a dispatcher script) and NM will not interfere. */
+ goto END_ADD_DEFAULT_ROUTE;
+ }
+
+ /* At this point, we treat assumed and non-assumed connections alike.
+ * For assumed connections we do that because we still manage RA and DHCP
+ * leases for them, so we must extend/update the default route on commits.
+ */
+
+ /* we are about to commit (for a non-assumed connection). Enforce whatever we have
+ * configured. */
+ priv->default_route.v4_configure_first_time = FALSE;
+ priv->default_route.v4_is_assumed = FALSE;
+
+ if (!connection_has_default_route)
+ goto END_ADD_DEFAULT_ROUTE;
+
+ if (!nm_ip4_config_get_num_addresses (composite)) {
+ /* without addresses we can have no default route. */
+ goto END_ADD_DEFAULT_ROUTE;
+ }
+
+ gateway = nm_ip4_config_get_gateway (composite);
+ if ( !gateway
+ && nm_device_get_device_type (self) != NM_DEVICE_TYPE_MODEM)
+ goto END_ADD_DEFAULT_ROUTE;
+
+ has_direct_route = ( gateway == 0
+ || nm_ip4_config_get_subnet_for_host (composite, gateway)
+ || nm_ip4_config_get_direct_route_for_host (composite, gateway));
+
+ priv->default_route.v4_has = TRUE;
+ memset (&priv->default_route.v4, 0, sizeof (priv->default_route.v4));
+ priv->default_route.v4.source = NM_IP_CONFIG_SOURCE_USER;
+ priv->default_route.v4.gateway = gateway;
+ priv->default_route.v4.metric = default_route_metric;
+ priv->default_route.v4.mss = nm_ip4_config_get_mss (composite);
+
+ if (!has_direct_route) {
+ NMPlatformIP4Route r = priv->default_route.v4;
+
+ /* add a direct route to the gateway */
+ r.network = gateway;
+ r.plen = 32;
+ r.gateway = 0;
+ nm_ip4_config_add_route (composite, &r);
+ }
+
+END_ADD_DEFAULT_ROUTE:
+
+ if (priv->default_route.v4_is_assumed) {
+ /* If above does not explicitly assign a default route, we always pick up the
+ * default route based on what is currently configured.
+ * That means that even managed connections with never-default, can
+ * get a default route (if configured externally).
*/
- if ( !assumed
- && nm_default_route_manager_ip4_connection_has_default_route (nm_default_route_manager_get (), connection)) {
- guint32 gateway = 0;
-
- priv->default_route.v4_is_assumed = FALSE;
- if ( (!commit && priv->ext_ip4_config_had_any_addresses)
- || ( commit && nm_ip4_config_get_num_addresses (composite))) {
- /* For managed interfaces, we can only configure a gateway, if either the external config indicates
- * that we already have addresses, or if we are about to commit any addresses.
- * Otherwise adding a default route will fail, because NMDefaultRouteManager does not add any
- * addresses for the route. */
- gateway = nm_ip4_config_get_gateway (composite);
- if ( gateway
- || nm_device_get_device_type (self) == NM_DEVICE_TYPE_MODEM) {
- memset (route, 0, sizeof (*route));
- route->source = NM_IP_CONFIG_SOURCE_USER;
- route->gateway = gateway;
- route->metric = default_route_metric;
- route->mss = nm_ip4_config_get_mss (composite);
- priv->default_route.v4_has = TRUE;
-
- if ( gateway
- && !nm_ip4_config_get_subnet_for_host (composite, gateway)
- && !nm_ip4_config_get_direct_route_for_host (composite, gateway)) {
- /* add a direct route to the gateway */
- NMPlatformIP4Route r = *route;
-
- r.network = gateway;
- r.plen = 32;
- r.gateway = 0;
- nm_ip4_config_add_route (composite, &r);
- }
- }
- }
- } else {
- /* For interfaces that are assumed and that have no default-route by configuration, we assume
- * the default connection and pick up whatever is configured. */
- priv->default_route.v4_has = _device_get_default_route_from_platform (self, AF_INET, (NMPlatformIPRoute *) route);
- }
+ priv->default_route.v4_has = _device_get_default_route_from_platform (self, AF_INET, (NMPlatformIPRoute *) &priv->default_route.v4);
}
/* Allow setting MTU etc */
@@ -3020,7 +3365,7 @@ ip4_config_merge_and_apply (NMDevice *self,
NM_DEVICE_GET_CLASS (self)->ip4_config_pre_commit (self, composite);
}
- success = nm_device_set_ip4_config (self, composite, default_route_metric, commit, out_reason);
+ success = nm_device_set_ip4_config (self, composite, default_route_metric, commit, routes_full_sync, out_reason);
g_object_unref (composite);
return success;
}
@@ -3051,7 +3396,7 @@ dhcp4_fail (NMDevice *self, gboolean timeout)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- dhcp4_cleanup (self, TRUE, FALSE);
+ dhcp4_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
if (timeout || (priv->ip4_state == IP_CONF))
nm_device_activate_schedule_ip4_config_timeout (self);
else if (priv->ip4_state == IP_DONE)
@@ -3143,7 +3488,7 @@ dhcp4_start (NMDevice *self,
g_object_unref (priv->dhcp4_config);
priv->dhcp4_config = nm_dhcp4_config_new ();
- hw_addr = nm_platform_link_get_address (nm_device_get_ip_ifindex (self), &hw_addr_len);
+ hw_addr = nm_platform_link_get_address (NM_PLATFORM_GET, nm_device_get_ip_ifindex (self), &hw_addr_len);
if (hw_addr_len) {
tmp = g_byte_array_sized_new (hw_addr_len);
g_byte_array_append (tmp, hw_addr, hw_addr_len);
@@ -3196,7 +3541,7 @@ nm_device_dhcp4_renew (NMDevice *self, gboolean release)
_LOGI (LOGD_DHCP4, "DHCPv4 lease renewal requested");
/* Terminate old DHCP instance and release the old lease */
- dhcp4_cleanup (self, TRUE, release);
+ dhcp4_cleanup (self, CLEANUP_TYPE_DECONFIGURE, release);
connection = nm_device_get_connection (self);
g_assert (connection);
@@ -3451,7 +3796,7 @@ act_stage3_ip4_config_start (NMDevice *self,
/* DHCPv6 stuff */
static void
-dhcp6_cleanup (NMDevice *self, gboolean stop, gboolean release)
+dhcp6_cleanup (NMDevice *self, CleanupType cleanup_type, gboolean release)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -3464,7 +3809,8 @@ dhcp6_cleanup (NMDevice *self, gboolean stop, gboolean release)
priv->dhcp6_state_sigid = 0;
}
- if (stop)
+ if ( cleanup_type == CLEANUP_TYPE_DECONFIGURE
+ || cleanup_type == CLEANUP_TYPE_REMOVED)
nm_dhcp_client_stop (priv->dhcp6_client, release);
g_clear_object (&priv->dhcp6_client);
@@ -3487,10 +3833,16 @@ ip6_config_merge_and_apply (NMDevice *self,
NMConnection *connection;
gboolean success;
NMIP6Config *composite;
+ gboolean has_direct_route;
+ const struct in6_addr *gateway;
+ gboolean connection_has_default_route, connection_is_never_default;
+ gboolean routes_full_sync;
/* If no config was passed in, create a new one */
composite = nm_ip6_config_new ();
- g_assert (composite);
+
+ if (commit)
+ ensure_con_ip6_config (self);
/* Merge all the IP configs into the composite config */
if (priv->ac_ip6_config)
@@ -3508,72 +3860,119 @@ ip6_config_merge_and_apply (NMDevice *self,
if (priv->wwan_ip6_config)
nm_ip6_config_merge (composite, priv->wwan_ip6_config);
- /* Merge user overrides into the composite config. Generated+assumed
- * connections come from the system not the user and merging them would
- * be redundant, so don't bother.
- */
+ /* Apply ignore-auto-routes and ignore-auto-dns settings */
connection = nm_device_get_connection (self);
- priv->default_route.v6_has = FALSE;
- priv->default_route.v6_is_assumed = TRUE;
if (connection) {
- gboolean assumed = nm_device_uses_assumed_connection (self);
- NMPlatformIP6Route *route = &priv->default_route.v6;
+ NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config (connection);
- if (!nm_settings_connection_get_nm_generated_assumed (NM_SETTINGS_CONNECTION (connection))) {
- nm_ip6_config_merge_setting (composite,
- nm_connection_get_setting_ip6_config (connection),
- nm_device_get_ip6_route_metric (self));
+ if (s_ip6) {
+ if (nm_setting_ip_config_get_ignore_auto_routes (s_ip6))
+ nm_ip6_config_reset_routes (composite);
+ if (nm_setting_ip_config_get_ignore_auto_dns (s_ip6)) {
+ nm_ip6_config_reset_nameservers (composite);
+ nm_ip6_config_reset_domains (composite);
+ nm_ip6_config_reset_searches (composite);
+ }
}
+ }
- /* Add the default route.
- *
- * We keep track of the default route of a device in a private field.
- * NMDevice needs to know the default route at this point, because the gateway
- * might require a direct route (see below).
- *
- * But also, we don't want to add the default route to priv->ip4_config,
- * because the default route from the setting might not be the same that
- * NMDefaultRouteManager eventually configures (because the it might
- * tweak the effective metric).
+ /* Merge user overrides into the composite config. For assumed connections,
+ * con_ip6_config is empty. */
+ if (priv->con_ip6_config)
+ nm_ip6_config_merge (composite, priv->con_ip6_config);
+
+ /* Add the default route.
+ *
+ * We keep track of the default route of a device in a private field.
+ * NMDevice needs to know the default route at this point, because the gateway
+ * might require a direct route (see below).
+ *
+ * But also, we don't want to add the default route to priv->ip6_config,
+ * because the default route from the setting might not be the same that
+ * NMDefaultRouteManager eventually configures (because the it might
+ * tweak the effective metric).
+ */
+
+ /* unless we come to a different conclusion below, we have no default route and
+ * the route is assumed. */
+ priv->default_route.v6_has = FALSE;
+ priv->default_route.v6_is_assumed = TRUE;
+
+ routes_full_sync = commit
+ && priv->default_route.v6_configure_first_time
+ && !nm_device_uses_assumed_connection (self);
+
+ if (!commit) {
+ /* during a non-commit event, we always pickup whatever is configured. */
+ goto END_ADD_DEFAULT_ROUTE;
+ }
+
+ connection_has_default_route
+ = nm_default_route_manager_ip6_connection_has_default_route (nm_default_route_manager_get (),
+ connection, &connection_is_never_default);
+
+ if ( !priv->default_route.v6_configure_first_time
+ && !nm_device_uses_assumed_connection (self)
+ && connection_is_never_default) {
+ /* If the connection is explicitly configured as never-default, we enforce the (absence of the)
+ * default-route only once. That allows the user to configure a connection as never-default,
+ * but he can add default routes externally (via a dispatcher script) and NM will not interfere. */
+ goto END_ADD_DEFAULT_ROUTE;
+ }
+
+ /* At this point, we treat assumed and non-assumed connections alike.
+ * For assumed connections we do that because we still manage RA and DHCP
+ * leases for them, so we must extend/update the default route on commits.
+ */
+
+ /* we are about to commit (for a non-assumed connection). Enforce whatever we have
+ * configured. */
+ priv->default_route.v6_configure_first_time = FALSE;
+ priv->default_route.v6_is_assumed = FALSE;
+
+ if (!connection_has_default_route)
+ goto END_ADD_DEFAULT_ROUTE;
+
+ if (!nm_ip6_config_get_num_addresses (composite)) {
+ /* without addresses we can have no default route. */
+ goto END_ADD_DEFAULT_ROUTE;
+ }
+
+ gateway = nm_ip6_config_get_gateway (composite);
+ if (!gateway)
+ goto END_ADD_DEFAULT_ROUTE;
+
+
+ has_direct_route = nm_ip6_config_get_direct_route_for_host (composite, gateway) != NULL;
+
+
+
+ priv->default_route.v6_has = TRUE;
+ memset (&priv->default_route.v6, 0, sizeof (priv->default_route.v6));
+ priv->default_route.v6.source = NM_IP_CONFIG_SOURCE_USER;
+ priv->default_route.v6.gateway = *gateway;
+ priv->default_route.v6.metric = nm_device_get_ip6_route_metric (self);
+ priv->default_route.v6.mss = nm_ip6_config_get_mss (composite);
+
+ if (!has_direct_route) {
+ NMPlatformIP6Route r = priv->default_route.v6;
+
+ /* add a direct route to the gateway */
+ r.network = *gateway;
+ r.plen = 128;
+ r.gateway = in6addr_any;
+ nm_ip6_config_add_route (composite, &r);
+ }
+
+END_ADD_DEFAULT_ROUTE:
+
+ if (priv->default_route.v6_is_assumed) {
+ /* If above does not explicitly assign a default route, we always pick up the
+ * default route based on what is currently configured.
+ * That means that even managed connections with never-default, can
+ * get a default route (if configured externally).
*/
- if ( !assumed
- && nm_default_route_manager_ip6_connection_has_default_route (nm_default_route_manager_get (), connection)) {
- const struct in6_addr *gateway = NULL;
-
- priv->default_route.v6_is_assumed = FALSE;
- if ( (!commit && priv->ext_ip6_config_had_any_addresses)
- || ( commit && nm_ip6_config_get_num_addresses (composite))) {
- /* For managed interfaces, we can only configure a gateway, if either the external config indicates
- * that we already have addresses, or if we are about to commit any addresses.
- * Otherwise adding a default route will fail, because NMDefaultRouteManager does not add any
- * addresses for the route. */
- gateway = nm_ip6_config_get_gateway (composite);
- if (gateway) {
- memset (route, 0, sizeof (*route));
- route->source = NM_IP_CONFIG_SOURCE_USER;
- route->gateway = *gateway;
- route->metric = nm_device_get_ip6_route_metric (self);
- route->mss = nm_ip6_config_get_mss (composite);
- priv->default_route.v6_has = TRUE;
-
- if ( gateway
- && !nm_ip6_config_get_subnet_for_host (composite, gateway)
- && !nm_ip6_config_get_direct_route_for_host (composite, gateway)) {
- /* add a direct route to the gateway */
- NMPlatformIP6Route r = *route;
-
- r.network = *gateway;
- r.plen = 128;
- r.gateway = in6addr_any;
- nm_ip6_config_add_route (composite, &r);
- }
- }
- }
- } else {
- /* For interfaces that are assumed and that have no default-route by configuration, we assume
- * the default connection and pick up whatever is configured. */
- priv->default_route.v6_has = _device_get_default_route_from_platform (self, AF_INET6, (NMPlatformIPRoute *) route);
- }
+ priv->default_route.v6_has = _device_get_default_route_from_platform (self, AF_INET6, (NMPlatformIPRoute *) &priv->default_route.v6);
}
nm_ip6_config_addresses_sort (composite,
@@ -3585,7 +3984,7 @@ ip6_config_merge_and_apply (NMDevice *self,
NM_DEVICE_GET_CLASS (self)->ip6_config_pre_commit (self, composite);
}
- success = nm_device_set_ip6_config (self, composite, commit, out_reason);
+ success = nm_device_set_ip6_config (self, composite, commit, routes_full_sync, out_reason);
g_object_unref (composite);
return success;
}
@@ -3623,7 +4022,7 @@ dhcp6_fail (NMDevice *self, gboolean timeout)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- dhcp6_cleanup (self, TRUE, FALSE);
+ dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
if (priv->dhcp6_mode == NM_RDISC_DHCP_LEVEL_MANAGED) {
if (timeout || (priv->ip6_state == IP_CONF))
@@ -3648,7 +4047,7 @@ dhcp6_timeout (NMDevice *self, NMDhcpClient *client)
dhcp6_fail (self, TRUE);
else {
/* not a hard failure; just live with the RA info */
- dhcp6_cleanup (self, TRUE, FALSE);
+ dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, FALSE);
if (priv->ip6_state == IP_CONF)
nm_device_activate_schedule_ip6_config_result (self);
}
@@ -3740,7 +4139,7 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
s_ip6 = nm_connection_get_setting_ip6_config (connection);
g_assert (s_ip6);
- hw_addr = nm_platform_link_get_address (nm_device_get_ip_ifindex (self), &hw_addr_len);
+ hw_addr = nm_platform_link_get_address (NM_PLATFORM_GET, nm_device_get_ip_ifindex (self), &hw_addr_len);
if (hw_addr_len) {
tmp = g_byte_array_sized_new (hw_addr_len);
g_byte_array_append (tmp, hw_addr, hw_addr_len);
@@ -3823,7 +4222,7 @@ nm_device_dhcp6_renew (NMDevice *self, gboolean release)
_LOGI (LOGD_DHCP6, "DHCPv6 lease renewal requested");
/* Terminate old DHCP instance and release the old lease */
- dhcp6_cleanup (self, TRUE, release);
+ dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, release);
/* Start DHCP again on the interface */
return dhcp6_start (self, FALSE, NULL);
@@ -3945,7 +4344,8 @@ check_and_add_ipv6ll_addr (NMDevice *self)
lladdr.s6_addr16[0] = htons (0xfe80);
nm_utils_ipv6_addr_set_interface_identfier (&lladdr, iid);
_LOGD (LOGD_IP6, "adding IPv6LL address %s", nm_utils_inet6_ntop (&lladdr, NULL));
- if (!nm_platform_ip6_address_add (ip_ifindex,
+ if (!nm_platform_ip6_address_add (NM_PLATFORM_GET,
+ ip_ifindex,
lladdr,
in6addr_any,
64,
@@ -3995,7 +4395,7 @@ print_support_extended_ifa_flags (NMSettingIP6ConfigPrivacy use_tempaddr)
if (s_libnl == -1) {
s_libnl = !!nm_platform_check_support_libnl_extended_ifa_flags ();
- s_kernel = !!nm_platform_check_support_kernel_extended_ifa_flags ();
+ s_kernel = !!nm_platform_check_support_kernel_extended_ifa_flags (NM_PLATFORM_GET);
if (s_libnl && s_kernel) {
nm_log_dbg (LOGD_IP6, "kernel and libnl support extended IFA_FLAGS (needed by NM for IPv6 private addresses)");
@@ -4031,6 +4431,58 @@ print_support_extended_ifa_flags (NMSettingIP6ConfigPrivacy use_tempaddr)
warn = 2;
}
+static void nm_device_ipv6_set_mtu (NMDevice *self, guint32 mtu);
+
+static void
+nm_device_set_mtu (NMDevice *self, guint32 mtu)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ int ifindex = nm_device_get_ifindex (self);
+
+ if (mtu)
+ priv->mtu = mtu;
+
+ /* Ensure the IPv6 MTU is still alright. */
+ if (priv->ip6_mtu)
+ nm_device_ipv6_set_mtu (self, priv->ip6_mtu);
+
+ if (priv->mtu != nm_platform_link_get_mtu (NM_PLATFORM_GET, ifindex))
+ nm_platform_link_set_mtu (NM_PLATFORM_GET, ifindex, priv->mtu);
+}
+
+static void
+nm_device_ipv6_set_mtu (NMDevice *self, guint32 mtu)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ guint32 plat_mtu = nm_device_ipv6_sysctl_get_int32 (self, "mtu", priv->mtu);
+ char val[16];
+
+ priv->ip6_mtu = mtu ?: plat_mtu;
+
+ if (priv->ip6_mtu && priv->mtu < priv->ip6_mtu) {
+ _LOGW (LOGD_DEVICE | LOGD_IP6, "Lowering IPv6 MTU (%d) to match device MTU (%d)",
+ priv->ip6_mtu, priv->mtu);
+ priv->ip6_mtu = priv->mtu;
+ }
+
+ if (priv->ip6_mtu < 1280) {
+ _LOGW (LOGD_DEVICE | LOGD_IP6, "IPv6 MTU (%d) smaller than 1280, adjusting",
+ priv->ip6_mtu);
+ priv->ip6_mtu = 1280;
+ }
+
+ if (priv->mtu < priv->ip6_mtu) {
+ _LOGW (LOGD_DEVICE | LOGD_IP6, "Raising device MTU (%d) to match IPv6 MTU (%d)",
+ priv->mtu, priv->ip6_mtu);
+ nm_device_set_mtu (self, priv->ip6_mtu);
+ }
+
+ if (priv->ip6_mtu != plat_mtu) {
+ g_snprintf (val, sizeof (val), "%d", mtu);
+ nm_device_ipv6_sysctl_set (self, "mtu", val);
+ }
+}
+
static void
rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, NMDevice *self)
{
@@ -4048,7 +4500,7 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, NMDevice *self)
* from adding a prefix route for this address.
**/
system_support = nm_platform_check_support_libnl_extended_ifa_flags () &&
- nm_platform_check_support_kernel_extended_ifa_flags ();
+ nm_platform_check_support_kernel_extended_ifa_flags (NM_PLATFORM_GET);
}
if (system_support)
@@ -4151,13 +4603,13 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, NMDevice *self)
}
if (changed & NM_RDISC_CONFIG_DHCP_LEVEL) {
- dhcp6_cleanup (self, TRUE, TRUE);
+ dhcp6_cleanup (self, CLEANUP_TYPE_DECONFIGURE, TRUE);
priv->dhcp6_mode = rdisc->dhcp_level;
if (priv->dhcp6_mode != NM_RDISC_DHCP_LEVEL_NONE) {
NMDeviceStateReason reason;
- _LOGI (LOGD_DEVICE | LOGD_DHCP6,
+ _LOGD (LOGD_DEVICE | LOGD_DHCP6,
"Activation: Stage 3 of 5 (IP Configure Start) starting DHCPv6"
" as requested by IPv6 router...");
if (!dhcp6_start (self, FALSE, &reason)) {
@@ -4169,14 +4621,10 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, NMDevice *self)
}
if (changed & NM_RDISC_CONFIG_HOP_LIMIT)
- nm_platform_sysctl_set_ip6_hop_limit_safe (nm_device_get_ip_iface (self), rdisc->hop_limit);
-
- if (changed & NM_RDISC_CONFIG_MTU) {
- char val[16];
+ nm_platform_sysctl_set_ip6_hop_limit_safe (NM_PLATFORM_GET, nm_device_get_ip_iface (self), rdisc->hop_limit);
- g_snprintf (val, sizeof (val), "%d", rdisc->mtu);
- nm_device_ipv6_sysctl_set (self, "mtu", val);
- }
+ if (changed & NM_RDISC_CONFIG_MTU)
+ priv->ip6_mtu = rdisc->mtu;
nm_device_activate_schedule_ip6_config_result (self);
}
@@ -4213,11 +4661,12 @@ addrconf6_start_with_link_ready (NMDevice *self)
g_assert (priv->rdisc);
- if (!nm_device_get_ip_iface_identifier (self, &iid)) {
+ if (nm_platform_link_get_ipv6_token (NM_PLATFORM_GET, priv->ifindex, &iid)) {
+ _LOGD (LOGD_DEVICE, "IPv6 tokenized identifier present on device %s", priv->iface);
+ } else if (!nm_device_get_ip_iface_identifier (self, &iid)) {
_LOGW (LOGD_IP6, "failed to get interface identifier; IPv6 cannot continue");
return FALSE;
}
- nm_rdisc_set_iid (priv->rdisc, iid);
/* Apply any manual configuration before starting RA */
if (!ip6_config_merge_and_apply (self, TRUE, NULL))
@@ -4236,6 +4685,8 @@ addrconf6_start_with_link_ready (NMDevice *self)
NM_RDISC_RA_TIMEOUT,
G_CALLBACK (rdisc_ra_timeout),
self);
+
+ nm_rdisc_set_iid (priv->rdisc, iid);
nm_rdisc_start (priv->rdisc);
return TRUE;
}
@@ -4325,7 +4776,7 @@ save_ip6_properties (NMDevice *self)
g_hash_table_remove_all (priv->ip6_saved_properties);
for (i = 0; i < G_N_ELEMENTS (ip6_properties_to_save); i++) {
- value = nm_platform_sysctl_get (nm_utils_ip6_property_path (ifname, ip6_properties_to_save[i]));
+ value = nm_platform_sysctl_get (NM_PLATFORM_GET, nm_utils_ip6_property_path (ifname, ip6_properties_to_save[i]));
if (value) {
g_hash_table_insert (priv->ip6_saved_properties,
(char *) ip6_properties_to_save[i],
@@ -4363,10 +4814,9 @@ set_nm_ipv6ll (NMDevice *self, gboolean enable)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
int ifindex = nm_device_get_ip_ifindex (self);
- const char *iface = nm_device_get_ip_iface (self);
char *value;
- if (!nm_platform_check_support_user_ipv6ll ())
+ if (!nm_platform_check_support_user_ipv6ll (NM_PLATFORM_GET))
return;
priv->nm_ipv6ll = enable;
@@ -4374,13 +4824,13 @@ set_nm_ipv6ll (NMDevice *self, gboolean enable)
const char *detail = enable ? "enable" : "disable";
_LOGD (LOGD_IP6, "will %s userland IPv6LL", detail);
- if ( !nm_platform_link_set_user_ipv6ll_enabled (ifindex, enable)
- && nm_platform_get_error () != NM_PLATFORM_ERROR_NOT_FOUND)
+ if (!nm_platform_link_set_user_ipv6ll_enabled (NM_PLATFORM_GET, ifindex, enable))
_LOGW (LOGD_IP6, "failed to %s userspace IPv6LL address handling", detail);
if (enable) {
/* Bounce IPv6 to ensure the kernel stops IPv6LL address generation */
- value = nm_platform_sysctl_get (nm_utils_ip6_property_path (iface, "disable_ipv6"));
+ value = nm_platform_sysctl_get (NM_PLATFORM_GET,
+ nm_utils_ip6_property_path (nm_device_get_ip_iface (self), "disable_ipv6"));
if (g_strcmp0 (value, "0") == 0)
nm_device_ipv6_sysctl_set (self, "disable_ipv6", "1");
g_free (value);
@@ -4392,8 +4842,10 @@ set_nm_ipv6ll (NMDevice *self, gboolean enable)
}
}
+/************************************************************************/
+
static NMSettingIP6ConfigPrivacy
-use_tempaddr_clamp (NMSettingIP6ConfigPrivacy use_tempaddr)
+_ip6_privacy_clamp (NMSettingIP6ConfigPrivacy use_tempaddr)
{
switch (use_tempaddr) {
case NM_SETTING_IP6_CONFIG_PRIVACY_DISABLED:
@@ -4405,45 +4857,51 @@ use_tempaddr_clamp (NMSettingIP6ConfigPrivacy use_tempaddr)
}
}
-/* Get net.ipv6.conf.default.use_tempaddr value from /etc/sysctl.conf or
- * /lib/sysctl.d/sysctl.conf
- */
static NMSettingIP6ConfigPrivacy
-ip6_use_tempaddr (void)
+_ip6_privacy_get (NMDevice *self)
{
- char *contents = NULL;
- const char *group_name = "[forged_group]\n";
- char *sysctl_data = NULL;
- GKeyFile *keyfile;
- GError *error = NULL;
- gint tmp;
- NMSettingIP6ConfigPrivacy ret = NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN;
+ NMSettingIP6ConfigPrivacy ip6_privacy;
+ gs_free char *value = NULL;
+ NMConnection *connection;
- /* Read file contents to a string. */
- if (!g_file_get_contents ("/etc/sysctl.conf", &contents, NULL, NULL))
- if (!g_file_get_contents ("/lib/sysctl.d/sysctl.conf", &contents, NULL, NULL))
- return NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN;
+ g_return_val_if_fail (self, NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
- /* Prepend a group so that we can use GKeyFile parser. */
- sysctl_data = g_strdup_printf ("%s%s", group_name, contents);
+ /* 1.) First look at the per-connection setting. If it is not -1 (unknown),
+ * use it. */
+ connection = nm_device_get_connection (self);
+ if (connection) {
+ NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config (connection);
- keyfile = g_key_file_new ();
- if (!g_key_file_load_from_data (keyfile, sysctl_data, -1, G_KEY_FILE_NONE, NULL))
- goto done;
+ if (s_ip6) {
+ ip6_privacy = nm_setting_ip6_config_get_ip6_privacy (NM_SETTING_IP6_CONFIG (s_ip6));
+ ip6_privacy = _ip6_privacy_clamp (ip6_privacy);
+ if (ip6_privacy != NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN)
+ return ip6_privacy;
+ }
+ }
- tmp = g_key_file_get_integer (keyfile, "forged_group", "net.ipv6.conf.default.use_tempaddr", &error);
- if (error == NULL)
- ret = use_tempaddr_clamp (tmp);
+ value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+ "ipv6.ip6-privacy", self);
-done:
- g_free (contents);
- g_free (sysctl_data);
- g_clear_error (&error);
- g_key_file_free (keyfile);
+ /* 2.) use the default value from the configuration. */
+ ip6_privacy = _nm_utils_ascii_str_to_int64 (value, 10,
+ NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN,
+ NM_SETTING_IP6_CONFIG_PRIVACY_PREFER_TEMP_ADDR,
+ NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
+ if (ip6_privacy != NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN)
+ return ip6_privacy;
- return ret;
+ /* 3.) No valid default-value configured. Fallback to reading sysctl.
+ *
+ * Instead of reading static config files in /etc, just read the current sysctl value.
+ * This works as NM only writes to "/proc/sys/net/ipv6/conf/IFNAME/use_tempaddr", but leaves
+ * the "default" entry untouched. */
+ ip6_privacy = nm_platform_sysctl_get_int32 (NM_PLATFORM_GET, "/proc/sys/net/ipv6/conf/default/use_tempaddr", NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
+ return _ip6_privacy_clamp (ip6_privacy);
}
+/****************************************************************/
+
static gboolean
ip6_requires_slaves (NMConnection *connection)
{
@@ -4525,6 +4983,13 @@ act_stage3_ip6_config_start (NMDevice *self,
return NM_ACT_STAGE_RETURN_STOP;
}
+ /* Ensure the MTU makes sense. If it was below 1280 the kernel would not
+ * expose any ipv6 sysctls or allow presence of any addresses on the interface,
+ * including LL, which * would make it impossible to autoconfigure MTU to a
+ * correct value. */
+ if (!nm_device_uses_assumed_connection (self))
+ nm_device_ipv6_set_mtu (self, priv->ip6_mtu);
+
/* Any method past this point requires an IPv6LL address. Use NM-controlled
* IPv6LL if this is not an assumed connection, since assumed connections
* will already have IPv6 set up.
@@ -4535,18 +5000,7 @@ act_stage3_ip6_config_start (NMDevice *self,
/* Re-enable IPv6 on the interface */
set_disable_ipv6 (self, "0");
- /* Enable/disable IPv6 Privacy Extensions.
- * If a global value is configured by sysadmin (e.g. /etc/sysctl.conf),
- * use that value instead of per-connection value.
- */
- ip6_privacy = ip6_use_tempaddr ();
- if (ip6_privacy == NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN) {
- NMSettingIPConfig *s_ip6 = nm_connection_get_setting_ip6_config (connection);
-
- if (s_ip6)
- ip6_privacy = nm_setting_ip6_config_get_ip6_privacy (NM_SETTING_IP6_CONFIG (s_ip6));
- }
- ip6_privacy = use_tempaddr_clamp (ip6_privacy);
+ ip6_privacy = _ip6_privacy_get (self);
if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) == 0) {
if (!addrconf6_start (self, ip6_privacy)) {
@@ -4734,11 +5188,11 @@ nm_device_activate_stage3_ip_config_start (gpointer user_data)
priv->ip4_state = priv->ip6_state = IP_WAIT;
- _LOGI (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) started...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) started...");
nm_device_state_changed (self, NM_DEVICE_STATE_IP_CONFIG, NM_DEVICE_STATE_REASON_NONE);
/* Device should be up before we can do anything with it */
- if (!nm_platform_link_is_up (nm_device_get_ip_ifindex (self)))
+ if (!nm_platform_link_is_up (NM_PLATFORM_GET, nm_device_get_ip_ifindex (self)))
_LOGW (LOGD_DEVICE, "interface %s not up for IP configuration", nm_device_get_ip_iface (self));
/* If the device is a slave, then we don't do any IP configuration but we
@@ -4772,7 +5226,7 @@ nm_device_activate_stage3_ip_config_start (gpointer user_data)
nm_device_check_ip_failed (self, TRUE);
out:
- _LOGI (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) complete.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) complete.");
return FALSE;
}
@@ -4796,7 +5250,7 @@ fw_change_zone_cb (GError *error, gpointer user_data)
}
activation_source_schedule (self, nm_device_activate_stage3_ip_config_start, 0);
- _LOGI (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) scheduled.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) scheduled.");
}
/*
@@ -4829,7 +5283,7 @@ nm_device_activate_schedule_stage3_ip_config_start (NMDevice *self)
if (nm_device_uses_assumed_connection (self)) {
_LOGD (LOGD_DEVICE, "Activation: skip setting firewall zone '%s' for assumed device", zone ? zone : "default");
activation_source_schedule (self, nm_device_activate_stage3_ip_config_start, 0);
- _LOGI (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) scheduled.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 3 of 5 (IP Configure Start) scheduled.");
return;
}
@@ -4870,8 +5324,7 @@ nm_device_activate_ip4_config_timeout (gpointer user_data)
/* Clear the activation source ID now that this stage has run */
activation_source_clear (self, FALSE, AF_INET);
- _LOGI (LOGD_DEVICE | LOGD_IP4,
- "Activation: Stage 4 of 5 (IPv4 Configure Timeout) started...");
+ _LOGD (LOGD_DEVICE | LOGD_IP4, "Activation: Stage 4 of 5 (IPv4 Configure Timeout) started...");
ret = NM_DEVICE_GET_CLASS (self)->act_stage4_ip4_config_timeout (self, &reason);
if (ret == NM_ACT_STAGE_RETURN_POSTPONE)
@@ -4887,8 +5340,7 @@ nm_device_activate_ip4_config_timeout (gpointer user_data)
nm_device_check_ip_failed (self, FALSE);
out:
- _LOGI (LOGD_DEVICE | LOGD_IP4,
- "Activation: Stage 4 of 5 (IPv4 Configure Timeout) complete.");
+ _LOGD (LOGD_DEVICE | LOGD_IP4, "Activation: Stage 4 of 5 (IPv4 Configure Timeout) complete.");
return FALSE;
}
@@ -4911,8 +5363,7 @@ nm_device_activate_schedule_ip4_config_timeout (NMDevice *self)
activation_source_schedule (self, nm_device_activate_ip4_config_timeout, AF_INET);
- _LOGI (LOGD_DEVICE | LOGD_IP4,
- "Activation: Stage 4 of 5 (IPv4 Configure Timeout) scheduled...");
+ _LOGD (LOGD_DEVICE | LOGD_IP4, "Activation: Stage 4 of 5 (IPv4 Configure Timeout) scheduled...");
}
@@ -4945,8 +5396,7 @@ nm_device_activate_ip6_config_timeout (gpointer user_data)
/* Clear the activation source ID now that this stage has run */
activation_source_clear (self, FALSE, AF_INET6);
- _LOGI (LOGD_DEVICE | LOGD_IP6,
- "Activation: Stage 4 of 5 (IPv6 Configure Timeout) started...");
+ _LOGD (LOGD_DEVICE | LOGD_IP6, "Activation: Stage 4 of 5 (IPv6 Configure Timeout) started...");
ret = NM_DEVICE_GET_CLASS (self)->act_stage4_ip6_config_timeout (self, &reason);
if (ret == NM_ACT_STAGE_RETURN_POSTPONE)
@@ -4962,8 +5412,7 @@ nm_device_activate_ip6_config_timeout (gpointer user_data)
nm_device_check_ip_failed (self, FALSE);
out:
- _LOGI (LOGD_DEVICE | LOGD_IP6,
- "Activation: Stage 4 of 5 (IPv6 Configure Timeout) complete.");
+ _LOGD (LOGD_DEVICE | LOGD_IP6, "Activation: Stage 4 of 5 (IPv6 Configure Timeout) complete.");
return FALSE;
}
@@ -4986,57 +5435,33 @@ nm_device_activate_schedule_ip6_config_timeout (NMDevice *self)
activation_source_schedule (self, nm_device_activate_ip6_config_timeout, AF_INET6);
- _LOGI (LOGD_DEVICE | LOGD_IP6,
- "Activation: Stage 4 of 5 (IPv6 Configure Timeout) scheduled...");
-}
-
-static void
-share_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- nm_unblock_posix_signals (NULL);
+ _LOGD (LOGD_DEVICE | LOGD_IP6, "Activation: Stage 4 of 5 (IPv6 Configure Timeout) scheduled...");
}
static gboolean
share_init (void)
{
- int status;
char *modules[] = { "ip_tables", "iptable_nat", "nf_nat_ftp", "nf_nat_irc",
"nf_nat_sip", "nf_nat_tftp", "nf_nat_pptp", "nf_nat_h323",
NULL };
char **iter;
int errsv;
- if (!nm_platform_sysctl_set ("/proc/sys/net/ipv4/ip_forward", "1")) {
+ if (!nm_platform_sysctl_set (NM_PLATFORM_GET, "/proc/sys/net/ipv4/ip_forward", "1")) {
errsv = errno;
nm_log_err (LOGD_SHARING, "share: error starting IP forwarding: (%d) %s",
errsv, strerror (errsv));
return FALSE;
}
- if (!nm_platform_sysctl_set ("/proc/sys/net/ipv4/ip_dynaddr", "1")) {
+ if (!nm_platform_sysctl_set (NM_PLATFORM_GET, "/proc/sys/net/ipv4/ip_dynaddr", "1")) {
errsv = errno;
nm_log_err (LOGD_SHARING, "share: error starting IP forwarding: (%d) %s",
errsv, strerror (errsv));
}
- for (iter = modules; *iter; iter++) {
- char *argv[3] = { "/sbin/modprobe", *iter, NULL };
- char *envp[1] = { NULL };
- GError *error = NULL;
-
- if (!g_spawn_sync ("/", argv, envp, G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
- share_child_setup, NULL, NULL, NULL, &status, &error)) {
- nm_log_err (LOGD_SHARING, "share: error loading NAT module %s: (%d) %s",
- *iter, error ? error->code : 0,
- (error && error->message) ? error->message : "unknown");
- if (error)
- g_error_free (error);
- }
- }
+ for (iter = modules; *iter; iter++)
+ nm_utils_modprobe (NULL, FALSE, *iter, NULL);
return TRUE;
}
@@ -5154,8 +5579,7 @@ send_arps (NMDevice *self, const char *mode_arg)
"arping: run %s", (tmp_str = g_strjoinv (" ", (char **) argv)));
success = g_spawn_async (NULL, (char **) argv, NULL,
G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
- nm_unblock_posix_signals,
- NULL, NULL, &error);
+ NULL, NULL, NULL, &error);
if (!success) {
_LOGW (LOGD_DEVICE | LOGD_IP4,
"arping: could not send ARP for local address %s: %s",
@@ -5231,7 +5655,7 @@ nm_device_activate_ip4_config_commit (gpointer user_data)
/* Clear the activation source ID now that this stage has run */
activation_source_clear (self, FALSE, AF_INET);
- _LOGI (LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv4 Commit) started...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv4 Commit) started...");
req = nm_device_get_act_request (self);
g_assert (req);
@@ -5240,16 +5664,15 @@ nm_device_activate_ip4_config_commit (gpointer user_data)
/* Interface must be IFF_UP before IP config can be applied */
ip_ifindex = nm_device_get_ip_ifindex (self);
- if (!nm_platform_link_is_up (ip_ifindex) && !nm_device_uses_assumed_connection (self)) {
- nm_platform_link_set_up (ip_ifindex);
- if (!nm_platform_link_is_up (ip_ifindex))
+ if (!nm_platform_link_is_up (NM_PLATFORM_GET, ip_ifindex) && !nm_device_uses_assumed_connection (self)) {
+ nm_platform_link_set_up (NM_PLATFORM_GET, ip_ifindex, NULL);
+ if (!nm_platform_link_is_up (NM_PLATFORM_GET, ip_ifindex))
_LOGW (LOGD_DEVICE, "interface %s not up for IP configuration", nm_device_get_ip_iface (self));
}
/* NULL to use the existing priv->dev_ip4_config */
if (!ip4_config_merge_and_apply (self, NULL, TRUE, &reason)) {
- _LOGI (LOGD_DEVICE | LOGD_IP4,
- "Activation: Stage 5 of 5 (IPv4 Commit) failed");
+ _LOGD (LOGD_DEVICE | LOGD_IP4, "Activation: Stage 5 of 5 (IPv4 Commit) failed");
nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, reason);
goto out;
}
@@ -5291,11 +5714,28 @@ nm_device_activate_ip4_config_commit (gpointer user_data)
nm_device_state_changed (self, NM_DEVICE_STATE_IP_CHECK, NM_DEVICE_STATE_REASON_NONE);
out:
- _LOGI (LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv4 Commit) complete.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv4 Commit) complete.");
return FALSE;
}
+static void
+nm_device_queued_ip_config_change_clear (NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ if (priv->queued_ip4_config_id) {
+ _LOGD (LOGD_DEVICE, "clearing queued IP4 config change");
+ g_source_remove (priv->queued_ip4_config_id);
+ priv->queued_ip4_config_id = 0;
+ }
+ if (priv->queued_ip6_config_id) {
+ _LOGD (LOGD_DEVICE, "clearing queued IP6 config change");
+ g_source_remove (priv->queued_ip6_config_id);
+ priv->queued_ip6_config_id = 0;
+ }
+}
+
void
nm_device_activate_schedule_ip4_config_result (NMDevice *self, NMIP4Config *config)
{
@@ -5308,10 +5748,10 @@ nm_device_activate_schedule_ip4_config_result (NMDevice *self, NMIP4Config *conf
if (config)
priv->dev_ip4_config = g_object_ref (config);
+ nm_device_queued_ip_config_change_clear (self);
activation_source_schedule (self, nm_device_activate_ip4_config_commit, AF_INET);
- _LOGI (LOGD_DEVICE | LOGD_IP4,
- "Activation: Stage 5 of 5 (IPv4 Configure Commit) scheduled...");
+ _LOGD (LOGD_DEVICE | LOGD_IP4, "Activation: Stage 5 of 5 (IPv4 Configure Commit) scheduled...");
}
gboolean
@@ -5333,7 +5773,6 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
{
NMDevice *self = NM_DEVICE (user_data);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- guint level = (priv->ip6_state == IP_DONE) ? LOGL_DEBUG : LOGL_INFO;
NMActRequest *req;
NMConnection *connection;
NMDeviceStateReason reason = NM_DEVICE_STATE_REASON_NONE;
@@ -5342,7 +5781,7 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
/* Clear the activation source ID now that this stage has run */
activation_source_clear (self, FALSE, AF_INET6);
- _LOG (level, LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv6 Commit) started...");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv6 Commit) started...");
req = nm_device_get_act_request (self);
g_assert (req);
@@ -5351,9 +5790,9 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
/* Interface must be IFF_UP before IP config can be applied */
ip_ifindex = nm_device_get_ip_ifindex (self);
- if (!nm_platform_link_is_up (ip_ifindex) && !nm_device_uses_assumed_connection (self)) {
- nm_platform_link_set_up (ip_ifindex);
- if (!nm_platform_link_is_up (ip_ifindex))
+ if (!nm_platform_link_is_up (NM_PLATFORM_GET, ip_ifindex) && !nm_device_uses_assumed_connection (self)) {
+ nm_platform_link_set_up (NM_PLATFORM_GET, ip_ifindex, NULL);
+ if (!nm_platform_link_is_up (NM_PLATFORM_GET, ip_ifindex))
_LOGW (LOGD_DEVICE, "interface %s not up for IP configuration", nm_device_get_ip_iface (self));
}
@@ -5382,12 +5821,11 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
if (nm_device_get_state (self) == NM_DEVICE_STATE_IP_CONFIG)
nm_device_state_changed (self, NM_DEVICE_STATE_IP_CHECK, NM_DEVICE_STATE_REASON_NONE);
} else {
- _LOGW (LOGD_DEVICE | LOGD_IP6,
- "Activation: Stage 5 of 5 (IPv6 Commit) failed");
+ _LOGW (LOGD_DEVICE | LOGD_IP6, "Activation: Stage 5 of 5 (IPv6 Commit) failed");
nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, reason);
}
- _LOG (level, LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv6 Commit) complete.");
+ _LOGD (LOGD_DEVICE, "Activation: Stage 5 of 5 (IPv6 Commit) complete.");
return FALSE;
}
@@ -5396,7 +5834,6 @@ void
nm_device_activate_schedule_ip6_config_result (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- guint level = (priv->ip6_state == IP_DONE) ? LOGL_DEBUG : LOGL_INFO;
g_return_if_fail (NM_IS_DEVICE (self));
@@ -5408,8 +5845,7 @@ nm_device_activate_schedule_ip6_config_result (NMDevice *self)
activation_source_schedule (self, nm_device_activate_ip6_config_commit, AF_INET6);
- _LOG (level, LOGD_DEVICE | LOGD_IP6,
- "Activation: Stage 5 of 5 (IPv6 Commit) scheduled...");
+ _LOGD (LOGD_DEVICE | LOGD_IP6, "Activation: Stage 5 of 5 (IPv6 Commit) scheduled...");
}
gboolean
@@ -5525,7 +5961,7 @@ delete_on_deactivate_link_delete (gpointer user_data)
_LOGD (LOGD_DEVICE, "delete_on_deactivate: cleanup and delete virtual link #%d (id=%u)",
data->ifindex, data->idle_add_id);
- nm_platform_link_delete (data->ifindex);
+ nm_platform_link_delete (NM_PLATFORM_GET, data->ifindex);
g_free (data);
return FALSE;
}
@@ -5659,7 +6095,7 @@ delete_cb (NMDevice *self,
}
/* Authorized */
- nm_platform_link_delete (nm_device_get_ifindex (self));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_device_get_ifindex (self));
dbus_g_method_return (context);
}
@@ -5687,22 +6123,29 @@ impl_device_delete (NMDevice *self, DBusGMethodInvocation *context)
NULL);
}
-static void
+static gboolean
_device_activate (NMDevice *self, NMActRequest *req)
{
NMDevicePrivate *priv;
NMConnection *connection;
- g_return_if_fail (NM_IS_DEVICE (self));
- g_return_if_fail (NM_IS_ACT_REQUEST (req));
+ g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
+ g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
+
+ /* Ensure the activation request is still valid; the master may have
+ * already failed in which case activation of this device should not proceed.
+ */
+ if (nm_active_connection_get_state (NM_ACTIVE_CONNECTION (req)) >= NM_ACTIVE_CONNECTION_STATE_DEACTIVATING)
+ return FALSE;
priv = NM_DEVICE_GET_PRIVATE (self);
connection = nm_act_request_get_connection (req);
g_assert (connection);
- _LOGI (LOGD_DEVICE, "Activation: starting connection '%s'",
- nm_connection_get_id (connection));
+ _LOGI (LOGD_DEVICE, "Activation: starting connection '%s' (%s)",
+ nm_connection_get_id (connection),
+ nm_connection_get_uuid (connection));
delete_on_deactivate_unschedule (self);
@@ -5719,6 +6162,7 @@ _device_activate (NMDevice *self, NMActRequest *req)
priv->act_request = g_object_ref (req);
nm_device_activate_schedule_stage1_device_prepare (self);
+ return TRUE;
}
static void
@@ -5785,6 +6229,26 @@ _carrier_wait_check_act_request_must_queue (NMDevice *self, NMActRequest *req)
}
void
+nm_device_steal_connection (NMDevice *self, NMConnection *connection)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ _LOGW (LOGD_DEVICE, "disconnecting connection '%s' for new activation request.",
+ nm_connection_get_id (connection));
+
+ if ( priv->queued_act_request
+ && connection == nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (priv->queued_act_request)))
+ _clear_queued_act_request (priv);
+
+ if ( priv->act_request
+ && connection == nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (priv->act_request))
+ && priv->state < NM_DEVICE_STATE_DEACTIVATING)
+ nm_device_state_changed (self,
+ NM_DEVICE_STATE_DEACTIVATING,
+ NM_DEVICE_STATE_REASON_NEW_ACTIVATION);
+}
+
+void
nm_device_queue_activation (NMDevice *self, NMActRequest *req)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -5794,7 +6258,8 @@ nm_device_queue_activation (NMDevice *self, NMActRequest *req)
if (!priv->act_request && !must_queue) {
/* Just activate immediately */
- _device_activate (self, req);
+ if (!_device_activate (self, req))
+ g_assert_not_reached ();
return;
}
@@ -5805,8 +6270,8 @@ nm_device_queue_activation (NMDevice *self, NMActRequest *req)
_LOGD (LOGD_DEVICE, "queue activation request waiting for %s", must_queue ? "carrier" : "currently active connection to disconnect");
+ /* Deactivate existing activation request first */
if (priv->act_request) {
- /* Deactivate existing activation request first */
_LOGI (LOGD_DEVICE, "disconnecting for new activation request.");
nm_device_state_changed (self,
NM_DEVICE_STATE_DEACTIVATING,
@@ -5864,6 +6329,7 @@ nm_device_set_ip4_config (NMDevice *self,
NMIP4Config *new_config,
guint32 default_route_metric,
gboolean commit,
+ gboolean routes_full_sync,
NMDeviceStateReason *reason)
{
NMDevicePrivate *priv;
@@ -5886,10 +6352,14 @@ nm_device_set_ip4_config (NMDevice *self,
if (commit && new_config) {
gboolean assumed = nm_device_uses_assumed_connection (self);
- /* for assumed devices we set the device_route_metric to the default which will
- * stop nm_platform_ip4_address_sync() to replace the device routes. */
+ nm_device_set_mtu (self, nm_ip4_config_get_mtu (new_config));
+
+ /* For assumed devices we must not touch the kernel-routes, such as the device-route.
+ * FIXME: this is wrong in case where "assumed" means "take-over-seamlessly". In this
+ * case, we should manage the device route, for example on new DHCP lease. */
success = nm_ip4_config_commit (new_config, ip_ifindex,
- assumed ? NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE : default_route_metric);
+ routes_full_sync,
+ assumed ? (gint64) -1 : (gint64) default_route_metric);
if (!success)
reason_local = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
}
@@ -5994,6 +6464,7 @@ static gboolean
nm_device_set_ip6_config (NMDevice *self,
NMIP6Config *new_config,
gboolean commit,
+ gboolean routes_full_sync,
NMDeviceStateReason *reason)
{
NMDevicePrivate *priv;
@@ -6014,7 +6485,10 @@ nm_device_set_ip6_config (NMDevice *self,
/* Always commit to nm-platform to update lifetimes */
if (commit && new_config) {
- success = nm_ip6_config_commit (new_config, ip_ifindex);
+ nm_device_ipv6_set_mtu (self, priv->ip6_mtu);
+ success = nm_ip6_config_commit (new_config,
+ ip_ifindex,
+ routes_full_sync);
if (!success)
reason_local = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
}
@@ -6187,19 +6661,67 @@ ip_check_gw_ping_cleanup (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- if (priv->gw_ping.watch) {
- g_source_remove (priv->gw_ping.watch);
- priv->gw_ping.watch = 0;
- }
- if (priv->gw_ping.timeout) {
- g_source_remove (priv->gw_ping.timeout);
- priv->gw_ping.timeout = 0;
- }
+ nm_clear_g_source (&priv->gw_ping.watch);
+ nm_clear_g_source (&priv->gw_ping.timeout);
if (priv->gw_ping.pid) {
nm_utils_kill_child_async (priv->gw_ping.pid, SIGTERM, priv->gw_ping.log_domain, "ping", 1000, NULL, NULL);
priv->gw_ping.pid = 0;
}
+
+ g_clear_pointer (&priv->gw_ping.binary, g_free);
+ g_clear_pointer (&priv->gw_ping.address, g_free);
+}
+
+static gboolean
+spawn_ping (NMDevice *self)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ gs_free char *str_timeout = NULL;
+ gs_free char *tmp_str = NULL;
+ const char *args[] = { priv->gw_ping.binary, "-I", nm_device_get_ip_iface (self),
+ "-c", "1", "-w", NULL, priv->gw_ping.address, NULL };
+ gs_free_error GError *error = NULL;
+ gboolean ret;
+
+ args[6] = str_timeout = g_strdup_printf ("%u", priv->gw_ping.deadline);
+ tmp_str = g_strjoinv (" ", (gchar **) args);
+ _LOGD (priv->gw_ping.log_domain, "ping: running '%s'", tmp_str);
+
+ ret = g_spawn_async ("/",
+ (gchar **) args,
+ NULL,
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL,
+ NULL,
+ &priv->gw_ping.pid,
+ &error);
+
+ if (!ret) {
+ _LOGW (priv->gw_ping.log_domain, "ping: could not spawn %s: %s",
+ priv->gw_ping.binary, error->message);
+ }
+
+ return ret;
+}
+
+static gboolean
+respawn_ping_cb (gpointer user_data)
+{
+ NMDevice *self = NM_DEVICE (user_data);
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ priv->gw_ping.watch = 0;
+
+ if (spawn_ping (self)) {
+ priv->gw_ping.watch = g_child_watch_add (priv->gw_ping.pid,
+ ip_check_ping_watch_cb, self);
+ } else {
+ ip_check_gw_ping_cleanup (self);
+ ip_check_pre_up (self);
+ }
+
+ return FALSE;
}
static void
@@ -6208,6 +6730,7 @@ ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data)
NMDevice *self = NM_DEVICE (user_data);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
guint log_domain = priv->gw_ping.log_domain;
+ gboolean success = FALSE;
if (!priv->gw_ping.watch)
return;
@@ -6215,18 +6738,25 @@ ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data)
priv->gw_ping.pid = 0;
if (WIFEXITED (status)) {
- if (WEXITSTATUS (status) == 0)
+ if (WEXITSTATUS (status) == 0) {
_LOGD (log_domain, "ping: gateway ping succeeded");
- else {
+ success = TRUE;
+ } else {
_LOGW (log_domain, "ping: gateway ping failed with error code %d",
WEXITSTATUS (status));
}
} else
_LOGW (log_domain, "ping: stopped unexpectedly with status %d", status);
- /* We've got connectivity, proceed to pre_up */
- ip_check_gw_ping_cleanup (self);
- ip_check_pre_up (self);
+ if (success) {
+ /* We've got connectivity, proceed to pre_up */
+ ip_check_gw_ping_cleanup (self);
+ ip_check_pre_up (self);
+ } else {
+ /* If ping exited with an error it may have returned early,
+ * wait 1 second and restart it */
+ priv->gw_ping.watch = g_timeout_add_seconds (1, respawn_ping_cb, self);
+ }
}
static gboolean
@@ -6245,46 +6775,30 @@ ip_check_ping_timeout_cb (gpointer user_data)
}
static gboolean
-spawn_ping (NMDevice *self,
+start_ping (NMDevice *self,
guint log_domain,
const char *binary,
const char *address,
guint timeout)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- const char *args[] = { binary, "-I", nm_device_get_ip_iface (self), "-c", "1", "-w", NULL, address, NULL };
- GError *error = NULL;
- char *str_timeout;
- gs_free char *tmp_str = NULL;
- gboolean success;
g_return_val_if_fail (priv->gw_ping.watch == 0, FALSE);
g_return_val_if_fail (priv->gw_ping.timeout == 0, FALSE);
- args[6] = str_timeout = g_strdup_printf ("%u", timeout);
-
- _LOGD (log_domain, "ping: running '%s'",
- (tmp_str = g_strjoinv (" ", (gchar **) args)));
+ priv->gw_ping.log_domain = log_domain;
+ priv->gw_ping.address = g_strdup (address);
+ priv->gw_ping.binary = g_strdup (binary);
+ priv->gw_ping.deadline = timeout + 10; /* the proper termination is enforced by a timer */
- success = g_spawn_async ("/",
- (gchar **) args,
- NULL,
- G_SPAWN_DO_NOT_REAP_CHILD,
- nm_unblock_posix_signals,
- NULL,
- &priv->gw_ping.pid,
- &error);
- if (success) {
- priv->gw_ping.log_domain = log_domain;
+ if (spawn_ping (self)) {
priv->gw_ping.watch = g_child_watch_add (priv->gw_ping.pid, ip_check_ping_watch_cb, self);
- priv->gw_ping.timeout = g_timeout_add_seconds (timeout + 1, ip_check_ping_timeout_cb, self);
- } else {
- _LOGW (log_domain, "ping: could not spawn %s: %s", binary, error->message);
- g_clear_error (&error);
+ priv->gw_ping.timeout = g_timeout_add_seconds (timeout, ip_check_ping_timeout_cb, self);
+ return TRUE;
}
- g_free (str_timeout);
- return success;
+ ip_check_gw_ping_cleanup (self);
+ return FALSE;
}
static void
@@ -6337,7 +6851,7 @@ nm_device_start_ip_check (NMDevice *self)
}
if (buf[0])
- spawn_ping (self, log_domain, ping_binary, buf, timeout);
+ start_ping (self, log_domain, ping_binary, buf, timeout);
/* If no ping was started, just advance to pre_up */
if (!priv->gw_ping.pid)
@@ -6375,7 +6889,7 @@ is_up (NMDevice *self)
{
int ifindex = nm_device_get_ip_ifindex (self);
- return ifindex > 0 ? nm_platform_link_is_up (ifindex) : TRUE;
+ return ifindex > 0 ? nm_platform_link_is_up (NM_PLATFORM_GET, ifindex) : TRUE;
}
gboolean
@@ -6400,7 +6914,7 @@ nm_device_bring_up (NMDevice *self, gboolean block, gboolean *no_firmware)
do {
g_usleep (200);
- if (!nm_platform_link_refresh (ifindex))
+ if (!nm_platform_link_refresh (NM_PLATFORM_GET, ifindex))
return FALSE;
device_is_up = nm_device_is_up (self);
} while (!device_is_up && nm_utils_get_monotonic_timestamp_us () < wait_until);
@@ -6419,7 +6933,7 @@ nm_device_bring_up (NMDevice *self, gboolean block, gboolean *no_firmware)
* complete (via a pending action) until either the carrier turns on, or
* a timeout is reached.
*/
- if (device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
+ if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
if (priv->carrier_wait_id)
g_source_remove (priv->carrier_wait_id);
else
@@ -6434,15 +6948,6 @@ nm_device_bring_up (NMDevice *self, gboolean block, gboolean *no_firmware)
return TRUE;
}
-static void
-check_carrier (NMDevice *self)
-{
- int ifindex = nm_device_get_ip_ifindex (self);
-
- if (!device_has_capability (self, NM_DEVICE_CAP_NONSTANDARD_CARRIER))
- nm_device_set_carrier (self, nm_platform_link_is_connected (ifindex));
-}
-
static gboolean
bring_up (NMDevice *self, gboolean *no_firmware)
{
@@ -6455,12 +6960,10 @@ bring_up (NMDevice *self, gboolean *no_firmware)
return TRUE;
}
- result = nm_platform_link_set_up (ifindex);
- if (no_firmware)
- *no_firmware = nm_platform_get_error () == NM_PLATFORM_ERROR_NO_FIRMWARE;
+ result = nm_platform_link_set_up (NM_PLATFORM_GET, ifindex, no_firmware);
/* Store carrier immediately. */
- if (result && device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT))
+ if (result && nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT))
check_carrier (self);
return result;
@@ -6487,7 +6990,7 @@ nm_device_take_down (NMDevice *self, gboolean block)
do {
g_usleep (200);
- if (!nm_platform_link_refresh (ifindex))
+ if (!nm_platform_link_refresh (NM_PLATFORM_GET, ifindex))
return;
device_is_up = nm_device_is_up (self);
} while (device_is_up && nm_utils_get_monotonic_timestamp_us () < wait_until);
@@ -6507,7 +7010,7 @@ take_down (NMDevice *self)
int ifindex = nm_device_get_ip_ifindex (self);
if (ifindex > 0)
- return nm_platform_link_set_down (ifindex);
+ return nm_platform_link_set_down (NM_PLATFORM_GET, ifindex);
/* devices without ifindex are always up. */
_LOGD (LOGD_HW, "cannot take down device without ifindex");
@@ -6634,11 +7137,10 @@ capture_lease_config (NMDevice *self,
}
static void
-update_ip_config (NMDevice *self, gboolean initial)
+update_ip4_config (NMDevice *self, gboolean initial)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
int ifindex;
- gboolean linklocal6_just_completed = FALSE;
gboolean capture_resolv_conf;
NMDnsManagerResolvConfMode resolv_conf_mode;
@@ -6652,13 +7154,35 @@ update_ip_config (NMDevice *self, gboolean initial)
/* IPv4 */
g_clear_object (&priv->ext_ip4_config);
priv->ext_ip4_config = nm_ip4_config_capture (ifindex, capture_resolv_conf);
- priv->ext_ip4_config_had_any_addresses = ( priv->ext_ip4_config
- && nm_ip4_config_get_num_addresses (priv->ext_ip4_config) > 0);
if (priv->ext_ip4_config) {
if (initial) {
g_clear_object (&priv->dev_ip4_config);
capture_lease_config (self, priv->ext_ip4_config, &priv->dev_ip4_config, NULL, NULL);
}
+
+ /* FIXME: ext_ip4_config does not contain routes with source==RTPROT_KERNEL.
+ * Hence, we will wrongly remove device-routes with metric=0 if they were added by
+ * the user on purpose. This should be fixed by also tracking and exposing
+ * kernel routes. */
+
+ /* This function was called upon external changes. Remove the configuration
+ * (adresses,routes) that is no longer present externally from the interal
+ * config. This way, we don't readd addresses that were manually removed
+ * by the user. */
+ if (priv->con_ip4_config)
+ nm_ip4_config_intersect (priv->con_ip4_config, priv->ext_ip4_config);
+ if (priv->dev_ip4_config)
+ nm_ip4_config_intersect (priv->dev_ip4_config, priv->ext_ip4_config);
+ if (priv->vpn4_config)
+ nm_ip4_config_intersect (priv->vpn4_config, priv->ext_ip4_config);
+ if (priv->wwan_ip4_config)
+ nm_ip4_config_intersect (priv->wwan_ip4_config, priv->ext_ip4_config);
+
+ /* Remove parts from ext_ip4_config to only contain the information that
+ * was configured externally -- we already have the same configuration from
+ * internal origins. */
+ if (priv->con_ip4_config)
+ nm_ip4_config_subtract (priv->ext_ip4_config, priv->con_ip4_config);
if (priv->dev_ip4_config)
nm_ip4_config_subtract (priv->ext_ip4_config, priv->dev_ip4_config);
if (priv->vpn4_config)
@@ -6668,18 +7192,53 @@ update_ip_config (NMDevice *self, gboolean initial)
ip4_config_merge_and_apply (self, NULL, FALSE, NULL);
}
+}
+
+static void
+update_ip6_config (NMDevice *self, gboolean initial)
+{
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ int ifindex;
+ gboolean linklocal6_just_completed = FALSE;
+ gboolean capture_resolv_conf;
+ NMDnsManagerResolvConfMode resolv_conf_mode;
+
+ ifindex = nm_device_get_ip_ifindex (self);
+ if (!ifindex)
+ return;
+
+ resolv_conf_mode = nm_dns_manager_get_resolv_conf_mode (nm_dns_manager_get ());
+ capture_resolv_conf = initial && (resolv_conf_mode == NM_DNS_MANAGER_RESOLV_CONF_EXPLICIT);
/* IPv6 */
g_clear_object (&priv->ext_ip6_config);
priv->ext_ip6_config = nm_ip6_config_capture (ifindex, capture_resolv_conf, NM_SETTING_IP6_CONFIG_PRIVACY_UNKNOWN);
- priv->ext_ip6_config_had_any_addresses = ( priv->ext_ip6_config
- && nm_ip6_config_get_num_addresses (priv->ext_ip6_config) > 0);
if (priv->ext_ip6_config) {
/* Check this before modifying ext_ip6_config */
linklocal6_just_completed = priv->linklocal6_timeout_id &&
have_ip6_address (priv->ext_ip6_config, TRUE);
+ /* This function was called upon external changes. Remove the configuration
+ * (adresses,routes) that is no longer present externally from the interal
+ * config. This way, we don't readd addresses that were manually removed
+ * by the user. */
+ if (priv->con_ip6_config)
+ nm_ip6_config_intersect (priv->con_ip6_config, priv->ext_ip6_config);
+ if (priv->ac_ip6_config)
+ nm_ip6_config_intersect (priv->ac_ip6_config, priv->ext_ip6_config);
+ if (priv->dhcp6_ip6_config)
+ nm_ip6_config_intersect (priv->dhcp6_ip6_config, priv->ext_ip6_config);
+ if (priv->wwan_ip6_config)
+ nm_ip6_config_intersect (priv->wwan_ip6_config, priv->ext_ip6_config);
+ if (priv->vpn6_config)
+ nm_ip6_config_intersect (priv->vpn6_config, priv->ext_ip6_config);
+
+ /* Remove parts from ext_ip6_config to only contain the information that
+ * was configured externally -- we already have the same configuration from
+ * internal origins. */
+ if (priv->con_ip6_config)
+ nm_ip6_config_subtract (priv->ext_ip6_config, priv->con_ip6_config);
if (priv->ac_ip6_config)
nm_ip6_config_subtract (priv->ext_ip6_config, priv->ac_ip6_config);
if (priv->dhcp6_ip6_config)
@@ -6703,11 +7262,12 @@ update_ip_config (NMDevice *self, gboolean initial)
void
nm_device_capture_initial_config (NMDevice *self)
{
- update_ip_config (self, TRUE);
+ update_ip4_config (self, TRUE);
+ update_ip6_config (self, TRUE);
}
static gboolean
-queued_ip_config_change (gpointer user_data)
+queued_ip4_config_change (gpointer user_data)
{
NMDevice *self = NM_DEVICE (user_data);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
@@ -6716,8 +7276,27 @@ queued_ip_config_change (gpointer user_data)
if (priv->queued_state.id)
return TRUE;
- priv->queued_ip_config_id = 0;
- update_ip_config (self, FALSE);
+ priv->queued_ip4_config_id = 0;
+ g_object_ref (self);
+ update_ip4_config (self, FALSE);
+ g_object_unref (self);
+
+ return FALSE;
+}
+
+static gboolean
+queued_ip6_config_change (gpointer user_data)
+{
+ NMDevice *self = NM_DEVICE (user_data);
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+
+ /* Wait for any queued state changes */
+ if (priv->queued_state.id)
+ return TRUE;
+
+ priv->queued_ip6_config_id = 0;
+ g_object_ref (self);
+ update_ip6_config (self, FALSE);
/* If no IPv6 link-local address exists but other addresses do then we
* must add the LL address to remain conformant with RFC 3513 chapter 2.1
@@ -6727,36 +7306,43 @@ queued_ip_config_change (gpointer user_data)
if (priv->ip6_config && nm_ip6_config_get_num_addresses (priv->ip6_config))
check_and_add_ipv6ll_addr (self);
+ g_object_unref (self);
+
return FALSE;
}
static void
-device_ip_changed (NMPlatform *platform,
- int ifindex,
- gpointer platform_object,
- NMPlatformSignalChangeType change_type,
- NMPlatformReason reason,
- NMDevice *self)
+device_ipx_changed (NMPlatform *platform,
+ NMPObjectType obj_type,
+ int ifindex,
+ gpointer platform_object,
+ NMPlatformSignalChangeType change_type,
+ NMPlatformReason reason,
+ NMDevice *self)
{
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
-
- if (nm_device_get_ip_ifindex (self) == ifindex) {
- if (!priv->queued_ip_config_id)
- priv->queued_ip_config_id = g_idle_add (queued_ip_config_change, self);
-
- _LOGD (LOGD_DEVICE, "queued IP config change");
- }
-}
+ NMDevicePrivate *priv;
-static void
-nm_device_queued_ip_config_change_clear (NMDevice *self)
-{
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ if (nm_device_get_ip_ifindex (self) != ifindex)
+ return;
- if (priv->queued_ip_config_id) {
- _LOGD (LOGD_DEVICE, "clearing queued IP config change");
- g_source_remove (priv->queued_ip_config_id);
- priv->queued_ip_config_id = 0;
+ priv = NM_DEVICE_GET_PRIVATE (self);
+ switch (obj_type) {
+ case NMP_OBJECT_TYPE_IP4_ADDRESS:
+ case NMP_OBJECT_TYPE_IP4_ROUTE:
+ if (!priv->queued_ip4_config_id) {
+ priv->queued_ip4_config_id = g_idle_add (queued_ip4_config_change, self);
+ _LOGD (LOGD_DEVICE, "queued IP4 config change");
+ }
+ break;
+ case NMP_OBJECT_TYPE_IP6_ADDRESS:
+ case NMP_OBJECT_TYPE_IP6_ROUTE:
+ if (!priv->queued_ip6_config_id) {
+ priv->queued_ip6_config_id = g_idle_add (queued_ip6_config_change, self);
+ _LOGD (LOGD_DEVICE, "queued IP6 config change");
+ }
+ break;
+ default:
+ g_return_if_reached ();
}
}
@@ -6840,7 +7426,7 @@ nm_device_set_unmanaged (NMDevice *self,
if (unmanaged)
nm_device_state_changed (self, NM_DEVICE_STATE_UNMANAGED, reason);
- else
+ else if (nm_device_get_state (self) == NM_DEVICE_STATE_UNMANAGED)
nm_device_state_changed (self, NM_DEVICE_STATE_UNAVAILABLE, reason);
}
}
@@ -7099,7 +7685,7 @@ cp_connection_updated (NMConnectionProvider *cp, NMConnection *connection, gpoin
gboolean
nm_device_supports_vlans (NMDevice *self)
{
- return nm_platform_link_supports_vlans (nm_device_get_ifindex (self));
+ return nm_platform_link_supports_vlans (NM_PLATFORM_GET, nm_device_get_ifindex (self));
}
/**
@@ -7206,16 +7792,16 @@ nm_device_has_pending_action (NMDevice *self)
/***********************************************************/
static void
-_cleanup_ip_pre (NMDevice *self, gboolean deconfigure)
+_cleanup_ip_pre (NMDevice *self, CleanupType cleanup_type)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
priv->ip4_state = priv->ip6_state = IP_NONE;
nm_device_queued_ip_config_change_clear (self);
- dhcp4_cleanup (self, deconfigure, FALSE);
+ dhcp4_cleanup (self, cleanup_type, FALSE);
arp_cleanup (self);
- dhcp6_cleanup (self, deconfigure, FALSE);
+ dhcp6_cleanup (self, cleanup_type, FALSE);
linklocal6_cleanup (self);
addrconf6_cleanup (self);
dnsmasq_cleanup (self);
@@ -7223,10 +7809,9 @@ _cleanup_ip_pre (NMDevice *self, gboolean deconfigure)
}
static void
-_cleanup_generic_pre (NMDevice *self, gboolean deconfigure)
+_cancel_activation (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- NMConnection *connection;
/* Clean up when device was deactivated during call to firewall */
if (priv->fw_call) {
@@ -7234,8 +7819,22 @@ _cleanup_generic_pre (NMDevice *self, gboolean deconfigure)
priv->fw_call = NULL;
}
+ ip_check_gw_ping_cleanup (self);
+
+ /* Break the activation chain */
+ activation_source_clear (self, TRUE, AF_INET);
+ activation_source_clear (self, TRUE, AF_INET6);
+}
+
+static void
+_cleanup_generic_pre (NMDevice *self, CleanupType cleanup_type)
+{
+ NMConnection *connection;
+
+ _cancel_activation (self);
+
connection = nm_device_get_connection (self);
- if ( deconfigure
+ if ( cleanup_type == CLEANUP_TYPE_DECONFIGURE
&& connection
&& !nm_device_uses_assumed_connection (self)) {
nm_firewall_manager_remove_from_zone (nm_firewall_manager_get (),
@@ -7243,28 +7842,24 @@ _cleanup_generic_pre (NMDevice *self, gboolean deconfigure)
NULL);
}
- ip_check_gw_ping_cleanup (self);
-
- /* Break the activation chain */
- activation_source_clear (self, TRUE, AF_INET);
- activation_source_clear (self, TRUE, AF_INET6);
-
/* Clear any queued transitions */
nm_device_queued_state_clear (self);
- _cleanup_ip_pre (self, deconfigure);
+ _cleanup_ip_pre (self, cleanup_type);
}
static void
-_cleanup_generic_post (NMDevice *self, gboolean deconfigure)
+_cleanup_generic_post (NMDevice *self, CleanupType cleanup_type)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMDeviceStateReason ignored = NM_DEVICE_STATE_REASON_NONE;
priv->default_route.v4_has = FALSE;
priv->default_route.v4_is_assumed = TRUE;
+ priv->default_route.v4_configure_first_time = TRUE;
priv->default_route.v6_has = FALSE;
priv->default_route.v6_is_assumed = TRUE;
+ priv->default_route.v6_configure_first_time = TRUE;
nm_default_route_manager_ip4_update_default_route (nm_default_route_manager_get (), self);
nm_default_route_manager_ip6_update_default_route (nm_default_route_manager_get (), self);
@@ -7272,22 +7867,21 @@ _cleanup_generic_post (NMDevice *self, gboolean deconfigure)
/* Clean up IP configs; this does not actually deconfigure the
* interface; the caller must flush routes and addresses explicitly.
*/
- nm_device_set_ip4_config (self, NULL, 0, TRUE, &ignored);
- nm_device_set_ip6_config (self, NULL, TRUE, &ignored);
+ nm_device_set_ip4_config (self, NULL, 0, TRUE, TRUE, &ignored);
+ nm_device_set_ip6_config (self, NULL, TRUE, TRUE, &ignored);
+ g_clear_object (&priv->con_ip4_config);
g_clear_object (&priv->dev_ip4_config);
g_clear_object (&priv->ext_ip4_config);
g_clear_object (&priv->wwan_ip4_config);
g_clear_object (&priv->vpn4_config);
g_clear_object (&priv->ip4_config);
+ g_clear_object (&priv->con_ip6_config);
g_clear_object (&priv->ac_ip6_config);
g_clear_object (&priv->ext_ip6_config);
g_clear_object (&priv->vpn6_config);
g_clear_object (&priv->wwan_ip6_config);
g_clear_object (&priv->ip6_config);
- priv->ext_ip4_config_had_any_addresses = FALSE;
- priv->ext_ip6_config_had_any_addresses = FALSE;
-
clear_act_request (self);
/* Clear legacy IPv4 address property */
@@ -7296,7 +7890,7 @@ _cleanup_generic_post (NMDevice *self, gboolean deconfigure)
g_object_notify (G_OBJECT (self), NM_DEVICE_IP4_ADDRESS);
}
- if (deconfigure) {
+ if (cleanup_type == CLEANUP_TYPE_DECONFIGURE) {
/* Check if the device was deactivated, and if so, delete_link.
* Don't call delete_link synchronously because we are currently
* handling a state change -- which is not reentrant. */
@@ -7317,7 +7911,7 @@ _cleanup_generic_post (NMDevice *self, gboolean deconfigure)
*
*/
static void
-nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, gboolean deconfigure)
+nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, CleanupType cleanup_type)
{
NMDevicePrivate *priv;
int ifindex;
@@ -7325,17 +7919,17 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, gboolean deconfig
g_return_if_fail (NM_IS_DEVICE (self));
if (reason == NM_DEVICE_STATE_REASON_NOW_MANAGED)
- _LOGI (LOGD_DEVICE, "preparing device");
+ _LOGD (LOGD_DEVICE, "preparing device");
else
- _LOGI (LOGD_DEVICE, "deactivating device (reason '%s') [%d]", reason_to_string (reason), reason);
+ _LOGD (LOGD_DEVICE, "deactivating device (reason '%s') [%d]", reason_to_string (reason), reason);
/* Save whether or not we tried IPv6 for later */
priv = NM_DEVICE_GET_PRIVATE (self);
- _cleanup_generic_pre (self, deconfigure);
+ _cleanup_generic_pre (self, cleanup_type);
/* Turn off kernel IPv6 */
- if (deconfigure) {
+ if (cleanup_type == CLEANUP_TYPE_DECONFIGURE) {
set_disable_ipv6 (self, "1");
nm_device_ipv6_sysctl_set (self, "accept_ra", "0");
nm_device_ipv6_sysctl_set (self, "use_tempaddr", "0");
@@ -7356,11 +7950,11 @@ nm_device_cleanup (NMDevice *self, NMDeviceStateReason reason, gboolean deconfig
/* Take out any entries in the routing table and any IP address the device had. */
ifindex = nm_device_get_ip_ifindex (self);
if (ifindex > 0) {
- nm_platform_route_flush (ifindex);
- nm_platform_address_flush (ifindex);
+ nm_route_manager_route_flush (nm_route_manager_get (), ifindex);
+ nm_platform_address_flush (NM_PLATFORM_GET, ifindex);
}
- _cleanup_generic_post (self, deconfigure);
+ _cleanup_generic_post (self, cleanup_type);
}
static char *
@@ -7689,11 +8283,11 @@ _set_state_full (NMDevice *self,
nm_device_set_firmware_missing (self, FALSE);
if (old_state > NM_DEVICE_STATE_UNMANAGED) {
if (reason == NM_DEVICE_STATE_REASON_REMOVED) {
- nm_device_cleanup (self, reason, FALSE);
+ nm_device_cleanup (self, reason, CLEANUP_TYPE_REMOVED);
} else {
/* Clean up if the device is now unmanaged but was activated */
if (nm_device_get_act_request (self))
- nm_device_cleanup (self, reason, TRUE);
+ nm_device_cleanup (self, reason, CLEANUP_TYPE_DECONFIGURE);
nm_device_take_down (self, TRUE);
set_nm_ipv6ll (self, FALSE);
restore_ip6_properties (self);
@@ -7722,7 +8316,7 @@ _set_state_full (NMDevice *self,
* Note that we "deactivate" the device even when coming from
* UNMANAGED, to ensure that it's in a clean state.
*/
- nm_device_cleanup (self, reason, TRUE);
+ nm_device_cleanup (self, reason, CLEANUP_TYPE_DECONFIGURE);
}
break;
case NM_DEVICE_STATE_DISCONNECTED:
@@ -7732,7 +8326,7 @@ _set_state_full (NMDevice *self,
*/
set_nm_ipv6ll (self, TRUE);
- nm_device_cleanup (self, reason, TRUE);
+ nm_device_cleanup (self, reason, CLEANUP_TYPE_DECONFIGURE);
} else if (old_state < NM_DEVICE_STATE_DISCONNECTED) {
if (reason != NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED) {
/* Ensure IPv6 is set up as it may not have been done when
@@ -7747,7 +8341,7 @@ _set_state_full (NMDevice *self,
/* Clean up any half-done IP operations if the device's layer2
* finds out it needs authentication during IP config.
*/
- _cleanup_ip_pre (self, TRUE);
+ _cleanup_ip_pre (self, CLEANUP_TYPE_DECONFIGURE);
}
break;
default:
@@ -7774,8 +8368,9 @@ _set_state_full (NMDevice *self,
* reasons.
*/
if (nm_device_is_available (self, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE)) {
- _LOGD (LOGD_DEVICE, "device is available, will transition to DISCONNECTED");
- nm_device_queue_state (self, NM_DEVICE_STATE_DISCONNECTED, NM_DEVICE_STATE_REASON_NONE);
+ nm_device_queue_recheck_available (self,
+ NM_DEVICE_STATE_REASON_NONE,
+ NM_DEVICE_STATE_REASON_NONE);
} else {
if (old_state == NM_DEVICE_STATE_UNMANAGED)
_LOGD (LOGD_DEVICE, "device not yet available for transition to DISCONNECTED");
@@ -7785,6 +8380,14 @@ _set_state_full (NMDevice *self,
}
break;
case NM_DEVICE_STATE_DEACTIVATING:
+ _cancel_activation (self);
+
+ if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
+ /* We cache the ignore_carrier state to not react on config-reloads while the connection
+ * is active. But on deactivating, reset the ignore-carrier flag to the current state. */
+ priv->ignore_carrier = nm_config_data_get_ignore_carrier (NM_CONFIG_GET_DATA, self);
+ }
+
if (quitting) {
nm_dispatcher_call_sync (DISPATCHER_ACTION_PRE_DOWN,
nm_act_request_get_connection (req),
@@ -7807,13 +8410,18 @@ _set_state_full (NMDevice *self,
if ( priv->queued_act_request
&& !priv->queued_act_request_is_waiting_for_carrier) {
NMActRequest *queued_req;
+ gboolean success;
queued_req = priv->queued_act_request;
priv->queued_act_request = NULL;
- _device_activate (self, queued_req);
+ success = _device_activate (self, queued_req);
g_object_unref (queued_req);
- } else if ( old_state > NM_DEVICE_STATE_DISCONNECTED
- && nm_device_get_default_unmanaged (self))
+ if (success)
+ break;
+ /* fall through */
+ }
+ if ( old_state > NM_DEVICE_STATE_DISCONNECTED
+ && nm_device_get_default_unmanaged (self))
nm_device_queue_state (self, NM_DEVICE_STATE_UNMANAGED, NM_DEVICE_STATE_REASON_NONE);
break;
case NM_DEVICE_STATE_ACTIVATED:
@@ -8026,7 +8634,7 @@ nm_device_update_hw_address (NMDevice *self)
if (ifindex <= 0)
return;
- hwaddr = nm_platform_link_get_address (ifindex, &hwaddrlen);
+ hwaddr = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, &hwaddrlen);
if (hwaddrlen) {
if (!priv->hw_addr || !nm_utils_hwaddr_matches (priv->hw_addr, -1, hwaddr, hwaddrlen)) {
@@ -8072,7 +8680,7 @@ nm_device_set_hw_addr (NMDevice *self, const char *addr,
/* Can't change MAC address while device is up */
nm_device_take_down (self, FALSE);
- success = nm_platform_link_set_address (nm_device_get_ip_ifindex (self), addr_bytes, priv->hw_addr_len);
+ success = nm_platform_link_set_address (NM_PLATFORM_GET, nm_device_get_ip_ifindex (self), addr_bytes, priv->hw_addr_len);
if (success) {
/* MAC address succesfully changed; update the current MAC to match */
nm_device_update_hw_address (self);
@@ -8094,6 +8702,22 @@ nm_device_set_hw_addr (NMDevice *self, const char *addr,
return success;
}
+const char *
+nm_device_get_permanent_hw_address (NMDevice *self)
+{
+ g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
+
+ return NM_DEVICE_GET_PRIVATE (self)->perm_hw_addr;
+}
+
+const char *
+nm_device_get_initial_hw_address (NMDevice *self)
+{
+ g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
+
+ return NM_DEVICE_GET_PRIVATE (self)->initial_hw_addr;
+}
+
/**
* nm_device_spec_match_list:
* @self: an #NMDevice
@@ -8123,24 +8747,34 @@ nm_device_spec_match_list (NMDevice *self, const GSList *specs)
if (!specs)
return FALSE;
- return NM_DEVICE_GET_CLASS (self)->spec_match_list (self, specs);
+ return NM_DEVICE_GET_CLASS (self)->spec_match_list (self, specs) == NM_MATCH_SPEC_MATCH;
}
-static gboolean
+static NMMatchSpecMatchType
spec_match_list (NMDevice *self, const GSList *specs)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- gboolean matched = FALSE;
-
- if (nm_match_spec_string (specs, "*"))
- return TRUE;
-
- if (priv->hw_addr_len)
- matched = nm_match_spec_hwaddr (specs, priv->hw_addr);
-
- if (!matched)
- matched = nm_match_spec_interface_name (specs, nm_device_get_iface (self));
+ NMMatchSpecMatchType matched = NM_MATCH_SPEC_NO_MATCH, m;
+ const GSList *iter;
+ for (iter = specs; iter; iter = g_slist_next (iter)) {
+ if (!strcmp ((const char *) iter->data, "*")) {
+ matched = NM_MATCH_SPEC_MATCH;
+ break;
+ }
+ }
+ if (priv->hw_addr_len) {
+ m = nm_match_spec_hwaddr (specs, priv->hw_addr);
+ matched = MAX (matched, m);
+ }
+ if (matched != NM_MATCH_SPEC_NEG_MATCH) {
+ m = nm_match_spec_interface_name (specs, nm_device_get_iface (self));
+ matched = MAX (matched, m);
+ }
+ if (matched != NM_MATCH_SPEC_NEG_MATCH) {
+ m = nm_match_spec_device_type (specs, nm_device_get_type_description (self));
+ matched = MAX (matched, m);
+ }
return matched;
}
@@ -8165,47 +8799,9 @@ nm_device_init (NMDevice *self)
priv->ip6_saved_properties = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
priv->default_route.v4_is_assumed = TRUE;
+ priv->default_route.v4_configure_first_time = TRUE;
priv->default_route.v6_is_assumed = TRUE;
-}
-
-/*
- * Get driver info from SIOCETHTOOL ioctl() for 'iface'
- * Returns driver and firmware versions to 'driver_version and' 'firmware_version'
- */
-static gboolean
-device_get_driver_info (NMDevice *self, const char *iface, char **driver_version, char **firmware_version)
-{
- struct ethtool_drvinfo drvinfo;
- struct ifreq req;
- int fd;
-
- fd = socket (PF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
- _LOGW (LOGD_HW, "couldn't open control socket.");
- return FALSE;
- }
-
- /* Get driver and firmware version info */
- memset (&drvinfo, 0, sizeof (drvinfo));
- memset (&req, 0, sizeof (struct ifreq));
- strncpy (req.ifr_name, iface, IFNAMSIZ);
- drvinfo.cmd = ETHTOOL_GDRVINFO;
- req.ifr_data = &drvinfo;
-
- errno = 0;
- if (ioctl (fd, SIOCETHTOOL, &req) < 0) {
- _LOGD (LOGD_HW, "SIOCETHTOOL ioctl() failed: cmd=ETHTOOL_GDRVINFO, iface=%s, errno=%d",
- iface, errno);
- close (fd);
- return FALSE;
- }
- if (driver_version)
- *driver_version = g_strdup (drvinfo.version);
- if (firmware_version)
- *firmware_version = g_strdup (drvinfo.fw_version);
-
- close (fd);
- return TRUE;
+ priv->default_route.v6_configure_first_time = TRUE;
}
static GObject*
@@ -8243,27 +8839,40 @@ constructor (GType type,
if (NM_DEVICE_GET_CLASS (self)->get_generic_capabilities)
priv->capabilities |= NM_DEVICE_GET_CLASS (self)->get_generic_capabilities (self);
- if (priv->ifindex <= 0 && !device_has_capability (self, NM_DEVICE_CAP_IS_NON_KERNEL))
- _LOGW (LOGD_HW, "failed to look up interface index");
+ if (priv->ifindex > 0) {
+ priv->physical_port_id = nm_platform_link_get_physical_port_id (NM_PLATFORM_GET, priv->ifindex);
+ priv->dev_id = nm_platform_link_get_dev_id (NM_PLATFORM_GET, priv->ifindex);
+ if (nm_platform_link_is_software (NM_PLATFORM_GET, priv->ifindex))
+ priv->capabilities |= NM_DEVICE_CAP_IS_SOFTWARE;
+ priv->mtu = nm_platform_link_get_mtu (NM_PLATFORM_GET, priv->ifindex);
+
+ nm_platform_link_get_driver_info (NM_PLATFORM_GET,
+ priv->ifindex,
+ NULL,
+ &priv->driver_version,
+ &priv->firmware_version);
+ }
- device_get_driver_info (self, priv->iface, &priv->driver_version, &priv->firmware_version);
+ if (NM_DEVICE_GET_CLASS (self)->get_generic_capabilities)
+ priv->capabilities |= NM_DEVICE_GET_CLASS (self)->get_generic_capabilities (self);
/* Watch for external IP config changes */
platform = nm_platform_get ();
- g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (device_ip_changed), self);
- g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (device_ip_changed), self);
- g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (device_ip_changed), self);
- g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (device_ip_changed), self);
+ g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (device_ipx_changed), self);
+ g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (device_ipx_changed), self);
+ g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (device_ipx_changed), self);
+ g_signal_connect (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (device_ipx_changed), self);
g_signal_connect (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, G_CALLBACK (link_changed_cb), self);
/* trigger initial ip config change to initialize ip-config */
- priv->queued_ip_config_id = g_idle_add (queued_ip_config_change, self);
+ priv->queued_ip4_config_id = g_idle_add (queued_ip4_config_change, self);
+ priv->queued_ip6_config_id = g_idle_add (queued_ip6_config_change, self);
- if (nm_platform_check_support_user_ipv6ll ()) {
+ if (nm_platform_check_support_user_ipv6ll (NM_PLATFORM_GET)) {
int ip_ifindex = nm_device_get_ip_ifindex (self);
if (ip_ifindex > 0)
- priv->nm_ipv6ll = nm_platform_link_get_user_ipv6ll_enabled (ip_ifindex);
+ priv->nm_ipv6ll = nm_platform_link_get_user_ipv6ll_enabled (NM_PLATFORM_GET, ip_ifindex);
}
return object;
@@ -8282,18 +8891,39 @@ constructed (GObject *object)
nm_device_update_hw_address (self);
- if (NM_DEVICE_GET_CLASS (self)->update_permanent_hw_address)
- NM_DEVICE_GET_CLASS (self)->update_permanent_hw_address (self);
+ if (priv->hw_addr_len) {
+ priv->initial_hw_addr = g_strdup (priv->hw_addr);
+ _LOGD (LOGD_DEVICE | LOGD_HW, "read initial MAC address %s", priv->initial_hw_addr);
- if (NM_DEVICE_GET_CLASS (self)->update_initial_hw_address)
- NM_DEVICE_GET_CLASS (self)->update_initial_hw_address (self);
+ if (priv->ifindex > 0) {
+ guint8 buf[NM_UTILS_HWADDR_LEN_MAX];
+ size_t len = 0;
+
+ if (nm_platform_link_get_permanent_address (NM_PLATFORM_GET, priv->ifindex, buf, &len)) {
+ g_warn_if_fail (len == priv->hw_addr_len);
+ priv->perm_hw_addr = nm_utils_hwaddr_ntoa (buf, priv->hw_addr_len);
+ _LOGD (LOGD_DEVICE | LOGD_HW, "read permanent MAC address %s",
+ priv->perm_hw_addr);
+ } else {
+ /* Fall back to current address */
+ _LOGD (LOGD_HW | LOGD_ETHER, "unable to read permanent MAC address");
+ priv->perm_hw_addr = g_strdup (priv->hw_addr);
+ }
+ }
+ }
- /* Have to call update_initial_hw_address() before calling get_ignore_carrier() */
- if (device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
- priv->ignore_carrier = nm_config_get_ignore_carrier (nm_config_get (), self);
+ /* Note: initial hardware address must be read before calling get_ignore_carrier() */
+ if (nm_device_has_capability (self, NM_DEVICE_CAP_CARRIER_DETECT)) {
+ NMConfig *config = nm_config_get ();
+
+ priv->ignore_carrier = nm_config_data_get_ignore_carrier (nm_config_get_data (config), self);
+ g_signal_connect (G_OBJECT (config),
+ NM_CONFIG_SIGNAL_CONFIG_CHANGED,
+ G_CALLBACK (config_changed_update_ignore_carrier),
+ self);
check_carrier (self);
- _LOGI (LOGD_HW,
+ _LOGD (LOGD_HW,
"carrier is %s%s",
priv->carrier ? "ON" : "OFF",
priv->ignore_carrier ? " (but ignored)" : "");
@@ -8302,18 +8932,8 @@ constructed (GObject *object)
priv->carrier = TRUE;
}
- if (priv->ifindex > 0) {
- priv->is_software = nm_platform_link_is_software (priv->ifindex);
- priv->physical_port_id = nm_platform_link_get_physical_port_id (priv->ifindex);
- priv->dev_id = nm_platform_link_get_dev_id (priv->ifindex);
- priv->mtu = nm_platform_link_get_mtu (priv->ifindex);
- }
- /* Indicate software device in capabilities. */
- if (priv->is_software)
- priv->capabilities |= NM_DEVICE_CAP_IS_SOFTWARE;
-
/* Enslave ourselves */
- master = nm_platform_link_get_master (priv->ifindex);
+ master = nm_platform_link_get_master (NM_PLATFORM_GET, priv->ifindex);
if (master)
device_set_master (self, master);
@@ -8355,9 +8975,11 @@ dispose (GObject *object)
_LOGD (LOGD_DEVICE, "dispose(): %s", G_OBJECT_TYPE_NAME (self));
+ g_signal_handlers_disconnect_by_func (nm_config_get (), config_changed_update_ignore_carrier, self);
+
dispatcher_cleanup (self);
- _cleanup_generic_pre (self, FALSE);
+ _cleanup_generic_pre (self, CLEANUP_TYPE_KEEP);
g_warn_if_fail (priv->slaves == NULL);
g_assert (priv->master_ready_id == 0);
@@ -8365,7 +8987,7 @@ dispose (GObject *object)
/* Let the kernel manage IPv6LL again */
set_nm_ipv6ll (self, FALSE);
- _cleanup_generic_post (self, FALSE);
+ _cleanup_generic_post (self, CLEANUP_TYPE_KEEP);
g_hash_table_remove_all (priv->ip6_saved_properties);
@@ -8374,6 +8996,11 @@ dispose (GObject *object)
priv->recheck_assume_id = 0;
}
+ if (priv->recheck_available.call_id) {
+ g_source_remove (priv->recheck_available.call_id);
+ priv->recheck_available.call_id = 0;
+ }
+
link_disconnect_action_cancel (self);
if (priv->con_provider) {
@@ -8393,9 +9020,12 @@ dispose (GObject *object)
_clear_queued_act_request (priv);
platform = nm_platform_get ();
- g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip_changed), self);
+ g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ipx_changed), self);
g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (link_changed_cb), self);
+ nm_clear_g_source (&priv->device_link_changed_id);
+ nm_clear_g_source (&priv->device_ip_link_changed_id);
+
G_OBJECT_CLASS (nm_device_parent_class)->dispose (object);
}
@@ -8408,6 +9038,8 @@ finalize (GObject *object)
_LOGD (LOGD_DEVICE, "finalize(): %s", G_OBJECT_TYPE_NAME (self));
g_free (priv->hw_addr);
+ g_free (priv->perm_hw_addr);
+ g_free (priv->initial_hw_addr);
g_slist_free_full (priv->pending_actions, g_free);
g_clear_pointer (&priv->physical_port_id, g_free);
g_free (priv->udi);
@@ -8418,6 +9050,7 @@ finalize (GObject *object)
g_free (priv->driver_version);
g_free (priv->firmware_version);
g_free (priv->type_desc);
+ g_free (priv->type_description);
g_free (priv->dhcp_anycast_address);
g_hash_table_unref (priv->ip6_saved_properties);
@@ -8435,19 +9068,20 @@ set_property (GObject *object, guint prop_id,
NMPlatformLink *platform_device;
const char *hw_addr, *p;
guint count;
-
+
switch (prop_id) {
case PROP_PLATFORM_DEVICE:
platform_device = g_value_get_pointer (value);
if (platform_device) {
g_free (priv->udi);
- priv->udi = g_strdup (platform_device->udi);
+ priv->udi = g_strdup (nm_platform_link_get_udi (NM_PLATFORM_GET, platform_device->ifindex));
g_free (priv->iface);
priv->iface = g_strdup (platform_device->name);
priv->ifindex = platform_device->ifindex;
- priv->up = platform_device->up;
+ priv->up = NM_FLAGS_HAS (platform_device->flags, IFF_UP);
g_free (priv->driver);
priv->driver = g_strdup (platform_device->driver);
+ priv->platform_link_initialized = platform_device->initialized;
}
break;
case PROP_UDI:
@@ -8460,9 +9094,9 @@ set_property (GObject *object, guint prop_id,
if (g_value_get_string (value)) {
g_free (priv->iface);
priv->iface = g_value_dup_string (value);
- priv->ifindex = nm_platform_link_get_ifindex (priv->iface);
+ priv->ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, priv->iface);
if (priv->ifindex > 0)
- priv->up = nm_platform_link_is_up (priv->ifindex);
+ priv->up = nm_platform_link_is_up (NM_PLATFORM_GET, priv->ifindex);
}
break;
case PROP_DRIVER:
@@ -8696,10 +9330,12 @@ nm_device_class_init (NMDeviceClass *klass)
klass->act_stage4_ip6_config_timeout = act_stage4_ip6_config_timeout;
klass->have_any_ready_slaves = have_any_ready_slaves;
+ klass->get_type_description = get_type_description;
klass->spec_match_list = spec_match_list;
klass->can_auto_connect = can_auto_connect;
klass->check_connection_compatible = check_connection_compatible;
klass->check_connection_available = check_connection_available;
+ klass->can_unmanaged_external_down = can_unmanaged_external_down;
klass->is_up = is_up;
klass->bring_up = bring_up;
klass->take_down = take_down;
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index e204af84a..f1dab9bf2 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -130,19 +130,17 @@ typedef struct {
void (* link_changed) (NMDevice *self, NMPlatformLink *info);
/* Hardware state (IFF_UP) */
- gboolean (*is_up) (NMDevice *self);
- gboolean (*bring_up) (NMDevice *self, gboolean *no_firmware);
- gboolean (*take_down) (NMDevice *self);
+ gboolean (*can_unmanaged_external_down) (NMDevice *self);
+ gboolean (*is_up) (NMDevice *self);
+ gboolean (*bring_up) (NMDevice *self, gboolean *no_firmware);
+ gboolean (*take_down) (NMDevice *self);
/* Carrier state (IFF_LOWER_UP) */
void (*carrier_changed) (NMDevice *, gboolean carrier);
- void (* update_permanent_hw_address) (NMDevice *self);
- void (* update_initial_hw_address) (NMDevice *self);
-
gboolean (* get_ip_iface_identifier) (NMDevice *self, NMUtilsIPv6IfaceId *out_iid);
- guint32 (* get_generic_capabilities) (NMDevice *self);
+ NMDeviceCapabilities (* get_generic_capabilities) (NMDevice *self);
gboolean (* is_available) (NMDevice *self, NMDeviceCheckDevAvailableFlags flags);
@@ -213,7 +211,9 @@ typedef struct {
/* Sync deactivating (in the DISCONNECTED phase) */
void (* deactivate) (NMDevice *self);
- gboolean (* spec_match_list) (NMDevice *self, const GSList *specs);
+ const char *(*get_type_description) (NMDevice *self);
+
+ NMMatchSpecMatchType (* spec_match_list) (NMDevice *self, const GSList *specs);
/* Update the connection with currently configured L2 settings */
void (* update_connection) (NMDevice *device, NMConnection *connection);
@@ -235,6 +235,21 @@ typedef struct {
gboolean (* have_any_ready_slaves) (NMDevice *self,
const GSList *slaves);
+ /**
+ * component_added:
+ * @self: the #NMDevice
+ * @component: the component (device, modem, etc) which was added
+ *
+ * Notifies @self that a new component was added to the Manager. This
+ * may include any kind of %GObject subclass, and the device is expected
+ * to match only specific components they care about, like %NMModem objects
+ * or %NMDevice objects.
+ *
+ * Returns: %TRUE if the component was claimed exclusively and no further
+ * devices should be notified of the new component. %FALSE to indicate
+ * that the component was not exclusively claimed and other devices should
+ * be notified.
+ */
gboolean (* component_added) (NMDevice *self, GObject *component);
gboolean (* owns_iface) (NMDevice *self, const char *iface);
@@ -264,13 +279,16 @@ int nm_device_get_ip_ifindex(NMDevice *dev);
const char * nm_device_get_driver (NMDevice *dev);
const char * nm_device_get_driver_version (NMDevice *dev);
const char * nm_device_get_type_desc (NMDevice *dev);
+const char * nm_device_get_type_description (NMDevice *dev);
NMDeviceType nm_device_get_device_type (NMDevice *dev);
int nm_device_get_priority (NMDevice *dev);
guint32 nm_device_get_ip4_route_metric (NMDevice *dev);
guint32 nm_device_get_ip6_route_metric (NMDevice *dev);
-const char * nm_device_get_hw_address (NMDevice *dev);
+const char * nm_device_get_hw_address (NMDevice *dev);
+const char * nm_device_get_permanent_hw_address (NMDevice *dev);
+const char * nm_device_get_initial_hw_address (NMDevice *dev);
NMDhcp4Config * nm_device_get_dhcp4_config (NMDevice *dev);
NMDhcp6Config * nm_device_get_dhcp6_config (NMDevice *dev);
@@ -342,6 +360,8 @@ RfKillType nm_device_get_rfkill_type (NMDevice *device);
* @NM_UNMANAGED_USER: %TRUE when unmanaged by user decision (via unmanaged-specs)
* @NM_UNMANAGED_PARENT: %TRUE when unmanaged due to parent device being unmanaged
* @NM_UNMANAGED_EXTERNAL_DOWN: %TRUE when unmanaged because !IFF_UP and not created by NM
+ * @NM_UNMANAGED_PLATFORM_INIT: %TRUE when unmanaged because platform link not
+ * yet initialized
*/
typedef enum {
NM_UNMANAGED_NONE = 0x00,
@@ -350,6 +370,7 @@ typedef enum {
NM_UNMANAGED_USER = 0x04,
NM_UNMANAGED_PARENT = 0x08,
NM_UNMANAGED_EXTERNAL_DOWN = 0x10,
+ NM_UNMANAGED_PLATFORM_INIT = 0x20,
/* Boundary value */
__NM_UNMANAGED_LAST,
@@ -371,6 +392,8 @@ void nm_device_set_initial_unmanaged_flag (NMDevice *device,
gboolean nm_device_get_is_nm_owned (NMDevice *device);
void nm_device_set_nm_owned (NMDevice *device);
+gboolean nm_device_has_capability (NMDevice *self, NMDeviceCapabilities caps);
+
gboolean nm_device_get_autoconnect (NMDevice *device);
void nm_device_handle_autoip4_event (NMDevice *self,
@@ -387,6 +410,8 @@ void nm_device_queue_state (NMDevice *self,
gboolean nm_device_get_firmware_missing (NMDevice *self);
+void nm_device_steal_connection (NMDevice *device, NMConnection *connection);
+
void nm_device_queue_activation (NMDevice *device, NMActRequest *req);
gboolean nm_device_supports_vlans (NMDevice *device);
diff --git a/src/devices/team/Makefile.in b/src/devices/team/Makefile.in
index 29ad05988..342c41ee6 100644
--- a/src/devices/team/Makefile.in
+++ b/src/devices/team/Makefile.in
@@ -227,6 +227,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -340,6 +341,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/devices/team/nm-device-team.c b/src/devices/team/nm-device-team.c
index 49202c361..23750f357 100644
--- a/src/devices/team/nm-device-team.c
+++ b/src/devices/team/nm-device-team.c
@@ -39,7 +39,6 @@
#include "nm-dbus-manager.h"
#include "nm-enum-types.h"
#include "nm-team-enum-types.h"
-#include "nm-posix-signals.h"
#include "nm-core-internal.h"
#include "gsystem-local-alloc.h"
@@ -71,18 +70,16 @@ static gboolean teamd_start (NMDevice *device, NMSettingTeam *s_team);
/******************************************************************/
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *device)
{
- return NM_DEVICE_CAP_CARRIER_DETECT;
+ return NM_DEVICE_CAP_CARRIER_DETECT | NM_DEVICE_CAP_IS_SOFTWARE;
}
static gboolean
is_available (NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
{
- if (NM_DEVICE_GET_CLASS (device)->is_up)
- return NM_DEVICE_GET_CLASS (device)->is_up (device);
- return FALSE;
+ return TRUE;
}
static gboolean
@@ -424,23 +421,6 @@ teamd_process_watch_cb (GPid pid, gint status, gpointer user_data)
}
}
-static void
-teamd_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point.
- * Give child it's own program group for signal
- * separation.
- */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for avahi-autoipd here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
static gboolean
teamd_kill (NMDeviceTeam *self, const char *teamd_binary, GError **error)
{
@@ -448,7 +428,7 @@ teamd_kill (NMDeviceTeam *self, const char *teamd_binary, GError **error)
gs_free char *tmp_str = NULL;
if (!teamd_binary) {
- teamd_binary = nm_utils_find_helper ("teamd", NULL, NULL);
+ teamd_binary = nm_utils_find_helper ("teamd", NULL, error);
if (!teamd_binary) {
_LOGW (LOGD_TEAM, "Activation: (team) failed to start teamd: teamd binary not found");
return FALSE;
@@ -463,7 +443,7 @@ teamd_kill (NMDeviceTeam *self, const char *teamd_binary, GError **error)
g_ptr_array_add (argv, NULL);
_LOGD (LOGD_TEAM, "running: %s", (tmp_str = g_strjoinv (" ", (gchar **) argv->pdata)));
- return g_spawn_sync ("/", (char **) argv->pdata, NULL, 0, nm_unblock_posix_signals, NULL, NULL, NULL, NULL, error);
+ return g_spawn_sync ("/", (char **) argv->pdata, NULL, 0, NULL, NULL, NULL, NULL, NULL, error);
}
static gboolean
@@ -514,7 +494,7 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team)
_LOGD (LOGD_TEAM, "running: %s", (tmp_str = g_strjoinv (" ", (gchar **) argv->pdata)));
if (!g_spawn_async ("/", (char **) argv->pdata, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
- teamd_child_setup, NULL, &priv->teamd_pid, &error)) {
+ nm_utils_setpgid, NULL, &priv->teamd_pid, &error)) {
_LOGW (LOGD_TEAM, "Activation: (team) failed to start teamd: %s", error->message);
teamd_cleanup (device, TRUE);
return FALSE;
@@ -638,7 +618,8 @@ enslave_slave (NMDevice *device,
}
}
}
- success = nm_platform_link_enslave (nm_device_get_ip_ifindex (device),
+ success = nm_platform_link_enslave (NM_PLATFORM_GET,
+ nm_device_get_ip_ifindex (device),
nm_device_get_ip_ifindex (slave));
nm_device_bring_up (slave, TRUE, &no_firmware);
@@ -663,7 +644,8 @@ release_slave (NMDevice *device,
gboolean success = TRUE, no_firmware = FALSE;
if (configure) {
- success = nm_platform_link_release (nm_device_get_ip_ifindex (device),
+ success = nm_platform_link_release (NM_PLATFORM_GET,
+ nm_device_get_ip_ifindex (device),
nm_device_get_ip_ifindex (slave));
if (success)
@@ -694,8 +676,6 @@ release_slave (NMDevice *device,
NMDevice *
nm_device_team_new (NMPlatformLink *platform_device)
{
- g_return_val_if_fail (platform_device != NULL, NULL);
-
return (NMDevice *) g_object_new (NM_TYPE_DEVICE_TEAM,
NM_DEVICE_PLATFORM_DEVICE, platform_device,
NM_DEVICE_DRIVER, "team",
@@ -708,21 +688,18 @@ nm_device_team_new (NMPlatformLink *platform_device)
NMDevice *
nm_device_team_new_for_connection (NMConnection *connection, GError **error)
{
- const char *iface;
-
- g_return_val_if_fail (connection != NULL, NULL);
-
- iface = nm_connection_get_interface_name (connection);
- g_return_val_if_fail (iface != NULL, NULL);
-
- if ( !nm_platform_team_add (iface)
- && nm_platform_get_error () != NM_PLATFORM_ERROR_EXISTS) {
- g_set_error (error,
- NM_DEVICE_ERROR,
- NM_DEVICE_ERROR_CREATION_FAILED,
- "failed to create team master interface '%s' for connection '%s': %s",
- iface, nm_connection_get_id (connection),
- nm_platform_get_error_msg ());
+ const char *iface = nm_connection_get_interface_name (connection);
+ NMPlatformError plerr;
+
+ g_assert (iface);
+
+ plerr = nm_platform_team_add (NM_PLATFORM_GET, iface, NULL);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS && plerr != NM_PLATFORM_ERROR_EXISTS) {
+ g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED,
+ "Failed to create team master interface '%s' for '%s': %s",
+ iface,
+ nm_connection_get_id (connection),
+ nm_platform_error_to_string (plerr));
return NULL;
}
diff --git a/src/devices/team/nm-team-factory.c b/src/devices/team/nm-team-factory.c
index cb887cac2..d87919b6b 100644
--- a/src/devices/team/nm-team-factory.c
+++ b/src/devices/team/nm-team-factory.c
@@ -48,11 +48,9 @@ nm_device_factory_create (GError **error)
/************************************************************************/
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- if (plink->type == NM_LINK_TYPE_TEAM)
- return nm_device_team_new (plink);
- return NULL;
+ return nm_device_team_new (plink);
}
static NMDevice *
@@ -61,16 +59,13 @@ create_virtual_device_for_connection (NMDeviceFactory *factory,
NMDevice *parent,
GError **error)
{
- if (nm_connection_is_type (connection, NM_SETTING_TEAM_SETTING_NAME))
- return nm_device_team_new_for_connection (connection, error);
- return NULL;
+ return nm_device_team_new_for_connection (connection, error);
}
-static NMDeviceType
-get_device_type (NMDeviceFactory *factory)
-{
- return NM_DEVICE_TYPE_TEAM;
-}
+NM_DEVICE_FACTORY_DECLARE_TYPES (
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_TEAM)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_TEAM_SETTING_NAME)
+)
/************************************************************************/
@@ -84,7 +79,7 @@ device_factory_interface_init (NMDeviceFactory *factory_iface)
{
factory_iface->new_link = new_link;
factory_iface->create_virtual_device_for_connection = create_virtual_device_for_connection;
- factory_iface->get_device_type = get_device_type;
+ factory_iface->get_supported_types = get_supported_types;
}
static void
diff --git a/src/devices/wifi/Makefile.in b/src/devices/wifi/Makefile.in
index f5e880070..b679bfc29 100644
--- a/src/devices/wifi/Makefile.in
+++ b/src/devices/wifi/Makefile.in
@@ -267,6 +267,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -380,6 +381,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/devices/wifi/nm-device-olpc-mesh.c b/src/devices/wifi/nm-device-olpc-mesh.c
index dc3dfbc65..e67d1a20a 100644
--- a/src/devices/wifi/nm-device-olpc-mesh.c
+++ b/src/devices/wifi/nm-device-olpc-mesh.c
@@ -197,8 +197,8 @@ _mesh_set_channel (NMDeviceOlpcMesh *self, guint32 channel)
{
int ifindex = nm_device_get_ifindex (NM_DEVICE (self));
- if (nm_platform_mesh_get_channel (ifindex) != channel) {
- if (nm_platform_mesh_set_channel (ifindex, channel))
+ if (nm_platform_mesh_get_channel (NM_PLATFORM_GET, ifindex) != channel) {
+ if (nm_platform_mesh_set_channel (NM_PLATFORM_GET, ifindex, channel))
g_object_notify (G_OBJECT (self), NM_DEVICE_OLPC_MESH_ACTIVE_CHANNEL);
}
}
@@ -224,7 +224,8 @@ act_stage2_config (NMDevice *device, NMDeviceStateReason *reason)
_mesh_set_channel (self, channel);
ssid = nm_setting_olpc_mesh_get_ssid (s_mesh);
- nm_platform_mesh_set_ssid (nm_device_get_ifindex (device),
+ nm_platform_mesh_set_ssid (NM_PLATFORM_GET,
+ nm_device_get_ifindex (device),
g_bytes_get_data (ssid, NULL),
g_bytes_get_size (ssid));
@@ -368,9 +369,9 @@ device_added_cb (NMManager *manager, NMDevice *other, gpointer user_data)
NMDeviceOlpcMeshPrivate *priv = NM_DEVICE_OLPC_MESH_GET_PRIVATE (self);
if (!priv->companion && check_companion (self, other)) {
- nm_device_state_changed (NM_DEVICE (self),
- NM_DEVICE_STATE_DISCONNECTED,
- NM_DEVICE_STATE_REASON_NONE);
+ nm_device_queue_recheck_available (NM_DEVICE (self),
+ NM_DEVICE_STATE_REASON_NONE,
+ NM_DEVICE_STATE_REASON_NONE);
nm_device_remove_pending_action (NM_DEVICE (self), "waiting for companion", TRUE);
}
}
@@ -398,9 +399,9 @@ find_companion (NMDeviceOlpcMesh *self)
/* Try to find the companion if it's already known to the NMManager */
for (list = nm_manager_get_devices (nm_manager_get ()); list ; list = g_slist_next (list)) {
if (check_companion (self, NM_DEVICE (list->data))) {
- nm_device_queue_state (NM_DEVICE (self),
- NM_DEVICE_STATE_DISCONNECTED,
- NM_DEVICE_STATE_REASON_NONE);
+ nm_device_queue_recheck_available (NM_DEVICE (self),
+ NM_DEVICE_STATE_REASON_NONE,
+ NM_DEVICE_STATE_REASON_NONE);
nm_device_remove_pending_action (NM_DEVICE (self), "waiting for companion", TRUE);
break;
}
@@ -453,7 +454,7 @@ constructor (GType type,
self = NM_DEVICE_OLPC_MESH (object);
- if (!nm_platform_wifi_get_capabilities (nm_device_get_ifindex (NM_DEVICE (self)), &caps)) {
+ if (!nm_platform_wifi_get_capabilities (NM_PLATFORM_GET, nm_device_get_ifindex (NM_DEVICE (self)), &caps)) {
_LOGW (LOGD_HW | LOGD_OLPC, "failed to initialize WiFi driver");
g_object_unref (object);
return NULL;
@@ -482,7 +483,7 @@ get_property (GObject *object, guint prop_id,
g_value_set_boxed (value, "/");
break;
case PROP_ACTIVE_CHANNEL:
- g_value_set_uint (value, nm_platform_mesh_get_channel (nm_device_get_ifindex (NM_DEVICE (device))));
+ g_value_set_uint (value, nm_platform_mesh_get_channel (NM_PLATFORM_GET, nm_device_get_ifindex (NM_DEVICE (device))));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c
index ce9a3f753..2e116f87d 100644
--- a/src/devices/wifi/nm-device-wifi.c
+++ b/src/devices/wifi/nm-device-wifi.c
@@ -26,13 +26,7 @@
#include <dbus/dbus.h>
#include <netinet/in.h>
#include <string.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <signal.h>
#include <unistd.h>
-#include <linux/sockios.h>
-#include <linux/ethtool.h>
-#include <sys/ioctl.h>
#include <errno.h>
#include "nm-glib-compat.h"
@@ -116,10 +110,7 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
struct _NMDeviceWifiPrivate {
- gboolean disposed;
-
- char * perm_hw_addr; /* Permanent MAC address */
- char * initial_hw_addr; /* Initial MAC address (as seen when NM starts) */
+ gboolean disposed;
gint8 invalid_strength_counter;
@@ -165,7 +156,7 @@ static void supplicant_iface_state_cb (NMSupplicantInterface *iface,
static void supplicant_iface_new_bss_cb (NMSupplicantInterface * iface,
const char *object_path,
- GHashTable *properties,
+ GVariant *properties,
NMDeviceWifi * self);
static void supplicant_iface_bss_updated_cb (NMSupplicantInterface *iface,
@@ -213,7 +204,8 @@ constructor (GType type,
self = NM_DEVICE_WIFI (object);
priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
- if (!nm_platform_wifi_get_capabilities (nm_device_get_ifindex (NM_DEVICE (self)),
+ if (!nm_platform_wifi_get_capabilities (NM_PLATFORM_GET,
+ nm_device_get_ifindex (NM_DEVICE (self)),
&priv->capabilities)) {
_LOGW (LOGD_HW | LOGD_WIFI, "failed to initialize WiFi driver");
g_object_unref (object);
@@ -362,21 +354,21 @@ find_active_ap (NMDeviceWifi *self,
NM80211Mode devmode;
guint32 devfreq;
- nm_platform_wifi_get_bssid (ifindex, bssid);
+ nm_platform_wifi_get_bssid (NM_PLATFORM_GET, ifindex, bssid);
_LOGD (LOGD_WIFI, "active BSSID: %02x:%02x:%02x:%02x:%02x:%02x",
bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
if (!nm_ethernet_address_is_valid (bssid, ETH_ALEN))
return NULL;
- ssid = nm_platform_wifi_get_ssid (ifindex);
+ ssid = nm_platform_wifi_get_ssid (NM_PLATFORM_GET, ifindex);
_LOGD (LOGD_WIFI, "active SSID: %s%s%s",
ssid ? "'" : "",
ssid ? nm_utils_escape_ssid (ssid->data, ssid->len) : "(none)",
ssid ? "'" : "");
- devmode = nm_platform_wifi_get_mode (ifindex);
- devfreq = nm_platform_wifi_get_frequency (ifindex);
+ devmode = nm_platform_wifi_get_mode (NM_PLATFORM_GET, ifindex);
+ devfreq = nm_platform_wifi_get_frequency (NM_PLATFORM_GET, ifindex);
/* When matching hidden APs, do a second pass that ignores the SSID check,
* because NM might not yet know the SSID of the hidden AP in the scan list
@@ -591,7 +583,7 @@ periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap)
if (priv->current_ap && (nm_ap_get_mode (priv->current_ap) == NM_802_11_MODE_ADHOC)) {
guint8 bssid[ETH_ALEN] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
- nm_platform_wifi_get_bssid (ifindex, bssid);
+ nm_platform_wifi_get_bssid (NM_PLATFORM_GET, ifindex, bssid);
/* 0x02 means "locally administered" and should be OR-ed into
* the first byte of IBSS BSSIDs.
*/
@@ -607,7 +599,7 @@ periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap)
/* Try to smooth out the strength. Atmel cards, for example, will give no strength
* one second and normal strength the next.
*/
- percent = nm_platform_wifi_get_quality (ifindex);
+ percent = nm_platform_wifi_get_quality (NM_PLATFORM_GET, ifindex);
if (percent >= 0 || ++priv->invalid_strength_counter > 3) {
nm_ap_set_strength (new_ap, (gint8) percent);
priv->invalid_strength_counter = 0;
@@ -639,7 +631,7 @@ periodic_update (NMDeviceWifi *self, NMAccessPoint *ignore_ap)
set_current_ap (self, new_ap, TRUE, FALSE);
}
- new_rate = nm_platform_wifi_get_rate (ifindex);
+ new_rate = nm_platform_wifi_get_rate (NM_PLATFORM_GET, ifindex);
if (new_rate != priv->rate) {
priv->rate = new_rate;
g_object_notify (G_OBJECT (self), NM_DEVICE_WIFI_BITRATE);
@@ -738,18 +730,18 @@ deactivate (NMDevice *device)
set_current_ap (self, NULL, TRUE, FALSE);
/* Clear any critical protocol notification in the Wi-Fi stack */
- nm_platform_wifi_indicate_addressing_running (ifindex, FALSE);
+ nm_platform_wifi_indicate_addressing_running (NM_PLATFORM_GET, ifindex, FALSE);
/* Reset MAC address back to initial address */
- if (priv->initial_hw_addr)
- nm_device_set_hw_addr (device, priv->initial_hw_addr, "reset", LOGD_WIFI);
+ if (nm_device_get_initial_hw_address (device))
+ nm_device_set_hw_addr (device, nm_device_get_initial_hw_address (device), "reset", LOGD_WIFI);
/* Ensure we're in infrastructure mode after deactivation; some devices
* (usually older ones) don't scan well in adhoc mode.
*/
- if (nm_platform_wifi_get_mode (ifindex) != NM_802_11_MODE_INFRA) {
+ if (nm_platform_wifi_get_mode (NM_PLATFORM_GET, ifindex) != NM_802_11_MODE_INFRA) {
nm_device_take_down (NM_DEVICE (self), TRUE);
- nm_platform_wifi_set_mode (ifindex, NM_802_11_MODE_INFRA);
+ nm_platform_wifi_set_mode (NM_PLATFORM_GET, ifindex, NM_802_11_MODE_INFRA);
nm_device_bring_up (NM_DEVICE (self), TRUE, NULL);
}
@@ -806,6 +798,7 @@ check_connection_compatible (NMDevice *device, NMConnection *connection)
const char * const *mac_blacklist;
int i;
const char *mode;
+ const char *perm_hw_addr;
if (!NM_DEVICE_CLASS (nm_device_wifi_parent_class)->check_connection_compatible (device, connection))
return FALSE;
@@ -820,21 +813,25 @@ check_connection_compatible (NMDevice *device, NMConnection *connection)
if (!s_wireless)
return FALSE;
+ perm_hw_addr = nm_device_get_permanent_hw_address (device);
mac = nm_setting_wireless_get_mac_address (s_wireless);
- if (mac && !nm_utils_hwaddr_matches (mac, -1, priv->perm_hw_addr, -1))
- return FALSE;
-
- /* Check for MAC address blacklist */
- mac_blacklist = nm_setting_wireless_get_mac_address_blacklist (s_wireless);
- for (i = 0; mac_blacklist[i]; i++) {
- if (!nm_utils_hwaddr_valid (mac_blacklist[i], ETH_ALEN)) {
- g_warn_if_reached ();
+ if (perm_hw_addr) {
+ if (mac && !nm_utils_hwaddr_matches (mac, -1, perm_hw_addr, -1))
return FALSE;
- }
- if (nm_utils_hwaddr_matches (mac_blacklist[i], -1, priv->perm_hw_addr, -1))
- return FALSE;
- }
+ /* Check for MAC address blacklist */
+ mac_blacklist = nm_setting_wireless_get_mac_address_blacklist (s_wireless);
+ for (i = 0; mac_blacklist[i]; i++) {
+ if (!nm_utils_hwaddr_valid (mac_blacklist[i], ETH_ALEN)) {
+ g_warn_if_reached ();
+ return FALSE;
+ }
+
+ if (nm_utils_hwaddr_matches (mac_blacklist[i], -1, perm_hw_addr, -1))
+ return FALSE;
+ }
+ } else if (mac)
+ return FALSE;
if (is_adhoc_wpa (connection))
return FALSE;
@@ -970,6 +967,7 @@ complete_connection (NMDevice *device,
GBytes *setting_ssid = NULL;
GSList *iter;
gboolean hidden = FALSE;
+ const char *perm_hw_addr;
s_wifi = nm_connection_get_setting_wireless (connection);
s_wsec = nm_connection_get_setting_wireless_security (connection);
@@ -1105,29 +1103,31 @@ complete_connection (NMDevice *device,
if (hidden)
g_object_set (s_wifi, NM_SETTING_WIRELESS_HIDDEN, TRUE, NULL);
- setting_mac = nm_setting_wireless_get_mac_address (s_wifi);
- if (setting_mac) {
- /* Make sure the setting MAC (if any) matches the device's permanent MAC */
- if (!nm_utils_hwaddr_matches (setting_mac, -1, priv->perm_hw_addr, -1)) {
- g_set_error_literal (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("connection does not match device"));
- g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_MAC_ADDRESS);
- return FALSE;
- }
- } else {
- guint8 perm_hw_addr[ETH_ALEN];
+ perm_hw_addr = nm_device_get_permanent_hw_address (device);
+ if (perm_hw_addr) {
+ setting_mac = nm_setting_wireless_get_mac_address (s_wifi);
+ if (setting_mac) {
+ /* Make sure the setting MAC (if any) matches the device's permanent MAC */
+ if (!nm_utils_hwaddr_matches (setting_mac, -1, perm_hw_addr, -1)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("connection does not match device"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_WIRELESS_MAC_ADDRESS);
+ return FALSE;
+ }
+ } else {
+ guint8 tmp[ETH_ALEN];
- /* Lock the connection to this device by default if it uses a
- * permanent MAC address (ie not a 'locally administered' one)
- */
- nm_utils_hwaddr_aton (priv->perm_hw_addr, perm_hw_addr, ETH_ALEN);
- if ( !(perm_hw_addr[0] & 0x02)
- && !nm_utils_hwaddr_matches (perm_hw_addr, ETH_ALEN, NULL, ETH_ALEN)) {
- g_object_set (G_OBJECT (s_wifi),
- NM_SETTING_WIRELESS_MAC_ADDRESS, priv->perm_hw_addr,
- NULL);
+ /* Lock the connection to this device by default if it uses a
+ * permanent MAC address (ie not a 'locally administered' one)
+ */
+ nm_utils_hwaddr_aton (perm_hw_addr, tmp, ETH_ALEN);
+ if (!(tmp[0] & 0x02)) {
+ g_object_set (G_OBJECT (s_wifi),
+ NM_SETTING_WIRELESS_MAC_ADDRESS, perm_hw_addr,
+ NULL);
+ }
}
}
@@ -1832,7 +1832,7 @@ schedule_scanlist_cull (NMDeviceWifi *self)
static void
supplicant_iface_new_bss_cb (NMSupplicantInterface *iface,
const char *object_path,
- GHashTable *properties,
+ GVariant *properties,
NMDeviceWifi *self)
{
NMDeviceState state;
@@ -2148,6 +2148,7 @@ supplicant_iface_state_cb (NMSupplicantInterface *iface,
NMDevice *device = NM_DEVICE (self);
NMDeviceState devstate;
gboolean scanning;
+ gboolean recheck_available = FALSE;
if (new_state == old_state)
return;
@@ -2167,23 +2168,9 @@ supplicant_iface_state_cb (NMSupplicantInterface *iface,
switch (new_state) {
case NM_SUPPLICANT_INTERFACE_STATE_READY:
+ _LOGD (LOGD_WIFI_SCAN, "supplicant ready");
+ recheck_available = TRUE;
priv->scan_interval = SCAN_INTERVAL_MIN;
-
- /* If the interface can now be activated because the supplicant is now
- * available, transition to DISCONNECTED.
- */
- if ((devstate == NM_DEVICE_STATE_UNAVAILABLE) && nm_device_is_available (device, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE)) {
- nm_device_state_changed (device,
- NM_DEVICE_STATE_DISCONNECTED,
- NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE);
- }
-
- _LOGD (LOGD_WIFI_SCAN, "supplicant ready, requesting initial scan");
-
- /* Request a scan to get latest results */
- cancel_pending_scan (self);
- request_wireless_scan (self);
-
if (old_state < NM_SUPPLICANT_INTERFACE_STATE_READY)
nm_device_remove_pending_action (device, "waiting for supplicant", TRUE);
break;
@@ -2243,6 +2230,7 @@ supplicant_iface_state_cb (NMSupplicantInterface *iface,
}
break;
case NM_SUPPLICANT_INTERFACE_STATE_DOWN:
+ recheck_available = TRUE;
cleanup_association_attempt (self, FALSE);
if (old_state < NM_SUPPLICANT_INTERFACE_STATE_READY)
@@ -2255,15 +2243,17 @@ supplicant_iface_state_cb (NMSupplicantInterface *iface,
*/
supplicant_interface_release (self);
supplicant_interface_acquire (self);
-
- nm_device_state_changed (device,
- NM_DEVICE_STATE_UNAVAILABLE,
- NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
break;
default:
break;
}
+ if (recheck_available) {
+ nm_device_queue_recheck_available (NM_DEVICE (device),
+ NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE,
+ NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED);
+ }
+
/* Signal scanning state changes */
if ( new_state == NM_SUPPLICANT_INTERFACE_STATE_SCANNING
|| old_state == NM_SUPPLICANT_INTERFACE_STATE_SCANNING)
@@ -2507,62 +2497,6 @@ error:
/****************************************************************************/
-static void
-update_permanent_hw_address (NMDevice *device)
-{
- NMDeviceWifi *self = NM_DEVICE_WIFI (device);
- NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
- struct ifreq req;
- struct ethtool_perm_addr *epaddr = NULL;
- int fd, ret, errsv;
-
- g_return_if_fail (priv->perm_hw_addr == NULL);
-
- fd = socket (PF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
- _LOGE (LOGD_HW, "could not open control socket.");
- return;
- }
-
- /* Get permanent MAC address */
- memset (&req, 0, sizeof (struct ifreq));
- strncpy (req.ifr_name, nm_device_get_iface (device), IFNAMSIZ);
-
- epaddr = g_malloc0 (sizeof (struct ethtool_perm_addr) + ETH_ALEN);
- epaddr->cmd = ETHTOOL_GPERMADDR;
- epaddr->size = ETH_ALEN;
- req.ifr_data = (void *) epaddr;
-
- errno = 0;
- ret = ioctl (fd, SIOCETHTOOL, &req);
- errsv = errno;
- if ((ret < 0) || !nm_ethernet_address_is_valid (epaddr->data, ETH_ALEN)) {
- _LOGD (LOGD_HW | LOGD_ETHER, "unable to read permanent MAC address (error %d)",
- errsv);
- /* Fall back to current address */
- nm_utils_hwaddr_aton (nm_device_get_hw_address (device), epaddr->data, ETH_ALEN);
- }
-
- priv->perm_hw_addr = nm_utils_hwaddr_ntoa (epaddr->data, ETH_ALEN);
-
- g_free (epaddr);
- close (fd);
-}
-
-static void
-update_initial_hw_address (NMDevice *device)
-{
- NMDeviceWifi *self = NM_DEVICE_WIFI (device);
- NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
-
- /* This sets initial MAC address from current MAC address. It should only
- * be called from NMDevice constructor() to really get the initial address.
- */
- priv->initial_hw_addr = g_strdup (nm_device_get_hw_address (device));
-
- _LOGD (LOGD_DEVICE | LOGD_ETHER, "read initial MAC address %s", priv->initial_hw_addr);
-}
-
static NMActStageReturn
act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
{
@@ -2687,9 +2621,9 @@ ensure_hotspot_frequency (NMDeviceWifi *self,
return;
if (g_strcmp0 (band, "a") == 0)
- freq = nm_platform_wifi_find_frequency (nm_device_get_ifindex (NM_DEVICE (self)), a_freqs);
+ freq = nm_platform_wifi_find_frequency (NM_PLATFORM_GET, nm_device_get_ifindex (NM_DEVICE (self)), a_freqs);
else
- freq = nm_platform_wifi_find_frequency (nm_device_get_ifindex (NM_DEVICE (self)), bg_freqs);
+ freq = nm_platform_wifi_find_frequency (NM_PLATFORM_GET, nm_device_get_ifindex (NM_DEVICE (self)), bg_freqs);
if (!freq)
freq = (g_strcmp0 (band, "a") == 0) ? 5180 : 2462;
@@ -2823,7 +2757,7 @@ act_stage3_ip4_config_start (NMDevice *device,
/* Indicate that a critical protocol is about to start */
if (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) == 0)
- nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), TRUE);
+ nm_platform_wifi_indicate_addressing_running (NM_PLATFORM_GET, nm_device_get_ifindex (device), TRUE);
return NM_DEVICE_CLASS (nm_device_wifi_parent_class)->act_stage3_ip4_config_start (device, out_config, reason);
}
@@ -2846,7 +2780,7 @@ act_stage3_ip6_config_start (NMDevice *device,
/* Indicate that a critical protocol is about to start */
if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) == 0 ||
strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP) == 0)
- nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), TRUE);
+ nm_platform_wifi_indicate_addressing_running (NM_PLATFORM_GET, nm_device_get_ifindex (device), TRUE);
return NM_DEVICE_CLASS (nm_device_wifi_parent_class)->act_stage3_ip6_config_start (device, out_config, reason);
}
@@ -2998,7 +2932,7 @@ activation_success_handler (NMDevice *device)
g_assert (connection);
/* Clear any critical protocol notification in the wifi stack */
- nm_platform_wifi_indicate_addressing_running (ifindex, FALSE);
+ nm_platform_wifi_indicate_addressing_running (NM_PLATFORM_GET, ifindex, FALSE);
/* Clear wireless secrets tries on success */
g_object_set_data (G_OBJECT (connection), WIRELESS_SECRETS_TRIES, NULL);
@@ -3017,16 +2951,16 @@ activation_success_handler (NMDevice *device)
* But if activation was successful, the card will know the BSSID. Grab
* the BSSID off the card and fill in the BSSID of the activation AP.
*/
- nm_platform_wifi_get_bssid (ifindex, bssid);
+ nm_platform_wifi_get_bssid (NM_PLATFORM_GET, ifindex, bssid);
if (!nm_ap_get_address (ap)) {
char *bssid_str = nm_utils_hwaddr_ntoa (bssid, ETH_ALEN);
nm_ap_set_address (ap, bssid_str);
g_free (bssid_str);
}
if (!nm_ap_get_freq (ap))
- nm_ap_set_freq (ap, nm_platform_wifi_get_frequency (ifindex));
+ nm_ap_set_freq (ap, nm_platform_wifi_get_frequency (NM_PLATFORM_GET, ifindex));
if (!nm_ap_get_max_bitrate (ap))
- nm_ap_set_max_bitrate (ap, nm_platform_wifi_get_rate (ifindex));
+ nm_ap_set_max_bitrate (ap, nm_platform_wifi_get_rate (NM_PLATFORM_GET, ifindex));
tmp_ap = find_active_ap (self, ap, TRUE);
if (tmp_ap) {
@@ -3076,7 +3010,7 @@ activation_failure_handler (NMDevice *device)
g_object_set_data (G_OBJECT (connection), WIRELESS_SECRETS_TRIES, NULL);
/* Clear any critical protocol notification in the wifi stack */
- nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), FALSE);
+ nm_platform_wifi_indicate_addressing_running (NM_PLATFORM_GET, nm_device_get_ifindex (device), FALSE);
}
static void
@@ -3126,7 +3060,7 @@ device_state_changed (NMDevice *device,
break;
case NM_DEVICE_STATE_IP_CHECK:
/* Clear any critical protocol notification in the wifi stack */
- nm_platform_wifi_indicate_addressing_running (nm_device_get_ifindex (device), FALSE);
+ nm_platform_wifi_indicate_addressing_running (NM_PLATFORM_GET, nm_device_get_ifindex (device), FALSE);
break;
case NM_DEVICE_STATE_ACTIVATED:
activation_success_handler (device);
@@ -3253,12 +3187,6 @@ dispose (GObject *object)
static void
finalize (GObject *object)
{
- NMDeviceWifi *self = NM_DEVICE_WIFI (object);
- NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self);
-
- g_free (priv->perm_hw_addr);
- g_free (priv->initial_hw_addr);
-
G_OBJECT_CLASS (nm_device_wifi_parent_class)->finalize (object);
}
@@ -3273,7 +3201,7 @@ get_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_PERM_HW_ADDRESS:
- g_value_set_string (value, priv->perm_hw_addr);
+ g_value_set_string (value, nm_device_get_permanent_hw_address (NM_DEVICE (device)));
break;
case PROP_MODE:
g_value_set_uint (value, priv->mode);
@@ -3332,8 +3260,6 @@ nm_device_wifi_class_init (NMDeviceWifiClass *klass)
object_class->finalize = finalize;
parent_class->bring_up = bring_up;
- parent_class->update_permanent_hw_address = update_permanent_hw_address;
- parent_class->update_initial_hw_address = update_initial_hw_address;
parent_class->can_auto_connect = can_auto_connect;
parent_class->is_available = is_available;
parent_class->check_connection_compatible = check_connection_compatible;
diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c
index 66d73563f..d70dd9a6d 100644
--- a/src/devices/wifi/nm-wifi-ap.c
+++ b/src/devices/wifi/nm-wifi-ap.c
@@ -30,6 +30,7 @@
#include "nm-utils.h"
#include "nm-logging.h"
#include "nm-dbus-manager.h"
+#include "nm-core-internal.h"
#include "nm-setting-wireless.h"
#include "nm-glib-compat.h"
@@ -330,163 +331,134 @@ nm_ap_new (void)
}
static NM80211ApSecurityFlags
-pair_to_flags (const char *str)
+security_from_vardict (GVariant *security)
{
- g_return_val_if_fail (str != NULL, NM_802_11_AP_SEC_NONE);
+ NM80211ApSecurityFlags flags = NM_802_11_AP_SEC_NONE;
+ const char **array, *tmp;
- if (strcmp (str, "tkip") == 0)
- return NM_802_11_AP_SEC_PAIR_TKIP;
- if (strcmp (str, "ccmp") == 0)
- return NM_802_11_AP_SEC_PAIR_CCMP;
- return NM_802_11_AP_SEC_NONE;
-}
+ g_return_val_if_fail (g_variant_is_of_type (security, G_VARIANT_TYPE_VARDICT), NM_802_11_AP_SEC_NONE);
-static NM80211ApSecurityFlags
-group_to_flags (const char *str)
-{
- g_return_val_if_fail (str != NULL, NM_802_11_AP_SEC_NONE);
-
- if (strcmp (str, "wep40") == 0)
- return NM_802_11_AP_SEC_GROUP_WEP40;
- if (strcmp (str, "wep104") == 0)
- return NM_802_11_AP_SEC_GROUP_WEP104;
- if (strcmp (str, "tkip") == 0)
- return NM_802_11_AP_SEC_GROUP_TKIP;
- if (strcmp (str, "ccmp") == 0)
- return NM_802_11_AP_SEC_GROUP_CCMP;
- return NM_802_11_AP_SEC_NONE;
-}
-
-static NM80211ApSecurityFlags
-security_from_dict (GHashTable *security)
-{
- GValue *value;
- NM80211ApSecurityFlags flags = NM_802_11_AP_SEC_NONE;
- const char **items, **iter;
-
- value = g_hash_table_lookup (security, "KeyMgmt");
- if (value) {
- items = g_value_get_boxed (value);
- for (iter = items; iter && *iter; iter++) {
- if (strcmp (*iter, "wpa-psk") == 0)
- flags |= NM_802_11_AP_SEC_KEY_MGMT_PSK;
- else if (strcmp (*iter, "wpa-eap") == 0)
- flags |= NM_802_11_AP_SEC_KEY_MGMT_802_1X;
- }
+ if (g_variant_lookup (security, "KeyMgmt", "^a&s", &array)) {
+ if (_nm_utils_string_in_list ("wpa-psk", array))
+ flags |= NM_802_11_AP_SEC_KEY_MGMT_PSK;
+ if (_nm_utils_string_in_list ("wpa-eap", array))
+ flags |= NM_802_11_AP_SEC_KEY_MGMT_802_1X;
+ g_free (array);
}
- value = g_hash_table_lookup (security, "Pairwise");
- if (value) {
- items = g_value_get_boxed (value);
- for (iter = items; iter && *iter; iter++)
- flags |= pair_to_flags (*iter);
+ if (g_variant_lookup (security, "Pairwise", "^a&s", &array)) {
+ if (_nm_utils_string_in_list ("tkip", array))
+ flags |= NM_802_11_AP_SEC_PAIR_TKIP;
+ if (_nm_utils_string_in_list ("ccmp", array))
+ flags |= NM_802_11_AP_SEC_PAIR_CCMP;
+ g_free (array);
}
- value = g_hash_table_lookup (security, "Group");
- if (value)
- flags |= group_to_flags (g_value_get_string (value));
+ if (g_variant_lookup (security, "Group", "&s", &tmp)) {
+ if (strcmp (tmp, "wep40") == 0)
+ flags |= NM_802_11_AP_SEC_GROUP_WEP40;
+ if (strcmp (tmp, "wep104") == 0)
+ flags |= NM_802_11_AP_SEC_GROUP_WEP104;
+ if (strcmp (tmp, "tkip") == 0)
+ flags |= NM_802_11_AP_SEC_GROUP_TKIP;
+ if (strcmp (tmp, "ccmp") == 0)
+ flags |= NM_802_11_AP_SEC_GROUP_CCMP;
+ }
return flags;
}
-static void
-foreach_property_cb (gpointer key, gpointer value, gpointer user_data)
-{
- GValue *variant = (GValue *) value;
- NMAccessPoint *ap = (NMAccessPoint *) user_data;
-
- if (G_VALUE_HOLDS_BOXED (variant)) {
- GArray *array = g_value_get_boxed (variant);
-
- if (!strcmp (key, "SSID")) {
- guint32 len = MIN (32, array->len);
-
- /* Stupid ieee80211 layer uses <hidden> */
- if (((len == 8) || (len == 9))
- && (memcmp (array->data, "<hidden>", 8) == 0))
- return;
-
- if (nm_utils_is_empty_ssid ((const guint8 *) array->data, len))
- return;
-
- nm_ap_set_ssid (ap, (const guint8 *) array->data, len);
- } else if (!strcmp (key, "BSSID")) {
- char *addr;
-
- if (array->len != ETH_ALEN)
- return;
- addr = nm_utils_hwaddr_ntoa (array->data, array->len);
- nm_ap_set_address (ap, addr);
- g_free (addr);
- } else if (!strcmp (key, "Rates")) {
- guint32 maxrate = 0;
- int i;
-
- /* Find the max AP rate */
- for (i = 0; i < array->len; i++) {
- guint32 r = g_array_index (array, guint32, i);
-
- if (r > maxrate) {
- maxrate = r;
- nm_ap_set_max_bitrate (ap, r / 1000);
- }
- }
- } else if (!strcmp (key, "WPA")) {
- NM80211ApSecurityFlags flags = nm_ap_get_wpa_flags (ap);
-
- flags |= security_from_dict (g_value_get_boxed (variant));
- nm_ap_set_wpa_flags (ap, flags);
- } else if (!strcmp (key, "RSN")) {
- NM80211ApSecurityFlags flags = nm_ap_get_rsn_flags (ap);
-
- flags |= security_from_dict (g_value_get_boxed (variant));
- nm_ap_set_rsn_flags (ap, flags);
- }
- } else if (G_VALUE_HOLDS_UINT (variant)) {
- guint32 val = g_value_get_uint (variant);
-
- if (!strcmp (key, "Frequency"))
- nm_ap_set_freq (ap, val);
- } else if (G_VALUE_HOLDS_INT (variant)) {
- gint val = g_value_get_int (variant);
-
- if (!strcmp (key, "Signal"))
- nm_ap_set_strength (ap, nm_ap_utils_level_to_quality (val));
- } else if (G_VALUE_HOLDS_STRING (variant)) {
- const char *val = g_value_get_string (variant);
-
- if (val && !strcmp (key, "Mode")) {
- if (strcmp (val, "infrastructure") == 0)
- nm_ap_set_mode (ap, NM_802_11_MODE_INFRA);
- else if (strcmp (val, "ad-hoc") == 0)
- nm_ap_set_mode (ap, NM_802_11_MODE_ADHOC);
- }
- } else if (G_VALUE_HOLDS_BOOLEAN (variant)) {
- gboolean val = g_value_get_boolean (variant);
-
- if (strcmp (key, "Privacy") == 0) {
- if (val) {
- NM80211ApFlags flags = nm_ap_get_flags (ap);
- nm_ap_set_flags (ap, flags | NM_802_11_AP_FLAGS_PRIVACY);
- }
- }
- }
-}
-
NMAccessPoint *
-nm_ap_new_from_properties (const char *supplicant_path, GHashTable *properties)
+nm_ap_new_from_properties (const char *supplicant_path, GVariant *properties)
{
- NMAccessPoint *ap;
- const char *addr;
const char bad_bssid1[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
const char bad_bssid2[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+ const char *addr;
+ const guint8 *bytes;
+ NMAccessPoint *ap;
+ GVariant *v;
+ gsize len;
+ gboolean b = FALSE;
+ const char *s;
+ gint16 i16;
+ guint16 u16;
g_return_val_if_fail (properties != NULL, NULL);
ap = nm_ap_new ();
g_object_freeze_notify (G_OBJECT (ap));
- g_hash_table_foreach (properties, foreach_property_cb, ap);
+
+ if (g_variant_lookup (properties, "Privacy", "b", &b) && b)
+ nm_ap_set_flags (ap, nm_ap_get_flags (ap) | NM_802_11_AP_FLAGS_PRIVACY);
+
+ if (g_variant_lookup (properties, "Mode", "&s", &s)) {
+ if (!g_strcmp0 (s, "infrastructure"))
+ nm_ap_set_mode (ap, NM_802_11_MODE_INFRA);
+ else if (!g_strcmp0 (s, "ad-hoc"))
+ nm_ap_set_mode (ap, NM_802_11_MODE_ADHOC);
+ }
+
+ if (g_variant_lookup (properties, "Signal", "n", &i16))
+ nm_ap_set_strength (ap, nm_ap_utils_level_to_quality (i16));
+
+ if (g_variant_lookup (properties, "Frequency", "q", &u16))
+ nm_ap_set_freq (ap, u16);
+
+ v = g_variant_lookup_value (properties, "SSID", G_VARIANT_TYPE_BYTESTRING);
+ if (v) {
+ bytes = g_variant_get_fixed_array (v, &len, 1);
+ len = MIN (32, len);
+
+ /* Stupid ieee80211 layer uses <hidden> */
+ if ( bytes && len
+ && !(((len == 8) || (len == 9)) && !memcmp (bytes, "<hidden>", 8))
+ && !nm_utils_is_empty_ssid (bytes, len))
+ nm_ap_set_ssid (ap, bytes, len);
+
+ g_variant_unref (v);
+ }
+
+ v = g_variant_lookup_value (properties, "BSSID", G_VARIANT_TYPE_BYTESTRING);
+ if (v) {
+ bytes = g_variant_get_fixed_array (v, &len, 1);
+ if (len == ETH_ALEN) {
+ char *a;
+
+ a = nm_utils_hwaddr_ntoa (bytes, len);
+ nm_ap_set_address (ap, a);
+ g_free (a);
+ }
+ g_variant_unref (v);
+ }
+
+ v = g_variant_lookup_value (properties, "Rates", G_VARIANT_TYPE ("au"));
+ if (v) {
+ const guint32 *rates = g_variant_get_fixed_array (v, &len, sizeof (guint32));
+ guint32 maxrate = 0;
+ int i;
+
+ /* Find the max AP rate */
+ for (i = 0; i < len; i++) {
+ if (rates[i] > maxrate) {
+ maxrate = rates[i];
+ nm_ap_set_max_bitrate (ap, rates[i] / 1000);
+ }
+ }
+ g_variant_unref (v);
+ }
+
+ v = g_variant_lookup_value (properties, "WPA", G_VARIANT_TYPE_VARDICT);
+ if (v) {
+ nm_ap_set_wpa_flags (ap, nm_ap_get_wpa_flags (ap) | security_from_vardict (v));
+ g_variant_unref (v);
+ }
+
+ v = g_variant_lookup_value (properties, "RSN", G_VARIANT_TYPE_VARDICT);
+ if (v) {
+ nm_ap_set_rsn_flags (ap, nm_ap_get_rsn_flags (ap) | security_from_vardict (v));
+ g_variant_unref (v);
+ }
nm_ap_set_supplicant_path (ap, supplicant_path);
diff --git a/src/devices/wifi/nm-wifi-ap.h b/src/devices/wifi/nm-wifi-ap.h
index 0abb28fcc..8ad9acb71 100644
--- a/src/devices/wifi/nm-wifi-ap.h
+++ b/src/devices/wifi/nm-wifi-ap.h
@@ -56,7 +56,7 @@ typedef struct {
GType nm_ap_get_type (void);
NMAccessPoint * nm_ap_new_from_properties (const char *supplicant_path,
- GHashTable *properties);
+ GVariant *properties);
NMAccessPoint * nm_ap_new_fake_from_connection (NMConnection *connection);
void nm_ap_export_to_dbus (NMAccessPoint *ap);
diff --git a/src/devices/wifi/nm-wifi-factory.c b/src/devices/wifi/nm-wifi-factory.c
index 4093c6123..c4b4042e7 100644
--- a/src/devices/wifi/nm-wifi-factory.c
+++ b/src/devices/wifi/nm-wifi-factory.c
@@ -23,6 +23,8 @@
#include <gmodule.h>
#include "nm-device-factory.h"
+#include "nm-setting-wireless.h"
+#include "nm-setting-olpc-mesh.h"
#include "nm-device-wifi.h"
#include "nm-device-olpc-mesh.h"
#include "nm-settings-connection.h"
@@ -57,26 +59,25 @@ nm_device_factory_create (GError **error)
/**************************************************************************/
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
if (plink->type == NM_LINK_TYPE_WIFI)
return nm_device_wifi_new (plink);
else if (plink->type == NM_LINK_TYPE_OLPC_MESH)
return nm_device_olpc_mesh_new (plink);
- return NULL;
+ g_assert_not_reached ();
}
-static NMDeviceType
-get_device_type (NMDeviceFactory *factory)
-{
- return NM_DEVICE_TYPE_WIFI;
-}
+NM_DEVICE_FACTORY_DECLARE_TYPES (
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_WIFI, NM_LINK_TYPE_OLPC_MESH)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_WIRELESS_SETTING_NAME, NM_SETTING_OLPC_MESH_SETTING_NAME)
+)
static void
device_factory_interface_init (NMDeviceFactory *factory_iface)
{
factory_iface->new_link = new_link;
- factory_iface->get_device_type = get_device_type;
+ factory_iface->get_supported_types = get_supported_types;
}
static void
diff --git a/src/devices/wifi/tests/Makefile.in b/src/devices/wifi/tests/Makefile.in
index e3b7c767f..f807ee771 100644
--- a/src/devices/wifi/tests/Makefile.in
+++ b/src/devices/wifi/tests/Makefile.in
@@ -204,13 +204,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -324,6 +507,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -492,7 +676,7 @@ test_wifi_ap_utils_LDADD = $(top_builddir)/src/libNetworkManager.la
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -653,98 +837,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-wifi-ap-utils.log: test-wifi-ap-utils$(EXEEXT)
+ @p='test-wifi-ap-utils$(EXEEXT)'; \
+ b='test-wifi-ap-utils'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -801,6 +1055,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -896,7 +1153,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/devices/wimax/Makefile.in b/src/devices/wimax/Makefile.in
index 32800fb7b..8ad4b4e29 100644
--- a/src/devices/wimax/Makefile.in
+++ b/src/devices/wimax/Makefile.in
@@ -221,6 +221,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -334,6 +335,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/devices/wimax/nm-wimax-factory.c b/src/devices/wimax/nm-wimax-factory.c
index 39e9a2873..7dc580fc9 100644
--- a/src/devices/wimax/nm-wimax-factory.c
+++ b/src/devices/wimax/nm-wimax-factory.c
@@ -25,6 +25,7 @@
#include "nm-device-factory.h"
#include "nm-device-wimax.h"
#include "nm-platform.h"
+#include "nm-setting-wimax.h"
#define NM_TYPE_WIMAX_FACTORY (nm_wimax_factory_get_type ())
#define NM_WIMAX_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_WIMAX_FACTORY, NMWimaxFactory))
@@ -55,7 +56,7 @@ nm_device_factory_create (GError **error)
/**************************************************************************/
static NMDevice *
-new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
/* FIXME: check udev 'DEVTYPE' instead; but since we only support Intel
* WiMAX devices for now this is appropriate.
@@ -66,17 +67,16 @@ new_link (NMDeviceFactory *factory, NMPlatformLink *plink, GError **error)
return (NMDevice *) nm_device_wimax_new (plink);
}
-static NMDeviceType
-get_device_type (NMDeviceFactory *factory)
-{
- return NM_DEVICE_TYPE_WIMAX;
-}
+NM_DEVICE_FACTORY_DECLARE_TYPES (
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_WIMAX)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_WIMAX_SETTING_NAME)
+)
static void
device_factory_interface_init (NMDeviceFactory *factory_iface)
{
factory_iface->new_link = new_link;
- factory_iface->get_device_type = get_device_type;
+ factory_iface->get_supported_types = get_supported_types;
}
static void
diff --git a/src/devices/wimax/nm-wimax-util.h b/src/devices/wimax/nm-wimax-util.h
index a1852d553..5fedc6e80 100644
--- a/src/devices/wimax/nm-wimax-util.h
+++ b/src/devices/wimax/nm-wimax-util.h
@@ -23,7 +23,7 @@
#include <glib.h>
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
NM_PRAGMA_WARNING_DISABLE("-Wstrict-prototypes")
#include <WiMaxType.h>
diff --git a/src/devices/wwan/Makefile.in b/src/devices/wwan/Makefile.in
index 1a8aef3b6..227c622fc 100644
--- a/src/devices/wwan/Makefile.in
+++ b/src/devices/wwan/Makefile.in
@@ -232,6 +232,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -345,6 +346,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/devices/wwan/nm-device-modem.c b/src/devices/wwan/nm-device-modem.c
index f819d1d77..ca724c046 100644
--- a/src/devices/wwan/nm-device-modem.c
+++ b/src/devices/wwan/nm-device-modem.c
@@ -300,19 +300,9 @@ modem_state_cb (NMModem *modem,
nm_device_recheck_available_connections (device);
}
- if ((dev_state >= NM_DEVICE_STATE_DISCONNECTED) && !nm_device_is_available (device, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE)) {
- nm_device_state_changed (device,
- NM_DEVICE_STATE_UNAVAILABLE,
- NM_DEVICE_STATE_REASON_MODEM_FAILED);
- return;
- }
-
- if ((dev_state == NM_DEVICE_STATE_UNAVAILABLE) && nm_device_is_available (device, NM_DEVICE_CHECK_DEV_AVAILABLE_NONE)) {
- nm_device_state_changed (device,
- NM_DEVICE_STATE_DISCONNECTED,
- NM_DEVICE_STATE_REASON_MODEM_AVAILABLE);
- return;
- }
+ nm_device_queue_recheck_available (device,
+ NM_DEVICE_STATE_REASON_MODEM_AVAILABLE,
+ NM_DEVICE_STATE_REASON_MODEM_FAILED);
}
static void
@@ -376,12 +366,24 @@ device_state_changed (NMDevice *device,
}
}
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *device)
{
return NM_DEVICE_CAP_IS_NON_KERNEL;
}
+static const char *
+get_type_description (NMDevice *device)
+{
+ NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (device);
+
+ if (NM_FLAGS_HAS (priv->current_caps, NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS))
+ return "gsm";
+ if (NM_FLAGS_HAS (priv->current_caps, NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO))
+ return "cdma";
+ return NM_DEVICE_CLASS (nm_device_modem_parent_class)->get_type_description (device);
+}
+
static gboolean
check_connection_compatible (NMDevice *device, NMConnection *connection)
{
@@ -751,6 +753,7 @@ nm_device_modem_class_init (NMDeviceModemClass *mclass)
object_class->constructed = constructed;
device_class->get_generic_capabilities = get_generic_capabilities;
+ device_class->get_type_description = get_type_description;
device_class->check_connection_compatible = check_connection_compatible;
device_class->check_connection_available = check_connection_available;
device_class->complete_connection = complete_connection;
diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c
index 69eaddf3c..3385a6fd3 100644
--- a/src/devices/wwan/nm-modem.c
+++ b/src/devices/wwan/nm-modem.c
@@ -32,6 +32,7 @@
#include "nm-device-private.h"
#include "nm-dbus-glib-types.h"
#include "nm-modem-enum-types.h"
+#include "nm-route-manager.h"
G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT)
@@ -615,7 +616,7 @@ nm_modem_ip4_pre_commit (NMModem *modem,
g_assert (address);
if (address->plen == 32)
- nm_platform_link_set_noarp (nm_device_get_ip_ifindex (device));
+ nm_platform_link_set_noarp (NM_PLATFORM_GET, nm_device_get_ip_ifindex (device));
}
}
@@ -912,9 +913,9 @@ deactivate_cleanup (NMModem *self, NMDevice *device)
priv->ip6_method == NM_MODEM_IP_METHOD_AUTO) {
ifindex = nm_device_get_ip_ifindex (device);
if (ifindex > 0) {
- nm_platform_route_flush (ifindex);
- nm_platform_address_flush (ifindex);
- nm_platform_link_set_down (ifindex);
+ nm_route_manager_route_flush (nm_route_manager_get (), ifindex);
+ nm_platform_address_flush (NM_PLATFORM_GET, ifindex);
+ nm_platform_link_set_down (NM_PLATFORM_GET, ifindex);
}
}
}
diff --git a/src/devices/wwan/nm-wwan-factory.c b/src/devices/wwan/nm-wwan-factory.c
index 2b9c3d4dd..49b0b0af5 100644
--- a/src/devices/wwan/nm-wwan-factory.c
+++ b/src/devices/wwan/nm-wwan-factory.c
@@ -25,9 +25,12 @@
#include "nm-device-factory.h"
#include "nm-wwan-factory.h"
+#include "nm-setting-gsm.h"
+#include "nm-setting-cdma.h"
#include "nm-modem-manager.h"
#include "nm-device-modem.h"
#include "nm-logging.h"
+#include "nm-platform.h"
static GType nm_wwan_factory_get_type (void);
@@ -87,10 +90,17 @@ modem_added_cb (NMModemManager *manager,
}
-static NMDeviceType
-get_device_type (NMDeviceFactory *factory)
+NM_DEVICE_FACTORY_DECLARE_TYPES (
+ NM_DEVICE_FACTORY_DECLARE_LINK_TYPES (NM_LINK_TYPE_WWAN_ETHERNET)
+ NM_DEVICE_FACTORY_DECLARE_SETTING_TYPES (NM_SETTING_GSM_SETTING_NAME, NM_SETTING_CDMA_SETTING_NAME)
+)
+
+static NMDevice *
+new_link (NMDeviceFactory *factory, NMPlatformLink *plink, gboolean *out_ignore, GError **error)
{
- return NM_DEVICE_TYPE_MODEM;
+ g_warn_if_fail (plink->type == NM_LINK_TYPE_WWAN_ETHERNET);
+ *out_ignore = TRUE;
+ return NULL;
}
static void
@@ -115,7 +125,8 @@ nm_wwan_factory_init (NMWwanFactory *self)
static void
device_factory_interface_init (NMDeviceFactory *factory_iface)
{
- factory_iface->get_device_type = get_device_type;
+ factory_iface->get_supported_types = get_supported_types;
+ factory_iface->new_link = new_link;
factory_iface->start = start;
}
diff --git a/src/dhcp-manager/Makefile.in b/src/dhcp-manager/Makefile.in
index a609e8c6c..8c6e059ce 100644
--- a/src/dhcp-manager/Makefile.in
+++ b/src/dhcp-manager/Makefile.in
@@ -218,6 +218,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -331,6 +332,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index a39ffcca0..eb3173307 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -590,9 +590,10 @@ nm_dhcp_client_stop_existing (const char *pid_file, const char *binary_name)
if ((errno == 0) && (tmp > 1)) {
guint64 start_time;
const char *exe;
+ pid_t ppid;
/* Ensure the process is a DHCP client */
- start_time = nm_utils_get_start_time_for_pid (tmp);
+ start_time = nm_utils_get_start_time_for_pid (tmp, NULL, &ppid);
proc_path = g_strdup_printf ("/proc/%ld/cmdline", tmp);
if ( start_time
&& g_file_get_contents (proc_path, &proc_contents, NULL, NULL)) {
@@ -602,9 +603,15 @@ nm_dhcp_client_stop_existing (const char *pid_file, const char *binary_name)
else
exe = proc_contents;
- if (!strcmp (exe, binary_name))
- nm_utils_kill_process_sync (tmp, start_time, SIGTERM, LOGD_DHCP,
- "dhcp-client", 1000 / 2, 1000 / 20);
+ if (!strcmp (exe, binary_name)) {
+ if (ppid == getpid ()) {
+ /* the process is our own child. */
+ nm_utils_kill_child_sync (tmp, SIGTERM, LOGD_DHCP, "dhcp-client", NULL, 1000 / 2, 1000 / 20);
+ } else {
+ nm_utils_kill_process_sync (tmp, start_time, SIGTERM, LOGD_DHCP,
+ "dhcp-client", 1000 / 2, 1000 / 20, 2000);
+ }
+ }
}
}
diff --git a/src/dhcp-manager/nm-dhcp-dhclient-utils.c b/src/dhcp-manager/nm-dhcp-dhclient-utils.c
index d1fe0c304..41ce53548 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient-utils.c
+++ b/src/dhcp-manager/nm-dhcp-dhclient-utils.c
@@ -32,7 +32,7 @@
#include "nm-platform.h"
#include "NetworkManagerUtils.h"
#include "gsystem-local-alloc.h"
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
#define CLIENTID_TAG "send dhcp-client-identifier"
diff --git a/src/dhcp-manager/nm-dhcp-dhclient.c b/src/dhcp-manager/nm-dhcp-dhclient.c
index 504e8d5d1..91515ddac 100644
--- a/src/dhcp-manager/nm-dhcp-dhclient.c
+++ b/src/dhcp-manager/nm-dhcp-dhclient.c
@@ -41,7 +41,6 @@
#include "nm-logging.h"
#include "nm-dhcp-dhclient-utils.h"
#include "nm-dhcp-manager.h"
-#include "nm-posix-signals.h"
#include "NetworkManagerUtils.h"
#include "nm-dhcp-listener.h"
#include "gsystem-local-alloc.h"
@@ -301,20 +300,6 @@ create_dhclient_config (const char *iface,
}
-static void
-dhclient_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for dhclient here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
static gboolean
dhclient_start (NMDhcpClient *client,
const char *mode_opt,
@@ -457,7 +442,7 @@ dhclient_start (NMDhcpClient *client,
if (g_spawn_async (NULL, (char **) argv->pdata, NULL,
G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
- &dhclient_child_setup, NULL, &pid, &error)) {
+ nm_utils_setpgid, NULL, &pid, &error)) {
g_assert (pid > 0);
nm_log_info (log_domain, "dhclient started with pid %d", pid);
if (release == FALSE)
diff --git a/src/dhcp-manager/nm-dhcp-dhcpcd.c b/src/dhcp-manager/nm-dhcp-dhcpcd.c
index e5a40c2fb..86aba4dac 100644
--- a/src/dhcp-manager/nm-dhcp-dhcpcd.c
+++ b/src/dhcp-manager/nm-dhcp-dhcpcd.c
@@ -37,7 +37,6 @@
#include "nm-dhcp-manager.h"
#include "nm-utils.h"
#include "nm-logging.h"
-#include "nm-posix-signals.h"
#include "NetworkManagerUtils.h"
#include "nm-dhcp-listener.h"
@@ -59,20 +58,6 @@ nm_dhcp_dhcpcd_get_path (void)
return path;
}
-static void
-dhcpcd_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for dhcpcd here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
static gboolean
ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last_ip4_address)
{
@@ -143,7 +128,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
if (g_spawn_async (NULL, (char **) argv->pdata, NULL,
G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
- &dhcpcd_child_setup, NULL, &pid, &error)) {
+ nm_utils_setpgid, NULL, &pid, &error)) {
g_assert (pid > 0);
nm_log_info (LOGD_DHCP4, "dhcpcd started with pid %d", pid);
nm_dhcp_client_watch_child (client, pid);
diff --git a/src/dhcp-manager/nm-dhcp-listener.c b/src/dhcp-manager/nm-dhcp-listener.c
index b995c3485..ca57ae595 100644
--- a/src/dhcp-manager/nm-dhcp-listener.c
+++ b/src/dhcp-manager/nm-dhcp-listener.c
@@ -31,6 +31,7 @@
#include <unistd.h>
#include "nm-dhcp-listener.h"
+#include "nm-core-internal.h"
#include "nm-logging.h"
#include "nm-dbus-manager.h"
#include "nm-dbus-glib-types.h"
@@ -132,7 +133,7 @@ handle_event (DBusGProxy *proxy,
}
pid_str = get_option (options, "pid");
- pid = nm_utils_ascii_str_to_int64 (pid_str, 10, 0, G_MAXINT32, -1);
+ pid = _nm_utils_ascii_str_to_int64 (pid_str, 10, 0, G_MAXINT32, -1);
if (pid == -1) {
nm_log_warn (LOGD_DHCP, "DHCP event: couldn't convert PID '%s' to an integer", pid_str ? pid_str : "(null)");
goto out;
@@ -193,16 +194,7 @@ dis_connection_cb (NMDBusManager *mgr,
/***************************************************/
-NMDhcpListener *
-nm_dhcp_listener_get (void)
-{
- static NMDhcpListener *singleton = NULL;
-
- if (G_UNLIKELY (singleton == NULL))
- singleton = g_object_new (NM_TYPE_DHCP_LISTENER, NULL);
- g_assert (singleton);
- return singleton;
-}
+NM_DEFINE_SINGLETON_GETTER (NMDhcpListener, nm_dhcp_listener_get, NM_TYPE_DHCP_LISTENER);
static void
nm_dhcp_listener_init (NMDhcpListener *self)
diff --git a/src/dhcp-manager/systemd-dhcp/nm-sd-adapt.h b/src/dhcp-manager/systemd-dhcp/nm-sd-adapt.h
index c316fb469..f8856a1bd 100644
--- a/src/dhcp-manager/systemd-dhcp/nm-sd-adapt.h
+++ b/src/dhcp-manager/systemd-dhcp/nm-sd-adapt.h
@@ -38,6 +38,11 @@
#include "nm-logging.h"
+/* Missing in Linux 3.2.0, in Ubuntu 12.04 */
+#ifndef BPF_XOR
+#define BPF_XOR 0xa0
+#endif
+
static inline guint32
_slog_level_to_nm (int slevel)
{
@@ -96,6 +101,15 @@ G_STMT_START { \
#define noreturn G_GNUC_NORETURN
+/*
+ * Some toolchains (E.G. uClibc 0.9.33 and earlier) don't export
+ * CLOCK_BOOTTIME even though the kernel supports it, so provide a
+ * local definition
+ */
+#ifndef CLOCK_BOOTTIME
+#define CLOCK_BOOTTIME 7
+#endif
+
#include "sd-id128.h"
#include "sparse-endian.h"
#include "async.h"
diff --git a/src/dhcp-manager/tests/Makefile.in b/src/dhcp-manager/tests/Makefile.in
index e0a155f16..6125aea8f 100644
--- a/src/dhcp-manager/tests/Makefile.in
+++ b/src/dhcp-manager/tests/Makefile.in
@@ -209,13 +209,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -329,6 +512,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -516,7 +700,7 @@ EXTRA_DIST = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -682,98 +866,175 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-dhcp-dhclient.log: test-dhcp-dhclient$(EXEEXT)
+ @p='test-dhcp-dhclient$(EXEEXT)'; \
+ b='test-dhcp-dhclient'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-dhcp-utils.log: test-dhcp-utils$(EXEEXT)
+ @p='test-dhcp-utils$(EXEEXT)'; \
+ b='test-dhcp-utils'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -830,6 +1091,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -925,7 +1189,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/dhcp-manager/tests/test-dhcp-dhclient.c b/src/dhcp-manager/tests/test-dhcp-dhclient.c
index e1a96cabf..459915e3e 100644
--- a/src/dhcp-manager/tests/test-dhcp-dhclient.c
+++ b/src/dhcp-manager/tests/test-dhcp-dhclient.c
@@ -32,7 +32,7 @@
#include "nm-utils.h"
#include "nm-ip4-config.h"
#include "nm-platform.h"
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
#define DEBUG 1
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c
index 2f8ceab55..f041c29eb 100644
--- a/src/dns-manager/nm-dns-manager.c
+++ b/src/dns-manager/nm-dns-manager.c
@@ -43,7 +43,6 @@
#include "nm-ip6-config.h"
#include "nm-logging.h"
#include "NetworkManagerUtils.h"
-#include "nm-posix-signals.h"
#include "nm-config.h"
#include "nm-dns-plugin.h"
@@ -87,6 +86,8 @@ typedef struct {
NMDnsManagerResolvConfMode resolv_conf_mode;
NMDnsPlugin *plugin;
+ NMConfig *config;
+
gboolean dns_touched;
} NMDnsManagerPrivate;
@@ -129,7 +130,7 @@ add_string_item (GPtrArray *array, const char *str)
static void
merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
{
- guint32 num, i;
+ guint32 num, num_domains, num_searches, i;
num = nm_ip4_config_get_num_nameservers (src);
for (i = 0; i < num; i++) {
@@ -137,18 +138,10 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (src, i), NULL));
}
- num = nm_ip4_config_get_num_domains (src);
- for (i = 0; i < num; i++) {
- const char *domain;
-
- domain = nm_ip4_config_get_domain (src, i);
- if (!DOMAIN_IS_VALID (domain))
- continue;
- add_string_item (rc->searches, domain);
- }
+ num_domains = nm_ip4_config_get_num_domains (src);
+ num_searches = nm_ip4_config_get_num_searches (src);
- num = nm_ip4_config_get_num_searches (src);
- for (i = 0; i < num; i++) {
+ for (i = 0; i < num_searches; i++) {
const char *search;
search = nm_ip4_config_get_search (src, i);
@@ -157,6 +150,17 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
add_string_item (rc->searches, search);
}
+ if (num_domains > 1 || !num_searches) {
+ for (i = 0; i < num_domains; i++) {
+ const char *domain;
+
+ domain = nm_ip4_config_get_domain (src, i);
+ if (!DOMAIN_IS_VALID (domain))
+ continue;
+ add_string_item (rc->searches, domain);
+ }
+ }
+
/* NIS stuff */
num = nm_ip4_config_get_num_nis_servers (src);
for (i = 0; i < num; i++) {
@@ -174,7 +178,7 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
static void
merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
{
- guint32 num, i;
+ guint32 num, num_domains, num_searches, i;
const char *iface;
iface = g_object_get_data (G_OBJECT (src), IP_CONFIG_IFACE_TAG);
@@ -199,18 +203,10 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
add_string_item (rc->nameservers, buf);
}
- num = nm_ip6_config_get_num_domains (src);
- for (i = 0; i < num; i++) {
- const char *domain;
+ num_domains = nm_ip6_config_get_num_domains (src);
+ num_searches = nm_ip6_config_get_num_searches (src);
- domain = nm_ip6_config_get_domain (src, i);
- if (!DOMAIN_IS_VALID (domain))
- continue;
- add_string_item (rc->searches, domain);
- }
-
- num = nm_ip6_config_get_num_searches (src);
- for (i = 0; i < num; i++) {
+ for (i = 0; i < num_searches; i++) {
const char *search;
search = nm_ip6_config_get_search (src, i);
@@ -218,6 +214,17 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
continue;
add_string_item (rc->searches, search);
}
+
+ if (num_domains > 1 || !num_searches) {
+ for (i = 0; i < num_domains; i++) {
+ const char *domain;
+
+ domain = nm_ip6_config_get_domain (src, i);
+ if (!DOMAIN_IS_VALID (domain))
+ continue;
+ add_string_item (rc->searches, domain);
+ }
+ }
}
@@ -225,19 +232,6 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
/**********************************/
/* SUSE */
-static void
-netconfig_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for netconfig here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
static GPid
run_netconfig (GError **error, gint *stdin_fd)
{
@@ -255,7 +249,7 @@ run_netconfig (GError **error, gint *stdin_fd)
nm_log_dbg (LOGD_DNS, "spawning '%s'", tmp);
g_free (tmp);
- if (!g_spawn_async_with_pipes (NULL, argv, NULL, 0, netconfig_child_setup,
+ if (!g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL,
NULL, &pid, stdin_fd, NULL, NULL, error))
return -1;
@@ -284,10 +278,10 @@ dispatch_netconfig (char **searches,
char *str;
GPid pid;
gint fd;
- int ret = 1;
+ int status;
pid = run_netconfig (error, &fd);
- if (pid < 0)
+ if (pid <= 0)
return FALSE;
/* NM is writing already-merged DNS information to netconfig, so it
@@ -320,24 +314,22 @@ dispatch_netconfig (char **searches,
close (fd);
/* Wait until the process exits */
+ if (!nm_utils_kill_child_sync (pid, 0, LOGD_DNS, "netconfig", &status, 1000, 0)) {
+ int errsv = errno;
- again:
-
- if (waitpid (pid, NULL, 0) < 0) {
- if (errno == EINTR)
- goto again;
- else if (errno == ECHILD) {
- /* child already exited */
- ret = pid;
- } else {
- g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- "Error waiting for netconfig to exit: %s",
- strerror (errno));
- ret = 0;
- }
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Error waiting for netconfig to exit: %s",
+ strerror (errsv));
+ return FALSE;
}
-
- return ret > 0;
+ if (!WIFEXITED (status) || WEXITSTATUS (status) != EXIT_SUCCESS) {
+ g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Error calling netconfig: %s %d",
+ WIFEXITED (status) ? "exited with status" : (WIFSIGNALED (status) ? "exited with signal" : "exited with unknown reason"),
+ WIFEXITED (status) ? WEXITSTATUS (status) : (WIFSIGNALED (status) ? WTERMSIG (status) : status));
+ return FALSE;
+ }
+ return TRUE;
}
#endif
@@ -782,13 +774,16 @@ update_dns (NMDnsManager *self,
#ifdef NETCONFIG_PATH
if (success == FALSE) {
+ g_clear_error (error);
success = dispatch_netconfig (searches, nameservers,
nis_domain, nis_servers, error);
}
#endif
- if (success == FALSE)
+ if (success == FALSE) {
+ g_clear_error (error);
success = update_resolv_conf (searches, nameservers, error);
+ }
/* signal that resolv.conf was changed */
if (success)
@@ -1099,6 +1094,8 @@ init_resolv_conf_mode (NMDnsManager *self)
const char *mode;
int fd, flags;
+ g_clear_object (&priv->plugin);
+
fd = open (_PATH_RESCONF, O_RDONLY);
if (fd != -1) {
if (ioctl (fd, FS_IOC_GETFLAGS, &flags) == -1)
@@ -1112,7 +1109,7 @@ init_resolv_conf_mode (NMDnsManager *self)
}
}
- mode = nm_config_get_dns_mode (nm_config_get ());
+ mode = nm_config_data_get_dns_mode (nm_config_get_data (priv->config));
if (!g_strcmp0 (mode, "none")) {
priv->resolv_conf_mode = NM_DNS_MANAGER_RESOLV_CONF_UNMANAGED;
nm_log_info (LOGD_DNS, "DNS: not managing " _PATH_RESCONF);
@@ -1127,6 +1124,34 @@ init_resolv_conf_mode (NMDnsManager *self)
if (mode && g_strcmp0 (mode, "default") != 0)
nm_log_warn (LOGD_DNS, "Unknown DNS mode '%s'", mode);
}
+
+ if (priv->plugin) {
+ nm_log_info (LOGD_DNS, "DNS: loaded plugin %s", nm_dns_plugin_get_name (priv->plugin));
+ g_signal_connect (priv->plugin, NM_DNS_PLUGIN_FAILED, G_CALLBACK (plugin_failed), self);
+ g_signal_connect (priv->plugin, NM_DNS_PLUGIN_CHILD_QUIT, G_CALLBACK (plugin_child_quit), self);
+ }
+}
+
+static void
+config_changed_cb (NMConfig *config,
+ NMConfigData *config_data,
+ NMConfigChangeFlags changes,
+ NMConfigData *old_data,
+ NMDnsManager *self)
+{
+ GError *error = NULL;
+
+ if (NM_FLAGS_HAS (changes, NM_CONFIG_CHANGE_DNS_MODE))
+ init_resolv_conf_mode (self);
+
+ if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_SIGHUP |
+ NM_CONFIG_CHANGE_SIGUSR1 |
+ NM_CONFIG_CHANGE_DNS_MODE)) {
+ if (!update_dns (self, TRUE, &error)) {
+ nm_log_warn (LOGD_DNS, "could not commit DNS changes: %s", error->message);
+ g_clear_error (&error);
+ }
+ }
}
static void
@@ -1137,13 +1162,12 @@ nm_dns_manager_init (NMDnsManager *self)
/* Set the initial hash */
compute_hash (self, NM_DNS_MANAGER_GET_PRIVATE (self)->hash);
+ priv->config = g_object_ref (nm_config_get ());
+ g_signal_connect (G_OBJECT (priv->config),
+ NM_CONFIG_SIGNAL_CONFIG_CHANGED,
+ G_CALLBACK (config_changed_cb),
+ self);
init_resolv_conf_mode (self);
-
- if (priv->plugin) {
- nm_log_info (LOGD_DNS, "DNS: loaded plugin %s", nm_dns_plugin_get_name (priv->plugin));
- g_signal_connect (priv->plugin, NM_DNS_PLUGIN_FAILED, G_CALLBACK (plugin_failed), self);
- g_signal_connect (priv->plugin, NM_DNS_PLUGIN_CHILD_QUIT, G_CALLBACK (plugin_child_quit), self);
- }
}
static void
@@ -1170,6 +1194,11 @@ dispose (GObject *object)
priv->dns_touched = FALSE;
}
+ if (priv->config) {
+ g_signal_handlers_disconnect_by_func (priv->config, config_changed_cb, self);
+ g_clear_object (&priv->config);
+ }
+
g_slist_free_full (priv->configs, g_object_unref);
priv->configs = NULL;
diff --git a/src/dns-manager/nm-dns-plugin.c b/src/dns-manager/nm-dns-plugin.c
index c684464e5..5b95d1c50 100644
--- a/src/dns-manager/nm-dns-plugin.c
+++ b/src/dns-manager/nm-dns-plugin.c
@@ -28,7 +28,6 @@
#include "nm-dns-plugin.h"
#include "nm-logging.h"
-#include "nm-posix-signals.h"
#include "NetworkManagerUtils.h"
typedef struct {
@@ -136,20 +135,6 @@ watch_cb (GPid pid, gint status, gpointer user_data)
g_signal_emit (self, signals[CHILD_QUIT], 0, status);
}
-static void
-child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for DNS plugin here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
GPid
nm_dns_plugin_child_spawn (NMDnsPlugin *self,
const char **argv,
@@ -183,8 +168,8 @@ nm_dns_plugin_child_spawn (NMDnsPlugin *self,
priv->pid = 0;
if (g_spawn_async (NULL, (char **) argv, NULL,
G_SPAWN_DO_NOT_REAP_CHILD,
- child_setup,
- NULL, &priv->pid,
+ nm_utils_setpgid, NULL,
+ &priv->pid,
&error)) {
nm_log_dbg (LOGD_DNS, "%s started with pid %d", priv->progname, priv->pid);
priv->watch_id = g_child_watch_add (priv->pid, (GChildWatchFunc) watch_cb, self);
diff --git a/src/dnsmasq-manager/nm-dnsmasq-manager.c b/src/dnsmasq-manager/nm-dnsmasq-manager.c
index 2f38ea710..a85631bcb 100644
--- a/src/dnsmasq-manager/nm-dnsmasq-manager.c
+++ b/src/dnsmasq-manager/nm-dnsmasq-manager.c
@@ -32,7 +32,6 @@
#include "nm-dnsmasq-utils.h"
#include "nm-logging.h"
#include "nm-glib-compat.h"
-#include "nm-posix-signals.h"
#include "nm-utils.h"
#include "NetworkManagerUtils.h"
@@ -297,20 +296,6 @@ create_dm_cmd_line (const char *iface,
}
static void
-dm_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for dnsmasq here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
-static void
kill_existing_for_iface (const char *iface, const char *pidfile)
{
char *contents = NULL;
@@ -374,9 +359,9 @@ nm_dnsmasq_manager_start (NMDnsMasqManager *manager,
priv->pid = 0;
if (!g_spawn_async (NULL, (char **) dm_cmd->array->pdata, NULL,
- G_SPAWN_DO_NOT_REAP_CHILD,
- dm_child_setup,
- NULL, &priv->pid, error)) {
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ nm_utils_setpgid, NULL,
+ &priv->pid, error)) {
goto out;
}
diff --git a/src/dnsmasq-manager/tests/Makefile.in b/src/dnsmasq-manager/tests/Makefile.in
index c21629db0..8e6bb12ee 100644
--- a/src/dnsmasq-manager/tests/Makefile.in
+++ b/src/dnsmasq-manager/tests/Makefile.in
@@ -203,13 +203,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -323,6 +506,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -488,7 +672,7 @@ test_dnsmasq_utils_LDADD = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -619,98 +803,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-dnsmasq-utils.log: test-dnsmasq-utils$(EXEEXT)
+ @p='test-dnsmasq-utils$(EXEEXT)'; \
+ b='test-dnsmasq-utils'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -767,6 +1021,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -862,7 +1119,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/main-utils.c b/src/main-utils.c
index c4d0eeb90..b0d8df3ef 100644
--- a/src/main-utils.c
+++ b/src/main-utils.c
@@ -31,103 +31,63 @@
#include <glib.h>
#include <glib/gi18n.h>
+#include <glib-unix.h>
#include <gmodule.h>
+#include "nm-glib-compat.h"
+
#include "gsystem-local-alloc.h"
#include "main-utils.h"
-#include "nm-posix-signals.h"
#include "NetworkManagerUtils.h"
#include "nm-logging.h"
-static sigset_t signal_set;
-static gboolean *quit_early = NULL;
+static gboolean
+sighup_handler (gpointer user_data)
+{
+ nm_main_config_reload (GPOINTER_TO_INT (user_data));
+ return G_SOURCE_CONTINUE;
+}
-/*
- * Thread function waiting for signals and processing them.
- * Wait for signals in signal set. The semantics of sigwait() require that all
- * threads (including the thread calling sigwait()) have the signal masked, for
- * reliable operation. Otherwise, a signal that arrives while this thread is
- * not blocked in sigwait() might be delivered to another thread.
- */
-static void *
-signal_handling_thread (void *arg)
+static gboolean
+sigint_handler (gpointer user_data)
{
- GMainLoop *main_loop = arg;
- int signo;
-
- while (1) {
- sigwait (&signal_set, &signo);
-
- switch (signo) {
- case SIGINT:
- case SIGTERM:
- nm_log_info (LOGD_CORE, "caught signal %d, shutting down normally.", signo);
- *quit_early = TRUE; /* for quitting before entering the main loop */
- g_main_loop_quit (main_loop);
- break;
- case SIGHUP:
- /* Reread config stuff like system config files, VPN service files, etc */
- nm_log_info (LOGD_CORE, "caught signal %d, not supported yet.", signo);
- break;
- case SIGPIPE:
- /* silently ignore signal */
- break;
- default:
- nm_log_err (LOGD_CORE, "caught unexpected signal %d", signo);
- break;
- }
- }
- return NULL;
+ GMainLoop *main_loop = user_data;
+
+ nm_log_info (LOGD_CORE, "caught SIGINT, shutting down normally.");
+ g_main_loop_quit (main_loop);
+
+ return G_SOURCE_REMOVE;
+}
+
+static gboolean
+sigterm_handler (gpointer user_data)
+{
+ GMainLoop *main_loop = user_data;
+
+ nm_log_info (LOGD_CORE, "caught SIGTERM, shutting down normally.");
+ g_main_loop_quit (main_loop);
+
+ return G_SOURCE_REMOVE;
}
/**
* nm_main_utils_setup_signals:
* @main_loop: the #GMainLoop to quit when SIGINT or SIGTERM is received
- * @quit_early: location of a variable that will be set to TRUE when
- * SIGINT or SIGTERM is received
*
- * Mask the signals we are interested in and create a signal handling thread.
- * Because all threads inherit the signal mask from their creator, all threads
- * in the process will have the signals masked. That's why setup_signals() has
- * to be called before creating other threads.
- *
- * Returns: %TRUE on success
+ * Sets up signal handling for NetworkManager.
*/
-gboolean
-nm_main_utils_setup_signals (GMainLoop *main_loop, gboolean *quit_early_ptr)
+void
+nm_main_utils_setup_signals (GMainLoop *main_loop)
{
- pthread_t signal_thread_id;
- sigset_t old_sig_mask;
- int status;
-
- g_return_val_if_fail (main_loop != NULL, FALSE);
- g_return_val_if_fail (quit_early_ptr != NULL, FALSE);
-
- quit_early = quit_early_ptr;
-
- sigemptyset (&signal_set);
- sigaddset (&signal_set, SIGHUP);
- sigaddset (&signal_set, SIGINT);
- sigaddset (&signal_set, SIGTERM);
- sigaddset (&signal_set, SIGPIPE);
+ g_return_if_fail (main_loop != NULL);
- /* Block all signals of interest. */
- status = pthread_sigmask (SIG_BLOCK, &signal_set, &old_sig_mask);
- if (status != 0) {
- fprintf (stderr, _("Failed to set signal mask: %d"), status);
- return FALSE;
- }
- /* Save original mask so that we could use it for child processes. */
- nm_save_original_signal_mask (old_sig_mask);
-
- /* Create the signal handling thread. */
- status = pthread_create (&signal_thread_id, NULL, signal_handling_thread, main_loop);
- if (status != 0) {
- fprintf (stderr, _("Failed to create signal handling thread: %d"), status);
- return FALSE;
- }
+ signal (SIGPIPE, SIG_IGN);
- return TRUE;
+ g_unix_signal_add (SIGHUP, sighup_handler, GINT_TO_POINTER (SIGHUP));
+ g_unix_signal_add (SIGUSR1, sighup_handler, GINT_TO_POINTER (SIGUSR1));
+ g_unix_signal_add (SIGUSR2, sighup_handler, GINT_TO_POINTER (SIGUSR2));
+ g_unix_signal_add (SIGINT, sigint_handler, main_loop);
+ g_unix_signal_add (SIGTERM, sigterm_handler, main_loop);
}
gboolean
@@ -231,7 +191,8 @@ nm_main_utils_early_setup (const char *progname,
int *argc,
char **argv[],
GOptionEntry *options,
- GOptionEntry *more_options,
+ void (*option_context_hook) (gpointer user_data, GOptionContext *opt_ctx),
+ gpointer option_context_hook_data,
const char *summary)
{
GOptionContext *opt_ctx = NULL;
@@ -276,9 +237,9 @@ nm_main_utils_early_setup (const char *progname,
g_option_context_set_ignore_unknown_options (opt_ctx, FALSE);
g_option_context_set_help_enabled (opt_ctx, TRUE);
g_option_context_add_main_entries (opt_ctx, options, NULL);
- if (more_options)
- g_option_context_add_main_entries (opt_ctx, more_options, NULL);
g_option_context_set_summary (opt_ctx, summary);
+ if (option_context_hook)
+ option_context_hook (option_context_hook_data, opt_ctx);
success = g_option_context_parse (opt_ctx, argc, argv, &error);
if (!success) {
diff --git a/src/main-utils.h b/src/main-utils.h
index 1fceb3500..495502953 100644
--- a/src/main-utils.h
+++ b/src/main-utils.h
@@ -25,7 +25,7 @@
void nm_main_utils_ensure_root (void);
-gboolean nm_main_utils_setup_signals (GMainLoop *main_loop, gboolean *quit_early_ptr);
+void nm_main_utils_setup_signals (GMainLoop *main_loop);
void nm_main_utils_ensure_rundir (void);
@@ -37,7 +37,13 @@ gboolean nm_main_utils_early_setup (const char *progname,
int *argc,
char **argv[],
GOptionEntry *options,
- GOptionEntry *more_options,
+ void (*option_context_hook) (gpointer user_data, GOptionContext *opt_ctx),
+ gpointer option_context_hook_data,
const char *summary);
+/* The following functions are not implemented inside nm-main-utils.c, instead
+ * main.c and nm-iface-helper.c */
+
+void nm_main_config_reload (int signal);
+
#endif /* __MAIN_UTILS_H__ */
diff --git a/src/main.c b/src/main.c
index 53e829cd7..dfc307b5d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -54,7 +54,6 @@
#include "nm-vpn-manager.h"
#include "nm-logging.h"
#include "nm-config.h"
-#include "nm-posix-signals.h"
#include "nm-session-monitor.h"
#include "nm-dispatcher.h"
#include "nm-settings.h"
@@ -69,7 +68,7 @@
#define NM_DEFAULT_SYSTEM_STATE_FILE NMSTATEDIR "/NetworkManager.state"
static GMainLoop *main_loop = NULL;
-static gboolean quit_early = FALSE;
+static gboolean configure_and_quit = FALSE;
static struct {
gboolean show_version;
@@ -164,7 +163,7 @@ parse_state_file (const char *filename,
}
static void
-_set_g_fatal_warnings ()
+_set_g_fatal_warnings (void)
{
GLogLevelFlags fatal_mask;
@@ -208,16 +207,29 @@ _init_nm_debug (const char *debug)
_set_g_fatal_warnings ();
}
+void
+nm_main_config_reload (int signal)
+{
+ nm_log_info (LOGD_CORE, "reload configuration (signal %s)...", strsignal (signal));
+ /* The signal handler thread is only installed after
+ * creating NMConfig instance, and on shut down we
+ * no longer run the mainloop (to reach this point).
+ *
+ * Hence, a NMConfig singleton instance must always be
+ * available. */
+ nm_config_reload (nm_config_get (), signal);
+}
+
static void
manager_configure_quit (NMManager *manager, gpointer user_data)
{
nm_log_info (LOGD_CORE, "quitting now that startup is complete");
g_main_loop_quit (main_loop);
- quit_early = TRUE;
+ configure_and_quit = TRUE;
}
static void
-do_early_setup (int *argc, char **argv[])
+do_early_setup (int *argc, char **argv[], NMConfigCmdLineOptions *config_cli)
{
GOptionEntry options[] = {
{ "version", 'V', 0, G_OPTION_ARG_NONE, &global_opt.show_version, N_("Print NetworkManager version and exit"), NULL },
@@ -228,17 +240,19 @@ do_early_setup (int *argc, char **argv[])
N_("Log domains separated by ',': any combination of [%s]"),
"PLATFORM,RFKILL,WIFI" },
{ "g-fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &global_opt.g_fatal_warnings, N_("Make all warnings fatal"), NULL },
- { "pid-file", 'p', 0, G_OPTION_ARG_FILENAME, &global_opt.pidfile, N_("Specify the location of a PID file"), N_("filename") },
- { "state-file", 0, 0, G_OPTION_ARG_FILENAME, &global_opt.state_file, N_("State file location"), N_("/path/to/state.file") },
+ { "pid-file", 'p', 0, G_OPTION_ARG_FILENAME, &global_opt.pidfile, N_("Specify the location of a PID file"), N_(NM_DEFAULT_PID_FILE) },
+ { "state-file", 0, 0, G_OPTION_ARG_FILENAME, &global_opt.state_file, N_("State file location"), N_(NM_DEFAULT_SYSTEM_STATE_FILE) },
{ "run-from-build-dir", 0, 0, G_OPTION_ARG_NONE, &global_opt.run_from_build_dir, "Run from build directory", NULL },
{NULL}
};
+ config_cli = nm_config_cmd_line_options_new ();
if (!nm_main_utils_early_setup ("NetworkManager",
argc,
argv,
options,
- nm_config_get_options (),
+ (void (*)(gpointer, GOptionContext *)) nm_config_cmd_line_options_add_to_entries,
+ config_cli,
_("NetworkManager monitors all network connections and automatically\nchooses the best connection to use. It also allows the user to\nspecify wireless access points which wireless cards in the computer\nshould associate with.")))
exit (1);
@@ -267,6 +281,7 @@ main (int argc, char *argv[])
GError *error = NULL;
gboolean wrote_pidfile = FALSE;
char *bad_domains = NULL;
+ NMConfigCmdLineOptions *config_cli;
#if !GLIB_CHECK_VERSION (2, 35, 0)
g_type_init ();
@@ -276,7 +291,8 @@ main (int argc, char *argv[])
main_loop = g_main_loop_new (NULL, FALSE);
- do_early_setup (&argc, &argv);
+ config_cli = nm_config_cmd_line_options_new ();
+ do_early_setup (&argc, &argv, config_cli);
if (global_opt.g_fatal_warnings)
_set_g_fatal_warnings ();
@@ -338,7 +354,9 @@ main (int argc, char *argv[])
}
/* Read the config file and CLI overrides */
- config = nm_config_new (&error);
+ config = nm_config_setup (config_cli, &error);
+ nm_config_cmd_line_options_free (config_cli);
+ config_cli = NULL;
if (config == NULL) {
fprintf (stderr, _("Failed to read configuration: (%d) %s\n"),
error ? error->code : -1,
@@ -381,8 +399,7 @@ main (int argc, char *argv[])
}
/* Set up unix signal handling - before creating threads, but after daemonizing! */
- if (!nm_main_utils_setup_signals (main_loop, &quit_early))
- exit (1);
+ nm_main_utils_setup_signals (main_loop);
nm_logging_syslog_openlog (global_opt.debug);
@@ -405,8 +422,9 @@ main (int argc, char *argv[])
*/
dbus_glib_global_set_disable_legacy_property_access ();
- nm_log_info (LOGD_CORE, "Read config: %s", nm_config_get_description (config));
- nm_log_info (LOGD_CORE, "WEXT support is %s",
+ nm_log_info (LOGD_CORE, "Read config: %s", nm_config_data_get_config_description (nm_config_get_data (config)));
+ nm_config_data_log (nm_config_get_data (config), "CONFIG: ");
+ nm_log_dbg (LOGD_CORE, "WEXT support is %s",
#if HAVE_WEXT
"enabled"
#else
@@ -493,12 +511,11 @@ main (int argc, char *argv[])
* physical interfaces.
*/
nm_log_dbg (LOGD_CORE, "setting up local loopback");
- nm_platform_link_set_up (nm_platform_link_get_ifindex ("lo"));
+ nm_platform_link_set_up (NM_PLATFORM_GET, 1, NULL);
success = TRUE;
- /* Told to quit before getting to the mainloop by the signal handler */
- if (!quit_early)
+ if (configure_and_quit == FALSE)
g_main_loop_run (main_loop);
nm_manager_stop (manager);
diff --git a/src/nm-activation-request.c b/src/nm-activation-request.c
index 30ce75152..2c084b874 100644
--- a/src/nm-activation-request.c
+++ b/src/nm-activation-request.c
@@ -35,7 +35,6 @@
#include "nm-device.h"
#include "nm-active-connection.h"
#include "nm-settings-connection.h"
-#include "nm-posix-signals.h"
#include "nm-auth-subject.h"
G_DEFINE_TYPE (NMActRequest, nm_act_request, NM_TYPE_ACTIVE_CONNECTION)
@@ -196,16 +195,6 @@ clear_share_rules (NMActRequest *req)
priv->share_rules = NULL;
}
-static void
-share_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- nm_unblock_posix_signals (NULL);
-}
-
void
nm_act_request_set_shared (NMActRequest *req, gboolean shared)
{
@@ -243,7 +232,7 @@ nm_act_request_set_shared (NMActRequest *req, gboolean shared)
nm_log_info (LOGD_SHARING, "Executing: %s", cmd);
if (!g_spawn_sync ("/", argv, envp, G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
- share_child_setup, NULL, NULL, NULL, &status, &error)) {
+ NULL, NULL, NULL, NULL, &status, &error)) {
nm_log_warn (LOGD_SHARING, "Error executing command: (%d) %s",
error ? error->code : -1,
(error && error->message) ? error->message : "(unknown)");
diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c
index d0b5b8753..d40d571e8 100644
--- a/src/nm-active-connection.c
+++ b/src/nm-active-connection.c
@@ -515,6 +515,7 @@ master_state_cb (NMActiveConnection *master,
gpointer user_data)
{
NMActiveConnection *self = NM_ACTIVE_CONNECTION (user_data);
+ NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
NMActiveConnectionState master_state = nm_active_connection_get_state (master);
check_master_ready (self);
@@ -522,8 +523,8 @@ master_state_cb (NMActiveConnection *master,
nm_log_dbg (LOGD_DEVICE, "(%p): master ActiveConnection [%p] state now '%s' (%d)",
self, master, state_to_string (master_state), master_state);
- if (master_state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATING &&
- nm_active_connection_get_device (master) == NULL) {
+ if ( master_state >= NM_ACTIVE_CONNECTION_STATE_DEACTIVATING
+ && !priv->master_ready) {
/* Master failed without ever creating its device */
if (NM_ACTIVE_CONNECTION_GET_CLASS (self)->master_failed)
NM_ACTIVE_CONNECTION_GET_CLASS (self)->master_failed (self);
diff --git a/src/nm-auth-subject.c b/src/nm-auth-subject.c
index 13133f277..c67424e78 100644
--- a/src/nm-auth-subject.c
+++ b/src/nm-auth-subject.c
@@ -360,7 +360,7 @@ constructed (GObject *object)
if (!priv->unix_process.dbus_sender || !*priv->unix_process.dbus_sender)
break;
- priv->unix_process.start_time = nm_utils_get_start_time_for_pid (priv->unix_process.pid);
+ priv->unix_process.start_time = nm_utils_get_start_time_for_pid (priv->unix_process.pid, NULL, NULL);
if (!priv->unix_process.start_time) {
/* could not detect the process start time. The subject is invalid, but don't
diff --git a/src/nm-config-data.c b/src/nm-config-data.c
new file mode 100644
index 000000000..dc20064b1
--- /dev/null
+++ b/src/nm-config-data.c
@@ -0,0 +1,744 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2011 Red Hat, Inc.
+ * Copyright (C) 2013 Thomas Bechtold <thomasbechtold@jpberlin.de>
+ */
+
+#include "nm-config-data.h"
+
+#include <string.h>
+
+#include "nm-config.h"
+#include "nm-device.h"
+#include "gsystem-local-alloc.h"
+#include "nm-core-internal.h"
+#include "nm-keyfile-internal.h"
+#include "nm-macros-internal.h"
+#include "nm-logging.h"
+
+typedef struct {
+ char *group_name;
+ gboolean stop_match;
+ struct {
+ /* have a separate boolean field @has, because a @spec with
+ * value %NULL does not necessarily mean, that the property
+ * "match-device" was unspecified. */
+ gboolean has;
+ GSList *spec;
+ } match_device;
+} ConnectionInfo;
+
+typedef struct {
+ char *config_main_file;
+ char *config_description;
+
+ GKeyFile *keyfile;
+
+ /* A zero-terminated list of pre-processed information from the
+ * [connection] sections. This is to speed up lookup. */
+ ConnectionInfo *connection_infos;
+
+ struct {
+ char *uri;
+ char *response;
+ guint interval;
+ } connectivity;
+
+ struct {
+ char **arr;
+ GSList *specs;
+ GSList *specs_config;
+ } no_auto_default;
+
+ GSList *ignore_carrier;
+ GSList *assume_ipv6ll_only;
+
+ char *dns_mode;
+} NMConfigDataPrivate;
+
+
+enum {
+ PROP_0,
+ PROP_CONFIG_MAIN_FILE,
+ PROP_CONFIG_DESCRIPTION,
+ PROP_KEYFILE,
+ PROP_CONNECTIVITY_URI,
+ PROP_CONNECTIVITY_INTERVAL,
+ PROP_CONNECTIVITY_RESPONSE,
+ PROP_NO_AUTO_DEFAULT,
+
+ LAST_PROP
+};
+
+G_DEFINE_TYPE (NMConfigData, nm_config_data, G_TYPE_OBJECT)
+
+#define NM_CONFIG_DATA_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CONFIG_DATA, NMConfigDataPrivate))
+
+/************************************************************************/
+
+const char *
+nm_config_data_get_config_main_file (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->config_main_file;
+}
+
+const char *
+nm_config_data_get_config_description (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->config_description;
+}
+
+gboolean
+nm_config_data_has_group (const NMConfigData *self, const char *group)
+{
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE);
+ g_return_val_if_fail (group && *group, FALSE);
+
+ return g_key_file_has_group (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, group);
+}
+
+char *
+nm_config_data_get_value (const NMConfigData *self, const char *group, const char *key, NMConfigGetValueFlags flags)
+{
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), NULL);
+ g_return_val_if_fail (group && *group, NULL);
+ g_return_val_if_fail (key && *key, NULL);
+
+ return nm_config_keyfile_get_value (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, group, key, flags);
+}
+
+gboolean
+nm_config_data_has_value (const NMConfigData *self, const char *group, const char *key, NMConfigGetValueFlags flags)
+{
+ gs_free char *value = NULL;
+
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE);
+ g_return_val_if_fail (group && *group, FALSE);
+ g_return_val_if_fail (key && *key, FALSE);
+
+ value = nm_config_keyfile_get_value (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, group, key, flags);
+ return !!value;
+}
+
+gint
+nm_config_data_get_value_boolean (const NMConfigData *self, const char *group, const char *key, gint default_value)
+{
+ char *str;
+ gint value = default_value;
+
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), default_value);
+ g_return_val_if_fail (group && *group, default_value);
+ g_return_val_if_fail (key && *key, default_value);
+
+ /* when parsing the boolean, base it on the raw value from g_key_file_get_value(). */
+ str = g_key_file_get_value (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, group, key, NULL);
+ if (str) {
+ value = nm_config_parse_boolean (str, default_value);
+ g_free (str);
+ }
+ return value;
+}
+
+const char *
+nm_config_data_get_connectivity_uri (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->connectivity.uri;
+}
+
+const guint
+nm_config_data_get_connectivity_interval (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, 0);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->connectivity.interval;
+}
+
+const char *
+nm_config_data_get_connectivity_response (const NMConfigData *self)
+{
+ g_return_val_if_fail (self != NULL, NULL);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->connectivity.response;
+}
+
+const char *const*
+nm_config_data_get_no_auto_default (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, FALSE);
+
+ return (const char *const*) NM_CONFIG_DATA_GET_PRIVATE (self)->no_auto_default.arr;
+}
+
+gboolean
+nm_config_data_get_no_auto_default_for_device (const NMConfigData *self, NMDevice *device)
+{
+ NMConfigDataPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE);
+ g_return_val_if_fail (NM_IS_DEVICE (device), FALSE);
+
+ priv = NM_CONFIG_DATA_GET_PRIVATE (self);
+ return nm_device_spec_match_list (device, priv->no_auto_default.specs)
+ || nm_device_spec_match_list (device, priv->no_auto_default.specs_config);
+}
+
+const char *
+nm_config_data_get_dns_mode (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, NULL);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->dns_mode;
+}
+
+gboolean
+nm_config_data_get_ignore_carrier (const NMConfigData *self, NMDevice *device)
+{
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE);
+ g_return_val_if_fail (NM_IS_DEVICE (device), FALSE);
+
+ return nm_device_spec_match_list (device, NM_CONFIG_DATA_GET_PRIVATE (self)->ignore_carrier);
+}
+
+gboolean
+nm_config_data_get_assume_ipv6ll_only (const NMConfigData *self, NMDevice *device)
+{
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), FALSE);
+ g_return_val_if_fail (NM_IS_DEVICE (device), FALSE);
+
+ return nm_device_spec_match_list (device, NM_CONFIG_DATA_GET_PRIVATE (self)->assume_ipv6ll_only);
+}
+
+/************************************************************************/
+
+/**
+ * nm_config_data_get_groups:
+ * @self: the #NMConfigData instance
+ *
+ * Returns: (transfer-full): the list of groups in the configuration. The order
+ * of the section is undefined, as the configuration gets merged from multiple
+ * sources.
+ */
+char **
+nm_config_data_get_groups (const NMConfigData *self)
+{
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), NULL);
+
+ return g_key_file_get_groups (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, NULL);
+}
+
+char **
+nm_config_data_get_keys (const NMConfigData *self, const char *group)
+{
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (self), NULL);
+ g_return_val_if_fail (group && *group, NULL);
+
+ return g_key_file_get_keys (NM_CONFIG_DATA_GET_PRIVATE (self)->keyfile, group, NULL, NULL);
+}
+
+/************************************************************************/
+
+static int
+_nm_config_data_log_sort (const char **pa, const char **pb, gpointer dummy)
+{
+ gboolean a_is_connection, b_is_connection;
+ const char *a = *pa;
+ const char *b = *pb;
+
+ /* we sort connection groups before intern groups (to the end). */
+ a_is_connection = a && g_str_has_prefix (a, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
+ b_is_connection = b && g_str_has_prefix (b, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
+
+ if (a_is_connection && b_is_connection) {
+ /* if both are connection groups, we want the explicit [connection] group first. */
+ a_is_connection = a[STRLEN (NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION)] == '\0';
+ b_is_connection = b[STRLEN (NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION)] == '\0';
+
+ if (a_is_connection != b_is_connection) {
+ if (a_is_connection)
+ return -1;
+ return 1;
+ }
+ /* the sections are ordered lowest-priority first. Reverse their order. */
+ return pa < pb ? 1 : -1;
+ }
+ if (a_is_connection && !b_is_connection)
+ return 1;
+ if (b_is_connection && !a_is_connection)
+ return -1;
+
+ /* no reordering. */
+ return 0;
+}
+
+void
+nm_config_data_log (const NMConfigData *self, const char *prefix)
+{
+ NMConfigDataPrivate *priv;
+ gs_strfreev char **groups = NULL;
+ gsize ngroups;
+ guint g, k;
+
+ g_return_if_fail (NM_IS_CONFIG_DATA (self));
+
+ if (!nm_logging_enabled (LOGL_DEBUG, LOGD_CORE))
+ return;
+
+ if (!prefix)
+ prefix = "";
+
+#define _LOG(...) _nm_log (LOGL_DEBUG, LOGD_CORE, 0, "%s"_NM_UTILS_MACRO_FIRST(__VA_ARGS__), prefix _NM_UTILS_MACRO_REST (__VA_ARGS__))
+
+ priv = NM_CONFIG_DATA_GET_PRIVATE (self);
+
+ groups = g_key_file_get_groups (priv->keyfile, &ngroups);
+ if (!groups)
+ ngroups = 0;
+
+ if (groups && groups[0]) {
+ g_qsort_with_data (groups, ngroups,
+ sizeof (char *),
+ (GCompareDataFunc) _nm_config_data_log_sort,
+ NULL);
+ }
+
+ _LOG ("config-data[%p]: %lu groups", self, (unsigned long) ngroups);
+
+ for (g = 0; g < ngroups; g++) {
+ const char *group = groups[g];
+ gs_strfreev char **keys = NULL;
+
+ _LOG ("");
+ _LOG ("[%s]", group);
+
+ keys = g_key_file_get_keys (priv->keyfile, group, NULL, NULL);
+ for (k = 0; keys && keys[k]; k++) {
+ const char *key = keys[k];
+ gs_free char *value = NULL;
+
+ value = g_key_file_get_value (priv->keyfile, group, key, NULL);
+ _LOG (" %s=%s", key, value);
+ }
+ }
+
+#undef _LOG
+}
+
+/************************************************************************/
+
+char *
+nm_config_data_get_connection_default (const NMConfigData *self,
+ const char *property,
+ NMDevice *device)
+{
+ NMConfigDataPrivate *priv;
+ const ConnectionInfo *connection_info;
+
+ g_return_val_if_fail (self, NULL);
+ g_return_val_if_fail (property && *property, NULL);
+ g_return_val_if_fail (strchr (property, '.'), NULL);
+
+ priv = NM_CONFIG_DATA_GET_PRIVATE (self);
+
+ if (!priv->connection_infos)
+ return NULL;
+
+ for (connection_info = &priv->connection_infos[0]; connection_info->group_name; connection_info++) {
+ char *value;
+ gboolean match;
+
+ /* FIXME: Here we use g_key_file_get_string(). This should be in sync with what keyfile-reader
+ * does.
+ *
+ * Unfortunately that is currently not possible because keyfile-reader does the two steps
+ * string_to_value(keyfile_to_string(keyfile)) in one. Optimally, keyfile library would
+ * expose both functions, and we would return here keyfile_to_string(keyfile).
+ * The caller then could convert the string to the proper value via string_to_value(value). */
+ value = g_key_file_get_string (priv->keyfile, connection_info->group_name, property, NULL);
+ if (!value && !connection_info->stop_match)
+ continue;
+
+ match = TRUE;
+ if (connection_info->match_device.has)
+ match = device && nm_device_spec_match_list (device, connection_info->match_device.spec);
+
+ if (match)
+ return value;
+ g_free (value);
+ }
+ return NULL;
+}
+
+static void
+_get_connection_info_init (ConnectionInfo *connection_info, GKeyFile *keyfile, char *group)
+{
+ /* pass ownership of @group on... */
+ connection_info->group_name = group;
+
+ connection_info->match_device.spec = nm_config_get_device_match_spec (keyfile,
+ group,
+ "match-device",
+ &connection_info->match_device.has);
+ connection_info->stop_match = nm_config_keyfile_get_boolean (keyfile, group, "stop-match", FALSE);
+}
+
+static ConnectionInfo *
+_get_connection_infos (GKeyFile *keyfile)
+{
+ char **groups;
+ gsize i, j, ngroups;
+ char *connection_tag = NULL;
+ ConnectionInfo *connection_infos = NULL;
+
+ /* get the list of existing [connection.\+] sections that we consider
+ * for nm_config_data_get_connection_default().
+ *
+ * We expect the sections in their right order, with lowest priority
+ * first. Only exception is the (literal) [connection] section, which
+ * we will always reorder to the end. */
+ groups = g_key_file_get_groups (keyfile, &ngroups);
+ if (!groups)
+ ngroups = 0;
+ else if (ngroups > 0) {
+ for (i = 0, j = 0; i < ngroups; i++) {
+ if (g_str_has_prefix (groups[i], NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION)) {
+ if (groups[i][STRLEN (NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION)] == '\0')
+ connection_tag = groups[i];
+ else
+ groups[j++] = groups[i];
+ } else
+ g_free (groups[i]);
+ }
+ ngroups = j;
+ }
+
+ connection_infos = g_new0 (ConnectionInfo, ngroups + 1 + (connection_tag ? 1 : 0));
+ for (i = 0; i < ngroups; i++) {
+ /* pass ownership of @group on... */
+ _get_connection_info_init (&connection_infos[i], keyfile, groups[ngroups - i - 1]);
+ }
+ if (connection_tag) {
+ /* pass ownership of @connection_tag on... */
+ _get_connection_info_init (&connection_infos[i], keyfile, connection_tag);
+ }
+ g_free (groups);
+
+ return connection_infos;
+}
+
+/************************************************************************/
+
+static gboolean
+_slist_str_equals (GSList *a, GSList *b)
+{
+ while (a && b && g_strcmp0 (a->data, b->data) == 0) {
+ a = a->next;
+ b = b->next;
+ }
+ return !a && !b;
+}
+
+NMConfigChangeFlags
+nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
+{
+ NMConfigChangeFlags changes = NM_CONFIG_CHANGE_NONE;
+ NMConfigDataPrivate *priv_old, *priv_new;
+
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NM_CONFIG_CHANGE_NONE);
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NM_CONFIG_CHANGE_NONE);
+
+ priv_old = NM_CONFIG_DATA_GET_PRIVATE (old_data);
+ priv_new = NM_CONFIG_DATA_GET_PRIVATE (new_data);
+
+ if (!_nm_keyfile_equals (priv_old->keyfile, priv_new->keyfile, TRUE))
+ changes |= NM_CONFIG_CHANGE_VALUES;
+
+ if ( g_strcmp0 (nm_config_data_get_config_main_file (old_data), nm_config_data_get_config_main_file (new_data)) != 0
+ || g_strcmp0 (nm_config_data_get_config_description (old_data), nm_config_data_get_config_description (new_data)) != 0)
+ changes |= NM_CONFIG_CHANGE_CONFIG_FILES;
+
+ if ( nm_config_data_get_connectivity_interval (old_data) != nm_config_data_get_connectivity_interval (new_data)
+ || g_strcmp0 (nm_config_data_get_connectivity_uri (old_data), nm_config_data_get_connectivity_uri (new_data))
+ || g_strcmp0 (nm_config_data_get_connectivity_response (old_data), nm_config_data_get_connectivity_response (new_data)))
+ changes |= NM_CONFIG_CHANGE_CONNECTIVITY;
+
+ if ( !_slist_str_equals (priv_old->no_auto_default.specs, priv_new->no_auto_default.specs)
+ || !_slist_str_equals (priv_old->no_auto_default.specs_config, priv_new->no_auto_default.specs_config))
+ changes |= NM_CONFIG_CHANGE_NO_AUTO_DEFAULT;
+
+ if (g_strcmp0 (nm_config_data_get_dns_mode (old_data), nm_config_data_get_dns_mode (new_data)))
+ changes |= NM_CONFIG_CHANGE_DNS_MODE;
+
+ return changes;
+}
+
+/************************************************************************/
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ NMConfigData *self = NM_CONFIG_DATA (object);
+
+ switch (prop_id) {
+ case PROP_CONFIG_MAIN_FILE:
+ g_value_set_string (value, nm_config_data_get_config_main_file (self));
+ break;
+ case PROP_CONFIG_DESCRIPTION:
+ g_value_set_string (value, nm_config_data_get_config_description (self));
+ break;
+ case PROP_CONNECTIVITY_URI:
+ g_value_set_string (value, nm_config_data_get_connectivity_uri (self));
+ break;
+ case PROP_CONNECTIVITY_INTERVAL:
+ g_value_set_uint (value, nm_config_data_get_connectivity_interval (self));
+ break;
+ case PROP_CONNECTIVITY_RESPONSE:
+ g_value_set_string (value, nm_config_data_get_connectivity_response (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ NMConfigData *self = NM_CONFIG_DATA (object);
+ NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (self);
+
+ /* This type is immutable. All properties are construct only. */
+ switch (prop_id) {
+ case PROP_CONFIG_MAIN_FILE:
+ priv->config_main_file = g_value_dup_string (value);
+ break;
+ case PROP_CONFIG_DESCRIPTION:
+ priv->config_description = g_value_dup_string (value);
+ break;
+ case PROP_KEYFILE:
+ priv->keyfile = g_value_dup_boxed (value);
+ if (!priv->keyfile)
+ priv->keyfile = nm_config_create_keyfile ();
+ break;
+ case PROP_NO_AUTO_DEFAULT:
+ {
+ char **value_arr = g_value_get_boxed (value);
+ guint i, j = 0;
+
+ priv->no_auto_default.arr = g_new (char *, g_strv_length (value_arr) + 1);
+ priv->no_auto_default.specs = NULL;
+
+ for (i = 0; value_arr && value_arr[i]; i++) {
+ if ( *value_arr[i]
+ && nm_utils_hwaddr_valid (value_arr[i], -1)
+ && _nm_utils_strv_find_first (value_arr, i, value_arr[i]) < 0) {
+ priv->no_auto_default.arr[j++] = g_strdup (value_arr[i]);
+ priv->no_auto_default.specs = g_slist_prepend (priv->no_auto_default.specs, g_strdup_printf ("mac:%s", value_arr[i]));
+ }
+ }
+ priv->no_auto_default.arr[j++] = NULL;
+ priv->no_auto_default.specs = g_slist_reverse (priv->no_auto_default.specs);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+dispose (GObject *object)
+{
+}
+
+static void
+finalize (GObject *gobject)
+{
+ NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (gobject);
+ guint i;
+
+ g_free (priv->config_main_file);
+ g_free (priv->config_description);
+
+ g_free (priv->connectivity.uri);
+ g_free (priv->connectivity.response);
+
+ g_slist_free_full (priv->no_auto_default.specs, g_free);
+ g_slist_free_full (priv->no_auto_default.specs_config, g_free);
+ g_strfreev (priv->no_auto_default.arr);
+
+ g_free (priv->dns_mode);
+
+ g_slist_free_full (priv->ignore_carrier, g_free);
+ g_slist_free_full (priv->assume_ipv6ll_only, g_free);
+
+ if (priv->connection_infos) {
+ for (i = 0; priv->connection_infos[i].group_name; i++) {
+ g_free (priv->connection_infos[i].group_name);
+ g_slist_free_full (priv->connection_infos[i].match_device.spec, g_free);
+ }
+ g_free (priv->connection_infos);
+ }
+
+ g_key_file_unref (priv->keyfile);
+
+ G_OBJECT_CLASS (nm_config_data_parent_class)->finalize (gobject);
+}
+
+static void
+nm_config_data_init (NMConfigData *self)
+{
+}
+
+static void
+constructed (GObject *object)
+{
+ NMConfigData *self = NM_CONFIG_DATA (object);
+ NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (self);
+ char *interval;
+
+ priv->connection_infos = _get_connection_infos (priv->keyfile);
+
+ priv->connectivity.uri = nm_strstrip (g_key_file_get_string (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "uri", NULL));
+ priv->connectivity.response = g_key_file_get_string (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "response", NULL);
+
+ /* On missing config value, fallback to 300. On invalid value, disable connectivity checking by setting
+ * the interval to zero. */
+ interval = g_key_file_get_string (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "interval", NULL);
+ priv->connectivity.interval = interval
+ ? _nm_utils_ascii_str_to_int64 (interval, 10, 0, G_MAXUINT, 0)
+ : NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL;
+ g_free (interval);
+
+ priv->dns_mode = nm_strstrip (g_key_file_get_string (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "dns", NULL));
+
+ priv->ignore_carrier = nm_config_get_device_match_spec (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "ignore-carrier", NULL);
+ priv->assume_ipv6ll_only = nm_config_get_device_match_spec (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "assume-ipv6ll-only", NULL);
+
+ priv->no_auto_default.specs_config = nm_config_get_device_match_spec (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "no-auto-default", NULL);
+
+ G_OBJECT_CLASS (nm_config_data_parent_class)->constructed (object);
+}
+
+NMConfigData *
+nm_config_data_new (const char *config_main_file,
+ const char *config_description,
+ const char *const*no_auto_default,
+ GKeyFile *keyfile)
+{
+ return g_object_new (NM_TYPE_CONFIG_DATA,
+ NM_CONFIG_DATA_CONFIG_MAIN_FILE, config_main_file,
+ NM_CONFIG_DATA_CONFIG_DESCRIPTION, config_description,
+ NM_CONFIG_DATA_KEYFILE, keyfile,
+ NM_CONFIG_DATA_NO_AUTO_DEFAULT, no_auto_default,
+ NULL);
+}
+
+NMConfigData *
+nm_config_data_new_update_no_auto_default (const NMConfigData *base,
+ const char *const*no_auto_default)
+{
+ NMConfigDataPrivate *priv = NM_CONFIG_DATA_GET_PRIVATE (base);
+
+ return g_object_new (NM_TYPE_CONFIG_DATA,
+ NM_CONFIG_DATA_CONFIG_MAIN_FILE, priv->config_main_file,
+ NM_CONFIG_DATA_CONFIG_DESCRIPTION, priv->config_description,
+ NM_CONFIG_DATA_KEYFILE, priv->keyfile, /* the keyfile is unchanged. It's safe to share it. */
+ NM_CONFIG_DATA_NO_AUTO_DEFAULT, no_auto_default,
+ NULL);
+}
+
+static void
+nm_config_data_class_init (NMConfigDataClass *config_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (config_class);
+
+ g_type_class_add_private (config_class, sizeof (NMConfigDataPrivate));
+
+ object_class->constructed = constructed;
+ object_class->dispose = dispose;
+ object_class->finalize = finalize;
+ object_class->get_property = get_property;
+ object_class->set_property = set_property;
+
+ g_object_class_install_property
+ (object_class, PROP_CONFIG_MAIN_FILE,
+ g_param_spec_string (NM_CONFIG_DATA_CONFIG_MAIN_FILE, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (object_class, PROP_CONFIG_DESCRIPTION,
+ g_param_spec_string (NM_CONFIG_DATA_CONFIG_DESCRIPTION, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (object_class, PROP_KEYFILE,
+ g_param_spec_boxed (NM_CONFIG_DATA_KEYFILE, "", "",
+ G_TYPE_KEY_FILE,
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (object_class, PROP_CONNECTIVITY_URI,
+ g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_URI, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (object_class, PROP_CONNECTIVITY_INTERVAL,
+ g_param_spec_uint (NM_CONFIG_DATA_CONNECTIVITY_INTERVAL, "", "",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (object_class, PROP_CONNECTIVITY_RESPONSE,
+ g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_RESPONSE, "", "",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property
+ (object_class, PROP_NO_AUTO_DEFAULT,
+ g_param_spec_boxed (NM_CONFIG_DATA_NO_AUTO_DEFAULT, "", "",
+ G_TYPE_STRV,
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+}
+
diff --git a/src/nm-config-data.h b/src/nm-config-data.h
new file mode 100644
index 000000000..cc7f95e21
--- /dev/null
+++ b/src/nm-config-data.h
@@ -0,0 +1,132 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2014 Red Hat, Inc.
+ */
+
+#ifndef NM_CONFIG_DATA_H
+#define NM_CONFIG_DATA_H
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "nm-types.h"
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_CONFIG_DATA (nm_config_data_get_type ())
+#define NM_CONFIG_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONFIG_DATA, NMConfigData))
+#define NM_CONFIG_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CONFIG_DATA, NMConfigDataClass))
+#define NM_IS_CONFIG_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CONFIG_DATA))
+#define NM_IS_CONFIG_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CONFIG_DATA))
+#define NM_CONFIG_DATA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CONFIG_DATA, NMConfigDataClass))
+
+
+#define NM_CONFIG_DATA_CONFIG_MAIN_FILE "config-main-file"
+#define NM_CONFIG_DATA_CONFIG_DESCRIPTION "config-description"
+#define NM_CONFIG_DATA_KEYFILE "keyfile"
+#define NM_CONFIG_DATA_CONNECTIVITY_URI "connectivity-uri"
+#define NM_CONFIG_DATA_CONNECTIVITY_INTERVAL "connectivity-interval"
+#define NM_CONFIG_DATA_CONNECTIVITY_RESPONSE "connectivity-response"
+#define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default"
+#define NM_CONFIG_DATA_DNS_MODE "dns"
+
+typedef enum { /*<flags >*/
+ NM_CONFIG_GET_VALUE_NONE = 0,
+
+ /* use g_key_file_get_value() instead of g_key_file_get_string(). */
+ NM_CONFIG_GET_VALUE_RAW = (1LL << 0),
+
+ /* strip whitespaces */
+ NM_CONFIG_GET_VALUE_STRIP = (1LL << 1),
+
+ /* if the returned string would be the empty word, return NULL. */
+ NM_CONFIG_GET_VALUE_NO_EMPTY = (1LL << 2),
+
+ /* special flag to read device spec. You want to use this before passing the
+ * value to nm_match_spec_split(). */
+ NM_CONFIG_GET_VALUE_TYPE_SPEC = NM_CONFIG_GET_VALUE_RAW,
+} NMConfigGetValueFlags;
+
+typedef enum { /*< flags >*/
+ NM_CONFIG_CHANGE_NONE = 0,
+
+ NM_CONFIG_CHANGE_SIGHUP = (1L << 0),
+ NM_CONFIG_CHANGE_SIGUSR1 = (1L << 1),
+ NM_CONFIG_CHANGE_SIGUSR2 = (1L << 2),
+
+ NM_CONFIG_CHANGE_CONFIG_FILES = (1L << 3),
+ NM_CONFIG_CHANGE_VALUES = (1L << 4),
+ NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 5),
+ NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 6),
+ NM_CONFIG_CHANGE_DNS_MODE = (1L << 7),
+
+ _NM_CONFIG_CHANGE_LAST,
+ NM_CONFIG_CHANGE_ALL = ((_NM_CONFIG_CHANGE_LAST - 1) << 1) - 1,
+} NMConfigChangeFlags;
+
+struct _NMConfigData {
+ GObject parent;
+};
+
+typedef struct {
+ GObjectClass parent;
+} NMConfigDataClass;
+
+GType nm_config_data_get_type (void);
+
+NMConfigData *nm_config_data_new (const char *config_main_file,
+ const char *config_description,
+ const char *const*no_auto_default,
+ GKeyFile *keyfile);
+NMConfigData *nm_config_data_new_update_no_auto_default (const NMConfigData *base, const char *const*no_auto_default);
+
+NMConfigChangeFlags nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
+
+void nm_config_data_log (const NMConfigData *config_data, const char *prefix);
+
+const char *nm_config_data_get_config_main_file (const NMConfigData *config_data);
+const char *nm_config_data_get_config_description (const NMConfigData *config_data);
+
+gboolean nm_config_data_has_group (const NMConfigData *self, const char *group);
+gboolean nm_config_data_has_value (const NMConfigData *self, const char *group, const char *key, NMConfigGetValueFlags flags);
+char *nm_config_data_get_value (const NMConfigData *config_data, const char *group, const char *key, NMConfigGetValueFlags flags);
+gint nm_config_data_get_value_boolean (const NMConfigData *self, const char *group, const char *key, gint default_value);
+
+const char *nm_config_data_get_connectivity_uri (const NMConfigData *config_data);
+const guint nm_config_data_get_connectivity_interval (const NMConfigData *config_data);
+const char *nm_config_data_get_connectivity_response (const NMConfigData *config_data);
+
+const char *const*nm_config_data_get_no_auto_default (const NMConfigData *config_data);
+gboolean nm_config_data_get_no_auto_default_for_device (const NMConfigData *self, NMDevice *device);
+
+const char *nm_config_data_get_dns_mode (const NMConfigData *self);
+
+gboolean nm_config_data_get_ignore_carrier (const NMConfigData *self, NMDevice *device);
+gboolean nm_config_data_get_assume_ipv6ll_only (const NMConfigData *self, NMDevice *device);
+
+char *nm_config_data_get_connection_default (const NMConfigData *self,
+ const char *property,
+ NMDevice *device);
+
+char **nm_config_data_get_groups (const NMConfigData *self);
+char **nm_config_data_get_keys (const NMConfigData *self, const char *group);
+
+G_END_DECLS
+
+#endif /* NM_CONFIG_DATA_H */
+
diff --git a/src/nm-config.c b/src/nm-config.c
index 4626ae264..86b3d9291 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -29,100 +29,213 @@
#include "nm-utils.h"
#include "nm-glib-compat.h"
#include "nm-device.h"
+#include "NetworkManagerUtils.h"
+#include "gsystem-local-alloc.h"
+#include "nm-enum-types.h"
+#include "nm-core-internal.h"
#include <gio/gio.h>
#include <glib/gi18n.h>
-#define NM_DEFAULT_SYSTEM_CONF_FILE NMCONFDIR "/NetworkManager.conf"
-#define NM_DEFAULT_SYSTEM_CONF_DIR NMCONFDIR "/conf.d"
-#define NM_OLD_SYSTEM_CONF_FILE NMCONFDIR "/nm-system-settings.conf"
-#define NM_NO_AUTO_DEFAULT_STATE_FILE NMSTATEDIR "/no-auto-default.state"
+#define DEFAULT_CONFIG_MAIN_FILE NMCONFDIR "/NetworkManager.conf"
+#define DEFAULT_CONFIG_DIR NMCONFDIR "/conf.d"
+#define DEFAULT_CONFIG_MAIN_FILE_OLD NMCONFDIR "/nm-system-settings.conf"
+#define DEFAULT_NO_AUTO_DEFAULT_FILE NMSTATEDIR "/no-auto-default.state"
+
+struct NMConfigCmdLineOptions {
+ char *config_main_file;
+ char *config_dir;
+ char *no_auto_default_file;
+ char *plugins;
+ gboolean configure_and_quit;
+ char *connectivity_uri;
+
+ /* We store interval as signed internally to track whether it's
+ * set or not via GOptionEntry
+ */
+ int connectivity_interval;
+ char *connectivity_response;
+};
typedef struct {
- char *nm_conf_path;
+ NMConfigCmdLineOptions cli;
+
+ NMConfigData *config_data;
+ NMConfigData *config_data_orig;
+
char *config_dir;
- char *config_description;
char *no_auto_default_file;
- GKeyFile *keyfile;
char **plugins;
gboolean monitor_connection_files;
gboolean auth_polkit;
char *dhcp_client;
- char *dns_mode;
char *log_level;
char *log_domains;
char *debug;
- char *connectivity_uri;
- gint connectivity_interval;
- char *connectivity_response;
-
- char **no_auto_default;
- char **ignore_carrier;
-
gboolean configure_and_quit;
} NMConfigPrivate;
-static NMConfig *singleton = NULL;
+enum {
+ PROP_0,
+ PROP_CMD_LINE_OPTIONS,
+ LAST_PROP,
+};
+
+enum {
+ SIGNAL_CONFIG_CHANGED,
+
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void nm_config_initable_iface_init (GInitableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (NMConfig, nm_config, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, nm_config_initable_iface_init);
+ )
-G_DEFINE_TYPE (NMConfig, nm_config, G_TYPE_OBJECT)
#define NM_CONFIG_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CONFIG, NMConfigPrivate))
/************************************************************************/
-static gboolean
-_get_bool_value (GKeyFile *keyfile,
- const char *section,
- const char *key,
- gboolean default_value)
+static void _set_config_data (NMConfig *self, NMConfigData *new_data, int signal);
+
+/************************************************************************/
+
+gint
+nm_config_parse_boolean (const char *str,
+ gint default_value)
{
- gboolean value = default_value;
- char *str;
+ gsize len;
+ char *s = NULL;
+
+ if (!str)
+ return default_value;
+
+ while (str[0] && g_ascii_isspace (str[0]))
+ str++;
+
+ if (!str[0])
+ return default_value;
+
+ len = strlen (str);
+ if (g_ascii_isspace (str[len - 1])) {
+ s = g_strdup (str);
+ g_strchomp (s);
+ str = s;
+ }
+
+ if (!g_ascii_strcasecmp (str, "true") || !g_ascii_strcasecmp (str, "yes") || !g_ascii_strcasecmp (str, "on") || !g_ascii_strcasecmp (str, "1"))
+ default_value = TRUE;
+ else if (!g_ascii_strcasecmp (str, "false") || !g_ascii_strcasecmp (str, "no") || !g_ascii_strcasecmp (str, "off") || !g_ascii_strcasecmp (str, "0"))
+ default_value = FALSE;
+ if (s)
+ g_free (s);
+ return default_value;
+}
+
+gint
+nm_config_keyfile_get_boolean (GKeyFile *keyfile,
+ const char *section,
+ const char *key,
+ gint default_value)
+{
+ gs_free char *str = NULL;
g_return_val_if_fail (keyfile != NULL, default_value);
g_return_val_if_fail (section != NULL, default_value);
g_return_val_if_fail (key != NULL, default_value);
str = g_key_file_get_value (keyfile, section, key, NULL);
- if (!str)
- return default_value;
+ return nm_config_parse_boolean (str, default_value);
+}
- g_strstrip (str);
- if (str[0]) {
- if (!g_ascii_strcasecmp (str, "true") || !g_ascii_strcasecmp (str, "yes") || !g_ascii_strcasecmp (str, "on") || !g_ascii_strcasecmp (str, "1"))
- value = TRUE;
- else if (!g_ascii_strcasecmp (str, "false") || !g_ascii_strcasecmp (str, "no") || !g_ascii_strcasecmp (str, "off") || !g_ascii_strcasecmp (str, "0"))
- value = FALSE;
- else {
- nm_log_warn (LOGD_CORE, "Unrecognized value for %s.%s: '%s'. Assuming '%s'",
- section, key, str, default_value ? "true" : "false");
- }
+char *
+nm_config_keyfile_get_value (GKeyFile *keyfile,
+ const char *section,
+ const char *key,
+ NMConfigGetValueFlags flags)
+{
+ char *value;
+
+ if (NM_FLAGS_HAS (flags, NM_CONFIG_GET_VALUE_RAW))
+ value = g_key_file_get_value (keyfile, section, key, NULL);
+ else
+ value = g_key_file_get_string (keyfile, section, key, NULL);
+
+ if (!value)
+ return NULL;
+
+ if (NM_FLAGS_HAS (flags, NM_CONFIG_GET_VALUE_STRIP))
+ g_strstrip (value);
+
+ if ( NM_FLAGS_HAS (flags, NM_CONFIG_GET_VALUE_NO_EMPTY)
+ && !*value) {
+ g_free (value);
+ return NULL;
}
- g_free (str);
return value;
}
+void
+nm_config_keyfile_set_string_list (GKeyFile *keyfile,
+ const char *group,
+ const char *key,
+ const char *const* strv,
+ gssize len)
+{
+ gsize l;
+ char *new_value;
+
+ if (len < 0)
+ len = strv ? g_strv_length ((char **) strv) : 0;
+
+ g_key_file_set_string_list (keyfile, group, key, strv, len);
+
+ /* g_key_file_set_string_list() appends a trailing separator to the value.
+ * We don't like that, get rid of it. */
+
+ new_value = g_key_file_get_value (keyfile, group, key, NULL);
+ if (!new_value)
+ return;
+
+ l = strlen (new_value);
+ if (l > 0 && new_value[l - 1] == NM_CONFIG_KEYFILE_LIST_SEPARATOR) {
+ /* Maybe we should check that value doesn't end with "\\,", i.e.
+ * with an escaped separator. But the way g_key_file_set_string_list()
+ * is implemented (currently), it always adds a trailing separator. */
+ new_value[l - 1] = '\0';
+ g_key_file_set_value (keyfile, group, key, new_value);
+ }
+ g_free (new_value);
+}
+
/************************************************************************/
-const char *
-nm_config_get_path (NMConfig *config)
+NMConfigData *
+nm_config_get_data (NMConfig *config)
{
g_return_val_if_fail (config != NULL, NULL);
- return NM_CONFIG_GET_PRIVATE (config)->nm_conf_path;
+ return NM_CONFIG_GET_PRIVATE (config)->config_data;
}
-const char *
-nm_config_get_description (NMConfig *config)
+/* The NMConfigData instance is reloadable and will be swapped on reload.
+ * nm_config_get_data_orig() returns the original configuration, when the NMConfig
+ * instance was created. */
+NMConfigData *
+nm_config_get_data_orig (NMConfig *config)
{
g_return_val_if_fail (config != NULL, NULL);
- return NM_CONFIG_GET_PRIVATE (config)->config_description;
+ return NM_CONFIG_GET_PRIVATE (config)->config_data_orig;
}
const char **
@@ -158,14 +271,6 @@ nm_config_get_dhcp_client (NMConfig *config)
}
const char *
-nm_config_get_dns_mode (NMConfig *config)
-{
- g_return_val_if_fail (config != NULL, NULL);
-
- return NM_CONFIG_GET_PRIVATE (config)->dns_mode;
-}
-
-const char *
nm_config_get_log_level (NMConfig *config)
{
g_return_val_if_fail (config != NULL, NULL);
@@ -189,102 +294,32 @@ nm_config_get_debug (NMConfig *config)
return NM_CONFIG_GET_PRIVATE (config)->debug;
}
-const char *
-nm_config_get_connectivity_uri (NMConfig *config)
-{
- g_return_val_if_fail (config != NULL, NULL);
-
- return NM_CONFIG_GET_PRIVATE (config)->connectivity_uri;
-}
-
-guint
-nm_config_get_connectivity_interval (NMConfig *config)
-{
- g_return_val_if_fail (config != NULL, 0);
-
- /* We store interval as signed internally to track whether it's
- * set or not, but report as unsigned to callers.
- */
- return MAX (NM_CONFIG_GET_PRIVATE (config)->connectivity_interval, 0);
-}
-
-const char *
-nm_config_get_connectivity_response (NMConfig *config)
-{
- g_return_val_if_fail (config != NULL, NULL);
-
- return NM_CONFIG_GET_PRIVATE (config)->connectivity_response;
-}
-
gboolean
nm_config_get_configure_and_quit (NMConfig *config)
{
return NM_CONFIG_GET_PRIVATE (config)->configure_and_quit;
}
-char *
-nm_config_get_value (NMConfig *config, const char *group, const char *key, GError **error)
-{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
-
- return g_key_file_get_string (priv->keyfile, group, key, error);
-}
-
-gboolean
-nm_config_get_ignore_carrier (NMConfig *config, NMDevice *device)
-{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
- GSList *specs = NULL;
- int i;
- gboolean match;
-
- if (!priv->ignore_carrier)
- return FALSE;
-
- for (i = 0; priv->ignore_carrier[i]; i++)
- specs = g_slist_prepend (specs, priv->ignore_carrier[i]);
-
- match = nm_device_spec_match_list (device, specs);
-
- g_slist_free (specs);
- return match;
-}
-
/************************************************************************/
-static void
-merge_no_auto_default_state (NMConfig *config)
+static char **
+no_auto_default_from_file (const char *no_auto_default_file)
{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
- GPtrArray *updated;
+ GPtrArray *no_auto_default_new;
char **list;
- int i, j;
+ guint i;
char *data;
- /* If the config already matches everything, we don't need to do anything else. */
- if (priv->no_auto_default && !g_strcmp0 (priv->no_auto_default[0], "*"))
- return;
+ no_auto_default_new = g_ptr_array_new ();
- updated = g_ptr_array_new ();
- if (priv->no_auto_default) {
- for (i = 0; priv->no_auto_default[i]; i++)
- g_ptr_array_add (updated, priv->no_auto_default[i]);
- g_free (priv->no_auto_default);
- }
-
- if (g_file_get_contents (priv->no_auto_default_file, &data, NULL, NULL)) {
+ if ( no_auto_default_file
+ && g_file_get_contents (no_auto_default_file, &data, NULL, NULL)) {
list = g_strsplit (data, "\n", -1);
for (i = 0; list[i]; i++) {
- if (!*list[i]) {
- g_free (list[i]);
- continue;
- }
- for (j = 0; j < updated->len; j++) {
- if (!strcmp (list[i], updated->pdata[j]))
- break;
- }
- if (j == updated->len)
- g_ptr_array_add (updated, list[i]);
+ if ( *list[i]
+ && nm_utils_hwaddr_valid (list[i], -1)
+ && _nm_utils_strv_find_first (list, i, list[i]) < 0)
+ g_ptr_array_add (no_auto_default_new, list[i]);
else
g_free (list[i]);
}
@@ -292,99 +327,240 @@ merge_no_auto_default_state (NMConfig *config)
g_free (data);
}
- g_ptr_array_add (updated, NULL);
- priv->no_auto_default = (char **) g_ptr_array_free (updated, FALSE);
+ g_ptr_array_add (no_auto_default_new, NULL);
+ return (char **) g_ptr_array_free (no_auto_default_new, FALSE);
}
-gboolean
-nm_config_get_ethernet_can_auto_default (NMConfig *config, NMDevice *device)
+static gboolean
+no_auto_default_to_file (const char *no_auto_default_file, const char *const*no_auto_default, GError **error)
{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
- GSList *specs = NULL;
- int i;
- gboolean match;
-
- for (i = 0; priv->no_auto_default[i]; i++)
- specs = g_slist_prepend (specs, priv->no_auto_default[i]);
+ GString *data;
+ gboolean success;
+ guint i;
+
+ data = g_string_new ("");
+ for (i = 0; no_auto_default && no_auto_default[i]; i++) {
+ g_string_append (data, no_auto_default[i]);
+ g_string_append_c (data, '\n');
+ }
+ success = g_file_set_contents (no_auto_default_file, data->str, data->len, error);
+ g_string_free (data, TRUE);
+ return success;
+}
- match = nm_device_spec_match_list (device, specs);
+gboolean
+nm_config_get_no_auto_default_for_device (NMConfig *self, NMDevice *device)
+{
+ g_return_val_if_fail (NM_IS_CONFIG (self), FALSE);
- g_slist_free (specs);
- return !match;
+ return nm_config_data_get_no_auto_default_for_device (NM_CONFIG_GET_PRIVATE (self)->config_data, device);
}
void
-nm_config_set_ethernet_no_auto_default (NMConfig *config, NMDevice *device)
+nm_config_set_no_auto_default_for_device (NMConfig *self, NMDevice *device)
{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
- char *current;
- GString *updated;
+ NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
GError *error = NULL;
+ NMConfigData *new_data = NULL;
+ const char *hw_address;
+ const char *const*no_auto_default_current;
+ GPtrArray *no_auto_default_new = NULL;
+ guint i;
- if (!nm_config_get_ethernet_can_auto_default (config, device))
- return;
+ g_return_if_fail (NM_IS_CONFIG (self));
+ g_return_if_fail (NM_IS_DEVICE (device));
+
+ hw_address = nm_device_get_hw_address (device);
- updated = g_string_new (NULL);
- if (g_file_get_contents (priv->no_auto_default_file, &current, NULL, NULL)) {
- g_string_append (updated, current);
- g_free (current);
- if (updated->str[updated->len - 1] != '\n')
- g_string_append_c (updated, '\n');
+ no_auto_default_current = nm_config_data_get_no_auto_default (priv->config_data);
+
+ if (_nm_utils_strv_find_first ((char **) no_auto_default_current, -1, hw_address) >= 0) {
+ /* @hw_address is already blocked. We don't have to update our in-memory representation.
+ * Maybe we should write to no_auto_default_file anew, but let's save that too. */
+ return;
}
- g_string_append (updated, nm_device_get_hw_address (device));
- g_string_append_c (updated, '\n');
+ no_auto_default_new = g_ptr_array_new ();
+ for (i = 0; no_auto_default_current && no_auto_default_current[i]; i++)
+ g_ptr_array_add (no_auto_default_new, (char *) no_auto_default_current[i]);
+ g_ptr_array_add (no_auto_default_new, (char *) hw_address);
+ g_ptr_array_add (no_auto_default_new, NULL);
- if (!g_file_set_contents (priv->no_auto_default_file, updated->str, updated->len, &error)) {
+ if (!no_auto_default_to_file (priv->no_auto_default_file, (const char *const*) no_auto_default_new->pdata, &error)) {
nm_log_warn (LOGD_SETTINGS, "Could not update no-auto-default.state file: %s",
error->message);
g_error_free (error);
}
- g_string_free (updated, TRUE);
+ new_data = nm_config_data_new_update_no_auto_default (priv->config_data, (const char *const*) no_auto_default_new->pdata);
- merge_no_auto_default_state (config);
+ /* unref no_auto_default_set here. Note that _set_config_data() probably invalidates the content of the array. */
+ g_ptr_array_unref (no_auto_default_new);
+
+ _set_config_data (self, new_data, 0);
}
/************************************************************************/
-static char *cli_config_path;
-static char *cli_config_dir;
-static char *cli_no_auto_default_file;
-static char *cli_plugins;
-static char *cli_connectivity_uri;
-static int cli_connectivity_interval = -1;
-static char *cli_connectivity_response;
-
-static GOptionEntry config_options[] = {
- { "config", 0, 0, G_OPTION_ARG_FILENAME, &cli_config_path, N_("Config file location"), N_("/path/to/config.file") },
- { "config-dir", 0, 0, G_OPTION_ARG_FILENAME, &cli_config_dir, N_("Config directory location"), N_("/path/to/config/dir") },
- { "no-auto-default", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, &cli_no_auto_default_file, "no-auto-default.state location", NULL },
- { "plugins", 0, 0, G_OPTION_ARG_STRING, &cli_plugins, N_("List of plugins separated by ','"), N_("plugin1,plugin2") },
-
- /* These three are hidden for now, and should eventually just go away. */
- { "connectivity-uri", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &cli_connectivity_uri, N_("An http(s) address for checking internet connectivity"), "http://example.com" },
- { "connectivity-interval", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, &cli_connectivity_interval, N_("The interval between connectivity checks (in seconds)"), "60" },
- { "connectivity-response", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &cli_connectivity_response, N_("The expected start of the response"), N_("Bingo!") },
- {NULL}
-};
-GOptionEntry *
-nm_config_get_options (void)
+static void
+_nm_config_cmd_line_options_clear (NMConfigCmdLineOptions *cli)
+{
+ g_clear_pointer (&cli->config_main_file, g_free);
+ g_clear_pointer (&cli->config_dir, g_free);
+ g_clear_pointer (&cli->no_auto_default_file, g_free);
+ g_clear_pointer (&cli->plugins, g_free);
+ cli->configure_and_quit = FALSE;
+ g_clear_pointer (&cli->connectivity_uri, g_free);
+ g_clear_pointer (&cli->connectivity_response, g_free);
+ cli->connectivity_interval = -1;
+}
+
+static void
+_nm_config_cmd_line_options_copy (const NMConfigCmdLineOptions *cli, NMConfigCmdLineOptions *dst)
+{
+ g_return_if_fail (cli);
+ g_return_if_fail (dst);
+ g_return_if_fail (cli != dst);
+
+ _nm_config_cmd_line_options_clear (dst);
+ dst->config_dir = g_strdup (cli->config_dir);
+ dst->config_main_file = g_strdup (cli->config_main_file);
+ dst->no_auto_default_file = g_strdup (cli->no_auto_default_file);
+ dst->plugins = g_strdup (cli->plugins);
+ dst->configure_and_quit = cli->configure_and_quit;
+ dst->connectivity_uri = g_strdup (cli->connectivity_uri);
+ dst->connectivity_response = g_strdup (cli->connectivity_response);
+ dst->connectivity_interval = cli->connectivity_interval;
+}
+
+NMConfigCmdLineOptions *
+nm_config_cmd_line_options_new ()
+{
+ NMConfigCmdLineOptions *cli = g_new0 (NMConfigCmdLineOptions, 1);
+
+ _nm_config_cmd_line_options_clear (cli);
+ return cli;
+}
+
+void
+nm_config_cmd_line_options_free (NMConfigCmdLineOptions *cli)
+{
+ g_return_if_fail (cli);
+
+ _nm_config_cmd_line_options_clear (cli);
+ g_free (cli);
+}
+
+void
+nm_config_cmd_line_options_add_to_entries (NMConfigCmdLineOptions *cli,
+ GOptionContext *opt_ctx)
{
- return config_options;
+ g_return_if_fail (opt_ctx);
+ g_return_if_fail (cli);
+
+ {
+ GOptionEntry config_options[] = {
+ { "config", 0, 0, G_OPTION_ARG_FILENAME, &cli->config_main_file, N_("Config file location"), N_(DEFAULT_CONFIG_MAIN_FILE) },
+ { "config-dir", 0, 0, G_OPTION_ARG_FILENAME, &cli->config_dir, N_("Config directory location"), N_(DEFAULT_CONFIG_DIR) },
+ { "no-auto-default", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME, &cli->no_auto_default_file, N_("State file for no-auto-default devices"), N_(DEFAULT_NO_AUTO_DEFAULT_FILE) },
+ { "plugins", 0, 0, G_OPTION_ARG_STRING, &cli->plugins, N_("List of plugins separated by ','"), N_(CONFIG_PLUGINS_DEFAULT) },
+ { "configure-and-quit", 0, 0, G_OPTION_ARG_NONE, &cli->configure_and_quit, N_("Quit after initial configuration"), NULL },
+
+ /* These three are hidden for now, and should eventually just go away. */
+ { "connectivity-uri", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &cli->connectivity_uri, N_("An http(s) address for checking internet connectivity"), "http://example.com" },
+ { "connectivity-interval", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, &cli->connectivity_interval, N_("The interval between connectivity checks (in seconds)"), G_STRINGIFY (NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL) },
+ { "connectivity-response", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &cli->connectivity_response, N_("The expected start of the response"), N_(NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE) },
+ { 0 },
+ };
+
+ g_option_context_add_main_entries (opt_ctx, config_options, NULL);
+ }
}
/************************************************************************/
+GKeyFile *
+nm_config_create_keyfile ()
+{
+ GKeyFile *keyfile;
+
+ keyfile = g_key_file_new ();
+ g_key_file_set_list_separator (keyfile, NM_CONFIG_KEYFILE_LIST_SEPARATOR);
+ return keyfile;
+}
+
+static int
+_sort_groups_cmp (const char **pa, const char **pb, gpointer dummy)
+{
+ const char *a, *b;
+ gboolean a_is_connection, b_is_connection;
+
+ /* basic NULL checking... */
+ if (pa == pb)
+ return 0;
+ if (!pa)
+ return -1;
+ if (!pb)
+ return 1;
+
+ a = *pa;
+ b = *pb;
+
+ a_is_connection = g_str_has_prefix (a, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
+ b_is_connection = g_str_has_prefix (b, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION);
+
+ if (a_is_connection != b_is_connection) {
+ /* one is a [connection*] entry, the other not. We sort [connection*] entires
+ * after. */
+ if (a_is_connection)
+ return 1;
+ return -1;
+ }
+ if (!a_is_connection) {
+ /* both are non-connection entries. Don't reorder. */
+ return 0;
+ }
+
+ /* both are [connection.\+] entires. Reverse their order.
+ * One of the sections might be literally [connection]. That section
+ * is special and it's order will be fixed later. It doesn't actually
+ * matter here how it compares with [connection.\+] sections. */
+ return pa > pb ? -1 : 1;
+}
+
static gboolean
-read_config (NMConfig *config, const char *path, GError **error)
+_setting_is_device_spec (const char *group, const char *key)
+{
+#define _IS(group_v, key_v) (strcmp (group, (""group_v)) == 0 && strcmp (key, (""key_v)) == 0)
+ return _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, "no-auto-default")
+ || _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, "ignore-carrier")
+ || _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, "assume-ipv6ll-only")
+ || _IS (NM_CONFIG_KEYFILE_GROUP_KEYFILE, "unmanaged-devices")
+ || (g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION) && !strcmp (key, "match-device"));
+}
+
+static gboolean
+_setting_is_string_list (const char *group, const char *key)
+{
+ return _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins")
+ || _IS (NM_CONFIG_KEYFILE_GROUP_MAIN, "debug")
+ || _IS (NM_CONFIG_KEYFILE_GROUP_LOGGING, "domains")
+ || g_str_has_prefix (group, NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST);
+#undef _IS
+}
+
+static gboolean
+read_config (GKeyFile *keyfile, const char *path, GError **error)
{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
GKeyFile *kf;
char **groups, **keys;
gsize ngroups, nkeys;
int g, k;
+ g_return_val_if_fail (keyfile, FALSE);
+ g_return_val_if_fail (path, FALSE);
+ g_return_val_if_fail (!error || !*error, FALSE);
+
if (g_file_test (path, G_FILE_TEST_EXISTS) == FALSE) {
g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND, "file %s not found", path);
return FALSE;
@@ -392,8 +568,7 @@ read_config (NMConfig *config, const char *path, GError **error)
nm_log_dbg (LOGD_SETTINGS, "Reading config file '%s'", path);
- kf = g_key_file_new ();
- g_key_file_set_list_separator (kf, ',');
+ kf = nm_config_create_keyfile ();
if (!g_key_file_load_from_file (kf, path, G_KEY_FILE_NONE, error)) {
g_key_file_free (kf);
return FALSE;
@@ -401,36 +576,116 @@ read_config (NMConfig *config, const char *path, GError **error)
/* Override the current settings with the new ones */
groups = g_key_file_get_groups (kf, &ngroups);
- for (g = 0; groups[g]; g++) {
- keys = g_key_file_get_keys (kf, groups[g], &nkeys, NULL);
+ if (!groups)
+ ngroups = 0;
+
+ /* Within one file we reverse the order of the '[connection.\+] sections.
+ * Here we merge the current file (@kf) into @keyfile. As we merge multiple
+ * files, earlier sections (with lower priority) will be added first.
+ * But within one file, we want a top-to-bottom order. This means we
+ * must reverse the order within each file.
+ * At the very end, we will revert the order of all sections again and
+ * get thus the right behavior. This final reversing is done in
+ * NMConfigData:_get_connection_infos(). */
+ if (ngroups > 1) {
+ g_qsort_with_data (groups,
+ ngroups,
+ sizeof (char *),
+ (GCompareDataFunc) _sort_groups_cmp,
+ NULL);
+ }
+
+ for (g = 0; groups && groups[g]; g++) {
+ const char *group = groups[g];
+
+ keys = g_key_file_get_keys (kf, group, &nkeys, NULL);
if (!keys)
continue;
for (k = 0; keys[k]; k++) {
- int len = strlen (keys[k]);
- char *v;
-
- if (keys[k][len - 1] == '+') {
- char *base_key = g_strndup (keys[k], len - 1);
- char *old_val = g_key_file_get_value (priv->keyfile, groups[g], base_key, NULL);
- char *new_val = g_key_file_get_value (kf, groups[g], keys[k], NULL);
-
- if (old_val && *old_val) {
- char *combined = g_strconcat (old_val, ",", new_val, NULL);
-
- g_key_file_set_value (priv->keyfile, groups[g], base_key, combined);
- g_free (combined);
- } else
- g_key_file_set_value (priv->keyfile, groups[g], base_key, new_val);
-
- g_free (base_key);
- g_free (old_val);
- g_free (new_val);
+ const char *key;
+ char *new_value;
+ char last_char;
+ gsize key_len;
+
+ key = keys[k];
+ g_assert (key && *key);
+ key_len = strlen (key);
+ last_char = key[key_len - 1];
+ if ( key_len > 1
+ && (last_char == '+' || last_char == '-')) {
+ gs_free char *base_key = g_strndup (key, key_len - 1);
+ gboolean is_string_list;
+
+ is_string_list = _setting_is_string_list (group, base_key);
+
+ if ( is_string_list
+ || _setting_is_device_spec (group, base_key)) {
+ gs_unref_ptrarray GPtrArray *new = g_ptr_array_new_with_free_func (g_free);
+ char **iter_val;
+ gs_strfreev char **old_val = NULL;
+ gs_free char **new_val = NULL;
+
+ if (is_string_list) {
+ old_val = g_key_file_get_string_list (keyfile, group, base_key, NULL, NULL);
+ new_val = g_key_file_get_string_list (kf, group, key, NULL, NULL);
+ } else {
+ gs_free char *old_sval = nm_config_keyfile_get_value (keyfile, group, base_key, NM_CONFIG_GET_VALUE_TYPE_SPEC);
+ gs_free char *new_sval = nm_config_keyfile_get_value (kf, group, key, NM_CONFIG_GET_VALUE_TYPE_SPEC);
+ gs_free_slist GSList *old_specs = nm_match_spec_split (old_sval);
+ gs_free_slist GSList *new_specs = nm_match_spec_split (new_sval);
+
+ /* the key is a device spec. This is a special kind of string-list, that
+ * we must split differently. */
+ old_val = _nm_utils_slist_to_strv (old_specs, FALSE);
+ new_val = _nm_utils_slist_to_strv (new_specs, FALSE);
+ }
+
+ /* merge the string lists, by omiting duplicates. */
+
+ for (iter_val = old_val; iter_val && *iter_val; iter_val++) {
+ if ( last_char != '-'
+ || _nm_utils_strv_find_first (new_val, -1, *iter_val) < 0)
+ g_ptr_array_add (new, g_strdup (*iter_val));
+ }
+ for (iter_val = new_val; iter_val && *iter_val; iter_val++) {
+ /* don't add duplicates. That means an "option=a,b"; "option+=a,c" results in "option=a,b,c" */
+ if ( last_char == '+'
+ && _nm_utils_strv_find_first (old_val, -1, *iter_val) < 0)
+ g_ptr_array_add (new, *iter_val);
+ else
+ g_free (*iter_val);
+ }
+
+ if (new->len > 0) {
+ if (is_string_list)
+ nm_config_keyfile_set_string_list (keyfile, group, base_key, (const char *const*) new->pdata, new->len);
+ else {
+ gs_free_slist GSList *specs = NULL;
+ gs_free char *specs_joined = NULL;
+
+ g_ptr_array_add (new, NULL);
+ specs = _nm_utils_strv_to_slist ((char **) new->pdata, FALSE);
+
+ specs_joined = nm_match_spec_join (specs);
+
+ g_key_file_set_value (keyfile, group, base_key, specs_joined);
+ }
+ } else {
+ if (is_string_list)
+ g_key_file_remove_key (keyfile, group, base_key, NULL);
+ else
+ g_key_file_set_value (keyfile, group, base_key, "");
+ }
+ } else {
+ /* For any other settings we don't support extending the option with +/-.
+ * Just drop the key. */
+ }
continue;
}
- g_key_file_set_value (priv->keyfile, groups[g], keys[k],
- v = g_key_file_get_value (kf, groups[g], keys[k], NULL));
- g_free (v);
+ new_value = g_key_file_get_value (kf, group, key, NULL);
+ g_key_file_set_value (keyfile, group, key, new_value);
+ g_free (new_value);
}
g_strfreev (keys);
}
@@ -441,16 +696,22 @@ read_config (NMConfig *config, const char *path, GError **error)
}
static gboolean
-find_base_config (NMConfig *config, GError **error)
+read_base_config (GKeyFile *keyfile,
+ const char *cli_config_main_file,
+ char **out_config_main_file,
+ GError **error)
{
- NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
GError *my_error = NULL;
+ g_return_val_if_fail (keyfile, FALSE);
+ g_return_val_if_fail (out_config_main_file && !*out_config_main_file, FALSE);
+ g_return_val_if_fail (!error || !*error, FALSE);
+
/* Try a user-specified config file first */
- if (cli_config_path) {
+ if (cli_config_main_file) {
/* Bad user-specific config file path is a hard error */
- if (read_config (config, cli_config_path, error)) {
- priv->nm_conf_path = g_strdup (cli_config_path);
+ if (read_config (keyfile, cli_config_main_file, error)) {
+ *out_config_main_file = g_strdup (cli_config_main_file);
return TRUE;
} else
return FALSE;
@@ -464,27 +725,27 @@ find_base_config (NMConfig *config, GError **error)
*/
/* Try deprecated nm-system-settings.conf first */
- if (read_config (config, NM_OLD_SYSTEM_CONF_FILE, &my_error)) {
- priv->nm_conf_path = g_strdup (NM_OLD_SYSTEM_CONF_FILE);
+ if (read_config (keyfile, DEFAULT_CONFIG_MAIN_FILE_OLD, &my_error)) {
+ *out_config_main_file = g_strdup (DEFAULT_CONFIG_MAIN_FILE_OLD);
return TRUE;
}
if (!g_error_matches (my_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) {
nm_log_warn (LOGD_CORE, "Old default config file %s invalid: %s\n",
- NM_OLD_SYSTEM_CONF_FILE,
+ DEFAULT_CONFIG_MAIN_FILE_OLD,
my_error->message);
}
g_clear_error (&my_error);
/* Try the standard config file location next */
- if (read_config (config, NM_DEFAULT_SYSTEM_CONF_FILE, &my_error)) {
- priv->nm_conf_path = g_strdup (NM_DEFAULT_SYSTEM_CONF_FILE);
+ if (read_config (keyfile, DEFAULT_CONFIG_MAIN_FILE, &my_error)) {
+ *out_config_main_file = g_strdup (DEFAULT_CONFIG_MAIN_FILE);
return TRUE;
}
if (!g_error_matches (my_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) {
nm_log_warn (LOGD_CORE, "Default config file %s invalid: %s\n",
- NM_DEFAULT_SYSTEM_CONF_FILE,
+ DEFAULT_CONFIG_MAIN_FILE,
my_error->message);
g_propagate_error (error, my_error);
return FALSE;
@@ -494,21 +755,12 @@ find_base_config (NMConfig *config, GError **error)
/* If for some reason no config file exists, use the default
* config file path.
*/
- priv->nm_conf_path = g_strdup (NM_DEFAULT_SYSTEM_CONF_FILE);
+ *out_config_main_file = g_strdup (DEFAULT_CONFIG_MAIN_FILE);
nm_log_info (LOGD_CORE, "No config file found or given; using %s\n",
- NM_DEFAULT_SYSTEM_CONF_FILE);
+ DEFAULT_CONFIG_MAIN_FILE);
return TRUE;
}
-/************************************************************************/
-
-NMConfig *
-nm_config_get (void)
-{
- g_assert (singleton);
- return singleton;
-}
-
static int
sort_asciibetically (gconstpointer a, gconstpointer b)
{
@@ -518,114 +770,374 @@ sort_asciibetically (gconstpointer a, gconstpointer b)
return strcmp (s1, s2);
}
-/* call this function only once! */
-NMConfig *
-nm_config_new (GError **error)
+static GPtrArray *
+_get_config_dir_files (const char *config_main_file,
+ const char *config_dir,
+ char **out_config_description)
{
- NMConfigPrivate *priv = NULL;
GFile *dir;
GFileEnumerator *direnum;
GFileInfo *info;
GPtrArray *confs;
- const char *name;
- int i;
GString *config_description;
+ const char *name;
+ guint i;
- g_assert (!singleton);
- singleton = NM_CONFIG (g_object_new (NM_TYPE_CONFIG, NULL));
- priv = NM_CONFIG_GET_PRIVATE (singleton);
-
- /* First read the base config file */
- if (!find_base_config (singleton, error)) {
- g_object_unref (singleton);
- singleton = NULL;
- return NULL;
- }
-
- /* Now read the overrides in the config dir */
- if (cli_config_dir)
- priv->config_dir = g_strdup (cli_config_dir);
- else
- priv->config_dir = g_strdup (NM_DEFAULT_SYSTEM_CONF_DIR);
+ g_return_val_if_fail (config_main_file, NULL);
+ g_return_val_if_fail (config_dir, NULL);
+ g_return_val_if_fail (out_config_description && !*out_config_description, NULL);
confs = g_ptr_array_new_with_free_func (g_free);
- config_description = g_string_new (priv->nm_conf_path);
- dir = g_file_new_for_path (priv->config_dir);
+ config_description = g_string_new (config_main_file);
+ dir = g_file_new_for_path (config_dir);
direnum = g_file_enumerate_children (dir, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, NULL);
if (direnum) {
while ((info = g_file_enumerator_next_file (direnum, NULL, NULL))) {
name = g_file_info_get_name (info);
- if (g_str_has_suffix (name, ".conf")) {
- g_ptr_array_add (confs, g_build_filename (priv->config_dir, name, NULL));
- if (confs->len == 1)
- g_string_append (config_description, " and conf.d: ");
- else
- g_string_append (config_description, ", ");
- g_string_append (config_description, name);
- }
+ if (g_str_has_suffix (name, ".conf"))
+ g_ptr_array_add (confs, g_strdup (name));
g_object_unref (info);
}
g_object_unref (direnum);
}
g_object_unref (dir);
- g_ptr_array_sort (confs, sort_asciibetically);
- priv->config_description = g_string_free (config_description, FALSE);
+ if (confs->len > 0) {
+ g_ptr_array_sort (confs, sort_asciibetically);
+ g_string_append (config_description, " and conf.d: ");
+ for (i = 0; i < confs->len; i++) {
+ char *n = confs->pdata[i];
+
+ if (i > 0)
+ g_string_append (config_description, ", ");
+ g_string_append (config_description, n);
+ confs->pdata[i] = g_build_filename (config_dir, n, NULL);
+ g_free (n);
+ }
+ }
+
+ *out_config_description = g_string_free (config_description, FALSE);
+ return confs;
+}
+
+static GKeyFile *
+read_entire_config (const NMConfigCmdLineOptions *cli,
+ const char *config_dir,
+ char **out_config_main_file,
+ char **out_config_description,
+ GError **error)
+{
+ GKeyFile *keyfile = nm_config_create_keyfile ();
+ GPtrArray *confs;
+ guint i;
+ char *o_config_main_file = NULL;
+ char *o_config_description = NULL;
+ char **plugins_tmp;
+
+ g_return_val_if_fail (config_dir, NULL);
+ g_return_val_if_fail (out_config_main_file && !*out_config_main_file, FALSE);
+ g_return_val_if_fail (out_config_description && !*out_config_description, NULL);
+ g_return_val_if_fail (!error || !*error, FALSE);
+
+ /* First read the base config file */
+ if (!read_base_config (keyfile, cli ? cli->config_main_file : NULL, &o_config_main_file, error)) {
+ g_key_file_free (keyfile);
+ return NULL;
+ }
+
+ g_assert (o_config_main_file);
+
+ confs = _get_config_dir_files (o_config_main_file, config_dir, &o_config_description);
for (i = 0; i < confs->len; i++) {
- if (!read_config (singleton, confs->pdata[i], error)) {
- g_object_unref (singleton);
- singleton = NULL;
- break;
+ if (!read_config (keyfile, confs->pdata[i], error)) {
+ g_key_file_free (keyfile);
+ g_free (o_config_main_file);
+ g_free (o_config_description);
+ g_ptr_array_unref (confs);
+ return NULL;
}
}
g_ptr_array_unref (confs);
- if (!singleton)
+
+ /* Merge settings from command line. They overwrite everything read from
+ * config files. */
+
+ if (cli && cli->plugins && cli->plugins[0])
+ g_key_file_set_value (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", cli->plugins);
+ plugins_tmp = g_key_file_get_string_list (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, NULL);
+ if (!plugins_tmp) {
+ if (STRLEN (CONFIG_PLUGINS_DEFAULT) > 0)
+ g_key_file_set_value (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", CONFIG_PLUGINS_DEFAULT);
+ } else
+ g_strfreev (plugins_tmp);
+
+ if (cli && cli->configure_and_quit)
+ g_key_file_set_boolean (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "configure-and-quit", TRUE);
+
+ if (cli && cli->connectivity_uri && cli->connectivity_uri[0])
+ g_key_file_set_string (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "uri", cli->connectivity_uri);
+ if (cli && cli->connectivity_interval >= 0)
+ g_key_file_set_integer (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "interval", cli->connectivity_interval);
+ if (cli && cli->connectivity_response && cli->connectivity_response[0])
+ g_key_file_set_string (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "response", cli->connectivity_response);
+
+ *out_config_main_file = o_config_main_file;
+ *out_config_description = o_config_description;
+ return keyfile;
+}
+
+GSList *
+nm_config_get_device_match_spec (const GKeyFile *keyfile, const char *group, const char *key, gboolean *out_has_key)
+{
+ gs_free char *value = NULL;
+
+ /* nm_match_spec_split() already supports full escaping and is basically
+ * a modified version of g_key_file_parse_value_as_string(). So we first read
+ * the raw value (g_key_file_get_value()), and do the parsing ourselves. */
+ value = g_key_file_get_value ((GKeyFile *) keyfile, group, key, NULL);
+ if (out_has_key)
+ *out_has_key = !!value;
+ return nm_match_spec_split (value);
+}
+
+/************************************************************************/
+
+void
+nm_config_reload (NMConfig *self, int signal)
+{
+ NMConfigPrivate *priv;
+ GError *error = NULL;
+ GKeyFile *keyfile;
+ NMConfigData *new_data = NULL;
+ char *config_main_file = NULL;
+ char *config_description = NULL;
+ gs_strfreev char **no_auto_default = NULL;
+
+ g_return_if_fail (NM_IS_CONFIG (self));
+
+ priv = NM_CONFIG_GET_PRIVATE (self);
+
+ if (signal != SIGHUP) {
+ _set_config_data (self, NULL, signal);
+ return;
+ }
+
+ /* pass on the original command line options. This means, that
+ * options specified at command line cannot ever be reloaded from
+ * file. That seems desirable.
+ */
+ keyfile = read_entire_config (&priv->cli,
+ priv->config_dir,
+ &config_main_file,
+ &config_description,
+ &error);
+ if (!keyfile) {
+ nm_log_err (LOGD_CORE, "Failed to reload the configuration: %s", error->message);
+ g_clear_error (&error);
+ _set_config_data (self, NULL, signal);
+ return;
+ }
+ no_auto_default = no_auto_default_from_file (priv->no_auto_default_file);
+
+ new_data = nm_config_data_new (config_main_file, config_description, (const char *const*) no_auto_default, keyfile);
+ g_free (config_main_file);
+ g_free (config_description);
+ g_key_file_unref (keyfile);
+
+ _set_config_data (self, new_data, signal);
+}
+
+static const char *
+_change_flags_one_to_string (NMConfigChangeFlags flag)
+{
+ switch (flag) {
+ case NM_CONFIG_CHANGE_SIGHUP:
+ return "SIGHUP";
+ case NM_CONFIG_CHANGE_SIGUSR1:
+ return "SIGUSR1";
+ case NM_CONFIG_CHANGE_SIGUSR2:
+ return "SIGUSR2";
+ case NM_CONFIG_CHANGE_CONFIG_FILES:
+ return "config-files";
+ case NM_CONFIG_CHANGE_VALUES:
+ return "values";
+ case NM_CONFIG_CHANGE_CONNECTIVITY:
+ return "connectivity";
+ case NM_CONFIG_CHANGE_NO_AUTO_DEFAULT:
+ return "no-auto-default";
+ case NM_CONFIG_CHANGE_DNS_MODE:
+ return "dns-mode";
+ default:
+ g_return_val_if_reached ("unknown");
+ }
+}
+
+char *
+nm_config_change_flags_to_string (NMConfigChangeFlags flags)
+{
+ GString *str = g_string_new ("");
+ NMConfigChangeFlags s = 0x01;
+
+ while (flags) {
+ if (NM_FLAGS_HAS (flags, s)) {
+ if (str->len)
+ g_string_append_c (str, ',');
+ g_string_append (str, _change_flags_one_to_string (s));
+ }
+ flags = flags & ~s;
+ s <<= 1;
+ }
+ return g_string_free (str, FALSE);
+}
+
+static void
+_set_config_data (NMConfig *self, NMConfigData *new_data, int signal)
+{
+ NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
+ NMConfigData *old_data = priv->config_data;
+ NMConfigChangeFlags changes, changes_diff;
+ gs_free char *log_str = NULL;
+ gboolean had_new_data = !!new_data;
+
+ switch (signal) {
+ case SIGHUP:
+ changes = NM_CONFIG_CHANGE_SIGHUP;
+ break;
+ case SIGUSR1:
+ changes = NM_CONFIG_CHANGE_SIGUSR1;
+ break;
+ case SIGUSR2:
+ changes = NM_CONFIG_CHANGE_SIGUSR2;
+ break;
+ default:
+ changes = NM_CONFIG_CHANGE_NONE;
+ break;
+ }
+
+ if (new_data) {
+ changes_diff = nm_config_data_diff (old_data, new_data);
+ if (changes_diff == NM_CONFIG_CHANGE_NONE)
+ g_clear_object (&new_data);
+ else
+ changes |= changes_diff;
+ }
+
+ if (changes == NM_CONFIG_CHANGE_NONE)
+ return;
+
+ if (new_data) {
+ nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data),
+ (log_str = nm_config_change_flags_to_string (changes)));
+ nm_config_data_log (new_data, "CONFIG: ");
+ priv->config_data = new_data;
+ } else if (had_new_data)
+ nm_log_info (LOGD_CORE, "config: signal %s (no changes from disk)", (log_str = nm_config_change_flags_to_string (changes)));
+ else
+ nm_log_info (LOGD_CORE, "config: signal %s", (log_str = nm_config_change_flags_to_string (changes)));
+ g_signal_emit (self, signals[SIGNAL_CONFIG_CHANGED], 0,
+ new_data ? new_data : old_data,
+ changes, old_data);
+ if (new_data)
+ g_object_unref (old_data);
+}
+
+NM_DEFINE_SINGLETON_DESTRUCTOR (NMConfig);
+NM_DEFINE_SINGLETON_WEAK_REF (NMConfig);
+
+NMConfig *
+nm_config_get (void)
+{
+ g_assert (singleton_instance);
+ return singleton_instance;
+}
+
+NMConfig *
+nm_config_setup (const NMConfigCmdLineOptions *cli, GError **error)
+{
+ g_assert (!singleton_instance);
+
+ singleton_instance = nm_config_new (cli, error);
+ if (singleton_instance)
+ nm_singleton_instance_weak_ref_register ();
+ return singleton_instance;
+}
+
+static gboolean
+init_sync (GInitable *initable, GCancellable *cancellable, GError **error)
+{
+ NMConfig *self = NM_CONFIG (initable);
+ NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
+ GKeyFile *keyfile;
+ char *config_main_file = NULL;
+ char *config_description = NULL;
+ gs_strfreev char **no_auto_default = NULL;
+
+ if (priv->config_dir) {
+ /* Object is already initialized. */
+ if (priv->config_data)
+ return TRUE;
+ g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND, "unspecified error");
+ return FALSE;
+ }
+
+ if (priv->cli.config_dir)
+ priv->config_dir = g_strdup (priv->cli.config_dir);
+ else
+ priv->config_dir = g_strdup (DEFAULT_CONFIG_DIR);
+
+ keyfile = read_entire_config (&priv->cli,
+ priv->config_dir,
+ &config_main_file,
+ &config_description,
+ error);
+ if (!keyfile)
return FALSE;
- /* Handle no-auto-default key and state file */
- priv->no_auto_default = g_key_file_get_string_list (priv->keyfile, "main", "no-auto-default", NULL, NULL);
- if (cli_no_auto_default_file)
- priv->no_auto_default_file = g_strdup (cli_no_auto_default_file);
+ /* Initialize read only private members */
+
+ if (priv->cli.no_auto_default_file)
+ priv->no_auto_default_file = g_strdup (priv->cli.no_auto_default_file);
else
- priv->no_auto_default_file = g_strdup (NM_NO_AUTO_DEFAULT_STATE_FILE);
- merge_no_auto_default_state (singleton);
+ priv->no_auto_default_file = g_strdup (DEFAULT_NO_AUTO_DEFAULT_FILE);
- /* Now let command-line options override the config files, and fill in priv. */
- if (cli_plugins && cli_plugins[0])
- g_key_file_set_value (priv->keyfile, "main", "plugins", cli_plugins);
- priv->plugins = g_key_file_get_string_list (priv->keyfile, "main", "plugins", NULL, NULL);
- if (!priv->plugins && STRLEN (CONFIG_PLUGINS_DEFAULT) > 0)
- priv->plugins = g_strsplit (CONFIG_PLUGINS_DEFAULT, ",", -1);
+ priv->plugins = _nm_utils_strv_cleanup (g_key_file_get_string_list (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "plugins", NULL, NULL),
+ TRUE, TRUE, TRUE);
+ if (!priv->plugins)
+ priv->plugins = g_new0 (char *, 1);
- priv->monitor_connection_files = _get_bool_value (priv->keyfile, "main", "monitor-connection-files", FALSE);
+ priv->monitor_connection_files = nm_config_keyfile_get_boolean (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "monitor-connection-files", FALSE);
- priv->auth_polkit = _get_bool_value (priv->keyfile, "main", "auth-polkit", NM_CONFIG_DEFAULT_AUTH_POLKIT);
+ priv->auth_polkit = nm_config_keyfile_get_boolean (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "auth-polkit", NM_CONFIG_DEFAULT_AUTH_POLKIT);
- priv->dhcp_client = g_key_file_get_value (priv->keyfile, "main", "dhcp", NULL);
- priv->dns_mode = g_key_file_get_value (priv->keyfile, "main", "dns", NULL);
+ priv->dhcp_client = nm_strstrip (g_key_file_get_string (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "dhcp", NULL));
- priv->log_level = g_key_file_get_value (priv->keyfile, "logging", "level", NULL);
- priv->log_domains = g_key_file_get_value (priv->keyfile, "logging", "domains", NULL);
+ priv->log_level = nm_strstrip (g_key_file_get_string (keyfile, NM_CONFIG_KEYFILE_GROUP_LOGGING, "level", NULL));
+ priv->log_domains = nm_strstrip (g_key_file_get_string (keyfile, NM_CONFIG_KEYFILE_GROUP_LOGGING, "domains", NULL));
- priv->debug = g_key_file_get_value (priv->keyfile, "main", "debug", NULL);
+ priv->debug = g_key_file_get_string (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "debug", NULL);
- if (cli_connectivity_uri && cli_connectivity_uri[0])
- g_key_file_set_value (priv->keyfile, "connectivity", "uri", cli_connectivity_uri);
- priv->connectivity_uri = g_key_file_get_value (priv->keyfile, "connectivity", "uri", NULL);
+ priv->configure_and_quit = nm_config_keyfile_get_boolean (keyfile, NM_CONFIG_KEYFILE_GROUP_MAIN, "configure-and-quit", FALSE);
- if (cli_connectivity_interval >= 0)
- g_key_file_set_integer (priv->keyfile, "connectivity", "interval", cli_connectivity_interval);
- priv->connectivity_interval = g_key_file_get_integer (priv->keyfile, "connectivity", "interval", NULL);
+ no_auto_default = no_auto_default_from_file (priv->no_auto_default_file);
- if (cli_connectivity_response && cli_connectivity_response[0])
- g_key_file_set_value (priv->keyfile, "connectivity", "response", cli_connectivity_response);
- priv->connectivity_response = g_key_file_get_value (priv->keyfile, "connectivity", "response", NULL);
+ priv->config_data_orig = nm_config_data_new (config_main_file, config_description, (const char *const*) no_auto_default, keyfile);
- priv->ignore_carrier = g_key_file_get_string_list (priv->keyfile, "main", "ignore-carrier", NULL, NULL);
+ priv->config_data = g_object_ref (priv->config_data_orig);
- priv->configure_and_quit = _get_bool_value (priv->keyfile, "main", "configure-and-quit", FALSE);
+ g_free (config_main_file);
+ g_free (config_description);
+ g_key_file_unref (keyfile);
+ return TRUE;
+}
- return singleton;
+NMConfig *
+nm_config_new (const NMConfigCmdLineOptions *cli, GError **error)
+{
+ return NM_CONFIG (g_initable_new (NM_TYPE_CONFIG,
+ NULL,
+ error,
+ NM_CONFIG_CMD_LINE_OPTIONS, cli,
+ NULL));
}
static void
@@ -634,11 +1146,6 @@ nm_config_init (NMConfig *config)
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (config);
priv->auth_polkit = NM_CONFIG_DEFAULT_AUTH_POLKIT;
-
- priv->keyfile = g_key_file_new ();
- g_key_file_set_list_separator (priv->keyfile, ',');
-
- priv->connectivity_interval = -1;
}
static void
@@ -646,34 +1153,44 @@ finalize (GObject *gobject)
{
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (gobject);
- g_free (priv->nm_conf_path);
g_free (priv->config_dir);
- g_free (priv->config_description);
g_free (priv->no_auto_default_file);
- g_clear_pointer (&priv->keyfile, g_key_file_unref);
g_strfreev (priv->plugins);
g_free (priv->dhcp_client);
- g_free (priv->dns_mode);
g_free (priv->log_level);
g_free (priv->log_domains);
g_free (priv->debug);
- g_free (priv->connectivity_uri);
- g_free (priv->connectivity_response);
- g_strfreev (priv->no_auto_default);
- g_strfreev (priv->ignore_carrier);
- singleton = NULL;
+ _nm_config_cmd_line_options_clear (&priv->cli);
- g_clear_pointer (&cli_config_path, g_free);
- g_clear_pointer (&cli_config_dir, g_free);
- g_clear_pointer (&cli_no_auto_default_file, g_free);
- g_clear_pointer (&cli_plugins, g_free);
- g_clear_pointer (&cli_connectivity_uri, g_free);
- g_clear_pointer (&cli_connectivity_response, g_free);
+ g_clear_object (&priv->config_data);
+ g_clear_object (&priv->config_data_orig);
G_OBJECT_CLASS (nm_config_parent_class)->finalize (gobject);
}
+static void
+set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ NMConfig *self = NM_CONFIG (object);
+ NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
+ NMConfigCmdLineOptions *cli;
+
+ switch (prop_id) {
+ case PROP_CMD_LINE_OPTIONS:
+ /* construct only */
+ cli = g_value_get_pointer (value);
+ if (!cli)
+ _nm_config_cmd_line_options_clear (&priv->cli);
+ else
+ _nm_config_cmd_line_options_copy (cli, &priv->cli);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
static void
nm_config_class_init (NMConfigClass *config_class)
@@ -682,5 +1199,27 @@ nm_config_class_init (NMConfigClass *config_class)
g_type_class_add_private (config_class, sizeof (NMConfigPrivate));
object_class->finalize = finalize;
+ object_class->set_property = set_property;
+
+ g_object_class_install_property
+ (object_class, PROP_CMD_LINE_OPTIONS,
+ g_param_spec_pointer (NM_CONFIG_CMD_LINE_OPTIONS, "", "",
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ signals[SIGNAL_CONFIG_CHANGED] =
+ g_signal_new (NM_CONFIG_SIGNAL_CONFIG_CHANGED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (NMConfigClass, config_changed),
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, NM_TYPE_CONFIG_CHANGE_FLAGS, NM_TYPE_CONFIG_DATA);
+}
+
+static void
+nm_config_initable_iface_init (GInitableIface *iface)
+{
+ iface->init = init_sync;
}
diff --git a/src/nm-config.h b/src/nm-config.h
index 56f75fb5f..5b096f165 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -26,6 +26,7 @@
#include <glib-object.h>
#include "nm-types.h"
+#include "nm-config-data.h"
G_BEGIN_DECLS
@@ -36,43 +37,96 @@ G_BEGIN_DECLS
#define NM_IS_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_CONFIG))
#define NM_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_CONFIG, NMConfigClass))
-typedef struct {
+/* Properties */
+#define NM_CONFIG_CMD_LINE_OPTIONS "cmd-line-options"
+
+/* Signals */
+#define NM_CONFIG_SIGNAL_CONFIG_CHANGED "config-changed"
+
+#define NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL 300
+#define NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE "NetworkManager is online" /* NOT LOCALIZED */
+
+#define NM_CONFIG_KEYFILE_LIST_SEPARATOR ','
+
+#define NM_CONFIG_KEYFILE_GROUPPREFIX_CONNECTION "connection"
+#define NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST ".test-append-stringlist"
+
+#define NM_CONFIG_KEYFILE_GROUP_MAIN "main"
+#define NM_CONFIG_KEYFILE_GROUP_LOGGING "logging"
+#define NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY "connectivity"
+
+#define NM_CONFIG_KEYFILE_GROUP_KEYFILE "keyfile"
+#define NM_CONFIG_KEYFILE_GROUP_IFUPDOWN "ifupdown"
+#define NM_CONFIG_KEYFILE_GROUP_IFNET "ifnet"
+
+#define NM_CONFIG_KEYFILE_KEY_IFNET_AUTO_REFRESH "auto_refresh"
+#define NM_CONFIG_KEYFILE_KEY_IFNET_MANAGED "managed"
+#define NM_CONFIG_KEYFILE_KEY_IFUPDOWN_MANAGED "managed"
+
+typedef struct NMConfigCmdLineOptions NMConfigCmdLineOptions;
+
+struct _NMConfig {
GObject parent;
-} NMConfig;
+};
typedef struct {
GObjectClass parent;
+
+ /* Signals */
+ void (*config_changed) (NMConfig *config, GHashTable *changes, NMConfigData *old_data);
} NMConfigClass;
GType nm_config_get_type (void);
NMConfig *nm_config_get (void);
-const char *nm_config_get_path (NMConfig *config);
-const char *nm_config_get_description (NMConfig *config);
+char *nm_config_change_flags_to_string (NMConfigChangeFlags flags);
+
+NMConfigData *nm_config_get_data (NMConfig *config);
+NMConfigData *nm_config_get_data_orig (NMConfig *config);
+
+#define NM_CONFIG_GET_DATA (nm_config_get_data (nm_config_get ()))
+#define NM_CONFIG_GET_DATA_ORIG (nm_config_get_data_orig (nm_config_get ()))
+
const char **nm_config_get_plugins (NMConfig *config);
gboolean nm_config_get_monitor_connection_files (NMConfig *config);
gboolean nm_config_get_auth_polkit (NMConfig *config);
const char *nm_config_get_dhcp_client (NMConfig *config);
-const char *nm_config_get_dns_mode (NMConfig *config);
const char *nm_config_get_log_level (NMConfig *config);
const char *nm_config_get_log_domains (NMConfig *config);
const char *nm_config_get_debug (NMConfig *config);
-const char *nm_config_get_connectivity_uri (NMConfig *config);
-guint nm_config_get_connectivity_interval (NMConfig *config);
-const char *nm_config_get_connectivity_response (NMConfig *config);
gboolean nm_config_get_configure_and_quit (NMConfig *config);
-gboolean nm_config_get_ethernet_can_auto_default (NMConfig *config, NMDevice *device);
-void nm_config_set_ethernet_no_auto_default (NMConfig *config, NMDevice *device);
-
-gboolean nm_config_get_ignore_carrier (NMConfig *config, NMDevice *device);
-
-char *nm_config_get_value (NMConfig *config, const char *group, const char *key, GError **error);
-
/* for main.c only */
-GOptionEntry *nm_config_get_options (void);
-NMConfig *nm_config_new (GError **error);
+NMConfigCmdLineOptions *nm_config_cmd_line_options_new (void);
+void nm_config_cmd_line_options_free (NMConfigCmdLineOptions *cli);
+void nm_config_cmd_line_options_add_to_entries (NMConfigCmdLineOptions *cli,
+ GOptionContext *opt_ctx);
+
+gboolean nm_config_get_no_auto_default_for_device (NMConfig *config, NMDevice *device);
+void nm_config_set_no_auto_default_for_device (NMConfig *config, NMDevice *device);
+
+NMConfig *nm_config_new (const NMConfigCmdLineOptions *cli, GError **error);
+NMConfig *nm_config_setup (const NMConfigCmdLineOptions *cli, GError **error);
+void nm_config_reload (NMConfig *config, int signal);
+
+gint nm_config_parse_boolean (const char *str, gint default_value);
+
+GKeyFile *nm_config_create_keyfile (void);
+gint nm_config_keyfile_get_boolean (GKeyFile *keyfile,
+ const char *section,
+ const char *key,
+ gint default_value);
+char *nm_config_keyfile_get_value (GKeyFile *keyfile,
+ const char *section,
+ const char *key,
+ NMConfigGetValueFlags flags);
+void nm_config_keyfile_set_string_list (GKeyFile *keyfile,
+ const char *group,
+ const char *key,
+ const char *const* strv,
+ gssize len);
+GSList *nm_config_get_device_match_spec (const GKeyFile *keyfile, const char *group, const char *key, gboolean *out_has_key);
G_END_DECLS
diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c
index 85bd70aed..81ac8f9de 100644
--- a/src/nm-connectivity.c
+++ b/src/nm-connectivity.c
@@ -26,25 +26,43 @@
#include <libsoup/soup.h>
#endif
+#include "nm-glib-compat.h"
+
#include "nm-connectivity.h"
-#include "nm-logging.h"
#include "nm-config.h"
+#include "nm-logging.h"
G_DEFINE_TYPE (NMConnectivity, nm_connectivity, G_TYPE_OBJECT)
#define NM_CONNECTIVITY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_CONNECTIVITY, NMConnectivityPrivate))
-#define DEFAULT_RESPONSE "NetworkManager is online" /* NOT LOCALIZED */
+#define _LOG_DEFAULT_DOMAIN LOGD_CONCHECK
+
+#define _LOG(level, domain, ...) \
+ G_STMT_START { \
+ nm_log ((level), (domain), \
+ "%s" _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
+ "connectivity: " \
+ _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
+ } G_STMT_END
+
+#define _LOGT(...) _LOG (LOGL_TRACE, _LOG_DEFAULT_DOMAIN, __VA_ARGS__)
+#define _LOGD(...) _LOG (LOGL_DEBUG, _LOG_DEFAULT_DOMAIN, __VA_ARGS__)
+#define _LOGI(...) _LOG (LOGL_INFO, _LOG_DEFAULT_DOMAIN, __VA_ARGS__)
+#define _LOGW(...) _LOG (LOGL_WARN, _LOG_DEFAULT_DOMAIN, __VA_ARGS__)
+#define _LOGE(...) _LOG (LOGL_ERR, _LOG_DEFAULT_DOMAIN, __VA_ARGS__)
+
typedef struct {
char *uri;
char *response;
guint interval;
+ gboolean online; /* whether periodic connectivity checking is enabled. */
#if WITH_CONCHECK
SoupSession *soup_session;
- guint pending_checks;
+ gboolean initial_check_obsoleted;
guint check_id;
#endif
@@ -69,8 +87,8 @@ nm_connectivity_get_state (NMConnectivity *connectivity)
return NM_CONNECTIVITY_GET_PRIVATE (connectivity)->state;
}
-static const char *
-state_name (NMConnectivityState state)
+const char *
+nm_connectivity_state_to_string (NMConnectivityState state)
{
switch (state) {
case NM_CONNECTIVITY_UNKNOWN:
@@ -84,7 +102,7 @@ state_name (NMConnectivityState state)
case NM_CONNECTIVITY_FULL:
return "FULL";
default:
- return "???";
+ g_return_val_if_reached ("???");
}
}
@@ -94,31 +112,41 @@ update_state (NMConnectivity *self, NMConnectivityState state)
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
if (priv->state != state) {
- nm_log_dbg (LOGD_CONCHECK, "Connectivity state changed from %s to %s",
- state_name (priv->state), state_name (state));
+ _LOGD ("state changed from %s to %s",
+ nm_connectivity_state_to_string (priv->state),
+ nm_connectivity_state_to_string (state));
priv->state = state;
g_object_notify (G_OBJECT (self), NM_CONNECTIVITY_STATE);
}
}
#if WITH_CONCHECK
+typedef struct {
+ GSimpleAsyncResult *simple;
+ char *uri;
+ char *response;
+ guint check_id_when_scheduled;
+} ConCheckCbData;
+
static void
nm_connectivity_check_cb (SoupSession *session, SoupMessage *msg, gpointer user_data)
{
- GSimpleAsyncResult *simple = user_data;
NMConnectivity *self;
NMConnectivityPrivate *priv;
+ ConCheckCbData *cb_data = user_data;
+ GSimpleAsyncResult *simple = cb_data->simple;
NMConnectivityState new_state;
const char *nm_header;
+ const char *uri = cb_data->uri;
+ const char *response = cb_data->response ? cb_data->response : NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE;
self = NM_CONNECTIVITY (g_async_result_get_source_object (G_ASYNC_RESULT (simple)));
+ /* it is safe to unref @self here, @simple holds yet another reference. */
g_object_unref (self);
priv = NM_CONNECTIVITY_GET_PRIVATE (self);
- priv->pending_checks--;
if (SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)) {
- nm_log_info (LOGD_CONCHECK, "Connectivity check for uri '%s' failed with '%s'.",
- priv->uri, msg->reason_phrase);
+ _LOGI ("check for uri '%s' failed with '%s'", uri, msg->reason_phrase);
new_state = NM_CONNECTIVITY_LIMITED;
goto done;
}
@@ -126,33 +154,48 @@ nm_connectivity_check_cb (SoupSession *session, SoupMessage *msg, gpointer user_
/* Check headers; if we find the NM-specific one we're done */
nm_header = soup_message_headers_get_one (msg->response_headers, "X-NetworkManager-Status");
if (g_strcmp0 (nm_header, "online") == 0) {
- nm_log_dbg (LOGD_CONCHECK, "Connectivity check for uri '%s' with Status header successful.", priv->uri);
+ _LOGD ("check for uri '%s' with Status header successful.", uri);
new_state = NM_CONNECTIVITY_FULL;
} else if (msg->status_code == SOUP_STATUS_OK) {
/* check response */
- if (msg->response_body->data && (g_str_has_prefix (msg->response_body->data, priv->response))) {
- nm_log_dbg (LOGD_CONCHECK, "Connectivity check for uri '%s' successful.",
- priv->uri);
+ if (msg->response_body->data && g_str_has_prefix (msg->response_body->data, response)) {
+ _LOGD ("check for uri '%s' successful.", uri);
new_state = NM_CONNECTIVITY_FULL;
} else {
- nm_log_info (LOGD_CONCHECK, "Connectivity check for uri '%s' did not match expected response '%s'; assuming captive portal.",
- priv->uri, priv->response);
+ _LOGI ("check for uri '%s' did not match expected response '%s'; assuming captive portal.",
+ uri, response);
new_state = NM_CONNECTIVITY_PORTAL;
}
} else {
- nm_log_info (LOGD_CONCHECK, "Connectivity check for uri '%s' returned status '%d %s'; assuming captive portal.",
- priv->uri, msg->status_code, msg->reason_phrase);
+ _LOGI ("check for uri '%s' returned status '%d %s'; assuming captive portal.",
+ uri, msg->status_code, msg->reason_phrase);
new_state = NM_CONNECTIVITY_PORTAL;
}
done:
- update_state (self, new_state);
+ /* Only update the state, if the call was done from external, or if the periodic check
+ * is still the one that called this async check. */
+ if (!cb_data->check_id_when_scheduled || cb_data->check_id_when_scheduled == priv->check_id) {
+ /* Only update the state, if the URI and response parameters did not change
+ * since invocation.
+ * The interval does not matter for exernal calls, and for internal calls
+ * we don't reach this line if the interval changed. */
+ if ( !g_strcmp0 (cb_data->uri, priv->uri)
+ && !g_strcmp0 (cb_data->response, priv->response))
+ update_state (self, new_state);
+ }
g_simple_async_result_set_op_res_gssize (simple, new_state);
g_simple_async_result_complete (simple);
g_object_unref (simple);
+
+ g_free (cb_data->uri);
+ g_free (cb_data->response);
+ g_slice_free (ConCheckCbData, cb_data);
}
+#define IS_PERIODIC_CHECK(callback) (callback == run_check_complete)
+
static void
run_check_complete (GObject *object,
GAsyncResult *result,
@@ -163,7 +206,7 @@ run_check_complete (GObject *object,
nm_connectivity_check_finish (self, result, &error);
if (error) {
- nm_log_err (LOGD_CONCHECK, "Connectivity check failed: %s", error->message);
+ _LOGE ("check failed: %s", error->message);
g_error_free (error);
}
}
@@ -184,39 +227,54 @@ idle_start_periodic_checks (gpointer user_data)
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
priv->check_id = g_timeout_add_seconds (priv->interval, run_check, self);
- if (!priv->pending_checks)
+ if (!priv->initial_check_obsoleted)
run_check (self);
return FALSE;
}
#endif
-void
-nm_connectivity_set_online (NMConnectivity *self,
- gboolean online)
+static void
+_reschedule_periodic_checks (NMConnectivity *self, gboolean force_reschedule)
{
-#if WITH_CONCHECK
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
-#endif
-
- nm_log_dbg (LOGD_CONCHECK, "nm_connectivity_set_online(%s)", online ? "TRUE" : "FALSE");
#if WITH_CONCHECK
- if (online && priv->uri && priv->interval) {
- if (!priv->check_id)
+ if (priv->online && priv->uri && priv->interval) {
+ if (force_reschedule || !priv->check_id) {
+ if (priv->check_id)
+ g_source_remove (priv->check_id);
priv->check_id = g_timeout_add (0, idle_start_periodic_checks, self);
-
- return;
- } else if (priv->check_id) {
- g_source_remove (priv->check_id);
- priv->check_id = 0;
+ priv->initial_check_obsoleted = FALSE;
+ }
+ } else {
+ if (priv->check_id) {
+ g_source_remove (priv->check_id);
+ priv->check_id = 0;
+ }
}
+ if (priv->check_id)
+ return;
#endif
/* Either @online is %TRUE but we aren't checking connectivity, or
* @online is %FALSE. Either way we can update our status immediately.
*/
- update_state (self, online ? NM_CONNECTIVITY_FULL : NM_CONNECTIVITY_NONE);
+ update_state (self, priv->online ? NM_CONNECTIVITY_FULL : NM_CONNECTIVITY_NONE);
+}
+
+void
+nm_connectivity_set_online (NMConnectivity *self,
+ gboolean online)
+{
+ NMConnectivityPrivate *priv= NM_CONNECTIVITY_GET_PRIVATE (self);
+
+ online = !!online;
+ if (priv->online != online) {
+ _LOGD ("set %s", online ? "online" : "offline");
+ priv->online = online;
+ _reschedule_periodic_checks (self, FALSE);
+ }
}
void
@@ -225,38 +283,44 @@ nm_connectivity_check_async (NMConnectivity *self,
gpointer user_data)
{
NMConnectivityPrivate *priv;
-#if WITH_CONCHECK
- SoupMessage *msg;
-#endif
GSimpleAsyncResult *simple;
g_return_if_fail (NM_IS_CONNECTIVITY (self));
priv = NM_CONNECTIVITY_GET_PRIVATE (self);
-#if WITH_CONCHECK
- if (callback == run_check_complete)
- nm_log_dbg (LOGD_CONCHECK, "Periodic connectivity check started with uri '%s'.", priv->uri);
- else
-#endif
- nm_log_dbg (LOGD_CONCHECK, "Connectivity check started with uri '%s'.", priv->uri);
-
simple = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
nm_connectivity_check_async);
#if WITH_CONCHECK
if (priv->uri && priv->interval) {
+ SoupMessage *msg;
+ ConCheckCbData *cb_data = g_slice_new (ConCheckCbData);
+
msg = soup_message_new ("GET", priv->uri);
soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);
/* Disable HTTP/1.1 keepalive; the connection should not persist */
soup_message_headers_append (msg->request_headers, "Connection", "close");
+ cb_data->simple = simple;
+ cb_data->uri = g_strdup (priv->uri);
+ cb_data->response = g_strdup (priv->response);
+
+ /* For internal calls (periodic), remember the check-id at time of scheduling. */
+ cb_data->check_id_when_scheduled = IS_PERIODIC_CHECK (callback) ? priv->check_id : 0;
+
soup_session_queue_message (priv->soup_session,
msg,
nm_connectivity_check_cb,
- simple);
- priv->pending_checks++;
+ cb_data);
+ priv->initial_check_obsoleted = TRUE;
+ _LOGD ("check: send %srequest to '%s'", IS_PERIODIC_CHECK (callback) ? "periodic " : "", priv->uri);
return;
+ } else {
+ g_warn_if_fail (!IS_PERIODIC_CHECK (callback));
+ _LOGD ("check: faking request. Connectivity check disabled");
}
+#else
+ _LOGD ("check: faking request. Compiled without connectivity-check support");
#endif
g_simple_async_result_set_op_res_gssize (simple, priv->state);
@@ -279,38 +343,18 @@ nm_connectivity_check_finish (NMConnectivity *self,
return (NMConnectivityState) g_simple_async_result_get_op_res_gssize (simple);
}
+/**************************************************************************/
NMConnectivity *
-nm_connectivity_new (void)
+nm_connectivity_new (const char *uri,
+ guint interval,
+ const char *response)
{
- NMConnectivity *self;
- NMConfig *config;
- const char *check_response;
-
- config = nm_config_get ();
- check_response = nm_config_get_connectivity_response (config);
-
- self = g_object_new (NM_TYPE_CONNECTIVITY,
- NM_CONNECTIVITY_URI, nm_config_get_connectivity_uri (config),
- NM_CONNECTIVITY_INTERVAL, nm_config_get_connectivity_interval (config),
- NM_CONNECTIVITY_RESPONSE, check_response ? check_response : DEFAULT_RESPONSE,
+ return g_object_new (NM_TYPE_CONNECTIVITY,
+ NM_CONNECTIVITY_URI, uri,
+ NM_CONNECTIVITY_INTERVAL, interval,
+ NM_CONNECTIVITY_RESPONSE, response,
NULL);
- g_return_val_if_fail (self != NULL, NULL);
- update_state (self, NM_CONNECTIVITY_NONE);
-
- return self;
-}
-
-static char *
-get_non_empty_string_value (const GValue *val)
-{
- const char *s;
-
- s = g_value_get_string (val);
- if (s && s[0])
- return g_strdup (s);
- else
- return NULL;
}
static void
@@ -319,32 +363,48 @@ set_property (GObject *object, guint property_id,
{
NMConnectivity *self = NM_CONNECTIVITY (object);
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+ const char *uri, *response;
+ guint interval;
switch (property_id) {
case PROP_URI:
- g_free (priv->uri);
- priv->uri = get_non_empty_string_value (value);
-
+ uri = g_value_get_string (value);
+ if (uri && !*uri)
+ uri = NULL;
#if WITH_CONCHECK
- if (priv->uri) {
- SoupURI *uri = soup_uri_new (priv->uri);
+ if (uri) {
+ SoupURI *soup_uri = soup_uri_new (uri);
- if (!uri || !SOUP_URI_VALID_FOR_HTTP (uri)) {
- nm_log_err (LOGD_CONCHECK, "Invalid uri '%s' for connectivity check.", priv->uri);
- g_free (priv->uri);
- priv->uri = NULL;
+ if (!soup_uri || !SOUP_URI_VALID_FOR_HTTP (soup_uri)) {
+ _LOGE ("invalid uri '%s' for connectivity check.", uri);
+ uri = NULL;
}
- if (uri)
- soup_uri_free (uri);
+ if (soup_uri)
+ soup_uri_free (soup_uri);
}
#endif
+ if (g_strcmp0 (uri, priv->uri) != 0) {
+ g_free (priv->uri);
+ priv->uri = g_strdup (uri);
+ _reschedule_periodic_checks (self, TRUE);
+ }
break;
case PROP_INTERVAL:
- priv->interval = g_value_get_uint (value);
+ interval = g_value_get_uint (value);
+ if (priv->interval != interval) {
+ priv->interval = interval;
+ _reschedule_periodic_checks (self, TRUE);
+ }
break;
case PROP_RESPONSE:
- g_free (priv->response);
- priv->response = get_non_empty_string_value (value);
+ response = g_value_get_string (value);
+ if (g_strcmp0 (response, priv->response) != 0) {
+ /* a response %NULL means, NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE. Any other response
+ * (including "") is accepted. */
+ g_free (priv->response);
+ priv->response = g_strdup (response);
+ _reschedule_periodic_checks (self, TRUE);
+ }
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -367,7 +427,10 @@ get_property (GObject *object, guint property_id,
g_value_set_uint (value, priv->interval);
break;
case PROP_RESPONSE:
- g_value_set_string (value, priv->response);
+ if (priv->response)
+ g_value_set_string (value, priv->response);
+ else
+ g_value_set_static_string (value, NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE);
break;
case PROP_STATE:
g_value_set_uint (value, priv->state);
@@ -382,11 +445,12 @@ get_property (GObject *object, guint property_id,
static void
nm_connectivity_init (NMConnectivity *self)
{
-#if WITH_CONCHECK
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
+#if WITH_CONCHECK
priv->soup_session = soup_session_async_new_with_options (SOUP_SESSION_TIMEOUT, 15, NULL);
#endif
+ priv->state = NM_CONNECTIVITY_NONE;
}
@@ -396,8 +460,8 @@ dispose (GObject *object)
NMConnectivity *self = NM_CONNECTIVITY (object);
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
- g_free (priv->uri);
- g_free (priv->response);
+ g_clear_pointer (&priv->uri, g_free);
+ g_clear_pointer (&priv->response, g_free);
#if WITH_CONCHECK
if (priv->soup_session) {
@@ -426,31 +490,34 @@ nm_connectivity_class_init (NMConnectivityClass *klass)
/* properties */
g_object_class_install_property
- (object_class, PROP_URI,
- g_param_spec_string (NM_CONNECTIVITY_URI, "", "",
- NULL,
- G_PARAM_READWRITE |
- G_PARAM_STATIC_STRINGS));
+ (object_class, PROP_URI,
+ g_param_spec_string (NM_CONNECTIVITY_URI, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
- (object_class, PROP_INTERVAL,
- g_param_spec_uint (NM_CONNECTIVITY_INTERVAL, "", "",
- 0, G_MAXUINT, 300,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_STRINGS));
+ (object_class, PROP_INTERVAL,
+ g_param_spec_uint (NM_CONNECTIVITY_INTERVAL, "", "",
+ 0, G_MAXUINT, NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
- (object_class, PROP_RESPONSE,
- g_param_spec_string (NM_CONNECTIVITY_RESPONSE, "", "",
- DEFAULT_RESPONSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_STRINGS));
+ (object_class, PROP_RESPONSE,
+ g_param_spec_string (NM_CONNECTIVITY_RESPONSE, "", "",
+ NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property
- (object_class, PROP_STATE,
- g_param_spec_uint (NM_CONNECTIVITY_STATE, "", "",
- NM_CONNECTIVITY_UNKNOWN, NM_CONNECTIVITY_FULL, NM_CONNECTIVITY_UNKNOWN,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+ (object_class, PROP_STATE,
+ g_param_spec_uint (NM_CONNECTIVITY_STATE, "", "",
+ NM_CONNECTIVITY_UNKNOWN, NM_CONNECTIVITY_FULL, NM_CONNECTIVITY_UNKNOWN,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
}
diff --git a/src/nm-connectivity.h b/src/nm-connectivity.h
index 771abdc23..fc584d5fe 100644
--- a/src/nm-connectivity.h
+++ b/src/nm-connectivity.h
@@ -51,7 +51,11 @@ typedef struct {
GType nm_connectivity_get_type (void);
-NMConnectivity *nm_connectivity_new (void);
+const char *nm_connectivity_state_to_string (NMConnectivityState state);
+
+NMConnectivity *nm_connectivity_new (const char *uri,
+ guint interval,
+ const char *response);
void nm_connectivity_set_online (NMConnectivity *self,
gboolean online);
diff --git a/src/nm-dbus-manager.c b/src/nm-dbus-manager.c
index f57eeb8e3..7e20b2c16 100644
--- a/src/nm-dbus-manager.c
+++ b/src/nm-dbus-manager.c
@@ -36,6 +36,7 @@
#include <dbus/dbus-glib-lowlevel.h>
#include <string.h>
#include "nm-logging.h"
+#include "NetworkManagerUtils.h"
#define PRIV_SOCK_PATH NMRUNDIR "/private"
#define PRIV_SOCK_TAG "private"
@@ -490,7 +491,7 @@ private_server_setup (NMDBusManager *self)
NMDBusManagerPrivate *priv = NM_DBUS_MANAGER_GET_PRIVATE (self);
/* Skip this step if this is just a test program */
- if (g_test_initialized ())
+ if (nm_utils_get_testing ())
return;
/* Set up our main private DBus socket */
diff --git a/src/nm-dcb.c b/src/nm-dcb.c
index 6faec5c53..8bf3858a3 100644
--- a/src/nm-dcb.c
+++ b/src/nm-dcb.c
@@ -27,7 +27,6 @@
#include "nm-dcb.h"
#include "nm-platform.h"
#include "NetworkManagerUtils.h"
-#include "nm-posix-signals.h"
#include "nm-logging.h"
static const char *helper_names[] = { "dcbtool", "fcoeadm" };
@@ -305,7 +304,7 @@ run_helper (char **argv, guint which, gpointer user_data, GError **error)
nm_log_dbg (LOGD_DCB, "%s", cmdline);
success = g_spawn_sync ("/", argv, NULL, 0 /*G_SPAWN_DEFAULT*/,
- nm_unblock_posix_signals, NULL,
+ NULL, NULL,
&outmsg, &errmsg, &exit_status, error);
/* Log any stderr output */
if (success && WIFEXITED (exit_status) && WEXITSTATUS (exit_status) && (errmsg || outmsg)) {
@@ -355,7 +354,7 @@ carrier_wait (const char *iface, guint secs, gboolean up)
g_return_if_fail (iface != NULL);
- ifindex = nm_platform_link_get_ifindex (iface);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, iface);
if (ifindex > 0) {
/* To work around driver quirks and lldpad handling of carrier status,
* we must wait a short period of time to see if the carrier goes
@@ -366,9 +365,9 @@ carrier_wait (const char *iface, guint secs, gboolean up)
nm_log_dbg (LOGD_DCB, "(%s): cleanup waiting for carrier %s",
iface, up ? "up" : "down");
g_usleep (G_USEC_PER_SEC / 4);
- while (nm_platform_link_is_connected (ifindex) != up && count-- > 0) {
+ while (nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex) != up && count-- > 0) {
g_usleep (G_USEC_PER_SEC / 10);
- nm_platform_link_refresh (ifindex);
+ nm_platform_link_refresh (NM_PLATFORM_GET, ifindex);
}
}
}
diff --git a/src/nm-default-route-manager.c b/src/nm-default-route-manager.c
index 153c1de6b..fbb07ce3f 100644
--- a/src/nm-default-route-manager.c
+++ b/src/nm-default-route-manager.c
@@ -60,7 +60,7 @@ typedef struct {
G_DEFINE_TYPE (NMDefaultRouteManager, nm_default_route_manager, G_TYPE_OBJECT)
-static NMDefaultRouteManager *singleton_instance;
+NM_DEFINE_SINGLETON_GETTER (NMDefaultRouteManager, nm_default_route_manager_get, NM_TYPE_DEFAULT_ROUTE_MANAGER);
#define _LOG(level, addr_family, ...) \
G_STMT_START { \
@@ -87,14 +87,14 @@ static NMDefaultRouteManager *singleton_instance;
#define _LOGW(addr_family, ...) _LOG (LOGL_WARN , addr_family, __VA_ARGS__)
#define _LOGE(addr_family, ...) _LOG (LOGL_ERR , addr_family, __VA_ARGS__)
-#define LOG_ENTRY_FMT "entry[%u/%s:%p:%s:%c%c]"
+#define LOG_ENTRY_FMT "entry[%u/%s:%p:%s:%c:%csync]"
#define LOG_ENTRY_ARGS(entry_idx, entry) \
(entry_idx), \
NM_IS_DEVICE ((entry)->source.pointer) ? "dev" : "vpn", \
(entry)->source.pointer, \
NM_IS_DEVICE ((entry)->source.pointer) ? nm_device_get_iface ((entry)->source.device) : nm_vpn_connection_get_connection_id ((entry)->source.vpn), \
- ((entry)->never_default ? 'N' : 'n'), \
- ((entry)->synced ? 'S' : 's')
+ ((entry)->never_default ? '0' : '1'), \
+ ((entry)->synced ? '+' : '-')
/***********************************************************************************/
@@ -127,7 +127,7 @@ typedef struct {
* to indicate that the ifindex is managed but has no default-route.
* Missing entries also indicate that a certain ifindex has no default-route.
* The difference is that missing entries are considered assumed while on
- * (synced && never_default) entires the absence of the default route
+ * (synced && never_default) entries the absence of the default route
* is enforced. NMDefaultRouteManager will actively remove any default
* route on such ifindexes.
* Also, for VPN sources in addition we track them so that a never-default
@@ -256,7 +256,8 @@ _platform_route_sync_add (const VTableIP *vtable, NMDefaultRouteManager *self, g
return FALSE;
if (vtable->vt->is_ip4) {
- success = nm_platform_ip4_route_add (entry->route.rx.ifindex,
+ success = nm_platform_ip4_route_add (NM_PLATFORM_GET,
+ entry->route.rx.ifindex,
entry->route.rx.source,
0,
0,
@@ -265,7 +266,8 @@ _platform_route_sync_add (const VTableIP *vtable, NMDefaultRouteManager *self, g
entry->effective_metric,
entry->route.rx.mss);
} else {
- success = nm_platform_ip6_route_add (entry->route.rx.ifindex,
+ success = nm_platform_ip6_route_add (NM_PLATFORM_GET,
+ entry->route.rx.ifindex,
entry->route.rx.source,
in6addr_any,
0,
@@ -290,7 +292,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self,
gboolean changed = FALSE;
/* prune all other default routes from this device. */
- routes = vtable->vt->route_get_all (0, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT);
+ routes = vtable->vt->route_get_all (NM_PLATFORM_GET, 0, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT);
for (i = 0; i < routes->len; i++) {
const NMPlatformIPRoute *route;
@@ -299,7 +301,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self,
route = _vt_route_index (vtable, routes, i);
- /* look at all entires and see if the route for this ifindex pair is
+ /* look at all entries and see if the route for this ifindex pair is
* a known entry. */
for (j = 0; j < entries->len; j++) {
Entry *e = g_ptr_array_index (entries, j);
@@ -322,7 +324,7 @@ _platform_route_sync_flush (const VTableIP *vtable, NMDefaultRouteManager *self,
*/
if ( !entry
&& (has_ifindex_synced || ifindex_to_flush == route->ifindex)) {
- vtable->vt->route_delete_default (route->ifindex, route->metric);
+ vtable->vt->route_delete_default (NM_PLATFORM_GET, route->ifindex, route->metric);
changed = TRUE;
}
}
@@ -409,6 +411,30 @@ _get_assumed_interface_metrics (const VTableIP *vtable, NMDefaultRouteManager *s
g_hash_table_add (result, GUINT_TO_POINTER (vtable->vt->metric_normalize (route->metric)));
}
+ /* also add all non-synced metrics from our entries list. We might have there some metrics that
+ * we track as non-synced but that are no longer part of platform routes. Anyway, for now
+ * we still want to treat them as assumed. */
+ for (i = 0; i < entries->len; i++) {
+ gboolean ifindex_has_synced_entry = FALSE;
+ Entry *e_i = g_ptr_array_index (entries, i);
+
+ if (e_i->synced)
+ continue;
+
+ for (j = 0; j < entries->len; j++) {
+ Entry *e_j = g_ptr_array_index (entries, j);
+
+ if ( j != i
+ && (e_j->synced && e_j->route.rx.ifindex == e_i->route.rx.ifindex)) {
+ ifindex_has_synced_entry = TRUE;
+ break;
+ }
+ }
+
+ if (!ifindex_has_synced_entry)
+ g_hash_table_add (result, GUINT_TO_POINTER (vtable->vt->metric_normalize (e_i->route.rx.metric)));
+ }
+
return result;
}
@@ -452,7 +478,7 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c
entries = vtable->get_entries (priv);
- routes = vtable->vt->route_get_all (0, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT);
+ routes = vtable->vt->route_get_all (NM_PLATFORM_GET, 0, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT);
assumed_metrics = _get_assumed_interface_metrics (vtable, self, routes);
@@ -522,23 +548,23 @@ _resync_all (const VTableIP *vtable, NMDefaultRouteManager *self, const Entry *c
* or none. Hence, we only have to remember what is going to change. */
g_array_append_val (changed_metrics, expected_metric);
if (old_entry) {
- _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": update %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry),
+ _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": sync:update %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry),
vtable->vt->route_to_string (&entry->route), (guint) old_entry->effective_metric,
(guint) expected_metric);
} else {
- _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": add %s (%u)", LOG_ENTRY_ARGS (i, entry),
+ _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": sync:add %s (%u)", LOG_ENTRY_ARGS (i, entry),
vtable->vt->route_to_string (&entry->route), (guint) expected_metric);
}
} else if (entry->effective_metric != expected_metric) {
g_array_append_val (changed_metrics, entry->effective_metric);
g_array_append_val (changed_metrics, expected_metric);
- _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": resync metric %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry),
+ _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": sync:metric %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry),
vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric,
(guint) expected_metric);
} else {
if (!_vt_routes_has_entry (vtable, routes, entry)) {
g_array_append_val (changed_metrics, entry->effective_metric);
- _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": readd route %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry),
+ _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": sync:re-add %s (%u -> %u)", LOG_ENTRY_ARGS (i, entry),
vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric,
(guint) entry->effective_metric);
}
@@ -603,10 +629,11 @@ _entry_at_idx_update (const VTableIP *vtable, NMDefaultRouteManager *self, guint
if (!entry->synced && !entry->never_default)
entry->effective_metric = entry->route.rx.metric;
- _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": %s %s",
+ _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": %s %s (%"G_GUINT32_FORMAT")",
LOG_ENTRY_ARGS (entry_idx, entry),
- old_entry ? "update" : "add",
- vtable->vt->route_to_string (&entry->route));
+ old_entry ? "record:update" : "record:add ",
+ vtable->vt->route_to_string (&entry->route),
+ entry->effective_metric);
g_ptr_array_sort_with_data (entries, _sort_entries_cmp, NULL);
@@ -626,7 +653,7 @@ _entry_at_idx_remove (const VTableIP *vtable, NMDefaultRouteManager *self, guint
entry = g_ptr_array_index (entries, entry_idx);
- _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": remove %s (%u)", LOG_ENTRY_ARGS (entry_idx, entry),
+ _LOGD (vtable->vt->addr_family, LOG_ENTRY_FMT": record:remove %s (%u)", LOG_ENTRY_ARGS (entry_idx, entry),
vtable->vt->route_to_string (&entry->route), (guint) entry->effective_metric);
/* Remove the entry from the list (but don't free it yet) */
@@ -740,7 +767,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self,
never_default = nm_ip4_config_get_never_default (vpn_config);
rt.r4.ifindex = ip_ifindex;
rt.r4.source = NM_IP_CONFIG_SOURCE_VPN;
- rt.r4.gateway = nm_vpn_connection_get_ip4_internal_gateway (vpn);
+ rt.r4.gateway = nm_ip4_config_get_gateway (vpn_config);
rt.r4.metric = nm_vpn_connection_get_ip4_route_metric (vpn);
rt.r4.mss = nm_ip4_config_get_mss (vpn_config);
default_route = &rt.rx;
@@ -750,7 +777,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self,
vpn_config = nm_vpn_connection_get_ip6_config (vpn);
if (vpn_config) {
- const struct in6_addr *int_gw = nm_vpn_connection_get_ip6_internal_gateway (vpn);
+ const struct in6_addr *int_gw = nm_ip6_config_get_gateway (vpn_config);
never_default = nm_ip6_config_get_never_default (vpn_config);
rt.r6.ifindex = ip_ifindex;
@@ -762,11 +789,24 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self,
}
}
}
- synced = TRUE;
+ if (nm_vpn_connection_get_ip_ifindex (vpn) > 0)
+ synced = TRUE;
+ else {
+ /* a VPN connection without tunnel device cannot have a non-synced, missing default route.
+ * Either it has a default route (which is synced), or it has no entry. */
+ synced = default_route && !never_default;
+ }
}
}
+
g_assert (!default_route || default_route->plen == 0);
+ if (!synced && never_default) {
+ /* having a non-synced, never-default entry is non-sensical. Unset
+ * @default_route so that we don't add such an entry below. */
+ default_route = NULL;
+ }
+
if (!entry && !default_route)
/* nothing to do */;
else if (!entry) {
@@ -830,48 +870,60 @@ nm_default_route_manager_ip6_update_default_route (NMDefaultRouteManager *self,
/***********************************************************************************/
static gboolean
-_ipx_connection_has_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, NMConnection *connection)
+_ipx_connection_has_default_route (const VTableIP *vtable, NMDefaultRouteManager *self, NMConnection *connection, gboolean *out_is_never_default)
{
const char *method;
NMSettingIPConfig *s_ip;
+ gboolean is_never_default = FALSE;
+ gboolean has_default_route = FALSE;
g_return_val_if_fail (NM_IS_DEFAULT_ROUTE_MANAGER (self), FALSE);
- g_return_val_if_fail (NM_IS_CONNECTION (connection), FALSE);
+
+ if (!connection)
+ goto out;
if (vtable->vt->is_ip4)
s_ip = nm_connection_get_setting_ip4_config (connection);
else
s_ip = nm_connection_get_setting_ip6_config (connection);
- if (!s_ip || nm_setting_ip_config_get_never_default (s_ip))
- return FALSE;
+ if (!s_ip)
+ goto out;
+ if (nm_setting_ip_config_get_never_default (s_ip)) {
+ is_never_default = TRUE;
+ goto out;
+ }
if (vtable->vt->is_ip4) {
method = nm_utils_get_ip_config_method (connection, NM_TYPE_SETTING_IP4_CONFIG);
if ( !method
|| !strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED)
|| !strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL))
- return FALSE;
+ goto out;
} else {
method = nm_utils_get_ip_config_method (connection, NM_TYPE_SETTING_IP6_CONFIG);
if ( !method
|| !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE)
|| !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL))
- return FALSE;
+ goto out;
}
- return TRUE;
+ has_default_route = TRUE;
+out:
+ if (out_is_never_default)
+ *out_is_never_default = is_never_default;
+ return has_default_route;
}
gboolean
-nm_default_route_manager_ip4_connection_has_default_route (NMDefaultRouteManager *self, NMConnection *connection)
+nm_default_route_manager_ip4_connection_has_default_route (NMDefaultRouteManager *self, NMConnection *connection, gboolean *out_is_never_default)
{
- return _ipx_connection_has_default_route (&vtable_ip4, self, connection);
+ return _ipx_connection_has_default_route (&vtable_ip4, self, connection, out_is_never_default);
}
gboolean
-nm_default_route_manager_ip6_connection_has_default_route (NMDefaultRouteManager *self, NMConnection *connection)
+nm_default_route_manager_ip6_connection_has_default_route (NMDefaultRouteManager *self, NMConnection *connection, gboolean *out_is_never_default)
{
- return _ipx_connection_has_default_route (&vtable_ip6, self, connection);
+ return _ipx_connection_has_default_route (&vtable_ip6, self, connection, out_is_never_default);
}
/***********************************************************************************/
@@ -970,7 +1022,7 @@ _ipx_get_best_activating_device (const VTableIP *vtable, NMDefaultRouteManager *
|| state >= NM_DEVICE_STATE_DEACTIVATING)
continue;
- if (!_ipx_connection_has_default_route (vtable, self, nm_device_get_connection (device)))
+ if (!_ipx_connection_has_default_route (vtable, self, nm_device_get_connection (device), NULL))
continue;
prio = nm_device_get_ip4_route_metric (device);
@@ -1171,18 +1223,6 @@ static const VTableIP vtable_ip6 = {
/***********************************************************************************/
-NMDefaultRouteManager *
-nm_default_route_manager_get ()
-{
- if (G_UNLIKELY (!singleton_instance)) {
- singleton_instance = NM_DEFAULT_ROUTE_MANAGER (g_object_new (NM_TYPE_DEFAULT_ROUTE_MANAGER, NULL));
- g_object_add_weak_pointer (G_OBJECT (singleton_instance), (gpointer *) &singleton_instance);
- }
- return singleton_instance;
-}
-
-/***********************************************************************************/
-
static gboolean
_resync_idle_now (NMDefaultRouteManager *self)
{
@@ -1239,8 +1279,8 @@ _resync_idle_reschedule (NMDefaultRouteManager *self)
{
NMDefaultRouteManagerPrivate *priv = NM_DEFAULT_ROUTE_MANAGER_GET_PRIVATE (self);
- /* since we react on external changes and readd/remove default routes for
- * the interfaces we manage, there could be the erronous situation where two applications
+ /* since we react on external changes and re-add/remove default routes for
+ * the interfaces we manage, there could be the erroneous situation where two applications
* fight over a certain default route.
* Avoid this, by increasingly wait longer to touch the system (backoff wait time). */
@@ -1286,47 +1326,30 @@ _platform_ipx_route_changed_cb (const VTableIP *vtable,
}
static void
-_platform_ip4_address_changed_cb (NMPlatform *platform,
- int ifindex,
- gpointer platform_object,
- NMPlatformSignalChangeType change_type,
- NMPlatformReason reason,
- NMDefaultRouteManager *self)
-{
- _platform_ipx_route_changed_cb (&vtable_ip4, self, NULL);
-}
-
-static void
-_platform_ip6_address_changed_cb (NMPlatform *platform,
- int ifindex,
- gpointer platform_object,
- NMPlatformSignalChangeType change_type,
- NMPlatformReason reason,
- NMDefaultRouteManager *self)
-{
- _platform_ipx_route_changed_cb (&vtable_ip6, self, NULL);
-}
-
-static void
-_platform_ip4_route_changed_cb (NMPlatform *platform,
- int ifindex,
- gpointer platform_object,
- NMPlatformSignalChangeType change_type,
- NMPlatformReason reason,
- NMDefaultRouteManager *self)
-{
- _platform_ipx_route_changed_cb (&vtable_ip4, self, platform_object);
-}
-
-static void
-_platform_ip6_route_changed_cb (NMPlatform *platform,
- int ifindex,
- gpointer platform_object,
- NMPlatformSignalChangeType change_type,
- NMPlatformReason reason,
- NMDefaultRouteManager *self)
+_platform_changed_cb (NMPlatform *platform,
+ NMPObjectType obj_type,
+ int ifindex,
+ gpointer platform_object,
+ NMPlatformSignalChangeType change_type,
+ NMPlatformReason reason,
+ NMDefaultRouteManager *self)
{
- _platform_ipx_route_changed_cb (&vtable_ip6, self, platform_object);
+ switch (obj_type) {
+ case NMP_OBJECT_TYPE_IP4_ADDRESS:
+ _platform_ipx_route_changed_cb (&vtable_ip4, self, NULL);
+ break;
+ case NMP_OBJECT_TYPE_IP6_ADDRESS:
+ _platform_ipx_route_changed_cb (&vtable_ip6, self, NULL);
+ break;
+ case NMP_OBJECT_TYPE_IP4_ROUTE:
+ _platform_ipx_route_changed_cb (&vtable_ip4, self, (const NMPlatformIPRoute *) platform_object);
+ break;
+ case NMP_OBJECT_TYPE_IP6_ROUTE:
+ _platform_ipx_route_changed_cb (&vtable_ip6, self, (const NMPlatformIPRoute *) platform_object);
+ break;
+ default:
+ g_return_if_reached ();
+ }
}
/***********************************************************************************/
@@ -1340,10 +1363,10 @@ nm_default_route_manager_init (NMDefaultRouteManager *self)
priv->entries_ip6 = g_ptr_array_new_full (0, (GDestroyNotify) _entry_free);
priv->platform = g_object_ref (nm_platform_get ());
- g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (_platform_ip4_address_changed_cb), self);
- g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (_platform_ip6_address_changed_cb), self);
- g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (_platform_ip4_route_changed_cb), self);
- g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (_platform_ip6_route_changed_cb), self);
+ g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, G_CALLBACK (_platform_changed_cb), self);
+ g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, G_CALLBACK (_platform_changed_cb), self);
+ g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (_platform_changed_cb), self);
+ g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, G_CALLBACK (_platform_changed_cb), self);
}
static void
@@ -1355,7 +1378,7 @@ dispose (GObject *object)
priv->disposed = TRUE;
if (priv->platform) {
- g_signal_handlers_disconnect_by_data (priv->platform, self);
+ g_signal_handlers_disconnect_by_func (priv->platform, G_CALLBACK (_platform_changed_cb), self);
g_clear_object (&priv->platform);
}
diff --git a/src/nm-default-route-manager.h b/src/nm-default-route-manager.h
index d8e422735..7fc27bbd1 100644
--- a/src/nm-default-route-manager.h
+++ b/src/nm-default-route-manager.h
@@ -51,8 +51,8 @@ NMDefaultRouteManager *nm_default_route_manager_get (void);
void nm_default_route_manager_ip4_update_default_route (NMDefaultRouteManager *manager, gpointer source);
void nm_default_route_manager_ip6_update_default_route (NMDefaultRouteManager *manager, gpointer source);
-gboolean nm_default_route_manager_ip4_connection_has_default_route (NMDefaultRouteManager *manager, NMConnection *connection);
-gboolean nm_default_route_manager_ip6_connection_has_default_route (NMDefaultRouteManager *manager, NMConnection *connection);
+gboolean nm_default_route_manager_ip4_connection_has_default_route (NMDefaultRouteManager *manager, NMConnection *connection, gboolean *out_is_never_default);
+gboolean nm_default_route_manager_ip6_connection_has_default_route (NMDefaultRouteManager *manager, NMConnection *connection, gboolean *out_is_never_default);
NMDevice *nm_default_route_manager_ip4_get_best_device (NMDefaultRouteManager *manager, const GSList *devices, gboolean fully_activated, NMDevice *preferred_device);
NMDevice *nm_default_route_manager_ip6_get_best_device (NMDefaultRouteManager *manager, const GSList *devices, gboolean fully_activated, NMDevice *preferred_device);
diff --git a/src/nm-dispatcher.c b/src/nm-dispatcher.c
index 4e2002660..13352ded0 100644
--- a/src/nm-dispatcher.c
+++ b/src/nm-dispatcher.c
@@ -372,7 +372,7 @@ static const char *action_table[] = {
static const char *
action_to_string (DispatcherAction action)
{
- g_assert (action >= 0 && action < G_N_ELEMENTS (action_table));
+ g_assert ((gsize) action < G_N_ELEMENTS (action_table));
return action_table[action];
}
diff --git a/src/nm-enum-types.c b/src/nm-enum-types.c
index c3f15f389..f92158d32 100644
--- a/src/nm-enum-types.c
+++ b/src/nm-enum-types.c
@@ -39,6 +39,8 @@
#include "nm-fake-platform.h"
#include "nm-linux-platform.h"
#include "nm-platform.h"
+#include "nm-platform-utils.h"
+#include "nmp-object.h"
#include "wifi-utils-nl80211.h"
#include "wifi-utils-private.h"
#include "wifi-utils.h"
@@ -65,17 +67,18 @@
#include "nm-supplicant-manager.h"
#include "nm-supplicant-settings-verify.h"
#include "nm-supplicant-types.h"
-#include "nm-call-store.h"
#include "nm-vpn-connection.h"
#include "nm-vpn-manager.h"
#include "nm-vpn-service.h"
#include "nm-activation-request.h"
#include "nm-active-connection.h"
#include "nm-config.h"
+#include "nm-config-data.h"
#include "nm-connection-provider.h"
#include "nm-connectivity.h"
#include "nm-dbus-manager.h"
#include "nm-dcb.h"
+#include "nm-route-manager.h"
#include "nm-default-route-manager.h"
#include "nm-dhcp4-config.h"
#include "nm-dhcp6-config.h"
@@ -88,8 +91,8 @@
#include "nm-auth-subject.h"
#include "nm-auth-utils.h"
#include "nm-manager.h"
+#include "nm-multi-index.h"
#include "nm-policy.h"
-#include "nm-posix-signals.h"
#include "nm-properties-changed-signal.h"
#include "nm-rfkill-manager.h"
#include "nm-session-monitor.h"
@@ -133,6 +136,7 @@ nm_unmanaged_flags_get_type (void)
{ NM_UNMANAGED_USER, "NM_UNMANAGED_USER", "nm-unmanaged-user" },
{ NM_UNMANAGED_PARENT, "NM_UNMANAGED_PARENT", "nm-unmanaged-parent" },
{ NM_UNMANAGED_EXTERNAL_DOWN, "NM_UNMANAGED_EXTERNAL_DOWN", "nm-unmanaged-external-down" },
+ { NM_UNMANAGED_PLATFORM_INIT, "NM_UNMANAGED_PLATFORM_INIT", "nm-unmanaged-platform-init" },
{ __NM_UNMANAGED_LAST, "__NM_UNMANAGED_LAST", "--nm-unmanaged-last" },
{ NM_UNMANAGED_LAST, "NM_UNMANAGED_LAST", "nm-unmanaged-last" },
{ NM_UNMANAGED_ALL, "NM_UNMANAGED_ALL", "nm-unmanaged-all" },
@@ -231,29 +235,6 @@ nm_dns_masq_status_get_type (void)
return g_define_type_id__volatile;
}
GType
-nm_platform_error_get_type (void)
-{
- static volatile gsize g_define_type_id__volatile = 0;
-
- if (g_once_init_enter (&g_define_type_id__volatile))
- {
- static const GEnumValue values[] = {
- { NM_PLATFORM_ERROR_NONE, "NM_PLATFORM_ERROR_NONE", "none" },
- { NM_PLATFORM_ERROR_NOT_FOUND, "NM_PLATFORM_ERROR_NOT_FOUND", "not-found" },
- { NM_PLATFORM_ERROR_EXISTS, "NM_PLATFORM_ERROR_EXISTS", "exists" },
- { NM_PLATFORM_ERROR_WRONG_TYPE, "NM_PLATFORM_ERROR_WRONG_TYPE", "wrong-type" },
- { NM_PLATFORM_ERROR_NOT_SLAVE, "NM_PLATFORM_ERROR_NOT_SLAVE", "not-slave" },
- { NM_PLATFORM_ERROR_NO_FIRMWARE, "NM_PLATFORM_ERROR_NO_FIRMWARE", "no-firmware" },
- { 0, NULL, NULL }
- };
- GType g_define_type_id =
- g_enum_register_static (g_intern_static_string ("NMPlatformError"), values);
- g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
- }
-
- return g_define_type_id__volatile;
-}
-GType
nm_platform_reason_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
@@ -283,6 +264,7 @@ nm_platform_signal_change_type_get_type (void)
if (g_once_init_enter (&g_define_type_id__volatile))
{
static const GEnumValue values[] = {
+ { NM_PLATFORM_SIGNAL_NONE, "NM_PLATFORM_SIGNAL_NONE", "none" },
{ NM_PLATFORM_SIGNAL_ADDED, "NM_PLATFORM_SIGNAL_ADDED", "added" },
{ NM_PLATFORM_SIGNAL_CHANGED, "NM_PLATFORM_SIGNAL_CHANGED", "changed" },
{ NM_PLATFORM_SIGNAL_REMOVED, "NM_PLATFORM_SIGNAL_REMOVED", "removed" },
@@ -296,26 +278,6 @@ nm_platform_signal_change_type_get_type (void)
return g_define_type_id__volatile;
}
GType
-nm_platform_get_route_mode_get_type (void)
-{
- static volatile gsize g_define_type_id__volatile = 0;
-
- if (g_once_init_enter (&g_define_type_id__volatile))
- {
- static const GEnumValue values[] = {
- { NM_PLATFORM_GET_ROUTE_MODE_ALL, "NM_PLATFORM_GET_ROUTE_MODE_ALL", "all" },
- { NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT, "NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT", "no-default" },
- { NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT, "NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT", "only-default" },
- { 0, NULL, NULL }
- };
- GType g_define_type_id =
- g_enum_register_static (g_intern_static_string ("NMPlatformGetRouteMode"), values);
- g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
- }
-
- return g_define_type_id__volatile;
-}
-GType
nm_rdisc_dhcp_level_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
@@ -522,6 +484,56 @@ nm_opt_type_get_type (void)
return g_define_type_id__volatile;
}
GType
+nm_config_get_value_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { NM_CONFIG_GET_VALUE_NONE, "NM_CONFIG_GET_VALUE_NONE", "none" },
+ { NM_CONFIG_GET_VALUE_RAW, "NM_CONFIG_GET_VALUE_RAW", "raw" },
+ { NM_CONFIG_GET_VALUE_STRIP, "NM_CONFIG_GET_VALUE_STRIP", "strip" },
+ { NM_CONFIG_GET_VALUE_NO_EMPTY, "NM_CONFIG_GET_VALUE_NO_EMPTY", "no-empty" },
+ { NM_CONFIG_GET_VALUE_TYPE_SPEC, "NM_CONFIG_GET_VALUE_TYPE_SPEC", "type-spec" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("NMConfigGetValueFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+nm_config_change_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { NM_CONFIG_CHANGE_NONE, "NM_CONFIG_CHANGE_NONE", "nm-config-change-none" },
+ { NM_CONFIG_CHANGE_SIGHUP, "NM_CONFIG_CHANGE_SIGHUP", "nm-config-change-sighup" },
+ { NM_CONFIG_CHANGE_SIGUSR1, "NM_CONFIG_CHANGE_SIGUSR1", "nm-config-change-sigusr1" },
+ { NM_CONFIG_CHANGE_SIGUSR2, "NM_CONFIG_CHANGE_SIGUSR2", "nm-config-change-sigusr2" },
+ { NM_CONFIG_CHANGE_CONFIG_FILES, "NM_CONFIG_CHANGE_CONFIG_FILES", "nm-config-change-config-files" },
+ { NM_CONFIG_CHANGE_VALUES, "NM_CONFIG_CHANGE_VALUES", "nm-config-change-values" },
+ { NM_CONFIG_CHANGE_CONNECTIVITY, "NM_CONFIG_CHANGE_CONNECTIVITY", "nm-config-change-connectivity" },
+ { NM_CONFIG_CHANGE_NO_AUTO_DEFAULT, "NM_CONFIG_CHANGE_NO_AUTO_DEFAULT", "nm-config-change-no-auto-default" },
+ { NM_CONFIG_CHANGE_DNS_MODE, "NM_CONFIG_CHANGE_DNS_MODE", "nm-config-change-dns-mode" },
+ { _NM_CONFIG_CHANGE_LAST, "_NM_CONFIG_CHANGE_LAST", "-nm-config-change-last" },
+ { NM_CONFIG_CHANGE_ALL, "NM_CONFIG_CHANGE_ALL", "nm-config-change-all" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("NMConfigChangeFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
nm_dispatcher_action_get_type (void)
{
static volatile gsize g_define_type_id__volatile = 0;
@@ -640,16 +652,18 @@ nm_ip_config_source_get_type (void)
if (g_once_init_enter (&g_define_type_id__volatile))
{
static const GEnumValue values[] = {
- { NM_IP_CONFIG_SOURCE_UNKNOWN, "NM_IP_CONFIG_SOURCE_UNKNOWN", "unknown" },
- { NM_IP_CONFIG_SOURCE_KERNEL, "NM_IP_CONFIG_SOURCE_KERNEL", "kernel" },
- { NM_IP_CONFIG_SOURCE_SHARED, "NM_IP_CONFIG_SOURCE_SHARED", "shared" },
- { NM_IP_CONFIG_SOURCE_IP4LL, "NM_IP_CONFIG_SOURCE_IP4LL", "ip4ll" },
- { NM_IP_CONFIG_SOURCE_PPP, "NM_IP_CONFIG_SOURCE_PPP", "ppp" },
- { NM_IP_CONFIG_SOURCE_WWAN, "NM_IP_CONFIG_SOURCE_WWAN", "wwan" },
- { NM_IP_CONFIG_SOURCE_VPN, "NM_IP_CONFIG_SOURCE_VPN", "vpn" },
- { NM_IP_CONFIG_SOURCE_DHCP, "NM_IP_CONFIG_SOURCE_DHCP", "dhcp" },
- { NM_IP_CONFIG_SOURCE_RDISC, "NM_IP_CONFIG_SOURCE_RDISC", "rdisc" },
- { NM_IP_CONFIG_SOURCE_USER, "NM_IP_CONFIG_SOURCE_USER", "user" },
+ { NM_IP_CONFIG_SOURCE_UNKNOWN, "NM_IP_CONFIG_SOURCE_UNKNOWN", "nm-ip-config-source-unknown" },
+ { _NM_IP_CONFIG_SOURCE_RTM_F_CLONED, "_NM_IP_CONFIG_SOURCE_RTM_F_CLONED", "-nm-ip-config-source-rtm-f-cloned" },
+ { NM_IP_CONFIG_SOURCE_RTPROT_KERNEL, "NM_IP_CONFIG_SOURCE_RTPROT_KERNEL", "nm-ip-config-source-rtprot-kernel" },
+ { NM_IP_CONFIG_SOURCE_KERNEL, "NM_IP_CONFIG_SOURCE_KERNEL", "nm-ip-config-source-kernel" },
+ { NM_IP_CONFIG_SOURCE_SHARED, "NM_IP_CONFIG_SOURCE_SHARED", "nm-ip-config-source-shared" },
+ { NM_IP_CONFIG_SOURCE_IP4LL, "NM_IP_CONFIG_SOURCE_IP4LL", "nm-ip-config-source-ip4ll" },
+ { NM_IP_CONFIG_SOURCE_PPP, "NM_IP_CONFIG_SOURCE_PPP", "nm-ip-config-source-ppp" },
+ { NM_IP_CONFIG_SOURCE_WWAN, "NM_IP_CONFIG_SOURCE_WWAN", "nm-ip-config-source-wwan" },
+ { NM_IP_CONFIG_SOURCE_VPN, "NM_IP_CONFIG_SOURCE_VPN", "nm-ip-config-source-vpn" },
+ { NM_IP_CONFIG_SOURCE_DHCP, "NM_IP_CONFIG_SOURCE_DHCP", "nm-ip-config-source-dhcp" },
+ { NM_IP_CONFIG_SOURCE_RDISC, "NM_IP_CONFIG_SOURCE_RDISC", "nm-ip-config-source-rdisc" },
+ { NM_IP_CONFIG_SOURCE_USER, "NM_IP_CONFIG_SOURCE_USER", "nm-ip-config-source-user" },
{ 0, NULL, NULL }
};
GType g_define_type_id =
@@ -688,6 +702,7 @@ nm_link_type_get_type (void)
{ NM_LINK_TYPE_VETH, "NM_LINK_TYPE_VETH", "veth" },
{ NM_LINK_TYPE_VLAN, "NM_LINK_TYPE_VLAN", "vlan" },
{ NM_LINK_TYPE_VXLAN, "NM_LINK_TYPE_VXLAN", "vxlan" },
+ { NM_LINK_TYPE_BNEP, "NM_LINK_TYPE_BNEP", "bnep" },
{ NM_LINK_TYPE_BRIDGE, "NM_LINK_TYPE_BRIDGE", "bridge" },
{ NM_LINK_TYPE_BOND, "NM_LINK_TYPE_BOND", "bond" },
{ NM_LINK_TYPE_TEAM, "NM_LINK_TYPE_TEAM", "team" },
@@ -700,6 +715,74 @@ nm_link_type_get_type (void)
return g_define_type_id__volatile;
}
+GType
+nm_pobject_type_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { NMP_OBJECT_TYPE_UNKNOWN, "NMP_OBJECT_TYPE_UNKNOWN", "nmp-object-type-unknown" },
+ { NMP_OBJECT_TYPE_LINK, "NMP_OBJECT_TYPE_LINK", "nmp-object-type-link" },
+ { NMP_OBJECT_TYPE_IP4_ADDRESS, "NMP_OBJECT_TYPE_IP4_ADDRESS", "nmp-object-type-ip4-address" },
+ { NMP_OBJECT_TYPE_IP6_ADDRESS, "NMP_OBJECT_TYPE_IP6_ADDRESS", "nmp-object-type-ip6-address" },
+ { NMP_OBJECT_TYPE_IP4_ROUTE, "NMP_OBJECT_TYPE_IP4_ROUTE", "nmp-object-type-ip4-route" },
+ { NMP_OBJECT_TYPE_IP6_ROUTE, "NMP_OBJECT_TYPE_IP6_ROUTE", "nmp-object-type-ip6-route" },
+ { __NMP_OBJECT_TYPE_LAST, "__NMP_OBJECT_TYPE_LAST", "--nmp-object-type-last" },
+ { NMP_OBJECT_TYPE_MAX, "NMP_OBJECT_TYPE_MAX", "nmp-object-type-max" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("NMPObjectType"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+nm_match_spec_match_type_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GEnumValue values[] = {
+ { NM_MATCH_SPEC_NO_MATCH, "NM_MATCH_SPEC_NO_MATCH", "no-match" },
+ { NM_MATCH_SPEC_MATCH, "NM_MATCH_SPEC_MATCH", "match" },
+ { NM_MATCH_SPEC_NEG_MATCH, "NM_MATCH_SPEC_NEG_MATCH", "neg-match" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_enum_register_static (g_intern_static_string ("NMMatchSpecMatchType"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+GType
+nm_utils_test_flags_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ static const GFlagsValue values[] = {
+ { NM_UTILS_TEST_NONE, "NM_UTILS_TEST_NONE", "nm-utils-test-none" },
+ { _NM_UTILS_TEST_INITIALIZED, "_NM_UTILS_TEST_INITIALIZED", "-nm-utils-test-initialized" },
+ { _NM_UTILS_TEST_GENERAL, "_NM_UTILS_TEST_GENERAL", "-nm-utils-test-general" },
+ { NM_UTILS_TEST_NO_KEYFILE_OWNER_CHECK, "NM_UTILS_TEST_NO_KEYFILE_OWNER_CHECK", "nm-utils-test-no-keyfile-owner-check" },
+ { _NM_UTILS_TEST_LAST, "_NM_UTILS_TEST_LAST", "-nm-utils-test-last" },
+ { NM_UTILS_TEST_ALL, "NM_UTILS_TEST_ALL", "nm-utils-test-all" },
+ { 0, NULL, NULL }
+ };
+ GType g_define_type_id =
+ g_flags_register_static (g_intern_static_string ("NMUtilsTestFlags"), values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
diff --git a/src/nm-enum-types.h b/src/nm-enum-types.h
index 01d7bb442..86f17f040 100644
--- a/src/nm-enum-types.h
+++ b/src/nm-enum-types.h
@@ -22,14 +22,10 @@ GType nm_dns_manager_resolv_conf_mode_get_type (void) G_GNUC_CONST;
#define NM_TYPE_DNS_MANAGER_RESOLV_CONF_MODE (nm_dns_manager_resolv_conf_mode_get_type ())
GType nm_dns_masq_status_get_type (void) G_GNUC_CONST;
#define NM_TYPE_DNS_MASQ_STATUS (nm_dns_masq_status_get_type ())
-GType nm_platform_error_get_type (void) G_GNUC_CONST;
-#define NM_TYPE_PLATFORM_ERROR (nm_platform_error_get_type ())
GType nm_platform_reason_get_type (void) G_GNUC_CONST;
#define NM_TYPE_PLATFORM_REASON (nm_platform_reason_get_type ())
GType nm_platform_signal_change_type_get_type (void) G_GNUC_CONST;
#define NM_TYPE_PLATFORM_SIGNAL_CHANGE_TYPE (nm_platform_signal_change_type_get_type ())
-GType nm_platform_get_route_mode_get_type (void) G_GNUC_CONST;
-#define NM_TYPE_PLATFORM_GET_ROUTE_MODE (nm_platform_get_route_mode_get_type ())
GType nm_rdisc_dhcp_level_get_type (void) G_GNUC_CONST;
#define NM_TYPE_RDISC_DHCP_LEVEL (nm_rdisc_dhcp_level_get_type ())
GType nm_rdisc_preference_get_type (void) G_GNUC_CONST;
@@ -48,6 +44,10 @@ GType nm_ap_support_get_type (void) G_GNUC_CONST;
#define NM_TYPE_AP_SUPPORT (nm_ap_support_get_type ())
GType nm_opt_type_get_type (void) G_GNUC_CONST;
#define NM_TYPE_OPT_TYPE (nm_opt_type_get_type ())
+GType nm_config_get_value_flags_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_CONFIG_GET_VALUE_FLAGS (nm_config_get_value_flags_get_type ())
+GType nm_config_change_flags_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_CONFIG_CHANGE_FLAGS (nm_config_change_flags_get_type ())
GType nm_dispatcher_action_get_type (void) G_GNUC_CONST;
#define NM_TYPE_DISPATCHER_ACTION (nm_dispatcher_action_get_type ())
GType nm_auth_subject_type_get_type (void) G_GNUC_CONST;
@@ -62,6 +62,12 @@ GType nm_ip_config_source_get_type (void) G_GNUC_CONST;
#define NM_TYPE_IP_CONFIG_SOURCE (nm_ip_config_source_get_type ())
GType nm_link_type_get_type (void) G_GNUC_CONST;
#define NM_TYPE_LINK_TYPE (nm_link_type_get_type ())
+GType nm_pobject_type_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_POBJECT_TYPE (nm_pobject_type_get_type ())
+GType nm_match_spec_match_type_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_MATCH_SPEC_MATCH_TYPE (nm_match_spec_match_type_get_type ())
+GType nm_utils_test_flags_get_type (void) G_GNUC_CONST;
+#define NM_TYPE_UTILS_TEST_FLAGS (nm_utils_test_flags_get_type ())
G_END_DECLS
#endif /* __NM_ENUM_TYPES_H__ */
diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c
index 97e1708e3..2192f36ba 100644
--- a/src/nm-iface-helper.c
+++ b/src/nm-iface-helper.c
@@ -104,7 +104,7 @@ dhcp4_state_changed (NMDhcpClient *client,
nm_ip4_config_subtract (existing, last_config);
nm_ip4_config_merge (existing, ip4_config);
- if (!nm_ip4_config_commit (existing, ifindex, global_opt.priority_v4))
+ if (!nm_ip4_config_commit (existing, ifindex, TRUE, global_opt.priority_v4))
nm_log_warn (LOGD_DHCP4, "(%s): failed to apply DHCPv4 config", global_opt.ifname);
if (last_config)
@@ -145,7 +145,7 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, gpointer user_da
* from adding a prefix route for this address.
**/
system_support = nm_platform_check_support_libnl_extended_ifa_flags () &&
- nm_platform_check_support_kernel_extended_ifa_flags ();
+ nm_platform_check_support_kernel_extended_ifa_flags (NM_PLATFORM_GET);
}
if (system_support)
@@ -227,13 +227,13 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, gpointer user_da
}
if (changed & NM_RDISC_CONFIG_HOP_LIMIT)
- nm_platform_sysctl_set_ip6_hop_limit_safe (global_opt.ifname, rdisc->hop_limit);
+ nm_platform_sysctl_set_ip6_hop_limit_safe (NM_PLATFORM_GET, global_opt.ifname, rdisc->hop_limit);
if (changed & NM_RDISC_CONFIG_MTU) {
char val[16];
g_snprintf (val, sizeof (val), "%d", rdisc->mtu);
- nm_platform_sysctl_set (nm_utils_ip6_property_path (global_opt.ifname, "mtu"), val);
+ nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip6_property_path (global_opt.ifname, "mtu"), val);
}
existing = nm_ip6_config_capture (ifindex, FALSE, global_opt.tempaddr);
@@ -241,7 +241,7 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, gpointer user_da
nm_ip6_config_subtract (existing, last_config);
nm_ip6_config_merge (existing, ip6_config);
- if (!nm_ip6_config_commit (existing, ifindex))
+ if (!nm_ip6_config_commit (existing, ifindex, TRUE))
nm_log_warn (LOGD_IP6, "(%s): failed to apply IPv6 config", global_opt.ifname);
if (last_config)
@@ -263,24 +263,16 @@ rdisc_ra_timeout (NMRDisc *rdisc, gpointer user_data)
static gboolean
quit_handler (gpointer user_data)
{
- gboolean *quit_early_ptr = user_data;
-
- *quit_early_ptr = TRUE;
g_main_loop_quit (main_loop);
- return G_SOURCE_CONTINUE;
+ return G_SOURCE_REMOVE;
}
static void
-setup_signals (gboolean *quit_early_ptr)
+setup_signals (void)
{
- sigset_t sigmask;
-
- sigemptyset (&sigmask);
- pthread_sigmask (SIG_SETMASK, &sigmask, NULL);
-
signal (SIGPIPE, SIG_IGN);
- g_unix_signal_add (SIGINT, quit_handler, quit_early_ptr);
- g_unix_signal_add (SIGTERM, quit_handler, quit_early_ptr);
+ g_unix_signal_add (SIGINT, quit_handler, NULL);
+ g_unix_signal_add (SIGTERM, quit_handler, NULL);
}
static void
@@ -320,6 +312,7 @@ do_early_setup (int *argc, char **argv[])
argv,
options,
NULL,
+ NULL,
_("nm-iface-helper is a small, standalone process that manages a single network interface.")))
exit (1);
@@ -337,7 +330,6 @@ main (int argc, char *argv[])
GError *error = NULL;
gboolean wrote_pidfile = FALSE;
gs_free char *pidfile = NULL;
- gboolean quit_early = FALSE;
gs_unref_object NMDhcpClient *dhcp4_client = NULL;
gs_unref_object NMRDisc *rdisc = NULL;
GByteArray *hwaddr = NULL;
@@ -414,7 +406,7 @@ main (int argc, char *argv[])
/* Set up unix signal handling - before creating threads, but after daemonizing! */
main_loop = g_main_loop_new (NULL, FALSE);
- setup_signals (&quit_early);
+ setup_signals ();
nm_logging_syslog_openlog (global_opt.debug);
@@ -423,7 +415,7 @@ main (int argc, char *argv[])
/* Set up platform interaction layer */
nm_linux_platform_setup ();
- tmp = nm_platform_link_get_address (ifindex, &hwaddr_len);
+ tmp = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, &hwaddr_len);
if (tmp) {
hwaddr = g_byte_array_sized_new (hwaddr_len);
g_byte_array_append (hwaddr, tmp, hwaddr_len);
@@ -442,7 +434,7 @@ main (int argc, char *argv[])
}
if (global_opt.dhcp4_address) {
- nm_platform_sysctl_set (nm_utils_ip4_property_path (global_opt.ifname, "promote_secondaries"), "1");
+ nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip4_property_path (global_opt.ifname, "promote_secondaries"), "1");
/* Initialize DHCP manager */
dhcp_mgr = nm_dhcp_manager_get ();
@@ -468,7 +460,7 @@ main (int argc, char *argv[])
}
if (global_opt.slaac) {
- nm_platform_link_set_user_ipv6ll_enabled (ifindex, TRUE);
+ nm_platform_link_set_user_ipv6ll_enabled (NM_PLATFORM_GET, ifindex, TRUE);
rdisc = nm_lndp_rdisc_new (ifindex, global_opt.ifname);
g_assert (rdisc);
@@ -476,10 +468,10 @@ main (int argc, char *argv[])
if (iid)
nm_rdisc_set_iid (rdisc, *iid);
- nm_platform_sysctl_set (nm_utils_ip6_property_path (global_opt.ifname, "accept_ra"), "1");
- nm_platform_sysctl_set (nm_utils_ip6_property_path (global_opt.ifname, "accept_ra_defrtr"), "0");
- nm_platform_sysctl_set (nm_utils_ip6_property_path (global_opt.ifname, "accept_ra_pinfo"), "0");
- nm_platform_sysctl_set (nm_utils_ip6_property_path (global_opt.ifname, "accept_ra_rtr_pref"), "0");
+ nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip6_property_path (global_opt.ifname, "accept_ra"), "1");
+ nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip6_property_path (global_opt.ifname, "accept_ra_defrtr"), "0");
+ nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip6_property_path (global_opt.ifname, "accept_ra_pinfo"), "0");
+ nm_platform_sysctl_set (NM_PLATFORM_GET, nm_utils_ip6_property_path (global_opt.ifname, "accept_ra_rtr_pref"), "0");
g_signal_connect (rdisc,
NM_RDISC_CONFIG_CHANGED,
@@ -492,8 +484,7 @@ main (int argc, char *argv[])
nm_rdisc_start (rdisc);
}
- if (!quit_early)
- g_main_loop_run (main_loop);
+ g_main_loop_run (main_loop);
g_clear_pointer (&hwaddr, g_byte_array_unref);
@@ -509,6 +500,12 @@ main (int argc, char *argv[])
/*******************************************************/
/* Stub functions */
+void
+nm_main_config_reload (int signal)
+{
+ nm_log_info (LOGD_CORE, "reloading configuration not supported");
+}
+
gconstpointer nm_config_get (void);
const char *nm_config_get_dhcp_client (gpointer unused);
gboolean nm_config_get_configure_and_quit (gpointer unused);
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index db2ef1583..db8c4b43e 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -33,6 +33,8 @@
#include "nm-ip4-config-glue.h"
#include "NetworkManagerUtils.h"
#include "nm-core-internal.h"
+#include "nm-route-manager.h"
+#include "gsystem-local-alloc.h"
G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, G_TYPE_OBJECT)
@@ -186,7 +188,7 @@ nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf)
gboolean has_gateway = FALSE;
/* Slaves have no IP configuration */
- if (nm_platform_link_get_master (ifindex) > 0)
+ if (nm_platform_link_get_master (NM_PLATFORM_GET, ifindex) > 0)
return NULL;
config = nm_ip4_config_new ();
@@ -195,12 +197,12 @@ nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf)
g_array_unref (priv->addresses);
g_array_unref (priv->routes);
- priv->addresses = nm_platform_ip4_address_get_all (ifindex);
- priv->routes = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ priv->addresses = nm_platform_ip4_address_get_all (NM_PLATFORM_GET, ifindex);
+ priv->routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
/* Extract gateway from default route */
old_gateway = priv->gateway;
- for (i = 0; i < priv->routes->len; i++) {
+ for (i = 0; i < priv->routes->len; ) {
const NMPlatformIP4Route *route = &g_array_index (priv->routes, NMPlatformIP4Route, i);
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
@@ -210,9 +212,10 @@ nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf)
}
has_gateway = TRUE;
/* Remove the default route from the list */
- g_array_remove_index (priv->routes, i);
- i--;
+ g_array_remove_index_fast (priv->routes, i);
+ continue;
}
+ i++;
}
/* If there is a host route to the gateway, ignore that route. It is
@@ -251,26 +254,59 @@ nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf)
}
gboolean
-nm_ip4_config_commit (const NMIP4Config *config, int ifindex, guint32 default_route_metric)
+nm_ip4_config_commit (const NMIP4Config *config, int ifindex, gboolean routes_full_sync, gint64 default_route_metric)
{
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
- guint32 mtu = nm_ip4_config_get_mtu (config);
int i;
+ gs_unref_ptrarray GPtrArray *added_addresses = NULL;
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (config != NULL, FALSE);
/* Addresses */
- nm_platform_ip4_address_sync (ifindex, priv->addresses, default_route_metric);
+ nm_platform_ip4_address_sync (NM_PLATFORM_GET, ifindex, priv->addresses,
+ default_route_metric >= 0 ? &added_addresses : NULL);
/* Routes */
{
int count = nm_ip4_config_get_num_routes (config);
GArray *routes = g_array_sized_new (FALSE, FALSE, sizeof (NMPlatformIP4Route), count);
- const NMPlatformIP4Route *route;
gboolean success;
+ gs_unref_array GArray *device_route_purge_list = NULL;
+
+ if ( default_route_metric >= 0
+ && added_addresses) {
+ /* For IPv6, we explicitly add the device-routes (onlink) to NMIP6Config.
+ * As we don't do that for IPv4, add it here shortly before syncing
+ * the routes. For NMRouteManager these routes are very much important. */
+ for (i = 0; i < added_addresses->len; i++) {
+ const NMPlatformIP4Address *addr = added_addresses->pdata[i];
+ NMPlatformIP4Route route = { 0 };
+
+ if (addr->plen == 0)
+ continue;
+
+ route.ifindex = ifindex;
+ route.source = NM_IP_CONFIG_SOURCE_KERNEL;
+ route.network = nm_utils_ip4_address_clear_host_address (addr->address, addr->plen);
+ route.plen = addr->plen;
+ route.pref_src = addr->address;
+ route.metric = default_route_metric;
+
+ g_array_append_val (routes, route);
+
+ if (default_route_metric != NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE) {
+ if (!device_route_purge_list)
+ device_route_purge_list = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
+ route.metric = NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE;
+ g_array_append_val (device_route_purge_list, route);
+ }
+ }
+ }
for (i = 0; i < count; i++) {
+ const NMPlatformIP4Route *route;
+
route = nm_ip4_config_get_route (config, i);
/* Don't add the route if it's more specific than one of the subnets
@@ -280,19 +316,19 @@ nm_ip4_config_commit (const NMIP4Config *config, int ifindex, guint32 default_ro
&& nm_ip4_config_destination_is_direct (config, route->network, route->plen))
continue;
+ /* duplicates in @routes are no problem as route-manager handles them
+ * gracefully (by ignoring them). */
g_array_append_vals (routes, route, 1);
}
- success = nm_platform_ip4_route_sync (ifindex, routes);
+ nm_route_manager_ip4_route_register_device_route_purge_list (nm_route_manager_get (), device_route_purge_list);
+
+ success = nm_route_manager_ip4_route_sync (nm_route_manager_get (), ifindex, routes, default_route_metric < 0, routes_full_sync);
g_array_unref (routes);
if (!success)
return FALSE;
}
- /* MTU */
- if (mtu && mtu != nm_platform_link_get_mtu (ifindex))
- nm_platform_link_set_mtu (ifindex, mtu);
-
return TRUE;
}
@@ -503,7 +539,7 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
nm_ip4_config_add_nameserver (dst, nm_ip4_config_get_nameserver (src, i));
/* default gateway */
- if (!nm_ip4_config_get_gateway (dst))
+ if (nm_ip4_config_get_gateway (src))
nm_ip4_config_set_gateway (dst, nm_ip4_config_get_gateway (src));
/* routes */
@@ -519,11 +555,11 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
nm_ip4_config_add_search (dst, nm_ip4_config_get_search (src, i));
/* MSS */
- if (!nm_ip4_config_get_mss (dst))
+ if (nm_ip4_config_get_mss (src))
nm_ip4_config_set_mss (dst, nm_ip4_config_get_mss (src));
/* MTU */
- if (!nm_ip4_config_get_mtu (dst))
+ if (nm_ip4_config_get_mtu (src))
nm_ip4_config_set_mtu (dst, nm_ip4_config_get_mtu (src),
nm_ip4_config_get_mtu_source (src));
@@ -541,6 +577,117 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
g_object_thaw_notify (G_OBJECT (dst));
}
+/*******************************************************************************/
+
+static int
+_addresses_get_index (const NMIP4Config *self, const NMPlatformIP4Address *addr)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->addresses->len; i++) {
+ const NMPlatformIP4Address *a = &g_array_index (priv->addresses, NMPlatformIP4Address, i);
+
+ if (addr->address == a->address &&
+ addr->plen == a->plen)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_nameservers_get_index (const NMIP4Config *self, guint32 ns)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->nameservers->len; i++) {
+ guint32 n = g_array_index (priv->nameservers, guint32, i);
+
+ if (ns == n)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_routes_get_index (const NMIP4Config *self, const NMPlatformIP4Route *route)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->routes->len; i++) {
+ const NMPlatformIP4Route *r = &g_array_index (priv->routes, NMPlatformIP4Route, i);
+
+ if ( route->network == r->network
+ && route->plen == r->plen)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_domains_get_index (const NMIP4Config *self, const char *domain)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->domains->len; i++) {
+ const char *d = g_ptr_array_index (priv->domains, i);
+
+ if (g_strcmp0 (domain, d) == 0)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_searches_get_index (const NMIP4Config *self, const char *search)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->searches->len; i++) {
+ const char *s = g_ptr_array_index (priv->searches, i);
+
+ if (g_strcmp0 (search, s) == 0)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_nis_servers_get_index (const NMIP4Config *self, guint32 nis_server)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->nis->len; i++) {
+ guint32 n = g_array_index (priv->nis, guint32, i);
+
+ if (n == nis_server)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_wins_get_index (const NMIP4Config *self, guint32 wins_server)
+{
+ NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->wins->len; i++) {
+ guint32 n = g_array_index (priv->wins, guint32, i);
+
+ if (n == wins_server)
+ return (int) i;
+ }
+ return -1;
+}
+
+/*******************************************************************************/
+
/**
* nm_ip4_config_subtract:
* @dst: config from which to remove everything in @src
@@ -551,7 +698,8 @@ nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src)
void
nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
{
- guint32 i, j;
+ guint32 i;
+ gint idx;
g_return_if_fail (src != NULL);
g_return_if_fail (dst != NULL);
@@ -560,31 +708,16 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
/* addresses */
for (i = 0; i < nm_ip4_config_get_num_addresses (src); i++) {
- const NMPlatformIP4Address *src_addr = nm_ip4_config_get_address (src, i);
-
- for (j = 0; j < nm_ip4_config_get_num_addresses (dst); j++) {
- const NMPlatformIP4Address *dst_addr = nm_ip4_config_get_address (dst, j);
-
- if (src_addr->address == dst_addr->address &&
- src_addr->plen == dst_addr->plen) {
- nm_ip4_config_del_address (dst, j);
- break;
- }
- }
+ idx = _addresses_get_index (dst, nm_ip4_config_get_address (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_address (dst, idx);
}
/* nameservers */
for (i = 0; i < nm_ip4_config_get_num_nameservers (src); i++) {
- guint32 src_ns = nm_ip4_config_get_nameserver (src, i);
-
- for (j = 0; j < nm_ip4_config_get_num_nameservers (dst); j++) {
- guint32 dst_ns = nm_ip4_config_get_nameserver (dst, j);
-
- if (dst_ns == src_ns) {
- nm_ip4_config_del_nameserver (dst, j);
- break;
- }
- }
+ idx = _nameservers_get_index (dst, nm_ip4_config_get_nameserver (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_nameserver (dst, idx);
}
/* default gateway */
@@ -596,44 +729,23 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
/* routes */
for (i = 0; i < nm_ip4_config_get_num_routes (src); i++) {
- const NMPlatformIP4Route *src_route = nm_ip4_config_get_route (src, i);
-
- for (j = 0; j < nm_ip4_config_get_num_routes (dst); j++) {
- const NMPlatformIP4Route *dst_route = nm_ip4_config_get_route (dst, j);
-
- if (src_route->network == dst_route->network && src_route->plen == dst_route->plen) {
- nm_ip4_config_del_route (dst, j);
- break;
- }
- }
+ idx = _routes_get_index (dst, nm_ip4_config_get_route (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_route (dst, idx);
}
/* domains */
for (i = 0; i < nm_ip4_config_get_num_domains (src); i++) {
- const char *src_domain = nm_ip4_config_get_domain (src, i);
-
- for (j = 0; j < nm_ip4_config_get_num_domains (dst); j++) {
- const char *dst_domain = nm_ip4_config_get_domain (dst, j);
-
- if (g_strcmp0 (src_domain, dst_domain) == 0) {
- nm_ip4_config_del_domain (dst, j);
- break;
- }
- }
+ idx = _domains_get_index (dst, nm_ip4_config_get_domain (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_domain (dst, idx);
}
/* dns searches */
for (i = 0; i < nm_ip4_config_get_num_searches (src); i++) {
- const char *src_search = nm_ip4_config_get_search (src, i);
-
- for (j = 0; j < nm_ip4_config_get_num_searches (dst); j++) {
- const char *dst_search = nm_ip4_config_get_search (dst, j);
-
- if (g_strcmp0 (src_search, dst_search) == 0) {
- nm_ip4_config_del_search (dst, j);
- break;
- }
- }
+ idx = _searches_get_index (dst, nm_ip4_config_get_search (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_search (dst, idx);
}
/* MSS */
@@ -646,16 +758,9 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
/* NIS */
for (i = 0; i < nm_ip4_config_get_num_nis_servers (src); i++) {
- guint32 src_nis = nm_ip4_config_get_nis_server (src, i);
-
- for (j = 0; j < nm_ip4_config_get_num_nis_servers (dst); j++) {
- guint32 dst_nis = nm_ip4_config_get_nis_server (dst, j);
-
- if (dst_nis == src_nis) {
- nm_ip4_config_del_nis_server (dst, j);
- break;
- }
- }
+ idx = _nis_servers_get_index (dst, nm_ip4_config_get_nis_server (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_nis_server (dst, idx);
}
if (g_strcmp0 (nm_ip4_config_get_nis_domain (src), nm_ip4_config_get_nis_domain (dst)) == 0)
@@ -663,18 +768,55 @@ nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src)
/* WINS */
for (i = 0; i < nm_ip4_config_get_num_wins (src); i++) {
- guint32 src_wins = nm_ip4_config_get_wins (src, i);
+ idx = _wins_get_index (dst, nm_ip4_config_get_wins (src, i));
+ if (idx >= 0)
+ nm_ip4_config_del_wins (dst, idx);
+ }
- for (j = 0; j < nm_ip4_config_get_num_wins (dst); j++) {
- guint32 dst_wins = nm_ip4_config_get_wins (dst, j);
+ g_object_thaw_notify (G_OBJECT (dst));
+}
- if (dst_wins == src_wins) {
- nm_ip4_config_del_wins (dst, j);
- break;
- }
- }
+void
+nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src)
+{
+ guint32 i;
+ gint idx;
+
+ g_return_if_fail (src != NULL);
+ g_return_if_fail (dst != NULL);
+
+ g_object_freeze_notify (G_OBJECT (dst));
+
+ /* addresses */
+ for (i = 0; i < nm_ip4_config_get_num_addresses (dst); ) {
+ idx = _addresses_get_index (src, nm_ip4_config_get_address (dst, i));
+ if (idx < 0)
+ nm_ip4_config_del_address (dst, i);
+ else
+ i++;
}
+ /* ignore nameservers */
+
+ /* default gateway */
+ if ( !nm_ip4_config_get_num_addresses (dst)
+ || (nm_ip4_config_get_gateway (src) != nm_ip4_config_get_gateway (dst)))
+ nm_ip4_config_set_gateway (dst, 0);
+
+ /* routes */
+ for (i = 0; i < nm_ip4_config_get_num_routes (dst); ) {
+ idx = _routes_get_index (src, nm_ip4_config_get_route (dst, i));
+ if (idx < 0)
+ nm_ip4_config_del_route (dst, i);
+ else
+ i++;
+ }
+
+ /* ignore domains */
+ /* ignore dns searches */
+ /* ignore NIS */
+ /* ignore WINS */
+
g_object_thaw_notify (G_OBJECT (dst));
}
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index 5ac455d84..463675244 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -64,13 +64,14 @@ const char * nm_ip4_config_get_dbus_path (const NMIP4Config *config);
/* Integration with nm-platform and nm-setting */
NMIP4Config *nm_ip4_config_capture (int ifindex, gboolean capture_resolv_conf);
-gboolean nm_ip4_config_commit (const NMIP4Config *config, int ifindex, guint32 default_route_metric);
+gboolean nm_ip4_config_commit (const NMIP4Config *config, int ifindex, gboolean routes_full_sync, gint64 default_route_metric);
void nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIPConfig *setting, guint32 default_route_metric);
NMSetting *nm_ip4_config_create_setting (const NMIP4Config *config);
/* Utility functions */
void nm_ip4_config_merge (NMIP4Config *dst, const NMIP4Config *src);
void nm_ip4_config_subtract (NMIP4Config *dst, const NMIP4Config *src);
+void nm_ip4_config_intersect (NMIP4Config *dst, const NMIP4Config *src);
gboolean nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relevant_changes);
gboolean nm_ip4_config_destination_is_direct (const NMIP4Config *config, guint32 dest, int plen);
void nm_ip4_config_dump (const NMIP4Config *config, const char *detail);
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index cf8d74beb..48aeb64ae 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -32,6 +32,7 @@
#include "nm-dbus-manager.h"
#include "nm-dbus-glib-types.h"
#include "nm-ip6-config-glue.h"
+#include "nm-route-manager.h"
#include "NetworkManagerUtils.h"
G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, G_TYPE_OBJECT)
@@ -298,7 +299,7 @@ nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6Co
gboolean notify_nameservers = FALSE;
/* Slaves have no IP configuration */
- if (nm_platform_link_get_master (ifindex) > 0)
+ if (nm_platform_link_get_master (NM_PLATFORM_GET, ifindex) > 0)
return NULL;
config = nm_ip6_config_new ();
@@ -307,12 +308,12 @@ nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6Co
g_array_unref (priv->addresses);
g_array_unref (priv->routes);
- priv->addresses = nm_platform_ip6_address_get_all (ifindex);
- priv->routes = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ priv->addresses = nm_platform_ip6_address_get_all (NM_PLATFORM_GET, ifindex);
+ priv->routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
/* Extract gateway from default route */
old_gateway = priv->gateway;
- for (i = 0; i < priv->routes->len; i++) {
+ for (i = 0; i < priv->routes->len; ) {
const NMPlatformIP6Route *route = &g_array_index (priv->routes, NMPlatformIP6Route, i);
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
@@ -322,9 +323,10 @@ nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6Co
}
has_gateway = TRUE;
/* Remove the default route from the list */
- g_array_remove_index (priv->routes, i);
- i--;
+ g_array_remove_index_fast (priv->routes, i);
+ continue;
}
+ i++;
}
/* If there is a host route to the gateway, ignore that route. It is
@@ -365,7 +367,7 @@ nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6Co
}
gboolean
-nm_ip6_config_commit (const NMIP6Config *config, int ifindex)
+nm_ip6_config_commit (const NMIP6Config *config, int ifindex, gboolean routes_full_sync)
{
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
int i;
@@ -375,7 +377,7 @@ nm_ip6_config_commit (const NMIP6Config *config, int ifindex)
g_return_val_if_fail (config != NULL, FALSE);
/* Addresses */
- nm_platform_ip6_address_sync (ifindex, priv->addresses, TRUE);
+ nm_platform_ip6_address_sync (NM_PLATFORM_GET, ifindex, priv->addresses, TRUE);
/* Routes */
{
@@ -396,7 +398,7 @@ nm_ip6_config_commit (const NMIP6Config *config, int ifindex)
g_array_append_vals (routes, route, 1);
}
- success = nm_platform_ip6_route_sync (ifindex, routes);
+ success = nm_route_manager_ip6_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, routes_full_sync);
g_array_unref (routes);
}
@@ -615,7 +617,7 @@ nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src)
nm_ip6_config_add_nameserver (dst, nm_ip6_config_get_nameserver (src, i));
/* default gateway */
- if (!nm_ip6_config_get_gateway (dst))
+ if (nm_ip6_config_get_gateway (src))
nm_ip6_config_set_gateway (dst, nm_ip6_config_get_gateway (src));
/* routes */
@@ -630,7 +632,7 @@ nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src)
for (i = 0; i < nm_ip6_config_get_num_searches (src); i++)
nm_ip6_config_add_search (dst, nm_ip6_config_get_search (src, i));
- if (!nm_ip6_config_get_mss (dst))
+ if (nm_ip6_config_get_mss (src))
nm_ip6_config_set_mss (dst, nm_ip6_config_get_mss (src));
g_object_thaw_notify (G_OBJECT (dst));
@@ -653,6 +655,85 @@ nm_ip6_config_destination_is_direct (const NMIP6Config *config, const struct in6
return FALSE;
}
+/*******************************************************************************/
+
+static int
+_addresses_get_index (const NMIP6Config *self, const NMPlatformIP6Address *addr)
+{
+ NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->addresses->len; i++) {
+ const NMPlatformIP6Address *a = &g_array_index (priv->addresses, NMPlatformIP6Address, i);
+
+ if (IN6_ARE_ADDR_EQUAL (&addr->address, &a->address))
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_nameservers_get_index (const NMIP6Config *self, const struct in6_addr *ns)
+{
+ NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->nameservers->len; i++) {
+ const struct in6_addr *n = &g_array_index (priv->nameservers, struct in6_addr, i);
+
+ if (IN6_ARE_ADDR_EQUAL (ns, n))
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_routes_get_index (const NMIP6Config *self, const NMPlatformIP6Route *route)
+{
+ NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->routes->len; i++) {
+ const NMPlatformIP6Route *r = &g_array_index (priv->routes, NMPlatformIP6Route, i);
+
+ if (routes_are_duplicate (route, r, FALSE))
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_domains_get_index (const NMIP6Config *self, const char *domain)
+{
+ NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->domains->len; i++) {
+ const char *d = g_ptr_array_index (priv->domains, i);
+
+ if (g_strcmp0 (domain, d) == 0)
+ return (int) i;
+ }
+ return -1;
+}
+
+static int
+_searches_get_index (const NMIP6Config *self, const char *search)
+{
+ NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
+ guint i;
+
+ for (i = 0; i < priv->searches->len; i++) {
+ const char *s = g_ptr_array_index (priv->searches, i);
+
+ if (g_strcmp0 (search, s) == 0)
+ return (int) i;
+ }
+ return -1;
+}
+
+/*******************************************************************************/
+
/**
* nm_ip6_config_subtract:
* @dst: config from which to remove everything in @src
@@ -663,7 +744,8 @@ nm_ip6_config_destination_is_direct (const NMIP6Config *config, const struct in6
void
nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src)
{
- guint32 i, j;
+ guint i;
+ gint idx;
const struct in6_addr *dst_tmp, *src_tmp;
g_return_if_fail (src != NULL);
@@ -673,30 +755,16 @@ nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src)
/* addresses */
for (i = 0; i < nm_ip6_config_get_num_addresses (src); i++) {
- const NMPlatformIP6Address *src_addr = nm_ip6_config_get_address (src, i);
-
- for (j = 0; j < nm_ip6_config_get_num_addresses (dst); j++) {
- const NMPlatformIP6Address *dst_addr = nm_ip6_config_get_address (dst, j);
-
- if (IN6_ARE_ADDR_EQUAL (&src_addr->address, &dst_addr->address)) {
- nm_ip6_config_del_address (dst, j);
- break;
- }
- }
+ idx = _addresses_get_index (dst, nm_ip6_config_get_address (src, i));
+ if (idx >= 0)
+ nm_ip6_config_del_address (dst, idx);
}
/* nameservers */
for (i = 0; i < nm_ip6_config_get_num_nameservers (src); i++) {
- const struct in6_addr *src_ns = nm_ip6_config_get_nameserver (src, i);
-
- for (j = 0; j < nm_ip6_config_get_num_nameservers (dst); j++) {
- const struct in6_addr *dst_ns = nm_ip6_config_get_nameserver (dst, j);
-
- if (IN6_ARE_ADDR_EQUAL (src_ns, dst_ns)) {
- nm_ip6_config_del_nameserver (dst, j);
- break;
- }
- }
+ idx = _nameservers_get_index (dst, nm_ip6_config_get_nameserver (src, i));
+ if (idx >= 0)
+ nm_ip6_config_del_nameserver (dst, idx);
}
/* default gateway */
@@ -710,44 +778,23 @@ nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src)
/* routes */
for (i = 0; i < nm_ip6_config_get_num_routes (src); i++) {
- const NMPlatformIP6Route *src_route = nm_ip6_config_get_route (src, i);
-
- for (j = 0; j < nm_ip6_config_get_num_routes (dst); j++) {
- const NMPlatformIP6Route *dst_route = nm_ip6_config_get_route (dst, j);
-
- if (routes_are_duplicate (src_route, dst_route, FALSE)) {
- nm_ip6_config_del_route (dst, j);
- break;
- }
- }
+ idx = _routes_get_index (dst, nm_ip6_config_get_route (src, i));
+ if (idx >= 0)
+ nm_ip6_config_del_route (dst, idx);
}
/* domains */
for (i = 0; i < nm_ip6_config_get_num_domains (src); i++) {
- const char *src_domain = nm_ip6_config_get_domain (src, i);
-
- for (j = 0; j < nm_ip6_config_get_num_domains (dst); j++) {
- const char *dst_domain = nm_ip6_config_get_domain (dst, j);
-
- if (g_strcmp0 (src_domain, dst_domain) == 0) {
- nm_ip6_config_del_domain (dst, j);
- break;
- }
- }
+ idx = _domains_get_index (dst, nm_ip6_config_get_domain (src, i));
+ if (idx >= 0)
+ nm_ip6_config_del_domain (dst, idx);
}
/* dns searches */
for (i = 0; i < nm_ip6_config_get_num_searches (src); i++) {
- const char *src_search = nm_ip6_config_get_search (src, i);
-
- for (j = 0; j < nm_ip6_config_get_num_searches (dst); j++) {
- const char *dst_search = nm_ip6_config_get_search (dst, j);
-
- if (g_strcmp0 (src_search, dst_search) == 0) {
- nm_ip6_config_del_search (dst, j);
- break;
- }
- }
+ idx = _searches_get_index (dst, nm_ip6_config_get_search (src, i));
+ if (idx >= 0)
+ nm_ip6_config_del_search (dst, idx);
}
if (nm_ip6_config_get_mss (src) == nm_ip6_config_get_mss (dst))
@@ -756,6 +803,54 @@ nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src)
g_object_thaw_notify (G_OBJECT (dst));
}
+void
+nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src)
+{
+ guint i;
+ gint idx;
+ const struct in6_addr *dst_tmp, *src_tmp;
+
+ g_return_if_fail (src != NULL);
+ g_return_if_fail (dst != NULL);
+
+ g_object_freeze_notify (G_OBJECT (dst));
+
+ /* addresses */
+ for (i = 0; i < nm_ip6_config_get_num_addresses (dst); ) {
+ idx = _addresses_get_index (src, nm_ip6_config_get_address (dst, i));
+ if (idx < 0)
+ nm_ip6_config_del_address (dst, i);
+ else
+ i++;
+ }
+
+ /* ignore nameservers */
+
+ /* default gateway */
+ dst_tmp = nm_ip6_config_get_gateway (dst);
+ if (dst_tmp) {
+ src_tmp = nm_ip6_config_get_gateway (src);
+ if ( !nm_ip6_config_get_num_addresses (dst)
+ || !src_tmp
+ || !IN6_ARE_ADDR_EQUAL (src_tmp, dst_tmp))
+ nm_ip6_config_set_gateway (dst, NULL);
+ }
+
+ /* routes */
+ for (i = 0; i < nm_ip6_config_get_num_routes (dst); ) {
+ idx = _routes_get_index (src, nm_ip6_config_get_route (dst, i));
+ if (idx < 0)
+ nm_ip6_config_del_route (dst, i);
+ else
+ i++;
+ }
+
+ /* ignore domains */
+ /* ignore dns searches */
+
+ g_object_thaw_notify (G_OBJECT (dst));
+}
+
/**
* nm_ip6_config_replace:
* @dst: config which will be replaced with everything in @src
diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h
index f1d2dc8dd..66f15888c 100644
--- a/src/nm-ip6-config.h
+++ b/src/nm-ip6-config.h
@@ -64,13 +64,14 @@ const char * nm_ip6_config_get_dbus_path (const NMIP6Config *config);
/* Integration with nm-platform and nm-setting */
NMIP6Config *nm_ip6_config_capture (int ifindex, gboolean capture_resolv_conf, NMSettingIP6ConfigPrivacy use_temporary);
-gboolean nm_ip6_config_commit (const NMIP6Config *config, int ifindex);
+gboolean nm_ip6_config_commit (const NMIP6Config *config, int ifindex, gboolean routes_full_sync);
void nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIPConfig *setting, guint32 default_route_metric);
NMSetting *nm_ip6_config_create_setting (const NMIP6Config *config);
/* Utility functions */
void nm_ip6_config_merge (NMIP6Config *dst, const NMIP6Config *src);
void nm_ip6_config_subtract (NMIP6Config *dst, const NMIP6Config *src);
+void nm_ip6_config_intersect (NMIP6Config *dst, const NMIP6Config *src);
gboolean nm_ip6_config_replace (NMIP6Config *dst, const NMIP6Config *src, gboolean *relevant_changes);
int nm_ip6_config_destination_is_direct (const NMIP6Config *config, const struct in6_addr *dest, int plen);
void nm_ip6_config_dump (const NMIP6Config *config, const char *detail);
diff --git a/src/nm-logging.h b/src/nm-logging.h
index 00d429b09..82a4e71f4 100644
--- a/src/nm-logging.h
+++ b/src/nm-logging.h
@@ -29,7 +29,7 @@
#include <glib.h>
#include <glib-object.h>
-#include "nm-utils-internal.h"
+#include "nm-macros-internal.h"
/* Log domains */
typedef enum { /*< skip >*/
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 0fa88d1d8..080cdb8b2 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -26,8 +26,6 @@
#include <errno.h>
#include <string.h>
#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <dbus/dbus-glib.h>
#include <gio/gio.h>
@@ -129,8 +127,6 @@ static NMActiveConnection *_new_active_connection (NMManager *self,
static void policy_activating_device_changed (GObject *object, GParamSpec *pspec, gpointer user_data);
-static NMDevice *find_device_by_ip_iface (NMManager *self, const gchar *iface);
-
static void rfkill_change (const char *desc, RfKillType rtype, gboolean enabled);
static gboolean find_master (NMManager *self,
@@ -161,25 +157,22 @@ typedef struct {
char *state_file;
GSList *active_connections;
+ GSList *authorizing_connections;
guint ac_cleanup_id;
NMActiveConnection *primary_connection;
NMActiveConnection *activating_connection;
GSList *devices;
NMState state;
+ NMConfig *config;
NMConnectivity *connectivity;
- int ignore_link_added_cb;
-
NMPolicy *policy;
NMDBusManager *dbus_mgr;
gboolean prop_filter_added;
NMRfkillManager *rfkill_mgr;
- /* List of NMDeviceFactoryFunc pointers sorted in priority order */
- GSList *factories;
-
NMSettings *settings;
char *hostname;
@@ -285,7 +278,8 @@ active_connection_remove (NMManager *self, NMActiveConnection *active)
g_object_unref (active);
- if (connection) {
+ if ( connection
+ && nm_settings_has_connection (priv->settings, connection)) {
nm_log_dbg (LOGD_DEVICE, "Assumed connection disconnected. Deleting generated connection '%s' (%s)",
nm_connection_get_id (connection), nm_connection_get_uuid (connection));
nm_settings_connection_delete (NM_SETTINGS_CONNECTION (connection), NULL, NULL);
@@ -463,20 +457,18 @@ active_connection_get_by_path (NMManager *manager, const char *path)
/************************************************************************/
-static NMDevice *
-nm_manager_get_device_by_udi (NMManager *manager, const char *udi)
+static void
+_config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeFlags changes, NMConfigData *old_data, NMManager *self)
{
- GSList *iter;
-
- g_return_val_if_fail (udi != NULL, NULL);
-
- for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) {
- if (!strcmp (nm_device_get_udi (NM_DEVICE (iter->data)), udi))
- return NM_DEVICE (iter->data);
- }
- return NULL;
+ g_object_set (NM_MANAGER_GET_PRIVATE (self)->connectivity,
+ NM_CONNECTIVITY_URI, nm_config_data_get_connectivity_uri (config_data),
+ NM_CONNECTIVITY_INTERVAL, nm_config_data_get_connectivity_interval (config_data),
+ NM_CONNECTIVITY_RESPONSE, nm_config_data_get_connectivity_response (config_data),
+ NULL);
}
+/************************************************************************/
+
static NMDevice *
nm_manager_get_device_by_path (NMManager *manager, const char *path)
{
@@ -506,6 +498,50 @@ nm_manager_get_device_by_ifindex (NMManager *manager, int ifindex)
return NULL;
}
+static NMDevice *
+find_device_by_hw_addr (NMManager *manager, const char *hwaddr)
+{
+ GSList *iter;
+ const char *device_addr;
+
+ g_return_val_if_fail (hwaddr != NULL, NULL);
+
+ if (nm_utils_hwaddr_valid (hwaddr, -1)) {
+ for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) {
+ device_addr = nm_device_get_hw_address (NM_DEVICE (iter->data));
+ if (device_addr && nm_utils_hwaddr_matches (hwaddr, -1, device_addr, -1))
+ return NM_DEVICE (iter->data);
+ }
+ }
+ return NULL;
+}
+
+static NMDevice *
+find_device_by_ip_iface (NMManager *self, const gchar *iface)
+{
+ GSList *iter;
+
+ g_return_val_if_fail (iface != NULL, NULL);
+
+ for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = g_slist_next (iter)) {
+ if (g_strcmp0 (nm_device_get_ip_iface (NM_DEVICE (iter->data)), iface) == 0)
+ return NM_DEVICE (iter->data);
+ }
+ return NULL;
+}
+
+static NMDevice *
+find_device_by_iface (NMManager *self, const gchar *iface)
+{
+ GSList *iter;
+
+ for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = g_slist_next (iter)) {
+ if (g_strcmp0 (nm_device_get_iface (NM_DEVICE (iter->data)), iface) == 0)
+ return NM_DEVICE (iter->data);
+ }
+ return NULL;
+}
+
static gboolean
manager_sleeping (NMManager *self)
{
@@ -834,109 +870,56 @@ nm_manager_get_state (NMManager *manager)
return NM_MANAGER_GET_PRIVATE (manager)->state;
}
-/*******************************************************************/
-/* Settings stuff via NMSettings */
-/*******************************************************************/
+/***************************/
static NMDevice *
-get_device_from_hwaddr (NMManager *self, const char *setting_mac)
+find_parent_device_for_connection (NMManager *self, NMConnection *connection)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- const char *device_mac;
+ NMDeviceFactory *factory;
+ const char *parent_name = NULL;
+ NMConnection *parent_connection;
+ NMDevice *parent, *first_compatible = NULL;
GSList *iter;
- if (!setting_mac)
+ factory = nm_device_factory_manager_find_factory_for_connection (connection);
+ if (!factory)
return NULL;
- for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
- NMDevice *device = iter->data;
-
- device_mac = nm_device_get_hw_address (iter->data);
- if (!device_mac)
- continue;
- if (nm_utils_hwaddr_matches (setting_mac, -1, device_mac, -1))
- return device;
- }
- return NULL;
-}
-
-static NMDevice *
-find_vlan_parent (NMManager *self,
- NMConnection *connection)
-{
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- NMSettingVlan *s_vlan;
- NMSettingWired *s_wired;
- NMConnection *parent_connection;
- const char *parent_iface;
- NMDevice *parent = NULL;
- const char *setting_mac;
- GSList *iter;
+ parent_name = nm_device_factory_get_connection_parent (factory, connection);
+ if (!parent_name)
+ return NULL;
- /* The 'parent' property could be given by an interface name, a
- * connection UUID, or the MAC address of an NMSettingWired.
- */
- s_vlan = nm_connection_get_setting_vlan (connection);
- g_return_val_if_fail (s_vlan != NULL, NULL);
-
- s_wired = nm_connection_get_setting_wired (connection);
- setting_mac = s_wired ? nm_setting_wired_get_mac_address (s_wired) : NULL;
-
- parent_iface = nm_setting_vlan_get_parent (s_vlan);
- if (parent_iface) {
- parent = find_device_by_ip_iface (self, parent_iface);
- if (parent)
- return parent;
-
- if (nm_utils_is_uuid (parent_iface)) {
- /* Try as a connection UUID */
- parent_connection = (NMConnection *) nm_settings_get_connection_by_uuid (priv->settings, parent_iface);
- if (parent_connection) {
- /* Check if the parent connection is activated on some device already */
- for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
- NMActRequest *req;
- NMConnection *candidate;
-
- req = nm_device_get_act_request (NM_DEVICE (iter->data));
- if (req) {
- candidate = nm_active_connection_get_connection (NM_ACTIVE_CONNECTION (req));
- if (candidate == parent_connection)
- return NM_DEVICE (iter->data);
- }
- }
+ /* Try as an interface name */
+ parent = find_device_by_ip_iface (self, parent_name);
+ if (parent)
+ return parent;
- /* Check the hardware address of the parent connection */
- return get_device_from_hwaddr (self, setting_mac);
- }
- return NULL;
- }
- }
+ /* Maybe a hardware address */
+ parent = find_device_by_hw_addr (self, parent_name);
+ if (parent)
+ return parent;
- /* Try the hardware address from the VLAN connection's hardware setting */
- return get_device_from_hwaddr (self, setting_mac);
-}
+ /* Maybe a connection UUID */
+ parent_connection = (NMConnection *) nm_settings_get_connection_by_uuid (priv->settings, parent_name);
+ if (!parent_connection)
+ return NULL;
-static NMDevice *
-find_infiniband_parent (NMManager *self,
- NMConnection *connection)
-{
- NMSettingInfiniband *s_infiniband;
- const char *parent_iface;
- NMDevice *parent = NULL;
- const char *setting_mac;
+ /* Check if the parent connection is currently activated or is comaptible
+ * with some known device.
+ */
+ for (iter = priv->devices; iter; iter = iter->next) {
+ NMDevice *candidate = iter->data;
- s_infiniband = nm_connection_get_setting_infiniband (connection);
- g_return_val_if_fail (s_infiniband != NULL, NULL);
+ if (nm_device_get_connection (candidate) == parent_connection)
+ return candidate;
- parent_iface = nm_setting_infiniband_get_parent (s_infiniband);
- if (parent_iface) {
- parent = find_device_by_ip_iface (self, parent_iface);
- if (parent)
- return parent;
+ if ( !first_compatible
+ && nm_device_check_connection_compatible (candidate, parent_connection))
+ first_compatible = candidate;
}
- setting_mac = nm_setting_infiniband_get_mac_address (s_infiniband);
- return get_device_from_hwaddr (self, setting_mac);
+ return first_compatible;
}
/**
@@ -944,86 +927,69 @@ find_infiniband_parent (NMManager *self,
* @self: the #NMManager
* @connection: the #NMConnection representing a virtual interface
* @out_parent: on success, the parent device if any
+ * @error: an error if determining the virtual interface name failed
*
* Given @connection, returns the interface name that the connection
- * would represent. If the interface name is not given by the connection,
- * this may require constructing it based on information in the connection
- * and existing network interfaces.
+ * would represent if it is a virtual connection. %NULL is returned and
+ * @error is set if the connection is not virtual, or if the name could
+ * not be determined.
*
* Returns: the expected interface name (caller takes ownership), or %NULL
*/
static char *
get_virtual_iface_name (NMManager *self,
NMConnection *connection,
- NMDevice **out_parent)
+ NMDevice **out_parent,
+ GError **error)
{
+ NMDeviceFactory *factory;
+ char *iface = NULL;
NMDevice *parent = NULL;
- const char *ifname;
if (out_parent)
*out_parent = NULL;
- if (!nm_connection_is_virtual (connection))
+ if (!nm_connection_is_virtual (connection)) {
+ g_set_error (error,
+ NM_MANAGER_ERROR,
+ NM_MANAGER_ERROR_FAILED,
+ "NetworkManager plugin for '%s' unavailable",
+ nm_connection_get_connection_type (connection));
return NULL;
-
- ifname = nm_connection_get_interface_name (connection);
-
- if (nm_connection_is_type (connection, NM_SETTING_VLAN_SETTING_NAME)) {
- NMSettingVlan *s_vlan;
- char *vname;
-
- s_vlan = nm_connection_get_setting_vlan (connection);
- g_return_val_if_fail (s_vlan != NULL, NULL);
-
- parent = find_vlan_parent (self, connection);
- if (!parent)
- return NULL;
-
- if (!nm_device_supports_vlans (parent)) {
- nm_log_warn (LOGD_DEVICE, "(%s): No support for VLANs on interface %s of type %s",
- ifname ? ifname : nm_connection_get_id (connection),
- nm_device_get_ip_iface (parent),
- nm_device_get_type_desc (parent));
- return NULL;
- }
-
- /* If the connection doesn't specify the interface name for the VLAN
- * device, we create one for it using the VLAN ID and the parent
- * interface's name.
- */
- if (ifname)
- vname = g_strdup (ifname);
- else {
- vname = nm_utils_new_vlan_name (nm_device_get_ip_iface (parent),
- nm_setting_vlan_get_id (s_vlan));
- }
- if (out_parent)
- *out_parent = parent;
- return vname;
}
- if (nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME)) {
- NMSettingInfiniband *s_infiniband;
-
- parent = find_infiniband_parent (self, connection);
- if (!parent)
- return NULL;
+ factory = nm_device_factory_manager_find_factory_for_connection (connection);
+ if (!factory) {
+ nm_log_warn (LOGD_DEVICE, "(%s) NetworkManager plugin for '%s' unavailable",
+ nm_connection_get_id (connection),
+ nm_connection_get_connection_type (connection));
+ g_set_error (error,
+ NM_MANAGER_ERROR,
+ NM_MANAGER_ERROR_FAILED,
+ "NetworkManager plugin for '%s' unavailable",
+ nm_connection_get_connection_type (connection));
+ return NULL;
+ }
- s_infiniband = nm_connection_get_setting_infiniband (connection);
- if (out_parent)
- *out_parent = parent;
- return g_strdup (nm_setting_infiniband_get_virtual_interface_name (s_infiniband));
+ parent = find_parent_device_for_connection (self, connection);
+ iface = nm_device_factory_get_virtual_iface_name (factory,
+ connection,
+ parent ? nm_device_get_ip_iface (parent) : NULL);
+ if (!iface) {
+ nm_log_warn (LOGD_DEVICE, "(%s) failed to determine virtual interface name",
+ nm_connection_get_id (connection));
+ g_set_error_literal (error,
+ NM_MANAGER_ERROR,
+ NM_MANAGER_ERROR_UNKNOWN_DEVICE,
+ "failed to determine virtual interface name");
+ return NULL;
}
- /* For any other virtual connection, NMSettingConnection:interface-name is
- * the virtual device name.
- */
- g_return_val_if_fail (ifname != NULL, NULL);
- return g_strdup (ifname);
+ if (out_parent)
+ *out_parent = parent;
+ return iface;
}
-/***************************/
-
/**
* system_create_virtual_device:
* @self: the #NMManager
@@ -1039,7 +1005,7 @@ static NMDevice *
system_create_virtual_device (NMManager *self, NMConnection *connection, GError **error)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- GError *local_err = NULL;
+ NMDeviceFactory *factory;
GSList *iter;
char *iface = NULL;
NMDevice *device = NULL, *parent = NULL;
@@ -1049,16 +1015,9 @@ system_create_virtual_device (NMManager *self, NMConnection *connection, GError
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- iface = get_virtual_iface_name (self, connection, &parent);
- if (!iface) {
- nm_log_dbg (LOGD_DEVICE, "(%s) failed to determine virtual interface name",
- nm_connection_get_id (connection));
- g_set_error_literal (error,
- NM_MANAGER_ERROR,
- NM_MANAGER_ERROR_FAILED,
- "failed to determine virtual interface name");
+ iface = get_virtual_iface_name (self, connection, &parent, error);
+ if (!iface)
return NULL;
- }
/* Make sure we didn't create a device for this connection already */
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
@@ -1076,32 +1035,25 @@ system_create_virtual_device (NMManager *self, NMConnection *connection, GError
}
}
- /* Block notification of link added since we're creating the device
- * explicitly here, otherwise adding the platform/kernel device would
- * create it before this function can do the rest of the setup.
- */
- priv->ignore_link_added_cb++;
-
- nm_owned = !nm_platform_link_exists (iface);
-
- for (iter = priv->factories; iter; iter = iter->next) {
- device = nm_device_factory_create_virtual_device_for_connection (NM_DEVICE_FACTORY (iter->data),
- connection,
- parent,
- &local_err);
- if (device || local_err) {
- if (device)
- g_assert_no_error (local_err);
- else {
- nm_log_err (LOGD_DEVICE, "(%s) failed to create virtual device: %s",
- nm_connection_get_id (connection),
- local_err ? local_err->message : "(unknown error)");
- g_propagate_error (error, local_err);
- }
- break;
- }
+ factory = nm_device_factory_manager_find_factory_for_connection (connection);
+ if (!factory) {
+ nm_log_err (LOGD_DEVICE, "(%s:%s) NetworkManager plugin for '%s' unavailable",
+ nm_connection_get_id (connection), iface,
+ nm_connection_get_connection_type (connection));
+ g_set_error (error,
+ NM_MANAGER_ERROR,
+ NM_MANAGER_ERROR_FAILED,
+ "NetworkManager plugin for '%s' unavailable",
+ nm_connection_get_connection_type (connection));
+ goto out;
}
+ nm_owned = !nm_platform_link_get_by_ifname (NM_PLATFORM_GET, iface);
+
+ device = nm_device_factory_create_virtual_device_for_connection (factory,
+ connection,
+ parent,
+ error);
if (device) {
if (nm_owned)
nm_device_set_nm_owned (device);
@@ -1112,20 +1064,8 @@ system_create_virtual_device (NMManager *self, NMConnection *connection, GError
add_device (self, device, !nm_owned);
g_object_unref (device);
- } else {
- if (error && !*error)
- nm_log_err (LOGD_DEVICE, "(%s:%s) NetworkManager plugin for '%s' unavailable",
- nm_connection_get_id (connection), iface,
- nm_connection_get_connection_type (connection));
- g_set_error (error,
- NM_MANAGER_ERROR,
- NM_MANAGER_ERROR_FAILED,
- "NetworkManager plugin for '%s' unavailable",
- nm_connection_get_connection_type (connection));
}
- priv->ignore_link_added_cb--;
-
out:
g_free (iface);
return device;
@@ -1565,13 +1505,13 @@ get_existing_connection (NMManager *manager, NMDevice *device, gboolean *out_gen
nm_device_capture_initial_config (device);
if (ifindex) {
- int master_ifindex = nm_platform_link_get_master (ifindex);
+ int master_ifindex = nm_platform_link_get_master (NM_PLATFORM_GET, ifindex);
if (master_ifindex) {
master = nm_manager_get_device_by_ifindex (manager, master_ifindex);
if (!master) {
nm_log_dbg (LOGD_DEVICE, "(%s): cannot generate connection for slave before its master (%s/%d)",
- nm_device_get_iface (device), nm_platform_link_get_name (master_ifindex), master_ifindex);
+ nm_device_get_iface (device), nm_platform_link_get_name (NM_PLATFORM_GET, master_ifindex), master_ifindex);
return NULL;
}
if (!nm_device_get_act_request (master)) {
@@ -1694,10 +1634,7 @@ recheck_assume_connection (NMDevice *device, gpointer user_data)
if (manager_sleeping (self))
return FALSE;
- if (nm_device_get_unmanaged_flag (device, NM_UNMANAGED_USER) ||
- nm_device_get_unmanaged_flag (device, NM_UNMANAGED_INTERNAL) ||
- nm_device_get_unmanaged_flag (device, NM_UNMANAGED_EXTERNAL_DOWN) ||
- nm_device_get_unmanaged_flag (device, NM_UNMANAGED_PARENT))
+ if (nm_device_get_unmanaged_flag (device, NM_UNMANAGED_ALL & ~NM_UNMANAGED_DEFAULT))
return FALSE;
state = nm_device_get_state (device);
@@ -1768,6 +1705,18 @@ device_ip_iface_changed (NMDevice *device,
}
}
+static gboolean
+notify_component_added (NMManager *self, GObject *component)
+{
+ GSList *iter;
+
+ for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = iter->next) {
+ if (nm_device_notify_component_added (NM_DEVICE (iter->data), component))
+ return TRUE;
+ }
+ return FALSE;
+}
+
/**
* add_device:
* @self: the #NMManager
@@ -1788,9 +1737,13 @@ add_device (NMManager *self, NMDevice *device, gboolean try_assume)
RfKillType rtype;
GSList *iter, *remove = NULL;
gboolean connection_assumed = FALSE;
+ int ifindex;
/* No duplicates */
- if (nm_manager_get_device_by_udi (self, nm_device_get_udi (device)))
+ ifindex = nm_device_get_ifindex (device);
+ if (ifindex > 0 && nm_manager_get_device_by_ifindex (self, ifindex))
+ return;
+ if (find_device_by_iface (self, nm_device_get_iface (device)))
return;
/* Remove existing devices owned by the new device; eg remove ethernet
@@ -1852,8 +1805,12 @@ add_device (NMManager *self, NMDevice *device, gboolean try_assume)
driver = nm_device_get_driver (device);
if (!driver)
driver = "unknown";
- nm_log_info (LOGD_HW, "(%s): new %s device (driver: '%s' ifindex: %d)",
- iface, type_desc, driver, nm_device_get_ifindex (device));
+ nm_log_info (LOGD_HW, "(%s): new %s device (carrier: %s, driver: '%s', ifindex: %d)",
+ iface, type_desc,
+ nm_device_has_capability (device, NM_DEVICE_CAP_CARRIER_DETECT)
+ ? (nm_device_has_carrier (device) ? "ON" : "OFF")
+ : "UNKNOWN",
+ driver, nm_device_get_ifindex (device));
unmanaged_specs = nm_settings_get_unmanaged_specs (priv->settings);
user_unmanaged = nm_device_spec_match_list (device, unmanaged_specs);
@@ -1881,27 +1838,14 @@ add_device (NMManager *self, NMDevice *device, gboolean try_assume)
g_signal_emit (self, signals[DEVICE_ADDED], 0, device);
g_object_notify (G_OBJECT (self), NM_MANAGER_DEVICES);
+ notify_component_added (self, G_OBJECT (device));
+
/* New devices might be master interfaces for virtual interfaces; so we may
* need to create new virtual interfaces now.
*/
system_create_virtual_devices (self);
}
-static NMDevice *
-find_device_by_ip_iface (NMManager *self, const gchar *iface)
-{
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- GSList *iter;
-
- for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
- NMDevice *candidate = iter->data;
-
- if (g_strcmp0 (nm_device_get_ip_iface (candidate), iface) == 0)
- return candidate;
- }
- return NULL;
-}
-
/*******************************************************************/
static void
@@ -1917,134 +1861,13 @@ factory_component_added_cb (NMDeviceFactory *factory,
GObject *component,
gpointer user_data)
{
- NMManager *self = NM_MANAGER (user_data);
- GSList *iter;
-
- for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = iter->next) {
- if (nm_device_notify_component_added (NM_DEVICE (iter->data), component))
- return TRUE;
- }
- return FALSE;
-}
-
-#define PLUGIN_PREFIX "libnm-device-plugin-"
-#define PLUGIN_PATH_TAG "NMManager-plugin-path"
-
-struct read_device_factory_paths_data {
- char *path;
- struct stat st;
-};
-
-static gint
-read_device_factory_paths_sort_fcn (gconstpointer a, gconstpointer b)
-{
- const struct read_device_factory_paths_data *da = a;
- const struct read_device_factory_paths_data *db = b;
- time_t ta, tb;
-
- ta = MAX (da->st.st_mtime, da->st.st_ctime);
- tb = MAX (db->st.st_mtime, db->st.st_ctime);
-
- if (ta < tb)
- return 1;
- if (ta > tb)
- return -1;
- return 0;
+ return notify_component_added (NM_MANAGER (user_data), component);
}
-static char**
-read_device_factory_paths (void)
-{
- GDir *dir;
- GError *error = NULL;
- const char *item;
- GArray *paths;
- char **result;
- guint i;
-
- dir = g_dir_open (NMPLUGINDIR, 0, &error);
- if (!dir) {
- nm_log_warn (LOGD_HW, "device plugin: failed to open directory %s: %s",
- NMPLUGINDIR,
- (error && error->message) ? error->message : "(unknown)");
- g_clear_error (&error);
- return NULL;
- }
-
- paths = g_array_new (FALSE, FALSE, sizeof (struct read_device_factory_paths_data));
-
- while ((item = g_dir_read_name (dir))) {
- int errsv;
- struct read_device_factory_paths_data data;
-
- if (!g_str_has_prefix (item, PLUGIN_PREFIX))
- continue;
- if (g_str_has_suffix (item, ".la"))
- continue;
-
- data.path = g_build_filename (NMPLUGINDIR, item, NULL);
-
- if (stat (data.path, &data.st) != 0) {
- errsv = errno;
- nm_log_warn (LOGD_HW, "device plugin: skip invalid file %s (error during stat: %s)", data.path, strerror (errsv));
- goto NEXT;
- }
- if (!S_ISREG (data.st.st_mode))
- goto NEXT;
- if (data.st.st_uid != 0) {
- nm_log_warn (LOGD_HW, "device plugin: skip invalid file %s (file must be owned by root)", data.path);
- goto NEXT;
- }
- if (data.st.st_mode & (S_IWGRP | S_IWOTH | S_ISUID)) {
- nm_log_warn (LOGD_HW, "device plugin: skip invalid file %s (invalid file permissions)", data.path);
- goto NEXT;
- }
-
- g_array_append_val (paths, data);
- continue;
-NEXT:
- g_free (data.path);
- }
- g_dir_close (dir);
-
- /* sort filenames by modification time. */
- g_array_sort (paths, read_device_factory_paths_sort_fcn);
-
- result = g_new (char *, paths->len + 1);
- for (i = 0; i < paths->len; i++)
- result[i] = g_array_index (paths, struct read_device_factory_paths_data, i).path;
- result[i] = NULL;
-
- g_array_free (paths, TRUE);
- return result;
-}
-
-static gboolean
-_register_device_factory (NMManager *self,
- NMDeviceFactory *factory,
- gboolean duplicate_check,
- const char *path,
- GError **error)
+static void
+_register_device_factory (NMDeviceFactory *factory, gpointer user_data)
{
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- NMDeviceType ftype;
- GSList *iter;
-
- if (duplicate_check) {
- /* Make sure we don't double-register factories */
- ftype = nm_device_factory_get_device_type (factory);
- for (iter = priv->factories; iter; iter = iter->next) {
- if (ftype == nm_device_factory_get_device_type (iter->data)) {
- g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
- "multiple plugins for same type (using '%s' instead of '%s')",
- (char *) g_object_get_data (G_OBJECT (iter->data), PLUGIN_PATH_TAG),
- path);
- return FALSE;
- }
- }
- }
-
- priv->factories = g_slist_append (priv->factories, factory);
+ NMManager *self = NM_MANAGER (user_data);
g_signal_connect (factory,
NM_DEVICE_FACTORY_DEVICE_ADDED,
@@ -2054,80 +1877,6 @@ _register_device_factory (NMManager *self,
NM_DEVICE_FACTORY_COMPONENT_ADDED,
G_CALLBACK (factory_component_added_cb),
self);
- g_object_set_data_full (G_OBJECT (factory), PLUGIN_PATH_TAG,
- g_strdup (path), g_free);
- return TRUE;
-}
-
-static void
-load_device_factories (NMManager *self)
-{
- NMDeviceFactory *factory;
- const GSList *iter;
- GError *error = NULL;
- char **path, **paths;
-
- /* Register internal factories first */
- for (iter = nm_device_factory_get_internal_factory_types (); iter; iter = iter->next) {
- GType ftype = (GType) GPOINTER_TO_SIZE (iter->data);
-
- factory = (NMDeviceFactory *) g_object_new (ftype, NULL);
- g_assert (factory);
- if (_register_device_factory (self, factory, FALSE, "internal", &error)) {
- nm_log_dbg (LOGD_HW, "Loaded device plugin: %s", g_type_name (ftype));
- } else {
- nm_log_warn (LOGD_HW, "Loading device plugin failed: %s", error->message);
- g_object_unref (factory);
- g_clear_error (&error);
- }
- }
-
- paths = read_device_factory_paths ();
- if (!paths)
- return;
-
- for (path = paths; *path; path++) {
- GModule *plugin;
- NMDeviceFactoryCreateFunc create_func;
- const char *item;
-
- item = strrchr (*path, '/');
- g_assert (item);
-
- plugin = g_module_open (*path, G_MODULE_BIND_LOCAL);
-
- if (!plugin) {
- nm_log_warn (LOGD_HW, "(%s): failed to load plugin: %s", item, g_module_error ());
- continue;
- }
-
- if (!g_module_symbol (plugin, "nm_device_factory_create", (gpointer) &create_func)) {
- nm_log_warn (LOGD_HW, "(%s): failed to find device factory creator: %s", item, g_module_error ());
- g_module_close (plugin);
- continue;
- }
-
- factory = create_func (&error);
- if (!factory) {
- nm_log_warn (LOGD_HW, "(%s): failed to initialize device factory: %s",
- item, error ? error->message : "unknown");
- g_clear_error (&error);
- g_module_close (plugin);
- continue;
- }
- g_clear_error (&error);
-
- if (_register_device_factory (self, factory, TRUE, g_module_name (plugin), &error)) {
- nm_log_info (LOGD_HW, "Loaded device plugin: %s", g_module_name (plugin));
- g_module_make_resident (plugin);
- } else {
- nm_log_warn (LOGD_HW, "Loading device plugin failed: %s", error->message);
- g_object_unref (factory);
- g_module_close (plugin);
- g_clear_error (&error);
- }
- }
- g_strfreev (paths);
}
/*******************************************************************/
@@ -2135,63 +1884,43 @@ load_device_factories (NMManager *self)
static void
platform_link_added (NMManager *self,
int ifindex,
- NMPlatformLink *plink,
- NMPlatformReason reason)
+ NMPlatformLink *plink)
{
- NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+ NMDeviceFactory *factory;
NMDevice *device = NULL;
- GSList *iter;
GError *error = NULL;
g_return_if_fail (ifindex > 0);
- if (priv->ignore_link_added_cb > 0)
- return;
-
if (nm_manager_get_device_by_ifindex (self, ifindex))
return;
/* Try registered device factories */
- for (iter = priv->factories; iter; iter = iter->next) {
- NMDeviceFactory *factory = NM_DEVICE_FACTORY (iter->data);
-
- device = nm_device_factory_new_link (factory, plink, &error);
- if (device && NM_IS_DEVICE (device)) {
- g_assert_no_error (error);
- break; /* success! */
- }
+ factory = nm_device_factory_manager_find_factory_for_link_type (plink->type);
+ if (factory) {
+ gboolean ignore = FALSE;
- if (error) {
- nm_log_warn (LOGD_HW, "%s: factory failed to create device: (%d) %s",
- plink->udi,
- error ? error->code : -1,
- error ? error->message : "(unknown)");
- g_clear_error (&error);
+ device = nm_device_factory_new_link (factory, plink, &ignore, &error);
+ if (!device) {
+ if (!ignore) {
+ nm_log_warn (LOGD_HW, "%s: factory failed to create device: %s",
+ plink->name, error->message);
+ g_clear_error (&error);
+ }
return;
}
}
- /* Ignore Bluetooth PAN interfaces; they are handled by their NMDeviceBt
- * parent and don't get a separate interface.
- */
- if (!strncmp (plink->name, "bnep", STRLEN ("bnep")))
- return;
-
if (device == NULL) {
switch (plink->type) {
-
case NM_LINK_TYPE_WWAN_ETHERNET:
- /* WWAN pseudo-ethernet interfaces are handled automatically by
- * their NMDeviceModem and don't get a separate NMDevice object.
- */
- break;
-
+ case NM_LINK_TYPE_BNEP:
case NM_LINK_TYPE_OLPC_MESH:
case NM_LINK_TYPE_TEAM:
case NM_LINK_TYPE_WIFI:
case NM_LINK_TYPE_WIMAX:
nm_log_info (LOGD_HW, "(%s): '%s' plugin not available; creating generic device",
- plink->name, plink->type_name);
+ plink->name, nm_link_type_to_string (plink->type));
/* fall through */
default:
device = nm_device_generic_new (plink);
@@ -2205,30 +1934,76 @@ platform_link_added (NMManager *self,
}
}
+typedef struct {
+ NMManager *self;
+ int ifindex;
+} PlatformLinkCbData;
+
+static gboolean
+_platform_link_cb_idle (PlatformLinkCbData *data)
+{
+ NMManager *self = data->self;
+
+ if (self) {
+ const NMPlatformLink *l;
+
+ l = nm_platform_link_get (NM_PLATFORM_GET, data->ifindex);
+ if (l) {
+ NMPlatformLink pllink;
+
+ pllink = *l; /* make a copy of the link instance */
+ platform_link_added (self, data->ifindex, &pllink);
+ } else {
+ NMDevice *device;
+
+ device = nm_manager_get_device_by_ifindex (self, data->ifindex);
+ if (device)
+ remove_device (self, device, FALSE, TRUE);
+ }
+ g_object_remove_weak_pointer (G_OBJECT (self), (gpointer *) &data->self);
+ }
+ g_slice_free (PlatformLinkCbData, data);
+ return G_SOURCE_REMOVE;
+}
+
static void
platform_link_cb (NMPlatform *platform,
+ NMPObjectType obj_type,
int ifindex,
NMPlatformLink *plink,
NMPlatformSignalChangeType change_type,
NMPlatformReason reason,
gpointer user_data)
{
+ PlatformLinkCbData *data;
+
switch (change_type) {
case NM_PLATFORM_SIGNAL_ADDED:
- platform_link_added (NM_MANAGER (user_data), ifindex, plink, reason);
- break;
- case NM_PLATFORM_SIGNAL_REMOVED: {
- NMManager *self = NM_MANAGER (user_data);
- NMDevice *device;
-
- device = nm_manager_get_device_by_ifindex (self, ifindex);
- if (device)
- remove_device (self, device, FALSE, TRUE);
+ case NM_PLATFORM_SIGNAL_REMOVED:
+ data = g_slice_new (PlatformLinkCbData);
+ data->self = NM_MANAGER (user_data);
+ data->ifindex = ifindex;
+ g_object_add_weak_pointer (G_OBJECT (data->self), (gpointer *) &data->self);
+ g_idle_add ((GSourceFunc) _platform_link_cb_idle, data);
break;
- }
- default:
+ default:
break;
- }
+ }
+}
+
+static void
+platform_query_devices (NMManager *self)
+{
+ GArray *links_array;
+ NMPlatformLink *links;
+ int i;
+
+ links_array = nm_platform_link_get_all (NM_PLATFORM_GET);
+ links = (NMPlatformLink *) links_array->data;
+ for (i = 0; i < links_array->len; i++)
+ platform_link_added (self, links[i].ifindex, &links[i]);
+
+ g_array_unref (links_array);
}
static void
@@ -2248,6 +2023,40 @@ nm_manager_get_devices (NMManager *manager)
return NM_MANAGER_GET_PRIVATE (manager)->devices;
}
+static NMDevice *
+nm_manager_get_connection_device (NMManager *self,
+ NMConnection *connection)
+{
+ NMActiveConnection *ac = find_ac_for_connection (self, connection);
+ if (ac == NULL)
+ return NULL;
+
+ return nm_active_connection_get_device (ac);
+}
+
+static NMDevice *
+nm_manager_get_best_device_for_connection (NMManager *self,
+ NMConnection *connection)
+{
+ const GSList *devices, *iter;
+ NMDevice *act_device = nm_manager_get_connection_device (self, connection);
+
+ if (act_device)
+ return act_device;
+
+ /* Pick the first device that's compatible with the connection. */
+ devices = nm_manager_get_devices (self);
+ for (iter = devices; iter; iter = g_slist_next (iter)) {
+ NMDevice *device = NM_DEVICE (iter->data);
+
+ if (nm_device_check_connection_available (device, connection, NM_DEVICE_CHECK_CON_AVAILABLE_NONE, NULL))
+ return device;
+ }
+
+ /* No luck. :( */
+ return NULL;
+}
+
static gboolean
impl_manager_get_devices (NMManager *manager, GPtrArray **devices, GError **err)
{
@@ -2411,13 +2220,10 @@ find_master (NMManager *self,
NMConnection *candidate = iter->data;
char *vname;
- if (nm_connection_is_virtual (candidate)) {
- vname = get_virtual_iface_name (self, candidate, NULL);
- if ( g_strcmp0 (master, vname) == 0
- && is_compatible_with_slave (candidate, connection))
- master_connection = candidate;
- g_free (vname);
- }
+ vname = get_virtual_iface_name (self, candidate, NULL, NULL);
+ if (g_strcmp0 (master, vname) == 0 && is_compatible_with_slave (candidate, connection))
+ master_connection = candidate;
+ g_free (vname);
}
g_slist_free (connections);
}
@@ -2615,6 +2421,127 @@ ensure_master_active_connection (NMManager *self,
return NULL;
}
+/**
+ * find_slaves:
+ * @manager: #NMManager object
+ * @connection: the master #NMConnection to find slave connections for
+ * @device: the master #NMDevice for the @connection
+ *
+ * Given an #NMConnection, attempts to find its slaves. If @connection is not
+ * master, or has not any slaves, this will return %NULL.
+ *
+ * Returns: list of slave connections for given master @connection, or %NULL
+ **/
+static GSList *
+find_slaves (NMManager *manager,
+ NMConnection *connection,
+ NMDevice *device)
+{
+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
+ GSList *all_connections, *iter;
+ GSList *slaves = NULL;
+ NMSettingConnection *s_con;
+ const char *master;
+
+ s_con = nm_connection_get_setting_connection (connection);
+ g_assert (s_con);
+ master = nm_setting_connection_get_master (s_con);
+
+ if (master != NULL)
+ return NULL; /* connection is not master */
+
+ /* Search through all connections, not only inactive ones, because
+ * even if a slave was already active, it might be deactivated during
+ * master reactivation.
+ */
+ all_connections = nm_settings_get_connections (priv->settings);
+ for (iter = all_connections; iter; iter = iter->next) {
+ NMConnection *master_connection = NULL;
+ NMDevice *master_device = NULL;
+ NMConnection *candidate = iter->data;
+
+ find_master (manager, candidate, NULL, &master_connection, &master_device, NULL, NULL);
+ if ( (master_connection && master_connection == connection)
+ || (master_device && master_device == device)) {
+ slaves = g_slist_prepend (slaves, candidate);
+ }
+ }
+ g_slist_free (all_connections);
+
+ return g_slist_reverse (slaves);
+}
+
+static gboolean
+should_connect_slaves (NMConnection *connection, NMDevice *device)
+{
+ NMSettingConnection *s_con;
+ NMSettingConnectionAutoconnectSlaves autoconnect_slaves;
+ gs_free char *value = NULL;
+
+ s_con = nm_connection_get_setting_connection (connection);
+ g_assert (s_con);
+
+ /* Check autoconnect-slaves property */
+ autoconnect_slaves = nm_setting_connection_get_autoconnect_slaves (s_con);
+ if (autoconnect_slaves != NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT)
+ goto out;
+
+ /* Check configuration default for autoconnect-slaves property */
+ value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+ "connection.autoconnect-slaves", device);
+ if (value)
+ autoconnect_slaves = _nm_utils_ascii_str_to_int64 (value, 10, 0, 1, -1);
+
+out:
+ if (autoconnect_slaves == NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO)
+ return FALSE;
+ if (autoconnect_slaves == NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES)
+ return TRUE;
+ return FALSE;
+}
+
+static gboolean
+autoconnect_slaves (NMManager *manager,
+ NMConnection *master_connection,
+ NMDevice *master_device,
+ NMAuthSubject *subject)
+{
+ GError *local_err = NULL;
+ gboolean ret = FALSE;
+
+ if (should_connect_slaves (master_connection, master_device)) {
+ GSList *slaves, *iter;
+
+ iter = slaves = find_slaves (manager, master_connection, master_device);
+ ret = slaves != NULL;
+
+ while (iter) {
+ NMConnection *slave_connection = iter->data;
+
+ iter = iter->next;
+ nm_log_dbg (LOGD_CORE, "will activate slave connection '%s' (%s) as a dependency for master '%s' (%s)",
+ nm_connection_get_id (slave_connection),
+ nm_connection_get_uuid (slave_connection),
+ nm_connection_get_id (master_connection),
+ nm_connection_get_uuid (master_connection));
+
+ /* Schedule slave activation */
+ nm_manager_activate_connection (manager,
+ slave_connection,
+ NULL,
+ nm_manager_get_best_device_for_connection (manager, slave_connection),
+ subject,
+ &local_err);
+ if (local_err) {
+ nm_log_warn (LOGD_CORE, "Slave connection activation failed: %s", local_err->message);
+ g_error_free (local_err);
+ }
+ }
+ g_slist_free (slaves);
+ }
+ return ret;
+}
+
static gboolean
_internal_activate_vpn (NMManager *self, NMActiveConnection *active, GError **error)
{
@@ -2635,7 +2562,7 @@ _internal_activate_vpn (NMManager *self, NMActiveConnection *active, GError **er
static gboolean
_internal_activate_device (NMManager *self, NMActiveConnection *active, GError **error)
{
- NMDevice *device, *master_device = NULL;
+ NMDevice *device, *existing, *master_device = NULL;
NMConnection *connection;
NMConnection *master_connection = NULL;
NMActiveConnection *master_ac = NULL;
@@ -2783,11 +2710,19 @@ _internal_activate_device (NMManager *self, NMActiveConnection *active, GError *
}
nm_active_connection_set_master (active, master_ac);
- nm_log_dbg (LOGD_CORE, "Activation of '%s' depends on active connection %s",
+ nm_log_dbg (LOGD_CORE, "Activation of '%s' depends on active connection %p",
nm_connection_get_id (connection),
- nm_active_connection_get_path (master_ac));
+ master_ac);
}
+ /* Check slaves for master connection and possibly activate them */
+ autoconnect_slaves (self, connection, device, nm_active_connection_get_subject (active));
+
+ /* Disconnect the connection if connected or queued on another device */
+ existing = nm_manager_get_connection_device (self, connection);
+ if (existing)
+ nm_device_steal_connection (existing, connection);
+
/* Export the new ActiveConnection to clients and start it on the device */
nm_active_connection_export (active);
g_object_notify (G_OBJECT (self), NM_MANAGER_ACTIVE_CONNECTIONS);
@@ -2825,6 +2760,7 @@ _internal_activate_generic (NMManager *self, NMActiveConnection *active, GError
* is exported, make sure the manager's activating-connection property
* is up-to-date.
*/
+ active_connection_add (self, active);
policy_activating_device_changed (G_OBJECT (priv->policy), NULL, self);
}
@@ -2894,18 +2830,6 @@ _new_active_connection (NMManager *self,
return NULL;
}
- if (existing_ac) {
- NMDevice *existing_device = nm_active_connection_get_device (existing_ac);
-
- if (existing_device != device) {
- g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_CONNECTION_ALREADY_ACTIVE,
- "Connection '%s' is already active on %s",
- nm_connection_get_id (connection),
- nm_device_get_iface (existing_device));
- return NULL;
- }
- }
-
/* Normalize the specific object */
if (specific_object && g_strcmp0 (specific_object, "/") == 0)
specific_object = NULL;
@@ -2929,15 +2853,14 @@ _internal_activation_failed (NMManager *self,
NMActiveConnection *active,
const char *error_desc)
{
- nm_log_warn (LOGD_CORE, "Failed to activate '%s': %s",
- nm_connection_get_id (nm_active_connection_get_connection (active)),
- error_desc);
+ nm_log_dbg (LOGD_CORE, "Failed to activate '%s': %s",
+ nm_connection_get_id (nm_active_connection_get_connection (active)),
+ error_desc);
if (nm_active_connection_get_state (active) <= NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
nm_active_connection_set_state (active, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING);
nm_active_connection_set_state (active, NM_ACTIVE_CONNECTION_STATE_DEACTIVATED);
}
- active_connection_remove (self, active);
}
static void
@@ -2948,8 +2871,11 @@ _internal_activation_auth_done (NMActiveConnection *active,
gpointer user_data2)
{
NMManager *self = user_data1;
+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
GError *error = NULL;
+ priv->authorizing_connections = g_slist_remove (priv->authorizing_connections, active);
+
if (success) {
if (_internal_activate_generic (self, active, &error)) {
g_object_unref (active);
@@ -2989,8 +2915,10 @@ nm_manager_activate_connection (NMManager *self,
NMAuthSubject *subject,
GError **error)
{
+ NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
NMActiveConnection *active;
char *error_desc = NULL;
+ GSList *iter;
g_return_val_if_fail (self != NULL, NULL);
g_return_val_if_fail (connection != NULL, NULL);
@@ -3010,6 +2938,22 @@ nm_manager_activate_connection (NMManager *self,
return NULL;
}
+ /* Look for a active connection that's equivalent and is already pending authorization
+ * and eventual activation. This is used to de-duplicate concurrent activations which would
+ * otherwise race and cause the device to disconnect and reconnect repeatedly.
+ * In particular, this allows the master and multiple slaves to concurrently auto-activate
+ * while all the slaves would use the same active-connection. */
+ for (iter = priv->authorizing_connections; iter; iter = g_slist_next (iter)) {
+ active = iter->data;
+
+ if ( connection == nm_active_connection_get_connection (active)
+ && g_strcmp0 (nm_active_connection_get_specific_object (active), specific_object) == 0
+ && nm_active_connection_get_device (active) == device
+ && nm_auth_subject_is_internal (nm_active_connection_get_subject (active))
+ && nm_auth_subject_is_internal (subject))
+ return active;
+ }
+
active = _new_active_connection (self,
connection,
specific_object,
@@ -3017,8 +2961,8 @@ nm_manager_activate_connection (NMManager *self,
subject,
error);
if (active) {
+ priv->authorizing_connections = g_slist_prepend (priv->authorizing_connections, active);
nm_active_connection_authorize (active, _internal_activation_auth_done, self, NULL);
- active_connection_add (self, active);
}
return active;
}
@@ -3064,6 +3008,18 @@ validate_activation_request (NMManager *self,
goto error;
}
+ /* Not implemented yet, we want to fail early */
+ if ( nm_connection_get_setting_connection (connection)
+ && nm_connection_get_setting_ip6_config (connection)
+ && !strcmp (nm_utils_get_ip_config_method (connection, NM_TYPE_SETTING_IP6_CONFIG),
+ NM_SETTING_IP6_CONFIG_METHOD_SHARED)) {
+ g_set_error_literal (error,
+ NM_MANAGER_ERROR,
+ NM_MANAGER_ERROR_CONNECTION_NOT_AVAILABLE,
+ "Sharing IPv6 connections is not supported yet.");
+ return NULL;
+ }
+
/* Check whether it's a VPN or not */
if ( nm_connection_get_setting_vpn (connection)
|| nm_connection_is_type (connection, NM_SETTING_VPN_SETTING_NAME))
@@ -3083,7 +3039,10 @@ validate_activation_request (NMManager *self,
"Device not found");
goto error;
}
- } else {
+ } else
+ device = nm_manager_get_best_device_for_connection (self, connection);
+
+ if (!device) {
gboolean is_software = nm_connection_is_virtual (connection);
/* VPN and software-device connections don't need a device yet */
@@ -3091,22 +3050,17 @@ validate_activation_request (NMManager *self,
g_set_error_literal (error,
NM_MANAGER_ERROR,
NM_MANAGER_ERROR_UNKNOWN_DEVICE,
- "This connection requires an existing device.");
+ "No suitable device found for this connection.");
goto error;
}
if (is_software) {
- /* Look for an existing device with the connection's interface name */
char *iface;
- iface = get_virtual_iface_name (self, connection, NULL);
- if (!iface) {
- g_set_error_literal (error,
- NM_MANAGER_ERROR,
- NM_MANAGER_ERROR_UNKNOWN_DEVICE,
- "Failed to determine connection's virtual interface name");
+ /* Look for an existing device with the connection's interface name */
+ iface = get_virtual_iface_name (self, connection, NULL, error);
+ if (!iface)
goto error;
- }
device = find_device_by_ip_iface (self, iface);
g_free (iface);
@@ -3252,7 +3206,6 @@ impl_manager_activate_connection (NMManager *self,
goto error;
nm_active_connection_authorize (active, _activation_auth_done, self, context);
- active_connection_add (self, active);
g_clear_object (&subject);
return;
@@ -3330,8 +3283,6 @@ _add_and_activate_auth_done (NMActiveConnection *active,
activation_add_done,
info);
} else {
- active_connection_remove (self, active);
-
g_assert (error_desc);
error = g_error_new_literal (NM_MANAGER_ERROR,
NM_MANAGER_ERROR_PERMISSION_DENIED,
@@ -3438,7 +3389,6 @@ impl_manager_add_and_activate_connection (NMManager *self,
goto error;
nm_active_connection_authorize (active, _add_and_activate_auth_done, self, context);
- active_connection_add (self, active);
g_object_unref (connection);
g_object_unref (subject);
return;
@@ -3616,7 +3566,7 @@ done:
static gboolean
device_is_wake_on_lan (NMDevice *device)
{
- return nm_platform_link_get_wake_on_lan (nm_device_get_ip_ifindex (device));
+ return nm_platform_link_get_wake_on_lan (NM_PLATFORM_GET, nm_device_get_ip_ifindex (device));
}
static void
@@ -4172,11 +4122,16 @@ impl_manager_check_connectivity (NMManager *manager,
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_NETWORK_CONTROL, TRUE);
}
+static void
+start_factory (NMDeviceFactory *factory, gpointer user_data)
+{
+ nm_device_factory_start (factory);
+}
+
void
nm_manager_start (NMManager *self)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
- GSList *iter;
guint i;
/* Set initial radio enabled/disabled state */
@@ -4208,10 +4163,9 @@ nm_manager_start (NMManager *self)
system_hostname_changed_cb (priv->settings, NULL, self);
/* Start device factories */
- for (iter = priv->factories; iter; iter = iter->next)
- nm_device_factory_start (iter->data);
+ nm_device_factory_manager_for_each_factory (start_factory, NULL);
- nm_platform_query_devices ();
+ platform_query_devices (self);
/*
* Connections added before the manager is started do not emit
@@ -4270,12 +4224,9 @@ connectivity_changed (NMConnectivity *connectivity,
gpointer user_data)
{
NMManager *self = NM_MANAGER (user_data);
- NMConnectivityState state;
- static const char *connectivity_states[] = { "UNKNOWN", "NONE", "PORTAL", "LIMITED", "FULL" };
- state = nm_connectivity_get_state (connectivity);
nm_log_dbg (LOGD_CORE, "connectivity checking indicates %s",
- connectivity_states[state]);
+ nm_connectivity_state_to_string (nm_connectivity_get_state (connectivity)));
nm_manager_update_state (self);
g_object_notify (G_OBJECT (self), NM_MANAGER_CONNECTIVITY);
@@ -4718,6 +4669,7 @@ nm_manager_new (NMSettings *settings,
NMManagerPrivate *priv;
DBusGConnection *bus;
DBusConnection *dbus_connection;
+ NMConfigData *config_data;
g_assert (settings);
@@ -4749,7 +4701,16 @@ nm_manager_new (NMSettings *settings,
g_signal_connect (priv->policy, "notify::" NM_POLICY_ACTIVATING_IP6_DEVICE,
G_CALLBACK (policy_activating_device_changed), singleton);
- priv->connectivity = nm_connectivity_new ();
+ priv->config = g_object_ref (nm_config_get ());
+ g_signal_connect (G_OBJECT (priv->config),
+ NM_CONFIG_SIGNAL_CONFIG_CHANGED,
+ G_CALLBACK (_config_changed_cb),
+ singleton);
+
+ config_data = nm_config_get_data (priv->config);
+ priv->connectivity = nm_connectivity_new (nm_config_data_get_connectivity_uri (config_data),
+ nm_config_data_get_connectivity_interval (config_data),
+ nm_config_data_get_connectivity_response (config_data));
g_signal_connect (priv->connectivity, "notify::" NM_CONNECTIVITY_STATE,
G_CALLBACK (connectivity_changed), singleton);
@@ -4807,7 +4768,7 @@ nm_manager_new (NMSettings *settings,
rfkill_change (priv->radio_states[RFKILL_TYPE_WLAN].desc, RFKILL_TYPE_WLAN, initial_wifi_enabled);
rfkill_change (priv->radio_states[RFKILL_TYPE_WWAN].desc, RFKILL_TYPE_WWAN, initial_wwan_enabled);
- load_device_factories (singleton);
+ nm_device_factory_manager_load_factories (_register_device_factory, singleton);
return singleton;
}
@@ -5042,13 +5003,18 @@ set_property (GObject *object, guint prop_id,
}
static void
+_deinit_device_factory (NMDeviceFactory *factory, gpointer user_data)
+{
+ g_signal_handlers_disconnect_matched (factory, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, NM_MANAGER (user_data));
+}
+
+static void
dispose (GObject *object)
{
NMManager *manager = NM_MANAGER (object);
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (manager);
DBusGConnection *bus;
DBusConnection *dbus_connection;
- GSList *iter;
g_slist_free_full (priv->auth_chains, (GDestroyNotify) nm_auth_chain_unref);
priv->auth_chains = NULL;
@@ -5070,7 +5036,14 @@ dispose (GObject *object)
g_clear_object (&priv->primary_connection);
g_clear_object (&priv->activating_connection);
- g_clear_object (&priv->connectivity);
+ if (priv->config) {
+ g_signal_handlers_disconnect_by_func (priv->config, _config_changed_cb, manager);
+ g_clear_object (&priv->config);
+ }
+ if (priv->connectivity) {
+ g_signal_handlers_disconnect_by_func (priv->connectivity, connectivity_changed, manager);
+ g_clear_object (&priv->connectivity);
+ }
g_free (priv->hostname);
@@ -5113,14 +5086,8 @@ dispose (GObject *object)
g_clear_object (&priv->fw_monitor);
}
- for (iter = priv->factories; iter; iter = iter->next) {
- NMDeviceFactory *factory = iter->data;
-
- g_signal_handlers_disconnect_matched (factory, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, manager);
- g_object_unref (factory);
- }
- g_clear_pointer (&priv->factories, g_slist_free);
-
+ nm_device_factory_manager_for_each_factory (_deinit_device_factory, manager);
+
if (priv->timestamp_update_id) {
g_source_remove (priv->timestamp_update_id);
priv->timestamp_update_id = 0;
diff --git a/src/nm-multi-index.c b/src/nm-multi-index.c
new file mode 100644
index 000000000..d45f4834f
--- /dev/null
+++ b/src/nm-multi-index.c
@@ -0,0 +1,441 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include "nm-multi-index.h"
+
+#include <string.h>
+
+#include "nm-glib-compat.h"
+#include "nm-macros-internal.h"
+
+
+struct NMMultiIndex {
+ NMMultiIndexFuncEqual equal_fcn;
+ NMMultiIndexFuncClone clone_fcn;
+ GHashTable *hash;
+};
+
+typedef struct {
+ GHashTable *index;
+ gpointer *values;
+} ValuesData;
+
+/******************************************************************************************/
+
+static ValuesData *
+_values_data_create (void)
+{
+ ValuesData *values_data;
+
+ values_data = g_slice_new (ValuesData);
+ values_data->index = g_hash_table_new (NULL, NULL);
+ values_data->values = NULL;
+ return values_data;
+}
+
+static void
+_values_data_destroy (ValuesData *values_data)
+{
+ if (values_data) {
+ g_free (values_data->values);
+ g_hash_table_unref (values_data->index);
+ g_slice_free (ValuesData, values_data);
+ }
+}
+
+static void
+_values_data_populate_array (ValuesData *values_data)
+{
+ guint i, len;
+ gpointer *values;
+ GHashTableIter iter;
+
+ nm_assert (values_data);
+ nm_assert (values_data->index && g_hash_table_size (values_data->index) > 0);
+
+ if (values_data->values)
+ return;
+
+ len = g_hash_table_size (values_data->index);
+ values = g_new (gpointer, len + 1);
+
+ g_hash_table_iter_init (&iter, values_data->index);
+ for (i = 0; g_hash_table_iter_next (&iter, &values[i], NULL); i++)
+ nm_assert (i < len);
+ nm_assert (i == len);
+ values[i] = NULL;
+
+ values_data->values = values;
+}
+
+/******************************************************************************************/
+
+/**
+ * nm_multi_index_lookup():
+ * @index:
+ * @id:
+ * @out_len: (allow-none): output the number of values
+ * that are returned.
+ *
+ * Returns: (transfer-none): %NULL if there are no values
+ * or a %NULL terminated array of pointers.
+ */
+void *const*
+nm_multi_index_lookup (const NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ guint *out_len)
+{
+ ValuesData *values_data;
+
+ g_return_val_if_fail (index, NULL);
+ g_return_val_if_fail (id, NULL);
+
+ values_data = g_hash_table_lookup (index->hash, id);
+ if (!values_data) {
+ if (out_len)
+ *out_len = 0;
+ return NULL;
+ }
+ _values_data_populate_array (values_data);
+ if (out_len)
+ *out_len = g_hash_table_size (values_data->index);
+ return values_data->values;
+}
+
+gboolean
+nm_multi_index_contains (const NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value)
+{
+ ValuesData *values_data;
+
+ g_return_val_if_fail (index, FALSE);
+ g_return_val_if_fail (id, FALSE);
+ g_return_val_if_fail (value, FALSE);
+
+ values_data = g_hash_table_lookup (index->hash, id);
+ return values_data
+ && g_hash_table_contains (values_data->index, value);
+}
+
+const NMMultiIndexId *
+nm_multi_index_lookup_first_by_value (const NMMultiIndex *index,
+ gconstpointer value)
+{
+ GHashTableIter iter;
+ const NMMultiIndexId *id;
+ ValuesData *values_data;
+
+ g_return_val_if_fail (index, NULL);
+ g_return_val_if_fail (value, NULL);
+
+ /* reverse-lookup needs to iterate over all hash tables. It should
+ * still be fairly quick, if the number of hash tables is small.
+ * There is no O(1) reverse lookup implemented, because this access
+ * pattern is not what NMMultiIndex is here for.
+ * You are supposed to use NMMultiIndex by always knowing which @id
+ * a @value has.
+ */
+
+ g_hash_table_iter_init (&iter, index->hash);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &id, (gpointer *) &values_data)) {
+ if (g_hash_table_contains (values_data->index, value))
+ return id;
+ }
+ return NULL;
+}
+
+void
+nm_multi_index_foreach (const NMMultiIndex *index,
+ gconstpointer value,
+ NMMultiIndexFuncForeach foreach_func,
+ gpointer user_data)
+{
+ GHashTableIter iter;
+ const NMMultiIndexId *id;
+ ValuesData *values_data;
+
+ g_return_if_fail (index);
+ g_return_if_fail (foreach_func);
+
+ g_hash_table_iter_init (&iter, index->hash);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &id, (gpointer *) &values_data)) {
+ if ( value
+ && !g_hash_table_contains (values_data->index, value))
+ continue;
+
+ _values_data_populate_array (values_data);
+ if (!foreach_func (id, values_data->values, g_hash_table_size (values_data->index), user_data))
+ return;
+ }
+}
+
+void
+nm_multi_index_iter_init (NMMultiIndexIter *iter,
+ const NMMultiIndex *index,
+ gconstpointer value)
+{
+ g_return_if_fail (index);
+ g_return_if_fail (iter);
+
+ g_hash_table_iter_init (&iter->_iter, index->hash);
+ iter->_index = index;
+ iter->_value = value;
+}
+
+gboolean
+nm_multi_index_iter_next (NMMultiIndexIter *iter,
+ const NMMultiIndexId **out_id,
+ void *const**out_values,
+ guint *out_len)
+{
+ const NMMultiIndexId *id;
+ ValuesData *values_data;
+
+ g_return_val_if_fail (iter, FALSE);
+
+ while (g_hash_table_iter_next (&iter->_iter, (gpointer *) &id, (gpointer *) &values_data)) {
+ if ( !iter->_value
+ || g_hash_table_contains (values_data->index, iter->_value)) {
+ _values_data_populate_array (values_data);
+ if (out_id)
+ *out_id = id;
+ if (out_values)
+ *out_values = values_data->values;
+ if (out_len)
+ *out_len = g_hash_table_size (values_data->index);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/******************************************************************************************/
+
+void
+nm_multi_index_id_iter_init (NMMultiIndexIdIter *iter,
+ const NMMultiIndex *index,
+ const NMMultiIndexId *id)
+{
+ ValuesData *values_data;
+
+ g_return_if_fail (index);
+ g_return_if_fail (iter);
+ g_return_if_fail (id);
+
+ values_data = g_hash_table_lookup (index->hash, id);
+ if (!values_data)
+ iter->_state = 1;
+ else {
+ iter->_state = 0;
+ g_hash_table_iter_init (&iter->_iter, values_data->index);
+ }
+}
+
+gboolean
+nm_multi_index_id_iter_next (NMMultiIndexIdIter *iter,
+ void **out_value)
+{
+ g_return_val_if_fail (iter, FALSE);
+ g_return_val_if_fail (iter->_state <= 1, FALSE);
+
+ if (iter->_state == 0)
+ return g_hash_table_iter_next (&iter->_iter, out_value, NULL);
+ else {
+ iter->_state = 2;
+ return FALSE;
+ }
+}
+
+/******************************************************************************************/
+
+static gboolean
+_do_add (NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value)
+{
+ ValuesData *values_data;
+
+ values_data = g_hash_table_lookup (index->hash, id);
+ if (!values_data) {
+ NMMultiIndexId *id_new;
+
+ /* Contrary to GHashTable, we don't take ownership of the @id that was
+ * provided to nm_multi_index_add(). Instead we clone it via @clone_fcn
+ * when needed.
+ *
+ * The reason is, that we expect in most cases that there exists
+ * already a @id so that we don't need ownership of it (or clone it).
+ * By doing this, the caller can pass a stack allocated @id or
+ * reuse the @id for other insertions.
+ */
+ id_new = index->clone_fcn (id);
+ if (!id_new)
+ g_return_val_if_reached (FALSE);
+
+ values_data = _values_data_create ();
+ g_hash_table_replace (values_data->index, (gpointer) value, (gpointer) value);
+
+ g_hash_table_insert (index->hash, id_new, values_data);
+ } else {
+ if (!nm_g_hash_table_replace (values_data->index, (gpointer) value, (gpointer) value))
+ return FALSE;
+ g_clear_pointer (&values_data->values, g_free);
+ }
+ return TRUE;
+}
+
+static gboolean
+_do_remove (NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value)
+{
+ ValuesData *values_data;
+
+ values_data = g_hash_table_lookup (index->hash, id);
+ if (!values_data)
+ return FALSE;
+
+ if (!g_hash_table_remove (values_data->index, value))
+ return FALSE;
+
+ if (g_hash_table_size (values_data->index) == 0)
+ g_hash_table_remove (index->hash, id);
+ else
+ g_clear_pointer (&values_data->values, g_free);
+ return TRUE;
+}
+
+gboolean
+nm_multi_index_add (NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value)
+{
+ g_return_val_if_fail (index, FALSE);
+ g_return_val_if_fail (id, FALSE);
+ g_return_val_if_fail (value, FALSE);
+
+ return _do_add (index, id, value);
+}
+
+gboolean
+nm_multi_index_remove (NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value)
+{
+ g_return_val_if_fail (index, FALSE);
+ g_return_val_if_fail (value, FALSE);
+
+ if (!id)
+ g_return_val_if_reached (FALSE);
+ return _do_remove (index, id, value);
+}
+
+/**
+ * nm_multi_index_move:
+ * @index:
+ * @id_old: (allow-none): remove @value at @id_old
+ * @id_new: (allow-none): add @value under @id_new
+ * @value: the value to add
+ *
+ * Similar to a remove(), followed by an add(). The difference
+ * is, that we allow %NULL for both @id_old and @id_new.
+ * And the return value indicates whether @value was successfully
+ * removed *and* added.
+ *
+ * Returns: %TRUE, if the value was removed from @id_old and added
+ * as %id_new. %FALSE could mean, that @value was not added to @id_old
+ * before, or that that @value was already part of @id_new. */
+gboolean
+nm_multi_index_move (NMMultiIndex *index,
+ const NMMultiIndexId *id_old,
+ const NMMultiIndexId *id_new,
+ gconstpointer value)
+{
+ g_return_val_if_fail (index, FALSE);
+ g_return_val_if_fail (value, FALSE);
+
+ if (!id_old && !id_new) {
+ /* nothing to do, @value was and is not in @index. */
+ return TRUE;
+ } if (!id_old) {
+ /* add @value to @index with @id_new */
+ return _do_add (index, id_new, value);
+ } else if (!id_new) {
+ /* remove @value from @index with @id_old */
+ return _do_remove (index, id_old, value);
+ } else if (index->equal_fcn (id_old, id_new)) {
+ if (_do_add (index, id_new, value)) {
+ /* we would expect, that @value is already in @index,
+ * Return %FALSE, if it wasn't. */
+ return FALSE;
+ }
+ return TRUE;
+ } else {
+ gboolean did_remove;
+
+ did_remove = _do_remove (index, id_old, value);
+ return _do_add (index, id_new, value) && did_remove;
+ }
+}
+
+/******************************************************************************************/
+
+guint
+nm_multi_index_get_num_groups (const NMMultiIndex *index)
+{
+ g_return_val_if_fail (index, 0);
+ return g_hash_table_size (index->hash);
+}
+
+NMMultiIndex *
+nm_multi_index_new (NMMultiIndexFuncHash hash_fcn,
+ NMMultiIndexFuncEqual equal_fcn,
+ NMMultiIndexFuncClone clone_fcn,
+ NMMultiIndexFuncDestroy destroy_fcn)
+{
+ NMMultiIndex *index;
+
+ g_return_val_if_fail (hash_fcn, NULL);
+ g_return_val_if_fail (equal_fcn, NULL);
+ g_return_val_if_fail (clone_fcn, NULL);
+ g_return_val_if_fail (destroy_fcn, NULL);
+
+ index = g_new (NMMultiIndex, 1);
+ index->equal_fcn = equal_fcn;
+ index->clone_fcn = clone_fcn;
+
+ index->hash = g_hash_table_new_full ((GHashFunc) hash_fcn,
+ (GEqualFunc) equal_fcn,
+ (GDestroyNotify) destroy_fcn,
+ (GDestroyNotify) _values_data_destroy);
+ return index;
+}
+
+void
+nm_multi_index_free (NMMultiIndex *index)
+{
+ g_return_if_fail (index);
+ g_hash_table_unref (index->hash);
+ g_free (index);
+}
+
diff --git a/src/nm-multi-index.h b/src/nm-multi-index.h
new file mode 100644
index 000000000..e41ef54e7
--- /dev/null
+++ b/src/nm-multi-index.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#ifndef __NM_MULTI_INDEX__
+#define __NM_MULTI_INDEX__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+
+typedef struct {
+ char _dummy;
+} NMMultiIndexId;
+
+typedef struct NMMultiIndex NMMultiIndex;
+
+typedef struct {
+ GHashTableIter _iter;
+ const NMMultiIndex *_index;
+ gconstpointer _value;
+} NMMultiIndexIter;
+
+typedef struct {
+ GHashTableIter _iter;
+ guint _state;
+} NMMultiIndexIdIter;
+
+typedef gboolean (*NMMultiIndexFuncEqual) (const NMMultiIndexId *id_a, const NMMultiIndexId *id_b);
+typedef guint (*NMMultiIndexFuncHash) (const NMMultiIndexId *id);
+typedef NMMultiIndexId *(*NMMultiIndexFuncClone) (const NMMultiIndexId *id);
+typedef void (*NMMultiIndexFuncDestroy) (NMMultiIndexId *id);
+
+typedef gboolean (*NMMultiIndexFuncForeach) (const NMMultiIndexId *id, void *const* values, guint len, gpointer user_data);
+
+
+NMMultiIndex *nm_multi_index_new (NMMultiIndexFuncHash hash_fcn,
+ NMMultiIndexFuncEqual equal_fcn,
+ NMMultiIndexFuncClone clone_fcn,
+ NMMultiIndexFuncDestroy destroy_fcn);
+
+void nm_multi_index_free (NMMultiIndex *index);
+
+gboolean nm_multi_index_add (NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value);
+
+gboolean nm_multi_index_remove (NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value);
+
+gboolean nm_multi_index_move (NMMultiIndex *index,
+ const NMMultiIndexId *id_old,
+ const NMMultiIndexId *id_new,
+ gconstpointer value);
+
+guint nm_multi_index_get_num_groups (const NMMultiIndex *index);
+
+void *const*nm_multi_index_lookup (const NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ guint *out_len);
+
+gboolean nm_multi_index_contains (const NMMultiIndex *index,
+ const NMMultiIndexId *id,
+ gconstpointer value);
+
+const NMMultiIndexId *nm_multi_index_lookup_first_by_value (const NMMultiIndex *index,
+ gconstpointer value);
+
+void nm_multi_index_foreach (const NMMultiIndex *index,
+ gconstpointer value,
+ NMMultiIndexFuncForeach foreach_func,
+ gpointer user_data);
+
+void nm_multi_index_iter_init (NMMultiIndexIter *iter,
+ const NMMultiIndex *index,
+ gconstpointer value);
+gboolean nm_multi_index_iter_next (NMMultiIndexIter *iter,
+ const NMMultiIndexId **out_id,
+ void *const**out_values,
+ guint *out_len);
+
+void nm_multi_index_id_iter_init (NMMultiIndexIdIter *iter,
+ const NMMultiIndex *index,
+ const NMMultiIndexId *id);
+gboolean nm_multi_index_id_iter_next (NMMultiIndexIdIter *iter,
+ void **out_value);
+
+G_END_DECLS
+
+#endif /* __NM_MULTI_INDEX__ */
+
diff --git a/src/nm-policy.c b/src/nm-policy.c
index 87fcdcc92..8a573c8b3 100644
--- a/src/nm-policy.c
+++ b/src/nm-policy.c
@@ -170,7 +170,7 @@ _set_hostname (NMPolicy *policy,
* there was no valid hostname to start with.
*/
- /* Clear lookup adresses if we have a hostname, so that we don't
+ /* Clear lookup addresses if we have a hostname, so that we don't
* restart the reverse lookup thread later.
*/
if (new_hostname)
diff --git a/src/nm-posix-signals.c b/src/nm-posix-signals.c
deleted file mode 100644
index 22fed8310..000000000
--- a/src/nm-posix-signals.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager -- Network link manager
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright (C) 2012 Red Hat, Inc.
- */
-
-#include "config.h"
-
-#include <signal.h>
-
-#include "nm-posix-signals.h"
-
-
-/* Stores the original signal mask of NetworkManager process */
-static sigset_t nm_original_signal_mask;
-
-void
-nm_save_original_signal_mask (sigset_t sig_mask)
-{
- nm_original_signal_mask = sig_mask;
-}
-
-const sigset_t *
-nm_get_original_signal_mask (void)
-{
- return &nm_original_signal_mask;
-}
-
-/*
- * Unblock signals.
- * If a signal set is passed, those signals are unblocked. If user_data is NULL
- * the process' signal mask is set to the saved original mask.
- * Note: This function can be used in g_spawn_* as GSpawnChildSetupFunc()
- * callback.
- */
-void
-nm_unblock_posix_signals (gpointer user_data)
-{
- sigset_t *user_sigset = (sigset_t *) user_data;
-
- if (user_sigset != NULL) {
- pthread_sigmask (SIG_UNBLOCK, user_sigset, NULL);
- } else {
- const sigset_t *orig_sig_mask = nm_get_original_signal_mask ();
- pthread_sigmask (SIG_SETMASK, orig_sig_mask, NULL);
- }
-}
-
diff --git a/src/nm-posix-signals.h b/src/nm-posix-signals.h
deleted file mode 100644
index e2af559ba..000000000
--- a/src/nm-posix-signals.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager -- Network link manager
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright (C) 2012 Red Hat, Inc.
- */
-
-#ifndef __NETWORKMANAGER_POSIX_SIGNALS_H__
-#define __NETWORKMANAGER_POSIX_SIGNALS_H__
-
-#include <glib.h>
-#include <signal.h>
-
-/*
- * This function can be used in g_spawn_* as GSpawnChildSetupFunc()
- * callback.
- */
-void nm_unblock_posix_signals (gpointer user_data);
-
-void nm_save_original_signal_mask (sigset_t sig_mask);
-const sigset_t *nm_get_original_signal_mask (void);
-
-#endif /* __NETWORKMANAGER_POSIX_SIGNALS_H__ */
diff --git a/src/nm-route-manager.c b/src/nm-route-manager.c
new file mode 100644
index 000000000..5ee6c8654
--- /dev/null
+++ b/src/nm-route-manager.c
@@ -0,0 +1,1214 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include <string.h>
+
+#include "config.h"
+
+#include "nm-route-manager.h"
+#include "nm-platform.h"
+#include "nmp-object.h"
+#include "nm-core-internal.h"
+#include "nm-logging.h"
+#include "gsystem-local-alloc.h"
+#include "NetworkManagerUtils.h"
+
+/* if within half a second after adding an IP address a matching device-route shows
+ * up, we delete it. */
+#define IP4_DEVICE_ROUTES_WAIT_TIME_NS (NM_UTILS_NS_PER_SECOND / 2)
+
+#define IP4_DEVICE_ROUTES_GC_INTERVAL_SEC (IP4_DEVICE_ROUTES_WAIT_TIME_NS * 2)
+
+typedef struct {
+ guint len;
+ NMPlatformIPXRoute *entries[1];
+} RouteIndex;
+
+typedef struct {
+ GArray *entries;
+ RouteIndex *index;
+
+ /* list of effective metrics. The indexes of the array correspond to @index, not @entries. */
+ GArray *effective_metrics;
+
+ /* this array contains the effective metrics but using the reversed index that corresponds
+ * to @entries, instead of @index. */
+ GArray *effective_metrics_reverse;
+} RouteEntries;
+
+typedef struct {
+ NMRouteManager *self;
+ gint64 scheduled_at_ns;
+ guint idle_id;
+ NMPObject *obj;
+} IP4DeviceRoutePurgeEntry;
+
+typedef struct {
+ NMPlatform *platform;
+
+ RouteEntries ip4_routes;
+ RouteEntries ip6_routes;
+ struct {
+ GHashTable *entries;
+ guint gc_id;
+ } ip4_device_routes;
+} NMRouteManagerPrivate;
+
+#define NM_ROUTE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_ROUTE_MANAGER, NMRouteManagerPrivate))
+
+G_DEFINE_TYPE (NMRouteManager, nm_route_manager, G_TYPE_OBJECT);
+
+NM_DEFINE_SINGLETON_GETTER (NMRouteManager, nm_route_manager_get, NM_TYPE_ROUTE_MANAGER);
+
+/*********************************************************************************************/
+
+typedef struct {
+ const NMPlatformVTableRoute *vt;
+
+ /* a compare function for two routes that considers only the destination fields network/plen.
+ * It is a looser comparisong then @route_id_cmp(), that means that if @route_dest_cmp()
+ * returns non-zero, also @route_id_cmp() returns the same value. It also means, that
+ * sorting by @route_id_cmp() implicitly sorts by @route_dest_cmp() as well. */
+ int (*route_dest_cmp) (const NMPlatformIPXRoute *r1, const NMPlatformIPXRoute *r2);
+
+ /* a compare function for two routes that considers only the fields network/plen,metric. */
+ int (*route_id_cmp) (const NMPlatformIPXRoute *r1, const NMPlatformIPXRoute *r2);
+} VTableIP;
+
+static const VTableIP vtable_v4, vtable_v6;
+
+#define VTABLE_ROUTE_INDEX(vtable, garray, idx) ((NMPlatformIPXRoute *) &((garray)->data[(idx) * (vtable)->vt->sizeof_route]))
+
+#define VTABLE_IS_DEVICE_ROUTE(vtable, route) ((vtable)->vt->is_ip4 \
+ ? ((route)->r4.gateway == 0) \
+ : IN6_IS_ADDR_UNSPECIFIED (&(route)->r6.gateway) )
+
+#define CMP_AND_RETURN_INT(a, b) \
+ G_STMT_START { \
+ typeof(a) _a = (a), _b = (b); \
+ \
+ if (_a < _b) \
+ return -1; \
+ if (_a > _b) \
+ return 1; \
+ } G_STMT_END
+
+/*********************************************************************************************/
+
+#define _LOG_PREFIX_NAME "route-mgr"
+
+#define _LOG(level, addr_family, ...) \
+ G_STMT_START { \
+ const int __addr_family = (addr_family); \
+ const NMLogLevel __level = (level); \
+ const NMLogDomain __domain = __addr_family == AF_INET ? LOGD_IP4 : (__addr_family == AF_INET6 ? LOGD_IP6 : LOGD_IP); \
+ \
+ if (nm_logging_enabled (__level, __domain)) { \
+ char __ch = __addr_family == AF_INET ? '4' : (__addr_family == AF_INET6 ? '6' : '-'); \
+ char __prefix[30] = _LOG_PREFIX_NAME; \
+ \
+ if ((self) != singleton_instance) \
+ g_snprintf (__prefix, sizeof (__prefix), "%s%c[%p]", _LOG_PREFIX_NAME, __ch, (self)); \
+ else \
+ __prefix[STRLEN (_LOG_PREFIX_NAME)] = __ch; \
+ _nm_log ((level), (__domain), 0, \
+ "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
+ __prefix _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
+ } \
+ } G_STMT_END
+#define _LOG_LEVEL_ENABLED(level, addr_family) \
+ ({ \
+ const int __addr_family = (addr_family); \
+ const NMLogLevel __level = (level); \
+ const NMLogDomain __domain = __addr_family == AF_INET ? LOGD_IP4 : (__addr_family == AF_INET6 ? LOGD_IP6 : LOGD_IP); \
+ \
+ nm_logging_enabled (__level, __domain); \
+ })
+
+#ifdef NM_MORE_LOGGING
+#define _LOGT_ENABLED(addr_family) _LOG_LEVEL_ENABLED (LOGL_TRACE, addr_family)
+#define _LOGT(addr_family, ...) _LOG (LOGL_TRACE, addr_family, __VA_ARGS__)
+#else
+#define _LOGT_ENABLED(addr_family) (FALSE && _LOG_LEVEL_ENABLED (LOGL_TRACE, addr_family))
+#define _LOGT(addr_family, ...) G_STMT_START { if (FALSE) { _LOG (LOGL_TRACE, addr_family, __VA_ARGS__); } } G_STMT_END
+#endif
+
+#define _LOGD(addr_family, ...) _LOG (LOGL_DEBUG, addr_family, __VA_ARGS__)
+#define _LOGI(addr_family, ...) _LOG (LOGL_INFO , addr_family, __VA_ARGS__)
+#define _LOGW(addr_family, ...) _LOG (LOGL_WARN , addr_family, __VA_ARGS__)
+#define _LOGE(addr_family, ...) _LOG (LOGL_ERR , addr_family, __VA_ARGS__)
+
+/*********************************************************************************************/
+
+static gboolean _ip4_device_routes_cancel (NMRouteManager *self);
+
+/*********************************************************************************************/
+
+#if defined (NM_MORE_ASSERTS) && !defined (G_DISABLE_ASSERT)
+inline static void
+ASSERT_route_index_valid (const VTableIP *vtable, const GArray *entries, const RouteIndex *index, gboolean unique_ifindexes)
+{
+ guint i, j;
+ int c;
+ const NMPlatformIPXRoute *r1, *r2;
+ gs_unref_hashtable GHashTable *ptrs = g_hash_table_new (NULL, NULL);
+ const NMPlatformIPXRoute *r_first = NULL, *r_last = NULL;
+
+ g_assert (index);
+
+ if (entries)
+ g_assert_cmpint (entries->len, ==, index->len);
+ else
+ g_assert (index->len == 0);
+
+ if (index->len > 0) {
+ r_first = VTABLE_ROUTE_INDEX (vtable, entries, 0);
+ r_last = VTABLE_ROUTE_INDEX (vtable, entries, index->len - 1);
+ }
+
+ /* assert that the @index is valid for the @entries. */
+
+ g_assert (!index->entries[index->len]);
+ for (i = 0; i < index->len; i++) {
+ r1 = index->entries[i];
+
+ g_assert (r1);
+ g_assert (r1 >= r_first);
+ g_assert (r1 <= r_last);
+ g_assert_cmpint ((((char *) r1) - ((char *) entries->data)) % vtable->vt->sizeof_route, ==, 0);
+
+ g_assert (!g_hash_table_contains (ptrs, (gpointer) r1));
+ g_hash_table_add (ptrs, (gpointer) r1);
+
+ for (j = i; j > 0; ) {
+ r2 = index->entries[--j];
+
+ c = vtable->route_id_cmp (r1, r2);
+ g_assert (c >= 0);
+ if (c != 0)
+ break;
+ if (unique_ifindexes)
+ g_assert_cmpint (r1->rx.ifindex, !=, r2->rx.ifindex);
+ }
+ }
+}
+#else
+#define ASSERT_route_index_valid(vtable, entries, index, unique_ifindexes) G_STMT_START { (void) 0; } G_STMT_END
+#endif
+
+/*********************************************************************************************/
+
+static int
+_v4_route_dest_cmp (const NMPlatformIP4Route *r1, const NMPlatformIP4Route *r2)
+{
+ CMP_AND_RETURN_INT (r1->plen, r2->plen);
+ CMP_AND_RETURN_INT (nm_utils_ip4_address_clear_host_address (r1->network, r1->plen),
+ nm_utils_ip4_address_clear_host_address (r2->network, r2->plen));
+ return 0;
+}
+
+static int
+_v6_route_dest_cmp (const NMPlatformIP6Route *r1, const NMPlatformIP6Route *r2)
+{
+ struct in6_addr n1, n2;
+
+ CMP_AND_RETURN_INT (r1->plen, r2->plen);
+
+ nm_utils_ip6_address_clear_host_address (&n1, &r1->network, r1->plen);
+ nm_utils_ip6_address_clear_host_address (&n2, &r2->network, r2->plen);
+ return memcmp (&n1, &n2, sizeof (n1));
+}
+
+static int
+_v4_route_id_cmp (const NMPlatformIP4Route *r1, const NMPlatformIP4Route *r2)
+{
+ CMP_AND_RETURN_INT (r1->plen, r2->plen);
+ CMP_AND_RETURN_INT (nm_utils_ip4_address_clear_host_address (r1->network, r1->plen),
+ nm_utils_ip4_address_clear_host_address (r2->network, r2->plen));
+ CMP_AND_RETURN_INT (r1->metric, r2->metric);
+ return 0;
+}
+
+static int
+_v6_route_id_cmp (const NMPlatformIP6Route *r1, const NMPlatformIP6Route *r2)
+{
+ struct in6_addr n1, n2;
+ int c;
+
+ CMP_AND_RETURN_INT (r1->plen, r2->plen);
+
+ nm_utils_ip6_address_clear_host_address (&n1, &r1->network, r1->plen);
+ nm_utils_ip6_address_clear_host_address (&n2, &r2->network, r2->plen);
+ c = memcmp (&n1, &n2, sizeof (n1));
+ if (c != 0)
+ return c;
+
+ CMP_AND_RETURN_INT (nm_utils_ip6_route_metric_normalize (r1->metric),
+ nm_utils_ip6_route_metric_normalize (r2->metric));
+ return 0;
+}
+
+/*********************************************************************************************/
+
+static int
+_route_index_create_sort (const NMPlatformIPXRoute **p1, const NMPlatformIPXRoute ** p2, const VTableIP *vtable)
+{
+ return vtable->route_id_cmp (*p1, *p2);
+}
+
+static RouteIndex *
+_route_index_create (const VTableIP *vtable, const GArray *routes)
+{
+ RouteIndex *index;
+ guint i;
+ guint len = routes ? routes->len : 0;
+
+ index = g_malloc (sizeof (RouteIndex) + len * sizeof (NMPlatformIPXRoute *));
+
+ index->len = len;
+ for (i = 0; i < len; i++)
+ index->entries[i] = VTABLE_ROUTE_INDEX (vtable, routes, i);
+ index->entries[i] = NULL;
+
+ /* this is a stable sort, which is very important at this point. */
+ g_qsort_with_data (index->entries,
+ len,
+ sizeof (NMPlatformIPXRoute *),
+ (GCompareDataFunc) _route_index_create_sort,
+ (gpointer) vtable);
+ return index;
+}
+
+static int
+_vx_route_id_cmp_full (const NMPlatformIPXRoute *r1, const NMPlatformIPXRoute *r2, const VTableIP *vtable)
+{
+ return vtable->route_id_cmp (r1, r2);
+}
+
+static gssize
+_route_index_find (const VTableIP *vtable, const RouteIndex *index, const NMPlatformIPXRoute *needle)
+{
+ gssize idx, idx2;
+
+ idx = _nm_utils_ptrarray_find_binary_search ((gpointer *) index->entries, index->len, (gpointer) needle, (GCompareDataFunc) _vx_route_id_cmp_full, (gpointer) vtable);
+ if (idx < 0)
+ return idx;
+
+ /* we only know that the route at index @idx has matching destination. Also find the one with the right
+ * ifindex by searching the neighbours */
+
+ idx2 = idx;
+ do {
+ if (index->entries[idx2]->rx.ifindex == needle->rx.ifindex)
+ return idx2;
+ } while ( idx2 > 0
+ && vtable->route_id_cmp (index->entries[--idx2], needle) != 0);
+
+ for (idx++; idx < index->len; idx++ ){
+ if (vtable->route_id_cmp (index->entries[idx], needle) != 0)
+ break;
+ if (index->entries[idx]->rx.ifindex == needle->rx.ifindex)
+ return idx;
+ }
+
+ return ~idx;
+}
+
+static guint
+_route_index_reverse_idx (const VTableIP *vtable, const RouteIndex *index, guint idx_idx, const GArray *routes)
+{
+ const NMPlatformIPXRoute *r, *r0;
+ gssize offset;
+
+ /* reverse the @idx_idx that points into @index, to the corresponding index into the unsorted @routes array. */
+
+ r = index->entries[idx_idx];
+ r0 = VTABLE_ROUTE_INDEX (vtable, routes, 0);
+
+ if (vtable->vt->is_ip4)
+ offset = &r->r4 - &r0->r4;
+ else
+ offset = &r->r6 - &r0->r6;
+ g_assert (offset >= 0 && offset < index->len);
+ g_assert (VTABLE_ROUTE_INDEX (vtable, routes, offset) == r);
+ return offset;
+}
+
+/*********************************************************************************************/
+
+static gboolean
+_route_equals_ignoring_ifindex (const VTableIP *vtable, const NMPlatformIPXRoute *r1, const NMPlatformIPXRoute *r2, gint64 r2_metric)
+{
+ NMPlatformIPXRoute r2_backup;
+
+ if ( r1->rx.ifindex != r2->rx.ifindex
+ || (r2_metric >= 0 && ((guint32) r2_metric) != r2->rx.metric)) {
+ memcpy (&r2_backup, r2, vtable->vt->sizeof_route);
+ r2_backup.rx.ifindex = r1->rx.ifindex;
+ if (r2_metric >= 0)
+ r2_backup.rx.metric = (guint32) r2_metric;
+ r2 = &r2_backup;
+ }
+ return vtable->vt->route_cmp (r1, r2) == 0;
+}
+
+static NMPlatformIPXRoute *
+_get_next_ipx_route (const RouteIndex *index, gboolean start_at_zero, guint *cur_idx, int ifindex)
+{
+ guint i;
+
+ if (start_at_zero)
+ i = 0;
+ else
+ i = *cur_idx + 1;
+ /* Find the next route with matching @ifindex. */
+ for (; i < index->len; i++) {
+ if (index->entries[i]->rx.ifindex == ifindex) {
+ *cur_idx = i;
+ return index->entries[i];
+ }
+ }
+ *cur_idx = index->len;
+ return NULL;
+}
+
+static const NMPlatformIPXRoute *
+_get_next_known_route (const VTableIP *vtable, const RouteIndex *index, gboolean start_at_zero, guint *cur_idx)
+{
+ guint i = 0;
+ const NMPlatformIPXRoute *cur = NULL;
+
+ if (!start_at_zero) {
+ i = *cur_idx;
+ cur = index->entries[i];
+ i++;
+ }
+ /* For @known_routes we expect that all routes have the same @ifindex. This is not enforced however,
+ * the ifindex value of these routes is ignored. */
+ for (; i < index->len; i++) {
+ const NMPlatformIPXRoute *r = index->entries[i];
+
+ /* skip over default routes. */
+ if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (r))
+ continue;
+
+ /* @known_routes should not, but could contain duplicate routes. Skip over them. */
+ if (cur && vtable->route_id_cmp (cur, r) == 0)
+ continue;
+
+ *cur_idx = i;
+ return r;
+ }
+ *cur_idx = index->len;
+ return NULL;
+}
+
+static const NMPlatformIPXRoute *
+_get_next_plat_route (const RouteIndex *index, gboolean start_at_zero, guint *cur_idx)
+{
+ if (start_at_zero)
+ *cur_idx = 0;
+ else
+ ++*cur_idx;
+
+ /* get next route from the platform index. */
+ if (*cur_idx < index->len)
+ return index->entries[*cur_idx];
+ *cur_idx = index->len;
+ return NULL;
+}
+
+static int
+_sort_indexes_cmp (guint *a, guint *b)
+{
+ CMP_AND_RETURN_INT (*a, *b);
+ g_return_val_if_reached (0);
+}
+
+/*********************************************************************************************/
+
+static gboolean
+_vx_route_sync (const VTableIP *vtable, NMRouteManager *self, int ifindex, const GArray *known_routes, gboolean ignore_kernel_routes, gboolean full_sync)
+{
+ NMRouteManagerPrivate *priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+ GArray *plat_routes;
+ RouteEntries *ipx_routes;
+ RouteIndex *plat_routes_idx, *known_routes_idx;
+ gboolean success = TRUE;
+ guint i, i_type;
+ GArray *to_delete_indexes = NULL;
+ GPtrArray *to_add_routes = NULL;
+ guint i_known_routes, i_plat_routes, i_ipx_routes;
+ const NMPlatformIPXRoute *cur_known_route, *cur_plat_route;
+ NMPlatformIPXRoute *cur_ipx_route;
+ gint64 *p_effective_metric = NULL;
+ gboolean ipx_routes_changed = FALSE;
+ gint64 *effective_metrics = NULL;
+
+ nm_platform_process_events (priv->platform);
+
+ ipx_routes = vtable->vt->is_ip4 ? &priv->ip4_routes : &priv->ip6_routes;
+ plat_routes = vtable->vt->route_get_all (priv->platform, ifindex,
+ ignore_kernel_routes
+ ? NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT
+ : NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_RTPROT_KERNEL);
+ plat_routes_idx = _route_index_create (vtable, plat_routes);
+ known_routes_idx = _route_index_create (vtable, known_routes);
+
+ effective_metrics = &g_array_index (ipx_routes->effective_metrics, gint64, 0);
+
+ ASSERT_route_index_valid (vtable, plat_routes, plat_routes_idx, TRUE);
+ ASSERT_route_index_valid (vtable, known_routes, known_routes_idx, FALSE);
+
+ _LOGD (vtable->vt->addr_family, "%3d: sync %u IPv%c routes", ifindex, known_routes_idx->len, vtable->vt->is_ip4 ? '4' : '6');
+ if (_LOGT_ENABLED (vtable->vt->addr_family)) {
+ for (i = 0; i < known_routes_idx->len; i++) {
+ _LOGT (vtable->vt->addr_family, "%3d: sync new route #%u: %s",
+ ifindex, i, vtable->vt->route_to_string (VTABLE_ROUTE_INDEX (vtable, known_routes, i)));
+ }
+ for (i = 0; i < ipx_routes->index->len; i++)
+ _LOGT (vtable->vt->addr_family, "%3d: STATE: has #%u - %s (%lld)",
+ ifindex, i,
+ vtable->vt->route_to_string (ipx_routes->index->entries[i]),
+ (long long) g_array_index (ipx_routes->effective_metrics, gint64, i));
+ }
+
+ /***************************************************************************
+ * Check which routes are in @known_routes, and update @ipx_routes.
+ *
+ * This first part only updates @ipx_routes to find out what routes must
+ * be added/deleted.
+ **************************************************************************/
+
+ /* iterate over @ipx_routes and @known_routes */
+ cur_ipx_route = _get_next_ipx_route (ipx_routes->index, TRUE, &i_ipx_routes, ifindex);
+ cur_known_route = _get_next_known_route (vtable, known_routes_idx, TRUE, &i_known_routes);
+ while (cur_ipx_route || cur_known_route) {
+ int route_id_cmp_result = -1;
+
+ while ( cur_ipx_route
+ && ( !cur_known_route
+ || ((route_id_cmp_result = vtable->route_id_cmp (cur_ipx_route, cur_known_route)) < 0))) {
+ /* we have @cur_ipx_route, which is less then @cur_known_route. Hence,
+ * the route does no longer exist in @known_routes */
+ if (!to_delete_indexes)
+ to_delete_indexes = g_array_new (FALSE, FALSE, sizeof (guint));
+ g_array_append_val (to_delete_indexes, i_ipx_routes);
+
+ /* find the next @cur_ipx_route with matching ifindex. */
+ cur_ipx_route = _get_next_ipx_route (ipx_routes->index, FALSE, &i_ipx_routes, ifindex);
+ }
+ if ( cur_ipx_route
+ && cur_known_route
+ && route_id_cmp_result == 0) {
+ if (!_route_equals_ignoring_ifindex (vtable, cur_ipx_route, cur_known_route, -1)) {
+ /* The routes match. Update the entry in place. As this is an exact match of primary
+ * fields, this only updates possibly modified fields such as @gateway or @mss.
+ * Modifiying @cur_ipx_route this way does not invalidate @ipx_routes->index. */
+ memcpy (cur_ipx_route, cur_known_route, vtable->vt->sizeof_route);
+ cur_ipx_route->rx.ifindex = ifindex;
+ cur_ipx_route->rx.metric = vtable->vt->metric_normalize (cur_ipx_route->rx.metric);
+ ipx_routes_changed = TRUE;
+ _LOGT (vtable->vt->addr_family, "%3d: STATE: update #%u - %s", ifindex, i_ipx_routes, vtable->vt->route_to_string (cur_ipx_route));
+ }
+ } else if (cur_known_route) {
+ g_assert (!cur_ipx_route || route_id_cmp_result > 0);
+ /* @cur_known_route is new. We cannot immediately add @cur_known_route to @ipx_routes, because
+ * it would invalidate @ipx_routes->index. Instead remember to add it later. */
+ if (!to_add_routes)
+ to_add_routes = g_ptr_array_new ();
+ g_ptr_array_add (to_add_routes, (gpointer) cur_known_route);
+ }
+
+ if (cur_ipx_route && (!cur_known_route || route_id_cmp_result == 0))
+ cur_ipx_route = _get_next_ipx_route (ipx_routes->index, FALSE, &i_ipx_routes, ifindex);
+ if (cur_known_route)
+ cur_known_route = _get_next_known_route (vtable, known_routes_idx, FALSE, &i_known_routes);
+ }
+
+ if (!full_sync && to_delete_indexes) {
+ /***************************************************************************
+ * Delete routes in platform, that we are about to remove from @ipx_routes
+ *
+ * When doing a non-full_sync, we delete routes from platform that were previously
+ * known by route-manager, and are now deleted.
+ ***************************************************************************/
+
+ /* iterate over @to_delete_indexes and @plat_routes.
+ * @to_delete_indexes contains the indexes (relative to ipx_routes->index) of items
+ * we are about to delete. */
+ cur_plat_route = _get_next_plat_route (plat_routes_idx, TRUE, &i_plat_routes);
+ for (i = 0; i < to_delete_indexes->len; i++) {
+ int route_dest_cmp_result = 0;
+ i_ipx_routes = g_array_index (to_delete_indexes, guint, i);
+ cur_ipx_route = ipx_routes->index->entries[i_ipx_routes];
+ p_effective_metric = &effective_metrics[i_ipx_routes];
+
+ nm_assert (cur_ipx_route->rx.ifindex == ifindex);
+
+ if (*p_effective_metric == -1)
+ continue;
+
+ /* skip over @plat_routes that are ordered before our @cur_ipx_route. */
+ while ( cur_plat_route
+ && (route_dest_cmp_result = vtable->route_dest_cmp (cur_plat_route, cur_ipx_route)) <= 0) {
+ if ( route_dest_cmp_result == 0
+ && cur_plat_route->rx.metric >= *p_effective_metric)
+ break;
+ cur_plat_route = _get_next_plat_route (plat_routes_idx, FALSE, &i_plat_routes);
+ }
+
+ if (!cur_plat_route) {
+ /* no more platform routes. Break the loop. */
+ break;
+ }
+
+ if ( route_dest_cmp_result == 0
+ && cur_plat_route->rx.metric == *p_effective_metric) {
+ /* we are about to delete cur_ipx_route and we have a matching route
+ * in platform. Delete it. */
+ _LOGT (vtable->vt->addr_family, "%3d: platform rt-rm #%u - %s", ifindex, i_plat_routes, vtable->vt->route_to_string (cur_plat_route));
+ vtable->vt->route_delete (priv->platform, ifindex, cur_plat_route);
+ }
+ }
+ }
+
+ /* Update @ipx_routes with the just learned changes. */
+ if (to_delete_indexes || to_add_routes) {
+ if (to_delete_indexes) {
+ for (i = 0; i < to_delete_indexes->len; i++) {
+ guint idx = g_array_index (to_delete_indexes, guint, i);
+
+ _LOGT (vtable->vt->addr_family, "%3d: STATE: delete #%u - %s", ifindex, idx, vtable->vt->route_to_string (ipx_routes->index->entries[idx]));
+ g_array_index (to_delete_indexes, guint, i) = _route_index_reverse_idx (vtable, ipx_routes->index, idx, ipx_routes->entries);
+ }
+ g_array_sort (to_delete_indexes, (GCompareFunc) _sort_indexes_cmp);
+ nm_utils_array_remove_at_indexes (ipx_routes->entries, &g_array_index (to_delete_indexes, guint, 0), to_delete_indexes->len);
+ nm_utils_array_remove_at_indexes (ipx_routes->effective_metrics_reverse, &g_array_index (to_delete_indexes, guint, 0), to_delete_indexes->len);
+ g_array_unref (to_delete_indexes);
+ }
+ if (to_add_routes) {
+ guint j = ipx_routes->effective_metrics_reverse->len;
+
+ g_array_set_size (ipx_routes->effective_metrics_reverse, j + to_add_routes->len);
+
+ for (i = 0; i < to_add_routes->len; i++) {
+ NMPlatformIPXRoute *ipx_route;
+
+ g_array_append_vals (ipx_routes->entries, g_ptr_array_index (to_add_routes, i), 1);
+
+ ipx_route = VTABLE_ROUTE_INDEX (vtable, ipx_routes->entries, ipx_routes->entries->len - 1);
+ ipx_route->rx.ifindex = ifindex;
+ ipx_route->rx.metric = vtable->vt->metric_normalize (ipx_route->rx.metric);
+
+ g_array_index (ipx_routes->effective_metrics_reverse, gint64, j++) = -1;
+
+ _LOGT (vtable->vt->addr_family, "%3d: STATE: added #%u - %s", ifindex, ipx_routes->entries->len - 1, vtable->vt->route_to_string (ipx_route));
+ }
+ g_ptr_array_unref (to_add_routes);
+ }
+ g_free (ipx_routes->index);
+ ipx_routes->index = _route_index_create (vtable, ipx_routes->entries);
+ ipx_routes_changed = TRUE;
+ ASSERT_route_index_valid (vtable, ipx_routes->entries, ipx_routes->index, TRUE);
+ }
+
+ if (ipx_routes_changed) {
+ /***************************************************************************
+ * Rebuild the list of effective metrics. In case of conflicting routes,
+ * we configure device routes with a bumped metric. We do this, because non-direct
+ * routes might require this direct route to reach the gateway (e.g. the default
+ * route).
+ *
+ * We determine the effective metrics only based on our internal list @ipx_routes
+ * and don't consider @plat_routes. That means, we might bump the metric of a route
+ * and thereby cause a conflict with an existing route on an unmanaged device (which
+ * causes the route on the unmanaged device to be replaced).
+ * Still, that is not much different then from messing with unmanaged routes when
+ * the effective and the intended metrics equal. The rules is: NM will leave routes
+ * on unmanged devices alone, unless they conflict with what NM wants to configure.
+ ***************************************************************************/
+
+ g_array_set_size (ipx_routes->effective_metrics, ipx_routes->entries->len);
+ effective_metrics = &g_array_index (ipx_routes->effective_metrics, gint64, 0);
+
+ /* Completely regenerate the list of effective metrics by walking through
+ * ipx_routes->index and determining the effective metric. */
+
+ for (i_ipx_routes = 0; i_ipx_routes < ipx_routes->index->len; i_ipx_routes++) {
+ gint64 *p_effective_metric_before;
+ gboolean is_shadowed;
+ guint i_ipx_routes_before;
+
+ cur_ipx_route = ipx_routes->index->entries[i_ipx_routes];
+ p_effective_metric = &effective_metrics[i_ipx_routes];
+
+ is_shadowed = i_ipx_routes > 0
+ && vtable->route_dest_cmp (cur_ipx_route, ipx_routes->index->entries[i_ipx_routes - 1]) == 0;
+
+ if (!is_shadowed) {
+ /* the route is not shadowed, the effective metric is just as specified. */
+ *p_effective_metric = cur_ipx_route->rx.metric;
+ goto next;
+ }
+ if (!VTABLE_IS_DEVICE_ROUTE (vtable, cur_ipx_route)) {
+ /* The route is not a device route. We want to add redundant device routes, because
+ * we might need the direct routes to the gateway. For non-direct routes, there is not much
+ * reason to do the metric increment. */
+ *p_effective_metric = -1;
+ goto next;
+ }
+
+ /* The current route might be shadowed by several other routes. Find the one with the highest metric,
+ * i.e. the one with an effecive metric set and in the index before the current index. */
+ i_ipx_routes_before = i_ipx_routes;
+ while (TRUE) {
+ nm_assert (i_ipx_routes_before > 0);
+
+ i_ipx_routes_before--;
+
+ p_effective_metric_before = &effective_metrics[i_ipx_routes_before];
+
+ if (*p_effective_metric_before == -1) {
+ /* this route is also shadowed, continue search. */
+ continue;
+ }
+
+ if (*p_effective_metric_before < cur_ipx_route->rx.metric) {
+ /* the previous route has a lower metric. There is no conflict,
+ * just use the original metric. */
+ *p_effective_metric = cur_ipx_route->rx.metric;
+ } else if (*p_effective_metric_before == G_MAXUINT32) {
+ /* we cannot bump the metric. Don't configure this route. */
+ *p_effective_metric = -1;
+ } else {
+ /* bump the metric by one. */
+ *p_effective_metric = *p_effective_metric_before + 1;
+ }
+ break;
+ }
+next:
+ _LOGT (vtable->vt->addr_family, "%3d: new metric #%u - %s (%lld)",
+ ifindex, i_ipx_routes,
+ vtable->vt->route_to_string (cur_ipx_route),
+ (long long) *p_effective_metric);
+ }
+ }
+
+ if (full_sync) {
+ /***************************************************************************
+ * Delete all routes in platform, that no longer exist in @ipx_routes
+ *
+ * Different from the delete action above, we delete every unknown route on
+ * the interface.
+ ***************************************************************************/
+
+ /* iterate over @plat_routes and @ipx_routes */
+ cur_plat_route = _get_next_plat_route (plat_routes_idx, TRUE, &i_plat_routes);
+ cur_ipx_route = _get_next_ipx_route (ipx_routes->index, TRUE, &i_ipx_routes, ifindex);
+ if (cur_ipx_route)
+ p_effective_metric = &effective_metrics[i_ipx_routes];
+ while (cur_plat_route) {
+ int route_dest_cmp_result = 0;
+
+ g_assert (cur_plat_route->rx.ifindex == ifindex);
+
+ _LOGT (vtable->vt->addr_family, "%3d: platform rt #%u - %s", ifindex, i_plat_routes, vtable->vt->route_to_string (cur_plat_route));
+
+ /* skip over @cur_ipx_route that are ordered before @cur_plat_route */
+ while ( cur_ipx_route
+ && ((route_dest_cmp_result = vtable->route_dest_cmp (cur_ipx_route, cur_plat_route)) <= 0)) {
+ if ( route_dest_cmp_result == 0
+ && *p_effective_metric != -1
+ && *p_effective_metric >= cur_plat_route->rx.metric) {
+ break;
+ }
+ cur_ipx_route = _get_next_ipx_route (ipx_routes->index, FALSE, &i_ipx_routes, ifindex);
+ if (cur_ipx_route)
+ p_effective_metric = &effective_metrics[i_ipx_routes];
+ }
+
+ /* if @cur_ipx_route is not equal to @plat_route, the route must be deleted. */
+ if ( !cur_ipx_route
+ || route_dest_cmp_result != 0
+ || *p_effective_metric != cur_plat_route->rx.metric)
+ vtable->vt->route_delete (priv->platform, ifindex, cur_plat_route);
+
+ cur_plat_route = _get_next_plat_route (plat_routes_idx, FALSE, &i_plat_routes);
+ }
+ }
+
+ /***************************************************************************
+ * Restore shadowed routes. These routes are on an other @ifindex then what
+ * we are syncing now. But the current changes make it necessary to add those
+ * routes.
+ *
+ * Only add some routes that might be necessary. We don't delete any routes
+ * on other ifindexes here. I.e. we don't do a full sync, but only ~add~ routes
+ * that were shadowed previously, but should be now present with a different
+ * metric.
+ **************************************************************************/
+
+ if (ipx_routes_changed) {
+ GArray *gateway_routes = NULL;
+
+ /* @effective_metrics_reverse contains the list of assigned metrics from the last
+ * sync. Walk through it and see what changes there are (and possibly restore a
+ * shadowed route).
+ * Thereby also update @effective_metrics_reverse to be up-to-date again. */
+ for (i_ipx_routes = 0; i_ipx_routes < ipx_routes->entries->len; i_ipx_routes++) {
+ guint i_ipx_routes_reverse;
+ gint64 *p_effective_metric_reversed;
+
+ p_effective_metric = &effective_metrics[i_ipx_routes];
+
+ i_ipx_routes_reverse = _route_index_reverse_idx (vtable, ipx_routes->index, i_ipx_routes, ipx_routes->entries);
+ p_effective_metric_reversed = &g_array_index (ipx_routes->effective_metrics_reverse, gint64, i_ipx_routes_reverse);
+
+ if (*p_effective_metric_reversed == *p_effective_metric) {
+ /* The entry is up to date. No change, continue with the next one. */
+ continue;
+ }
+ *p_effective_metric_reversed = *p_effective_metric;
+
+ if (*p_effective_metric == -1) {
+ /* the entry is shadowed. Nothing to do. */
+ continue;
+ }
+
+ cur_ipx_route = ipx_routes->index->entries[i_ipx_routes];
+ if (cur_ipx_route->rx.ifindex == ifindex) {
+ /* @cur_ipx_route is on the current @ifindex. No need to special handling them
+ * because we are about to do a full sync of the ifindex. */
+ continue;
+ }
+
+ /* the effective metric from previous sync changed. While @cur_ipx_route is not on the
+ * ifindex we are about to sync, we still must add this route. Possibly it was shadowed
+ * before, and now we want to restore it.
+ *
+ * Note that we don't do a full sync on the other ifindex. Especially, we don't delete
+ * or add any further routes then this. That means there might be some stale routes
+ * (with a higher metric!). They will only be removed on the next sync of that other
+ * ifindex. */
+
+ if (!VTABLE_IS_DEVICE_ROUTE (vtable, cur_ipx_route)) {
+ /* the route to restore has a gateway. We can only restore the route
+ * when we also have a direct route to the gateway. There can be cases
+ * where the direct route is shadowed too, and we cannot restore the gateway
+ * route.
+ *
+ * Restore first the direct-routes, and gateway-routes afterwards.
+ * This can avoid some cases where we would fail to add the
+ * gateway route. */
+ if (!gateway_routes)
+ gateway_routes = g_array_new (FALSE, FALSE, sizeof (guint));
+ g_array_append_val (gateway_routes, i_ipx_routes);
+ } else
+ vtable->vt->route_add (priv->platform, 0, cur_ipx_route, *p_effective_metric);
+ }
+
+ if (gateway_routes) {
+ for (i = 0; i < gateway_routes->len; i++) {
+ i_ipx_routes = g_array_index (gateway_routes, guint, i);
+ vtable->vt->route_add (priv->platform, 0,
+ ipx_routes->index->entries[i_ipx_routes],
+ effective_metrics[i_ipx_routes]);
+ }
+ g_array_unref (gateway_routes);
+ }
+ }
+
+ /***************************************************************************
+ * Sync @ipx_routes for @ifindex to platform
+ **************************************************************************/
+
+ for (i_type = 0; i_type < 2; i_type++) {
+ /* iterate (twice) over @ipx_routes and @plat_routes */
+ cur_plat_route = _get_next_plat_route (plat_routes_idx, TRUE, &i_plat_routes);
+ cur_ipx_route = _get_next_ipx_route (ipx_routes->index, TRUE, &i_ipx_routes, ifindex);
+ /* Iterate here over @ipx_routes instead of @known_routes. That is done because
+ * we need to know whether a route is shadowed by another route, and that
+ * requires to look at @ipx_routes. */
+ for (; cur_ipx_route; cur_ipx_route = _get_next_ipx_route (ipx_routes->index, FALSE, &i_ipx_routes, ifindex)) {
+ int route_dest_cmp_result = -1;
+
+ if ( (i_type == 0 && !VTABLE_IS_DEVICE_ROUTE (vtable, cur_ipx_route))
+ || (i_type == 1 && VTABLE_IS_DEVICE_ROUTE (vtable, cur_ipx_route))) {
+ /* Make two runs over the list of @ipx_routes. On the first, only add
+ * device routes, on the second the others (gateway routes). */
+ continue;
+ }
+
+ p_effective_metric = &effective_metrics[i_ipx_routes];
+
+ if (*p_effective_metric == -1) {
+ /* @cur_ipx_route is shadewed by another route. */
+ continue;
+ }
+
+ /* skip over @plat_routes that are ordered before our @cur_ipx_route. */
+ while ( cur_plat_route
+ && (route_dest_cmp_result = vtable->route_dest_cmp (cur_plat_route, cur_ipx_route)) <= 0) {
+ if ( route_dest_cmp_result == 0
+ && cur_plat_route->rx.metric >= *p_effective_metric)
+ break;
+ cur_plat_route = _get_next_plat_route (plat_routes_idx, FALSE, &i_plat_routes);
+ }
+
+ /* only add the route if we don't have an identical route in @plat_routes,
+ * i.e. if @cur_plat_route is different from @cur_ipx_route. */
+ if ( !cur_plat_route
+ || route_dest_cmp_result != 0
+ || !_route_equals_ignoring_ifindex (vtable, cur_plat_route, cur_ipx_route, *p_effective_metric)) {
+
+ if (!vtable->vt->route_add (priv->platform, ifindex, cur_ipx_route, *p_effective_metric)) {
+ if (cur_ipx_route->rx.source < NM_IP_CONFIG_SOURCE_USER) {
+ _LOGD (vtable->vt->addr_family,
+ "ignore error adding IPv%c route to kernel: %s",
+ vtable->vt->is_ip4 ? '4' : '6',
+ vtable->vt->route_to_string (cur_ipx_route));
+ } else {
+ /* Remember that there was a failure, but for now continue trying
+ * to sync the remaining routes. */
+ success = FALSE;
+ }
+ }
+ }
+ }
+ }
+
+ g_free (known_routes_idx);
+ g_free (plat_routes_idx);
+ g_array_unref (plat_routes);
+
+ return success;
+}
+
+/**
+ * nm_route_manager_ip4_route_sync:
+ * @ifindex: Interface index
+ * @known_routes: List of routes
+ * @ignore_kernel_routes: if %TRUE, ignore kernel routes.
+ * @full_sync: whether to do a full sync and delete routes
+ * that are configured on the interface but not currently
+ * tracked by route-manager.
+ *
+ * A convenience function to synchronize routes for a specific interface
+ * with the least possible disturbance. It simply removes routes that are
+ * not listed and adds routes that are.
+ * Default routes are ignored (both in @known_routes and those already
+ * configured on the device).
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+nm_route_manager_ip4_route_sync (NMRouteManager *self, int ifindex, const GArray *known_routes, gboolean ignore_kernel_routes, gboolean full_sync)
+{
+ return _vx_route_sync (&vtable_v4, self, ifindex, known_routes, ignore_kernel_routes, full_sync);
+}
+
+/**
+ * nm_route_manager_ip6_route_sync:
+ * @ifindex: Interface index
+ * @known_routes: List of routes
+ * @ignore_kernel_routes: if %TRUE, ignore kernel routes.
+ * @full_sync: whether to do a full sync and delete routes
+ * that are configured on the interface but not currently
+ * tracked by route-manager.
+ *
+ * A convenience function to synchronize routes for a specific interface
+ * with the least possible disturbance. It simply removes routes that are
+ * not listed and adds routes that are.
+ * Default routes are ignored (both in @known_routes and those already
+ * configured on the device).
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+nm_route_manager_ip6_route_sync (NMRouteManager *self, int ifindex, const GArray *known_routes, gboolean ignore_kernel_routes, gboolean full_sync)
+{
+ return _vx_route_sync (&vtable_v6, self, ifindex, known_routes, ignore_kernel_routes, full_sync);
+}
+
+gboolean
+nm_route_manager_route_flush (NMRouteManager *self, int ifindex)
+{
+ return nm_route_manager_ip4_route_sync (self, ifindex, NULL, FALSE, TRUE)
+ && nm_route_manager_ip6_route_sync (self, ifindex, NULL, FALSE, TRUE);
+}
+
+/*********************************************************************************************/
+
+static gboolean
+_ip4_device_routes_entry_expired (const IP4DeviceRoutePurgeEntry *entry, gint64 now)
+{
+ return entry->scheduled_at_ns + IP4_DEVICE_ROUTES_WAIT_TIME_NS < now;
+}
+
+static IP4DeviceRoutePurgeEntry *
+_ip4_device_routes_purge_entry_create (NMRouteManager *self, const NMPlatformIP4Route *route, gint64 now_ns)
+{
+ IP4DeviceRoutePurgeEntry *entry;
+
+ entry = g_slice_new (IP4DeviceRoutePurgeEntry);
+
+ entry->self = self;
+ entry->scheduled_at_ns = now_ns;
+ entry->idle_id = 0;
+ entry->obj = nmp_object_new (NMP_OBJECT_TYPE_IP4_ROUTE, (NMPlatformObject *) route);
+ return entry;
+}
+
+static void
+_ip4_device_routes_purge_entry_free (IP4DeviceRoutePurgeEntry *entry)
+{
+ nmp_object_unref (entry->obj);
+ nm_clear_g_source (&entry->idle_id);
+ g_slice_free (IP4DeviceRoutePurgeEntry, entry);
+}
+
+static gboolean
+_ip4_device_routes_idle_cb (IP4DeviceRoutePurgeEntry *entry)
+{
+ NMRouteManager *self;
+ NMRouteManagerPrivate *priv;
+
+ nm_clear_g_source (&entry->idle_id);
+
+ self = entry->self;
+ priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+ if (_route_index_find (&vtable_v4, priv->ip4_routes.index, &entry->obj->ipx_route) >= 0) {
+ /* we have an identical route in our list. Don't delete it. */
+ return G_SOURCE_REMOVE;
+ }
+
+ _LOGT (vtable_v4.vt->addr_family, "device-route: delete %s", nmp_object_to_string (entry->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
+
+ nm_platform_ip4_route_delete (priv->platform,
+ entry->obj->ip4_route.ifindex,
+ entry->obj->ip4_route.network,
+ entry->obj->ip4_route.plen,
+ entry->obj->ip4_route.metric);
+
+ g_hash_table_remove (priv->ip4_device_routes.entries, entry->obj);
+ _ip4_device_routes_cancel (self);
+ return G_SOURCE_REMOVE;
+}
+
+static void
+_ip4_device_routes_ip4_route_changed (NMPlatform *platform,
+ NMPObjectType obj_type,
+ int ifindex,
+ const NMPlatformIP4Route *route,
+ NMPlatformSignalChangeType change_type,
+ NMPlatformReason reason,
+ NMRouteManager *self)
+{
+ NMRouteManagerPrivate *priv;
+ NMPObject obj_needle;
+ IP4DeviceRoutePurgeEntry *entry;
+
+ if (change_type == NM_PLATFORM_SIGNAL_REMOVED)
+ return;
+
+ if ( route->source != NM_IP_CONFIG_SOURCE_RTPROT_KERNEL
+ || route->metric != 0) {
+ /* we don't have an automatically created device route at hand. Bail out early. */
+ return;
+ }
+
+ priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+
+ entry = g_hash_table_lookup (priv->ip4_device_routes.entries,
+ nmp_object_stackinit (&obj_needle, NMP_OBJECT_TYPE_IP4_ROUTE, (NMPlatformObject *) route));
+ if (!entry)
+ return;
+
+ if (_ip4_device_routes_entry_expired (entry, nm_utils_get_monotonic_timestamp_ns ())) {
+ _LOGT (vtable_v4.vt->addr_family, "device-route: cleanup-ch %s", nmp_object_to_string (entry->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
+ g_hash_table_remove (priv->ip4_device_routes.entries, entry->obj);
+ _ip4_device_routes_cancel (self);
+ return;
+ }
+
+ if (entry->idle_id == 0) {
+ _LOGT (vtable_v4.vt->addr_family, "device-route: schedule %s", nmp_object_to_string (entry->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
+ entry->idle_id = g_idle_add ((GSourceFunc) _ip4_device_routes_idle_cb, entry);
+ }
+}
+
+static gboolean
+_ip4_device_routes_cancel (NMRouteManager *self)
+{
+ NMRouteManagerPrivate *priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+
+ if (priv->ip4_device_routes.gc_id) {
+ if (g_hash_table_size (priv->ip4_device_routes.entries) > 0)
+ return G_SOURCE_CONTINUE;
+ _LOGT (vtable_v4.vt->addr_family, "device-route: cancel");
+ if (priv->platform)
+ g_signal_handlers_disconnect_by_func (priv->platform, G_CALLBACK (_ip4_device_routes_ip4_route_changed), self);
+ nm_clear_g_source (&priv->ip4_device_routes.gc_id);
+ }
+ return G_SOURCE_REMOVE;
+}
+
+static gboolean
+_ip4_device_routes_gc (NMRouteManager *self)
+{
+ NMRouteManagerPrivate *priv;
+ GHashTableIter iter;
+ IP4DeviceRoutePurgeEntry *entry;
+ gint64 now = nm_utils_get_monotonic_timestamp_ns ();
+
+ priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+
+ g_hash_table_iter_init (&iter, priv->ip4_device_routes.entries);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &entry)) {
+ if (_ip4_device_routes_entry_expired (entry, now)) {
+ _LOGT (vtable_v4.vt->addr_family, "device-route: cleanup-gc %s", nmp_object_to_string (entry->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
+ g_hash_table_iter_remove (&iter);
+ }
+ }
+
+ return _ip4_device_routes_cancel (self);
+}
+
+/**
+ * nm_route_manager_ip4_route_register_device_route_purge_list:
+ *
+ * When adding an IPv4 address, kernel will automatically add a device route with
+ * metric zero. We don't want that route and want to delete it. However, the route
+ * by kernel immediately, but some time after. That means during nm_route_manager_ip4_route_sync()
+ * such a route doesn't exist yet. We must remember that we expect such a route to appear later
+ * and to remove it. */
+void
+nm_route_manager_ip4_route_register_device_route_purge_list (NMRouteManager *self, GArray *device_route_purge_list)
+{
+ NMRouteManagerPrivate *priv;
+ guint i;
+ gint64 now_ns;
+
+ if (!device_route_purge_list || device_route_purge_list->len == 0)
+ return;
+
+ priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+
+ now_ns = nm_utils_get_monotonic_timestamp_ns ();
+ for (i = 0; i < device_route_purge_list->len; i++) {
+ IP4DeviceRoutePurgeEntry *entry;
+
+ entry = _ip4_device_routes_purge_entry_create (self, &g_array_index (device_route_purge_list, NMPlatformIP4Route, i), now_ns);
+ _LOGT (vtable_v4.vt->addr_family, "device-route: watch (%s) %s",
+ g_hash_table_contains (priv->ip4_device_routes.entries, entry->obj)
+ ? "update" : "new",
+ nmp_object_to_string (entry->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
+ g_hash_table_replace (priv->ip4_device_routes.entries,
+ nmp_object_ref (entry->obj),
+ entry);
+ }
+ if (priv->ip4_device_routes.gc_id == 0) {
+ g_signal_connect (priv->platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, G_CALLBACK (_ip4_device_routes_ip4_route_changed), self);
+ priv->ip4_device_routes.gc_id = g_timeout_add (IP4_DEVICE_ROUTES_GC_INTERVAL_SEC, (GSourceFunc) _ip4_device_routes_gc, self);
+ }
+}
+
+/*********************************************************************************************/
+
+static const VTableIP vtable_v4 = {
+ .vt = &nm_platform_vtable_route_v4,
+ .route_dest_cmp = (int (*) (const NMPlatformIPXRoute *, const NMPlatformIPXRoute *)) _v4_route_dest_cmp,
+ .route_id_cmp = (int (*) (const NMPlatformIPXRoute *, const NMPlatformIPXRoute *)) _v4_route_id_cmp,
+};
+
+static const VTableIP vtable_v6 = {
+ .vt = &nm_platform_vtable_route_v6,
+ .route_dest_cmp = (int (*) (const NMPlatformIPXRoute *, const NMPlatformIPXRoute *)) _v6_route_dest_cmp,
+ .route_id_cmp = (int (*) (const NMPlatformIPXRoute *, const NMPlatformIPXRoute *)) _v6_route_id_cmp,
+};
+
+/*********************************************************************************************/
+
+static void
+nm_route_manager_init (NMRouteManager *self)
+{
+ NMRouteManagerPrivate *priv = NM_ROUTE_MANAGER_GET_PRIVATE (self);
+
+ priv->platform = g_object_ref (NM_PLATFORM_GET);
+
+ priv->ip4_routes.entries = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
+ priv->ip6_routes.entries = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Route));
+ priv->ip4_routes.effective_metrics = g_array_new (FALSE, FALSE, sizeof (gint64));
+ priv->ip6_routes.effective_metrics = g_array_new (FALSE, FALSE, sizeof (gint64));
+ priv->ip4_routes.effective_metrics_reverse = g_array_new (FALSE, FALSE, sizeof (gint64));
+ priv->ip6_routes.effective_metrics_reverse = g_array_new (FALSE, FALSE, sizeof (gint64));
+ priv->ip4_routes.index = _route_index_create (&vtable_v4, priv->ip4_routes.entries);
+ priv->ip6_routes.index = _route_index_create (&vtable_v6, priv->ip6_routes.entries);
+ priv->ip4_device_routes.entries = g_hash_table_new_full ((GHashFunc) nmp_object_id_hash,
+ (GEqualFunc) nmp_object_id_equal,
+ (GDestroyNotify) nmp_object_unref,
+ (GDestroyNotify) _ip4_device_routes_purge_entry_free);
+}
+
+static void
+dispose (GObject *object)
+{
+ NMRouteManager *self = NM_ROUTE_MANAGER (object);
+ NMRouteManagerPrivate *priv = NM_ROUTE_MANAGER_GET_PRIVATE (object);
+
+ g_hash_table_remove_all (priv->ip4_device_routes.entries);
+ _ip4_device_routes_cancel (self);
+
+ g_clear_object (&priv->platform);
+
+ G_OBJECT_CLASS (nm_route_manager_parent_class)->dispose (object);
+}
+
+static void
+finalize (GObject *object)
+{
+ NMRouteManagerPrivate *priv = NM_ROUTE_MANAGER_GET_PRIVATE (object);
+
+ g_array_free (priv->ip4_routes.entries, TRUE);
+ g_array_free (priv->ip6_routes.entries, TRUE);
+ g_array_free (priv->ip4_routes.effective_metrics, TRUE);
+ g_array_free (priv->ip6_routes.effective_metrics, TRUE);
+ g_array_free (priv->ip4_routes.effective_metrics_reverse, TRUE);
+ g_array_free (priv->ip6_routes.effective_metrics_reverse, TRUE);
+ g_free (priv->ip4_routes.index);
+ g_free (priv->ip6_routes.index);
+
+ g_hash_table_unref (priv->ip4_device_routes.entries);
+
+ G_OBJECT_CLASS (nm_route_manager_parent_class)->finalize (object);
+}
+
+static void
+nm_route_manager_class_init (NMRouteManagerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (NMRouteManagerPrivate));
+
+ /* virtual methods */
+ object_class->dispose = dispose;
+ object_class->finalize = finalize;
+}
diff --git a/src/nm-route-manager.h b/src/nm-route-manager.h
new file mode 100644
index 000000000..1e4ce4840
--- /dev/null
+++ b/src/nm-route-manager.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager -- Network link manager
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include <glib-object.h>
+
+#include "nm-types.h"
+
+#ifndef __NETWORKMANAGER_ROUTE_MANAGER_H__
+#define __NETWORKMANAGER_ROUTE_MANAGER_H__
+
+#define NM_TYPE_ROUTE_MANAGER (nm_route_manager_get_type ())
+#define NM_ROUTE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_ROUTE_MANAGER, NMRouteManager))
+#define NM_ROUTE_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_ROUTE_MANAGER, NMRouteManagerClass))
+#define NM_IS_ROUTE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_ROUTE_MANAGER))
+#define NM_IS_ROUTE_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_ROUTE_MANAGER))
+#define NM_ROUTE_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_ROUTE_MANAGER, NMRouteManagerClass))
+
+struct _NMRouteManager {
+ GObject parent;
+};
+
+typedef struct {
+ GObjectClass parent;
+} NMRouteManagerClass;
+
+GType nm_route_manager_get_type (void);
+
+gboolean nm_route_manager_ip4_route_sync (NMRouteManager *self, int ifindex, const GArray *known_routes, gboolean ignore_kernel_routes, gboolean full_sync);
+gboolean nm_route_manager_ip6_route_sync (NMRouteManager *self, int ifindex, const GArray *known_routes, gboolean ignore_kernel_routes, gboolean full_sync);
+gboolean nm_route_manager_route_flush (NMRouteManager *self, int ifindex);
+
+void nm_route_manager_ip4_route_register_device_route_purge_list (NMRouteManager *self, GArray *device_route_purge_list);
+
+NMRouteManager *nm_route_manager_get (void);
+
+#endif /* NM_ROUTE_MANAGER_H */
diff --git a/src/nm-types.h b/src/nm-types.h
index 4a93567e1..1a002ac3f 100644
--- a/src/nm-types.h
+++ b/src/nm-types.h
@@ -26,6 +26,8 @@ typedef struct _NMActiveConnection NMActiveConnection;
typedef struct _NMVpnConnection NMVpnConnection;
typedef struct _NMActRequest NMActRequest;
typedef struct _NMAuthSubject NMAuthSubject;
+typedef struct _NMConfig NMConfig;
+typedef struct _NMConfigData NMConfigData;
typedef struct _NMConnectionProvider NMConnectionProvider;
typedef struct _NMConnectivity NMConnectivity;
typedef struct _NMDBusManager NMDBusManager;
@@ -38,12 +40,20 @@ typedef struct _NMIP6Config NMIP6Config;
typedef struct _NMManager NMManager;
typedef struct _NMPolicy NMPolicy;
typedef struct _NMRfkillManager NMRfkillManager;
+typedef struct _NMRouteManager NMRouteManager;
typedef struct _NMSessionMonitor NMSessionMonitor;
typedef struct _NMSleepMonitor NMSleepMonitor;
typedef enum {
/* In priority order; higher number == higher priority */
NM_IP_CONFIG_SOURCE_UNKNOWN,
+
+ /* platform internal flag used to mark routes with RTM_F_CLONED. */
+ _NM_IP_CONFIG_SOURCE_RTM_F_CLONED,
+
+ /* routes from platform with protocol RTPROT_KERNEL. */
+ NM_IP_CONFIG_SOURCE_RTPROT_KERNEL,
+
NM_IP_CONFIG_SOURCE_KERNEL,
NM_IP_CONFIG_SOURCE_SHARED,
NM_IP_CONFIG_SOURCE_IP4LL,
@@ -98,6 +108,7 @@ typedef enum {
NM_LINK_TYPE_VETH,
NM_LINK_TYPE_VLAN,
NM_LINK_TYPE_VXLAN,
+ NM_LINK_TYPE_BNEP, /* Bluetooth Ethernet emulation */
/* Software types with slaves */
NM_LINK_TYPE_BRIDGE = 0x10000 | 0x20000,
@@ -105,10 +116,24 @@ typedef enum {
NM_LINK_TYPE_TEAM,
} NMLinkType;
+typedef enum {
+ NMP_OBJECT_TYPE_UNKNOWN,
+ NMP_OBJECT_TYPE_LINK,
+ NMP_OBJECT_TYPE_IP4_ADDRESS,
+ NMP_OBJECT_TYPE_IP6_ADDRESS,
+ NMP_OBJECT_TYPE_IP4_ROUTE,
+ NMP_OBJECT_TYPE_IP6_ROUTE,
+ __NMP_OBJECT_TYPE_LAST,
+ NMP_OBJECT_TYPE_MAX = __NMP_OBJECT_TYPE_LAST - 1,
+} NMPObjectType;
+
/* settings */
typedef struct _NMAgentManager NMAgentManager;
typedef struct _NMSecretAgent NMSecretAgent;
typedef struct _NMSettings NMSettings;
typedef struct _NMSettingsConnection NMSettingsConnection;
+/* utils */
+typedef struct _NMUtilsIPv6IfaceId NMUtilsIPv6IfaceId;
+
#endif /* NM_TYPES_H */
diff --git a/src/org.freedesktop.NetworkManager.conf b/src/org.freedesktop.NetworkManager.conf
index bdfe3e677..0f1019b90 100644
--- a/src/org.freedesktop.NetworkManager.conf
+++ b/src/org.freedesktop.NetworkManager.conf
@@ -120,5 +120,7 @@
<deny send_interface="org.freedesktop.NetworkManager.VPN.Plugin"/>
<deny send_interface="org.freedesktop.NetworkManager.PPP"/>
</policy>
+
+ <limit name="max_replies_per_connection">1024</limit>
</busconfig>
diff --git a/src/platform/Makefile.in b/src/platform/Makefile.in
index a41de1aed..0616c88bd 100644
--- a/src/platform/Makefile.in
+++ b/src/platform/Makefile.in
@@ -195,6 +195,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -308,6 +309,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c
index 7b0d2d649..d5aeb0301 100644
--- a/src/platform/nm-fake-platform.c
+++ b/src/platform/nm-fake-platform.c
@@ -24,12 +24,16 @@
#include <unistd.h>
#include <netinet/icmp6.h>
#include <netinet/in.h>
+#include <linux/rtnetlink.h>
#include "gsystem-local-alloc.h"
+#include "nm-utils.h"
#include "NetworkManagerUtils.h"
#include "nm-fake-platform.h"
#include "nm-logging.h"
+#include "nm-test-utils.h"
+
#define debug(format, ...) nm_log_dbg (LOGD_PLATFORM, format, __VA_ARGS__)
typedef struct {
@@ -45,8 +49,9 @@ typedef struct {
NMPlatformLink link;
char *udi;
- GBytes *address;
int vlan_id;
+ int ib_p_key;
+ struct in6_addr ip6_lladdr;
} NMFakePlatformLink;
#define NM_FAKE_PLATFORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_FAKE_PLATFORM, NMFakePlatformPrivate))
@@ -55,11 +60,12 @@ G_DEFINE_TYPE (NMFakePlatform, nm_fake_platform, NM_TYPE_PLATFORM)
/******************************************************************/
-void
-nm_fake_platform_setup (void)
-{
- nm_platform_setup (NM_TYPE_FAKE_PLATFORM);
-}
+static void link_changed (NMPlatform *platform, NMFakePlatformLink *device, gboolean raise_signal);
+
+static gboolean ip6_address_add (NMPlatform *platform, int ifindex,
+ struct in6_addr addr, struct in6_addr peer_addr,
+ int plen, guint32 lifetime, guint32 preferred, guint flags);
+static gboolean ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen);
/******************************************************************/
@@ -110,25 +116,31 @@ type_to_type_name (NMLinkType type)
static void
link_init (NMFakePlatformLink *device, int ifindex, int type, const char *name)
{
+ gs_free char *ip6_lladdr = NULL;
+
g_assert (!name || strlen (name) < sizeof(device->link.name));
memset (device, 0, sizeof (*device));
+ ip6_lladdr = ifindex > 0 ? g_strdup_printf ("fe80::fa1e:%0x:%0x", ifindex / 256, ifindex % 256) : NULL;
+
device->link.ifindex = name ? ifindex : 0;
device->link.type = type;
- device->link.type_name = type_to_type_name (type);
+ device->link.kind = type_to_type_name (type);
device->link.driver = type_to_type_name (type);
- device->link.udi = device->udi = g_strdup_printf ("fake:%d", ifindex);
+ device->udi = g_strdup_printf ("fake:%d", ifindex);
+ device->link.initialized = TRUE;
+ device->ip6_lladdr = *nmtst_inet6_from_string (ip6_lladdr);
if (name)
strcpy (device->link.name, name);
switch (device->link.type) {
case NM_LINK_TYPE_DUMMY:
- device->link.arp = FALSE;
+ device->link.flags = NM_FLAGS_SET (device->link.flags, IFF_NOARP);
break;
default:
- device->link.arp = TRUE;
+ device->link.flags = NM_FLAGS_UNSET (device->link.flags, IFF_NOARP);
+ break;
}
- device->address = NULL;
}
static NMFakePlatformLink *
@@ -146,7 +158,6 @@ link_get (NMPlatform *platform, int ifindex)
return device;
not_found:
debug ("link not found: %d", ifindex);
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
return NULL;
}
@@ -164,18 +175,60 @@ link_get_all (NMPlatform *platform)
return links;
}
-static gboolean
-_nm_platform_link_get (NMPlatform *platform, int ifindex, NMPlatformLink *l)
+static const NMPlatformLink *
+_nm_platform_link_get (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
- if (device)
- *l = device->link;
- return !!device;
+ return device ? &device->link : NULL;
+}
+
+static const NMPlatformLink *
+_nm_platform_link_get_by_ifname (NMPlatform *platform, const char *ifname)
+{
+ NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
+ guint i;
+
+ for (i = 0; i < priv->links->len; i++) {
+ NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
+
+ if (!strcmp (device->link.name, ifname))
+ return &device->link;
+ }
+ return NULL;
+}
+
+static const NMPlatformLink *
+_nm_platform_link_get_by_address (NMPlatform *platform,
+ gconstpointer address,
+ size_t length)
+{
+ NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
+ guint i;
+
+ if ( length == 0
+ || length > NM_UTILS_HWADDR_LEN_MAX
+ || !address)
+ g_return_val_if_reached (NULL);
+
+ for (i = 0; i < priv->links->len; i++) {
+ NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
+
+ if ( device->link.addr.len == length
+ && memcmp (device->link.addr.data, address, length) == 0) {
+ return &device->link;
+ }
+ }
+ return NULL;
}
static gboolean
-link_add (NMPlatform *platform, const char *name, NMLinkType type, const void *address, size_t address_len)
+link_add (NMPlatform *platform,
+ const char *name,
+ NMLinkType type,
+ const void *address,
+ size_t address_len,
+ NMPlatformLink *out_link)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMFakePlatformLink device;
@@ -184,9 +237,14 @@ link_add (NMPlatform *platform, const char *name, NMLinkType type, const void *a
g_array_append_val (priv->links, device);
- if (device.link.ifindex)
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, device.link.ifindex, &device, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
+ if (device.link.ifindex) {
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, NMP_OBJECT_TYPE_LINK, device.link.ifindex, &device, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
+
+ link_changed (platform, &g_array_index (priv->links, NMFakePlatformLink, priv->links->len - 1), FALSE);
+ }
+ if (out_link)
+ *out_link = device.link;
return TRUE;
}
@@ -230,99 +288,88 @@ link_delete (NMPlatform *platform, int ifindex)
memset (route, 0, sizeof (*route));
}
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, ifindex, &deleted_device, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, NMP_OBJECT_TYPE_LINK, ifindex, &deleted_device, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
-static int
-link_get_ifindex (NMPlatform *platform, const char *name)
-{
- NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
- int i;
-
- for (i = 0; i < priv->links->len; i++) {
- NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
-
- if (device && !g_strcmp0 (device->link.name, name))
- return device->link.ifindex;
- }
-
- return 0;
-}
-
-static const char *
-link_get_name (NMPlatform *platform, int ifindex)
-{
- NMFakePlatformLink *device = link_get (platform, ifindex);
-
- return device ? device->link.name : NULL;
-}
-
-static NMLinkType
-link_get_type (NMPlatform *platform, int ifindex)
-{
- NMFakePlatformLink *device = link_get (platform, ifindex);
-
- return device ? device->link.type : NM_LINK_TYPE_NONE;
-}
-
static const char *
link_get_type_name (NMPlatform *platform, int ifindex)
{
- return type_to_type_name (link_get_type (platform, ifindex));
+ return type_to_type_name (nm_platform_link_get_type (platform, ifindex));
}
static void
-link_changed (NMPlatform *platform, NMFakePlatformLink *device)
+link_changed (NMPlatform *platform, NMFakePlatformLink *device, gboolean raise_signal)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
int i;
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, device->link.ifindex, &device->link, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+ if (raise_signal)
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, NMP_OBJECT_TYPE_LINK, device->link.ifindex, &device->link, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+
+ if (device->link.ifindex && !IN6_IS_ADDR_UNSPECIFIED (&device->ip6_lladdr)) {
+ if (device->link.connected)
+ ip6_address_add (platform, device->link.ifindex, device->ip6_lladdr, in6addr_any, 64, NM_PLATFORM_LIFETIME_PERMANENT, NM_PLATFORM_LIFETIME_PERMANENT, 0);
+ else
+ ip6_address_delete (platform, device->link.ifindex, device->ip6_lladdr, 64);
+ }
if (device->link.master) {
+ gboolean connected = FALSE;
+
NMFakePlatformLink *master = link_get (platform, device->link.master);
- g_return_if_fail (master != device);
+ g_return_if_fail (master && master != device);
- master->link.connected = FALSE;
for (i = 0; i < priv->links->len; i++) {
NMFakePlatformLink *slave = &g_array_index (priv->links, NMFakePlatformLink, i);
if (slave && slave->link.master == master->link.ifindex && slave->link.connected)
- master->link.connected = TRUE;
+ connected = TRUE;
}
- link_changed (platform, master);
+ if (master->link.connected != connected) {
+ master->link.connected = connected;
+ link_changed (platform, master, TRUE);
+ }
}
}
static gboolean
-link_set_up (NMPlatform *platform, int ifindex)
+link_set_up (NMPlatform *platform, int ifindex, gboolean *out_no_firmware)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
+ gboolean up, connected;
+
+ if (out_no_firmware)
+ *out_no_firmware = FALSE;
if (!device)
return FALSE;
- device->link.up = TRUE;
+ up = TRUE;
+ connected = TRUE;
switch (device->link.type) {
case NM_LINK_TYPE_DUMMY:
case NM_LINK_TYPE_VLAN:
- device->link.connected = TRUE;
break;
case NM_LINK_TYPE_BRIDGE:
case NM_LINK_TYPE_BOND:
case NM_LINK_TYPE_TEAM:
- device->link.connected = FALSE;
+ connected = FALSE;
break;
default:
- device->link.connected = FALSE;
+ connected = FALSE;
g_error ("Unexpected device type: %d", device->link.type);
}
- link_changed (platform, device);
+ if ( NM_FLAGS_HAS (device->link.flags, IFF_UP) != !!up
+ || device->link.connected != connected) {
+ device->link.flags = NM_FLAGS_ASSIGN (device->link.flags, IFF_UP, up);
+ device->link.connected = connected;
+ link_changed (platform, device, TRUE);
+ }
return TRUE;
}
@@ -335,10 +382,12 @@ link_set_down (NMPlatform *platform, int ifindex)
if (!device)
return FALSE;
- device->link.up = FALSE;
- device->link.connected = FALSE;
+ if (NM_FLAGS_HAS (device->link.flags, IFF_UP) || device->link.connected) {
+ device->link.flags = NM_FLAGS_UNSET (device->link.flags, IFF_UP);
+ device->link.connected = FALSE;
- link_changed (platform, device);
+ link_changed (platform, device, TRUE);
+ }
return TRUE;
}
@@ -351,9 +400,9 @@ link_set_arp (NMPlatform *platform, int ifindex)
if (!device)
return FALSE;
- device->link.arp = TRUE;
+ device->link.flags = NM_FLAGS_UNSET (device->link.flags, IFF_NOARP);
- link_changed (platform, device);
+ link_changed (platform, device, TRUE);
return TRUE;
}
@@ -366,64 +415,32 @@ link_set_noarp (NMPlatform *platform, int ifindex)
if (!device)
return FALSE;
- device->link.arp = FALSE;
+ device->link.flags = NM_FLAGS_SET (device->link.flags, IFF_NOARP);
- link_changed (platform, device);
+ link_changed (platform, device, TRUE);
return TRUE;
}
static gboolean
-link_is_up (NMPlatform *platform, int ifindex)
-{
- NMFakePlatformLink *device = link_get (platform, ifindex);
-
- return device ? device->link.up : FALSE;
-}
-
-static gboolean
-link_is_connected (NMPlatform *platform, int ifindex)
-{
- NMFakePlatformLink *device = link_get (platform, ifindex);
-
- return device ? device->link.connected : FALSE;
-}
-
-static gboolean
-link_uses_arp (NMPlatform *platform, int ifindex)
-{
- NMFakePlatformLink *device = link_get (platform, ifindex);
-
- return device ? device->link.arp : FALSE;
-}
-
-static gboolean
link_set_address (NMPlatform *platform, int ifindex, gconstpointer addr, size_t len)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
- if (device->address)
- g_bytes_unref (device->address);
-
- device->address = g_bytes_new (addr, len);
-
- link_changed (platform, link_get (platform, ifindex));
-
- return TRUE;
-}
-
-static gconstpointer
-link_get_address (NMPlatform *platform, int ifindex, size_t *length)
-{
- NMFakePlatformLink *device = link_get (platform, ifindex);
-
- if (!device || !device->address) {
- if (length)
- *length = 0;
- return NULL;
+ if ( len == 0
+ || len > NM_UTILS_HWADDR_LEN_MAX
+ || !addr)
+ g_return_val_if_reached (FALSE);
+
+ if ( device->link.addr.len != len
+ || ( len > 0
+ && memcmp (device->link.addr.data, addr, len) != 0)) {
+ memcpy (device->link.addr.data, addr, len);
+ device->link.addr.len = len;
+ link_changed (platform, link_get (platform, ifindex), TRUE);
}
- return g_bytes_get_data (device->address, length);
+ return TRUE;
}
static gboolean
@@ -433,45 +450,37 @@ link_set_mtu (NMPlatform *platform, int ifindex, guint32 mtu)
if (device) {
device->link.mtu = mtu;
- link_changed (platform, device);
+ link_changed (platform, device, TRUE);
}
return !!device;
}
-static guint32
-link_get_mtu (NMPlatform *platform, int ifindex)
+static const char *
+link_get_udi (NMPlatform *platform, int ifindex)
{
NMFakePlatformLink *device = link_get (platform, ifindex);
- return device ? device->link.mtu : 0;
-}
-
-static char *
-link_get_physical_port_id (NMPlatform *platform, int ifindex)
-{
- /* We call link_get just to cause an error to be set if @ifindex is bad. */
- link_get (platform, ifindex);
-
- return NULL;
-}
-
-static guint
-link_get_dev_id (NMPlatform *platform, int ifindex)
-{
- /* We call link_get just to cause an error to be set if @ifindex is bad. */
- link_get (platform, ifindex);
-
- return 0;
+ if (!device)
+ return NULL;
+ return device->udi;
}
static gboolean
-link_get_wake_on_lan (NMPlatform *platform, int ifindex)
-{
- /* We call link_get just to cause an error to be set if @ifindex is bad. */
- link_get (platform, ifindex);
+link_get_driver_info (NMPlatform *platform,
+ int ifindex,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version)
+{
+ if (out_driver_name)
+ *out_driver_name = NULL;
+ if (out_driver_version)
+ *out_driver_version = NULL;
+ if (out_fw_version)
+ *out_fw_version = NULL;
- return FALSE;
+ return TRUE;
}
static gboolean
@@ -510,12 +519,21 @@ static gboolean
link_enslave (NMPlatform *platform, int master, int slave)
{
NMFakePlatformLink *device = link_get (platform, slave);
+ NMFakePlatformLink *master_device = link_get (platform, master);
g_return_val_if_fail (device, FALSE);
+ g_return_val_if_fail (master_device, FALSE);
- device->link.master = master;
+ if (device->link.master != master) {
+ device->link.master = master;
- link_changed (platform, device);
+ if (NM_IN_SET (master_device->link.type, NM_LINK_TYPE_BOND, NM_LINK_TYPE_TEAM)) {
+ device->link.flags = NM_FLAGS_SET (device->link.flags, IFF_UP);
+ device->link.connected = TRUE;
+ }
+
+ link_changed (platform, device, TRUE);
+ }
return TRUE;
}
@@ -529,29 +547,17 @@ link_release (NMPlatform *platform, int master_idx, int slave_idx)
g_return_val_if_fail (master, FALSE);
g_return_val_if_fail (slave, FALSE);
- if (slave->link.master != master->link.ifindex) {
- platform->error = NM_PLATFORM_ERROR_NOT_SLAVE;
+ if (slave->link.master != master->link.ifindex)
return FALSE;
- }
slave->link.master = 0;
- link_changed (platform, slave);
- link_changed (platform, master);
+ link_changed (platform, slave, TRUE);
+ link_changed (platform, master, TRUE);
return TRUE;
}
-static int
-link_get_master (NMPlatform *platform, int slave)
-{
- NMFakePlatformLink *device = link_get (platform, slave);
-
- g_return_val_if_fail (device, FALSE);
-
- return device->link.master;
-}
-
static gboolean
master_set_option (NMPlatform *platform, int master, const char *option, const char *value)
{
@@ -585,20 +591,22 @@ slave_get_option (NMPlatform *platform, int slave, const char *option)
}
static gboolean
-vlan_add (NMPlatform *platform, const char *name, int parent, int vlan_id, guint32 vlan_flags)
+vlan_add (NMPlatform *platform, const char *name, int parent, int vlan_id, guint32 vlan_flags, NMPlatformLink *out_link)
{
NMFakePlatformLink *device;
- if (!link_add (platform, name, NM_LINK_TYPE_VLAN, NULL, 0))
+ if (!link_add (platform, name, NM_LINK_TYPE_VLAN, NULL, 0, NULL))
return FALSE;
- device = link_get (platform, link_get_ifindex (platform, name));
+ device = link_get (platform, nm_platform_link_get_ifindex (platform, name));
g_return_val_if_fail (device, FALSE);
device->vlan_id = vlan_id;
device->link.parent = parent;
+ if (out_link)
+ *out_link = device->link;
return TRUE;
}
@@ -630,20 +638,44 @@ vlan_set_egress_map (NMPlatform *platform, int ifindex, int from, int to)
}
static gboolean
-infiniband_partition_add (NMPlatform *platform, int parent, int p_key)
+infiniband_partition_add (NMPlatform *platform, int parent, int p_key, NMPlatformLink *out_link)
{
- NMFakePlatformLink *parent_device;
- char *name;
- gboolean success;
+ NMFakePlatformLink *device, *parent_device;
+ gs_free char *name = NULL;
parent_device = link_get (platform, parent);
g_return_val_if_fail (parent_device != NULL, FALSE);
name = g_strdup_printf ("%s.%04x", parent_device->link.name, p_key);
- success = link_add (platform, name, NM_LINK_TYPE_INFINIBAND, NULL, 0);
- g_free (name);
+ if (!link_add (platform, name, NM_LINK_TYPE_INFINIBAND, NULL, 0, out_link))
+ return FALSE;
+
+ device = link_get (platform, nm_platform_link_get_ifindex (platform, name));
+ g_return_val_if_fail (device, FALSE);
+
+ device->ib_p_key = p_key;
+ device->link.parent = parent;
- return success;
+ return TRUE;
+}
+
+static gboolean
+infiniband_get_info (NMPlatform *platform, int ifindex, int *parent, int *p_key, const char **mode)
+{
+ NMFakePlatformLink *device;
+
+ device = link_get (platform, ifindex);
+ g_return_val_if_fail (device, FALSE);
+ g_return_val_if_fail (device->link.type == NM_LINK_TYPE_INFINIBAND, FALSE);
+
+ if (parent)
+ *parent = device->link.parent;
+ if (p_key)
+ *p_key = device->ib_p_key;
+ if (mode)
+ *mode = "datagram";
+
+ return TRUE;
}
static gboolean
@@ -861,12 +893,12 @@ ip4_address_add (NMPlatform *platform, int ifindex,
continue;
memcpy (item, &address, sizeof (address));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, ifindex, &address, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NMP_OBJECT_TYPE_IP4_ADDRESS, ifindex, &address, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
g_array_append_val (priv->ip4_addresses, address);
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, ifindex, &address, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NMP_OBJECT_TYPE_IP4_ADDRESS, ifindex, &address, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
@@ -901,13 +933,15 @@ ip6_address_add (NMPlatform *platform, int ifindex,
if (item->plen != address.plen)
continue;
- memcpy (item, &address, sizeof (address));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, ifindex, &address, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+ if (nm_platform_ip6_address_cmp (item, &address) != 0) {
+ memcpy (item, &address, sizeof (address));
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NMP_OBJECT_TYPE_IP6_ADDRESS, ifindex, &address, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+ }
return TRUE;
}
g_array_append_val (priv->ip6_addresses, address);
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, ifindex, &address, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NMP_OBJECT_TYPE_IP6_ADDRESS, ifindex, &address, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
@@ -927,7 +961,7 @@ ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen,
memcpy (&deleted_address, address, sizeof (deleted_address));
memset (address, 0, sizeof (*address));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, ifindex, &deleted_address, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NMP_OBJECT_TYPE_IP4_ADDRESS, ifindex, &deleted_address, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
}
@@ -950,7 +984,7 @@ ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, int
memcpy (&deleted_address, address, sizeof (deleted_address));
memset (address, 0, sizeof (*address));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, ifindex, &deleted_address, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NMP_OBJECT_TYPE_IP6_ADDRESS, ifindex, &deleted_address, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
}
@@ -958,8 +992,8 @@ ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, int
return TRUE;
}
-static gboolean
-ip4_address_exists (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
+static const NMPlatformIP4Address *
+ip4_address_get (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
int i;
@@ -968,14 +1002,14 @@ ip4_address_exists (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
NMPlatformIP4Address *address = &g_array_index (priv->ip4_addresses, NMPlatformIP4Address, i);
if (address->ifindex == ifindex && address->plen == plen && address->address == addr)
- return TRUE;
+ return address;
}
- return FALSE;
+ return NULL;
}
-static gboolean
-ip6_address_exists (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen)
+static const NMPlatformIP6Address *
+ip6_address_get (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
int i;
@@ -985,41 +1019,36 @@ ip6_address_exists (NMPlatform *platform, int ifindex, struct in6_addr addr, int
if (address->ifindex == ifindex && address->plen == plen &&
IN6_ARE_ADDR_EQUAL (&address->address, &addr))
- return TRUE;
+ return address;
}
- return FALSE;
-}
-
-static gboolean
-ip4_check_reinstall_device_route (NMPlatform *platform, int ifindex, const NMPlatformIP4Address *address, guint32 device_route_metric)
-{
- return FALSE;
+ return NULL;
}
/******************************************************************/
static GArray *
-ip4_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteMode mode)
+ip4_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteFlags flags)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
GArray *routes;
NMPlatformIP4Route *route;
guint i;
- g_return_val_if_fail (NM_IN_SET (mode, NM_PLATFORM_GET_ROUTE_MODE_ALL, NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT), NULL);
-
routes = g_array_new (TRUE, TRUE, sizeof (NMPlatformIP4Route));
+ if (!NM_FLAGS_ANY (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT))
+ flags |= NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT;
+
/* Fill routes */
for (i = 0; i < priv->ip4_routes->len; i++) {
route = &g_array_index (priv->ip4_routes, NMPlatformIP4Route, i);
if (route && (!ifindex || route->ifindex == ifindex)) {
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
- if (mode != NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT)
+ if (NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT))
g_array_append_val (routes, *route);
} else {
- if (mode != NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT)
+ if (NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT))
g_array_append_val (routes, *route);
}
}
@@ -1029,26 +1058,27 @@ ip4_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteMode mod
}
static GArray *
-ip6_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteMode mode)
+ip6_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteFlags flags)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
GArray *routes;
NMPlatformIP6Route *route;
guint i;
- g_return_val_if_fail (NM_IN_SET (mode, NM_PLATFORM_GET_ROUTE_MODE_ALL, NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT), NULL);
-
routes = g_array_new (TRUE, TRUE, sizeof (NMPlatformIP6Route));
+ if (!NM_FLAGS_ANY (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT))
+ flags |= NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT;
+
/* Fill routes */
for (i = 0; i < priv->ip6_routes->len; i++) {
route = &g_array_index (priv->ip6_routes, NMPlatformIP6Route, i);
if (route && (!ifindex || route->ifindex == ifindex)) {
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
- if (mode != NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT)
+ if (NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT))
g_array_append_val (routes, *route);
} else {
- if (mode != NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT)
+ if (NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT))
g_array_append_val (routes, *route);
}
}
@@ -1058,6 +1088,56 @@ ip6_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteMode mod
}
static gboolean
+ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
+{
+ NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
+ int i;
+
+ for (i = 0; i < priv->ip4_routes->len; i++) {
+ NMPlatformIP4Route *route = &g_array_index (priv->ip4_routes, NMPlatformIP4Route, i);
+ NMPlatformIP4Route deleted_route;
+
+ if ( route->ifindex != ifindex
+ || route->network != network
+ || route->plen != plen
+ || route->metric != metric)
+ continue;
+
+ memcpy (&deleted_route, route, sizeof (deleted_route));
+ g_array_remove_index (priv->ip4_routes, i);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NMP_OBJECT_TYPE_IP4_ROUTE, ifindex, &deleted_route, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+ip6_route_delete (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
+{
+ NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
+ int i;
+
+ metric = nm_utils_ip6_route_metric_normalize (metric);
+
+ for (i = 0; i < priv->ip6_routes->len; i++) {
+ NMPlatformIP6Route *route = &g_array_index (priv->ip6_routes, NMPlatformIP6Route, i);
+ NMPlatformIP6Route deleted_route;
+
+ if ( route->ifindex != ifindex
+ || !IN6_ARE_ADDR_EQUAL (&route->network, &network)
+ || route->plen != plen
+ || route->metric != metric)
+ continue;
+
+ memcpy (&deleted_route, route, sizeof (deleted_route));
+ g_array_remove_index (priv->ip6_routes, i);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, NMP_OBJECT_TYPE_IP6_ROUTE, ifindex, &deleted_route, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
+ }
+
+ return TRUE;
+}
+
+static gboolean
ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
in_addr_t network, int plen, in_addr_t gateway,
guint32 pref_src, guint32 metric, guint32 mss)
@@ -1065,22 +1145,41 @@ ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMPlatformIP4Route route;
guint i;
+ guint8 scope;
+
+ scope = gateway == 0 ? RT_SCOPE_LINK : RT_SCOPE_UNIVERSE;
memset (&route, 0, sizeof (route));
route.source = NM_IP_CONFIG_SOURCE_KERNEL;
route.ifindex = ifindex;
route.source = source;
- route.network = network;
+ route.network = nm_utils_ip4_address_clear_host_address (network, plen);
route.plen = plen;
route.gateway = gateway;
route.metric = metric;
route.mss = mss;
+ route.scope_inv = nm_platform_route_scope_inv (scope);
+
+ if (gateway) {
+ for (i = 0; i < priv->ip4_routes->len; i++) {
+ NMPlatformIP4Route *item = &g_array_index (priv->ip4_routes,
+ NMPlatformIP4Route, i);
+ guint32 gate = ntohl (item->network) >> (32 - item->plen);
+ guint32 host = ntohl (gateway) >> (32 - item->plen);
+
+ if (ifindex == item->ifindex && gate == host)
+ break;
+ }
+ if (i == priv->ip4_routes->len) {
+ nm_log_warn (LOGD_PLATFORM, "Fake platform: failure adding ip4-route '%d: %s/%d %d': Network Unreachable",
+ route.ifindex, nm_utils_inet4_ntop (route.network, NULL), route.plen, route.metric);
+ return FALSE;
+ }
+ }
for (i = 0; i < priv->ip4_routes->len; i++) {
NMPlatformIP4Route *item = &g_array_index (priv->ip4_routes, NMPlatformIP4Route, i);
- if (item->ifindex != route.ifindex)
- continue;
if (item->network != route.network)
continue;
if (item->plen != route.plen)
@@ -1088,13 +1187,19 @@ ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
if (item->metric != metric)
continue;
+ if (item->ifindex != route.ifindex) {
+ ip4_route_delete (platform, item->ifindex, item->network, item->plen, item->metric);
+ i--;
+ continue;
+ }
+
memcpy (item, &route, sizeof (route));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, ifindex, &route, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NMP_OBJECT_TYPE_IP4_ROUTE, ifindex, &route, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
g_array_append_val (priv->ip4_routes, route);
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, ifindex, &route, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NMP_OBJECT_TYPE_IP4_ROUTE, ifindex, &route, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
@@ -1114,17 +1219,34 @@ ip6_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
route.source = NM_IP_CONFIG_SOURCE_KERNEL;
route.ifindex = ifindex;
route.source = source;
- route.network = network;
+ nm_utils_ip6_address_clear_host_address (&route.network, &network, plen);
route.plen = plen;
route.gateway = gateway;
route.metric = metric;
route.mss = mss;
+ if (!IN6_IS_ADDR_UNSPECIFIED(&gateway)) {
+ for (i = 0; i < priv->ip6_routes->len; i++) {
+ NMPlatformIP6Route *item = &g_array_index (priv->ip6_routes,
+ NMPlatformIP6Route, i);
+ guint8 gate_bits = gateway.s6_addr[item->plen / 8] >> (8 - item->plen % 8);
+ guint8 host_bits = item->network.s6_addr[item->plen / 8] >> (8 - item->plen % 8);
+
+ if ( ifindex == item->ifindex
+ && memcmp (&gateway, &item->network, item->plen / 8) == 0
+ && gate_bits == host_bits)
+ break;
+ }
+ if (i == priv->ip6_routes->len) {
+ nm_log_warn (LOGD_PLATFORM, "Fake platform: failure adding ip6-route '%d: %s/%d %d': Network Unreachable",
+ route.ifindex, nm_utils_inet6_ntop (&route.network, NULL), route.plen, route.metric);
+ return FALSE;
+ }
+ }
+
for (i = 0; i < priv->ip6_routes->len; i++) {
NMPlatformIP6Route *item = &g_array_index (priv->ip6_routes, NMPlatformIP6Route, i);
- if (item->ifindex != route.ifindex)
- continue;
if (!IN6_ARE_ADDR_EQUAL (&item->network, &route.network))
continue;
if (item->plen != route.plen)
@@ -1132,18 +1254,24 @@ ip6_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
if (item->metric != metric)
continue;
+ if (item->ifindex != route.ifindex) {
+ ip6_route_delete (platform, item->ifindex, item->network, item->plen, item->metric);
+ i--;
+ continue;
+ }
+
memcpy (item, &route, sizeof (route));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, ifindex, &route, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, NMP_OBJECT_TYPE_IP6_ROUTE, ifindex, &route, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
g_array_append_val (priv->ip6_routes, route);
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, ifindex, &route, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
+ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, NMP_OBJECT_TYPE_IP6_ROUTE, ifindex, &route, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
return TRUE;
}
-static NMPlatformIP4Route *
+static const NMPlatformIP4Route *
ip4_route_get (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
@@ -1162,7 +1290,7 @@ ip4_route_get (NMPlatform *platform, int ifindex, in_addr_t network, int plen, g
return NULL;
}
-static NMPlatformIP6Route *
+static const NMPlatformIP6Route *
ip6_route_get (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
@@ -1183,48 +1311,6 @@ ip6_route_get (NMPlatform *platform, int ifindex, struct in6_addr network, int p
return NULL;
}
-static gboolean
-ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
-{
- NMPlatformIP4Route *route = ip4_route_get (platform, ifindex, network, plen, metric);
- NMPlatformIP4Route deleted_route;
-
- if (route) {
- memcpy (&deleted_route, route, sizeof (deleted_route));
- memset (route, 0, sizeof (*route));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, ifindex, &deleted_route, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
- }
-
- return TRUE;
-}
-
-static gboolean
-ip6_route_delete (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
-{
- NMPlatformIP6Route *route = ip6_route_get (platform, ifindex, network, plen, metric);
- NMPlatformIP6Route deleted_route;
-
- if (route) {
- memcpy (&deleted_route, route, sizeof (deleted_route));
- memset (route, 0, sizeof (*route));
- g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, ifindex, &deleted_route, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_INTERNAL);
- }
-
- return TRUE;
-}
-
-static gboolean
-ip4_route_exists (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
-{
- return !!ip4_route_get (platform, ifindex, network, plen, metric);
-}
-
-static gboolean
-ip6_route_exists (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
-{
- return !!ip6_route_get (platform, ifindex, network, plen, metric);
-}
-
/******************************************************************/
static void
@@ -1240,21 +1326,25 @@ nm_fake_platform_init (NMFakePlatform *fake_platform)
priv->ip6_routes = g_array_new (TRUE, TRUE, sizeof (NMPlatformIP6Route));
}
-static gboolean
-setup (NMPlatform *platform)
+void
+nm_fake_platform_setup (void)
{
+ NMPlatform *platform;
+
+ platform = g_object_new (NM_TYPE_FAKE_PLATFORM, NULL);
+
+ nm_platform_setup (platform);
+
/* skip zero element */
- link_add (platform, NULL, NM_LINK_TYPE_NONE, NULL, 0);
+ link_add (platform, NULL, NM_LINK_TYPE_NONE, NULL, 0, NULL);
/* add loopback interface */
- link_add (platform, "lo", NM_LINK_TYPE_LOOPBACK, NULL, 0);
+ link_add (platform, "lo", NM_LINK_TYPE_LOOPBACK, NULL, 0, NULL);
/* add some ethernets */
- link_add (platform, "eth0", NM_LINK_TYPE_ETHERNET, NULL, 0);
- link_add (platform, "eth1", NM_LINK_TYPE_ETHERNET, NULL, 0);
- link_add (platform, "eth2", NM_LINK_TYPE_ETHERNET, NULL, 0);
-
- return TRUE;
+ link_add (platform, "eth0", NM_LINK_TYPE_ETHERNET, NULL, 0, NULL);
+ link_add (platform, "eth1", NM_LINK_TYPE_ETHERNET, NULL, 0, NULL);
+ link_add (platform, "eth2", NM_LINK_TYPE_ETHERNET, NULL, 0, NULL);
}
static void
@@ -1267,7 +1357,6 @@ nm_fake_platform_finalize (GObject *object)
for (i = 0; i < priv->links->len; i++) {
NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i);
- g_bytes_unref (device->address);
g_free (device->udi);
}
g_array_unref (priv->links);
@@ -1290,43 +1379,34 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass)
/* virtual methods */
object_class->finalize = nm_fake_platform_finalize;
- platform_class->setup = setup;
-
platform_class->sysctl_set = sysctl_set;
platform_class->sysctl_get = sysctl_get;
platform_class->link_get = _nm_platform_link_get;
+ platform_class->link_get_by_ifname = _nm_platform_link_get_by_ifname;
+ platform_class->link_get_by_address = _nm_platform_link_get_by_address;
platform_class->link_get_all = link_get_all;
platform_class->link_add = link_add;
platform_class->link_delete = link_delete;
- platform_class->link_get_ifindex = link_get_ifindex;
- platform_class->link_get_name = link_get_name;
- platform_class->link_get_type = link_get_type;
platform_class->link_get_type_name = link_get_type_name;
+ platform_class->link_get_udi = link_get_udi;
+
platform_class->link_set_up = link_set_up;
platform_class->link_set_down = link_set_down;
platform_class->link_set_arp = link_set_arp;
platform_class->link_set_noarp = link_set_noarp;
- platform_class->link_is_up = link_is_up;
- platform_class->link_is_connected = link_is_connected;
- platform_class->link_uses_arp = link_uses_arp;
platform_class->link_set_address = link_set_address;
- platform_class->link_get_address = link_get_address;
- platform_class->link_get_mtu = link_get_mtu;
platform_class->link_set_mtu = link_set_mtu;
- platform_class->link_get_physical_port_id = link_get_physical_port_id;
- platform_class->link_get_dev_id = link_get_dev_id;
- platform_class->link_get_wake_on_lan = link_get_wake_on_lan;
+ platform_class->link_get_driver_info = link_get_driver_info;
platform_class->link_supports_carrier_detect = link_supports_carrier_detect;
platform_class->link_supports_vlans = link_supports_vlans;
platform_class->link_enslave = link_enslave;
platform_class->link_release = link_release;
- platform_class->link_get_master = link_get_master;
platform_class->master_set_option = master_set_option;
platform_class->master_get_option = master_get_option;
platform_class->slave_set_option = slave_set_option;
@@ -1338,6 +1418,7 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass)
platform_class->vlan_set_egress_map = vlan_set_egress_map;
platform_class->infiniband_partition_add = infiniband_partition_add;
+ platform_class->infiniband_get_info = infiniband_get_info;
platform_class->veth_get_properties = veth_get_properties;
platform_class->tun_get_properties = tun_get_properties;
@@ -1360,23 +1441,21 @@ nm_fake_platform_class_init (NMFakePlatformClass *klass)
platform_class->mesh_set_channel = mesh_set_channel;
platform_class->mesh_set_ssid = mesh_set_ssid;
+ platform_class->ip4_address_get = ip4_address_get;
+ platform_class->ip6_address_get = ip6_address_get;
platform_class->ip4_address_get_all = ip4_address_get_all;
platform_class->ip6_address_get_all = ip6_address_get_all;
platform_class->ip4_address_add = ip4_address_add;
platform_class->ip6_address_add = ip6_address_add;
platform_class->ip4_address_delete = ip4_address_delete;
platform_class->ip6_address_delete = ip6_address_delete;
- platform_class->ip4_address_exists = ip4_address_exists;
- platform_class->ip6_address_exists = ip6_address_exists;
-
- platform_class->ip4_check_reinstall_device_route = ip4_check_reinstall_device_route;
+ platform_class->ip4_route_get = ip4_route_get;
+ platform_class->ip6_route_get = ip6_route_get;
platform_class->ip4_route_get_all = ip4_route_get_all;
platform_class->ip6_route_get_all = ip6_route_get_all;
platform_class->ip4_route_add = ip4_route_add;
platform_class->ip6_route_add = ip6_route_add;
platform_class->ip4_route_delete = ip4_route_delete;
platform_class->ip6_route_delete = ip6_route_delete;
- platform_class->ip4_route_exists = ip4_route_exists;
- platform_class->ip6_route_exists = ip6_route_exists;
}
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index c337ee9c9..80757f4ef 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2012-2013 Red Hat, Inc.
+ * Copyright (C) 2012-2015 Red Hat, Inc.
*/
#include "config.h"
@@ -31,10 +31,6 @@
#include <linux/if_link.h>
#include <linux/if_tun.h>
#include <linux/if_tunnel.h>
-#include <sys/ioctl.h>
-#include <linux/sockios.h>
-#include <linux/ethtool.h>
-#include <linux/mii.h>
#include <netlink/netlink.h>
#include <netlink/object.h>
#include <netlink/cache.h>
@@ -44,9 +40,9 @@
#include <netlink/route/route.h>
#include <gudev/gudev.h>
-#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE || HAVE_LIBNL_INET6_TOKEN
#include <netlink/route/link/inet6.h>
-#if HAVE_KERNEL_INET6_ADDR_GEN_MODE
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE && HAVE_KERNEL_INET6_ADDR_GEN_MODE
#include <linux/if_link.h>
#else
#define IN6_ADDR_GEN_MODE_EUI64 0
@@ -55,21 +51,101 @@
#endif
#include "gsystem-local-alloc.h"
+#include "nm-core-internal.h"
#include "NetworkManagerUtils.h"
#include "nm-linux-platform.h"
+#include "nm-platform-utils.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
#include "nm-logging.h"
#include "wifi/wifi-utils.h"
#include "wifi/wifi-utils-wext.h"
+#include "nmp-object.h"
/* This is only included for the translation of VLAN flags */
#include "nm-setting-vlan.h"
-#define debug(...) nm_log_dbg (LOGD_PLATFORM, __VA_ARGS__)
-#define warning(...) nm_log_warn (LOGD_PLATFORM, __VA_ARGS__)
-#define error(...) nm_log_err (LOGD_PLATFORM, __VA_ARGS__)
+/*********************************************************************************************/
+
+#define _LOG_DOMAIN LOGD_PLATFORM
+#define _LOG_PREFIX_NAME "platform-linux"
+
+#define _LOG(level, domain, self, ...) \
+ G_STMT_START { \
+ const NMLogLevel __level = (level); \
+ const NMLogDomain __domain = (domain); \
+ \
+ if (nm_logging_enabled (__level, __domain)) { \
+ char __prefix[32]; \
+ const char *__p_prefix = _LOG_PREFIX_NAME; \
+ const void *const __self = (self); \
+ \
+ if (__self && __self != nm_platform_try_get ()) { \
+ g_snprintf (__prefix, sizeof (__prefix), "%s[%p]", _LOG_PREFIX_NAME, __self); \
+ __p_prefix = __prefix; \
+ } \
+ _nm_log (__level, __domain, 0, \
+ "%s: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
+ __p_prefix _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
+ } \
+ } G_STMT_END
+#define _LOG_LEVEL_ENABLED(level, domain) \
+ ( nm_logging_enabled ((level), (domain)) )
+
+#ifdef NM_MORE_LOGGING
+#define _LOGT_ENABLED() _LOG_LEVEL_ENABLED (LOGL_TRACE, _LOG_DOMAIN)
+#define _LOGT(...) _LOG (LOGL_TRACE, _LOG_DOMAIN, platform, __VA_ARGS__)
+#else
+#define _LOGT_ENABLED() FALSE
+#define _LOGT(...) G_STMT_START { if (FALSE) { _LOG (LOGL_TRACE, _LOG_DOMAIN, platform, __VA_ARGS__); } } G_STMT_END
+#endif
+
+#define _LOGD(...) _LOG (LOGL_DEBUG, _LOG_DOMAIN, platform, __VA_ARGS__)
+#define _LOGI(...) _LOG (LOGL_INFO , _LOG_DOMAIN, platform, __VA_ARGS__)
+#define _LOGW(...) _LOG (LOGL_WARN , _LOG_DOMAIN, platform, __VA_ARGS__)
+#define _LOGE(...) _LOG (LOGL_ERR , _LOG_DOMAIN, platform, __VA_ARGS__)
+
+#define debug(...) _LOG (LOGL_DEBUG, _LOG_DOMAIN, NULL, __VA_ARGS__)
+#define warning(...) _LOG (LOGL_WARN , _LOG_DOMAIN, NULL, __VA_ARGS__)
+#define error(...) _LOG (LOGL_ERR , _LOG_DOMAIN, NULL, __VA_ARGS__)
+
+/******************************************************************
+ * Forward declarations and enums
+ ******************************************************************/
+typedef enum {
+ DELAYED_ACTION_TYPE_NONE = 0,
+ DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS = (1LL << 0),
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES = (1LL << 1),
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES = (1LL << 2),
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES = (1LL << 3),
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES = (1LL << 4),
+ DELAYED_ACTION_TYPE_REFRESH_LINK = (1LL << 5),
+ DELAYED_ACTION_TYPE_MASTER_CONNECTED = (1LL << 6),
+ DELAYED_ACTION_TYPE_READ_NETLINK = (1LL << 7),
+ __DELAYED_ACTION_TYPE_MAX,
+
+ DELAYED_ACTION_TYPE_REFRESH_ALL = DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
+
+ DELAYED_ACTION_TYPE_MAX = __DELAYED_ACTION_TYPE_MAX -1,
+} DelayedActionType;
+
+static gboolean tun_get_properties_ifname (NMPlatform *platform, const char *ifname, NMPlatformTunProperties *props);
+static void delayed_action_schedule (NMPlatform *platform, DelayedActionType action_type, gpointer user_data);
+static gboolean delayed_action_handle_all (NMPlatform *platform, gboolean read_netlink);
+static void do_request_link (NMPlatform *platform, int ifindex, const char *name, gboolean handle_delayed_action);
+static void do_request_all (NMPlatform *platform, DelayedActionType action_type, gboolean handle_delayed_action);
+static void cache_pre_hook (NMPCache *cache, const NMPObject *old, const NMPObject *new, NMPCacheOpsType ops_type, gpointer user_data);
+static gboolean event_handler_read_netlink_all (NMPlatform *platform, gboolean wait_for_acks);
+static NMPCacheOpsType cache_remove_netlink (NMPlatform *platform, const NMPObject *obj_needle, NMPObject **out_obj_cache, gboolean *out_was_visible, NMPlatformReason reason);
+
+/******************************************************************
+ * libnl unility functions and wrappers
+ ******************************************************************/
struct libnl_vtable
{
@@ -78,41 +154,6 @@ struct libnl_vtable
int (*f_nl_has_capability) (int capability);
};
-
-typedef struct {
- struct nl_sock *nlh;
- struct nl_sock *nlh_event;
- struct nl_cache *link_cache;
- struct nl_cache *address_cache;
- struct nl_cache *route_cache;
- GIOChannel *event_channel;
- guint event_id;
-
- GUdevClient *udev_client;
- GHashTable *udev_devices;
-
- GHashTable *wifi_data;
-
- int support_kernel_extended_ifa_flags;
- int support_user_ipv6ll;
-} NMLinuxPlatformPrivate;
-
-#define NM_LINUX_PLATFORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_LINUX_PLATFORM, NMLinuxPlatformPrivate))
-
-G_DEFINE_TYPE (NMLinuxPlatform, nm_linux_platform, NM_TYPE_PLATFORM)
-
-static const char *to_string_object (NMPlatform *platform, struct nl_object *obj);
-static gboolean _address_match (struct rtnl_addr *addr, int family, int ifindex);
-static gboolean _route_match (struct rtnl_route *rtnlroute, int family, int ifindex, gboolean include_proto_kernel);
-
-void
-nm_linux_platform_setup (void)
-{
- nm_platform_setup (NM_TYPE_LINUX_PLATFORM);
-}
-
-/******************************************************************/
-
static int
_nl_f_nl_has_capability (int capability)
{
@@ -148,73 +189,10 @@ _nl_has_capability (int capability)
return (_nl_get_vtable ()->f_nl_has_capability) (capability);
}
-/******************************************************************/
-
-static guint32
-_get_expiry (guint32 now_s, guint32 lifetime_s)
-{
- gint64 t = ((gint64) now_s) + ((gint64) lifetime_s);
-
- return MIN (t, NM_PLATFORM_LIFETIME_PERMANENT - 1);
-}
-
-/* The rtnl_addr object contains relative lifetimes @valid and @preferred
- * that count in seconds, starting from the moment when the kernel constructed
- * the netlink message.
- *
- * There is also a field rtnl_addr_last_update_time(), which is the absolute
- * time in 1/100th of a second of clock_gettime (CLOCK_MONOTONIC) when the address
- * was modified (wrapping every 497 days).
- * Immediately at the time when the address was last modified, #NOW and @last_update_time
- * are the same, so (only) in that case @valid and @preferred are anchored at @last_update_time.
- * However, this is not true in general. As time goes by, whenever kernel sends a new address
- * via netlink, the lifetimes keep counting down.
- *
- * As we cache the rtnl_addr object we must know the absolute expiries.
- * As a hack, modify the relative timestamps valid and preferred into absolute
- * timestamps of scale nm_utils_get_monotonic_timestamp_s().
- **/
-static void
-_rtnl_addr_hack_lifetimes_rel_to_abs (struct rtnl_addr *rtnladdr)
-{
- guint32 a_valid = rtnl_addr_get_valid_lifetime (rtnladdr);
- guint32 a_preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
- guint32 now;
-
- if (a_valid == NM_PLATFORM_LIFETIME_PERMANENT &&
- a_preferred == NM_PLATFORM_LIFETIME_PERMANENT)
- return;
-
- now = (guint32) nm_utils_get_monotonic_timestamp_s ();
-
- if (a_preferred > a_valid)
- a_preferred = a_valid;
-
- if (a_valid != NM_PLATFORM_LIFETIME_PERMANENT)
- rtnl_addr_set_valid_lifetime (rtnladdr, _get_expiry (now, a_valid));
- rtnl_addr_set_preferred_lifetime (rtnladdr, _get_expiry (now, a_preferred));
-}
-
-/******************************************************************/
-
-/* libnl library workarounds and additions */
-
/* Automatic deallocation of local variables */
-#define auto_nl_cache __attribute__((cleanup(put_nl_cache)))
+#define auto_nl_object __attribute__((cleanup(_nl_auto_nl_object)))
static void
-put_nl_cache (void *ptr)
-{
- struct nl_cache **cache = ptr;
-
- if (cache && *cache) {
- nl_cache_free (*cache);
- *cache = NULL;
- }
-}
-
-#define auto_nl_object __attribute__((cleanup(put_nl_object)))
-static void
-put_nl_object (void *ptr)
+_nl_auto_nl_object (void *ptr)
{
struct nl_object **object = ptr;
@@ -224,9 +202,9 @@ put_nl_object (void *ptr)
}
}
-#define auto_nl_addr __attribute__((cleanup(put_nl_addr)))
+#define auto_nl_addr __attribute__((cleanup(_nl_auto_nl_addr)))
static void
-put_nl_addr (void *ptr)
+_nl_auto_nl_addr (void *ptr)
{
struct nl_addr **object = ptr;
@@ -236,12 +214,10 @@ put_nl_addr (void *ptr)
}
}
-/*******************************************************************/
-
/* wrap the libnl alloc functions and abort on out-of-memory*/
static struct nl_addr *
-_nm_nl_addr_build (int family, const void *buf, size_t size)
+_nl_addr_build (int family, const void *buf, size_t size)
{
struct nl_addr *addr;
@@ -253,7 +229,7 @@ _nm_nl_addr_build (int family, const void *buf, size_t size)
}
static struct rtnl_link *
-_nm_rtnl_link_alloc (int ifindex, const char*name)
+_nl_rtnl_link_alloc (int ifindex, const char*name)
{
struct rtnl_link *rtnllink;
@@ -269,7 +245,7 @@ _nm_rtnl_link_alloc (int ifindex, const char*name)
}
static struct rtnl_addr *
-_nm_rtnl_addr_alloc (int ifindex)
+_nl_rtnl_addr_alloc (int ifindex)
{
struct rtnl_addr *rtnladdr;
@@ -282,7 +258,7 @@ _nm_rtnl_addr_alloc (int ifindex)
}
static struct rtnl_route *
-_nm_rtnl_route_alloc (void)
+_nl_rtnl_route_alloc (void)
{
struct rtnl_route *rtnlroute = rtnl_route_alloc ();
@@ -292,7 +268,7 @@ _nm_rtnl_route_alloc (void)
}
static struct rtnl_nexthop *
-_nm_rtnl_route_nh_alloc (void)
+_nl_rtnl_route_nh_alloc (void)
{
struct rtnl_nexthop *nexthop;
@@ -302,11 +278,9 @@ _nm_rtnl_route_nh_alloc (void)
return nexthop;
}
-/*******************************************************************/
-
/* rtnl_addr_set_prefixlen fails to update the nl_addr prefixlen */
static void
-nm_rtnl_addr_set_prefixlen (struct rtnl_addr *rtnladdr, int plen)
+_nl_rtnl_addr_set_prefixlen (struct rtnl_addr *rtnladdr, int plen)
{
struct nl_addr *nladdr;
@@ -316,188 +290,30 @@ nm_rtnl_addr_set_prefixlen (struct rtnl_addr *rtnladdr, int plen)
if (nladdr)
nl_addr_set_prefixlen (nladdr, plen);
}
-#define rtnl_addr_set_prefixlen nm_rtnl_addr_set_prefixlen
-
-typedef enum {
- OBJECT_TYPE_UNKNOWN,
- OBJECT_TYPE_LINK,
- OBJECT_TYPE_IP4_ADDRESS,
- OBJECT_TYPE_IP6_ADDRESS,
- OBJECT_TYPE_IP4_ROUTE,
- OBJECT_TYPE_IP6_ROUTE,
- __OBJECT_TYPE_LAST,
-} ObjectType;
-
-static ObjectType
-object_type_from_nl_object (const struct nl_object *object)
-{
- const char *type_str;
- if (!object || !(type_str = nl_object_get_type (object)))
- return OBJECT_TYPE_UNKNOWN;
-
- if (!strcmp (type_str, "route/link"))
- return OBJECT_TYPE_LINK;
- else if (!strcmp (type_str, "route/addr")) {
- switch (rtnl_addr_get_family ((struct rtnl_addr *) object)) {
- case AF_INET:
- return OBJECT_TYPE_IP4_ADDRESS;
- case AF_INET6:
- return OBJECT_TYPE_IP6_ADDRESS;
- default:
- return OBJECT_TYPE_UNKNOWN;
- }
- } else if (!strcmp (type_str, "route/route")) {
- switch (rtnl_route_get_family ((struct rtnl_route *) object)) {
- case AF_INET:
- return OBJECT_TYPE_IP4_ROUTE;
- case AF_INET6:
- return OBJECT_TYPE_IP6_ROUTE;
- default:
- return OBJECT_TYPE_UNKNOWN;
- }
- } else
- return OBJECT_TYPE_UNKNOWN;
-}
-
-static void
-_nl_link_family_unset (struct nl_object *obj, int *family)
-{
- if (!obj || object_type_from_nl_object (obj) != OBJECT_TYPE_LINK)
- *family = AF_UNSPEC;
- else {
- *family = rtnl_link_get_family ((struct rtnl_link *) obj);
-
- /* Always explicitly set the family to AF_UNSPEC, even if rtnl_link_get_family() might
- * already return %AF_UNSPEC. The reason is, that %AF_UNSPEC is the default family
- * and libnl nl_object_identical() function will only succeed, if the family is
- * explicitly set (which we cannot be sure, unless setting it). */
- rtnl_link_set_family ((struct rtnl_link *) obj, AF_UNSPEC);
- }
-}
-
-/* In our link cache, we coerce the family of all link objects to AF_UNSPEC.
- * Thus, before searching for an object, we fixup @needle to have the right
- * id (by resetting the family). */
-static struct nl_object *
-nm_nl_cache_search (struct nl_cache *cache, struct nl_object *needle)
-{
- int family;
- struct nl_object *obj;
-
- _nl_link_family_unset (needle, &family);
- obj = nl_cache_search (cache, needle);
- if (family != AF_UNSPEC) {
- /* restore the family of the @needle instance. If the family was
- * unset before, we cannot make it unset again. Thus, in that case
- * we cannot undo _nl_link_family_unset() entirely. */
- rtnl_link_set_family ((struct rtnl_link *) needle, family);
- }
-
- return obj;
-}
-
-/* Ask the kernel for an object identical (as in nl_cache_identical) to the
- * needle argument. This is a kernel counterpart for nl_cache_search.
- *
- * The returned object must be freed by the caller with nl_object_put().
- */
-static struct nl_object *
-get_kernel_object (struct nl_sock *sock, struct nl_object *needle)
+static const char *
+_nl_nlmsg_type_to_str (guint16 type, char *buf, gsize len)
{
- struct nl_object *object = NULL;
- ObjectType type = object_type_from_nl_object (needle);
+ const char *str_type = NULL;
switch (type) {
- case OBJECT_TYPE_LINK:
- {
- int ifindex = rtnl_link_get_ifindex ((struct rtnl_link *) needle);
- const char *name = rtnl_link_get_name ((struct rtnl_link *) needle);
- int nle;
-
- nle = rtnl_link_get_kernel (sock, ifindex, name, (struct rtnl_link **) &object);
- switch (nle) {
- case -NLE_SUCCESS:
- if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
- name = rtnl_link_get_name ((struct rtnl_link *) object);
- debug ("get_kernel_object for link: %s (%d, family %d)",
- name ? name : "(unknown)",
- rtnl_link_get_ifindex ((struct rtnl_link *) object),
- rtnl_link_get_family ((struct rtnl_link *) object));
- }
-
- _nl_link_family_unset (object, &nle);
- return object;
- case -NLE_NODEV:
- debug ("get_kernel_object for link %s (%d) had no result",
- name ? name : "(unknown)", ifindex);
- return NULL;
- default:
- error ("get_kernel_object for link %s (%d) failed: %s (%d)",
- name ? name : "(unknown)", ifindex, nl_geterror (nle), nle);
- return NULL;
- }
- }
- case OBJECT_TYPE_IP4_ADDRESS:
- case OBJECT_TYPE_IP6_ADDRESS:
- case OBJECT_TYPE_IP4_ROUTE:
- case OBJECT_TYPE_IP6_ROUTE:
- /* Fallback to a one-time cache allocation. */
- {
- struct nl_cache *cache;
- int nle;
-
- /* FIXME: every time we refresh *one* object, we request an
- * entire dump. E.g. check_cache_items() gets O(n2) complexitly. */
-
- nle = nl_cache_alloc_and_fill (
- nl_cache_ops_lookup (nl_object_get_type (needle)),
- sock, &cache);
- if (nle) {
- error ("get_kernel_object for type %d failed: %s (%d)",
- type, nl_geterror (nle), nle);
- return NULL;
- }
-
- object = nl_cache_search (cache, needle);
-
- nl_cache_free (cache);
-
- if (object && (type == OBJECT_TYPE_IP4_ADDRESS || type == OBJECT_TYPE_IP6_ADDRESS))
- _rtnl_addr_hack_lifetimes_rel_to_abs ((struct rtnl_addr *) object);
-
- if (object)
- debug ("get_kernel_object for type %d returned %p", type, object);
- else
- debug ("get_kernel_object for type %d had no result", type);
- return object;
- }
- default:
- g_return_val_if_reached (NULL);
- return NULL;
+ case RTM_NEWLINK: str_type = "NEWLINK"; break;
+ case RTM_DELLINK: str_type = "DELLINK"; break;
+ case RTM_NEWADDR: str_type = "NEWADDR"; break;
+ case RTM_DELADDR: str_type = "DELADDR"; break;
+ case RTM_NEWROUTE: str_type = "NEWROUTE"; break;
+ case RTM_DELROUTE: str_type = "DELROUTE"; break;
}
+ if (str_type)
+ g_strlcpy (buf, str_type, len);
+ else
+ g_snprintf (buf, len, "(%d)", type);
+ return buf;
}
-/* libnl 3.2 doesn't seem to provide such a generic way to add libnl-route objects. */
-static int
-add_kernel_object (struct nl_sock *sock, struct nl_object *object)
-{
- switch (object_type_from_nl_object (object)) {
- case OBJECT_TYPE_LINK:
- return rtnl_link_add (sock, (struct rtnl_link *) object, NLM_F_CREATE);
- case OBJECT_TYPE_IP4_ADDRESS:
- case OBJECT_TYPE_IP6_ADDRESS:
- return rtnl_addr_add (sock, (struct rtnl_addr *) object, NLM_F_CREATE | NLM_F_REPLACE);
- case OBJECT_TYPE_IP4_ROUTE:
- case OBJECT_TYPE_IP6_ROUTE:
- return rtnl_route_add (sock, (struct rtnl_route *) object, NLM_F_CREATE | NLM_F_REPLACE);
- default:
- g_return_val_if_reached (-NLE_INVAL);
- return -NLE_INVAL;
- }
-}
+/******************************************************************/
-/* nm_rtnl_link_parse_info_data(): Re-fetches a link from the kernel
+/* _nl_link_parse_info_data(): Re-fetches a link from the kernel
* and parses its IFLA_INFO_DATA using a caller-provided parser.
*
* Code is stolen from rtnl_link_get_kernel(), nl_pickup(), and link_msg_parser().
@@ -519,7 +335,7 @@ static struct nla_policy info_data_link_info_policy[IFLA_INFO_MAX + 1] = {
};
static int
-info_data_parser (struct nl_msg *msg, void *arg)
+_nl_link_parse_info_data_cb (struct nl_msg *msg, void *arg)
{
NMNLInfoDataClosure *closure = arg;
struct nlmsghdr *n = nlmsg_hdr (msg);
@@ -548,8 +364,8 @@ info_data_parser (struct nl_msg *msg, void *arg)
}
static int
-nm_rtnl_link_parse_info_data (struct nl_sock *sk, int ifindex,
- NMNLInfoDataParser parser, gpointer parser_data)
+_nl_link_parse_info_data (struct nl_sock *sk, int ifindex,
+ NMNLInfoDataParser parser, gpointer parser_data)
{
NMNLInfoDataClosure data = { .parser = parser, .parser_data = parser_data };
struct nl_msg *msg = NULL;
@@ -568,7 +384,7 @@ nm_rtnl_link_parse_info_data (struct nl_sock *sk, int ifindex,
cb = nl_cb_clone (nl_socket_get_cb (sk));
if (cb == NULL)
return -NLE_NOMEM;
- nl_cb_set (cb, NL_CB_VALID, NL_CB_CUSTOM, info_data_parser, &data);
+ nl_cb_set (cb, NL_CB_VALID, NL_CB_CUSTOM, _nl_link_parse_info_data_cb, &data);
err = nl_recvmsgs (sk, cb);
nl_cb_put (cb);
@@ -581,75 +397,171 @@ nm_rtnl_link_parse_info_data (struct nl_sock *sk, int ifindex,
/******************************************************************/
-static gboolean
-ethtool_get (const char *name, gpointer edata)
+static int
+_nl_sock_flush_data (struct nl_sock *sk)
+{
+ int nle;
+ struct nl_cb *cb;
+
+ cb = nl_cb_clone (nl_socket_get_cb (sk));
+ if (cb == NULL)
+ return -NLE_NOMEM;
+
+ nl_cb_set (cb, NL_CB_VALID, NL_CB_DEFAULT, NULL, NULL);
+ nl_cb_set (cb, NL_CB_SEQ_CHECK, NL_CB_DEFAULT, NULL, NULL);
+ nl_cb_err (cb, NL_CB_DEFAULT, NULL, NULL);
+ do {
+ errno = 0;
+
+ nle = nl_recvmsgs (sk, cb);
+
+ /* Work around a libnl bug fixed in 3.2.22 (375a6294) */
+ if (nle == 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
+ nle = -NLE_AGAIN;
+ } while (nle != -NLE_AGAIN);
+
+ nl_cb_put (cb);
+ return nle;
+}
+
+static void
+_nl_msg_set_seq (struct nl_sock *sk, struct nl_msg *msg, guint32 *out_seq)
{
- struct ifreq ifr;
- int fd;
+ guint32 seq;
- memset (&ifr, 0, sizeof (ifr));
- strncpy (ifr.ifr_name, name, IFNAMSIZ);
- ifr.ifr_data = edata;
+ /* choose our own sequence number, because libnl does not ensure that
+ * it isn't zero -- which would confuse our checking for outstanding
+ * messages. */
+ seq = nl_socket_use_seq (sk);
+ if (seq == 0)
+ seq = nl_socket_use_seq (sk);
- fd = socket (PF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
- error ("ethtool: Could not open socket.");
- return FALSE;
- }
+ nlmsg_hdr (msg)->nlmsg_seq = seq;
+ if (out_seq)
+ *out_seq = seq;
+}
- if (ioctl (fd, SIOCETHTOOL, &ifr) < 0) {
- debug ("ethtool: Request failed: %s", strerror (errno));
- close (fd);
- return FALSE;
- }
+static int
+_nl_sock_request_link (NMPlatform *platform, struct nl_sock *sk, int ifindex, const char *name, guint32 *out_seq)
+{
+ struct nl_msg *msg = NULL;
+ int err;
- close (fd);
- return TRUE;
+ if (name && !name[0])
+ name = NULL;
+
+ g_return_val_if_fail (ifindex > 0 || name, -NLE_INVAL);
+
+ _LOGT ("sock: request-link %d%s%s%s", ifindex, name ? ", \"" : "", name ? name : "", name ? "\"" : "");
+
+ if ((err = rtnl_link_build_get_request (ifindex, name, &msg)) < 0)
+ return err;
+
+ _nl_msg_set_seq (sk, msg, out_seq);
+
+ err = nl_send_auto (sk, msg);
+ nlmsg_free(msg);
+ if (err < 0)
+ return err;
+
+ return 0;
}
static int
-ethtool_get_stringset_index (const char *ifname, int stringset_id, const char *string)
+_nl_sock_request_all (NMPlatform *platform, struct nl_sock *sk, NMPObjectType obj_type, guint32 *out_seq)
{
- gs_free struct ethtool_sset_info *info = NULL;
- gs_free struct ethtool_gstrings *strings = NULL;
- guint32 len, i;
+ const NMPClass *klass;
+ struct rtgenmsg gmsg = { 0 };
+ struct nl_msg *msg;
+ int err;
- info = g_malloc0 (sizeof (*info) + sizeof (guint32));
- info->cmd = ETHTOOL_GSSET_INFO;
- info->reserved = 0;
- info->sset_mask = 1ULL << stringset_id;
+ klass = nmp_class_from_type (obj_type);
- if (!ethtool_get (ifname, info))
- return -1;
- if (!info->sset_mask)
- return -1;
+ _LOGT ("sock: request-all-%s", klass->obj_type_name);
- len = info->data[0];
+ /* reimplement
+ * nl_rtgen_request (sk, klass->rtm_gettype, klass->addr_family, NLM_F_DUMP);
+ * because we need the sequence number.
+ */
+ msg = nlmsg_alloc_simple (klass->rtm_gettype, NLM_F_DUMP);
+ if (!msg)
+ return -NLE_NOMEM;
+
+ gmsg.rtgen_family = klass->addr_family;
+ err = nlmsg_append (msg, &gmsg, sizeof (gmsg), NLMSG_ALIGNTO);
+ if (err < 0)
+ goto errout;
- strings = g_malloc0 (sizeof (*strings) + len * ETH_GSTRING_LEN);
- strings->cmd = ETHTOOL_GSTRINGS;
- strings->string_set = stringset_id;
- strings->len = len;
- if (!ethtool_get (ifname, strings))
- return -1;
+ _nl_msg_set_seq (sk, msg, out_seq);
- for (i = 0; i < len; i++) {
- if (!strcmp ((char *) &strings->data[i * ETH_GSTRING_LEN], string))
- return i;
- }
+ err = nl_send_auto (sk, msg);
+errout:
+ nlmsg_free(msg);
+
+ return err >= 0 ? 0 : err;
+}
+
+/******************************************************************/
- return -1;
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
+static int _support_user_ipv6ll = 0;
+#define _support_user_ipv6ll_still_undecided() (G_UNLIKELY (_support_user_ipv6ll == 0))
+#else
+#define _support_user_ipv6ll_still_undecided() (FALSE)
+#endif
+
+static gboolean
+_support_user_ipv6ll_get (void)
+{
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
+ if (_support_user_ipv6ll_still_undecided ()) {
+ _support_user_ipv6ll = -1;
+ nm_log_warn (LOGD_PLATFORM, "kernel support for IFLA_INET6_ADDR_GEN_MODE %s", "failed to detect; assume no support");
+ } else
+ return _support_user_ipv6ll > 0;
+#endif
+
+ return FALSE;
+}
+
+static void
+_support_user_ipv6ll_detect (const struct rtnl_link *rtnl_link)
+{
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
+ /* If we ever see a link with valid IPv6 link-local address
+ * generation modes, the kernel supports it.
+ */
+ if (_support_user_ipv6ll_still_undecided ()) {
+ uint8_t mode;
+
+ if (rtnl_link_inet6_get_addr_gen_mode ((struct rtnl_link *) rtnl_link, &mode) == 0) {
+ _support_user_ipv6ll = 1;
+ nm_log_dbg (LOGD_PLATFORM, "kernel support for IFLA_INET6_ADDR_GEN_MODE %s", "detected");
+ } else {
+ _support_user_ipv6ll = -1;
+ nm_log_dbg (LOGD_PLATFORM, "kernel support for IFLA_INET6_ADDR_GEN_MODE %s", "not detected");
+ }
+ }
+#endif
}
/******************************************************************/
+static int _support_kernel_extended_ifa_flags = 0;
+
+#define _support_kernel_extended_ifa_flags_still_undecided() (G_UNLIKELY (_support_kernel_extended_ifa_flags == 0))
+
static void
-_check_support_kernel_extended_ifa_flags_init (NMLinuxPlatformPrivate *priv, struct nl_msg *msg)
+_support_kernel_extended_ifa_flags_detect (struct nl_msg *msg)
{
- struct nlmsghdr *msg_hdr = nlmsg_hdr (msg);
+ struct nlmsghdr *msg_hdr;
+
+ if (!_support_kernel_extended_ifa_flags_still_undecided ())
+ return;
- g_return_if_fail (priv->support_kernel_extended_ifa_flags == 0);
- g_return_if_fail (msg_hdr->nlmsg_type == RTM_NEWADDR);
+ msg_hdr = nlmsg_hdr (msg);
+ if (msg_hdr->nlmsg_type != RTM_NEWADDR)
+ return;
/* the extended address flags are only set for AF_INET6 */
if (((struct ifaddrmsg *) nlmsg_data (msg_hdr))->ifa_family != AF_INET6)
@@ -659,424 +571,507 @@ _check_support_kernel_extended_ifa_flags_init (NMLinuxPlatformPrivate *priv, str
* we assume, that the kernel supports extended flags, IFA_F_MANAGETEMPADDR
* and IFA_F_NOPREFIXROUTE (they were added together).
**/
- priv->support_kernel_extended_ifa_flags =
+ _support_kernel_extended_ifa_flags =
nlmsg_find_attr (msg_hdr, sizeof (struct ifaddrmsg), 8 /* IFA_FLAGS */)
? 1 : -1;
}
static gboolean
-check_support_kernel_extended_ifa_flags (NMPlatform *platform)
+_support_kernel_extended_ifa_flags_get (void)
{
- NMLinuxPlatformPrivate *priv;
+ if (_support_kernel_extended_ifa_flags_still_undecided ()) {
+ nm_log_warn (LOGD_PLATFORM, "Unable to detect kernel support for extended IFA_FLAGS. Assume no kernel support.");
+ _support_kernel_extended_ifa_flags = -1;
+ }
+ return _support_kernel_extended_ifa_flags > 0;
+}
- g_return_val_if_fail (NM_IS_LINUX_PLATFORM (platform), FALSE);
+/******************************************************************
+ * Object type specific utilities
+ ******************************************************************/
- priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+static guint
+_nm_ip_config_source_to_rtprot (NMIPConfigSource source)
+{
+ switch (source) {
+ case NM_IP_CONFIG_SOURCE_UNKNOWN:
+ return RTPROT_UNSPEC;
+ case NM_IP_CONFIG_SOURCE_KERNEL:
+ case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL:
+ return RTPROT_KERNEL;
+ case NM_IP_CONFIG_SOURCE_DHCP:
+ return RTPROT_DHCP;
+ case NM_IP_CONFIG_SOURCE_RDISC:
+ return RTPROT_RA;
- if (priv->support_kernel_extended_ifa_flags == 0) {
- nm_log_warn (LOGD_PLATFORM, "Unable to detect kernel support for extended IFA_FLAGS. Assume no kernel support.");
- priv->support_kernel_extended_ifa_flags = -1;
+ default:
+ return RTPROT_STATIC;
}
-
- return priv->support_kernel_extended_ifa_flags > 0;
}
-static gboolean
-check_support_user_ipv6ll (NMPlatform *platform)
+static NMIPConfigSource
+_nm_ip_config_source_from_rtprot (guint rtprot)
{
- NMLinuxPlatformPrivate *priv;
+ switch (rtprot) {
+ case RTPROT_UNSPEC:
+ return NM_IP_CONFIG_SOURCE_UNKNOWN;
+ case RTPROT_KERNEL:
+ return NM_IP_CONFIG_SOURCE_RTPROT_KERNEL;
+ case RTPROT_REDIRECT:
+ return NM_IP_CONFIG_SOURCE_KERNEL;
+ case RTPROT_RA:
+ return NM_IP_CONFIG_SOURCE_RDISC;
+ case RTPROT_DHCP:
+ return NM_IP_CONFIG_SOURCE_DHCP;
- g_return_val_if_fail (NM_IS_LINUX_PLATFORM (platform), FALSE);
+ default:
+ return NM_IP_CONFIG_SOURCE_USER;
+ }
+}
- priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+/******************************************************************/
+
+typedef struct {
+ const NMLinkType nm_type;
+ const char *type_string;
+
+ /* IFLA_INFO_KIND / rtnl_link_get_type() where applicable; the rtnl type
+ * should only be specified if the device type can be created without
+ * additional parameters, and if the device type can be determined from
+ * the rtnl_type. eg, tun/tap should not be specified since both
+ * tun and tap devices use "tun", and InfiniBand should not be
+ * specified because a PKey is required at creation. Drivers set this
+ * value from their 'struct rtnl_link_ops' structure.
+ */
+ const char *rtnl_type;
+
+ /* uevent DEVTYPE where applicable, from /sys/class/net/<ifname>/uevent;
+ * drivers set this value from their SET_NETDEV_DEV() call and the
+ * 'struct device_type' name member.
+ */
+ const char *devtype;
+} LinkDesc;
+
+static const LinkDesc linktypes[] = {
+ { NM_LINK_TYPE_NONE, "none", NULL, NULL },
+ { NM_LINK_TYPE_UNKNOWN, "unknown", NULL, NULL },
+
+ { NM_LINK_TYPE_ETHERNET, "ethernet", NULL, NULL },
+ { NM_LINK_TYPE_INFINIBAND, "infiniband", NULL, NULL },
+ { NM_LINK_TYPE_OLPC_MESH, "olpc-mesh", NULL, NULL },
+ { NM_LINK_TYPE_WIFI, "wifi", NULL, "wlan" },
+ { NM_LINK_TYPE_WWAN_ETHERNET, "wwan", NULL, "wwan" },
+ { NM_LINK_TYPE_WIMAX, "wimax", "wimax", "wimax" },
+
+ { NM_LINK_TYPE_DUMMY, "dummy", "dummy", NULL },
+ { NM_LINK_TYPE_GRE, "gre", "gre", NULL },
+ { NM_LINK_TYPE_GRETAP, "gretap", "gretap", NULL },
+ { NM_LINK_TYPE_IFB, "ifb", "ifb", NULL },
+ { NM_LINK_TYPE_LOOPBACK, "loopback", NULL, NULL },
+ { NM_LINK_TYPE_MACVLAN, "macvlan", "macvlan", NULL },
+ { NM_LINK_TYPE_MACVTAP, "macvtap", "macvtap", NULL },
+ { NM_LINK_TYPE_OPENVSWITCH, "openvswitch", "openvswitch", NULL },
+ { NM_LINK_TYPE_TAP, "tap", NULL, NULL },
+ { NM_LINK_TYPE_TUN, "tun", NULL, NULL },
+ { NM_LINK_TYPE_VETH, "veth", "veth", NULL },
+ { NM_LINK_TYPE_VLAN, "vlan", "vlan", "vlan" },
+ { NM_LINK_TYPE_VXLAN, "vxlan", "vxlan", "vxlan" },
+ { NM_LINK_TYPE_BNEP, "bluetooth", NULL, "bluetooth" },
+
+ { NM_LINK_TYPE_BRIDGE, "bridge", "bridge", "bridge" },
+ { NM_LINK_TYPE_BOND, "bond", "bond", "bond" },
+ { NM_LINK_TYPE_TEAM, "team", "team", NULL },
+};
+
+static const char *
+nm_link_type_to_rtnl_type_string (NMLinkType type)
+{
+ int i;
- if (priv->support_user_ipv6ll == 0) {
- nm_log_warn (LOGD_PLATFORM, "Unable to detect kernel support for IFLA_INET6_ADDR_GEN_MODE. Assume no kernel support.");
- priv->support_user_ipv6ll = -1;
+ for (i = 0; i < G_N_ELEMENTS (linktypes); i++) {
+ if (type == linktypes[i].nm_type)
+ return linktypes[i].rtnl_type;
}
+ g_return_val_if_reached (NULL);
+}
+
+const char *
+nm_link_type_to_string (NMLinkType type)
+{
+ int i;
- return priv->support_user_ipv6ll > 0;
+ for (i = 0; i < G_N_ELEMENTS (linktypes); i++) {
+ if (type == linktypes[i].nm_type)
+ return linktypes[i].type_string;
+ }
+ g_return_val_if_reached (NULL);
}
+/******************************************************************
+ * NMPlatform types and functions
+ ******************************************************************/
-/* Object type specific utilities */
+typedef struct _NMLinuxPlatformPrivate NMLinuxPlatformPrivate;
-static const char *
-type_to_string (NMLinkType type)
+struct _NMLinuxPlatformPrivate {
+ struct nl_sock *nlh;
+ struct nl_sock *nlh_event;
+ guint32 nlh_seq_expect;
+ guint32 nlh_seq_last;
+ NMPCache *cache;
+ GIOChannel *event_channel;
+ guint event_id;
+
+ GUdevClient *udev_client;
+
+ struct {
+ DelayedActionType flags;
+ GPtrArray *list_master_connected;
+ GPtrArray *list_refresh_link;
+ gint is_handling;
+ guint idle_id;
+ } delayed_action;
+
+ GHashTable *prune_candidates;
+ GHashTable *delayed_deletion;
+
+ GHashTable *wifi_data;
+};
+
+static inline NMLinuxPlatformPrivate *
+NM_LINUX_PLATFORM_GET_PRIVATE (const void *self)
{
- /* Note that this only has to support virtual types */
- switch (type) {
- case NM_LINK_TYPE_DUMMY:
- return "dummy";
- case NM_LINK_TYPE_GRE:
- return "gre";
- case NM_LINK_TYPE_GRETAP:
- return "gretap";
- case NM_LINK_TYPE_IFB:
- return "ifb";
- case NM_LINK_TYPE_MACVLAN:
- return "macvlan";
- case NM_LINK_TYPE_MACVTAP:
- return "macvtap";
- case NM_LINK_TYPE_TAP:
- return "tap";
- case NM_LINK_TYPE_TUN:
- return "tun";
- case NM_LINK_TYPE_VETH:
- return "veth";
- case NM_LINK_TYPE_VLAN:
- return "vlan";
- case NM_LINK_TYPE_VXLAN:
- return "vxlan";
- case NM_LINK_TYPE_BRIDGE:
- return "bridge";
- case NM_LINK_TYPE_BOND:
- return "bond";
- case NM_LINK_TYPE_TEAM:
- return "team";
- default:
- g_warning ("Wrong type: %d", type);
- return NULL;
- }
+ nm_assert (NM_IS_LINUX_PLATFORM (self));
+
+ return ((NMLinuxPlatform *) self)->priv;
}
-#define return_type(t, name) \
- G_STMT_START { \
- if (out_name) \
- *out_name = name; \
- return t; \
- } G_STMT_END
+G_DEFINE_TYPE (NMLinuxPlatform, nm_linux_platform, NM_TYPE_PLATFORM)
-static NMLinkType
-link_type_from_udev (NMPlatform *platform, int ifindex, const char *ifname, int arptype, const char **out_name)
+void
+nm_linux_platform_setup (void)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GUdevDevice *udev_device;
- const char *prop, *sysfs_path;
+ g_object_new (NM_TYPE_LINUX_PLATFORM,
+ NM_PLATFORM_REGISTER_SINGLETON, TRUE,
+ NULL);
+}
- g_assert (ifname);
+/******************************************************************/
- udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (ifindex));
- if (!udev_device)
- return_type (NM_LINK_TYPE_UNKNOWN, "unknown");
+NMPObjectType
+_nlo_get_object_type (const struct nl_object *object)
+{
+ const char *type_str;
+
+ if (!object || !(type_str = nl_object_get_type (object)))
+ return NMP_OBJECT_TYPE_UNKNOWN;
- if ( g_udev_device_get_property (udev_device, "ID_NM_OLPC_MESH")
- || g_udev_device_get_sysfs_attr (udev_device, "anycast_mask"))
- return_type (NM_LINK_TYPE_OLPC_MESH, "olpc-mesh");
+ if (!strcmp (type_str, "route/link"))
+ return NMP_OBJECT_TYPE_LINK;
+ else if (!strcmp (type_str, "route/addr")) {
+ switch (rtnl_addr_get_family ((struct rtnl_addr *) object)) {
+ case AF_INET:
+ return NMP_OBJECT_TYPE_IP4_ADDRESS;
+ case AF_INET6:
+ return NMP_OBJECT_TYPE_IP6_ADDRESS;
+ default:
+ return NMP_OBJECT_TYPE_UNKNOWN;
+ }
+ } else if (!strcmp (type_str, "route/route")) {
+ switch (rtnl_route_get_family ((struct rtnl_route *) object)) {
+ case AF_INET:
+ return NMP_OBJECT_TYPE_IP4_ROUTE;
+ case AF_INET6:
+ return NMP_OBJECT_TYPE_IP6_ROUTE;
+ default:
+ return NMP_OBJECT_TYPE_UNKNOWN;
+ }
+ } else
+ return NMP_OBJECT_TYPE_UNKNOWN;
+}
- prop = g_udev_device_get_property (udev_device, "DEVTYPE");
- sysfs_path = g_udev_device_get_sysfs_path (udev_device);
- if (wifi_utils_is_wifi (ifname, sysfs_path, prop))
- return_type (NM_LINK_TYPE_WIFI, "wifi");
- else if (g_strcmp0 (prop, "wwan") == 0)
- return_type (NM_LINK_TYPE_WWAN_ETHERNET, "wwan");
- else if (g_strcmp0 (prop, "wimax") == 0)
- return_type (NM_LINK_TYPE_WIMAX, "wimax");
+/******************************************************************/
- if (arptype == ARPHRD_ETHER)
- return_type (NM_LINK_TYPE_ETHERNET, "ethernet");
+static gboolean
+check_support_kernel_extended_ifa_flags (NMPlatform *platform)
+{
+ g_return_val_if_fail (NM_IS_LINUX_PLATFORM (platform), FALSE);
- return_type (NM_LINK_TYPE_UNKNOWN, "unknown");
+ return _support_kernel_extended_ifa_flags_get ();
}
static gboolean
-link_is_software (struct rtnl_link *rtnllink)
+check_support_user_ipv6ll (NMPlatform *platform)
{
- const char *type;
+ g_return_val_if_fail (NM_IS_LINUX_PLATFORM (platform), FALSE);
- /* FIXME: replace somehow with NMLinkType or nm_platform_is_software(), but
- * solve the infinite callstack problems that getting the type of a TUN/TAP
- * device causes.
- */
+ return _support_user_ipv6ll_get ();
+}
- if ( rtnl_link_get_arptype (rtnllink) == ARPHRD_INFINIBAND
- && strchr (rtnl_link_get_name (rtnllink), '.'))
- return TRUE;
+static void
+process_events (NMPlatform *platform)
+{
+ delayed_action_handle_all (platform, TRUE);
+}
- type = rtnl_link_get_type (rtnllink);
- if (type == NULL)
- return FALSE;
+/******************************************************************/
- if (!strcmp (type, "dummy") ||
- !strcmp (type, "gre") ||
- !strcmp (type, "gretap") ||
- !strcmp (type, "macvlan") ||
- !strcmp (type, "macvtap") ||
- !strcmp (type, "tun") ||
- !strcmp (type, "veth") ||
- !strcmp (type, "vlan") ||
- !strcmp (type, "vxlan") ||
- !strcmp (type, "bridge") ||
- !strcmp (type, "bond") ||
- !strcmp (type, "team"))
- return TRUE;
+#define cache_lookup_all_objects(type, platform, obj_type, visible_only) \
+ ((const type *const*) nmp_cache_lookup_multi (NM_LINUX_PLATFORM_GET_PRIVATE ((platform))->cache, \
+ nmp_cache_id_init_object_type (NMP_CACHE_ID_STATIC, (obj_type), (visible_only)), \
+ NULL))
- return FALSE;
-}
-static const char *
-ethtool_get_driver (const char *ifname)
-{
- struct ethtool_drvinfo drvinfo = { 0 };
+/******************************************************************/
- g_return_val_if_fail (ifname != NULL, NULL);
+#define DEVTYPE_PREFIX "DEVTYPE="
- drvinfo.cmd = ETHTOOL_GDRVINFO;
- if (!ethtool_get (ifname, &drvinfo))
- return NULL;
+static char *
+read_devtype (const char *sysfs_path)
+{
+ gs_free char *uevent = g_strdup_printf ("%s/uevent", sysfs_path);
+ char *contents = NULL;
+ char *cont, *end;
- if (!*drvinfo.driver)
+ if (!g_file_get_contents (uevent, &contents, NULL, NULL))
return NULL;
-
- return g_intern_string (drvinfo.driver);
+ for (cont = contents; cont; cont = end) {
+ end = strpbrk (cont, "\r\n");
+ if (end)
+ *end++ = '\0';
+ if (strncmp (cont, DEVTYPE_PREFIX, STRLEN (DEVTYPE_PREFIX)) == 0) {
+ cont += STRLEN (DEVTYPE_PREFIX);
+ memmove (contents, cont, strlen (cont) + 1);
+ return contents;
+ }
+ }
+ g_free (contents);
+ return NULL;
}
-static gboolean
-link_is_announceable (NMPlatform *platform, struct rtnl_link *rtnllink)
+static const NMPObject *
+_lookup_link_cached (NMPlatform *platform, int ifindex, gboolean *completed_from_cache, const NMPObject **link_cached)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPObject *obj;
- /* Software devices are always visible outside the platform */
- if (link_is_software (rtnllink))
- return TRUE;
+ nm_assert (completed_from_cache && link_cached);
- /* Hardware devices must be found by udev so rules get run and tags set */
- if (g_hash_table_lookup (priv->udev_devices,
- GINT_TO_POINTER (rtnl_link_get_ifindex (rtnllink))))
- return TRUE;
+ if (!*completed_from_cache) {
+ obj = ifindex > 0 ? nmp_cache_lookup_link (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, ifindex) : NULL;
- return FALSE;
+ if (obj && !obj->_link.netlink.is_in_netlink)
+ *link_cached = obj;
+ else
+ *link_cached = NULL;
+ *completed_from_cache = TRUE;
+ }
+ return *link_cached;
}
static NMLinkType
-link_extract_type (NMPlatform *platform, struct rtnl_link *rtnllink, const char **out_name)
+link_extract_type (NMPlatform *platform, struct rtnl_link *rtnllink, gboolean *completed_from_cache, const NMPObject **link_cached, const char **out_kind)
{
- const char *type;
+ const char *rtnl_type, *ifname;
+ int i, arptype;
- if (!rtnllink)
- return_type (NM_LINK_TYPE_NONE, NULL);
+ if (!rtnllink) {
+ if (out_kind)
+ *out_kind = NULL;
+ return NM_LINK_TYPE_NONE;
+ }
+
+ rtnl_type = rtnl_link_get_type (rtnllink);
+ if (!rtnl_type && completed_from_cache) {
+ const NMPObject *obj;
+
+ obj = _lookup_link_cached (platform, rtnl_link_get_ifindex (rtnllink), completed_from_cache, link_cached);
+ if (obj && obj->link.kind) {
+ rtnl_type = obj->link.kind;
+ _LOGT ("link_extract_type(): complete kind from cache: ifindex=%d, kind=%s", rtnl_link_get_ifindex (rtnllink), rtnl_type);
+ }
+ }
+ if (out_kind)
+ *out_kind = rtnl_type;
+ if (rtnl_type) {
+ for (i = 0; i < G_N_ELEMENTS (linktypes); i++) {
+ if (g_strcmp0 (rtnl_type, linktypes[i].rtnl_type) == 0)
+ return linktypes[i].nm_type;
+ }
- type = rtnl_link_get_type (rtnllink);
+ if (!strcmp (rtnl_type, "tun")) {
+ NMPlatformTunProperties props;
+ guint flags;
- if (!type) {
- int arptype = rtnl_link_get_arptype (rtnllink);
- const char *driver;
- const char *ifname;
+ if (tun_get_properties_ifname (platform, rtnl_link_get_name (rtnllink), &props)) {
+ if (!g_strcmp0 (props.mode, "tap"))
+ return NM_LINK_TYPE_TAP;
+ if (!g_strcmp0 (props.mode, "tun"))
+ return NM_LINK_TYPE_TUN;
+ }
+ flags = rtnl_link_get_flags (rtnllink);
+
+ nm_log_dbg (LOGD_PLATFORM, "Failed to read tun properties for interface %d (link flags: %X)",
+ rtnl_link_get_ifindex (rtnllink), flags);
+
+ /* try guessing the type using the link flags instead... */
+ if (flags & IFF_POINTOPOINT)
+ return NM_LINK_TYPE_TUN;
+ return NM_LINK_TYPE_TAP;
+ }
+ }
- if (arptype == ARPHRD_LOOPBACK)
- return_type (NM_LINK_TYPE_LOOPBACK, "loopback");
- else if (arptype == ARPHRD_INFINIBAND)
- return_type (NM_LINK_TYPE_INFINIBAND, "infiniband");
+ arptype = rtnl_link_get_arptype (rtnllink);
+ if (arptype == ARPHRD_LOOPBACK)
+ return NM_LINK_TYPE_LOOPBACK;
+ else if (arptype == ARPHRD_INFINIBAND)
+ return NM_LINK_TYPE_INFINIBAND;
- ifname = rtnl_link_get_name (rtnllink);
- if (!ifname)
- return_type (NM_LINK_TYPE_UNKNOWN, type);
+ ifname = rtnl_link_get_name (rtnllink);
+ if (ifname) {
+ gs_free char *driver = NULL;
+ gs_free char *sysfs_path = NULL;
+ gs_free char *anycast_mask = NULL;
+ gs_free char *devtype = NULL;
- driver = ethtool_get_driver (ifname);
if (arptype == 256) {
/* Some s390 CTC-type devices report 256 for the encapsulation type
* for some reason, but we need to call them Ethernet.
*/
if (!g_strcmp0 (driver, "ctcm"))
- return_type (NM_LINK_TYPE_ETHERNET, "ethernet");
+ return NM_LINK_TYPE_ETHERNET;
}
- if (!g_strcmp0 (driver, "openvswitch"))
- return_type (NM_LINK_TYPE_OPENVSWITCH, "openvswitch");
-
- return link_type_from_udev (platform,
- rtnl_link_get_ifindex (rtnllink),
- ifname,
- arptype,
- out_name);
- } else if (!strcmp (type, "dummy"))
- return_type (NM_LINK_TYPE_DUMMY, "dummy");
- else if (!strcmp (type, "gre"))
- return_type (NM_LINK_TYPE_GRE, "gre");
- else if (!strcmp (type, "gretap"))
- return_type (NM_LINK_TYPE_GRETAP, "gretap");
- else if (!strcmp (type, "ifb"))
- return_type (NM_LINK_TYPE_IFB, "ifb");
- else if (!strcmp (type, "macvlan"))
- return_type (NM_LINK_TYPE_MACVLAN, "macvlan");
- else if (!strcmp (type, "macvtap"))
- return_type (NM_LINK_TYPE_MACVTAP, "macvtap");
- else if (!strcmp (type, "tun")) {
- NMPlatformTunProperties props;
- guint flags;
-
- if (nm_platform_tun_get_properties (rtnl_link_get_ifindex (rtnllink), &props)) {
- if (!g_strcmp0 (props.mode, "tap"))
- return_type (NM_LINK_TYPE_TAP, "tap");
- if (!g_strcmp0 (props.mode, "tun"))
- return_type (NM_LINK_TYPE_TUN, "tun");
+ /* Fallback OVS detection for kernel <= 3.16 */
+ if (nmp_utils_ethtool_get_driver_info (ifname, &driver, NULL, NULL)) {
+ if (!g_strcmp0 (driver, "openvswitch"))
+ return NM_LINK_TYPE_OPENVSWITCH;
}
- flags = rtnl_link_get_flags (rtnllink);
-
- nm_log_dbg (LOGD_PLATFORM, "Failed to read tun properties for interface %d (link flags: %X)",
- rtnl_link_get_ifindex (rtnllink), flags);
-
- /* try guessing the type using the link flags instead... */
- if (flags & IFF_POINTOPOINT)
- return_type (NM_LINK_TYPE_TUN, "tun");
- return_type (NM_LINK_TYPE_TAP, "tap");
- } else if (!strcmp (type, "veth"))
- return_type (NM_LINK_TYPE_VETH, "veth");
- else if (!strcmp (type, "vlan"))
- return_type (NM_LINK_TYPE_VLAN, "vlan");
- else if (!strcmp (type, "vxlan"))
- return_type (NM_LINK_TYPE_VXLAN, "vxlan");
- else if (!strcmp (type, "bridge"))
- return_type (NM_LINK_TYPE_BRIDGE, "bridge");
- else if (!strcmp (type, "bond"))
- return_type (NM_LINK_TYPE_BOND, "bond");
- else if (!strcmp (type, "team"))
- return_type (NM_LINK_TYPE_TEAM, "team");
-
- return_type (NM_LINK_TYPE_UNKNOWN, type);
-}
-static const char *
-udev_get_driver (NMPlatform *platform, GUdevDevice *device, int ifindex)
-{
- GUdevDevice *parent = NULL, *grandparent = NULL;
- const char *driver, *subsys;
-
- driver = g_udev_device_get_driver (device);
- if (driver)
- return driver;
-
- /* Try the parent */
- parent = g_udev_device_get_parent (device);
- if (parent) {
- driver = g_udev_device_get_driver (parent);
- if (!driver) {
- /* Try the grandparent if it's an ibmebus device or if the
- * subsys is NULL which usually indicates some sort of
- * platform device like a 'gadget' net interface.
- */
- subsys = g_udev_device_get_subsystem (parent);
- if ( (g_strcmp0 (subsys, "ibmebus") == 0)
- || (subsys == NULL)) {
- grandparent = g_udev_device_get_parent (parent);
- if (grandparent) {
- driver = g_udev_device_get_driver (grandparent);
+ sysfs_path = g_strdup_printf ("/sys/class/net/%s", ifname);
+ anycast_mask = g_strdup_printf ("%s/anycast_mask", sysfs_path);
+ if (g_file_test (anycast_mask, G_FILE_TEST_EXISTS))
+ return NM_LINK_TYPE_OLPC_MESH;
+
+ devtype = read_devtype (sysfs_path);
+ for (i = 0; devtype && i < G_N_ELEMENTS (linktypes); i++) {
+ if (g_strcmp0 (devtype, linktypes[i].devtype) == 0) {
+ if (linktypes[i].nm_type == NM_LINK_TYPE_BNEP) {
+ /* Both BNEP and 6lowpan use DEVTYPE=bluetooth, so we must
+ * use arptype to distinguish between them.
+ */
+ if (arptype != ARPHRD_ETHER)
+ continue;
}
+ return linktypes[i].nm_type;
}
}
- }
- /* Intern the string so we don't have to worry about memory
- * management in NMPlatformLink.
- */
- if (driver)
- driver = g_intern_string (driver);
+ /* Fallback for drivers that don't call SET_NETDEV_DEVTYPE() */
+ if (wifi_utils_is_wifi (ifname, sysfs_path))
+ return NM_LINK_TYPE_WIFI;
- g_clear_object (&parent);
- g_clear_object (&grandparent);
+ /* Standard wired ethernet interfaces don't report an rtnl_link_type, so
+ * only allow fallback to Ethernet if no type is given. This should
+ * prevent future virtual network drivers from being treated as Ethernet
+ * when they should be Generic instead.
+ */
+ if (arptype == ARPHRD_ETHER && !rtnl_type && !devtype)
+ return NM_LINK_TYPE_ETHERNET;
+ }
- return driver;
+ return NM_LINK_TYPE_UNKNOWN;
}
-static gboolean
-init_link (NMPlatform *platform, NMPlatformLink *info, struct rtnl_link *rtnllink)
+gboolean
+_nmp_vt_cmd_plobj_init_from_nl_link (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GUdevDevice *udev_device;
+ NMPlatformLink *obj = (NMPlatformLink *) _obj;
+ NMPObjectLink *obj_priv = (NMPObjectLink *) _obj;
+ struct rtnl_link *nlo = (struct rtnl_link *) _nlo;
const char *name;
+ struct nl_addr *nladdr;
+ const char *kind;
+ gboolean completed_from_cache_val = FALSE;
+ gboolean *completed_from_cache = complete_from_cache ? &completed_from_cache_val : NULL;
+ const NMPObject *link_cached = NULL;
- g_return_val_if_fail (rtnllink, FALSE);
+ nm_assert (memcmp (obj, ((char [sizeof (NMPObjectLink)]) { 0 }), sizeof (NMPObjectLink)) == 0);
- name = rtnl_link_get_name (rtnllink);
- memset (info, 0, sizeof (*info));
+ if (_LOGT_ENABLED () && !NM_IN_SET (rtnl_link_get_family (nlo), AF_UNSPEC, AF_BRIDGE))
+ _LOGT ("netlink object for ifindex %d has unusual family %d", rtnl_link_get_ifindex (nlo), rtnl_link_get_family (nlo));
- info->ifindex = rtnl_link_get_ifindex (rtnllink);
- if (name)
- g_strlcpy (info->name, name, sizeof (info->name));
- else
- info->name[0] = '\0';
- info->type = link_extract_type (platform, rtnllink, &info->type_name);
- info->up = !!(rtnl_link_get_flags (rtnllink) & IFF_UP);
- info->connected = !!(rtnl_link_get_flags (rtnllink) & IFF_LOWER_UP);
- info->arp = !(rtnl_link_get_flags (rtnllink) & IFF_NOARP);
- info->master = rtnl_link_get_master (rtnllink);
- info->parent = rtnl_link_get_link (rtnllink);
- info->mtu = rtnl_link_get_mtu (rtnllink);
-
- udev_device = g_hash_table_lookup (priv->udev_devices, GINT_TO_POINTER (info->ifindex));
- if (udev_device) {
- info->driver = udev_get_driver (platform, udev_device, info->ifindex);
- if (!info->driver)
- info->driver = g_intern_string (rtnl_link_get_type (rtnllink));
- if (!info->driver)
- info->driver = ethtool_get_driver (info->name);
- if (!info->driver)
- info->driver = "unknown";
- info->udi = g_udev_device_get_sysfs_path (udev_device);
- }
+ obj->ifindex = rtnl_link_get_ifindex (nlo);
- return TRUE;
-}
+ if (id_only)
+ return TRUE;
-/* Hack: Empty bridges and bonds have IFF_LOWER_UP flag and therefore they break
- * the carrier detection. This hack makes nm-platform think they don't have the
- * IFF_LOWER_UP flag. This seems to also apply to bonds (specifically) with all
- * slaves down.
- *
- * Note: This is still a bit racy but when NetworkManager asks for enslaving a slave,
- * nm-platform will do that synchronously and will immediately ask for both master
- * and slave information after the enslaving request. After the synchronous call, the
- * master carrier is already updated with the slave carrier in mind.
- *
- * https://bugzilla.redhat.com/show_bug.cgi?id=910348
- */
-static void
-hack_empty_master_iff_lower_up (NMPlatform *platform, struct nl_object *object)
-{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- struct rtnl_link *rtnllink;
- int ifindex;
- struct nl_object *slave;
- const char *type;
+ name = rtnl_link_get_name (nlo);
+ if (name)
+ g_strlcpy (obj->name, name, sizeof (obj->name));
+ obj->type = link_extract_type (platform, nlo, completed_from_cache, &link_cached, &kind);
+ obj->kind = g_intern_string (kind);
+ obj->flags = rtnl_link_get_flags (nlo);
+ obj->connected = NM_FLAGS_HAS (obj->flags, IFF_LOWER_UP);
+ obj->master = rtnl_link_get_master (nlo);
+ obj->parent = rtnl_link_get_link (nlo);
+ obj->mtu = rtnl_link_get_mtu (nlo);
+ obj->arptype = rtnl_link_get_arptype (nlo);
+
+ if (obj->type == NM_LINK_TYPE_VLAN) {
+ if (!g_strcmp0 (rtnl_link_get_type (nlo), "vlan"))
+ obj->vlan_id = rtnl_link_vlan_get_id (nlo);
+ else if (completed_from_cache) {
+ _lookup_link_cached (platform, obj->ifindex, completed_from_cache, &link_cached);
+ if (link_cached)
+ obj->vlan_id = link_cached->link.vlan_id;
+ }
+ }
- if (!object)
- return;
- if (strcmp (nl_object_get_type (object), "route/link"))
- return;
+ if ((nladdr = rtnl_link_get_addr (nlo))) {
+ unsigned int l = 0;
- rtnllink = (struct rtnl_link *) object;
+ l = nl_addr_get_len (nladdr);
+ if (l > 0 && l <= NM_UTILS_HWADDR_LEN_MAX) {
+ G_STATIC_ASSERT (NM_UTILS_HWADDR_LEN_MAX == sizeof (obj->addr.data));
+ memcpy (obj->addr.data, nl_addr_get_binary_addr (nladdr), l);
+ obj->addr.len = l;
+ }
+ }
- ifindex = rtnl_link_get_ifindex (rtnllink);
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
+ if (_support_user_ipv6ll_get ()) {
+ guint8 mode = 0;
- type = rtnl_link_get_type (rtnllink);
- if (!type || (strcmp (type, "bridge") != 0 && strcmp (type, "bond") != 0))
- return;
+ if (rtnl_link_inet6_get_addr_gen_mode (nlo, &mode) == 0)
+ obj->inet6_addr_gen_mode_inv = _nm_platform_uint8_inv (mode);
+ }
+#endif
- for (slave = nl_cache_get_first (priv->link_cache); slave; slave = nl_cache_get_next (slave)) {
- struct rtnl_link *rtnlslave = (struct rtnl_link *) slave;
- if (rtnl_link_get_master (rtnlslave) == ifindex
- && rtnl_link_get_flags (rtnlslave) & IFF_LOWER_UP)
- return;
+#if HAVE_LIBNL_INET6_TOKEN
+ if ((rtnl_link_inet6_get_token (nlo, &nladdr)) == 0) {
+ if ( nl_addr_get_family (nladdr) == AF_INET6
+ && nl_addr_get_len (nladdr) == sizeof (struct in6_addr)) {
+ struct in6_addr *addr;
+ NMUtilsIPv6IfaceId *iid = &obj->inet6_token.iid;
+
+ addr = nl_addr_get_binary_addr (nladdr);
+ iid->id_u8[7] = addr->s6_addr[15];
+ iid->id_u8[6] = addr->s6_addr[14];
+ iid->id_u8[5] = addr->s6_addr[13];
+ iid->id_u8[4] = addr->s6_addr[12];
+ iid->id_u8[3] = addr->s6_addr[11];
+ iid->id_u8[2] = addr->s6_addr[10];
+ iid->id_u8[1] = addr->s6_addr[9];
+ iid->id_u8[0] = addr->s6_addr[8];
+ obj->inet6_token.is_valid = TRUE;
+ }
+ nl_addr_put (nladdr);
}
+#endif
- rtnl_link_unset_flags (rtnllink, IFF_LOWER_UP);
-}
+ obj_priv->netlink.is_in_netlink = TRUE;
-static guint32
-_get_remaining_time (guint32 start_timestamp, guint32 end_timestamp)
-{
- /* Return the remaining time between @start_timestamp until @end_timestamp.
- *
- * If @end_timestamp is NM_PLATFORM_LIFETIME_PERMANENT, it returns
- * NM_PLATFORM_LIFETIME_PERMANENT. If @start_timestamp already passed
- * @end_timestamp it returns 0. Beware, NMPlatformIPAddress treats a @lifetime
- * of 0 as permanent.
- */
- if (end_timestamp == NM_PLATFORM_LIFETIME_PERMANENT)
- return NM_PLATFORM_LIFETIME_PERMANENT;
- if (start_timestamp >= end_timestamp)
- return 0;
- return end_timestamp - start_timestamp;
+ return TRUE;
}
/* _timestamp_nl_to_ms:
@@ -1112,15 +1107,18 @@ _timestamp_nl_to_ms (guint32 timestamp_nl, gint64 monotonic_ms)
}
static guint32
-_rtnl_addr_last_update_time_to_nm (const struct rtnl_addr *rtnladdr)
+_rtnl_addr_last_update_time_to_nm (const struct rtnl_addr *rtnladdr, gint32 *out_now_nm)
{
guint32 last_update_time = rtnl_addr_get_last_update_time ((struct rtnl_addr *) rtnladdr);
struct timespec tp;
gint64 now_nl, now_nm, result;
/* timestamp is unset. Default to 1. */
- if (!last_update_time)
+ if (!last_update_time) {
+ if (out_now_nm)
+ *out_now_nm = 0;
return 1;
+ }
/* do all the calculations in milliseconds scale */
@@ -1131,6 +1129,9 @@ _rtnl_addr_last_update_time_to_nm (const struct rtnl_addr *rtnladdr)
result = now_nm - (now_nl - _timestamp_nl_to_ms (last_update_time, now_nl));
+ if (out_now_nm)
+ *out_now_nm = now_nm / 1000;
+
/* converting the last_update_time into nm_utils_get_monotonic_timestamp_ms() scale is
* a good guess but fails in the following situations:
*
@@ -1148,686 +1149,952 @@ _rtnl_addr_last_update_time_to_nm (const struct rtnl_addr *rtnladdr)
return result / 1000;
}
-static void
-_init_ip_address_lifetime (NMPlatformIPAddress *address, const struct rtnl_addr *rtnladdr)
+static guint32
+_extend_lifetime (guint32 lifetime, guint32 seconds)
{
- guint32 a_valid = rtnl_addr_get_valid_lifetime ((struct rtnl_addr *) rtnladdr);
- guint32 a_preferred = rtnl_addr_get_preferred_lifetime ((struct rtnl_addr *) rtnladdr);
-
- /* the meaning of the valid and preferred lifetimes is different from the
- * original meaning. See _rtnl_addr_hack_lifetimes_rel_to_abs().
- * Beware: this function expects hacked rtnl_addr objects.
- */
+ guint64 v;
- if (a_valid == NM_PLATFORM_LIFETIME_PERMANENT &&
- a_preferred == NM_PLATFORM_LIFETIME_PERMANENT) {
- address->timestamp = 0;
- address->lifetime = NM_PLATFORM_LIFETIME_PERMANENT;
- address->preferred = NM_PLATFORM_LIFETIME_PERMANENT;
- return;
- }
+ if ( lifetime == NM_PLATFORM_LIFETIME_PERMANENT
+ || seconds == 0)
+ return lifetime;
- /* The valies are hacked and absolute expiry times. They must
- * be positive and preferred<=valid. */
- g_assert (a_preferred <= a_valid &&
- a_valid > 0 &&
- a_preferred > 0);
-
- if (a_valid <= 1) {
- /* Since we want to have positive @timestamp and @valid != 0,
- * we must handle this case special. */
- address->timestamp = 1;
- address->lifetime = 1; /* Extend the lifetime by one second */
- address->preferred = 0; /* no longer preferred. */
- return;
- }
+ v = (guint64) lifetime + (guint64) seconds;
+ return MIN (v, NM_PLATFORM_LIFETIME_PERMANENT - 1);
+}
- /* _rtnl_addr_last_update_time_to_nm() might be wrong, so don't rely on
- * timestamp to have any meaning beyond anchoring the relative durations
- * @lifetime and @preferred.
- */
- address->timestamp = _rtnl_addr_last_update_time_to_nm (rtnladdr);
+/* The rtnl_addr object contains relative lifetimes @valid and @preferred
+ * that count in seconds, starting from the moment when the kernel constructed
+ * the netlink message.
+ *
+ * There is also a field rtnl_addr_last_update_time(), which is the absolute
+ * time in 1/100th of a second of clock_gettime (CLOCK_MONOTONIC) when the address
+ * was modified (wrapping every 497 days).
+ * Immediately at the time when the address was last modified, #NOW and @last_update_time
+ * are the same, so (only) in that case @valid and @preferred are anchored at @last_update_time.
+ * However, this is not true in general. As time goes by, whenever kernel sends a new address
+ * via netlink, the lifetimes keep counting down.
+ **/
+static void
+_nlo_rtnl_addr_get_lifetimes (const struct rtnl_addr *rtnladdr,
+ guint32 *out_timestamp,
+ guint32 *out_lifetime,
+ guint32 *out_preferred)
+{
+ guint32 timestamp = 0;
+ gint32 now;
+ guint32 lifetime = rtnl_addr_get_valid_lifetime ((struct rtnl_addr *) rtnladdr);
+ guint32 preferred = rtnl_addr_get_preferred_lifetime ((struct rtnl_addr *) rtnladdr);
+
+ if ( lifetime != NM_PLATFORM_LIFETIME_PERMANENT
+ || preferred != NM_PLATFORM_LIFETIME_PERMANENT) {
+ if (preferred > lifetime)
+ preferred = lifetime;
+ timestamp = _rtnl_addr_last_update_time_to_nm (rtnladdr, &now);
+
+ if (now == 0) {
+ /* strange. failed to detect the last-update time and assumed that timestamp is 1. */
+ nm_assert (timestamp == 1);
+ now = nm_utils_get_monotonic_timestamp_s ();
+ }
+ if (timestamp < now) {
+ guint32 diff = now - timestamp;
- /* We would expect @timestamp to be less then @a_valid. Just to be sure,
- * fix it up. */
- address->timestamp = MIN (address->timestamp, a_valid - 1);
- address->lifetime = _get_remaining_time (address->timestamp, a_valid);
- address->preferred = _get_remaining_time (address->timestamp, a_preferred);
+ lifetime = _extend_lifetime (lifetime, diff);
+ preferred = _extend_lifetime (preferred, diff);
+ } else
+ nm_assert (timestamp == now);
+ }
+ *out_timestamp = timestamp;
+ *out_lifetime = lifetime;
+ *out_preferred = preferred;
}
-static gboolean
-init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr)
+gboolean
+_nmp_vt_cmd_plobj_init_from_nl_ip4_address (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache)
{
- struct nl_addr *nladdr = rtnl_addr_get_local (rtnladdr);
- struct nl_addr *nlpeer = rtnl_addr_get_peer (rtnladdr);
+ NMPlatformIP4Address *obj = (NMPlatformIP4Address *) _obj;
+ struct rtnl_addr *nlo = (struct rtnl_addr *) _nlo;
+ struct nl_addr *nladdr = rtnl_addr_get_local (nlo);
+ struct nl_addr *nlpeer = rtnl_addr_get_peer (nlo);
const char *label;
- g_return_val_if_fail (nladdr, FALSE);
+ if (!nladdr || nl_addr_get_len (nladdr) != sizeof (obj->address))
+ g_return_val_if_reached (FALSE);
- memset (address, 0, sizeof (*address));
+ obj->ifindex = rtnl_addr_get_ifindex (nlo);
+ obj->plen = rtnl_addr_get_prefixlen (nlo);
+ memcpy (&obj->address, nl_addr_get_binary_addr (nladdr), sizeof (obj->address));
- address->source = NM_IP_CONFIG_SOURCE_KERNEL;
- address->ifindex = rtnl_addr_get_ifindex (rtnladdr);
- address->plen = rtnl_addr_get_prefixlen (rtnladdr);
- _init_ip_address_lifetime ((NMPlatformIPAddress *) address, rtnladdr);
- if (!nladdr || nl_addr_get_len (nladdr) != sizeof (address->address)) {
- g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&address->address, nl_addr_get_binary_addr (nladdr), sizeof (address->address));
+ if (id_only)
+ return TRUE;
+
+ obj->source = NM_IP_CONFIG_SOURCE_KERNEL;
+ _nlo_rtnl_addr_get_lifetimes (nlo,
+ &obj->timestamp,
+ &obj->lifetime,
+ &obj->preferred);
if (nlpeer) {
- if (nl_addr_get_len (nlpeer) != sizeof (address->peer_address)) {
- g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&address->peer_address, nl_addr_get_binary_addr (nlpeer), sizeof (address->peer_address));
+ if (nl_addr_get_len (nlpeer) != sizeof (obj->peer_address))
+ g_warn_if_reached ();
+ else
+ memcpy (&obj->peer_address, nl_addr_get_binary_addr (nlpeer), sizeof (obj->peer_address));
}
- label = rtnl_addr_get_label (rtnladdr);
+ label = rtnl_addr_get_label (nlo);
/* Check for ':'; we're only interested in labels used as interface aliases */
if (label && strchr (label, ':'))
- g_strlcpy (address->label, label, sizeof (address->label));
+ g_strlcpy (obj->label, label, sizeof (obj->label));
return TRUE;
}
-static gboolean
-init_ip6_address (NMPlatformIP6Address *address, struct rtnl_addr *rtnladdr)
+gboolean
+_nmp_vt_cmd_plobj_init_from_nl_ip6_address (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache)
{
- struct nl_addr *nladdr = rtnl_addr_get_local (rtnladdr);
- struct nl_addr *nlpeer = rtnl_addr_get_peer (rtnladdr);
+ NMPlatformIP6Address *obj = (NMPlatformIP6Address *) _obj;
+ struct rtnl_addr *nlo = (struct rtnl_addr *) _nlo;
+ struct nl_addr *nladdr = rtnl_addr_get_local (nlo);
+ struct nl_addr *nlpeer = rtnl_addr_get_peer (nlo);
- memset (address, 0, sizeof (*address));
-
- address->source = NM_IP_CONFIG_SOURCE_KERNEL;
- address->ifindex = rtnl_addr_get_ifindex (rtnladdr);
- address->plen = rtnl_addr_get_prefixlen (rtnladdr);
- _init_ip_address_lifetime ((NMPlatformIPAddress *) address, rtnladdr);
- address->flags = rtnl_addr_get_flags (rtnladdr);
- if (!nladdr || nl_addr_get_len (nladdr) != sizeof (address->address)) {
+ if (!nladdr || nl_addr_get_len (nladdr) != sizeof (obj->address))
g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&address->address, nl_addr_get_binary_addr (nladdr), sizeof (address->address));
- if (nlpeer) {
- if (nl_addr_get_len (nlpeer) != sizeof (address->peer_address)) {
- g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&address->peer_address, nl_addr_get_binary_addr (nlpeer), sizeof (address->peer_address));
- }
- return TRUE;
-}
+ obj->ifindex = rtnl_addr_get_ifindex (nlo);
+ obj->plen = rtnl_addr_get_prefixlen (nlo);
+ memcpy (&obj->address, nl_addr_get_binary_addr (nladdr), sizeof (obj->address));
-static guint
-source_to_rtprot (NMIPConfigSource source)
-{
- switch (source) {
- case NM_IP_CONFIG_SOURCE_UNKNOWN:
- return RTPROT_UNSPEC;
- case NM_IP_CONFIG_SOURCE_KERNEL:
- return RTPROT_KERNEL;
- case NM_IP_CONFIG_SOURCE_DHCP:
- return RTPROT_DHCP;
- case NM_IP_CONFIG_SOURCE_RDISC:
- return RTPROT_RA;
+ if (id_only)
+ return TRUE;
- default:
- return RTPROT_STATIC;
- }
-}
+ obj->source = NM_IP_CONFIG_SOURCE_KERNEL;
+ _nlo_rtnl_addr_get_lifetimes (nlo,
+ &obj->timestamp,
+ &obj->lifetime,
+ &obj->preferred);
+ obj->flags = rtnl_addr_get_flags (nlo);
-static NMIPConfigSource
-rtprot_to_source (guint rtprot)
-{
- switch (rtprot) {
- case RTPROT_UNSPEC:
- return NM_IP_CONFIG_SOURCE_UNKNOWN;
- case RTPROT_REDIRECT:
- case RTPROT_KERNEL:
- return NM_IP_CONFIG_SOURCE_KERNEL;
- case RTPROT_RA:
- return NM_IP_CONFIG_SOURCE_RDISC;
- case RTPROT_DHCP:
- return NM_IP_CONFIG_SOURCE_DHCP;
-
- default:
- return NM_IP_CONFIG_SOURCE_USER;
+ if (nlpeer) {
+ if (nl_addr_get_len (nlpeer) != sizeof (obj->peer_address))
+ g_warn_if_reached ();
+ else
+ memcpy (&obj->peer_address, nl_addr_get_binary_addr (nlpeer), sizeof (obj->peer_address));
}
-}
-static gboolean
-_rtnl_route_is_default (const struct rtnl_route *rtnlroute)
-{
- struct nl_addr *dst;
-
- return rtnlroute
- && (dst = rtnl_route_get_dst ((struct rtnl_route *) rtnlroute))
- && nl_addr_get_prefixlen (dst) == 0;
+ return TRUE;
}
-static gboolean
-init_ip4_route (NMPlatformIP4Route *route, struct rtnl_route *rtnlroute)
+gboolean
+_nmp_vt_cmd_plobj_init_from_nl_ip4_route (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache)
{
+ NMPlatformIP4Route *obj = (NMPlatformIP4Route *) _obj;
+ struct rtnl_route *nlo = (struct rtnl_route *) _nlo;
struct nl_addr *dst, *gw;
struct rtnl_nexthop *nexthop;
+ struct nl_addr *pref_src;
- memset (route, 0, sizeof (*route));
-
- /* Multi-hop routes not supported. */
- if (rtnl_route_get_nnexthops (rtnlroute) != 1)
+ if (rtnl_route_get_type (nlo) != RTN_UNICAST ||
+ rtnl_route_get_table (nlo) != RT_TABLE_MAIN ||
+ rtnl_route_get_tos (nlo) != 0 ||
+ rtnl_route_get_nnexthops (nlo) != 1)
return FALSE;
- nexthop = rtnl_route_nexthop_n (rtnlroute, 0);
- dst = rtnl_route_get_dst (rtnlroute);
- gw = rtnl_route_nh_get_gateway (nexthop);
+ nexthop = rtnl_route_nexthop_n (nlo, 0);
+ if (!nexthop)
+ g_return_val_if_reached (FALSE);
+
+ dst = rtnl_route_get_dst (nlo);
+ if (!dst)
+ g_return_val_if_reached (FALSE);
- route->ifindex = rtnl_route_nh_get_ifindex (nexthop);
- route->plen = nl_addr_get_prefixlen (dst);
- /* Workaround on previous workaround for libnl default route prefixlen bug. */
if (nl_addr_get_len (dst)) {
- if (nl_addr_get_len (dst) != sizeof (route->network)) {
+ if (nl_addr_get_len (dst) != sizeof (obj->network))
g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&route->network, nl_addr_get_binary_addr (dst), sizeof (route->network));
+ memcpy (&obj->network, nl_addr_get_binary_addr (dst), sizeof (obj->network));
}
+ obj->ifindex = rtnl_route_nh_get_ifindex (nexthop);
+ obj->plen = nl_addr_get_prefixlen (dst);
+ obj->metric = rtnl_route_get_priority (nlo);
+ obj->scope_inv = nm_platform_route_scope_inv (rtnl_route_get_scope (nlo));
+
+ gw = rtnl_route_nh_get_gateway (nexthop);
if (gw) {
- if (nl_addr_get_len (gw) != sizeof (route->network)) {
- g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&route->gateway, nl_addr_get_binary_addr (gw), sizeof (route->gateway));
+ if (nl_addr_get_len (gw) != sizeof (obj->gateway))
+ g_warn_if_reached ();
+ else
+ memcpy (&obj->gateway, nl_addr_get_binary_addr (gw), sizeof (obj->gateway));
+ }
+ rtnl_route_get_metric (nlo, RTAX_ADVMSS, &obj->mss);
+ if (rtnl_route_get_flags (nlo) & RTM_F_CLONED) {
+ /* we must not straight way reject cloned routes, because we might have cached
+ * a non-cloned route. If we now receive an update of the route with the route
+ * being cloned, we must still return the object, so that we can remove the old
+ * one from the cache.
+ *
+ * This happens, because this route is not nmp_object_is_alive().
+ * */
+ obj->source = _NM_IP_CONFIG_SOURCE_RTM_F_CLONED;
+ } else
+ obj->source = _nm_ip_config_source_from_rtprot (rtnl_route_get_protocol (nlo));
+
+ pref_src = rtnl_route_get_pref_src (nlo);
+ if (pref_src) {
+ if (nl_addr_get_len (pref_src) != sizeof (obj->pref_src))
+ g_warn_if_reached ();
+ else
+ memcpy (&obj->pref_src, nl_addr_get_binary_addr (pref_src), sizeof (obj->pref_src));
}
- route->metric = rtnl_route_get_priority (rtnlroute);
- rtnl_route_get_metric (rtnlroute, RTAX_ADVMSS, &route->mss);
- route->source = rtprot_to_source (rtnl_route_get_protocol (rtnlroute));
return TRUE;
}
-static gboolean
-init_ip6_route (NMPlatformIP6Route *route, struct rtnl_route *rtnlroute)
+gboolean
+_nmp_vt_cmd_plobj_init_from_nl_ip6_route (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache)
{
+ NMPlatformIP6Route *obj = (NMPlatformIP6Route *) _obj;
+ struct rtnl_route *nlo = (struct rtnl_route *) _nlo;
struct nl_addr *dst, *gw;
struct rtnl_nexthop *nexthop;
- memset (route, 0, sizeof (*route));
-
- /* Multi-hop routes not supported. */
- if (rtnl_route_get_nnexthops (rtnlroute) != 1)
+ if (rtnl_route_get_type (nlo) != RTN_UNICAST ||
+ rtnl_route_get_table (nlo) != RT_TABLE_MAIN ||
+ rtnl_route_get_tos (nlo) != 0 ||
+ rtnl_route_get_nnexthops (nlo) != 1)
return FALSE;
- nexthop = rtnl_route_nexthop_n (rtnlroute, 0);
- dst = rtnl_route_get_dst (rtnlroute);
- gw = rtnl_route_nh_get_gateway (nexthop);
+ nexthop = rtnl_route_nexthop_n (nlo, 0);
+ if (!nexthop)
+ g_return_val_if_reached (FALSE);
+
+ dst = rtnl_route_get_dst (nlo);
+ if (!dst)
+ g_return_val_if_reached (FALSE);
- route->ifindex = rtnl_route_nh_get_ifindex (nexthop);
- route->plen = nl_addr_get_prefixlen (dst);
- /* Workaround on previous workaround for libnl default route prefixlen bug. */
if (nl_addr_get_len (dst)) {
- if (nl_addr_get_len (dst) != sizeof (route->network)) {
+ if (nl_addr_get_len (dst) != sizeof (obj->network))
g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&route->network, nl_addr_get_binary_addr (dst), sizeof (route->network));
+ memcpy (&obj->network, nl_addr_get_binary_addr (dst), sizeof (obj->network));
}
+ obj->ifindex = rtnl_route_nh_get_ifindex (nexthop);
+ obj->plen = nl_addr_get_prefixlen (dst);
+ obj->metric = rtnl_route_get_priority (nlo);
+
+ if (id_only)
+ return TRUE;
+
+ gw = rtnl_route_nh_get_gateway (nexthop);
if (gw) {
- if (nl_addr_get_len (gw) != sizeof (route->network)) {
- g_return_val_if_reached (FALSE);
- return FALSE;
- }
- memcpy (&route->gateway, nl_addr_get_binary_addr (gw), sizeof (route->gateway));
+ if (nl_addr_get_len (gw) != sizeof (obj->gateway))
+ g_warn_if_reached ();
+ else
+ memcpy (&obj->gateway, nl_addr_get_binary_addr (gw), sizeof (obj->gateway));
}
- route->metric = rtnl_route_get_priority (rtnlroute);
- rtnl_route_get_metric (rtnlroute, RTAX_ADVMSS, &route->mss);
- route->source = rtprot_to_source (rtnl_route_get_protocol (rtnlroute));
+ rtnl_route_get_metric (nlo, RTAX_ADVMSS, &obj->mss);
+ if (rtnl_route_get_flags (nlo) & RTM_F_CLONED)
+ obj->source = _NM_IP_CONFIG_SOURCE_RTM_F_CLONED;
+ else
+ obj->source = _nm_ip_config_source_from_rtprot (rtnl_route_get_protocol (nlo));
return TRUE;
}
-static char to_string_buffer[255];
-
-#define SET_AND_RETURN_STRING_BUFFER(...) \
- G_STMT_START { \
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), ## __VA_ARGS__); \
- return to_string_buffer; \
- } G_STMT_END
+/******************************************************************/
-static const char *
-to_string_link (NMPlatform *platform, struct rtnl_link *obj)
+static void
+do_emit_signal (NMPlatform *platform, const NMPObject *obj, NMPCacheOpsType cache_op, gboolean was_visible, NMPlatformReason reason)
{
- NMPlatformLink pl_obj;
+ gboolean is_visible;
+ NMPObject obj_clone;
+ const NMPClass *klass;
- if (init_link (platform, &pl_obj, obj))
- return nm_platform_link_to_string (&pl_obj);
- SET_AND_RETURN_STRING_BUFFER ("(invalid link %p)", obj);
-}
+ nm_assert (NM_IN_SET ((NMPlatformSignalChangeType) cache_op, (NMPlatformSignalChangeType) NMP_CACHE_OPS_UNCHANGED, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_SIGNAL_REMOVED));
-static const char *
-to_string_ip4_address (struct rtnl_addr *obj)
-{
- NMPlatformIP4Address pl_obj;
+ nm_assert (obj || cache_op == NMP_CACHE_OPS_UNCHANGED);
+ nm_assert (!obj || cache_op == NMP_CACHE_OPS_REMOVED || obj == nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, obj));
+ nm_assert (!obj || cache_op != NMP_CACHE_OPS_REMOVED || obj != nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, obj));
- if (init_ip4_address (&pl_obj, obj))
- return nm_platform_ip4_address_to_string (&pl_obj);
- SET_AND_RETURN_STRING_BUFFER ("(invalid ip4 address %p)", obj);
+ switch (cache_op) {
+ case NMP_CACHE_OPS_ADDED:
+ if (!nmp_object_is_visible (obj))
+ return;
+ break;
+ case NMP_CACHE_OPS_UPDATED:
+ is_visible = nmp_object_is_visible (obj);
+ if (!was_visible && is_visible)
+ cache_op = NMP_CACHE_OPS_ADDED;
+ else if (was_visible && !is_visible) {
+ /* This is a bit ugly. The object was visible and changed in a way that it became invisible.
+ * We raise a removed signal, but contrary to a real 'remove', @obj is already changed to be
+ * different from what it was when the user saw it the last time.
+ *
+ * The more correct solution would be to have cache_pre_hook() create a clone of the original
+ * value before it was changed to become invisible.
+ *
+ * But, don't bother. Probably nobody depends on the original values and only cares about the
+ * id properties (which are still correct).
+ */
+ cache_op = NMP_CACHE_OPS_REMOVED;
+ } else if (!is_visible)
+ return;
+ break;
+ case NMP_CACHE_OPS_REMOVED:
+ if (!was_visible)
+ return;
+ break;
+ default:
+ g_assert (cache_op == NMP_CACHE_OPS_UNCHANGED);
+ return;
+ }
+
+ klass = NMP_OBJECT_GET_CLASS (obj);
+
+ _LOGT ("emit signal %s %s: %s (%ld)",
+ klass->signal_type,
+ nm_platform_signal_change_type_to_string ((NMPlatformSignalChangeType) cache_op),
+ nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0),
+ (long) reason);
+
+ /* don't expose @obj directly, but clone the public fields. A signal handler might
+ * call back into NMPlatform which could invalidate (or modify) @obj. */
+ memcpy (&obj_clone.object, &obj->object, klass->sizeof_public);
+ g_signal_emit_by_name (platform, klass->signal_type, klass->obj_type, obj_clone.object.ifindex, &obj_clone.object, (NMPlatformSignalChangeType) cache_op, reason);
}
-static const char *
-to_string_ip6_address (struct rtnl_addr *obj)
+/******************************************************************/
+
+static DelayedActionType
+delayed_action_refresh_from_object_type (NMPObjectType obj_type)
{
- NMPlatformIP6Address pl_obj;
+ switch (obj_type) {
+ case NMP_OBJECT_TYPE_LINK: return DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS;
+ case NMP_OBJECT_TYPE_IP4_ADDRESS: return DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES;
+ case NMP_OBJECT_TYPE_IP6_ADDRESS: return DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES;
+ case NMP_OBJECT_TYPE_IP4_ROUTE: return DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES;
+ case NMP_OBJECT_TYPE_IP6_ROUTE: return DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES;
+ default: g_return_val_if_reached (DELAYED_ACTION_TYPE_NONE);
+ }
+}
- if (init_ip6_address (&pl_obj, obj))
- return nm_platform_ip6_address_to_string (&pl_obj);
- SET_AND_RETURN_STRING_BUFFER ("(invalid ip6 address %p)", obj);
+static NMPObjectType
+delayed_action_refresh_to_object_type (DelayedActionType action_type)
+{
+ switch (action_type) {
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS: return NMP_OBJECT_TYPE_LINK;
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES: return NMP_OBJECT_TYPE_IP4_ADDRESS;
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES: return NMP_OBJECT_TYPE_IP6_ADDRESS;
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES: return NMP_OBJECT_TYPE_IP4_ROUTE;
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES: return NMP_OBJECT_TYPE_IP6_ROUTE;
+ default: g_return_val_if_reached (NMP_OBJECT_TYPE_UNKNOWN);
+ }
}
static const char *
-to_string_ip4_route (struct rtnl_route *obj)
+delayed_action_to_string (DelayedActionType action_type)
+{
+ switch (action_type) {
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS : return "refresh-all-links";
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES : return "refresh-all-ip4-addresses";
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES : return "refresh-all-ip6-addresses";
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES : return "refresh-all-ip4-routes";
+ case DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES : return "refresh-all-ip6-routes";
+ case DELAYED_ACTION_TYPE_REFRESH_LINK : return "refresh-link";
+ case DELAYED_ACTION_TYPE_MASTER_CONNECTED : return "master-connected";
+ case DELAYED_ACTION_TYPE_READ_NETLINK : return "read-netlink";
+ default:
+ return "unknown";
+ }
+}
+
+#define _LOGT_delayed_action(action_type, arg, operation) \
+ _LOGT ("delayed-action: %s %s (%d) [%p / %d]", ""operation, delayed_action_to_string (action_type), (int) action_type, arg, GPOINTER_TO_INT (arg))
+
+static void
+delayed_action_handle_MASTER_CONNECTED (NMPlatform *platform, int master_ifindex)
{
- NMPlatformIP4Route pl_obj;
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ auto_nmp_obj NMPObject *obj_cache = NULL;
+ gboolean was_visible;
+ NMPCacheOpsType cache_op;
- if (init_ip4_route (&pl_obj, obj))
- return nm_platform_ip4_route_to_string (&pl_obj);
- SET_AND_RETURN_STRING_BUFFER ("(invalid ip4 route %p)", obj);
+ cache_op = nmp_cache_update_link_master_connected (priv->cache, master_ifindex, &obj_cache, &was_visible, cache_pre_hook, platform);
+ do_emit_signal (platform, obj_cache, cache_op, was_visible, NM_PLATFORM_REASON_INTERNAL);
}
-static const char *
-to_string_ip6_route (struct rtnl_route *obj)
+static void
+delayed_action_handle_REFRESH_LINK (NMPlatform *platform, int ifindex)
{
- NMPlatformIP6Route pl_obj;
-
- if (init_ip6_route (&pl_obj, obj))
- return nm_platform_ip6_route_to_string (&pl_obj);
- SET_AND_RETURN_STRING_BUFFER ("(invalid ip6 route %p)", obj);
+ do_request_link (platform, ifindex, NULL, FALSE);
}
-static const char *
-to_string_object_with_type (NMPlatform *platform, struct nl_object *obj, ObjectType type)
+static void
+delayed_action_handle_REFRESH_ALL (NMPlatform *platform, DelayedActionType flags)
{
- switch (type) {
- case OBJECT_TYPE_LINK:
- return to_string_link (platform, (struct rtnl_link *) obj);
- case OBJECT_TYPE_IP4_ADDRESS:
- return to_string_ip4_address ((struct rtnl_addr *) obj);
- case OBJECT_TYPE_IP6_ADDRESS:
- return to_string_ip6_address ((struct rtnl_addr *) obj);
- case OBJECT_TYPE_IP4_ROUTE:
- return to_string_ip4_route ((struct rtnl_route *) obj);
- case OBJECT_TYPE_IP6_ROUTE:
- return to_string_ip6_route ((struct rtnl_route *) obj);
- default:
- SET_AND_RETURN_STRING_BUFFER ("(unknown netlink object %p)", obj);
- }
+ do_request_all (platform, flags, FALSE);
}
-static const char *
-to_string_object (NMPlatform *platform, struct nl_object *obj)
+static void
+delayed_action_handle_READ_NETLINK (NMPlatform *platform)
{
- return to_string_object_with_type (platform, obj, object_type_from_nl_object (obj));
+ event_handler_read_netlink_all (platform, TRUE);
}
-#undef SET_AND_RETURN_STRING_BUFFER
+static gboolean
+delayed_action_handle_one (NMPlatform *platform)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ gpointer user_data;
-/******************************************************************/
+ if (priv->delayed_action.flags == DELAYED_ACTION_TYPE_NONE) {
+ nm_clear_g_source (&priv->delayed_action.idle_id);
+ return FALSE;
+ }
-/* Object and cache manipulation */
+ /* First process DELAYED_ACTION_TYPE_MASTER_CONNECTED actions.
+ * This type of action is entirely cache-internal and is here to resolve a
+ * cache inconsistency. It should be fixed right away. */
+ if (NM_FLAGS_HAS (priv->delayed_action.flags, DELAYED_ACTION_TYPE_MASTER_CONNECTED)) {
+ nm_assert (priv->delayed_action.list_master_connected->len > 0);
-static const char *signal_by_type_and_status[__OBJECT_TYPE_LAST] = {
- [OBJECT_TYPE_LINK] = NM_PLATFORM_SIGNAL_LINK_CHANGED,
- [OBJECT_TYPE_IP4_ADDRESS] = NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
- [OBJECT_TYPE_IP6_ADDRESS] = NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
- [OBJECT_TYPE_IP4_ROUTE] = NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED,
- [OBJECT_TYPE_IP6_ROUTE] = NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED,
-};
+ user_data = priv->delayed_action.list_master_connected->pdata[0];
+ g_ptr_array_remove_index_fast (priv->delayed_action.list_master_connected, 0);
+ if (priv->delayed_action.list_master_connected->len == 0)
+ priv->delayed_action.flags &= ~DELAYED_ACTION_TYPE_MASTER_CONNECTED;
+ nm_assert (_nm_utils_ptrarray_find_first (priv->delayed_action.list_master_connected->pdata, priv->delayed_action.list_master_connected->len, user_data) < 0);
-static struct nl_cache *
-choose_cache_by_type (NMPlatform *platform, ObjectType object_type)
-{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ _LOGT_delayed_action (DELAYED_ACTION_TYPE_MASTER_CONNECTED, user_data, "handle");
+ delayed_action_handle_MASTER_CONNECTED (platform, GPOINTER_TO_INT (user_data));
+ return TRUE;
+ }
+ nm_assert (priv->delayed_action.list_master_connected->len == 0);
+
+ /* Next we prefer read-netlink, because the buffer size is limited and we want to process events
+ * from netlink early. */
+ if (NM_FLAGS_HAS (priv->delayed_action.flags, DELAYED_ACTION_TYPE_READ_NETLINK)) {
+ _LOGT_delayed_action (DELAYED_ACTION_TYPE_READ_NETLINK, NULL, "handle");
+ priv->delayed_action.flags &= ~DELAYED_ACTION_TYPE_READ_NETLINK;
+ delayed_action_handle_READ_NETLINK (platform);
+ return TRUE;
+ }
- switch (object_type) {
- case OBJECT_TYPE_LINK:
- return priv->link_cache;
- case OBJECT_TYPE_IP4_ADDRESS:
- case OBJECT_TYPE_IP6_ADDRESS:
- return priv->address_cache;
- case OBJECT_TYPE_IP4_ROUTE:
- case OBJECT_TYPE_IP6_ROUTE:
- return priv->route_cache;
- default:
- g_return_val_if_reached (NULL);
- return NULL;
+ if (NM_FLAGS_ANY (priv->delayed_action.flags, DELAYED_ACTION_TYPE_REFRESH_ALL)) {
+ DelayedActionType flags, iflags;
+
+ flags = priv->delayed_action.flags & DELAYED_ACTION_TYPE_REFRESH_ALL;
+
+ priv->delayed_action.flags &= ~DELAYED_ACTION_TYPE_REFRESH_ALL;
+
+ if (_LOGT_ENABLED ()) {
+ for (iflags = (DelayedActionType) 0x1LL; iflags <= DELAYED_ACTION_TYPE_MAX; iflags <<= 1) {
+ if (NM_FLAGS_HAS (flags, iflags))
+ _LOGT_delayed_action (iflags, NULL, "handle");
+ }
+ }
+
+ delayed_action_handle_REFRESH_ALL (platform, flags);
+ return TRUE;
}
+
+ nm_assert (priv->delayed_action.flags == DELAYED_ACTION_TYPE_REFRESH_LINK);
+ nm_assert (priv->delayed_action.list_refresh_link->len > 0);
+
+ user_data = priv->delayed_action.list_refresh_link->pdata[0];
+ g_ptr_array_remove_index_fast (priv->delayed_action.list_refresh_link, 0);
+ if (priv->delayed_action.list_master_connected->len == 0)
+ priv->delayed_action.flags &= ~DELAYED_ACTION_TYPE_REFRESH_LINK;
+ nm_assert (_nm_utils_ptrarray_find_first (priv->delayed_action.list_refresh_link->pdata, priv->delayed_action.list_refresh_link->len, user_data) < 0);
+
+ _LOGT_delayed_action (DELAYED_ACTION_TYPE_REFRESH_LINK, user_data, "handle");
+
+ delayed_action_handle_REFRESH_LINK (platform, GPOINTER_TO_INT (user_data));
+
+ return TRUE;
}
-static struct nl_cache *
-choose_cache (NMPlatform *platform, struct nl_object *object)
+static gboolean
+delayed_action_handle_all (NMPlatform *platform, gboolean read_netlink)
{
- return choose_cache_by_type (platform, object_type_from_nl_object (object));
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ gboolean any = FALSE;
+
+ nm_clear_g_source (&priv->delayed_action.idle_id);
+ priv->delayed_action.is_handling++;
+ if (read_netlink)
+ delayed_action_schedule (platform, DELAYED_ACTION_TYPE_READ_NETLINK, NULL);
+ while (delayed_action_handle_one (platform))
+ any = TRUE;
+ priv->delayed_action.is_handling--;
+ return any;
}
static gboolean
-object_has_ifindex (struct nl_object *object, int ifindex)
-{
- switch (object_type_from_nl_object (object)) {
- case OBJECT_TYPE_IP4_ADDRESS:
- case OBJECT_TYPE_IP6_ADDRESS:
- return ifindex == rtnl_addr_get_ifindex ((struct rtnl_addr *) object);
- case OBJECT_TYPE_IP4_ROUTE:
- case OBJECT_TYPE_IP6_ROUTE:
- {
- struct rtnl_route *rtnlroute = (struct rtnl_route *) object;
- struct rtnl_nexthop *nexthop;
+delayed_action_handle_idle (gpointer user_data)
+{
+ NM_LINUX_PLATFORM_GET_PRIVATE (user_data)->delayed_action.idle_id = 0;
+ delayed_action_handle_all (user_data, FALSE);
+ return G_SOURCE_REMOVE;
+}
+
+static void
+delayed_action_schedule (NMPlatform *platform, DelayedActionType action_type, gpointer user_data)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ DelayedActionType iflags;
+
+ nm_assert (action_type != DELAYED_ACTION_TYPE_NONE);
+
+ if (NM_FLAGS_HAS (action_type, DELAYED_ACTION_TYPE_REFRESH_LINK)) {
+ nm_assert (nm_utils_is_power_of_two (action_type));
+ if (_nm_utils_ptrarray_find_first (priv->delayed_action.list_refresh_link->pdata, priv->delayed_action.list_refresh_link->len, user_data) < 0)
+ g_ptr_array_add (priv->delayed_action.list_refresh_link, user_data);
+ } else if (NM_FLAGS_HAS (action_type, DELAYED_ACTION_TYPE_MASTER_CONNECTED)) {
+ nm_assert (nm_utils_is_power_of_two (action_type));
+ if (_nm_utils_ptrarray_find_first (priv->delayed_action.list_master_connected->pdata, priv->delayed_action.list_master_connected->len, user_data) < 0)
+ g_ptr_array_add (priv->delayed_action.list_master_connected, user_data);
+ } else
+ nm_assert (!user_data);
- if (rtnl_route_get_nnexthops (rtnlroute) != 1)
- return FALSE;
- nexthop = rtnl_route_nexthop_n (rtnlroute, 0);
+ priv->delayed_action.flags |= action_type;
- return ifindex == rtnl_route_nh_get_ifindex (nexthop);
+ if (_LOGT_ENABLED ()) {
+ for (iflags = (DelayedActionType) 0x1LL; iflags <= DELAYED_ACTION_TYPE_MAX; iflags <<= 1) {
+ if (NM_FLAGS_HAS (action_type, iflags))
+ _LOGT_delayed_action (iflags, user_data, "schedule");
}
- default:
- g_assert_not_reached ();
}
+
+ if (priv->delayed_action.is_handling == 0 && priv->delayed_action.idle_id == 0)
+ priv->delayed_action.idle_id = g_idle_add (delayed_action_handle_idle, platform);
}
-static gboolean refresh_object (NMPlatform *platform, struct nl_object *object, gboolean removed, NMPlatformReason reason);
+/******************************************************************/
static void
-check_cache_items (NMPlatform *platform, struct nl_cache *cache, int ifindex)
+cache_prune_candidates_record_all (NMPlatform *platform, NMPObjectType obj_type)
{
- auto_nl_cache struct nl_cache *cloned_cache = nl_cache_clone (cache);
- struct nl_object *object;
- GPtrArray *objects_to_refresh = g_ptr_array_new_with_free_func ((GDestroyNotify) nl_object_put);
- guint i;
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- for (object = nl_cache_get_first (cloned_cache); object; object = nl_cache_get_next (object)) {
- if (object_has_ifindex (object, ifindex)) {
- nl_object_get (object);
- g_ptr_array_add (objects_to_refresh, object);
- }
- }
+ priv->prune_candidates = nmp_cache_lookup_all_to_hash (priv->cache,
+ nmp_cache_id_init_object_type (NMP_CACHE_ID_STATIC, obj_type, FALSE),
+ priv->prune_candidates);
+ _LOGT ("cache-prune: record %s (now %u candidates)", nmp_class_from_type (obj_type)->obj_type_name,
+ priv->prune_candidates ? g_hash_table_size (priv->prune_candidates) : 0);
+}
+
+static void
+cache_prune_candidates_record_one (NMPlatform *platform, NMPObject *obj)
+{
+ NMLinuxPlatformPrivate *priv;
+
+ if (!obj)
+ return;
+
+ priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- for (i = 0; i < objects_to_refresh->len; i++)
- refresh_object (platform, objects_to_refresh->pdata[i], TRUE, NM_PLATFORM_REASON_CACHE_CHECK);
+ if (!priv->prune_candidates)
+ priv->prune_candidates = g_hash_table_new_full (NULL, NULL, (GDestroyNotify) nmp_object_unref, NULL);
- g_ptr_array_free (objects_to_refresh, TRUE);
+ if (_LOGT_ENABLED () && !g_hash_table_contains (priv->prune_candidates, obj))
+ _LOGT ("cache-prune: record-one: %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ALL, NULL, 0));
+ g_hash_table_add (priv->prune_candidates, nmp_object_ref (obj));
}
static void
-announce_object (NMPlatform *platform, const struct nl_object *object, NMPlatformSignalChangeType change_type, NMPlatformReason reason)
+cache_prune_candidates_drop (NMPlatform *platform, const NMPObject *obj)
+{
+ NMLinuxPlatformPrivate *priv;
+
+ if (!obj)
+ return;
+
+ priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ if (priv->prune_candidates) {
+ if (_LOGT_ENABLED () && g_hash_table_contains (priv->prune_candidates, obj))
+ _LOGT ("cache-prune: drop-one: %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ALL, NULL, 0));
+ g_hash_table_remove (priv->prune_candidates, obj);
+ }
+}
+
+static void
+cache_prune_candidates_prune (NMPlatform *platform)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- ObjectType object_type = object_type_from_nl_object (object);
- const char *sig = signal_by_type_and_status[object_type];
+ GHashTable *prune_candidates;
+ GHashTableIter iter;
+ const NMPObject *obj;
+ gboolean was_visible;
+ NMPCacheOpsType cache_op;
- switch (object_type) {
- case OBJECT_TYPE_LINK:
- {
- struct rtnl_link *rtnl_link = (struct rtnl_link *) object;
- NMPlatformLink device;
+ if (!priv->prune_candidates)
+ return;
-#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
- /* If we ever see a link with valid IPv6 link-local address
- * generation modes, the kernel supports it.
- */
- if (priv->support_user_ipv6ll == 0) {
- uint8_t mode;
+ prune_candidates = priv->prune_candidates;
+ priv->prune_candidates = NULL;
- if (rtnl_link_inet6_get_addr_gen_mode (rtnl_link, &mode) == 0)
- priv->support_user_ipv6ll = 1;
- }
-#endif
+ g_hash_table_iter_init (&iter, prune_candidates);
+ while (g_hash_table_iter_next (&iter, (gpointer *)&obj, NULL)) {
+ auto_nmp_obj NMPObject *obj_cache = NULL;
- if (!init_link (platform, &device, rtnl_link))
- return;
+ _LOGT ("cache-prune: prune %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ALL, NULL, 0));
+ cache_op = nmp_cache_remove (priv->cache, obj, TRUE, &obj_cache, &was_visible, cache_pre_hook, platform);
+ do_emit_signal (platform, obj_cache, cache_op, was_visible, NM_PLATFORM_REASON_INTERNAL);
+ }
- /* Skip hardware devices not yet discovered by udev. They will be
- * announced by udev_device_added(). This doesn't apply to removed
- * devices, as those come either from udev_device_removed(),
- * event_notification() or link_delete() which block the announcment
- * themselves when appropriate.
- */
- switch (change_type) {
- case NM_PLATFORM_SIGNAL_ADDED:
- case NM_PLATFORM_SIGNAL_CHANGED:
- if (!link_is_software (rtnl_link) && !device.driver)
- return;
- break;
- default:
- break;
- }
+ g_hash_table_unref (prune_candidates);
+}
- /* Link deletion or setting down is sometimes accompanied by address
- * and/or route deletion.
- *
- * More precisely, kernel removes routes when interface goes !IFF_UP and
- * removes both addresses and routes when interface is removed.
- */
- switch (change_type) {
- case NM_PLATFORM_SIGNAL_CHANGED:
- if (!device.connected)
- check_cache_items (platform, priv->route_cache, device.ifindex);
- break;
- case NM_PLATFORM_SIGNAL_REMOVED:
- check_cache_items (platform, priv->address_cache, device.ifindex);
- check_cache_items (platform, priv->route_cache, device.ifindex);
- g_hash_table_remove (priv->wifi_data, GINT_TO_POINTER (device.ifindex));
- break;
- default:
- break;
- }
+static void
+cache_delayed_deletion_prune (NMPlatform *platform)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ GPtrArray *prune_list = NULL;
+ GHashTableIter iter;
+ guint i;
+ NMPObject *obj;
- g_signal_emit_by_name (platform, sig, device.ifindex, &device, change_type, reason);
- }
+ if (g_hash_table_size (priv->delayed_deletion) == 0)
return;
- case OBJECT_TYPE_IP4_ADDRESS:
- {
- NMPlatformIP4Address address;
- /* Address deletion is sometimes accompanied by route deletion. We need to
- * check all routes belonging to the same interface.
- */
- switch (change_type) {
- case NM_PLATFORM_SIGNAL_REMOVED:
- check_cache_items (platform,
- priv->route_cache,
- rtnl_addr_get_ifindex ((struct rtnl_addr *) object));
- break;
- default:
- break;
- }
+ g_hash_table_iter_init (&iter, priv->delayed_deletion);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &obj)) {
+ if (obj) {
+ if (!prune_list)
+ prune_list = g_ptr_array_new_full (g_hash_table_size (priv->delayed_deletion), (GDestroyNotify) nmp_object_unref);
+ g_ptr_array_add (prune_list, nmp_object_ref (obj));
+ }
+ }
- if (!_address_match ((struct rtnl_addr *) object, AF_INET, 0)) {
- nm_log_dbg (LOGD_PLATFORM, "skip announce unmatching IP4 address %s", to_string_ip4_address ((struct rtnl_addr *) object));
- return;
- }
- if (!init_ip4_address (&address, (struct rtnl_addr *) object))
- return;
- g_signal_emit_by_name (platform, sig, address.ifindex, &address, change_type, reason);
+ g_hash_table_remove_all (priv->delayed_deletion);
+
+ if (prune_list) {
+ for (i = 0; i < prune_list->len; i++) {
+ obj = prune_list->pdata[i];
+ _LOGT ("delayed-deletion: delete %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ cache_remove_netlink (platform, obj, NULL, NULL, NM_PLATFORM_REASON_EXTERNAL);
}
- return;
- case OBJECT_TYPE_IP6_ADDRESS:
- {
- NMPlatformIP6Address address;
+ g_ptr_array_unref (prune_list);
+ }
+}
- if (!_address_match ((struct rtnl_addr *) object, AF_INET6, 0)) {
- nm_log_dbg (LOGD_PLATFORM, "skip announce unmatching IP6 address %s", to_string_ip6_address ((struct rtnl_addr *) object));
- return;
+static void
+cache_pre_hook (NMPCache *cache, const NMPObject *old, const NMPObject *new, NMPCacheOpsType ops_type, gpointer user_data)
+{
+ NMPlatform *platform = NM_PLATFORM (user_data);
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPClass *klass;
+ char str_buf[sizeof (_nm_platform_to_string_buffer)];
+ char str_buf2[sizeof (_nm_platform_to_string_buffer)];
+
+ nm_assert (old || new);
+ nm_assert (NM_IN_SET (ops_type, NMP_CACHE_OPS_ADDED, NMP_CACHE_OPS_REMOVED, NMP_CACHE_OPS_UPDATED));
+ nm_assert (ops_type != NMP_CACHE_OPS_ADDED || (old == NULL && NMP_OBJECT_IS_VALID (new) && nmp_object_is_alive (new)));
+ nm_assert (ops_type != NMP_CACHE_OPS_REMOVED || (new == NULL && NMP_OBJECT_IS_VALID (old) && nmp_object_is_alive (old)));
+ nm_assert (ops_type != NMP_CACHE_OPS_UPDATED || (NMP_OBJECT_IS_VALID (old) && nmp_object_is_alive (old) && NMP_OBJECT_IS_VALID (new) && nmp_object_is_alive (new)));
+ nm_assert (new == NULL || old == NULL || nmp_object_id_equal (new, old));
+
+ klass = old ? NMP_OBJECT_GET_CLASS (old) : NMP_OBJECT_GET_CLASS (new);
+
+ nm_assert (klass == (new ? NMP_OBJECT_GET_CLASS (new) : NMP_OBJECT_GET_CLASS (old)));
+
+ _LOGT ("update-cache-%s: %s: %s%s%s",
+ klass->obj_type_name,
+ (ops_type == NMP_CACHE_OPS_UPDATED
+ ? "UPDATE"
+ : (ops_type == NMP_CACHE_OPS_REMOVED
+ ? "REMOVE"
+ : (ops_type == NMP_CACHE_OPS_ADDED) ? "ADD" : "???")),
+ (ops_type != NMP_CACHE_OPS_ADDED
+ ? nmp_object_to_string (old, NMP_OBJECT_TO_STRING_ALL, str_buf2, sizeof (str_buf2))
+ : nmp_object_to_string (new, NMP_OBJECT_TO_STRING_ALL, str_buf2, sizeof (str_buf2))),
+ (ops_type == NMP_CACHE_OPS_UPDATED) ? " -> " : "",
+ (ops_type == NMP_CACHE_OPS_UPDATED
+ ? nmp_object_to_string (new, NMP_OBJECT_TO_STRING_ALL, str_buf, sizeof (str_buf))
+ : ""));
+
+ switch (klass->obj_type) {
+ case NMP_OBJECT_TYPE_LINK:
+ {
+ /* check whether changing a slave link can cause a master link (bridge or bond) to go up/down */
+ if ( old
+ && nmp_cache_link_connected_needs_toggle_by_ifindex (priv->cache, old->link.master, new, old))
+ delayed_action_schedule (platform, DELAYED_ACTION_TYPE_MASTER_CONNECTED, GINT_TO_POINTER (old->link.master));
+ if ( new
+ && (!old || old->link.master != new->link.master)
+ && nmp_cache_link_connected_needs_toggle_by_ifindex (priv->cache, new->link.master, new, old))
+ delayed_action_schedule (platform, DELAYED_ACTION_TYPE_MASTER_CONNECTED, GINT_TO_POINTER (new->link.master));
+ }
+ {
+ /* check whether we are about to change a master link that needs toggling connected state. */
+ if ( new /* <-- nonsensical, make coverity happy */
+ && nmp_cache_link_connected_needs_toggle (cache, new, new, old))
+ delayed_action_schedule (platform, DELAYED_ACTION_TYPE_MASTER_CONNECTED, GINT_TO_POINTER (new->link.ifindex));
+ }
+ {
+ int ifindex = 0;
+
+ /* if we remove a link (from netlink), we must refresh the addresses and routes */
+ if ( ops_type == NMP_CACHE_OPS_REMOVED
+ && old /* <-- nonsensical, make coverity happy */)
+ ifindex = old->link.ifindex;
+ else if ( ops_type == NMP_CACHE_OPS_UPDATED
+ && old && new /* <-- nonsensical, make coverity happy */
+ && !new->_link.netlink.is_in_netlink
+ && new->_link.netlink.is_in_netlink != old->_link.netlink.is_in_netlink)
+ ifindex = new->link.ifindex;
+
+ if (ifindex > 0) {
+ delayed_action_schedule (platform,
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
+ NULL);
}
- if (!init_ip6_address (&address, (struct rtnl_addr *) object))
- return;
- g_signal_emit_by_name (platform, sig, address.ifindex, &address, change_type, reason);
}
- return;
- case OBJECT_TYPE_IP4_ROUTE:
{
- NMPlatformIP4Route route;
-
- if (reason == _NM_PLATFORM_REASON_CACHE_CHECK_INTERNAL)
- return;
-
- if (!_route_match ((struct rtnl_route *) object, AF_INET, 0, FALSE)) {
- nm_log_dbg (LOGD_PLATFORM, "skip announce unmatching IP4 route %s", to_string_ip4_route ((struct rtnl_route *) object));
- return;
+ /* if a link goes down, we must refresh routes */
+ if ( ops_type == NMP_CACHE_OPS_UPDATED
+ && old && new /* <-- nonsensical, make coverity happy */
+ && old->_link.netlink.is_in_netlink
+ && NM_FLAGS_HAS (old->link.flags, IFF_LOWER_UP)
+ && new->_link.netlink.is_in_netlink
+ && !NM_FLAGS_HAS (new->link.flags, IFF_LOWER_UP)) {
+ delayed_action_schedule (platform,
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
+ NULL);
}
- if (init_ip4_route (&route, (struct rtnl_route *) object))
- g_signal_emit_by_name (platform, sig, route.ifindex, &route, change_type, reason);
}
- return;
- case OBJECT_TYPE_IP6_ROUTE:
{
- NMPlatformIP6Route route;
-
- if (reason == _NM_PLATFORM_REASON_CACHE_CHECK_INTERNAL)
- return;
+ /* on enslave/release, we also refresh the master. */
+ int ifindex1 = 0, ifindex2 = 0;
+ gboolean changed_master, changed_connected;
+
+ changed_master = (new && new->_link.netlink.is_in_netlink && new->link.master > 0 ? new->link.master : 0)
+ != (old && old->_link.netlink.is_in_netlink && old->link.master > 0 ? old->link.master : 0);
+ changed_connected = (new && new->_link.netlink.is_in_netlink ? NM_FLAGS_HAS (new->link.flags, IFF_LOWER_UP) : 2)
+ != (old && old->_link.netlink.is_in_netlink ? NM_FLAGS_HAS (old->link.flags, IFF_LOWER_UP) : 2);
+
+ if (changed_master || changed_connected) {
+ ifindex1 = (old && old->_link.netlink.is_in_netlink && old->link.master > 0) ? old->link.master : 0;
+ ifindex2 = (new && new->_link.netlink.is_in_netlink && new->link.master > 0) ? new->link.master : 0;
+
+ if (ifindex1 > 0)
+ delayed_action_schedule (platform, DELAYED_ACTION_TYPE_REFRESH_LINK, GINT_TO_POINTER (ifindex1));
+ if (ifindex2 > 0 && ifindex1 != ifindex2)
+ delayed_action_schedule (platform, DELAYED_ACTION_TYPE_REFRESH_LINK, GINT_TO_POINTER (ifindex2));
+ }
- if (!_route_match ((struct rtnl_route *) object, AF_INET6, 0, FALSE)) {
- nm_log_dbg (LOGD_PLATFORM, "skip announce unmatching IP6 route %s", to_string_ip6_route ((struct rtnl_route *) object));
- return;
+ }
+ break;
+ case NMP_OBJECT_TYPE_IP4_ADDRESS:
+ case NMP_OBJECT_TYPE_IP6_ADDRESS:
+ {
+ /* Address deletion is sometimes accompanied by route deletion. We need to
+ * check all routes belonging to the same interface. */
+ if (ops_type == NMP_CACHE_OPS_REMOVED) {
+ delayed_action_schedule (platform,
+ (klass->obj_type == NMP_OBJECT_TYPE_IP4_ADDRESS)
+ ? DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES
+ : DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
+ NULL);
}
- if (init_ip6_route (&route, (struct rtnl_route *) object))
- g_signal_emit_by_name (platform, sig, route.ifindex, &route, change_type, reason);
}
- return;
default:
- g_return_if_reached ();
+ break;
}
}
-static struct nl_object * build_rtnl_link (int ifindex, const char *name, NMLinkType type);
+static NMPCacheOpsType
+cache_remove_netlink (NMPlatform *platform, const NMPObject *obj_needle, NMPObject **out_obj_cache, gboolean *out_was_visible, NMPlatformReason reason)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ NMPObject *obj_cache;
+ gboolean was_visible;
+ NMPCacheOpsType cache_op;
-static gboolean
-refresh_object (NMPlatform *platform, struct nl_object *object, gboolean removed, NMPlatformReason reason)
+ cache_op = nmp_cache_remove_netlink (priv->cache, obj_needle, &obj_cache, &was_visible, cache_pre_hook, platform);
+ do_emit_signal (platform, obj_cache, cache_op, was_visible, NM_PLATFORM_REASON_INTERNAL);
+
+ if (out_obj_cache)
+ *out_obj_cache = obj_cache;
+ else
+ nmp_object_unref (obj_cache);
+ if (out_was_visible)
+ *out_was_visible = was_visible;
+
+ return cache_op;
+}
+
+static NMPCacheOpsType
+cache_update_netlink (NMPlatform *platform, NMPObject *obj, NMPObject **out_obj_cache, gboolean *out_was_visible, NMPlatformReason reason)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- auto_nl_object struct nl_object *cached_object = NULL;
- auto_nl_object struct nl_object *kernel_object = NULL;
- struct nl_cache *cache;
- int nle;
+ NMPObject *obj_cache;
+ gboolean was_visible;
+ NMPCacheOpsType cache_op;
- cache = choose_cache (platform, object);
- cached_object = nm_nl_cache_search (cache, object);
- kernel_object = get_kernel_object (priv->nlh, object);
+ /* This is basically a convenience method to call nmp_cache_update() and do_emit_signal()
+ * at once. */
- if (removed) {
- if (kernel_object)
- return TRUE;
+ cache_op = nmp_cache_update_netlink (priv->cache, obj, &obj_cache, &was_visible, cache_pre_hook, platform);
+ do_emit_signal (platform, obj_cache, cache_op, was_visible, reason);
- /* Only announce object if it was still in the cache. */
- if (cached_object) {
- nl_cache_remove (cached_object);
+ if (out_obj_cache)
+ *out_obj_cache = obj_cache;
+ else
+ nmp_object_unref (obj_cache);
+ if (out_was_visible)
+ *out_was_visible = was_visible;
- announce_object (platform, cached_object, NM_PLATFORM_SIGNAL_REMOVED, reason);
- }
- } else {
- ObjectType type;
+ return cache_op;
+}
- if (!kernel_object)
- return FALSE;
+/******************************************************************/
- /* Unsupported object types should never have reached the caches */
- type = object_type_from_nl_object (kernel_object);
- g_assert (type != OBJECT_TYPE_UNKNOWN);
+static void
+_new_sequence_number (NMPlatform *platform, guint32 seq)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- hack_empty_master_iff_lower_up (platform, kernel_object);
+ _LOGT ("_new_sequence_number(): new sequence number %u", seq);
- if (cached_object)
- nl_cache_remove (cached_object);
- nle = nl_cache_add (cache, kernel_object);
- if (nle) {
- nm_log_dbg (LOGD_PLATFORM, "refresh_object(reason %d) failed during nl_cache_add with %d", reason, nle);
- return FALSE;
- }
+ priv->nlh_seq_expect = seq;
+}
+
+static void
+do_request_link (NMPlatform *platform, int ifindex, const char *name, gboolean handle_delayed_action)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ guint32 seq;
- announce_object (platform, kernel_object, cached_object ? NM_PLATFORM_SIGNAL_CHANGED : NM_PLATFORM_SIGNAL_ADDED, reason);
+ _LOGT ("do_request_link (%d,%s)", ifindex, name ? name : "");
- /* Refresh the master device (even on enslave/release) */
- if (type == OBJECT_TYPE_LINK) {
- int kernel_master = rtnl_link_get_master ((struct rtnl_link *) kernel_object);
- int cached_master = cached_object ? rtnl_link_get_master ((struct rtnl_link *) cached_object) : 0;
- struct nl_object *master_object;
+ if (ifindex > 0) {
+ NMPObject *obj;
- if (kernel_master) {
- master_object = build_rtnl_link (kernel_master, NULL, NM_LINK_TYPE_NONE);
- refresh_object (platform, master_object, FALSE, NM_PLATFORM_REASON_INTERNAL);
- nl_object_put (master_object);
- }
- if (cached_master && cached_master != kernel_master) {
- master_object = build_rtnl_link (cached_master, NULL, NM_LINK_TYPE_NONE);
- refresh_object (platform, master_object, FALSE, NM_PLATFORM_REASON_INTERNAL);
- nl_object_put (master_object);
+ cache_prune_candidates_record_one (platform,
+ (NMPObject *) nmp_cache_lookup_link (priv->cache, ifindex));
+ obj = nmp_object_new_link (ifindex);
+ _LOGT ("delayed-deletion: protect object %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ g_hash_table_insert (priv->delayed_deletion, obj, NULL);
+ }
+
+ event_handler_read_netlink_all (platform, FALSE);
+
+ if (_nl_sock_request_link (platform, priv->nlh_event, ifindex, name, &seq) == 0)
+ _new_sequence_number (platform, seq);
+
+ event_handler_read_netlink_all (platform, TRUE);
+
+ cache_delayed_deletion_prune (platform);
+ cache_prune_candidates_prune (platform);
+
+ if (handle_delayed_action)
+ delayed_action_handle_all (platform, FALSE);
+}
+
+static void
+do_request_one_type (NMPlatform *platform, NMPObjectType obj_type, gboolean handle_delayed_action)
+{
+ do_request_all (platform, delayed_action_refresh_from_object_type (obj_type), handle_delayed_action);
+}
+
+static void
+do_request_all (NMPlatform *platform, DelayedActionType action_type, gboolean handle_delayed_action)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ guint32 seq;
+ DelayedActionType iflags;
+
+ nm_assert (!NM_FLAGS_ANY (action_type, ~DELAYED_ACTION_TYPE_REFRESH_ALL));
+ action_type &= DELAYED_ACTION_TYPE_REFRESH_ALL;
+
+ for (iflags = (DelayedActionType) 0x1LL; iflags <= DELAYED_ACTION_TYPE_MAX; iflags <<= 1) {
+ if (NM_FLAGS_HAS (action_type, iflags))
+ cache_prune_candidates_record_all (platform, delayed_action_refresh_to_object_type (iflags));
+ }
+
+ for (iflags = (DelayedActionType) 0x1LL; iflags <= DELAYED_ACTION_TYPE_MAX; iflags <<= 1) {
+ if (NM_FLAGS_HAS (action_type, iflags)) {
+ NMPObjectType obj_type = delayed_action_refresh_to_object_type (iflags);
+
+ /* clear any delayed action that request a refresh of this object type. */
+ priv->delayed_action.flags &= ~iflags;
+ if (obj_type == NMP_OBJECT_TYPE_LINK) {
+ priv->delayed_action.flags &= ~DELAYED_ACTION_TYPE_REFRESH_LINK;
+ g_ptr_array_set_size (priv->delayed_action.list_refresh_link, 0);
}
+
+ event_handler_read_netlink_all (platform, FALSE);
+
+ if (_nl_sock_request_all (platform, priv->nlh_event, obj_type, &seq) == 0)
+ _new_sequence_number (platform, seq);
}
}
+ event_handler_read_netlink_all (platform, TRUE);
- return TRUE;
+ cache_prune_candidates_prune (platform);
+
+ if (handle_delayed_action)
+ delayed_action_handle_all (platform, FALSE);
}
-/* Decreases the reference count if @obj for convenience */
static gboolean
-add_object (NMPlatform *platform, struct nl_object *obj)
+kernel_add_object (NMPlatform *platform, NMPObjectType obj_type, const struct nl_object *nlo)
{
- auto_nl_object struct nl_object *object = obj;
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
int nle;
- g_return_val_if_fail (object, FALSE);
+ g_return_val_if_fail (nlo, FALSE);
- nle = add_kernel_object (priv->nlh, object);
+ switch (obj_type) {
+ case NMP_OBJECT_TYPE_LINK:
+ nle = rtnl_link_add (priv->nlh, (struct rtnl_link *) nlo, NLM_F_CREATE);
+ break;
+ case NMP_OBJECT_TYPE_IP4_ADDRESS:
+ case NMP_OBJECT_TYPE_IP6_ADDRESS:
+ nle = rtnl_addr_add (priv->nlh, (struct rtnl_addr *) nlo, NLM_F_CREATE | NLM_F_REPLACE);
+ break;
+ case NMP_OBJECT_TYPE_IP4_ROUTE:
+ case NMP_OBJECT_TYPE_IP6_ROUTE:
+ nle = rtnl_route_add (priv->nlh, (struct rtnl_route *) nlo, NLM_F_CREATE | NLM_F_REPLACE);
+ break;
+ default:
+ g_return_val_if_reached (-NLE_INVAL);
+ }
+
+ _LOGT ("kernel-add-%s: returned %s (%d)",
+ nmp_class_from_type (obj_type)->obj_type_name, nl_geterror (nle), -nle);
- /* NLE_EXIST is considered equivalent to success to avoid race conditions. You
- * never know when something sends an identical object just before
- * NetworkManager.
- */
switch (nle) {
case -NLE_SUCCESS:
+ return -NLE_SUCCESS;
case -NLE_EXIST:
- break;
+ /* NLE_EXIST is considered equivalent to success to avoid race conditions. You
+ * never know when something sends an identical object just before
+ * NetworkManager. */
+ if (obj_type != NMP_OBJECT_TYPE_LINK)
+ return -NLE_SUCCESS;
+ /* fall-through */
default:
- error ("Netlink error adding %s: %s", to_string_object (platform, object), nl_geterror (nle));
- if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
- char buf[256];
- struct nl_dump_params dp = {
- .dp_type = NL_DUMP_DETAILS,
- .dp_buf = buf,
- .dp_buflen = sizeof (buf),
- };
-
- nl_object_dump (object, &dp);
- buf[sizeof (buf) - 1] = '\0';
- debug ("netlink object:\n%s", buf);
- }
- return FALSE;
+ return nle;
}
-
- return refresh_object (platform, object, FALSE, NM_PLATFORM_REASON_INTERNAL);
}
-/* Decreases the reference count if @obj for convenience */
-static gboolean
-delete_object (NMPlatform *platform, struct nl_object *object, gboolean do_refresh_object)
+static int
+kernel_delete_object (NMPlatform *platform, NMPObjectType object_type, const struct nl_object *object)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- int object_type;
int nle;
- gboolean result = FALSE;
-
- object_type = object_type_from_nl_object (object);
- g_return_val_if_fail (object_type != OBJECT_TYPE_UNKNOWN, FALSE);
switch (object_type) {
- case OBJECT_TYPE_LINK:
+ case NMP_OBJECT_TYPE_LINK:
nle = rtnl_link_delete (priv->nlh, (struct rtnl_link *) object);
break;
- case OBJECT_TYPE_IP4_ADDRESS:
- case OBJECT_TYPE_IP6_ADDRESS:
+ case NMP_OBJECT_TYPE_IP4_ADDRESS:
+ case NMP_OBJECT_TYPE_IP6_ADDRESS:
nle = rtnl_addr_delete (priv->nlh, (struct rtnl_addr *) object, 0);
break;
- case OBJECT_TYPE_IP4_ROUTE:
- case OBJECT_TYPE_IP6_ROUTE:
+ case NMP_OBJECT_TYPE_IP4_ROUTE:
+ case NMP_OBJECT_TYPE_IP6_ROUTE:
nle = rtnl_route_delete (priv->nlh, (struct rtnl_route *) object, 0);
break;
default:
@@ -1836,40 +2103,134 @@ delete_object (NMPlatform *platform, struct nl_object *object, gboolean do_refre
switch (nle) {
case -NLE_SUCCESS:
- break;
+ return NLE_SUCCESS;
case -NLE_OBJ_NOTFOUND:
- debug("delete_object failed with \"%s\" (%d), meaning the object was already removed",
- nl_geterror (nle), nle);
- break;
+ _LOGT ("kernel-delete-%s: failed with \"%s\" (%d), meaning the object was already removed",
+ nmp_class_from_type (object_type)->obj_type_name, nl_geterror (nle), -nle);
+ return -NLE_SUCCESS;
case -NLE_FAILURE:
- if (object_type == OBJECT_TYPE_IP6_ADDRESS) {
+ if (object_type == NMP_OBJECT_TYPE_IP6_ADDRESS) {
/* On RHEL7 kernel, deleting a non existing address fails with ENXIO (which libnl maps to NLE_FAILURE) */
- debug("delete_object for address failed with \"%s\" (%d), meaning the address was already removed",
- nl_geterror (nle), nle);
- break;
+ _LOGT ("kernel-delete-%s: deleting address failed with \"%s\" (%d), meaning the address was already removed",
+ nmp_class_from_type (object_type)->obj_type_name, nl_geterror (nle), -nle);
+ return NLE_SUCCESS;
}
- goto DEFAULT;
+ break;
case -NLE_NOADDR:
- if (object_type == OBJECT_TYPE_IP4_ADDRESS || object_type == OBJECT_TYPE_IP6_ADDRESS) {
- debug("delete_object for address failed with \"%s\" (%d), meaning the address was already removed",
- nl_geterror (nle), nle);
- break;
+ if (object_type == NMP_OBJECT_TYPE_IP4_ADDRESS || object_type == NMP_OBJECT_TYPE_IP6_ADDRESS) {
+ _LOGT ("kernel-delete-%s: deleting address failed with \"%s\" (%d), meaning the address was already removed",
+ nmp_class_from_type (object_type)->obj_type_name, nl_geterror (nle), -nle);
+ return -NLE_SUCCESS;
}
- goto DEFAULT;
- DEFAULT:
+ break;
default:
- error ("Netlink error deleting %s: %s (%d)", to_string_object (platform, object), nl_geterror (nle), nle);
- goto out;
+ break;
}
+ _LOGT ("kernel-delete-%s: failed with %s (%d)",
+ nmp_class_from_type (object_type)->obj_type_name, nl_geterror (nle), -nle);
+ return nle;
+}
- if (do_refresh_object)
- refresh_object (platform, object, TRUE, NM_PLATFORM_REASON_INTERNAL);
+static int
+kernel_change_link (NMPlatform *platform, struct rtnl_link *nlo, gboolean *complete_from_cache)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ struct nl_msg *msg;
+ int nle;
+ const int nlflags = 0;
+ int ifindex;
- result = TRUE;
+ ifindex = rtnl_link_get_ifindex (nlo);
-out:
- nl_object_put (object);
- return result;
+ g_return_val_if_fail (ifindex > 0, FALSE);
+
+ /* Previously, we were using rtnl_link_change(), which builds a request based
+ * on the diff with an original link instance.
+ *
+ * The diff only reused ifi_family, ifi_index, ifi_flags, and name from
+ * the original link (see rtnl_link_build_change_request()).
+ *
+ * We don't do that anymore as we don't have an "orig" netlink instance that
+ * we can use. Instead the caller must ensure to properly initialize @nlo,
+ * especially it must set family, ifindex (or ifname) and flags.
+ * ifname should be set *only* if the caller wishes to change the name.
+ *
+ * @complete_from_cache is a convenience to copy the link flags over the link inside
+ * the platform cache. */
+
+ if (*complete_from_cache) {
+ const NMPObject *obj_cache;
+
+ obj_cache = nmp_cache_lookup_link (priv->cache, ifindex);
+ if (!obj_cache || !obj_cache->_link.netlink.is_in_netlink) {
+ _LOGT ("kernel-change-link: failure changing link %d: cannot complete link", ifindex);
+ *complete_from_cache = FALSE;
+ return -NLE_INVAL;
+ }
+
+ rtnl_link_set_flags (nlo, obj_cache->link.flags);
+
+ /* If the caller wants to rename the link, he should explicitly set
+ * rtnl_link_set_name(). In all other cases, it should leave the name
+ * unset. Unfortunately, there is not public API in libnl to modify the
+ * attribute mask and clear (link->ce_mask = ~LINK_ATTR_IFNAME), so we
+ * require the caller to do the right thing -- i.e. don't set the name.
+ */
+ }
+
+ /* We don't use rtnl_link_change() because we have no original rtnl_link object
+ * at hand. We also don't use rtnl_link_add() because that doesn't have the
+ * hack to retry with RTM_SETLINK. Reimplement a mix of both. */
+
+ nle = rtnl_link_build_add_request (nlo, nlflags, &msg);
+ if (nle < 0) {
+ _LOGT ("kernel-change-link: failure changing link %d: cannot construct message (%s, %d)",
+ ifindex, nl_geterror (nle), -nle);
+ return nle;
+ }
+
+retry:
+ nle = nl_send_auto_complete (priv->nlh, msg);
+ if (nle < 0)
+ goto errout;
+
+ nle = nl_wait_for_ack(priv->nlh);
+ if (nle == -NLE_OPNOTSUPP && nlmsg_hdr (msg)->nlmsg_type == RTM_NEWLINK) {
+ nlmsg_hdr (msg)->nlmsg_type = RTM_SETLINK;
+ goto retry;
+ }
+
+errout:
+ nlmsg_free(msg);
+
+ /* NLE_EXIST is considered equivalent to success to avoid race conditions. You
+ * never know when something sends an identical object just before
+ * NetworkManager.
+ *
+ * When netlink returns NLE_OBJ_NOTFOUND, it usually means it failed to find
+ * firmware for the device, especially on nm_platform_link_set_up ().
+ * This is basically the same check as in the original code and could
+ * potentially be improved.
+ */
+ switch (nle) {
+ case -NLE_SUCCESS:
+ _LOGT ("kernel-change-link: success changing link %d", ifindex);
+ break;
+ case -NLE_EXIST:
+ _LOGT ("kernel-change-link: success changing link %d: %s (%d)",
+ ifindex, nl_geterror (nle), -nle);
+ break;
+ case -NLE_OBJ_NOTFOUND:
+ _LOGT ("kernel-change-link: failure changing link %d: firmware not found (%s, %d)",
+ ifindex, nl_geterror (nle), -nle);
+ break;
+ default:
+ _LOGT ("kernel-change-link: failure changing link %d: netlink error (%s, %d)",
+ ifindex, nl_geterror (nle), -nle);
+ break;
+ }
+
+ return nle;
}
static void
@@ -1881,47 +2242,40 @@ ref_object (struct nl_object *obj, void *data)
*out = obj;
}
-static gboolean
-_rtnl_addr_timestamps_equal_fuzzy (guint32 ts1, guint32 ts2)
+static int
+event_seq_check (struct nl_msg *msg, gpointer user_data)
{
- guint32 diff;
+ NMPlatform *platform = NM_PLATFORM (user_data);
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ struct nlmsghdr *hdr;
- if (ts1 == ts2)
- return TRUE;
- if (ts1 == NM_PLATFORM_LIFETIME_PERMANENT ||
- ts2 == NM_PLATFORM_LIFETIME_PERMANENT)
- return FALSE;
+ hdr = nlmsg_hdr (msg);
- /** accept the timestamps as equal if they are within two seconds. */
- diff = ts1 > ts2 ? ts1 - ts2 : ts2 - ts1;
- return diff <= 2;
-}
+ if (hdr->nlmsg_seq == 0)
+ return NL_OK;
-static gboolean
-nm_nl_object_diff (ObjectType type, struct nl_object *_a, struct nl_object *_b)
-{
- if (nl_object_diff (_a, _b)) {
- /* libnl thinks objects are different*/
- return TRUE;
- }
+ priv->nlh_seq_last = hdr->nlmsg_seq;
- if (type == OBJECT_TYPE_IP4_ADDRESS || type == OBJECT_TYPE_IP6_ADDRESS) {
- struct rtnl_addr *a = (struct rtnl_addr *) _a;
- struct rtnl_addr *b = (struct rtnl_addr *) _b;
+ if (priv->nlh_seq_expect == 0)
+ _LOGT ("event_seq_check(): seq %u received (not waited)", hdr->nlmsg_seq);
+ else if (hdr->nlmsg_seq == priv->nlh_seq_expect) {
+ _LOGT ("event_seq_check(): seq %u received", hdr->nlmsg_seq);
- /* libnl nl_object_diff() ignores differences in timestamp. Let's care about
- * them (if they are large enough).
- *
- * Note that these valid and preferred timestamps are absolute, after
- * _rtnl_addr_hack_lifetimes_rel_to_abs(). */
- if ( !_rtnl_addr_timestamps_equal_fuzzy (rtnl_addr_get_preferred_lifetime (a),
- rtnl_addr_get_preferred_lifetime (b))
- || !_rtnl_addr_timestamps_equal_fuzzy (rtnl_addr_get_valid_lifetime (a),
- rtnl_addr_get_valid_lifetime (b)))
- return TRUE;
- }
+ priv->nlh_seq_expect = 0;
+ } else
+ _LOGT ("event_seq_check(): seq %u received (wait for %u)", hdr->nlmsg_seq, priv->nlh_seq_last);
- return FALSE;
+ return NL_OK;
+}
+
+static int
+event_err (struct sockaddr_nl *nla, struct nlmsgerr *nlerr, gpointer platform)
+{
+ _LOGT ("event_err(): error from kernel: %s (%d) for request %d",
+ strerror (nlerr ? -nlerr->error : 0),
+ nlerr ? -nlerr->error : 0,
+ NM_LINUX_PLATFORM_GET_PRIVATE (platform)->nlh_seq_last);
+ return NL_OK;
}
/* This function does all the magic to avoid race conditions caused
@@ -1934,123 +2288,71 @@ static int
event_notification (struct nl_msg *msg, gpointer user_data)
{
NMPlatform *platform = NM_PLATFORM (user_data);
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- struct nl_cache *cache;
- auto_nl_object struct nl_object *object = NULL;
- auto_nl_object struct nl_object *cached_object = NULL;
- auto_nl_object struct nl_object *kernel_object = NULL;
- int event;
- int nle;
- ObjectType type;
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (user_data);
+ auto_nl_object struct nl_object *nlo = NULL;
+ auto_nmp_obj NMPObject *obj = NULL;
+ struct nlmsghdr *msghdr;
+ char buf_nlmsg_type[16];
- event = nlmsg_hdr (msg)->nlmsg_type;
+ msghdr = nlmsg_hdr (msg);
- if (priv->support_kernel_extended_ifa_flags == 0 && event == RTM_NEWADDR) {
- /* if kernel support for extended ifa flags is still undecided, use the opportunity
- * now and use @msg to decide it. This saves a blocking net link request.
- **/
- _check_support_kernel_extended_ifa_flags_init (priv, msg);
- }
+ if (_support_kernel_extended_ifa_flags_still_undecided () && msghdr->nlmsg_type == RTM_NEWADDR)
+ _support_kernel_extended_ifa_flags_detect (msg);
- nl_msg_parse (msg, ref_object, &object);
- g_return_val_if_fail (object, NL_OK);
-
- type = object_type_from_nl_object (object);
+ nl_msg_parse (msg, ref_object, &nlo);
+ if (!nlo)
+ return NL_OK;
- if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
- if (type == OBJECT_TYPE_LINK) {
- const char *name = rtnl_link_get_name ((struct rtnl_link *) object);
+ if (_support_user_ipv6ll_still_undecided() && msghdr->nlmsg_type == RTM_NEWLINK)
+ _support_user_ipv6ll_detect ((struct rtnl_link *) nlo);
- debug ("netlink event (type %d) for link: %s (%d, family %d)",
- event, name ? name : "(unknown)",
- rtnl_link_get_ifindex ((struct rtnl_link *) object),
- rtnl_link_get_family ((struct rtnl_link *) object));
- } else
- debug ("netlink event (type %d)", event);
- }
+ obj = nmp_object_from_nl (platform, nlo, FALSE, TRUE);
- cache = choose_cache_by_type (platform, type);
- cached_object = nm_nl_cache_search (cache, object);
- kernel_object = get_kernel_object (priv->nlh, object);
+ _LOGD ("event-notification: %s, seq %u: %s",
+ _nl_nlmsg_type_to_str (msghdr->nlmsg_type, buf_nlmsg_type, sizeof (buf_nlmsg_type)),
+ msghdr->nlmsg_seq, nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
+ if (obj) {
+ auto_nmp_obj NMPObject *obj_cache = NULL;
- hack_empty_master_iff_lower_up (platform, kernel_object);
+ switch (msghdr->nlmsg_type) {
- /* Removed object */
- switch (event) {
- case RTM_DELLINK:
- case RTM_DELADDR:
- case RTM_DELROUTE:
- /* Ignore inconsistent deletion
- *
- * Quick external deletion and addition can be occasionally
- * seen as just a change.
- */
- if (kernel_object)
- return NL_OK;
- /* Ignore internal deletion */
- if (!cached_object)
- return NL_OK;
-
- nl_cache_remove (cached_object);
- /* Don't announce removed interfaces that are not recognized by
- * udev. They were either not yet discovered or they have been
- * already removed and announced.
- */
- if (event == RTM_DELLINK) {
- if (!link_is_announceable (platform, (struct rtnl_link *) cached_object))
- return NL_OK;
- }
- announce_object (platform, cached_object, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_EXTERNAL);
+ case RTM_NEWLINK:
+ if ( NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK
+ && g_hash_table_lookup (priv->delayed_deletion, obj) != NULL) {
+ /* the object is scheduled for delayed deletion. Replace that object
+ * by clearing the value from priv->delayed_deletion. */
+ _LOGT ("delayed-deletion: clear delayed deletion of protected object %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ g_hash_table_insert (priv->delayed_deletion, nmp_object_ref (obj), NULL);
+ }
+ /* fall-through */
+ case RTM_NEWADDR:
+ case RTM_NEWROUTE:
+ cache_update_netlink (platform, obj, &obj_cache, NULL, NM_PLATFORM_REASON_EXTERNAL);
+ break;
- return NL_OK;
- case RTM_NEWLINK:
- case RTM_NEWADDR:
- case RTM_NEWROUTE:
- /* Ignore inconsistent addition or change (kernel will send a good one)
- *
- * Quick sequence of RTM_NEWLINK notifications can be occasionally
- * collapsed to just one addition or deletion, depending of whether we
- * already have the object in cache.
- */
- if (!kernel_object)
- return NL_OK;
-
- /* Ignore unsupported object types (e.g. AF_PHONET family addresses) */
- if (type == OBJECT_TYPE_UNKNOWN)
- return NL_OK;
-
- /* Handle external addition */
- if (!cached_object) {
- nle = nl_cache_add (cache, kernel_object);
- if (nle) {
- error ("netlink cache error: %s", nl_geterror (nle));
- return NL_OK;
+ case RTM_DELLINK:
+ if ( NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK
+ && g_hash_table_contains (priv->delayed_deletion, obj)) {
+ /* We sometimes receive spurious RTM_DELLINK events. In this case, we want to delay
+ * the deletion of the object until later. */
+ _LOGT ("delayed-deletion: delay deletion of protected object %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ g_hash_table_insert (priv->delayed_deletion, nmp_object_ref (obj), nmp_object_ref (obj));
+ break;
}
- announce_object (platform, kernel_object, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_EXTERNAL);
- return NL_OK;
- }
- /* Ignore non-change
- *
- * This also catches notifications for internal addition or change, unless
- * another action occured very soon after it.
- */
- if (!nm_nl_object_diff (type, kernel_object, cached_object))
- return NL_OK;
-
- /* Handle external change */
- nl_cache_remove (cached_object);
- nle = nl_cache_add (cache, kernel_object);
- if (nle) {
- error ("netlink cache error: %s", nl_geterror (nle));
- return NL_OK;
+ /* fall-through */
+ case RTM_DELADDR:
+ case RTM_DELROUTE:
+ cache_remove_netlink (platform, obj, &obj_cache, NULL, NM_PLATFORM_REASON_EXTERNAL);
+ break;
+
+ default:
+ break;
}
- announce_object (platform, kernel_object, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_EXTERNAL);
- return NL_OK;
- default:
- error ("Unknown netlink event: %d", event);
- return NL_OK;
+ cache_prune_candidates_drop (platform, obj_cache);
}
+
+ return NL_OK;
}
/******************************************************************/
@@ -2219,40 +2521,81 @@ sysctl_get (NMPlatform *platform, const char *path)
/******************************************************************/
+static const NMPObject *
+cache_lookup_link (NMPlatform *platform, int ifindex)
+{
+ const NMPObject *obj_cache;
+
+ obj_cache = nmp_cache_lookup_link (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, ifindex);
+ if (!nmp_object_is_visible (obj_cache))
+ return NULL;
+
+ return obj_cache;
+}
+
static GArray *
link_get_all (NMPlatform *platform)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GArray *links = g_array_sized_new (FALSE, FALSE, sizeof (NMPlatformLink), nl_cache_nitems (priv->link_cache));
- NMPlatformLink device;
- struct nl_object *object;
- for (object = nl_cache_get_first (priv->link_cache); object; object = nl_cache_get_next (object)) {
- struct rtnl_link *rtnl_link = (struct rtnl_link *) object;
+ return nmp_cache_lookup_multi_to_array (priv->cache,
+ NMP_OBJECT_TYPE_LINK,
+ nmp_cache_id_init_object_type (NMP_CACHE_ID_STATIC, NMP_OBJECT_TYPE_LINK, TRUE));
+}
- if (link_is_announceable (platform, rtnl_link)) {
- if (init_link (platform, &device, rtnl_link))
- g_array_append_val (links, device);
- }
- }
+static const NMPlatformLink *
+_nm_platform_link_get (NMPlatform *platform, int ifindex)
+{
+ const NMPObject *obj;
- return links;
+ obj = cache_lookup_link (platform, ifindex);
+ return obj ? &obj->link : NULL;
}
-static gboolean
-_nm_platform_link_get (NMPlatform *platform, int ifindex, NMPlatformLink *l)
+static const NMPlatformLink *
+_nm_platform_link_get_by_ifname (NMPlatform *platform,
+ const char *ifname)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- auto_nl_object struct rtnl_link *rtnllink = NULL;
+ const NMPObject *obj = NULL;
- rtnllink = rtnl_link_get (priv->link_cache, ifindex);
- if (rtnllink) {
- if (link_is_announceable (platform, rtnllink)) {
- if (init_link (platform, l, rtnllink))
- return TRUE;
- }
+ if (ifname && *ifname) {
+ obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
+ 0, ifname, TRUE, NM_LINK_TYPE_NONE, NULL, NULL);
}
- return FALSE;
+ return obj ? &obj->link : NULL;
+}
+
+struct _nm_platform_link_get_by_address_data {
+ gconstpointer address;
+ guint8 length;
+};
+
+static gboolean
+_nm_platform_link_get_by_address_match_link (const NMPObject *obj, struct _nm_platform_link_get_by_address_data *d)
+{
+ return obj->link.addr.len == d->length && !memcmp (obj->link.addr.data, d->address, d->length);
+}
+
+static const NMPlatformLink *
+_nm_platform_link_get_by_address (NMPlatform *platform,
+ gconstpointer address,
+ size_t length)
+{
+ const NMPObject *obj;
+ struct _nm_platform_link_get_by_address_data d = {
+ .address = address,
+ .length = length,
+ };
+
+ if (length <= 0 || length > NM_UTILS_HWADDR_LEN_MAX)
+ return NULL;
+ if (!address)
+ return NULL;
+
+ obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
+ 0, NULL, TRUE, NM_LINK_TYPE_NONE,
+ (NMPObjectMatchFn) _nm_platform_link_get_by_address_match_link, &d);
+ return obj ? &obj->link : NULL;
}
static struct nl_object *
@@ -2261,331 +2604,392 @@ build_rtnl_link (int ifindex, const char *name, NMLinkType type)
struct rtnl_link *rtnllink;
int nle;
- rtnllink = _nm_rtnl_link_alloc (ifindex, name);
+ rtnllink = _nl_rtnl_link_alloc (ifindex, name);
if (type) {
- nle = rtnl_link_set_type (rtnllink, type_to_string (type));
+ nle = rtnl_link_set_type (rtnllink, nm_link_type_to_rtnl_type_string (type));
g_assert (!nle);
}
return (struct nl_object *) rtnllink;
}
+struct nl_object *
+_nmp_vt_cmd_plobj_to_nl_link (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only)
+{
+ const NMPlatformLink *obj = (const NMPlatformLink *) _obj;
+
+ return build_rtnl_link (obj->ifindex,
+ obj->name[0] ? obj->name : NULL,
+ obj->type);
+}
+
static gboolean
-link_add (NMPlatform *platform, const char *name, NMLinkType type, const void *address, size_t address_len)
+do_add_link (NMPlatform *platform, const char *name, const struct rtnl_link *nlo)
{
- int r;
- struct nl_object *l;
+ NMPObject obj_needle;
+ int nle;
- if (type == NM_LINK_TYPE_BOND) {
- /* When the kernel loads the bond module, either via explicit modprobe
- * or automatically in response to creating a bond master, it will also
- * create a 'bond0' interface. Since the bond we're about to create may
- * or may not be named 'bond0' prevent potential confusion about a bond
- * that the user didn't want by telling the bonding module not to create
- * bond0 automatically.
- */
- if (!g_file_test ("/sys/class/net/bonding_masters", G_FILE_TEST_EXISTS))
- /* Ignore return value to shut up the compiler */
- r = system ("modprobe bonding max_bonds=0");
- }
+ event_handler_read_netlink_all (platform, FALSE);
- debug ("link: add link '%s' of type '%s' (%d)",
- name, type_to_string (type), (int) type);
+ nle = kernel_add_object (platform, NMP_OBJECT_TYPE_LINK, (const struct nl_object *) nlo);
+ if (nle < 0) {
+ _LOGE ("do-add-link: failure adding link '%s': %s", name, nl_geterror (nle));
+ return FALSE;
+ }
+ _LOGD ("do-add-link: success adding link '%s'", name);
- l = build_rtnl_link (0, name, type);
+ nmp_object_stackinit_id_link (&obj_needle, 0);
+ g_strlcpy (obj_needle.link.name, name, sizeof (obj_needle.link.name));
- g_assert ( (address != NULL) ^ (address_len == 0) );
- if (address) {
- auto_nl_addr struct nl_addr *nladdr = _nm_nl_addr_build (AF_LLC, address, address_len);
+ delayed_action_handle_all (platform, TRUE);
- rtnl_link_set_addr ((struct rtnl_link *) l, nladdr);
+ /* FIXME: we add the link object via the second netlink socket. Sometimes,
+ * the notification is not yet ready via nlh_event, so we have to re-request the
+ * link so that it is in the cache. A better solution would be to do everything
+ * via one netlink socket. */
+ if (!nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, 0, obj_needle.link.name, FALSE, NM_LINK_TYPE_NONE, NULL, NULL)) {
+ _LOGT ("do-add-link: reload: the added link is not yet ready. Request %s", obj_needle.link.name);
+ do_request_link (platform, 0, obj_needle.link.name, TRUE);
}
- return add_object (platform, l);
+
+ /* Return true, because kernel_add_object() succeeded. This doesn't indicate that the
+ * object is now actuall in the cache, because there could be a race.
+ *
+ * For that, you'd have to look at @out_obj. */
+ return TRUE;
}
-static struct rtnl_link *
-link_get (NMPlatform *platform, int ifindex)
+static gboolean
+do_add_link_with_lookup (NMPlatform *platform, const char *name, const struct rtnl_link *nlo, NMLinkType expected_link_type, NMPlatformLink *out_link)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- struct rtnl_link *rtnllink = rtnl_link_get (priv->link_cache, ifindex);
+ const NMPObject *obj;
- if (!rtnllink) {
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
- return NULL;
+ do_add_link (platform, name, nlo);
+
+ obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
+ 0, name, FALSE, expected_link_type, NULL, NULL);
+ if (out_link && obj)
+ *out_link = obj->link;
+ return !!obj;
+}
+
+static gboolean
+do_add_addrroute (NMPlatform *platform, const NMPObject *obj_id, const struct nl_object *nlo)
+{
+ int nle;
+
+ nm_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (obj_id),
+ NMP_OBJECT_TYPE_IP4_ADDRESS, NMP_OBJECT_TYPE_IP6_ADDRESS,
+ NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE));
+
+ event_handler_read_netlink_all (platform, FALSE);
+
+ nle = kernel_add_object (platform, NMP_OBJECT_GET_CLASS (obj_id)->obj_type, (const struct nl_object *) nlo);
+ if (nle < 0) {
+ _LOGW ("do-add-%s: failure adding %s '%s': %s (%d)",
+ NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name,
+ NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name,
+ nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0),
+ nl_geterror (nle), -nle);
+ return FALSE;
}
+ _LOGD ("do-add-%s: success adding object %s", NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0));
- /* physical interfaces must be found by udev before they can be used */
- if (!link_is_announceable (platform, rtnllink)) {
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
- rtnl_link_put (rtnllink);
- return NULL;
+ delayed_action_handle_all (platform, TRUE);
+
+ /* FIXME: instead of re-requesting the added object, add it via nlh_event
+ * so that the events are in sync. */
+ if (!nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, obj_id)) {
+ _LOGT ("do-add-%s: reload: the added object is not yet ready. Request %s", NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ do_request_one_type (platform, NMP_OBJECT_GET_TYPE (obj_id), TRUE);
}
- return rtnllink;
+ /* The return value doesn't say, whether the object is in the platform cache after adding
+ * it.
+ * Instead the return value says, whether kernel_add_object() succeeded. */
+ return TRUE;
}
+
static gboolean
-link_change (NMPlatform *platform, int ifindex, struct rtnl_link *change)
+do_delete_object (NMPlatform *platform, const NMPObject *obj_id, const struct nl_object *nlo)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
+ auto_nl_object struct nl_object *nlo_free = NULL;
int nle;
- if (!rtnllink)
- return FALSE;
- g_return_val_if_fail (rtnl_link_get_ifindex (change) > 0, FALSE);
+ event_handler_read_netlink_all (platform, FALSE);
- nle = rtnl_link_change (priv->nlh, rtnllink, change, 0);
+ if (!nlo)
+ nlo = nlo_free = nmp_object_to_nl (platform, obj_id, FALSE);
+
+ nle = kernel_delete_object (platform, NMP_OBJECT_GET_TYPE (obj_id), nlo);
+ if (nle < 0)
+ _LOGE ("do-delete-%s: failure deleting '%s': %s (%d)", NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0), nl_geterror (nle), -nle);
+ else
+ _LOGD ("do-delete-%s: success deleting '%s'", NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+
+ delayed_action_handle_all (platform, TRUE);
+
+ /* FIXME: instead of re-requesting the deleted object, add it via nlh_event
+ * so that the events are in sync. */
+ if (NMP_OBJECT_GET_TYPE (obj_id) == NMP_OBJECT_TYPE_LINK) {
+ const NMPObject *obj;
+
+ obj = nmp_cache_lookup_link_full (priv->cache, obj_id->link.ifindex, obj_id->link.ifindex <= 0 && obj_id->link.name[0] ? obj_id->link.name : NULL, FALSE, NM_LINK_TYPE_NONE, NULL, NULL);
+ if (obj && obj->_link.netlink.is_in_netlink) {
+ _LOGT ("do-delete-%s: reload: the deleted object is not yet removed. Request %s", NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ do_request_link (platform, obj_id->link.ifindex, obj_id->link.name, TRUE);
+ }
+ } else {
+ if (nmp_cache_lookup_obj (priv->cache, obj_id)) {
+ _LOGT ("do-delete-%s: reload: the deleted object is not yet removed. Request %s", NMP_OBJECT_GET_CLASS (obj_id)->obj_type_name, nmp_object_to_string (obj_id, NMP_OBJECT_TO_STRING_ID, NULL, 0));
+ do_request_one_type (platform, NMP_OBJECT_GET_TYPE (obj_id), TRUE);
+ }
+ }
+
+ /* The return value doesn't say, whether the object is in the platform cache after adding
+ * it.
+ * Instead the return value says, whether kernel_add_object() succeeded. */
+ return nle >= 0;
+}
+
+static NMPlatformError
+do_change_link (NMPlatform *platform, struct rtnl_link *nlo, gboolean complete_from_cache)
+{
+ int nle;
+ int ifindex;
+ gboolean complete_from_cache2 = complete_from_cache;
+
+ ifindex = rtnl_link_get_ifindex (nlo);
+ if (ifindex <= 0)
+ g_return_val_if_reached (NM_PLATFORM_ERROR_BUG);
+
+ nle = kernel_change_link (platform, nlo, &complete_from_cache2);
- /* NLE_EXIST is considered equivalent to success to avoid race conditions. You
- * never know when something sends an identical object just before
- * NetworkManager.
- *
- * When netlink returns NLE_OBJ_NOTFOUND, it usually means it failed to find
- * firmware for the device, especially on nm_platform_link_set_up ().
- * This is basically the same check as in the original code and could
- * potentially be improved.
- */
switch (nle) {
case -NLE_SUCCESS:
+ _LOGD ("do-change-link: success changing link %d", ifindex);
+ break;
case -NLE_EXIST:
+ _LOGD ("do-change-link: success changing link %d: %s (%d)", ifindex, nl_geterror (nle), -nle);
break;
case -NLE_OBJ_NOTFOUND:
- error ("Firmware not found for changing link %s; Netlink error: %s)", to_string_link (platform, change), nl_geterror (nle));
- platform->error = NM_PLATFORM_ERROR_NO_FIRMWARE;
- return FALSE;
+ /* fall-through */
default:
- error ("Netlink error changing link %s: %s", to_string_link (platform, change), nl_geterror (nle));
- return FALSE;
+ if (complete_from_cache != complete_from_cache2)
+ _LOGD ("do-change-link: failure changing link %d: link does not exist in cache", ifindex);
+ else
+ _LOGE ("do-change-link: failure changing link %d: %s (%d)", ifindex, nl_geterror (nle), -nle);
+ return nle == -NLE_OBJ_NOTFOUND ? NM_PLATFORM_ERROR_NO_FIRMWARE : NM_PLATFORM_ERROR_UNSPECIFIED;
}
- return refresh_object (platform, (struct nl_object *) rtnllink, FALSE, NM_PLATFORM_REASON_INTERNAL);
+ /* FIXME: as we modify the link via a separate socket, the cache is not in
+ * sync and we have to refetch the link. */
+ do_request_link (platform, ifindex, NULL, TRUE);
+ return NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
-link_delete (NMPlatform *platform, int ifindex)
+link_add (NMPlatform *platform,
+ const char *name,
+ NMLinkType type,
+ const void *address,
+ size_t address_len,
+ NMPlatformLink *out_link)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- struct rtnl_link *rtnllink = rtnl_link_get (priv->link_cache, ifindex);
+ auto_nl_object struct nl_object *l = NULL;
- if (!rtnllink) {
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
- return FALSE;
+ if (type == NM_LINK_TYPE_BOND) {
+ /* When the kernel loads the bond module, either via explicit modprobe
+ * or automatically in response to creating a bond master, it will also
+ * create a 'bond0' interface. Since the bond we're about to create may
+ * or may not be named 'bond0' prevent potential confusion about a bond
+ * that the user didn't want by telling the bonding module not to create
+ * bond0 automatically.
+ */
+ if (!g_file_test ("/sys/class/net/bonding_masters", G_FILE_TEST_EXISTS))
+ nm_utils_modprobe (NULL, TRUE, "bonding", "max_bonds=0", NULL);
}
- return delete_object (platform, build_rtnl_link (ifindex, NULL, NM_LINK_TYPE_NONE), TRUE);
-}
+ debug ("link: add link '%s' of type '%s' (%d)",
+ name, nm_link_type_to_string (type), (int) type);
-static int
-link_get_ifindex (NMPlatform *platform, const char *ifname)
-{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ l = build_rtnl_link (0, name, type);
- return rtnl_link_name2i (priv->link_cache, ifname);
-}
+ g_assert ( (address != NULL) ^ (address_len == 0) );
+ if (address) {
+ auto_nl_addr struct nl_addr *nladdr = _nl_addr_build (AF_LLC, address, address_len);
-static const char *
-link_get_name (NMPlatform *platform, int ifindex)
-{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
+ rtnl_link_set_addr ((struct rtnl_link *) l, nladdr);
+ }
- return rtnllink ? rtnl_link_get_name (rtnllink) : NULL;
+ return do_add_link_with_lookup (platform, name, (struct rtnl_link *) l, type, out_link);
}
-static NMLinkType
-link_get_type (NMPlatform *platform, int ifindex)
+static gboolean
+link_delete (NMPlatform *platform, int ifindex)
{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ NMPObject obj_needle;
+ const NMPObject *obj;
+
+ obj = nmp_cache_lookup_link (priv->cache, ifindex);
+ if (!obj || !obj->_link.netlink.is_in_netlink)
+ return FALSE;
- return link_extract_type (platform, rtnllink, NULL);
+ nmp_object_stackinit_id_link (&obj_needle, ifindex);
+ return do_delete_object (platform, &obj_needle, NULL);
}
static const char *
link_get_type_name (NMPlatform *platform, int ifindex)
{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
- const char *type;
-
- link_extract_type (platform, rtnllink, &type);
- return type;
-}
+ const NMPObject *obj = cache_lookup_link (platform, ifindex);
-static guint32
-link_get_flags (NMPlatform *platform, int ifindex)
-{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
-
- if (!rtnllink)
- return IFF_NOARP;
+ if (!obj)
+ return NULL;
- return rtnl_link_get_flags (rtnllink);
+ if (obj->link.type != NM_LINK_TYPE_UNKNOWN) {
+ /* We could detect the @link_type. In this case the function returns
+ * our internel module names, which differs from rtnl_link_get_type():
+ * - NM_LINK_TYPE_INFINIBAND (gives "infiniband", instead of "ipoib")
+ * - NM_LINK_TYPE_TAP (gives "tap", instead of "tun").
+ * Note that this functions is only used by NMDeviceGeneric to
+ * set type_description. */
+ return nm_link_type_to_string (obj->link.type);
+ }
+ /* Link type not detected. Fallback to rtnl_link_get_type()/IFLA_INFO_KIND. */
+ return str_if_set (obj->link.kind, "unknown");
}
static gboolean
-link_refresh (NMPlatform *platform, int ifindex)
+link_get_unmanaged (NMPlatform *platform, int ifindex, gboolean *unmanaged)
{
- auto_nl_object struct rtnl_link *rtnllink = _nm_rtnl_link_alloc (ifindex, NULL);
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPObject *link;
+ GUdevDevice *udev_device = NULL;
- return refresh_object (platform, (struct nl_object *) rtnllink, FALSE, NM_PLATFORM_REASON_EXTERNAL);
-}
+ link = nmp_cache_lookup_link (priv->cache, ifindex);
+ if (link)
+ udev_device = link->_link.udev.device;
-static gboolean
-link_is_up (NMPlatform *platform, int ifindex)
-{
- return !!(link_get_flags (platform, ifindex) & IFF_UP);
-}
+ if (udev_device && g_udev_device_get_property (udev_device, "NM_UNMANAGED")) {
+ *unmanaged = g_udev_device_get_property_as_boolean (udev_device, "NM_UNMANAGED");
+ return TRUE;
+ }
-static gboolean
-link_is_connected (NMPlatform *platform, int ifindex)
-{
- return !!(link_get_flags (platform, ifindex) & IFF_LOWER_UP);
+ return FALSE;
}
static gboolean
-link_uses_arp (NMPlatform *platform, int ifindex)
+link_refresh (NMPlatform *platform, int ifindex)
{
- return !(link_get_flags (platform, ifindex) & IFF_NOARP);
+ do_request_link (platform, ifindex, NULL, TRUE);
+ return !!cache_lookup_link (platform, ifindex);
}
-static gboolean
+static NMPlatformError
link_change_flags (NMPlatform *platform, int ifindex, unsigned int flags, gboolean value)
{
- auto_nl_object struct rtnl_link *change = _nm_rtnl_link_alloc (ifindex, NULL);
+ auto_nl_object struct rtnl_link *change = _nl_rtnl_link_alloc (ifindex, NULL);
+ const NMPObject *obj_cache;
+ char buf[256];
+ obj_cache = cache_lookup_link (platform, ifindex);
+ if (!obj_cache)
+ return NM_PLATFORM_ERROR_NOT_FOUND;
+
+ rtnl_link_set_flags (change, obj_cache->link.flags);
if (value)
rtnl_link_set_flags (change, flags);
else
rtnl_link_unset_flags (change, flags);
- if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
- char buf[512];
-
- rtnl_link_flags2str (flags, buf, sizeof (buf));
- debug ("link: change %d: flags %s '%s' (%d)", ifindex, value ? "set" : "unset", buf, flags);
- }
+ _LOGD ("link: change %d: flags %s '%s' (%d)", ifindex,
+ value ? "set" : "unset",
+ rtnl_link_flags2str (flags, buf, sizeof (buf)),
+ flags);
- return link_change (platform, ifindex, change);
+ return do_change_link (platform, change, FALSE);
}
static gboolean
-link_set_up (NMPlatform *platform, int ifindex)
+link_set_up (NMPlatform *platform, int ifindex, gboolean *out_no_firmware)
{
- return link_change_flags (platform, ifindex, IFF_UP, TRUE);
+ NMPlatformError plerr;
+
+ plerr = link_change_flags (platform, ifindex, IFF_UP, TRUE);
+ if (out_no_firmware)
+ *out_no_firmware = plerr == NM_PLATFORM_ERROR_NO_FIRMWARE;
+ return plerr == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
link_set_down (NMPlatform *platform, int ifindex)
{
- return link_change_flags (platform, ifindex, IFF_UP, FALSE);
+ return link_change_flags (platform, ifindex, IFF_UP, FALSE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
link_set_arp (NMPlatform *platform, int ifindex)
{
- return link_change_flags (platform, ifindex, IFF_NOARP, FALSE);
+ return link_change_flags (platform, ifindex, IFF_NOARP, FALSE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
link_set_noarp (NMPlatform *platform, int ifindex)
{
- return link_change_flags (platform, ifindex, IFF_NOARP, TRUE);
+ return link_change_flags (platform, ifindex, IFF_NOARP, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
-static gboolean
-link_get_user_ipv6ll_enabled (NMPlatform *platform, int ifindex)
+static const char *
+link_get_udi (NMPlatform *platform, int ifindex)
{
-#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPObject *obj = cache_lookup_link (platform, ifindex);
- if (priv->support_user_ipv6ll > 0) {
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
- uint8_t mode = 0;
+ if ( !obj
+ || !obj->_link.netlink.is_in_netlink
+ || !obj->_link.udev.device)
+ return NULL;
+ return g_udev_device_get_sysfs_path (obj->_link.udev.device);
+}
- if (rtnllink) {
- if (rtnl_link_inet6_get_addr_gen_mode (rtnllink, &mode) != 0) {
- /* Default to "disabled" on error */
- return FALSE;
- }
- return mode == IN6_ADDR_GEN_MODE_NONE;
- }
- }
-#endif
- return FALSE;
+static GObject *
+link_get_udev_device (NMPlatform *platform, int ifindex)
+{
+ const NMPObject *obj_cache;
+
+ /* we don't use cache_lookup_link() because this would return NULL
+ * if the link is not visible in libnl. For link_get_udev_device()
+ * we want to return whatever we have, even if the link itself
+ * appears invisible via other platform functions. */
+
+ obj_cache = nmp_cache_lookup_link (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, ifindex);
+ return obj_cache ? (GObject *) obj_cache->_link.udev.device : NULL;
}
static gboolean
link_set_user_ipv6ll_enabled (NMPlatform *platform, int ifindex, gboolean enabled)
{
#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
- if (check_support_user_ipv6ll (platform)) {
- auto_nl_object struct rtnl_link *change = _nm_rtnl_link_alloc (ifindex, NULL);
+ if (_support_user_ipv6ll_get ()) {
+ auto_nl_object struct rtnl_link *nlo = _nl_rtnl_link_alloc (ifindex, NULL);
guint8 mode = enabled ? IN6_ADDR_GEN_MODE_NONE : IN6_ADDR_GEN_MODE_EUI64;
char buf[32];
- rtnl_link_inet6_set_addr_gen_mode (change, mode);
+ rtnl_link_inet6_set_addr_gen_mode (nlo, mode);
debug ("link: change %d: set IPv6 address generation mode to %s",
ifindex, rtnl_link_inet6_addrgenmode2str (mode, buf, sizeof (buf)));
- return link_change (platform, ifindex, change);
+ return do_change_link (platform, nlo, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
#endif
return FALSE;
}
static gboolean
-supports_ethtool_carrier_detect (const char *ifname)
-{
- struct ethtool_cmd edata = { .cmd = ETHTOOL_GLINK };
-
- /* We ignore the result. If the ETHTOOL_GLINK call succeeded, then we
- * assume the device supports carrier-detect, otherwise we assume it
- * doesn't.
- */
- return ethtool_get (ifname, &edata);
-}
-
-static gboolean
-supports_mii_carrier_detect (const char *ifname)
-{
- int fd;
- struct ifreq ifr;
- struct mii_ioctl_data *mii;
- gboolean supports_mii = FALSE;
-
- fd = socket (PF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
- nm_log_err (LOGD_PLATFORM, "couldn't open control socket.");
- return FALSE;
- }
-
- memset (&ifr, 0, sizeof (struct ifreq));
- strncpy (ifr.ifr_name, ifname, IFNAMSIZ);
-
- errno = 0;
- if (ioctl (fd, SIOCGMIIPHY, &ifr) < 0) {
- nm_log_dbg (LOGD_PLATFORM, "SIOCGMIIPHY failed: %d", errno);
- goto out;
- }
-
- /* If we can read the BMSR register, we assume that the card supports MII link detection */
- mii = (struct mii_ioctl_data *) &ifr.ifr_ifru;
- mii->reg_num = MII_BMSR;
-
- if (ioctl (fd, SIOCGMIIREG, &ifr) == 0) {
- nm_log_dbg (LOGD_PLATFORM, "SIOCGMIIREG result 0x%X", mii->val_out);
- supports_mii = TRUE;
- } else {
- nm_log_dbg (LOGD_PLATFORM, "SIOCGMIIREG failed: %d", errno);
- }
-
- out:
- close (fd);
- nm_log_dbg (LOGD_PLATFORM, "MII %s supported", supports_mii ? "is" : "not");
- return supports_mii;
-}
-
-static gboolean
link_supports_carrier_detect (NMPlatform *platform, int ifindex)
{
- const char *name = nm_platform_link_get_name (ifindex);
+ const char *name = nm_platform_link_get_name (platform, ifindex);
if (!name)
return FALSE;
@@ -2594,103 +2998,56 @@ link_supports_carrier_detect (NMPlatform *platform, int ifindex)
* us whether the device actually supports carrier detection in the first
* place. We assume any device that does implements one of these two APIs.
*/
- return supports_ethtool_carrier_detect (name) || supports_mii_carrier_detect (name);
+ return nmp_utils_ethtool_supports_carrier_detect (name) || nmp_utils_mii_supports_carrier_detect (name);
}
static gboolean
link_supports_vlans (NMPlatform *platform, int ifindex)
{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
- const char *name = nm_platform_link_get_name (ifindex);
- gs_free struct ethtool_gfeatures *features = NULL;
- int idx, block, bit, size;
+ const NMPObject *obj;
- /* Only ARPHRD_ETHER links can possibly support VLANs. */
- if (!rtnllink || rtnl_link_get_arptype (rtnllink) != ARPHRD_ETHER)
- return FALSE;
+ obj = cache_lookup_link (platform, ifindex);
- if (!name)
- return FALSE;
-
- idx = ethtool_get_stringset_index (name, ETH_SS_FEATURES, "vlan-challenged");
- if (idx == -1) {
- debug ("vlan-challenged ethtool feature does not exist?");
- return FALSE;
- }
-
- block = idx / 32;
- bit = idx % 32;
- size = block + 1;
-
- features = g_malloc0 (sizeof (*features) + size * sizeof (struct ethtool_get_features_block));
- features->cmd = ETHTOOL_GFEATURES;
- features->size = size;
-
- if (!ethtool_get (name, features))
+ /* Only ARPHRD_ETHER links can possibly support VLANs. */
+ if (!obj || obj->link.arptype != ARPHRD_ETHER)
return FALSE;
- return !(features->features[block].active & (1 << bit));
+ return nmp_utils_ethtool_supports_vlans (obj->link.name);
}
static gboolean
link_set_address (NMPlatform *platform, int ifindex, gconstpointer address, size_t length)
{
- auto_nl_object struct rtnl_link *change = _nm_rtnl_link_alloc (ifindex, NULL);
- auto_nl_addr struct nl_addr *nladdr = _nm_nl_addr_build (AF_LLC, address, length);
+ auto_nl_object struct rtnl_link *change = _nl_rtnl_link_alloc (ifindex, NULL);
+ auto_nl_addr struct nl_addr *nladdr = _nl_addr_build (AF_LLC, address, length);
+ gs_free char *mac = NULL;
rtnl_link_set_addr (change, nladdr);
- if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
- char *mac = nm_utils_hwaddr_ntoa (address, length);
-
- debug ("link: change %d: address %s (%lu bytes)", ifindex, mac, (unsigned long) length);
- g_free (mac);
- }
-
- return link_change (platform, ifindex, change);
+ _LOGD ("link: change %d: address %s (%lu bytes)", ifindex,
+ (mac = nm_utils_hwaddr_ntoa (address, length)),
+ (unsigned long) length);
+ return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
-static gconstpointer
-link_get_address (NMPlatform *platform, int ifindex, size_t *length)
+static gboolean
+link_get_permanent_address (NMPlatform *platform,
+ int ifindex,
+ guint8 *buf,
+ size_t *length)
{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
- struct nl_addr *nladdr;
- size_t l = 0;
- gconstpointer a = NULL;
-
- if (rtnllink &&
- (nladdr = rtnl_link_get_addr (rtnllink))) {
- l = nl_addr_get_len (nladdr);
- if (l > NM_UTILS_HWADDR_LEN_MAX) {
- if (length)
- *length = 0;
- g_return_val_if_reached (NULL);
- } else if (l > 0)
- a = nl_addr_get_binary_addr (nladdr);
- }
-
- if (length)
- *length = l;
- return a;
+ return nmp_utils_ethtool_get_permanent_address (nm_platform_link_get_name (platform, ifindex), buf, length);
}
static gboolean
link_set_mtu (NMPlatform *platform, int ifindex, guint32 mtu)
{
- auto_nl_object struct rtnl_link *change = _nm_rtnl_link_alloc (ifindex, NULL);
+ auto_nl_object struct rtnl_link *change = _nl_rtnl_link_alloc (ifindex, NULL);
rtnl_link_set_mtu (change, mtu);
debug ("link: change %d: mtu %lu", ifindex, (unsigned long)mtu);
- return link_change (platform, ifindex, change);
-}
-
-static guint32
-link_get_mtu (NMPlatform *platform, int ifindex)
-{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
-
- return rtnllink ? rtnl_link_get_mtu (rtnllink) : 0;
+ return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static char *
@@ -2699,7 +3056,7 @@ link_get_physical_port_id (NMPlatform *platform, int ifindex)
const char *ifname;
char *path, *id;
- ifname = nm_platform_link_get_name (ifindex);
+ ifname = nm_platform_link_get_name (platform, ifindex);
if (!ifname)
return NULL;
@@ -2719,7 +3076,7 @@ link_get_dev_id (NMPlatform *platform, int ifindex)
gs_free char *path = NULL, *id = NULL;
gint64 int_val;
- ifname = nm_platform_link_get_name (ifindex);
+ ifname = nm_platform_link_get_name (platform, ifindex);
if (!ifname)
return 0;
@@ -2731,16 +3088,20 @@ link_get_dev_id (NMPlatform *platform, int ifindex)
return 0;
/* Value is reported as hex */
- int_val = nm_utils_ascii_str_to_int64 (id, 16, 0, G_MAXUINT16, 0);
+ int_val = _nm_utils_ascii_str_to_int64 (id, 16, 0, G_MAXUINT16, 0);
return errno ? 0 : (int) int_val;
}
static int
-vlan_add (NMPlatform *platform, const char *name, int parent, int vlan_id, guint32 vlan_flags)
-{
- struct nl_object *object = build_rtnl_link (0, name, NM_LINK_TYPE_VLAN);
- struct rtnl_link *rtnllink = (struct rtnl_link *) object;
+vlan_add (NMPlatform *platform,
+ const char *name,
+ int parent,
+ int vlan_id,
+ guint32 vlan_flags,
+ NMPlatformLink *out_link)
+{
+ auto_nl_object struct rtnl_link *rtnllink = (struct rtnl_link *) build_rtnl_link (0, name, NM_LINK_TYPE_VLAN);
unsigned int kernel_flags;
kernel_flags = 0;
@@ -2758,63 +3119,61 @@ vlan_add (NMPlatform *platform, const char *name, int parent, int vlan_id, guint
debug ("link: add vlan '%s', parent %d, vlan id %d, flags %X (native: %X)",
name, parent, vlan_id, (unsigned int) vlan_flags, kernel_flags);
- return add_object (platform, object);
+ return do_add_link_with_lookup (platform, name, rtnllink, NM_LINK_TYPE_VLAN, out_link);
}
static gboolean
vlan_get_info (NMPlatform *platform, int ifindex, int *parent, int *vlan_id)
{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
+ const NMPObject *obj = cache_lookup_link (platform, ifindex);
+ int p = 0, v = 0;
+ if (obj) {
+ p = obj->link.parent;
+ v = obj->link.vlan_id;
+ }
if (parent)
- *parent = rtnllink ? rtnl_link_get_link (rtnllink) : 0;
+ *parent = p;
if (vlan_id)
- *vlan_id = rtnllink ? rtnl_link_vlan_get_id (rtnllink) : 0;
-
- return !!rtnllink;
+ *vlan_id = v;
+ return !!obj;
}
static gboolean
vlan_set_ingress_map (NMPlatform *platform, int ifindex, int from, int to)
{
- /* We have to use link_get() because a "blank" rtnl_link won't have the
- * right data structures to be able to call rtnl_link_vlan_set_ingress_map()
- * on it. (Likewise below in vlan_set_egress_map().)
- */
- auto_nl_object struct rtnl_link *change = link_get (platform, ifindex);
+ auto_nl_object struct rtnl_link *change = (struct rtnl_link *) build_rtnl_link (ifindex, NULL, NM_LINK_TYPE_VLAN);
- if (!change)
- return FALSE;
+ rtnl_link_set_type (change, "vlan");
rtnl_link_vlan_set_ingress_map (change, from, to);
debug ("link: change %d: vlan ingress map %d -> %d", ifindex, from, to);
- return link_change (platform, ifindex, change);
+ return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
vlan_set_egress_map (NMPlatform *platform, int ifindex, int from, int to)
{
- auto_nl_object struct rtnl_link *change = link_get (platform, ifindex);
+ auto_nl_object struct rtnl_link *change = (struct rtnl_link *) build_rtnl_link (ifindex, NULL, NM_LINK_TYPE_VLAN);
- if (!change)
- return FALSE;
+ rtnl_link_set_type (change, "vlan");
rtnl_link_vlan_set_egress_map (change, from, to);
debug ("link: change %d: vlan egress map %d -> %d", ifindex, from, to);
- return link_change (platform, ifindex, change);
+ return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
link_enslave (NMPlatform *platform, int master, int slave)
{
- auto_nl_object struct rtnl_link *change = _nm_rtnl_link_alloc (slave, NULL);
+ auto_nl_object struct rtnl_link *change = _nl_rtnl_link_alloc (slave, NULL);
rtnl_link_set_master (change, master);
debug ("link: change %d: enslave to master %d", slave, master);
- return link_change (platform, slave, change);
+ return do_change_link (platform, change, TRUE) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
@@ -2823,19 +3182,11 @@ link_release (NMPlatform *platform, int master, int slave)
return link_enslave (platform, 0, slave);
}
-static int
-link_get_master (NMPlatform *platform, int slave)
-{
- auto_nl_object struct rtnl_link *rtnllink = link_get (platform, slave);
-
- return rtnllink ? rtnl_link_get_master (rtnllink) : 0;
-}
-
static char *
-link_option_path (int master, const char *category, const char *option)
+link_option_path (NMPlatform *platform, int master, const char *category, const char *option)
{
- const char *name = nm_platform_link_get_name (master);
-
+ const char *name = nm_platform_link_get_name (platform, master);
+
if (!name || !category || !option)
return NULL;
@@ -2846,31 +3197,30 @@ link_option_path (int master, const char *category, const char *option)
}
static gboolean
-link_set_option (int master, const char *category, const char *option, const char *value)
+link_set_option (NMPlatform *platform, int master, const char *category, const char *option, const char *value)
{
- gs_free char *path = link_option_path (master, category, option);
+ gs_free char *path = link_option_path (platform, master, category, option);
- return path && nm_platform_sysctl_set (path, value);
+ return path && nm_platform_sysctl_set (platform, path, value);
}
static char *
-link_get_option (int master, const char *category, const char *option)
+link_get_option (NMPlatform *platform, int master, const char *category, const char *option)
{
- gs_free char *path = link_option_path (master, category, option);
+ gs_free char *path = link_option_path (platform, master, category, option);
- return path ? nm_platform_sysctl_get (path) : NULL;
+ return path ? nm_platform_sysctl_get (platform, path) : NULL;
}
static const char *
master_category (NMPlatform *platform, int master)
{
- switch (link_get_type (platform, master)) {
+ switch (nm_platform_link_get_type (platform, master)) {
case NM_LINK_TYPE_BRIDGE:
return "bridge";
case NM_LINK_TYPE_BOND:
return "bonding";
default:
- g_return_val_if_reached (NULL);
return NULL;
}
}
@@ -2878,18 +3228,15 @@ master_category (NMPlatform *platform, int master)
static const char *
slave_category (NMPlatform *platform, int slave)
{
- int master = link_get_master (platform, slave);
+ int master = nm_platform_link_get_master (platform, slave);
- if (master <= 0) {
- platform->error = NM_PLATFORM_ERROR_NOT_SLAVE;
+ if (master <= 0)
return NULL;
- }
- switch (link_get_type (platform, master)) {
+ switch (nm_platform_link_get_type (platform, master)) {
case NM_LINK_TYPE_BRIDGE:
return "brport";
default:
- g_return_val_if_reached (NULL);
return NULL;
}
}
@@ -2897,84 +3244,187 @@ slave_category (NMPlatform *platform, int slave)
static gboolean
master_set_option (NMPlatform *platform, int master, const char *option, const char *value)
{
- return link_set_option (master, master_category (platform, master), option, value);
+ return link_set_option (platform, master, master_category (platform, master), option, value);
}
static char *
master_get_option (NMPlatform *platform, int master, const char *option)
{
- return link_get_option (master, master_category (platform, master), option);
+ return link_get_option (platform, master, master_category (platform, master), option);
}
static gboolean
slave_set_option (NMPlatform *platform, int slave, const char *option, const char *value)
{
- return link_set_option (slave, slave_category (platform, slave), option, value);
+ return link_set_option (platform, slave, slave_category (platform, slave), option, value);
}
static char *
slave_get_option (NMPlatform *platform, int slave, const char *option)
{
- return link_get_option (slave, slave_category (platform, slave), option);
+ return link_get_option (platform, slave, slave_category (platform, slave), option);
}
static gboolean
-infiniband_partition_add (NMPlatform *platform, int parent, int p_key)
+infiniband_partition_add (NMPlatform *platform, int parent, int p_key, NMPlatformLink *out_link)
{
- const char *parent_name;
- char *path, *id;
- gboolean success;
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPObject *obj_parent;
+ const NMPObject *obj;
+ gs_free char *path = NULL;
+ gs_free char *id = NULL;
+ gs_free char *ifname = NULL;
+
+ obj_parent = nmp_cache_lookup_link (priv->cache, parent);
+ if (!obj_parent || !obj_parent->link.name[0])
+ g_return_val_if_reached (FALSE);
- parent_name = nm_platform_link_get_name (parent);
- g_return_val_if_fail (parent_name != NULL, FALSE);
+ ifname = g_strdup_printf ("%s.%04x", obj_parent->link.name, p_key);
- path = g_strdup_printf ("/sys/class/net/%s/create_child", ASSERT_VALID_PATH_COMPONENT (parent_name));
+ path = g_strdup_printf ("/sys/class/net/%s/create_child", ASSERT_VALID_PATH_COMPONENT (obj_parent->link.name));
id = g_strdup_printf ("0x%04x", p_key);
- success = nm_platform_sysctl_set (path, id);
- g_free (id);
- g_free (path);
+ if (!nm_platform_sysctl_set (platform, path, id))
+ return FALSE;
- if (success) {
- gs_free char *ifname = g_strdup_printf ("%s.%04x", parent_name, p_key);
- auto_nl_object struct rtnl_link *rtnllink = _nm_rtnl_link_alloc (0, ifname);
+ do_request_link (platform, 0, ifname, TRUE);
- success = refresh_object (platform, (struct nl_object *) rtnllink, FALSE, NM_PLATFORM_REASON_INTERNAL);
+ obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
+ 0, ifname, FALSE, NM_LINK_TYPE_INFINIBAND, NULL, NULL);
+ if (out_link && obj)
+ *out_link = obj->link;
+ return !!obj;
+}
+
+typedef struct {
+ int p_key;
+ const char *mode;
+} IpoibInfo;
+
+/* IFLA_IPOIB_* were introduced in the 3.7 kernel, but the kernel headers
+ * we're building against might not have those properties even though the
+ * running kernel might.
+ */
+#define IFLA_IPOIB_UNSPEC 0
+#define IFLA_IPOIB_PKEY 1
+#define IFLA_IPOIB_MODE 2
+#define IFLA_IPOIB_UMCAST 3
+#undef IFLA_IPOIB_MAX
+#define IFLA_IPOIB_MAX IFLA_IPOIB_UMCAST
+
+#define IPOIB_MODE_DATAGRAM 0 /* using unreliable datagram QPs */
+#define IPOIB_MODE_CONNECTED 1 /* using connected QPs */
+
+static const struct nla_policy infiniband_info_policy[IFLA_IPOIB_MAX + 1] = {
+ [IFLA_IPOIB_PKEY] = { .type = NLA_U16 },
+ [IFLA_IPOIB_MODE] = { .type = NLA_U16 },
+ [IFLA_IPOIB_UMCAST] = { .type = NLA_U16 },
+};
+
+static int
+infiniband_info_data_parser (struct nlattr *info_data, gpointer parser_data)
+{
+ IpoibInfo *info = parser_data;
+ struct nlattr *tb[IFLA_MACVLAN_MAX + 1];
+ int err;
+
+ err = nla_parse_nested (tb, IFLA_IPOIB_MAX, info_data,
+ (struct nla_policy *) infiniband_info_policy);
+ if (err < 0)
+ return err;
+ if (!tb[IFLA_IPOIB_PKEY] || !tb[IFLA_IPOIB_MODE])
+ return -EINVAL;
+
+ info->p_key = nla_get_u16 (tb[IFLA_IPOIB_PKEY]);
+
+ switch (nla_get_u16 (tb[IFLA_IPOIB_MODE])) {
+ case IPOIB_MODE_DATAGRAM:
+ info->mode = "datagram";
+ break;
+ case IPOIB_MODE_CONNECTED:
+ info->mode = "connected";
+ break;
+ default:
+ return -NLE_PARSE_ERR;
}
- return success;
+ return 0;
+}
+
+static gboolean
+infiniband_get_info (NMPlatform *platform, int ifindex, int *parent, int *p_key, const char **mode)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ const NMPObject *obj;
+ IpoibInfo info = { -1, NULL };
+
+ obj = cache_lookup_link (platform, ifindex);
+ if (!obj)
+ return FALSE;
+
+ if (parent)
+ *parent = obj->link.parent;
+
+ if (_nl_link_parse_info_data (priv->nlh,
+ ifindex,
+ infiniband_info_data_parser,
+ &info) != 0) {
+ const char *iface = obj->link.name;
+ char *path, *contents = NULL;
+
+ /* Fall back to reading sysfs */
+ path = g_strdup_printf ("/sys/class/net/%s/mode", ASSERT_VALID_PATH_COMPONENT (iface));
+ contents = nm_platform_sysctl_get (platform, path);
+ g_free (path);
+ if (!contents)
+ return FALSE;
+
+ if (strstr (contents, "datagram"))
+ info.mode = "datagram";
+ else if (strstr (contents, "connected"))
+ info.mode = "connected";
+ g_free (contents);
+
+ path = g_strdup_printf ("/sys/class/net/%s/pkey", ASSERT_VALID_PATH_COMPONENT (iface));
+ contents = nm_platform_sysctl_get (platform, path);
+ g_free (path);
+ if (!contents)
+ return FALSE;
+
+ info.p_key = (int) _nm_utils_ascii_str_to_int64 (contents, 16, 0, 0xFFFF, -1);
+ g_free (contents);
+
+ if (info.p_key < 0)
+ return FALSE;
+ }
+
+ if (p_key)
+ *p_key = info.p_key;
+ if (mode)
+ *mode = info.mode;
+ return TRUE;
}
static gboolean
veth_get_properties (NMPlatform *platform, int ifindex, NMPlatformVethProperties *props)
{
const char *ifname;
- gs_free struct ethtool_stats *stats = NULL;
- int peer_ifindex_stat;
+ int peer_ifindex;
- ifname = nm_platform_link_get_name (ifindex);
+ ifname = nm_platform_link_get_name (platform, ifindex);
if (!ifname)
return FALSE;
- peer_ifindex_stat = ethtool_get_stringset_index (ifname, ETH_SS_STATS, "peer_ifindex");
- if (peer_ifindex_stat == -1) {
- debug ("%s: peer_ifindex ethtool stat does not exist?", ifname);
+ peer_ifindex = nmp_utils_ethtool_get_peer_ifindex (ifname);
+ if (peer_ifindex <= 0)
return FALSE;
- }
- stats = g_malloc0 (sizeof (*stats) + (peer_ifindex_stat + 1) * sizeof (guint64));
- stats->cmd = ETHTOOL_GSTATS;
- stats->n_stats = peer_ifindex_stat + 1;
- if (!ethtool_get (ifname, stats))
- return FALSE;
-
- props->peer = stats->data[peer_ifindex_stat];
+ props->peer = peer_ifindex;
return TRUE;
}
static gboolean
-tun_get_properties (NMPlatform *platform, int ifindex, NMPlatformTunProperties *props)
+tun_get_properties_ifname (NMPlatform *platform, const char *ifname, NMPlatformTunProperties *props)
{
- const char *ifname;
char *path, *val;
gboolean success = TRUE;
@@ -2984,16 +3434,15 @@ tun_get_properties (NMPlatform *platform, int ifindex, NMPlatformTunProperties *
props->owner = -1;
props->group = -1;
- ifname = nm_platform_link_get_name (ifindex);
if (!ifname || !nm_utils_iface_valid_name (ifname))
return FALSE;
ifname = ASSERT_VALID_PATH_COMPONENT (ifname);
path = g_strdup_printf ("/sys/class/net/%s/owner", ifname);
- val = nm_platform_sysctl_get (path);
+ val = nm_platform_sysctl_get (platform, path);
g_free (path);
if (val) {
- props->owner = nm_utils_ascii_str_to_int64 (val, 10, -1, G_MAXINT64, -1);
+ props->owner = _nm_utils_ascii_str_to_int64 (val, 10, -1, G_MAXINT64, -1);
if (errno)
success = FALSE;
g_free (val);
@@ -3001,10 +3450,10 @@ tun_get_properties (NMPlatform *platform, int ifindex, NMPlatformTunProperties *
success = FALSE;
path = g_strdup_printf ("/sys/class/net/%s/group", ifname);
- val = nm_platform_sysctl_get (path);
+ val = nm_platform_sysctl_get (platform, path);
g_free (path);
if (val) {
- props->group = nm_utils_ascii_str_to_int64 (val, 10, -1, G_MAXINT64, -1);
+ props->group = _nm_utils_ascii_str_to_int64 (val, 10, -1, G_MAXINT64, -1);
if (errno)
success = FALSE;
g_free (val);
@@ -3012,12 +3461,12 @@ tun_get_properties (NMPlatform *platform, int ifindex, NMPlatformTunProperties *
success = FALSE;
path = g_strdup_printf ("/sys/class/net/%s/tun_flags", ifname);
- val = nm_platform_sysctl_get (path);
+ val = nm_platform_sysctl_get (platform, path);
g_free (path);
if (val) {
gint64 flags;
- flags = nm_utils_ascii_str_to_int64 (val, 16, 0, G_MAXINT64, 0);
+ flags = _nm_utils_ascii_str_to_int64 (val, 16, 0, G_MAXINT64, 0);
if (!errno) {
#ifndef IFF_MULTI_QUEUE
const int IFF_MULTI_QUEUE = 0x0100;
@@ -3035,6 +3484,12 @@ tun_get_properties (NMPlatform *platform, int ifindex, NMPlatformTunProperties *
return success;
}
+static gboolean
+tun_get_properties (NMPlatform *platform, int ifindex, NMPlatformTunProperties *props)
+{
+ return tun_get_properties_ifname (platform, nm_platform_link_get_name (platform, ifindex), props);
+}
+
static const struct nla_policy macvlan_info_policy[IFLA_MACVLAN_MAX + 1] = {
[IFLA_MACVLAN_MODE] = { .type = NLA_U32 },
#ifdef MACVLAN_FLAG_NOPROMISC
@@ -3084,20 +3539,20 @@ static gboolean
macvlan_get_properties (NMPlatform *platform, int ifindex, NMPlatformMacvlanProperties *props)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- auto_nl_object struct rtnl_link *rtnllink = NULL;
int err;
+ const NMPObject *obj;
- rtnllink = link_get (platform, ifindex);
- if (!rtnllink)
+ obj = cache_lookup_link (platform, ifindex);
+ if (!obj)
return FALSE;
- props->parent_ifindex = rtnl_link_get_link (rtnllink);
+ props->parent_ifindex = obj->link.parent;
- err = nm_rtnl_link_parse_info_data (priv->nlh, ifindex,
- macvlan_info_data_parser, props);
+ err = _nl_link_parse_info_data (priv->nlh, ifindex,
+ macvlan_info_data_parser, props);
if (err != 0) {
warning ("(%s) could not read properties: %s",
- rtnl_link_get_name (rtnllink), nl_geterror (err));
+ obj->link.name, nl_geterror (err));
}
return (err == 0);
}
@@ -3224,11 +3679,11 @@ vxlan_get_properties (NMPlatform *platform, int ifindex, NMPlatformVxlanProperti
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
int err;
- err = nm_rtnl_link_parse_info_data (priv->nlh, ifindex,
- vxlan_info_data_parser, props);
+ err = _nl_link_parse_info_data (priv->nlh, ifindex,
+ vxlan_info_data_parser, props);
if (err != 0) {
- warning ("(%s) could not read properties: %s",
- link_get_name (platform, ifindex), nl_geterror (err));
+ warning ("(%s) could not read vxlan properties: %s",
+ nm_platform_link_get_name (platform, ifindex), nl_geterror (err));
}
return (err == 0);
}
@@ -3278,11 +3733,11 @@ gre_get_properties (NMPlatform *platform, int ifindex, NMPlatformGreProperties *
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
int err;
- err = nm_rtnl_link_parse_info_data (priv->nlh, ifindex,
- gre_info_data_parser, props);
+ err = _nl_link_parse_info_data (priv->nlh, ifindex,
+ gre_info_data_parser, props);
if (err != 0) {
- warning ("(%s) could not read properties: %s",
- link_get_name (platform, ifindex), nl_geterror (err));
+ warning ("(%s) could not read gre properties: %s",
+ nm_platform_link_get_name (platform, ifindex), nl_geterror (err));
}
return (err == 0);
}
@@ -3295,26 +3750,25 @@ wifi_get_wifi_data (NMPlatform *platform, int ifindex)
wifi_data = g_hash_table_lookup (priv->wifi_data, GINT_TO_POINTER (ifindex));
if (!wifi_data) {
- NMLinkType type;
- const char *ifname;
-
- type = link_get_type (platform, ifindex);
- ifname = link_get_name (platform, ifindex);
-
- if (type == NM_LINK_TYPE_WIFI)
- wifi_data = wifi_utils_init (ifname, ifindex, TRUE);
- else if (type == NM_LINK_TYPE_OLPC_MESH) {
- /* The kernel driver now uses nl80211, but we force use of WEXT because
- * the cfg80211 interactions are not quite ready to support access to
- * mesh control through nl80211 just yet.
- */
+ const NMPlatformLink *pllink;
+
+ pllink = nm_platform_link_get (platform, ifindex);
+ if (pllink) {
+ if (pllink->type == NM_LINK_TYPE_WIFI)
+ wifi_data = wifi_utils_init (pllink->name, ifindex, TRUE);
+ else if (pllink->type == NM_LINK_TYPE_OLPC_MESH) {
+ /* The kernel driver now uses nl80211, but we force use of WEXT because
+ * the cfg80211 interactions are not quite ready to support access to
+ * mesh control through nl80211 just yet.
+ */
#if HAVE_WEXT
- wifi_data = wifi_wext_init (ifname, ifindex, FALSE);
+ wifi_data = wifi_wext_init (pllink->name, ifindex, FALSE);
#endif
- }
+ }
- if (wifi_data)
- g_hash_table_insert (priv->wifi_data, GINT_TO_POINTER (ifindex), wifi_data);
+ if (wifi_data)
+ g_hash_table_insert (priv->wifi_data, GINT_TO_POINTER (ifindex), wifi_data);
+ }
}
return wifi_data;
@@ -3460,18 +3914,11 @@ mesh_set_ssid (NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len)
static gboolean
link_get_wake_on_lan (NMPlatform *platform, int ifindex)
{
- NMLinkType type = link_get_type (platform, ifindex);
-
- if (type == NM_LINK_TYPE_ETHERNET) {
- struct ethtool_wolinfo wol;
+ NMLinkType type = nm_platform_link_get_type (platform, ifindex);
- memset (&wol, 0, sizeof (wol));
- wol.cmd = ETHTOOL_GWOL;
- if (!ethtool_get (link_get_name (platform, ifindex), &wol))
- return FALSE;
-
- return wol.wolopts != 0;
- } else if (type == NM_LINK_TYPE_WIFI) {
+ if (type == NM_LINK_TYPE_ETHERNET)
+ return nmp_utils_ethtool_get_wake_on_lan (nm_platform_link_get_name (platform, ifindex));
+ else if (type == NM_LINK_TYPE_WIFI) {
WifiData *wifi_data = wifi_get_wifi_data (platform, ifindex);
if (!wifi_data)
@@ -3482,55 +3929,45 @@ link_get_wake_on_lan (NMPlatform *platform, int ifindex)
return FALSE;
}
-/******************************************************************/
-
static gboolean
-_address_match (struct rtnl_addr *addr, int family, int ifindex)
+link_get_driver_info (NMPlatform *platform,
+ int ifindex,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version)
{
- g_return_val_if_fail (addr, FALSE);
-
- return rtnl_addr_get_family (addr) == family &&
- (ifindex == 0 || rtnl_addr_get_ifindex (addr) == ifindex);
+ return nmp_utils_ethtool_get_driver_info (nm_platform_link_get_name (platform, ifindex),
+ out_driver_name,
+ out_driver_version,
+ out_fw_version);
}
+/******************************************************************/
+
static GArray *
-ip4_address_get_all (NMPlatform *platform, int ifindex)
+ipx_address_get_all (NMPlatform *platform, int ifindex, NMPObjectType obj_type)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GArray *addresses;
- NMPlatformIP4Address address;
- struct nl_object *object;
- addresses = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Address));
+ nm_assert (NM_IN_SET (obj_type, NMP_OBJECT_TYPE_IP4_ADDRESS, NMP_OBJECT_TYPE_IP6_ADDRESS));
- for (object = nl_cache_get_first (priv->address_cache); object; object = nl_cache_get_next (object)) {
- if (_address_match ((struct rtnl_addr *) object, AF_INET, ifindex)) {
- if (init_ip4_address (&address, (struct rtnl_addr *) object))
- g_array_append_val (addresses, address);
- }
- }
+ return nmp_cache_lookup_multi_to_array (priv->cache,
+ obj_type,
+ nmp_cache_id_init_addrroute_visible_by_ifindex (NMP_CACHE_ID_STATIC,
+ obj_type,
+ ifindex));
+}
- return addresses;
+static GArray *
+ip4_address_get_all (NMPlatform *platform, int ifindex)
+{
+ return ipx_address_get_all (platform, ifindex, NMP_OBJECT_TYPE_IP4_ADDRESS);
}
static GArray *
ip6_address_get_all (NMPlatform *platform, int ifindex)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GArray *addresses;
- NMPlatformIP6Address address;
- struct nl_object *object;
-
- addresses = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Address));
-
- for (object = nl_cache_get_first (priv->address_cache); object; object = nl_cache_get_next (object)) {
- if (_address_match ((struct rtnl_addr *) object, AF_INET6, ifindex)) {
- if (init_ip6_address (&address, (struct rtnl_addr *) object))
- g_array_append_val (addresses, address);
- }
- }
-
- return addresses;
+ return ipx_address_get_all (platform, ifindex, NMP_OBJECT_TYPE_IP6_ADDRESS);
}
#define IPV4LL_NETWORK (htonl (0xA9FE0000L))
@@ -3543,7 +3980,8 @@ ip4_is_link_local (const struct in_addr *src)
}
static struct nl_object *
-build_rtnl_addr (int family,
+build_rtnl_addr (NMPlatform *platform,
+ int family,
int ifindex,
gconstpointer addr,
gconstpointer peer_addr,
@@ -3553,10 +3991,10 @@ build_rtnl_addr (int family,
guint flags,
const char *label)
{
- auto_nl_object struct rtnl_addr *rtnladdr = _nm_rtnl_addr_alloc (ifindex);
+ auto_nl_object struct rtnl_addr *rtnladdr = _nl_rtnl_addr_alloc (ifindex);
struct rtnl_addr *rtnladdr_copy;
int addrlen = family == AF_INET ? sizeof (in_addr_t) : sizeof (struct in6_addr);
- auto_nl_addr struct nl_addr *nladdr = _nm_nl_addr_build (family, addr, addrlen);
+ auto_nl_addr struct nl_addr *nladdr = _nl_addr_build (family, addr, addrlen);
int nle;
/* IP address */
@@ -3568,7 +4006,7 @@ build_rtnl_addr (int family,
/* Tighten scope (IPv4 only) */
if (family == AF_INET && ip4_is_link_local (addr))
- rtnl_addr_set_scope (rtnladdr, rtnl_str2scope ("link"));
+ rtnl_addr_set_scope (rtnladdr, RT_SCOPE_LINK);
/* IPv4 Broadcast address */
if (family == AF_INET) {
@@ -3576,14 +4014,14 @@ build_rtnl_addr (int family,
auto_nl_addr struct nl_addr *bcaddr = NULL;
bcast = *((in_addr_t *) addr) | ~nm_utils_ip4_prefix_to_netmask (plen);
- bcaddr = _nm_nl_addr_build (family, &bcast, addrlen);
+ bcaddr = _nl_addr_build (family, &bcast, addrlen);
g_assert (bcaddr);
rtnl_addr_set_broadcast (rtnladdr, bcaddr);
}
/* Peer/point-to-point address */
if (peer_addr) {
- auto_nl_addr struct nl_addr *nlpeer = _nm_nl_addr_build (family, peer_addr, addrlen);
+ auto_nl_addr struct nl_addr *nlpeer = _nl_addr_build (family, peer_addr, addrlen);
nle = rtnl_addr_set_peer (rtnladdr, nlpeer);
if (nle && nle != -NLE_AF_NOSUPPORT) {
@@ -3593,19 +4031,15 @@ build_rtnl_addr (int family,
}
}
- rtnl_addr_set_prefixlen (rtnladdr, plen);
- if (lifetime) {
- /* note that here we set the relative timestamps (ticking from *now*).
- * Contrary to the rtnl_addr objects from our cache, which have absolute
- * timestamps (see _rtnl_addr_hack_lifetimes_rel_to_abs()).
- *
- * This is correct, because we only use build_rtnl_addr() for
- * add_object(), delete_object() and cache search (ip_address_exists). */
+ _nl_rtnl_addr_set_prefixlen (rtnladdr, plen);
+ if ( (lifetime != 0 && lifetime != NM_PLATFORM_LIFETIME_PERMANENT)
+ || (preferred != 0 && preferred != NM_PLATFORM_LIFETIME_PERMANENT)) {
+ /* note that here we set the relative timestamps (ticking from *now*). */
rtnl_addr_set_valid_lifetime (rtnladdr, lifetime);
rtnl_addr_set_preferred_lifetime (rtnladdr, preferred);
}
if (flags) {
- if ((flags & ~0xFF) && !check_support_kernel_extended_ifa_flags (nm_platform_get ())) {
+ if ((flags & ~0xFF) && !_support_kernel_extended_ifa_flags_get ()) {
/* Older kernels don't accept unknown netlink attributes.
*
* With commit libnl commit 5206c050504f8676a24854519b9c351470fb7cc6, libnl will only set
@@ -3625,6 +4059,48 @@ build_rtnl_addr (int family,
return (struct nl_object *) rtnladdr_copy;
}
+struct nl_object *
+_nmp_vt_cmd_plobj_to_nl_ip4_address (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only)
+{
+ const NMPlatformIP4Address *obj = (const NMPlatformIP4Address *) _obj;
+ guint32 lifetime, preferred;
+
+ nmp_utils_lifetime_get (obj->timestamp, obj->lifetime, obj->preferred,
+ 0, 0, &lifetime, &preferred);
+
+ return build_rtnl_addr (platform,
+ AF_INET,
+ obj->ifindex,
+ &obj->address,
+ obj->peer_address ? &obj->peer_address : NULL,
+ obj->plen,
+ lifetime,
+ preferred,
+ 0,
+ obj->label[0] ? obj->label : NULL);
+}
+
+struct nl_object *
+_nmp_vt_cmd_plobj_to_nl_ip6_address (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only)
+{
+ const NMPlatformIP6Address *obj = (const NMPlatformIP6Address *) _obj;
+ guint32 lifetime, preferred;
+
+ nmp_utils_lifetime_get (obj->timestamp, obj->lifetime, obj->preferred,
+ 0, 0, &lifetime, &preferred);
+
+ return build_rtnl_addr (platform,
+ AF_INET6,
+ obj->ifindex,
+ &obj->address,
+ !IN6_IS_ADDR_UNSPECIFIED (&obj->peer_address) ? &obj->peer_address : NULL,
+ obj->plen,
+ lifetime,
+ preferred,
+ 0,
+ NULL);
+}
+
static gboolean
ip4_address_add (NMPlatform *platform,
int ifindex,
@@ -3635,10 +4111,16 @@ ip4_address_add (NMPlatform *platform,
guint32 preferred,
const char *label)
{
- return add_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr,
- peer_addr ? &peer_addr : NULL,
- plen, lifetime, preferred, 0,
- label));
+ NMPObject obj_needle;
+ auto_nl_object struct nl_object *nlo = NULL;
+
+ nlo = build_rtnl_addr (platform, AF_INET, ifindex, &addr,
+ peer_addr ? &peer_addr : NULL,
+ plen, lifetime, preferred, 0,
+ label);
+ return do_add_addrroute (platform,
+ nmp_object_stackinit_id_ip4_address (&obj_needle, ifindex, addr, plen),
+ nlo);
}
static gboolean
@@ -3651,169 +4133,114 @@ ip6_address_add (NMPlatform *platform,
guint32 preferred,
guint flags)
{
- return add_object (platform, build_rtnl_addr (AF_INET6, ifindex, &addr,
- IN6_IS_ADDR_UNSPECIFIED (&peer_addr) ? NULL : &peer_addr,
- plen, lifetime, preferred, flags,
- NULL));
+ NMPObject obj_needle;
+ auto_nl_object struct nl_object *nlo = NULL;
+
+ nlo = build_rtnl_addr (platform, AF_INET6, ifindex, &addr,
+ IN6_IS_ADDR_UNSPECIFIED (&peer_addr) ? NULL : &peer_addr,
+ plen, lifetime, preferred, flags,
+ NULL);
+ return do_add_addrroute (platform,
+ nmp_object_stackinit_id_ip6_address (&obj_needle, ifindex, &addr, plen),
+ nlo);
}
static gboolean
ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen, in_addr_t peer_address)
{
- return delete_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr, peer_address ? &peer_address : NULL, plen, 0, 0, 0, NULL), TRUE);
+ NMPObject obj_needle;
+
+ nmp_object_stackinit_id_ip4_address (&obj_needle, ifindex, addr, plen);
+ obj_needle.ip4_address.peer_address = peer_address;
+ return do_delete_object (platform, &obj_needle, NULL);
}
static gboolean
ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen)
{
- return delete_object (platform, build_rtnl_addr (AF_INET6, ifindex, &addr, NULL, plen, 0, 0, 0, NULL), TRUE);
+ NMPObject obj_needle;
+
+ nmp_object_stackinit_id_ip6_address (&obj_needle, ifindex, &addr, plen);
+ return do_delete_object (platform, &obj_needle, NULL);
}
-static gboolean
-ip_address_exists (NMPlatform *platform, int family, int ifindex, gconstpointer addr, int plen)
+static const NMPlatformIP4Address *
+ip4_address_get (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
{
- auto_nl_object struct nl_object *object = build_rtnl_addr (family, ifindex, addr, NULL, plen, 0, 0, 0, NULL);
- auto_nl_object struct nl_object *cached_object = nl_cache_search (choose_cache (platform, object), object);
+ NMPObject obj_needle;
+ const NMPObject *obj;
- return !!cached_object;
+ nmp_object_stackinit_id_ip4_address (&obj_needle, ifindex, addr, plen);
+ obj = nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, &obj_needle);
+ if (nmp_object_is_visible (obj))
+ return &obj->ip4_address;
+ return NULL;
}
-static gboolean
-ip4_address_exists (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
+static const NMPlatformIP6Address *
+ip6_address_get (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen)
{
- return ip_address_exists (platform, AF_INET, ifindex, &addr, plen);
-}
+ NMPObject obj_needle;
+ const NMPObject *obj;
-static gboolean
-ip6_address_exists (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen)
-{
- return ip_address_exists (platform, AF_INET6, ifindex, &addr, plen);
+ nmp_object_stackinit_id_ip6_address (&obj_needle, ifindex, &addr, plen);
+ obj = nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, &obj_needle);
+ if (nmp_object_is_visible (obj))
+ return &obj->ip6_address;
+ return NULL;
}
-static gboolean
-ip4_check_reinstall_device_route (NMPlatform *platform, int ifindex, const NMPlatformIP4Address *address, guint32 device_route_metric)
+/******************************************************************/
+
+static GArray *
+ipx_route_get_all (NMPlatform *platform, int ifindex, NMPObjectType obj_type, NMPlatformGetRouteFlags flags)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- NMPlatformIP4Address addr_candidate;
- NMPlatformIP4Route route_candidate;
- struct nl_object *object;
- guint32 device_network;
-
- for (object = nl_cache_get_first (priv->address_cache); object; object = nl_cache_get_next (object)) {
- if (_address_match ((struct rtnl_addr *) object, AF_INET, 0)) {
- if (init_ip4_address (&addr_candidate, (struct rtnl_addr *) object))
- if ( addr_candidate.plen == address->plen
- && addr_candidate.address == address->address) {
- /* If we already have the same address installed on any interface,
- * we back off.
- * Perform this check first, as we expect to have significantly less
- * addresses to search. */
- return FALSE;
- }
- }
- }
+ NMPCacheId cache_id;
+ const NMPlatformIPRoute *const* routes;
+ GArray *array;
+ const NMPClass *klass;
+ gboolean with_rtprot_kernel;
+ guint i, len;
- device_network = nm_utils_ip4_address_clear_host_address (address->address, address->plen);
-
- for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) {
- if (_route_match ((struct rtnl_route *) object, AF_INET, 0, TRUE)) {
- if (init_ip4_route (&route_candidate, (struct rtnl_route *) object)) {
- if ( route_candidate.network == device_network
- && route_candidate.plen == address->plen
- && ( route_candidate.metric == 0
- || route_candidate.metric == device_route_metric)) {
- /* There is already any route with metric 0 or the metric we want to install
- * for the same subnet. */
- return FALSE;
- }
- }
- }
- }
+ nm_assert (NM_IN_SET (obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE));
- return TRUE;
-}
+ if (!NM_FLAGS_ANY (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT))
+ flags |= NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT;
-/******************************************************************/
+ klass = nmp_class_from_type (obj_type);
-static gboolean
-_route_match (struct rtnl_route *rtnlroute, int family, int ifindex, gboolean include_proto_kernel)
-{
- struct rtnl_nexthop *nexthop;
+ nmp_cache_id_init_routes_visible (&cache_id,
+ obj_type,
+ NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT),
+ NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT),
+ ifindex);
- g_return_val_if_fail (rtnlroute, FALSE);
+ routes = (const NMPlatformIPRoute *const*) nmp_cache_lookup_multi (priv->cache, &cache_id, &len);
- if (rtnl_route_get_type (rtnlroute) != RTN_UNICAST ||
- rtnl_route_get_table (rtnlroute) != RT_TABLE_MAIN ||
- rtnl_route_get_tos (rtnlroute) != 0 ||
- (!include_proto_kernel && rtnl_route_get_protocol (rtnlroute) == RTPROT_KERNEL) ||
- rtnl_route_get_family (rtnlroute) != family ||
- rtnl_route_get_nnexthops (rtnlroute) != 1 ||
- rtnl_route_get_flags (rtnlroute) & RTM_F_CLONED)
- return FALSE;
+ array = g_array_sized_new (FALSE, FALSE, klass->sizeof_public, len);
- if (ifindex == 0)
- return TRUE;
+ with_rtprot_kernel = NM_FLAGS_HAS (flags, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_RTPROT_KERNEL);
+ for (i = 0; i < len; i++) {
+ nm_assert (NMP_OBJECT_GET_CLASS (NMP_OBJECT_UP_CAST (routes[i])) == klass);
- nexthop = rtnl_route_nexthop_n (rtnlroute, 0);
- return rtnl_route_nh_get_ifindex (nexthop) == ifindex;
+ if ( with_rtprot_kernel
+ || routes[i]->source != NM_IP_CONFIG_SOURCE_RTPROT_KERNEL)
+ g_array_append_vals (array, routes[i], 1);
+ }
+ return array;
}
static GArray *
-ip4_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteMode mode)
+ip4_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteFlags flags)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GArray *routes;
- NMPlatformIP4Route route;
- struct nl_object *object;
-
- g_return_val_if_fail (NM_IN_SET (mode, NM_PLATFORM_GET_ROUTE_MODE_ALL, NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT), NULL);
-
- routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
-
- for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) {
- if (_route_match ((struct rtnl_route *) object, AF_INET, ifindex, FALSE)) {
- if (_rtnl_route_is_default ((struct rtnl_route *) object)) {
- if (mode == NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT)
- continue;
- } else {
- if (mode == NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT)
- continue;
- }
- if (init_ip4_route (&route, (struct rtnl_route *) object))
- g_array_append_val (routes, route);
- }
- }
-
- return routes;
+ return ipx_route_get_all (platform, ifindex, NMP_OBJECT_TYPE_IP4_ROUTE, flags);
}
static GArray *
-ip6_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteMode mode)
+ip6_route_get_all (NMPlatform *platform, int ifindex, NMPlatformGetRouteFlags flags)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- GArray *routes;
- NMPlatformIP6Route route;
- struct nl_object *object;
-
- g_return_val_if_fail (NM_IN_SET (mode, NM_PLATFORM_GET_ROUTE_MODE_ALL, NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT, NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT), NULL);
-
- routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Route));
-
- for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) {
- if (_route_match ((struct rtnl_route *) object, AF_INET6, ifindex, FALSE)) {
- if (_rtnl_route_is_default ((struct rtnl_route *) object)) {
- if (mode == NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT)
- continue;
- } else {
- if (mode == NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT)
- continue;
- }
- if (init_ip6_route (&route, (struct rtnl_route *) object))
- g_array_append_val (routes, route);
- }
- }
-
- return routes;
+ return ipx_route_get_all (platform, ifindex, NMP_OBJECT_TYPE_IP6_ROUTE, flags);
}
static void
@@ -3846,26 +4273,26 @@ build_rtnl_route (int family, int ifindex, NMIPConfigSource source,
int addrlen = (family == AF_INET) ? sizeof (in_addr_t) : sizeof (struct in6_addr);
/* Workaround a libnl bug by using zero destination address length for default routes */
auto_nl_addr struct nl_addr *dst = NULL;
- auto_nl_addr struct nl_addr *gw = gateway ? _nm_nl_addr_build (family, gateway, addrlen) : NULL;
- auto_nl_addr struct nl_addr *pref_src_nl = pref_src ? _nm_nl_addr_build (family, pref_src, addrlen) : NULL;
+ auto_nl_addr struct nl_addr *gw = gateway ? _nl_addr_build (family, gateway, addrlen) : NULL;
+ auto_nl_addr struct nl_addr *pref_src_nl = pref_src ? _nl_addr_build (family, pref_src, addrlen) : NULL;
/* There seem to be problems adding a route with non-zero host identifier.
* Adding IPv6 routes is simply ignored, without error message.
* In the IPv4 case, we got an error. Thus, we have to make sure, that
* the address is sane. */
clear_host_address (family, network, plen, network_clean);
- dst = _nm_nl_addr_build (family, network_clean, plen ? addrlen : 0);
+ dst = _nl_addr_build (family, network_clean, plen ? addrlen : 0);
nl_addr_set_prefixlen (dst, plen);
- rtnlroute = _nm_rtnl_route_alloc ();
+ rtnlroute = _nl_rtnl_route_alloc ();
rtnl_route_set_table (rtnlroute, RT_TABLE_MAIN);
rtnl_route_set_tos (rtnlroute, 0);
rtnl_route_set_dst (rtnlroute, dst);
rtnl_route_set_priority (rtnlroute, metric);
rtnl_route_set_family (rtnlroute, family);
- rtnl_route_set_protocol (rtnlroute, source_to_rtprot (source));
+ rtnl_route_set_protocol (rtnlroute, _nm_ip_config_source_to_rtprot (source));
- nexthop = _nm_rtnl_route_nh_alloc ();
+ nexthop = _nl_rtnl_route_nh_alloc ();
rtnl_route_nh_set_ifindex (nexthop, ifindex);
if (gw && !nl_addr_iszero (gw))
rtnl_route_nh_set_gateway (nexthop, gw);
@@ -3879,111 +4306,113 @@ build_rtnl_route (int family, int ifindex, NMIPConfigSource source,
return (struct nl_object *) rtnlroute;
}
-static gboolean
-ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
- in_addr_t network, int plen, in_addr_t gateway,
- guint32 pref_src, guint32 metric, guint32 mss)
+struct nl_object *
+_nmp_vt_cmd_plobj_to_nl_ip4_route (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only)
{
- return add_object (platform, build_rtnl_route (AF_INET, ifindex, source, &network, plen, &gateway, pref_src ? &pref_src : NULL, metric, mss));
+ const NMPlatformIP4Route *obj = (const NMPlatformIP4Route *) _obj;
+
+ return build_rtnl_route (AF_INET,
+ obj->ifindex,
+ obj->source,
+ &obj->network,
+ obj->plen,
+ &obj->gateway,
+ obj->pref_src ? &obj->pref_src : NULL,
+ obj->metric,
+ obj->mss);
}
-static gboolean
-ip6_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
- struct in6_addr network, int plen, struct in6_addr gateway,
- guint32 metric, guint32 mss)
+struct nl_object *
+_nmp_vt_cmd_plobj_to_nl_ip6_route (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only)
{
- metric = nm_utils_ip6_route_metric_normalize (metric);
+ const NMPlatformIP6Route *obj = (const NMPlatformIP6Route *) _obj;
- return add_object (platform, build_rtnl_route (AF_INET6, ifindex, source, &network, plen, &gateway, NULL, metric, mss));
+ return build_rtnl_route (AF_INET6,
+ obj->ifindex,
+ obj->source,
+ &obj->network,
+ obj->plen,
+ &obj->gateway,
+ NULL,
+ obj->metric,
+ obj->mss);
}
-static struct rtnl_route *
-route_search_cache (struct nl_cache *cache, int family, int ifindex, const void *network, int plen, guint32 metric)
+static gboolean
+ip4_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
+ in_addr_t network, int plen, in_addr_t gateway,
+ guint32 pref_src, guint32 metric, guint32 mss)
{
- guint32 network_clean[4], dst_clean[4];
- struct nl_object *object;
-
- clear_host_address (family, network, plen, network_clean);
+ NMPObject obj_needle;
+ auto_nl_object struct nl_object *nlo = NULL;
- for (object = nl_cache_get_first (cache); object; object = nl_cache_get_next (object)) {
- struct nl_addr *dst;
- struct rtnl_route *rtnlroute = (struct rtnl_route *) object;
-
- if (!_route_match (rtnlroute, family, ifindex, FALSE))
- continue;
-
- if (metric != rtnl_route_get_priority (rtnlroute))
- continue;
-
- dst = rtnl_route_get_dst (rtnlroute);
- if ( !dst
- || nl_addr_get_family (dst) != family
- || nl_addr_get_prefixlen (dst) != plen)
- continue;
-
- /* plen = 0 means all host bits, so all bits should be cleared.
- * Likewise if the binary address is not present or all zeros.
- */
- if (plen == 0 || nl_addr_iszero (dst))
- memset (dst_clean, 0, sizeof (dst_clean));
- else
- clear_host_address (family, nl_addr_get_binary_addr (dst), plen, dst_clean);
-
- if (memcmp (dst_clean, network_clean,
- family == AF_INET ? sizeof (guint32) : sizeof (struct in6_addr)) != 0)
- continue;
-
- rtnl_route_get (rtnlroute);
- return rtnlroute;
- }
- return NULL;
+ nlo = build_rtnl_route (AF_INET, ifindex, source, &network, plen, &gateway, pref_src ? &pref_src : NULL, metric, mss);
+ return do_add_addrroute (platform,
+ nmp_object_stackinit_id_ip4_route (&obj_needle, ifindex, network, plen, metric),
+ nlo);
}
static gboolean
-refresh_route (NMPlatform *platform, int family, int ifindex, const void *network, int plen, guint32 metric)
+ip6_route_add (NMPlatform *platform, int ifindex, NMIPConfigSource source,
+ struct in6_addr network, int plen, struct in6_addr gateway,
+ guint32 metric, guint32 mss)
{
- struct nl_cache *cache;
- auto_nl_object struct rtnl_route *cached_object = NULL;
+ NMPObject obj_needle;
+ auto_nl_object struct nl_object *nlo = NULL;
- cache = choose_cache_by_type (platform, family == AF_INET ? OBJECT_TYPE_IP4_ROUTE : OBJECT_TYPE_IP6_ROUTE);
- cached_object = route_search_cache (cache, family, ifindex, network, plen, metric);
+ metric = nm_utils_ip6_route_metric_normalize (metric);
- if (cached_object)
- return refresh_object (platform, (struct nl_object *) cached_object, TRUE, NM_PLATFORM_REASON_INTERNAL);
- return TRUE;
+ nlo = build_rtnl_route (AF_INET6, ifindex, source, &network, plen, &gateway, NULL, metric, mss);
+ return do_add_addrroute (platform,
+ nmp_object_stackinit_id_ip6_route (&obj_needle, ifindex, &network, plen, metric),
+ nlo);
}
static gboolean
ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
in_addr_t gateway = 0;
- struct rtnl_route *cached_object;
- struct nl_object *route = build_rtnl_route (AF_INET, ifindex, NM_IP_CONFIG_SOURCE_UNKNOWN, &network, plen, &gateway, NULL, metric, 0);
+ auto_nl_object struct nl_object *nlo = build_rtnl_route (AF_INET, ifindex, NM_IP_CONFIG_SOURCE_UNKNOWN, &network, plen, &gateway, NULL, metric, 0);
uint8_t scope = RT_SCOPE_NOWHERE;
- struct nl_cache *cache;
+ const NMPObject *obj;
+ NMPObject obj_needle;
- g_return_val_if_fail (route, FALSE);
+ g_return_val_if_fail (nlo, FALSE);
- cache = choose_cache_by_type (platform, OBJECT_TYPE_IP4_ROUTE);
+ nmp_object_stackinit_id_ip4_route (&obj_needle, ifindex, network, plen, metric);
if (metric == 0) {
/* Deleting an IPv4 route with metric 0 does not only delete an exectly matching route.
* If no route with metric 0 exists, it might delete another route to the same destination.
* For nm_platform_ip4_route_delete() we don't want this semantic.
*
- * Instead, re-fetch the route from kernel, and if that fails, there is nothing to do.
- * On success, there is still a race that we might end up deleting the wrong route. */
- if (!refresh_object (platform, (struct nl_object *) route, FALSE, _NM_PLATFORM_REASON_CACHE_CHECK_INTERNAL)) {
- rtnl_route_put ((struct rtnl_route *) route);
- return TRUE;
- }
+ * Instead, make sure that we have the most recent state and process all
+ * delayed actions (including re-reading data from netlink). */
+ delayed_action_handle_all (platform, TRUE);
}
- /* when deleting an IPv4 route, several fields of the provided route must match.
- * Lookup in the cache so that we hopefully get the right values. */
- cached_object = (struct rtnl_route *) nl_cache_search (cache, route);
- if (!cached_object)
- cached_object = route_search_cache (cache, AF_INET, ifindex, &network, plen, metric);
+ obj = nmp_cache_lookup_obj (priv->cache, &obj_needle);
+
+ if (metric == 0 && !obj) {
+ /* hmm... we are about to delete an IP4 route with metric 0. We must only
+ * send the delete request if such a route really exists. Above we refreshed
+ * the platform cache, still no such route exists.
+ *
+ * Be extra careful and reload the routes. We must be sure that such a
+ * route doesn't exists, because when we add an IPv4 address, we immediately
+ * afterwards try to delete the kernel-added device route with metric 0.
+ * It might be, that we didn't yet get the notification about that route.
+ *
+ * FIXME: once our ip4_address_add() is sure that upon return we have
+ * the latest state from in the platform cache, we might save this
+ * additional expensive cache-resync. */
+ do_request_one_type (platform, NMP_OBJECT_TYPE_IP4_ROUTE, TRUE);
+
+ obj = nmp_cache_lookup_obj (priv->cache, &obj_needle);
+ if (!obj)
+ return TRUE;
+ }
if (!_nl_has_capability (1 /* NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE */)) {
/* When searching for a matching IPv4 route to delete, the kernel
@@ -4000,8 +4429,8 @@ ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, int plen
* So, this workaround is only needed unless we have NL_CAPABILITY_ROUTE_BUILD_MSG_SET_SCOPE.
**/
- if (cached_object)
- scope = rtnl_route_get_scope (cached_object);
+ if (obj)
+ scope = nm_platform_route_scope_inv (obj->ip4_route.scope_inv);
if (scope == RT_SCOPE_NOWHERE) {
/* If we would set the scope to RT_SCOPE_NOWHERE, libnl would guess the scope.
@@ -4010,7 +4439,7 @@ ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, int plen
scope = RT_SCOPE_UNIVERSE;
}
}
- rtnl_route_set_scope ((struct rtnl_route *) route, scope);
+ rtnl_route_set_scope ((struct rtnl_route *) nlo, scope);
/* we only support routes with TOS zero. As such, delete_route() is also only able to delete
* routes with tos==0. build_rtnl_route() already initializes tos properly. */
@@ -4022,179 +4451,51 @@ ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, int plen
* pref_src: NULL
*/
- rtnl_route_put (cached_object);
- return delete_object (platform, route, FALSE) && refresh_route (platform, AF_INET, ifindex, &network, plen, metric);
+ return do_delete_object (platform, &obj_needle, nlo);
}
static gboolean
ip6_route_delete (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
{
struct in6_addr gateway = IN6ADDR_ANY_INIT;
+ auto_nl_object struct nl_object *nlo = NULL;
+ NMPObject obj_needle;
metric = nm_utils_ip6_route_metric_normalize (metric);
- return delete_object (platform, build_rtnl_route (AF_INET6, ifindex, NM_IP_CONFIG_SOURCE_UNKNOWN ,&network, plen, &gateway, NULL, metric, 0), FALSE) &&
- refresh_route (platform, AF_INET6, ifindex, &network, plen, metric);
-}
-
-static gboolean
-ip_route_exists (NMPlatform *platform, int family, int ifindex, gpointer network, int plen, guint32 metric)
-{
- auto_nl_object struct nl_object *object = build_rtnl_route (family, ifindex,
- NM_IP_CONFIG_SOURCE_UNKNOWN,
- network, plen, NULL, NULL, metric, 0);
- struct nl_cache *cache = choose_cache (platform, object);
- auto_nl_object struct nl_object *cached_object = nl_cache_search (cache, object);
-
- if (!cached_object)
- cached_object = (struct nl_object *) route_search_cache (cache, family, ifindex, network, plen, metric);
- return !!cached_object;
-}
-
-static gboolean
-ip4_route_exists (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
-{
- return ip_route_exists (platform, AF_INET, ifindex, &network, plen, metric);
-}
-
-static gboolean
-ip6_route_exists (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
-{
- metric = nm_utils_ip6_route_metric_normalize (metric);
-
- return ip_route_exists (platform, AF_INET6, ifindex, &network, plen, metric);
-}
-
-/******************************************************************/
+ nlo = build_rtnl_route (AF_INET6, ifindex, NM_IP_CONFIG_SOURCE_UNKNOWN ,&network, plen, &gateway, NULL, metric, 0);
-/* Initialize the link cache while ensuring all links are of AF_UNSPEC,
- * family (even though the kernel might set AF_BRIDGE for bridges).
- * See also: _nl_link_family_unset() */
-static void
-init_link_cache (NMPlatform *platform)
-{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- struct nl_object *object = NULL;
+ nmp_object_stackinit_id_ip6_route (&obj_needle, ifindex, &network, plen, metric);
- rtnl_link_alloc_cache (priv->nlh, AF_UNSPEC, &priv->link_cache);
-
- do {
- for (object = nl_cache_get_first (priv->link_cache); object; object = nl_cache_get_next (object)) {
- if (rtnl_link_get_family ((struct rtnl_link *)object) != AF_UNSPEC)
- break;
- }
-
- if (object) {
- /* A non-AF_UNSPEC object encoutnered */
- struct nl_object *existing;
-
- nl_object_get (object);
- nl_cache_remove (object);
- rtnl_link_set_family ((struct rtnl_link *)object, AF_UNSPEC);
- existing = nl_cache_search (priv->link_cache, object);
- if (existing)
- nl_object_put (existing);
- else
- nl_cache_add (priv->link_cache, object);
- nl_object_put (object);
- }
- } while (object);
+ return do_delete_object (platform, &obj_needle, nlo);
}
-/* Calls announce_object with appropriate arguments for all objects
- * which are not coherent between old and new caches and deallocates
- * the old cache. */
-static void
-cache_announce_changes (NMPlatform *platform, struct nl_cache *new, struct nl_cache *old)
+static const NMPlatformIP4Route *
+ip4_route_get (NMPlatform *platform, int ifindex, in_addr_t network, int plen, guint32 metric)
{
- struct nl_object *object;
-
- if (!old)
- return;
+ NMPObject obj_needle;
+ const NMPObject *obj;
- for (object = nl_cache_get_first (new); object; object = nl_cache_get_next (object)) {
- struct nl_object *cached_object = nm_nl_cache_search (old, object);
-
- if (cached_object) {
- ObjectType type = object_type_from_nl_object (object);
- if (nm_nl_object_diff (type, object, cached_object))
- announce_object (platform, object, NM_PLATFORM_SIGNAL_CHANGED, NM_PLATFORM_REASON_EXTERNAL);
- nl_object_put (cached_object);
- } else
- announce_object (platform, object, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_EXTERNAL);
- }
- for (object = nl_cache_get_first (old); object; object = nl_cache_get_next (object)) {
- struct nl_object *cached_object = nm_nl_cache_search (new, object);
- if (cached_object)
- nl_object_put (cached_object);
- else
- announce_object (platform, object, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_EXTERNAL);
- }
-
- nl_cache_free (old);
+ nmp_object_stackinit_id_ip4_route (&obj_needle, ifindex, network, plen, metric);
+ obj = nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, &obj_needle);
+ if (nmp_object_is_visible (obj))
+ return &obj->ip4_route;
+ return NULL;
}
-/* The cache should always avoid containing objects not handled by NM, like
- * e.g. addresses of the AF_PHONET family. */
-static void
-cache_remove_unknown (struct nl_cache *cache)
+static const NMPlatformIP6Route *
+ip6_route_get (NMPlatform *platform, int ifindex, struct in6_addr network, int plen, guint32 metric)
{
- GPtrArray *objects_to_remove = NULL;
- struct nl_object *object;
-
- for (object = nl_cache_get_first (cache); object; object = nl_cache_get_next (object)) {
- if (object_type_from_nl_object (object) == OBJECT_TYPE_UNKNOWN) {
- if (!objects_to_remove)
- objects_to_remove = g_ptr_array_new_with_free_func ((GDestroyNotify) nl_object_put);
- nl_object_get (object);
- g_ptr_array_add (objects_to_remove, object);
- }
- }
-
- if (objects_to_remove) {
- guint i;
-
- for (i = 0; i < objects_to_remove->len; i++)
- nl_cache_remove (g_ptr_array_index (objects_to_remove, i));
+ NMPObject obj_needle;
+ const NMPObject *obj;
- g_ptr_array_free (objects_to_remove, TRUE);
- }
-}
-
-/* Creates and populates the netlink object caches. Called upon platform init and
- * when we run out of sync (out of buffer space, netlink congestion control). In case
- * the caches already exist, it finds changed, added and removed objects, announces
- * them and destroys the old caches. */
-static void
-cache_repopulate_all (NMPlatform *platform)
-{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- struct nl_cache *old_link_cache = priv->link_cache;
- struct nl_cache *old_address_cache = priv->address_cache;
- struct nl_cache *old_route_cache = priv->route_cache;
- struct nl_object *object;
-
- debug ("platform: %spopulate platform cache", old_link_cache ? "re" : "");
-
- /* Allocate new netlink caches */
- init_link_cache (platform);
- rtnl_addr_alloc_cache (priv->nlh, &priv->address_cache);
- rtnl_route_alloc_cache (priv->nlh, AF_UNSPEC, 0, &priv->route_cache);
- g_assert (priv->link_cache && priv->address_cache && priv->route_cache);
-
- /* Remove all unknown objects from the caches */
- cache_remove_unknown (priv->link_cache);
- cache_remove_unknown (priv->address_cache);
- cache_remove_unknown (priv->route_cache);
-
- for (object = nl_cache_get_first (priv->address_cache); object; object = nl_cache_get_next (object)) {
- _rtnl_addr_hack_lifetimes_rel_to_abs ((struct rtnl_addr *) object);
- }
+ metric = nm_utils_ip6_route_metric_normalize (metric);
- /* Make sure all changes we've missed are announced. */
- cache_announce_changes (platform, priv->link_cache, old_link_cache);
- cache_announce_changes (platform, priv->address_cache, old_address_cache);
- cache_announce_changes (platform, priv->route_cache, old_route_cache);
+ nmp_object_stackinit_id_ip6_route (&obj_needle, ifindex, &network, plen, metric);
+ obj = nmp_cache_lookup_obj (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache, &obj_needle);
+ if (nmp_object_is_visible (obj))
+ return &obj->ip6_route;
+ return NULL;
}
/******************************************************************/
@@ -4208,10 +4509,9 @@ verify_source (struct nl_msg *msg, gpointer user_data)
{
struct ucred *creds = nlmsg_get_creds (msg);
- if (!creds || creds->pid || creds->uid || creds->gid) {
+ if (!creds || creds->pid) {
if (creds)
- warning ("netlink: received non-kernel message (pid %d uid %d gid %d)",
- creds->pid, creds->uid, creds->gid);
+ warning ("netlink: received non-kernel message (pid %d)", creds->pid);
else
warning ("netlink: received message without credentials");
return NL_STOP;
@@ -4225,35 +4525,42 @@ event_handler (GIOChannel *channel,
GIOCondition io_condition,
gpointer user_data)
{
- NMPlatform *platform = NM_PLATFORM (user_data);
+ delayed_action_handle_all (NM_PLATFORM (user_data), TRUE);
+ return TRUE;
+}
+
+static gboolean
+event_handler_read_netlink_one (NMPlatform *platform)
+{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
int nle;
nle = nl_recvmsgs_default (priv->nlh_event);
+
+ /* Work around a libnl bug fixed in 3.2.22 (375a6294) */
+ if (nle == 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
+ nle = -NLE_AGAIN;
+
if (nle < 0)
switch (nle) {
+ case -NLE_AGAIN:
+ return FALSE;
case -NLE_DUMP_INTR:
- /* this most likely happens due to our request (RTM_GETADDR, AF_INET6, NLM_F_DUMP)
- * to detect support for support_kernel_extended_ifa_flags. This is not critical
- * and can happen easily. */
debug ("Uncritical failure to retrieve incoming events: %s (%d)", nl_geterror (nle), nle);
break;
case -NLE_NOMEM:
warning ("Too many netlink events. Need to resynchronize platform cache");
/* Drain the event queue, we've lost events and are out of sync anyway and we'd
* like to free up some space. We'll read in the status synchronously. */
- nl_socket_modify_cb (priv->nlh_event, NL_CB_VALID, NL_CB_DEFAULT, NULL, NULL);
- do {
- errno = 0;
-
- nle = nl_recvmsgs_default (priv->nlh_event);
-
- /* Work around a libnl bug fixed in 3.2.22 (375a6294) */
- if (nle == 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
- nle = -NLE_AGAIN;
- } while (nle != -NLE_AGAIN);
- nl_socket_modify_cb (priv->nlh_event, NL_CB_VALID, NL_CB_CUSTOM, event_notification, user_data);
- cache_repopulate_all (platform);
+ _nl_sock_flush_data (priv->nlh_event);
+ priv->nlh_seq_expect = 0;
+ delayed_action_schedule (platform,
+ DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
+ NULL);
break;
default:
error ("Failed to retrieve incoming events: %s (%d)", nl_geterror (nle), nle);
@@ -4262,6 +4569,71 @@ event_handler (GIOChannel *channel,
return TRUE;
}
+static gboolean
+event_handler_read_netlink_all (NMPlatform *platform, gboolean wait_for_acks)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ int r;
+ struct pollfd pfd;
+ gboolean any = FALSE;
+ gint64 timestamp = 0, now;
+ const int TIMEOUT = 250;
+ int timeout = 0;
+ guint32 wait_for_seq = 0;
+
+ while (TRUE) {
+ while (event_handler_read_netlink_one (platform))
+ any = TRUE;
+
+ if (!wait_for_acks || priv->nlh_seq_expect == 0) {
+ if (wait_for_seq)
+ _LOGT ("read-netlink-all: ACK for sequence number %u received", priv->nlh_seq_expect);
+ return any;
+ }
+
+ now = nm_utils_get_monotonic_timestamp_ms ();
+ if (wait_for_seq != priv->nlh_seq_expect) {
+ /* We are waiting for a new sequence number (or we will wait for the first time).
+ * Reset/start counting the overall wait time. */
+ _LOGT ("read-netlink-all: wait for ACK for sequence number %u...", priv->nlh_seq_expect);
+ wait_for_seq = priv->nlh_seq_expect;
+ timestamp = now;
+ timeout = TIMEOUT;
+ } else {
+ if ((now - timestamp) >= TIMEOUT) {
+ /* timeout. Don't wait for this sequence number anymore. */
+ break;
+ }
+
+ /* readjust the wait-time. */
+ timeout = TIMEOUT - (now - timestamp);
+ }
+
+ memset (&pfd, 0, sizeof (pfd));
+ pfd.fd = nl_socket_get_fd (priv->nlh_event);
+ pfd.events = POLLIN;
+ r = poll (&pfd, 1, timeout);
+
+ if (r == 0) {
+ /* timeout. */
+ break;
+ }
+ if (r < 0) {
+ int errsv = errno;
+
+ if (errsv != EINTR) {
+ _LOGE ("read-netlink-all: poll failed with %s", strerror (errsv));
+ return any;
+ }
+ /* Continue to read again, even if there might be nothing to read after EINTR. */
+ }
+ }
+
+ _LOGW ("read-netlink-all: timeout waiting for ACK to sequence number %u...", wait_for_seq);
+ priv->nlh_seq_expect = 0;
+ return any;
+}
+
static struct nl_sock *
setup_socket (gboolean event, gpointer user_data)
{
@@ -4278,7 +4650,8 @@ setup_socket (gboolean event, gpointer user_data)
/* Dispatch event messages (event socket only) */
if (event) {
nl_socket_modify_cb (sock, NL_CB_VALID, NL_CB_CUSTOM, event_notification, user_data);
- nl_socket_disable_seq_check (sock);
+ nl_socket_modify_cb (sock, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, event_seq_check, user_data);
+ nl_socket_modify_err_cb (sock, NL_CB_CUSTOM, event_err, user_data);
}
nle = nl_connect (sock, NETLINK_ROUTE);
@@ -4298,14 +4671,23 @@ setup_socket (gboolean event, gpointer user_data)
/******************************************************************/
static void
+cache_update_link_udev (NMPlatform *platform, int ifindex, GUdevDevice *udev_device)
+{
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
+ auto_nmp_obj NMPObject *obj_cache = NULL;
+ gboolean was_visible;
+ NMPCacheOpsType cache_op;
+
+ cache_op = nmp_cache_update_link_udev (priv->cache, ifindex, udev_device, &obj_cache, &was_visible, cache_pre_hook, platform);
+ do_emit_signal (platform, obj_cache, cache_op, was_visible, NM_PLATFORM_REASON_INTERNAL);
+}
+
+static void
udev_device_added (NMPlatform *platform,
GUdevDevice *udev_device)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- auto_nl_object struct rtnl_link *rtnllink = NULL;
const char *ifname;
int ifindex;
- gboolean was_announceable = FALSE;
ifname = g_udev_device_get_name (udev_device);
if (!ifname) {
@@ -4329,59 +4711,37 @@ udev_device_added (NMPlatform *platform,
return;
}
- rtnllink = rtnl_link_get (priv->link_cache, ifindex);
- if (rtnllink)
- was_announceable = link_is_announceable (platform, rtnllink);
-
- g_hash_table_insert (priv->udev_devices, GINT_TO_POINTER (ifindex),
- g_object_ref (udev_device));
+ cache_update_link_udev (platform, ifindex, udev_device);
+}
- /* Announce devices only if they also have been discovered via Netlink. */
- if (rtnllink && link_is_announceable (platform, rtnllink))
- announce_object (platform, (struct nl_object *) rtnllink, was_announceable ? NM_PLATFORM_SIGNAL_CHANGED : NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_EXTERNAL);
+static gboolean
+_udev_device_removed_match_link (const NMPObject *obj, gpointer udev_device)
+{
+ return obj->_link.udev.device == udev_device;
}
static void
udev_device_removed (NMPlatform *platform,
GUdevDevice *udev_device)
{
- NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- auto_nl_object struct rtnl_link *rtnllink = NULL;
int ifindex = 0;
- gboolean was_announceable = FALSE;
if (g_udev_device_get_property (udev_device, "IFINDEX"))
ifindex = g_udev_device_get_property_as_int (udev_device, "IFINDEX");
else {
- GHashTableIter iter;
- gpointer key, value;
+ const NMPObject *obj;
- /* This should not happen, but just to be sure.
- * If we can't get IFINDEX, go through the devices and
- * compare the pointers.
- */
- g_hash_table_iter_init (&iter, priv->udev_devices);
- while (g_hash_table_iter_next (&iter, &key, &value)) {
- if ((GUdevDevice *)value == udev_device) {
- ifindex = GPOINTER_TO_INT (key);
- break;
- }
- }
+ obj = nmp_cache_lookup_link_full (NM_LINUX_PLATFORM_GET_PRIVATE (platform)->cache,
+ 0, NULL, FALSE, NM_LINK_TYPE_NONE, _udev_device_removed_match_link, udev_device);
+ if (obj)
+ ifindex = obj->link.ifindex;
}
debug ("udev-remove: IFINDEX=%d", ifindex);
if (ifindex <= 0)
return;
- rtnllink = rtnl_link_get (priv->link_cache, ifindex);
- if (rtnllink)
- was_announceable = link_is_announceable (platform, rtnllink);
-
- g_hash_table_remove (priv->udev_devices, GINT_TO_POINTER (ifindex));
-
- /* Announce device removal if it is no longer announceable. */
- if (was_announceable && !link_is_announceable (platform, rtnllink))
- announce_object (platform, (struct nl_object *) rtnllink, NM_PLATFORM_SIGNAL_REMOVED, NM_PLATFORM_REASON_EXTERNAL);
+ cache_update_link_udev (platform, ifindex, NULL);
}
static void
@@ -4416,28 +4776,40 @@ handle_udev_event (GUdevClient *client,
/******************************************************************/
static void
-nm_linux_platform_init (NMLinuxPlatform *platform)
+nm_linux_platform_init (NMLinuxPlatform *self)
{
+ NMLinuxPlatformPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NM_TYPE_LINUX_PLATFORM, NMLinuxPlatformPrivate);
+
+ self->priv = priv;
+
+ priv->delayed_deletion = g_hash_table_new_full ((GHashFunc) nmp_object_id_hash,
+ (GEqualFunc) nmp_object_id_equal,
+ (GDestroyNotify) nmp_object_unref,
+ (GDestroyNotify) nmp_object_unref);
+ priv->cache = nmp_cache_new ();
+ priv->delayed_action.list_master_connected = g_ptr_array_new ();
+ priv->delayed_action.list_refresh_link = g_ptr_array_new ();
+ priv->wifi_data = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) wifi_utils_deinit);
}
-static gboolean
-setup (NMPlatform *platform)
+static void
+constructed (GObject *_object)
{
+ NMPlatform *platform = NM_PLATFORM (_object);
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
const char *udev_subsys[] = { "net", NULL };
- GUdevEnumerator *enumerator;
- GList *devices, *iter;
int channel_flags;
gboolean status;
int nle;
-#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
- struct nl_object *object;
-#endif
+ GUdevEnumerator *enumerator;
+ GList *devices, *iter;
+
+ _LOGD ("create");
/* Initialize netlink socket for requests */
priv->nlh = setup_socket (FALSE, platform);
g_assert (priv->nlh);
- debug ("Netlink socket for requests established: %d", nl_socket_get_local_port (priv->nlh));
+ debug ("Netlink socket for requests established: port=%u, fd=%d", nl_socket_get_local_port (priv->nlh), nl_socket_get_fd (priv->nlh));
/* Initialize netlink socket for events */
priv->nlh_event = setup_socket (TRUE, platform);
@@ -4454,7 +4826,7 @@ setup (NMPlatform *platform)
RTNLGRP_IPV4_ROUTE, RTNLGRP_IPV6_ROUTE,
0);
g_assert (!nle);
- debug ("Netlink socket for events established: %d", nl_socket_get_local_port (priv->nlh_event));
+ debug ("Netlink socket for events established: port=%u, fd=%d", nl_socket_get_local_port (priv->nlh_event), nl_socket_get_fd (priv->nlh_event));
priv->event_channel = g_io_channel_unix_new (nl_socket_get_fd (priv->nlh_event));
g_io_channel_set_encoding (priv->event_channel, NULL, NULL);
@@ -4465,37 +4837,31 @@ setup (NMPlatform *platform)
channel_flags | G_IO_FLAG_NONBLOCK, NULL);
g_assert (status);
priv->event_id = g_io_add_watch (priv->event_channel,
- (EVENT_CONDITIONS | ERROR_CONDITIONS | DISCONNECT_CONDITIONS),
- event_handler, platform);
-
- cache_repopulate_all (platform);
-
-#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
- /* Initial check for user IPv6LL support once the link cache is allocated
- * and filled. If there are no links in the cache yet then we'll check
- * when a new link shows up in announce_object().
- */
- object = nl_cache_get_first (priv->link_cache);
- if (object) {
- uint8_t mode;
-
- if (rtnl_link_inet6_get_addr_gen_mode ((struct rtnl_link *) object, &mode) == 0)
- priv->support_user_ipv6ll = 1;
- else
- priv->support_user_ipv6ll = -1;
- }
-#else
- priv->support_user_ipv6ll = -1;
-#endif
+ (EVENT_CONDITIONS | ERROR_CONDITIONS | DISCONNECT_CONDITIONS),
+ event_handler, platform);
/* Set up udev monitoring */
priv->udev_client = g_udev_client_new (udev_subsys);
g_signal_connect (priv->udev_client, "uevent", G_CALLBACK (handle_udev_event), platform);
- priv->udev_devices = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
+
+ /* complete construction of the GObject instance before populating the cache. */
+ G_OBJECT_CLASS (nm_linux_platform_parent_class)->constructed (_object);
+
+ _LOGD ("populate platform cache");
+ delayed_action_schedule (platform,
+ DELAYED_ACTION_TYPE_REFRESH_ALL_LINKS |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ADDRESSES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP4_ROUTES |
+ DELAYED_ACTION_TYPE_REFRESH_ALL_IP6_ROUTES,
+ NULL);
+
+ delayed_action_handle_all (platform, FALSE);
/* And read initial device list */
enumerator = g_udev_enumerator_new (priv->udev_client);
g_udev_enumerator_add_match_subsystem (enumerator, "net");
+
g_udev_enumerator_add_match_is_initialized (enumerator);
devices = g_udev_enumerator_execute (enumerator);
@@ -4505,16 +4871,26 @@ setup (NMPlatform *platform)
}
g_list_free (devices);
g_object_unref (enumerator);
+}
- /* request all IPv6 addresses (hopeing that there is at least one), to check for
- * the IFA_FLAGS attribute. */
- nle = nl_rtgen_request (priv->nlh_event, RTM_GETADDR, AF_INET6, NLM_F_DUMP);
- if (nle < 0)
- nm_log_warn (LOGD_PLATFORM, "Netlink error: requesting RTM_GETADDR failed with %s", nl_geterror (nle));
+static void
+dispose (GObject *object)
+{
+ NMPlatform *platform = NM_PLATFORM (object);
+ NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- priv->wifi_data = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) wifi_utils_deinit);
+ _LOGD ("dispose");
- return TRUE;
+ priv->delayed_action.flags = DELAYED_ACTION_TYPE_NONE;
+ g_ptr_array_set_size (priv->delayed_action.list_master_connected, 0);
+ g_ptr_array_set_size (priv->delayed_action.list_refresh_link, 0);
+
+ nm_clear_g_source (&priv->delayed_action.idle_id);
+
+ g_clear_pointer (&priv->prune_candidates, g_hash_table_unref);
+ g_clear_pointer (&priv->delayed_deletion, g_hash_table_unref);
+
+ G_OBJECT_CLASS (nm_linux_platform_parent_class)->dispose (object);
}
static void
@@ -4522,17 +4898,18 @@ nm_linux_platform_finalize (GObject *object)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (object);
+ nmp_cache_free (priv->cache);
+
+ g_ptr_array_unref (priv->delayed_action.list_master_connected);
+ g_ptr_array_unref (priv->delayed_action.list_refresh_link);
+
/* Free netlink resources */
g_source_remove (priv->event_id);
g_io_channel_unref (priv->event_channel);
nl_socket_free (priv->nlh);
nl_socket_free (priv->nlh_event);
- nl_cache_free (priv->link_cache);
- nl_cache_free (priv->address_cache);
- nl_cache_free (priv->route_cache);
g_object_unref (priv->udev_client);
- g_hash_table_unref (priv->udev_devices);
g_hash_table_unref (priv->wifi_data);
G_OBJECT_CLASS (nm_linux_platform_parent_class)->finalize (object);
@@ -4549,21 +4926,21 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
g_type_class_add_private (klass, sizeof (NMLinuxPlatformPrivate));
/* virtual methods */
+ object_class->constructed = constructed;
+ object_class->dispose = dispose;
object_class->finalize = nm_linux_platform_finalize;
- platform_class->setup = setup;
-
platform_class->sysctl_set = sysctl_set;
platform_class->sysctl_get = sysctl_get;
platform_class->link_get = _nm_platform_link_get;
+ platform_class->link_get_by_ifname = _nm_platform_link_get_by_ifname;
+ platform_class->link_get_by_address = _nm_platform_link_get_by_address;
platform_class->link_get_all = link_get_all;
platform_class->link_add = link_add;
platform_class->link_delete = link_delete;
- platform_class->link_get_ifindex = link_get_ifindex;
- platform_class->link_get_name = link_get_name;
- platform_class->link_get_type = link_get_type;
platform_class->link_get_type_name = link_get_type_name;
+ platform_class->link_get_unmanaged = link_get_unmanaged;
platform_class->link_refresh = link_refresh;
@@ -4571,28 +4948,26 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->link_set_down = link_set_down;
platform_class->link_set_arp = link_set_arp;
platform_class->link_set_noarp = link_set_noarp;
- platform_class->link_is_up = link_is_up;
- platform_class->link_is_connected = link_is_connected;
- platform_class->link_uses_arp = link_uses_arp;
- platform_class->link_get_user_ipv6ll_enabled = link_get_user_ipv6ll_enabled;
+ platform_class->link_get_udi = link_get_udi;
+ platform_class->link_get_udev_device = link_get_udev_device;
+
platform_class->link_set_user_ipv6ll_enabled = link_set_user_ipv6ll_enabled;
- platform_class->link_get_address = link_get_address;
platform_class->link_set_address = link_set_address;
- platform_class->link_get_mtu = link_get_mtu;
+ platform_class->link_get_permanent_address = link_get_permanent_address;
platform_class->link_set_mtu = link_set_mtu;
platform_class->link_get_physical_port_id = link_get_physical_port_id;
platform_class->link_get_dev_id = link_get_dev_id;
platform_class->link_get_wake_on_lan = link_get_wake_on_lan;
+ platform_class->link_get_driver_info = link_get_driver_info;
platform_class->link_supports_carrier_detect = link_supports_carrier_detect;
platform_class->link_supports_vlans = link_supports_vlans;
platform_class->link_enslave = link_enslave;
platform_class->link_release = link_release;
- platform_class->link_get_master = link_get_master;
platform_class->master_set_option = master_set_option;
platform_class->master_get_option = master_get_option;
platform_class->slave_set_option = slave_set_option;
@@ -4604,6 +4979,7 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->vlan_set_egress_map = vlan_set_egress_map;
platform_class->infiniband_partition_add = infiniband_partition_add;
+ platform_class->infiniband_get_info = infiniband_get_info;
platform_class->veth_get_properties = veth_get_properties;
platform_class->tun_get_properties = tun_get_properties;
@@ -4626,26 +5002,27 @@ nm_linux_platform_class_init (NMLinuxPlatformClass *klass)
platform_class->mesh_set_channel = mesh_set_channel;
platform_class->mesh_set_ssid = mesh_set_ssid;
+ platform_class->ip4_address_get = ip4_address_get;
+ platform_class->ip6_address_get = ip6_address_get;
platform_class->ip4_address_get_all = ip4_address_get_all;
platform_class->ip6_address_get_all = ip6_address_get_all;
platform_class->ip4_address_add = ip4_address_add;
platform_class->ip6_address_add = ip6_address_add;
platform_class->ip4_address_delete = ip4_address_delete;
platform_class->ip6_address_delete = ip6_address_delete;
- platform_class->ip4_address_exists = ip4_address_exists;
- platform_class->ip6_address_exists = ip6_address_exists;
-
- platform_class->ip4_check_reinstall_device_route = ip4_check_reinstall_device_route;
+ platform_class->ip4_route_get = ip4_route_get;
+ platform_class->ip6_route_get = ip6_route_get;
platform_class->ip4_route_get_all = ip4_route_get_all;
platform_class->ip6_route_get_all = ip6_route_get_all;
platform_class->ip4_route_add = ip4_route_add;
platform_class->ip6_route_add = ip6_route_add;
platform_class->ip4_route_delete = ip4_route_delete;
platform_class->ip6_route_delete = ip6_route_delete;
- platform_class->ip4_route_exists = ip4_route_exists;
- platform_class->ip6_route_exists = ip6_route_exists;
platform_class->check_support_kernel_extended_ifa_flags = check_support_kernel_extended_ifa_flags;
platform_class->check_support_user_ipv6ll = check_support_user_ipv6ll;
+
+ platform_class->process_events = process_events;
}
+
diff --git a/src/platform/nm-linux-platform.h b/src/platform/nm-linux-platform.h
index 6f2c19939..a9e2cd82f 100644
--- a/src/platform/nm-linux-platform.h
+++ b/src/platform/nm-linux-platform.h
@@ -32,8 +32,12 @@
/******************************************************************/
+struct _NMLinuxPlatformPrivate;
+
typedef struct {
NMPlatform parent;
+
+ struct _NMLinuxPlatformPrivate *priv;
} NMLinuxPlatform;
typedef struct {
diff --git a/src/platform/nm-platform-utils.c b/src/platform/nm-platform-utils.c
new file mode 100644
index 000000000..d3c62bddc
--- /dev/null
+++ b/src/platform/nm-platform-utils.c
@@ -0,0 +1,436 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-platform.c - Handle runtime kernel networking configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include "nm-platform-utils.h"
+
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <linux/ethtool.h>
+#include <linux/sockios.h>
+#include <linux/mii.h>
+#include <linux/version.h>
+
+#include "gsystem-local-alloc.h"
+#include "nm-utils.h"
+#include "NetworkManagerUtils.h"
+#include "nm-logging.h"
+
+
+/******************************************************************
+ * ethtool
+ ******************************************************************/
+
+static gboolean
+ethtool_get (const char *name, gpointer edata)
+{
+ struct ifreq ifr;
+ int fd;
+
+ if (!name || !*name)
+ return FALSE;
+
+ memset (&ifr, 0, sizeof (ifr));
+ strncpy (ifr.ifr_name, name, IFNAMSIZ);
+ ifr.ifr_data = edata;
+
+ fd = socket (PF_INET, SOCK_DGRAM, 0);
+ if (fd < 0) {
+ nm_log_err (LOGD_PLATFORM, "ethtool: Could not open socket.");
+ return FALSE;
+ }
+
+ if (ioctl (fd, SIOCETHTOOL, &ifr) < 0) {
+ nm_log_dbg (LOGD_PLATFORM, "ethtool: Request failed: %s", strerror (errno));
+ close (fd);
+ return FALSE;
+ }
+
+ close (fd);
+ return TRUE;
+}
+
+static int
+ethtool_get_stringset_index (const char *ifname, int stringset_id, const char *string)
+{
+ gs_free struct ethtool_sset_info *info = NULL;
+ gs_free struct ethtool_gstrings *strings = NULL;
+ guint32 len, i;
+
+ info = g_malloc0 (sizeof (*info) + sizeof (guint32));
+ info->cmd = ETHTOOL_GSSET_INFO;
+ info->reserved = 0;
+ info->sset_mask = 1ULL << stringset_id;
+
+ if (!ethtool_get (ifname, info))
+ return -1;
+ if (!info->sset_mask)
+ return -1;
+
+ len = info->data[0];
+
+ strings = g_malloc0 (sizeof (*strings) + len * ETH_GSTRING_LEN);
+ strings->cmd = ETHTOOL_GSTRINGS;
+ strings->string_set = stringset_id;
+ strings->len = len;
+ if (!ethtool_get (ifname, strings))
+ return -1;
+
+ for (i = 0; i < len; i++) {
+ if (!strcmp ((char *) &strings->data[i * ETH_GSTRING_LEN], string))
+ return i;
+ }
+
+ return -1;
+}
+
+gboolean
+nmp_utils_ethtool_get_driver_info (const char *ifname,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version)
+{
+ struct ethtool_drvinfo drvinfo = { 0 };
+
+ if (!ifname)
+ return FALSE;
+
+ drvinfo.cmd = ETHTOOL_GDRVINFO;
+ if (!ethtool_get (ifname, &drvinfo))
+ return FALSE;
+
+ if (out_driver_name)
+ *out_driver_name = g_strdup (drvinfo.driver);
+ if (out_driver_version)
+ *out_driver_version = g_strdup (drvinfo.version);
+ if (out_fw_version)
+ *out_fw_version = g_strdup (drvinfo.fw_version);
+
+ return TRUE;
+}
+
+gboolean
+nmp_utils_ethtool_get_permanent_address (const char *ifname,
+ guint8 *buf,
+ size_t *length)
+{
+ gs_free struct ethtool_perm_addr *epaddr = NULL;
+
+ if (!ifname)
+ return FALSE;
+
+ epaddr = g_malloc0 (sizeof (*epaddr) + NM_UTILS_HWADDR_LEN_MAX);
+ epaddr->cmd = ETHTOOL_GPERMADDR;
+ epaddr->size = NM_UTILS_HWADDR_LEN_MAX;
+
+ if (!ethtool_get (ifname, epaddr))
+ return FALSE;
+
+ g_assert (epaddr->size <= NM_UTILS_HWADDR_LEN_MAX);
+ memcpy (buf, epaddr->data, epaddr->size);
+ *length = epaddr->size;
+ return TRUE;
+}
+
+gboolean
+nmp_utils_ethtool_supports_carrier_detect (const char *ifname)
+{
+ struct ethtool_cmd edata = { .cmd = ETHTOOL_GLINK };
+
+ /* We ignore the result. If the ETHTOOL_GLINK call succeeded, then we
+ * assume the device supports carrier-detect, otherwise we assume it
+ * doesn't.
+ */
+ return ethtool_get (ifname, &edata);
+}
+
+gboolean
+nmp_utils_ethtool_supports_vlans (const char *ifname)
+{
+ gs_free struct ethtool_gfeatures *features = NULL;
+ int idx, block, bit, size;
+
+ if (!ifname)
+ return FALSE;
+
+ idx = ethtool_get_stringset_index (ifname, ETH_SS_FEATURES, "vlan-challenged");
+ if (idx == -1) {
+ nm_log_dbg (LOGD_PLATFORM, "ethtool: vlan-challenged ethtool feature does not exist for %s?", ifname);
+ return FALSE;
+ }
+
+ block = idx / 32;
+ bit = idx % 32;
+ size = block + 1;
+
+ features = g_malloc0 (sizeof (*features) + size * sizeof (struct ethtool_get_features_block));
+ features->cmd = ETHTOOL_GFEATURES;
+ features->size = size;
+
+ if (!ethtool_get (ifname, features))
+ return FALSE;
+
+ return !(features->features[block].active & (1 << bit));
+}
+
+int
+nmp_utils_ethtool_get_peer_ifindex (const char *ifname)
+{
+ gs_free struct ethtool_stats *stats = NULL;
+ int peer_ifindex_stat;
+
+ if (!ifname)
+ return 0;
+
+ peer_ifindex_stat = ethtool_get_stringset_index (ifname, ETH_SS_STATS, "peer_ifindex");
+ if (peer_ifindex_stat == -1) {
+ nm_log_dbg (LOGD_PLATFORM, "ethtool: peer_ifindex stat for %s does not exist?", ifname);
+ return FALSE;
+ }
+
+ stats = g_malloc0 (sizeof (*stats) + (peer_ifindex_stat + 1) * sizeof (guint64));
+ stats->cmd = ETHTOOL_GSTATS;
+ stats->n_stats = peer_ifindex_stat + 1;
+ if (!ethtool_get (ifname, stats))
+ return 0;
+
+ return stats->data[peer_ifindex_stat];
+}
+
+gboolean
+nmp_utils_ethtool_get_wake_on_lan (const char *ifname)
+{
+ struct ethtool_wolinfo wol;
+
+ if (!ifname)
+ return FALSE;
+
+ memset (&wol, 0, sizeof (wol));
+ wol.cmd = ETHTOOL_GWOL;
+ if (!ethtool_get (ifname, &wol))
+ return FALSE;
+
+ return wol.wolopts != 0;
+}
+
+gboolean
+nmp_utils_ethtool_get_link_speed (const char *ifname, guint32 *out_speed)
+{
+ struct ethtool_cmd edata = {
+ .cmd = ETHTOOL_GSET,
+ };
+ guint32 speed;
+
+ if (!ethtool_get (ifname, &edata))
+ return FALSE;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+ speed = edata.speed;
+#else
+ speed = ethtool_cmd_speed (&edata);
+#endif
+ if (speed == G_MAXUINT16 || speed == G_MAXUINT32)
+ speed = 0;
+
+ if (out_speed)
+ *out_speed = speed;
+ return TRUE;
+}
+
+/******************************************************************
+ * mii
+ ******************************************************************/
+
+gboolean
+nmp_utils_mii_supports_carrier_detect (const char *ifname)
+{
+ int fd, errsv;
+ struct ifreq ifr;
+ struct mii_ioctl_data *mii;
+ gboolean supports_mii = FALSE;
+
+ if (!ifname)
+ return FALSE;
+
+ fd = socket (PF_INET, SOCK_DGRAM, 0);
+ if (fd < 0) {
+ nm_log_err (LOGD_PLATFORM, "mii: couldn't open control socket (%s)", ifname);
+ return FALSE;
+ }
+
+ memset (&ifr, 0, sizeof (struct ifreq));
+ strncpy (ifr.ifr_name, ifname, IFNAMSIZ);
+
+ errno = 0;
+ if (ioctl (fd, SIOCGMIIPHY, &ifr) < 0) {
+ errsv = errno;
+ nm_log_dbg (LOGD_PLATFORM, "mii: SIOCGMIIPHY failed: %s (%d) (%s)", strerror (errsv), errsv, ifname);
+ goto out;
+ }
+
+ /* If we can read the BMSR register, we assume that the card supports MII link detection */
+ mii = (struct mii_ioctl_data *) &ifr.ifr_ifru;
+ mii->reg_num = MII_BMSR;
+
+ if (ioctl (fd, SIOCGMIIREG, &ifr) == 0) {
+ nm_log_dbg (LOGD_PLATFORM, "mii: SIOCGMIIREG result 0x%X (%s)", mii->val_out, ifname);
+ supports_mii = TRUE;
+ } else {
+ errsv = errno;
+ nm_log_dbg (LOGD_PLATFORM, "mii: SIOCGMIIREG failed: %s (%d) (%s)", strerror (errsv), errsv, ifname);
+ }
+
+out:
+ close (fd);
+ nm_log_dbg (LOGD_PLATFORM, "mii: MII %s supported (%s)", supports_mii ? "is" : "not", ifname);
+ return supports_mii;
+}
+
+/******************************************************************
+ * udev
+ ******************************************************************/
+
+const char *
+nmp_utils_udev_get_driver (GUdevDevice *device)
+{
+ GUdevDevice *parent = NULL, *grandparent = NULL;
+ const char *driver, *subsys;
+
+ driver = g_udev_device_get_driver (device);
+ if (driver)
+ goto out;
+
+ /* Try the parent */
+ parent = g_udev_device_get_parent (device);
+ if (parent) {
+ driver = g_udev_device_get_driver (parent);
+ if (!driver) {
+ /* Try the grandparent if it's an ibmebus device or if the
+ * subsys is NULL which usually indicates some sort of
+ * platform device like a 'gadget' net interface.
+ */
+ subsys = g_udev_device_get_subsystem (parent);
+ if ( (g_strcmp0 (subsys, "ibmebus") == 0)
+ || (subsys == NULL)) {
+ grandparent = g_udev_device_get_parent (parent);
+ if (grandparent)
+ driver = g_udev_device_get_driver (grandparent);
+ }
+ }
+ }
+ g_clear_object (&parent);
+ g_clear_object (&grandparent);
+
+out:
+ /* Intern the string so we don't have to worry about memory
+ * management in NMPlatformLink. */
+ return g_intern_string (driver);
+}
+
+/******************************************************************
+ * utils
+ ******************************************************************/
+
+/**
+ * Takes a pair @timestamp and @duration, and returns the remaining duration based
+ * on the new timestamp @now.
+ */
+guint32
+nmp_utils_lifetime_rebase_relative_time_on_now (guint32 timestamp,
+ guint32 duration,
+ guint32 now,
+ guint32 padding)
+{
+ gint64 t;
+
+ if (duration == NM_PLATFORM_LIFETIME_PERMANENT)
+ return NM_PLATFORM_LIFETIME_PERMANENT;
+
+ if (timestamp == 0) {
+ /* if the @timestamp is zero, assume it was just left unset and that the relative
+ * @duration starts counting from @now. This is convenient to construct an address
+ * and print it in nm_platform_ip4_address_to_string().
+ *
+ * In general it does not make sense to set the @duration without anchoring at
+ * @timestamp because you don't know the absolute expiration time when looking
+ * at the address at a later moment. */
+ timestamp = now;
+ }
+
+ /* For timestamp > now, just accept it and calculate the expected(?) result. */
+ t = (gint64) timestamp + (gint64) duration - (gint64) now;
+
+ /* Optional padding to avoid potential races. */
+ t += (gint64) padding;
+
+ if (t <= 0)
+ return 0;
+ if (t >= NM_PLATFORM_LIFETIME_PERMANENT)
+ return NM_PLATFORM_LIFETIME_PERMANENT - 1;
+ return t;
+}
+
+gboolean
+nmp_utils_lifetime_get (guint32 timestamp,
+ guint32 lifetime,
+ guint32 preferred,
+ guint32 now,
+ guint32 padding,
+ guint32 *out_lifetime,
+ guint32 *out_preferred)
+{
+ guint32 t_lifetime, t_preferred;
+
+ if (lifetime == 0) {
+ *out_lifetime = NM_PLATFORM_LIFETIME_PERMANENT;
+ *out_preferred = NM_PLATFORM_LIFETIME_PERMANENT;
+
+ /* We treat lifetime==0 as permanent addresses to allow easy creation of such addresses
+ * (without requiring to set the lifetime fields to NM_PLATFORM_LIFETIME_PERMANENT).
+ * In that case we also expect that the other fields (timestamp and preferred) are left unset. */
+ g_return_val_if_fail (timestamp == 0 && preferred == 0, TRUE);
+ } else {
+ if (!now)
+ now = nm_utils_get_monotonic_timestamp_s ();
+ t_lifetime = nmp_utils_lifetime_rebase_relative_time_on_now (timestamp, lifetime, now, padding);
+ if (!t_lifetime) {
+ *out_lifetime = 0;
+ *out_preferred = 0;
+ return FALSE;
+ }
+ t_preferred = nmp_utils_lifetime_rebase_relative_time_on_now (timestamp, preferred, now, padding);
+
+ *out_lifetime = t_lifetime;
+ *out_preferred = MIN (t_preferred, t_lifetime);
+
+ /* Assert that non-permanent addresses have a (positive) @timestamp. nmp_utils_lifetime_rebase_relative_time_on_now()
+ * treats addresses with timestamp 0 as *now*. Addresses passed to _address_get_lifetime() always
+ * should have a valid @timestamp, otherwise on every re-sync, their lifetime will be extended anew.
+ */
+ g_return_val_if_fail ( timestamp != 0
+ || ( lifetime == NM_PLATFORM_LIFETIME_PERMANENT
+ && preferred == NM_PLATFORM_LIFETIME_PERMANENT), TRUE);
+ g_return_val_if_fail (t_preferred <= t_lifetime, TRUE);
+ }
+ return TRUE;
+}
+
+
diff --git a/src/platform/nm-platform-utils.h b/src/platform/nm-platform-utils.h
new file mode 100644
index 000000000..557de8440
--- /dev/null
+++ b/src/platform/nm-platform-utils.h
@@ -0,0 +1,66 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-platform.c - Handle runtime kernel networking configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#ifndef __NM_PLATFORM_UTILS_H__
+#define __NM_PLATFORM_UTILS_H__
+
+#include "config.h"
+
+#include <gudev/gudev.h>
+
+#include "nm-platform.h"
+
+
+const char *nmp_utils_ethtool_get_driver (const char *ifname);
+gboolean nmp_utils_ethtool_supports_carrier_detect (const char *ifname);
+gboolean nmp_utils_ethtool_supports_vlans (const char *ifname);
+int nmp_utils_ethtool_get_peer_ifindex (const char *ifname);
+gboolean nmp_utils_ethtool_get_wake_on_lan (const char *ifname);
+gboolean nmp_utils_ethtool_get_link_speed (const char *ifname, guint32 *out_speed);
+
+gboolean nmp_utils_ethtool_get_driver_info (const char *ifname,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version);
+
+gboolean nmp_utils_ethtool_get_permanent_address (const char *ifname,
+ guint8 *buf,
+ size_t *length);
+
+
+gboolean nmp_utils_mii_supports_carrier_detect (const char *ifname);
+
+
+const char *nmp_utils_udev_get_driver (GUdevDevice *device);
+
+guint32 nmp_utils_lifetime_rebase_relative_time_on_now (guint32 timestamp,
+ guint32 duration,
+ guint32 now,
+ guint32 padding);
+
+gboolean nmp_utils_lifetime_get (guint32 timestamp,
+ guint32 lifetime,
+ guint32 preferred,
+ guint32 now,
+ guint32 padding,
+ guint32 *out_lifetime,
+ guint32 *out_preferred);
+
+#endif /* __NM_PLATFORM_UTILS_H__ */
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index ba7708d6b..b6d87ff95 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -27,16 +27,59 @@
#include <arpa/inet.h>
#include <string.h>
#include <netlink/route/addr.h>
+#include <netlink/route/rtnl.h>
#include "gsystem-local-alloc.h"
#include "NetworkManagerUtils.h"
#include "nm-utils.h"
#include "nm-platform.h"
+#include "nm-platform-utils.h"
#include "NetworkManagerUtils.h"
#include "nm-logging.h"
#include "nm-enum-types.h"
+#include "nm-core-internal.h"
+
+#define ADDRESS_LIFETIME_PADDING 5
+
+G_STATIC_ASSERT (sizeof ( ((NMPlatformLink *) NULL)->addr.data ) == NM_UTILS_HWADDR_LEN_MAX);
+
+#define _LOG_DOMAIN LOGD_PLATFORM
+#define _LOG_PREFIX_NAME "platform"
+
+#define _LOG(level, domain, self, ...) \
+ G_STMT_START { \
+ const NMLogLevel __level = (level); \
+ const NMLogDomain __domain = (domain); \
+ \
+ if (nm_logging_enabled (__level, __domain)) { \
+ char __prefix[32]; \
+ const char *__p_prefix = _LOG_PREFIX_NAME; \
+ const void *const __self = (self); \
+ \
+ if (__self && __self != nm_platform_try_get ()) { \
+ g_snprintf (__prefix, sizeof (__prefix), "%s[%p]", _LOG_PREFIX_NAME, __self); \
+ __p_prefix = __prefix; \
+ } \
+ _nm_log (__level, __domain, 0, \
+ "%s: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
+ __p_prefix _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
+ } \
+ } G_STMT_END
+#define _LOG_LEVEL_ENABLED(level, domain) \
+ ( nm_logging_enabled ((level), (domain)) )
+
+#ifdef NM_MORE_LOGGING
+#define _LOGT_ENABLED() _LOG_LEVEL_ENABLED (LOGL_TRACE, _LOG_DOMAIN)
+#define _LOGT(...) _LOG (LOGL_TRACE, _LOG_DOMAIN, self, __VA_ARGS__)
+#else
+#define _LOGT_ENABLED() FALSE
+#define _LOGT(...) G_STMT_START { if (FALSE) { _LOG (LOGL_TRACE, _LOG_DOMAIN, self, __VA_ARGS__); } } G_STMT_END
+#endif
-#define debug(...) nm_log_dbg (LOGD_PLATFORM, __VA_ARGS__)
+#define _LOGD(...) _LOG (LOGL_DEBUG, _LOG_DOMAIN, self, __VA_ARGS__)
+#define _LOGI(...) _LOG (LOGL_INFO , _LOG_DOMAIN, self, __VA_ARGS__)
+#define _LOGW(...) _LOG (LOGL_WARN , _LOG_DOMAIN, self, __VA_ARGS__)
+#define _LOGE(...) _LOG (LOGL_ERR , _LOG_DOMAIN, self, __VA_ARGS__)
#define NM_PLATFORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_PLATFORM, NMPlatformPrivate))
@@ -54,19 +97,46 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
+enum {
+ PROP_0,
+ PROP_REGISTER_SINGLETON,
+ LAST_PROP,
+};
+
+typedef struct {
+ gboolean register_singleton;
+} NMPlatformPrivate;
+
/******************************************************************/
/* Singleton NMPlatform subclass instance and cached class object */
-static NMPlatform *platform = NULL;
-static NMPlatformClass *klass = NULL;
+NM_DEFINE_SINGLETON_INSTANCE (NMPlatform);
+
+NM_DEFINE_SINGLETON_WEAK_REF (NMPlatform);
+
+/* Just always initialize a @klass instance. NM_PLATFORM_GET_CLASS()
+ * is only a plain read on the self instance, which the compiler
+ * like can optimize out.
+ */
+#define _CHECK_SELF_VOID(self, klass) \
+ NMPlatformClass *klass; \
+ do { \
+ g_return_if_fail (NM_IS_PLATFORM (self)); \
+ klass = NM_PLATFORM_GET_CLASS (self); \
+ (void) klass; \
+ } while (0)
+
+#define _CHECK_SELF(self, klass, err_val) \
+ NMPlatformClass *klass; \
+ do { \
+ g_return_val_if_fail (NM_IS_PLATFORM (self), err_val); \
+ klass = NM_PLATFORM_GET_CLASS (self); \
+ (void) klass; \
+ } while (0)
/**
* nm_platform_setup:
- * @type: The #GType for a subclass of #NMPlatform
- *
- * Do not use this function directly, it is intended to be called by
- * NMPlatform subclasses. For the linux platform initialization use
- * nm_linux_platform_setup() instead.
+ * @instance: the #NMPlatform instance
*
* Failing to set up #NMPlatform singleton results in a fatal error,
* as well as trying to initialize it multiple times without freeing
@@ -74,122 +144,82 @@ static NMPlatformClass *klass = NULL;
*
* NetworkManager will typically use only one platform object during
* its run. Test programs might want to switch platform implementations,
- * though. This is done with a combination of nm_platform_free() and
- * nm_*_platform_setup().
+ * though.
*/
void
-nm_platform_setup (GType type)
+nm_platform_setup (NMPlatform *instance)
{
- gboolean status;
+ g_return_if_fail (NM_IS_PLATFORM (instance));
+ g_return_if_fail (!singleton_instance);
- g_assert (platform == NULL);
+ singleton_instance = instance;
- platform = g_object_new (type, NULL);
- g_assert (NM_IS_PLATFORM (platform));
+ nm_singleton_instance_weak_ref_register ();
- klass = NM_PLATFORM_GET_CLASS (platform);
- g_assert (klass->setup);
-
- status = klass->setup (platform);
- g_assert (status);
-}
-
-/**
- * nm_platform_free:
- *
- * Free #NMPlatform singleton created by nm_*_platform_setup().
- */
-void
-nm_platform_free (void)
-{
- g_assert (platform);
-
- g_object_unref (platform);
- platform = NULL;
+ nm_log_dbg (LOGD_CORE, "setup NMPlatform singleton (%p, %s)", instance, G_OBJECT_TYPE_NAME (instance));
}
/**
* nm_platform_get:
+ * @self: platform instance
*
* Retrieve #NMPlatform singleton. Use this whenever you want to connect to
- * #NMPlatform signals. It is an error to call it before nm_*_platform_setup()
- * or after nm_platform_free().
+ * #NMPlatform signals. It is an error to call it before nm_platform_setup().
*
* Returns: (transfer none): The #NMPlatform singleton reference.
*/
NMPlatform *
-nm_platform_get (void)
+nm_platform_get ()
{
- g_assert (platform);
+ g_assert (singleton_instance);
- return platform;
+ return singleton_instance;
}
-/******************************************************************/
-
-/**
- * nm_platform_set_error:
- * @error: The error code
- *
- * Convenience function to falsify platform->error. It can be used for example
- * by functions that want to save the error, execute some operations and
- * restore it.
- */
-void nm_platform_set_error (NMPlatformError error)
+NMPlatform *
+nm_platform_try_get (void)
{
- platform->error = error;
+ return singleton_instance;
}
-/**
- * nm_platform_get_error:
- *
- * Convenience function to quickly retrieve the error code of the last
- * operation.
- *
- * Returns: Integer error code.
- */
-NMPlatformError
-nm_platform_get_error (void)
-{
- g_assert (platform);
-
- return platform->error;
-}
+/******************************************************************/
/**
- * nm_platform_get_error_message:
+ * nm_platform_error_to_string:
+ * @error_code: the error code to stringify.
*
- * Returns: Static human-readable string for the error. Don't free.
+ * Returns: A string representation of the error.
+ * For negative numbers, this function interprets
+ * the code as -errno.
*/
const char *
-nm_platform_get_error_msg (void)
-{
- g_assert (platform);
-
- switch (platform->error) {
- case NM_PLATFORM_ERROR_NONE:
- return "unknown error";
+nm_platform_error_to_string (NMPlatformError error)
+{
+ switch (error) {
+ case NM_PLATFORM_ERROR_SUCCESS:
+ return "success";
+ case NM_PLATFORM_ERROR_BUG:
+ return "bug";
+ case NM_PLATFORM_ERROR_UNSPECIFIED:
+ return "unspecified";
case NM_PLATFORM_ERROR_NOT_FOUND:
- return "object not found";
+ return "not-found";
case NM_PLATFORM_ERROR_EXISTS:
- return "object already exists";
+ return "exists";
case NM_PLATFORM_ERROR_WRONG_TYPE:
- return "object is wrong type";
+ return "wrong-type";
case NM_PLATFORM_ERROR_NOT_SLAVE:
- return "link not a slave";
+ return "not-slave";
case NM_PLATFORM_ERROR_NO_FIRMWARE:
- return "firmware not found";
+ return "no-firmware";
default:
- return "invalid error number";
+ if (error < 0)
+ return g_strerror (- ((int) error));
+ return "unknown";
}
}
-static void
-reset_error (void)
-{
- g_assert (platform);
- platform->error = NM_PLATFORM_ERROR_NONE;
-}
+/******************************************************************/
#define IFA_F_MANAGETEMPADDR_STR "mngtmpaddr"
#define IFA_F_NOPREFIXROUTE_STR "noprefixroute"
@@ -208,35 +238,53 @@ nm_platform_check_support_libnl_extended_ifa_flags ()
}
gboolean
-nm_platform_check_support_kernel_extended_ifa_flags ()
+nm_platform_check_support_kernel_extended_ifa_flags (NMPlatform *self)
{
- g_return_val_if_fail (NM_IS_PLATFORM (platform), FALSE);
+ _CHECK_SELF (self, klass, FALSE);
if (!klass->check_support_kernel_extended_ifa_flags)
return FALSE;
- return klass->check_support_kernel_extended_ifa_flags (platform);
+ return klass->check_support_kernel_extended_ifa_flags (self);
}
gboolean
-nm_platform_check_support_user_ipv6ll (void)
+nm_platform_check_support_user_ipv6ll (NMPlatform *self)
{
static int supported = -1;
- g_return_val_if_fail (NM_IS_PLATFORM (platform), FALSE);
+ _CHECK_SELF (self, klass, FALSE);
if (!klass->check_support_user_ipv6ll)
return FALSE;
if (supported < 0)
- supported = klass->check_support_user_ipv6ll (platform) ? 1 : 0;
+ supported = klass->check_support_user_ipv6ll (self) ? 1 : 0;
return !!supported;
}
+/**
+ * nm_platform_process_events:
+ * @self: platform instance
+ *
+ * Process pending events or handle pending delayed-actions.
+ * Effectively, this reads the netlink socket and processes
+ * new netlink messages. Possibly it will raise change signals.
+ */
+void
+nm_platform_process_events (NMPlatform *self)
+{
+ _CHECK_SELF_VOID (self, klass);
+
+ if (klass->process_events)
+ klass->process_events (self);
+}
+
/******************************************************************/
/**
* nm_platform_sysctl_set:
+ * @self: platform instance
* @path: Absolute option path
* @value: Value to write
*
@@ -247,23 +295,25 @@ nm_platform_check_support_user_ipv6ll (void)
* Returns: %TRUE on success.
*/
gboolean
-nm_platform_sysctl_set (const char *path, const char *value)
+nm_platform_sysctl_set (NMPlatform *self, const char *path, const char *value)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (path, FALSE);
g_return_val_if_fail (value, FALSE);
g_return_val_if_fail (klass->sysctl_set, FALSE);
- return klass->sysctl_set (platform, path, value);
+ return klass->sysctl_set (self, path, value);
}
gboolean
-nm_platform_sysctl_set_ip6_hop_limit_safe (const char *iface, int value)
+nm_platform_sysctl_set_ip6_hop_limit_safe (NMPlatform *self, const char *iface, int value)
{
const char *path;
gint64 cur;
+ _CHECK_SELF (self, klass, FALSE);
+
/* the hop-limit provided via RA is uint8. */
if (value > 0xFF)
return FALSE;
@@ -273,7 +323,7 @@ nm_platform_sysctl_set_ip6_hop_limit_safe (const char *iface, int value)
return FALSE;
path = nm_utils_ip6_property_path (iface, "hop_limit");
- cur = nm_platform_sysctl_get_int_checked (path, 10, 1, G_MAXINT32, -1);
+ cur = nm_platform_sysctl_get_int_checked (self, path, 10, 1, G_MAXINT32, -1);
/* only allow increasing the hop-limit to avoid DOS by an attacker
* setting a low hop-limit (CVE-2015-2924, rh#1209902) */
@@ -284,7 +334,7 @@ nm_platform_sysctl_set_ip6_hop_limit_safe (const char *iface, int value)
char svalue[20];
sprintf (svalue, "%d", value);
- nm_platform_sysctl_set (path, svalue);
+ nm_platform_sysctl_set (self, path, svalue);
}
return TRUE;
@@ -292,23 +342,25 @@ nm_platform_sysctl_set_ip6_hop_limit_safe (const char *iface, int value)
/**
* nm_platform_sysctl_get:
+ * @self: platform instance
* @path: Absolute path to sysctl
*
* Returns: (transfer full): Contents of the virtual sysctl file.
*/
char *
-nm_platform_sysctl_get (const char *path)
+nm_platform_sysctl_get (NMPlatform *self, const char *path)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (path, NULL);
g_return_val_if_fail (klass->sysctl_get, NULL);
- return klass->sysctl_get (platform, path);
+ return klass->sysctl_get (self, path);
}
/**
* nm_platform_sysctl_get_int32:
+ * @self: platform instance
* @path: Absolute path to sysctl
* @fallback: default value, if the content of path could not be read
* as decimal integer.
@@ -318,13 +370,14 @@ nm_platform_sysctl_get (const char *path)
* value, on success %errno will be set to zero.
*/
gint32
-nm_platform_sysctl_get_int32 (const char *path, gint32 fallback)
+nm_platform_sysctl_get_int32 (NMPlatform *self, const char *path, gint32 fallback)
{
- return nm_platform_sysctl_get_int_checked (path, 10, G_MININT32, G_MAXINT32, fallback);
+ return nm_platform_sysctl_get_int_checked (self, path, 10, G_MININT32, G_MAXINT32, fallback);
}
/**
* nm_platform_sysctl_get_int_checked:
+ * @self: platform instance
* @path: Absolute path to sysctl
* @base: base of numeric conversion
* @min: minimal value that is still valid
@@ -339,22 +392,24 @@ nm_platform_sysctl_get_int32 (const char *path, gint32 fallback)
* (inclusive) or @fallback.
*/
gint64
-nm_platform_sysctl_get_int_checked (const char *path, guint base, gint64 min, gint64 max, gint64 fallback)
+nm_platform_sysctl_get_int_checked (NMPlatform *self, const char *path, guint base, gint64 min, gint64 max, gint64 fallback)
{
char *value = NULL;
gint32 ret;
+ _CHECK_SELF (self, klass, fallback);
+
g_return_val_if_fail (path, fallback);
if (path)
- value = nm_platform_sysctl_get (path);
+ value = nm_platform_sysctl_get (self, path);
if (!value) {
errno = EINVAL;
return fallback;
}
- ret = nm_utils_ascii_str_to_int64 (value, base, min, max, fallback);
+ ret = _nm_utils_ascii_str_to_int64 (value, base, min, max, fallback);
g_free (value);
return ret;
}
@@ -362,47 +417,25 @@ nm_platform_sysctl_get_int_checked (const char *path, guint base, gint64 min, gi
/******************************************************************/
/**
- * nm_platform_query_devices:
- *
- * Emit #NMPlatform:link-changed ADDED signals for all currently-known links.
- * Should only be called at startup.
- */
-void
-nm_platform_query_devices (void)
-{
- GArray *links_array;
- NMPlatformLink *links;
- int i;
-
- links_array = nm_platform_link_get_all ();
- links = (NMPlatformLink *) links_array->data;
- for (i = 0; i < links_array->len; i++) {
- g_signal_emit (platform, signals[SIGNAL_LINK_CHANGED], 0,
- links[i].ifindex, &links[i], NM_PLATFORM_SIGNAL_ADDED,
- NM_PLATFORM_REASON_INTERNAL);
- }
- g_array_unref (links_array);
-}
-
-/**
* nm_platform_link_get_all:
+ * self: platform instance
*
* Retrieve a snapshot of configuration for all links at once. The result is
* owned by the caller and should be freed with g_array_unref().
*/
GArray *
-nm_platform_link_get_all (void)
+nm_platform_link_get_all (NMPlatform *self)
{
GArray *links, *result;
guint i, j, nresult;
GHashTable *unseen;
NMPlatformLink *item;
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (klass->link_get_all, NULL);
- links = klass->link_get_all (platform);
+ links = klass->link_get_all (self);
if (!links || links->len == 0)
return links;
@@ -411,11 +444,9 @@ nm_platform_link_get_all (void)
for (i = 0; i < links->len; i++) {
item = &g_array_index (links, NMPlatformLink, i);
- if (item->ifindex <= 0 || g_hash_table_contains (unseen, GINT_TO_POINTER (item->ifindex))) {
- g_warn_if_reached ();
- item->ifindex = 0;
- continue;
- }
+ _LOGT ("link-get: %3d: %s", i, nm_platform_link_to_string (item));
+
+ nm_assert (item->ifindex > 0 && !g_hash_table_contains (unseen, GINT_TO_POINTER (item->ifindex)));
g_hash_table_insert (unseen, GINT_TO_POINTER (item->ifindex), NULL);
}
@@ -466,6 +497,8 @@ nm_platform_link_get_all (void)
if (item->parent > 0 && g_hash_table_contains (unseen, GINT_TO_POINTER (item->parent)))
continue;
+ _LOGT ("link-get: add %3d -> %3d: %s", i, j, nm_platform_link_to_string (item));
+
g_hash_table_remove (unseen, GINT_TO_POINTER (item->ifindex));
g_array_index (result, NMPlatformLink, j++) = *item;
item->ifindex = 0;
@@ -473,10 +506,12 @@ nm_platform_link_get_all (void)
}
if (!found_something) {
- /* there is a circle, pop the first (remaining) element from the list */
- g_warn_if_reached ();
+ /* There is a loop, pop the first (remaining) element from the list.
+ * This can happen for veth pairs where each peer is parent of the other end. */
item = &g_array_index (links, NMPlatformLink, first_idx);
+ _LOGT ("link-get: add (loop) %3d -> %3d: %s", first_idx, j, nm_platform_link_to_string (item));
+
g_hash_table_remove (unseen, GINT_TO_POINTER (item->ifindex));
g_array_index (result, NMPlatformLink, j++) = *item;
item->ifindex = 0;
@@ -491,182 +526,229 @@ nm_platform_link_get_all (void)
/**
* nm_platform_link_get:
+ * @self: platform instance
* @ifindex: ifindex of the link
- * @link: (out): output NMPlatformLink structure.
*
- * If a link with given @ifindex exists, fill the given NMPlatformLink
- * structure.
+ * Lookup the internal NMPlatformLink object.
*
- * Returns: %TRUE, if such a link exists, %FALSE otherwise.
- * If the link does not exist, the content of @link is undefined.
+ * Returns: %NULL, if such a link exists or the internal
+ * platform link object. Do not modify the returned value.
+ * Also, be aware that any subsequent platform call might
+ * invalidated/modify the returned instance.
**/
-gboolean
-nm_platform_link_get (int ifindex, NMPlatformLink *link)
+const NMPlatformLink *
+nm_platform_link_get (NMPlatform *self, int ifindex)
{
- g_return_val_if_fail (ifindex > 0, FALSE);
- g_return_val_if_fail (link, FALSE);
+ _CHECK_SELF (self, klass, NULL);
+
+ if (ifindex > 0)
+ return klass->link_get (self, ifindex);
+ return NULL;
+}
+
+/**
+ * nm_platform_link_get_by_ifname:
+ * @self: platform instance
+ * @ifname: the ifname
+ *
+ * Returns: the first #NMPlatformLink instance with the given name.
+ **/
+const NMPlatformLink *
+nm_platform_link_get_by_ifname (NMPlatform *self, const char *ifname)
+{
+ _CHECK_SELF (self, klass, NULL);
- g_return_val_if_fail (klass->link_get, FALSE);
- return !!klass->link_get (platform, ifindex, link);
+ if (ifname && *ifname)
+ return klass->link_get_by_ifname (self, ifname);
+ return NULL;
+}
+
+/**
+ * nm_platform_link_get_by_address:
+ * @self: platform instance
+ * @address: a pointer to the binary hardware address
+ * @length: the size of @address in bytes
+ *
+ * Returns: the first #NMPlatformLink object with a matching
+ * address.
+ **/
+const NMPlatformLink *
+nm_platform_link_get_by_address (NMPlatform *self,
+ gconstpointer address,
+ size_t length)
+{
+ _CHECK_SELF (self, klass, NULL);
+
+ g_return_val_if_fail (length == 0 || address, NULL);
+ if (length > 0) {
+ if (length > NM_UTILS_HWADDR_LEN_MAX)
+ g_return_val_if_reached (NULL);
+ return klass->link_get_by_address (self, address, length);
+ }
+ return NULL;
+}
+
+static NMPlatformError
+_link_add_check_existing (NMPlatform *self, const char *name, NMLinkType type, NMPlatformLink *out_link)
+{
+ const NMPlatformLink *pllink;
+
+ pllink = nm_platform_link_get_by_ifname (self, name);
+ if (pllink) {
+ gboolean wrong_type;
+
+ wrong_type = type != NM_LINK_TYPE_NONE && pllink->type != type;
+ _LOGD ("link: skip adding link due to existing interface '%s' of type %s%s%s",
+ name,
+ nm_link_type_to_string (pllink->type),
+ wrong_type ? ", expected " : "",
+ wrong_type ? nm_link_type_to_string (type) : "");
+ if (out_link)
+ *out_link = *pllink;
+ if (wrong_type)
+ return NM_PLATFORM_ERROR_WRONG_TYPE;
+ return NM_PLATFORM_ERROR_EXISTS;
+ }
+ return NM_PLATFORM_ERROR_SUCCESS;
}
/**
* nm_platform_link_add:
+ * @self: platform instance
* @name: Interface name
* @type: Interface type
* @address: (allow-none): set the mac address of the link
* @address_len: the length of the @address
+ * @out_link: on success, the link object
*
- * Add a software interface. Sets platform->error to NM_PLATFORM_ERROR_EXISTS
- * if interface is already already exists. Any link-changed ADDED signal will be
- * emitted directly, before this function finishes.
+ * Add a software interface. If the interface already exists and is of type
+ * @type, return NM_PLATFORM_ERROR_EXISTS and returns the link
+ * in @out_link. If the interface already exists and is not of type @type,
+ * return NM_PLATFORM_ERROR_WRONG_TYPE.
+ *
+ * Any link-changed ADDED signal will be emitted directly, before this
+ * function finishes.
+ *
+ * Returns: the error reason or NM_PLATFORM_ERROR_SUCCESS.
*/
-static gboolean
-nm_platform_link_add (const char *name, NMLinkType type, const void *address, size_t address_len)
+static NMPlatformError
+nm_platform_link_add (NMPlatform *self,
+ const char *name,
+ NMLinkType type,
+ const void *address,
+ size_t address_len,
+ NMPlatformLink *out_link)
{
- reset_error ();
+ NMPlatformError plerr;
- g_return_val_if_fail (name, FALSE);
- g_return_val_if_fail (klass->link_add, FALSE);
- g_return_val_if_fail ( (address != NULL) ^ (address_len == 0) , FALSE);
+ _CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
- if (nm_platform_link_exists (name)) {
- debug ("link: already exists");
- platform->error = NM_PLATFORM_ERROR_EXISTS;
- return FALSE;
- }
+ g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail (klass->link_add, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail ( (address != NULL) ^ (address_len == 0) , NM_PLATFORM_ERROR_BUG);
+
+ plerr = _link_add_check_existing (self, name, type, out_link);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS)
+ return plerr;
- return klass->link_add (platform, name, type, address, address_len);
+ _LOGD ("link: adding %s '%s'", nm_link_type_to_string (type), name);
+ if (!klass->link_add (self, name, type, address, address_len, out_link))
+ return NM_PLATFORM_ERROR_UNSPECIFIED;
+ return NM_PLATFORM_ERROR_SUCCESS;
}
/**
* nm_platform_dummy_add:
+ * @self: platform instance
* @name: New interface name
+ * @out_link: on success, the link object
*
* Create a software ethernet-like interface
*/
-gboolean
-nm_platform_dummy_add (const char *name)
-{
- g_return_val_if_fail (name, FALSE);
-
- debug ("link: adding dummy '%s'", name);
- return nm_platform_link_add (name, NM_LINK_TYPE_DUMMY, NULL, 0);
-}
-
-/**
- * nm_platform_link_exists:
- * @name: Interface name
- *
- * Returns: %TRUE if an interface of this name exists, %FALSE otherwise.
- */
-gboolean
-nm_platform_link_exists (const char *name)
+NMPlatformError
+nm_platform_dummy_add (NMPlatform *self, const char *name, NMPlatformLink *out_link)
{
- int ifindex = nm_platform_link_get_ifindex (name);
-
- reset_error();
- return ifindex > 0;
+ return nm_platform_link_add (self, name, NM_LINK_TYPE_DUMMY, NULL, 0, out_link);
}
/**
* nm_platform_link_delete:
+ * @self: platform instance
* @ifindex: Interface index
- *
- * Delete a software interface. Sets platform->error to
- * NM_PLATFORM_ERROR_NOT_FOUND if ifindex not available.
*/
gboolean
-nm_platform_link_delete (int ifindex)
+nm_platform_link_delete (NMPlatform *self, int ifindex)
{
- const char *name;
+ const NMPlatformLink *pllink;
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_return_val_if_fail (klass->link_delete, FALSE);
-
- name = nm_platform_link_get_name (ifindex);
-
- if (!name)
+ pllink = nm_platform_link_get (self, ifindex);
+ if (!pllink)
return FALSE;
- debug ("link: deleting '%s' (%d)", name, ifindex);
- return klass->link_delete (platform, ifindex);
+ _LOGD ("link: deleting '%s' (%d)", pllink->name, ifindex);
+ return klass->link_delete (self, ifindex);
}
/**
* nm_platform_link_get_index:
+ * @self: platform instance
* @name: Interface name
*
* Returns: The interface index corresponding to the given interface name
* or 0. Inteface name is owned by #NMPlatform, don't free it.
*/
int
-nm_platform_link_get_ifindex (const char *name)
+nm_platform_link_get_ifindex (NMPlatform *self, const char *name)
{
- int ifindex;
-
- reset_error ();
+ const NMPlatformLink *pllink;
- g_return_val_if_fail (name, 0);
- g_return_val_if_fail (klass->link_get_ifindex, 0);
-
- ifindex = klass->link_get_ifindex (platform, name);
-
- if (!ifindex) {
- debug ("link not found: %s", name);
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
- }
-
- return ifindex;
+ pllink = nm_platform_link_get_by_ifname (self, name);
+ return pllink ? pllink->ifindex : 0;
}
/**
* nm_platform_link_get_name:
+ * @self: platform instance
* @name: Interface name
*
* Returns: The interface name corresponding to the given interface index
* or %NULL.
*/
const char *
-nm_platform_link_get_name (int ifindex)
+nm_platform_link_get_name (NMPlatform *self, int ifindex)
{
- const char *name;
-
- reset_error ();
-
- g_return_val_if_fail (klass->link_get_name, NULL);
+ const NMPlatformLink *pllink;
- name = klass->link_get_name (platform, ifindex);
-
- if (!name) {
- debug ("link not found: %d", ifindex);
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
- return FALSE;
- }
+ _CHECK_SELF (self, klass, NULL);
- return name;
+ pllink = nm_platform_link_get (self, ifindex);
+ return pllink ? pllink->name : NULL;
}
/**
* nm_platform_link_get_type:
+ * @self: platform instance
* @ifindex: Interface index.
*
* Returns: Link type constant as defined in nm-platform.h. On error,
* NM_LINK_TYPE_NONE is returned.
*/
NMLinkType
-nm_platform_link_get_type (int ifindex)
+nm_platform_link_get_type (NMPlatform *self, int ifindex)
{
- reset_error ();
+ const NMPlatformLink *pllink;
- g_return_val_if_fail (klass->link_get_type, NM_LINK_TYPE_NONE);
+ _CHECK_SELF (self, klass, NM_LINK_TYPE_NONE);
- return klass->link_get_type (platform, ifindex);
+ pllink = nm_platform_link_get (self, ifindex);
+ return pllink ? pllink->type : NM_LINK_TYPE_NONE;
}
/**
* nm_platform_link_get_type_name:
+ * @self: platform instance
* @ifindex: Interface index.
*
* Returns: A string describing the type of link. In some cases this
@@ -674,113 +756,200 @@ nm_platform_link_get_type (int ifindex)
* other cases it may not. On error, %NULL is returned.
*/
const char *
-nm_platform_link_get_type_name (int ifindex)
+nm_platform_link_get_type_name (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (klass->link_get_type_name, NULL);
- return klass->link_get_type_name (platform, ifindex);
+ return klass->link_get_type_name (self, ifindex);
+}
+
+/**
+ * nm_platform_link_get_unmanaged:
+ * @self: platform instance
+ * @ifindex: interface index
+ * @unmanaged: management status (in case %TRUE is returned)
+ *
+ * Returns: %TRUE if platform overrides NM default-unmanaged status,
+ * %FALSE otherwise (with @unmanaged unmodified).
+ */
+gboolean
+nm_platform_link_get_unmanaged (NMPlatform *self, int ifindex, gboolean *unmanaged)
+{
+ _CHECK_SELF (self, klass, FALSE);
+
+ if (klass->link_get_unmanaged)
+ return klass->link_get_unmanaged (self, ifindex, unmanaged);
+ return FALSE;
}
/**
* nm_platform_link_is_software:
+ * @self: platform instance
* @ifindex: Interface index.
*
* Returns: %TRUE if ifindex belongs to a software interface, not backed by
* a physical device.
*/
gboolean
-nm_platform_link_is_software (int ifindex)
+nm_platform_link_is_software (NMPlatform *self, int ifindex)
{
- return (nm_platform_link_get_type (ifindex) & 0x10000);
+ return (nm_platform_link_get_type (self, ifindex) & 0x10000);
}
/**
* nm_platform_link_supports_slaves:
+ * @self: platform instance
* @ifindex: Interface index.
*
* Returns: %TRUE if ifindex belongs to an interface capable of enslaving
* other interfaces.
*/
gboolean
-nm_platform_link_supports_slaves (int ifindex)
+nm_platform_link_supports_slaves (NMPlatform *self, int ifindex)
{
- return (nm_platform_link_get_type (ifindex) & 0x20000);
+ return (nm_platform_link_get_type (self, ifindex) & 0x20000);
}
/**
* nm_platform_link_refresh:
+ * @self: platform instance
* @ifindex: Interface index
*
* Reload the cache for ifindex synchronously.
*/
gboolean
-nm_platform_link_refresh (int ifindex)
+nm_platform_link_refresh (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
if (klass->link_refresh)
- return klass->link_refresh (platform, ifindex);
+ return klass->link_refresh (self, ifindex);
return TRUE;
}
+static guint32
+_link_get_flags (NMPlatform *self, int ifindex)
+{
+ const NMPlatformLink *pllink;
+
+ pllink = nm_platform_link_get (self, ifindex);
+ return pllink ? pllink->flags : IFF_NOARP;
+}
+
/**
* nm_platform_link_is_up:
+ * @self: platform instance
* @ifindex: Interface index
*
* Check if the interface is up.
*/
gboolean
-nm_platform_link_is_up (int ifindex)
+nm_platform_link_is_up (NMPlatform *self, int ifindex)
{
- reset_error ();
-
- g_return_val_if_fail (ifindex >= 0, FALSE);
- g_return_val_if_fail (klass->link_is_up, FALSE);
+ _CHECK_SELF (self, klass, FALSE);
- return klass->link_is_up (platform, ifindex);
+ return NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_UP);
}
/**
* nm_platform_link_is_connected:
+ * @self: platform instance
* @ifindex: Interface index
*
* Check if the interface is connected.
*/
gboolean
-nm_platform_link_is_connected (int ifindex)
+nm_platform_link_is_connected (NMPlatform *self, int ifindex)
{
- reset_error ();
+ const NMPlatformLink *pllink;
- g_return_val_if_fail (ifindex >= 0, FALSE);
- g_return_val_if_fail (klass->link_is_connected, FALSE);
+ _CHECK_SELF (self, klass, FALSE);
- return klass->link_is_connected (platform, ifindex);
+ pllink = nm_platform_link_get (self, ifindex);
+ return pllink ? pllink->connected : FALSE;
}
/**
* nm_platform_link_uses_arp:
+ * @self: platform instance
* @ifindex: Interface index
*
* Check if the interface is configured to use ARP.
*/
gboolean
-nm_platform_link_uses_arp (int ifindex)
+nm_platform_link_uses_arp (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
+
+ return !NM_FLAGS_HAS (_link_get_flags (self, ifindex), IFF_NOARP);
+}
+
+/**
+ * nm_platform_link_get_ipv6_token:
+ * @self: platform instance
+ * @ifindex: Interface index
+ * @iid: Tokenized interface identifier
+ *
+ * Returns IPv6 tokenized interface identifier. If the platform or OS doesn't
+ * support IPv6 tokenized interface identifiers, or the token is not set
+ * this call will fail and return %FALSE.
+ *
+ * Returns: %TRUE a tokenized identifier was available
+ */
+gboolean
+nm_platform_link_get_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6IfaceId *iid)
+{
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
- g_return_val_if_fail (klass->link_uses_arp, FALSE);
+ g_return_val_if_fail (iid, FALSE);
+
+#if HAVE_LIBNL_INET6_TOKEN
+ {
+ const NMPlatformLink *pllink;
- return klass->link_uses_arp (platform, ifindex);
+ pllink = nm_platform_link_get (self, ifindex);
+ if (pllink && pllink->inet6_token.is_valid) {
+ *iid = pllink->inet6_token.iid;
+ return TRUE;
+ }
+ }
+#endif
+ return FALSE;
+}
+
+const char *
+nm_platform_link_get_udi (NMPlatform *self, int ifindex)
+{
+ _CHECK_SELF (self, klass, FALSE);
+
+ g_return_val_if_fail (ifindex >= 0, NULL);
+
+ if (klass->link_get_udi)
+ return klass->link_get_udi (self, ifindex);
+ return NULL;
+}
+
+GObject *
+nm_platform_link_get_udev_device (NMPlatform *self, int ifindex)
+{
+ _CHECK_SELF (self, klass, FALSE);
+
+ g_return_val_if_fail (ifindex >= 0, NULL);
+
+ if (klass->link_get_udev_device)
+ return klass->link_get_udev_device (self, ifindex);
+ return NULL;
}
/**
* nm_platform_link_get_user_ip6vll_enabled:
+ * @self: platform instance
* @ifindex: Interface index
*
* Check whether NM handles IPv6LL address creation for the link. If the
@@ -790,20 +959,28 @@ nm_platform_link_uses_arp (int ifindex)
* Returns: %TRUE if NM handles the IPv6LL address for @ifindex
*/
gboolean
-nm_platform_link_get_user_ipv6ll_enabled (int ifindex)
+nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
- g_return_val_if_fail (klass->check_support_user_ipv6ll, FALSE);
- if (klass->link_get_user_ipv6ll_enabled)
- return klass->link_get_user_ipv6ll_enabled (platform, ifindex);
+#if HAVE_LIBNL_INET6_ADDR_GEN_MODE
+ {
+ const NMPlatformLink *pllink;
+
+ pllink = nm_platform_link_get (self, ifindex);
+ if (pllink && pllink->inet6_addr_gen_mode_inv)
+ return _nm_platform_uint8_inv (pllink->inet6_addr_gen_mode_inv) == IN6_ADDR_GEN_MODE_NONE;
+ }
+#endif
return FALSE;
}
+
/**
* nm_platform_link_set_user_ip6vll_enabled:
+ * @self: platform instance
* @ifindex: Interface index
*
* Set whether NM handles IPv6LL address creation for the link. If the
@@ -813,189 +990,248 @@ nm_platform_link_get_user_ipv6ll_enabled (int ifindex)
* Returns: %TRUE if the operation was successful, %FALSE if it failed.
*/
gboolean
-nm_platform_link_set_user_ipv6ll_enabled (int ifindex, gboolean enabled)
+nm_platform_link_set_user_ipv6ll_enabled (NMPlatform *self, int ifindex, gboolean enabled)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->check_support_user_ipv6ll, FALSE);
if (klass->link_set_user_ipv6ll_enabled)
- return klass->link_set_user_ipv6ll_enabled (platform, ifindex, enabled);
+ return klass->link_set_user_ipv6ll_enabled (self, ifindex, enabled);
return FALSE;
}
/**
* nm_platform_link_set_address:
+ * @self: platform instance
* @ifindex: Interface index
* @address: The new MAC address
*
* Set interface MAC address.
*/
gboolean
-nm_platform_link_set_address (int ifindex, gconstpointer address, size_t length)
+nm_platform_link_set_address (NMPlatform *self, int ifindex, gconstpointer address, size_t length)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (address, FALSE);
g_return_val_if_fail (length > 0, FALSE);
g_return_val_if_fail (klass->link_set_address, FALSE);
- debug ("link: setting '%s' (%d) hardware address", nm_platform_link_get_name (ifindex), ifindex);
- return klass->link_set_address (platform, ifindex, address, length);
+ _LOGD ("link: setting '%s' (%d) hardware address", nm_platform_link_get_name (self, ifindex), ifindex);
+ return klass->link_set_address (self, ifindex, address, length);
}
/**
* nm_platform_link_get_address:
+ * @self: platform instance
* @ifindex: Interface index
* @length: Pointer to a variable to store address length
*
- * Saves interface hardware address to @address.
+ * Returns: the interface hardware address as an array of bytes of
+ * length @length.
*/
gconstpointer
-nm_platform_link_get_address (int ifindex, size_t *length)
+nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length)
{
- reset_error ();
+ const NMPlatformLink *pllink;
+ gconstpointer a = NULL;
+ guint8 l = 0;
+
+ _CHECK_SELF (self, klass, NULL);
if (length)
*length = 0;
g_return_val_if_fail (ifindex > 0, NULL);
- g_return_val_if_fail (klass->link_get_address, NULL);
- return klass->link_get_address (platform, ifindex, length);
+ pllink = nm_platform_link_get (self, ifindex);
+ if (pllink && pllink->addr.len > 0) {
+ if (pllink->addr.len > NM_UTILS_HWADDR_LEN_MAX) {
+ if (length)
+ *length = 0;
+ g_return_val_if_reached (NULL);
+ }
+ a = pllink->addr.data;
+ l = pllink->addr.len;
+ }
+
+ if (length)
+ *length = l;
+ return a;
+}
+
+/**
+ * nm_platform_link_get_permanent_address:
+ * @self: platform instance
+ * @ifindex: Interface index
+ * @buf: buffer of at least %NM_UTILS_HWADDR_LEN_MAX bytes, on success
+ * the permanent hardware address
+ * @length: Pointer to a variable to store address length
+ *
+ * Returns: %TRUE on success, %FALSE on failure to read the permanent hardware
+ * address.
+ */
+gboolean
+nm_platform_link_get_permanent_address (NMPlatform *self, int ifindex, guint8 *buf, size_t *length)
+{
+ _CHECK_SELF (self, klass, FALSE);
+
+ if (length)
+ *length = 0;
+
+ g_return_val_if_fail (ifindex > 0, FALSE);
+ g_return_val_if_fail (buf, FALSE);
+ g_return_val_if_fail (length, FALSE);
+
+ if (klass->link_get_permanent_address)
+ return klass->link_get_permanent_address (self, ifindex, buf, length);
+ return FALSE;
}
gboolean
-nm_platform_link_supports_carrier_detect (int ifindex)
+nm_platform_link_supports_carrier_detect (NMPlatform *self, int ifindex)
{
+ _CHECK_SELF (self, klass, FALSE);
+
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_supports_carrier_detect, FALSE);
- return klass->link_supports_carrier_detect (platform, ifindex);
+ return klass->link_supports_carrier_detect (self, ifindex);
}
gboolean
-nm_platform_link_supports_vlans (int ifindex)
+nm_platform_link_supports_vlans (NMPlatform *self, int ifindex)
{
+ _CHECK_SELF (self, klass, FALSE);
+
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_supports_vlans, FALSE);
- return klass->link_supports_vlans (platform, ifindex);
+ return klass->link_supports_vlans (self, ifindex);
}
/**
* nm_platform_link_set_up:
+ * @self: platform instance
* @ifindex: Interface index
+ * @out_no_firmware: (allow-none): if the failure reason is due to missing firmware.
*
* Bring the interface up.
*/
gboolean
-nm_platform_link_set_up (int ifindex)
+nm_platform_link_set_up (NMPlatform *self, int ifindex, gboolean *out_no_firmware)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (klass->link_set_up, FALSE);
- debug ("link: setting up '%s' (%d)", nm_platform_link_get_name (ifindex), ifindex);
- return klass->link_set_up (platform, ifindex);
+ _LOGD ("link: setting up '%s' (%d)", nm_platform_link_get_name (self, ifindex), ifindex);
+ return klass->link_set_up (self, ifindex, out_no_firmware);
}
/**
* nm_platform_link_set_down:
+ * @self: platform instance
* @ifindex: Interface index
*
* Take the interface down.
*/
gboolean
-nm_platform_link_set_down (int ifindex)
+nm_platform_link_set_down (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (klass->link_set_down, FALSE);
- debug ("link: setting down '%s' (%d)", nm_platform_link_get_name (ifindex), ifindex);
- return klass->link_set_down (platform, ifindex);
+ _LOGD ("link: setting down '%s' (%d)", nm_platform_link_get_name (self, ifindex), ifindex);
+ return klass->link_set_down (self, ifindex);
}
/**
* nm_platform_link_set_arp:
+ * @self: platform instance
* @ifindex: Interface index
*
* Enable ARP on the interface.
*/
gboolean
-nm_platform_link_set_arp (int ifindex)
+nm_platform_link_set_arp (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_set_arp, FALSE);
- debug ("link: setting arp '%s' (%d)", nm_platform_link_get_name (ifindex), ifindex);
- return klass->link_set_arp (platform, ifindex);
+ _LOGD ("link: setting arp '%s' (%d)", nm_platform_link_get_name (self, ifindex), ifindex);
+ return klass->link_set_arp (self, ifindex);
}
/**
* nm_platform_link_set_noarp:
+ * @self: platform instance
* @ifindex: Interface index
*
* Disable ARP on the interface.
*/
gboolean
-nm_platform_link_set_noarp (int ifindex)
+nm_platform_link_set_noarp (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (klass->link_set_noarp, FALSE);
- debug ("link: setting noarp '%s' (%d)", nm_platform_link_get_name (ifindex), ifindex);
- return klass->link_set_noarp (platform, ifindex);
+ _LOGD ("link: setting noarp '%s' (%d)", nm_platform_link_get_name (self, ifindex), ifindex);
+ return klass->link_set_noarp (self, ifindex);
}
/**
* nm_platform_link_set_mtu:
+ * @self: platform instance
* @ifindex: Interface index
* @mtu: The new MTU value
*
* Set interface MTU.
*/
gboolean
-nm_platform_link_set_mtu (int ifindex, guint32 mtu)
+nm_platform_link_set_mtu (NMPlatform *self, int ifindex, guint32 mtu)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
g_return_val_if_fail (mtu > 0, FALSE);
g_return_val_if_fail (klass->link_set_mtu, FALSE);
- debug ("link: setting '%s' (%d) mtu %"G_GUINT32_FORMAT, nm_platform_link_get_name (ifindex), ifindex, mtu);
- return klass->link_set_mtu (platform, ifindex, mtu);
+ _LOGD ("link: setting '%s' (%d) mtu %"G_GUINT32_FORMAT, nm_platform_link_get_name (self, ifindex), ifindex, mtu);
+ return klass->link_set_mtu (self, ifindex, mtu);
}
/**
* nm_platform_link_get_mtu:
+ * @self: platform instance
* @ifindex: Interface index
*
* Returns: MTU value for the interface or 0 on error.
*/
guint32
-nm_platform_link_get_mtu (int ifindex)
+nm_platform_link_get_mtu (NMPlatform *self, int ifindex)
{
- reset_error ();
+ const NMPlatformLink *pllink;
- g_return_val_if_fail (ifindex >= 0, 0);
- g_return_val_if_fail (klass->link_get_mtu, 0);
+ _CHECK_SELF (self, klass, 0);
- return klass->link_get_mtu (platform, ifindex);
+ pllink = nm_platform_link_get (self, ifindex);
+ return pllink ? pllink->mtu : 0;
}
/**
* nm_platform_link_get_physical_port_id:
+ * @self: platform instance
* @ifindex: Interface index
*
* The physical port ID, if present, indicates some unique identifier of
@@ -1008,18 +1244,20 @@ nm_platform_link_get_mtu (int ifindex)
* or if the interface has no physical port ID.
*/
char *
-nm_platform_link_get_physical_port_id (int ifindex)
+nm_platform_link_get_physical_port_id (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex >= 0, NULL);
- g_return_val_if_fail (klass->link_get_physical_port_id, NULL);
- return klass->link_get_physical_port_id (platform, ifindex);
+ if (klass->link_get_physical_port_id)
+ return klass->link_get_physical_port_id (self, ifindex);
+ return NULL;
}
/**
* nm_platform_link_get_dev_id:
+ * @self: platform instance
* @ifindex: Interface index
*
* In contrast to the physical device ID (which indicates which parent a
@@ -1030,233 +1268,277 @@ nm_platform_link_get_physical_port_id (int ifindex)
* interface has no device ID.
*/
guint
-nm_platform_link_get_dev_id (int ifindex)
+nm_platform_link_get_dev_id (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex >= 0, 0);
- g_return_val_if_fail (klass->link_get_dev_id, 0);
- return klass->link_get_dev_id (platform, ifindex);
+ if (klass->link_get_dev_id)
+ return klass->link_get_dev_id (self, ifindex);
+ return 0;
}
/**
* nm_platform_link_get_wake_onlan:
+ * @self: platform instance
* @ifindex: Interface index
*
* Returns: the "Wake-on-LAN" status for @ifindex.
*/
gboolean
-nm_platform_link_get_wake_on_lan (int ifindex)
+nm_platform_link_get_wake_on_lan (NMPlatform *self, int ifindex)
+{
+ _CHECK_SELF (self, klass, FALSE);
+
+ g_return_val_if_fail (ifindex >= 0, FALSE);
+
+ if (klass->link_get_wake_on_lan)
+ return klass->link_get_wake_on_lan (self, ifindex);
+ return FALSE;
+}
+
+/**
+ * nm_platform_link_get_driver_info:
+ * @self: platform instance
+ * @ifindex: Interface index
+ * @out_driver_name: (transfer full): on success, the driver name if available
+ * @out_driver_version: (transfer full): on success, the driver version if available
+ * @out_fw_version: (transfer full): on success, the firmware version if available
+ *
+ * Returns: %TRUE on success (though @out_driver_name, @out_driver_version and
+ * @out_fw_version can be %NULL if no information was available), %FALSE on
+ * failure.
+ */
+gboolean
+nm_platform_link_get_driver_info (NMPlatform *self,
+ int ifindex,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex >= 0, FALSE);
- g_return_val_if_fail (klass->link_get_wake_on_lan, FALSE);
+ g_return_val_if_fail (klass->link_get_driver_info, FALSE);
- return klass->link_get_wake_on_lan (platform, ifindex);
+ return klass->link_get_driver_info (self,
+ ifindex,
+ out_driver_name,
+ out_driver_version,
+ out_fw_version);
}
/**
* nm_platform_link_enslave:
+ * @self: platform instance
* @master: Interface index of the master
* @slave: Interface index of the slave
*
* Enslave @slave to @master.
*/
gboolean
-nm_platform_link_enslave (int master, int slave)
+nm_platform_link_enslave (NMPlatform *self, int master, int slave)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_assert (platform);
g_return_val_if_fail (master > 0, FALSE);
g_return_val_if_fail (slave> 0, FALSE);
g_return_val_if_fail (klass->link_enslave, FALSE);
- debug ("link: enslaving '%s' (%d) to master '%s' (%d)",
- nm_platform_link_get_name (slave), slave,
- nm_platform_link_get_name (master), master);
- return klass->link_enslave (platform, master, slave);
+ _LOGD ("link: enslaving '%s' (%d) to master '%s' (%d)",
+ nm_platform_link_get_name (self, slave), slave,
+ nm_platform_link_get_name (self, master), master);
+ return klass->link_enslave (self, master, slave);
}
/**
* nm_platform_link_release:
+ * @self: platform instance
* @master: Interface index of the master
* @slave: Interface index of the slave
*
* Release @slave from @master.
*/
gboolean
-nm_platform_link_release (int master, int slave)
+nm_platform_link_release (NMPlatform *self, int master, int slave)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_assert (platform);
g_return_val_if_fail (master > 0, FALSE);
g_return_val_if_fail (slave > 0, FALSE);
g_return_val_if_fail (klass->link_release, FALSE);
- if (nm_platform_link_get_master (slave) != master) {
- platform->error = NM_PLATFORM_ERROR_NOT_SLAVE;
+ if (nm_platform_link_get_master (self, slave) != master)
return FALSE;
- }
- debug ("link: releasing '%s' (%d) from master '%s' (%d)",
- nm_platform_link_get_name (slave), slave,
- nm_platform_link_get_name (master), master);
- return klass->link_release (platform, master, slave);
+ _LOGD ("link: releasing '%s' (%d) from master '%s' (%d)",
+ nm_platform_link_get_name (self, slave), slave,
+ nm_platform_link_get_name (self, master), master);
+ return klass->link_release (self, master, slave);
}
/**
* nm_platform_link_get_master:
+ * @self: platform instance
* @slave: Interface index of the slave.
*
* Returns: Interfase index of the slave's master.
*/
int
-nm_platform_link_get_master (int slave)
+nm_platform_link_get_master (NMPlatform *self, int slave)
{
- reset_error ();
+ const NMPlatformLink *pllink;
+
+ _CHECK_SELF (self, klass, 0);
- g_assert (platform);
g_return_val_if_fail (slave >= 0, FALSE);
- g_return_val_if_fail (klass->link_get_master, FALSE);
- if (!nm_platform_link_get_name (slave)) {
- platform->error = NM_PLATFORM_ERROR_NOT_FOUND;
- return 0;
- }
- return klass->link_get_master (platform, slave);
+ pllink = nm_platform_link_get (self, slave);
+ return pllink ? pllink->master : 0;
}
/**
* nm_platform_bridge_add:
+ * @self: platform instance
* @name: New interface name
* @address: (allow-none): set the mac address of the new bridge
* @address_len: the length of the @address
+ * @out_link: on success, the link object
*
* Create a software bridge.
*/
-gboolean
-nm_platform_bridge_add (const char *name, const void *address, size_t address_len)
+NMPlatformError
+nm_platform_bridge_add (NMPlatform *self,
+ const char *name,
+ const void *address,
+ size_t address_len,
+ NMPlatformLink *out_link)
{
- debug ("link: adding bridge '%s'", name);
- return nm_platform_link_add (name, NM_LINK_TYPE_BRIDGE, address, address_len);
+ return nm_platform_link_add (self, name, NM_LINK_TYPE_BRIDGE, address, address_len, out_link);
}
/**
* nm_platform_bond_add:
+ * @self: platform instance
* @name: New interface name
+ * @out_link: on success, the link object
*
* Create a software bonding device.
*/
-gboolean
-nm_platform_bond_add (const char *name)
+NMPlatformError
+nm_platform_bond_add (NMPlatform *self, const char *name, NMPlatformLink *out_link)
{
- debug ("link: adding bond '%s'", name);
- return nm_platform_link_add (name, NM_LINK_TYPE_BOND, NULL, 0);
+ return nm_platform_link_add (self, name, NM_LINK_TYPE_BOND, NULL, 0, out_link);
}
/**
* nm_platform_team_add:
+ * @self: platform instance
* @name: New interface name
+ * @out_link: on success, the link object
*
* Create a software teaming device.
*/
-gboolean
-nm_platform_team_add (const char *name)
+NMPlatformError
+nm_platform_team_add (NMPlatform *self, const char *name, NMPlatformLink *out_link)
{
- debug ("link: adding team '%s'", name);
- return nm_platform_link_add (name, NM_LINK_TYPE_TEAM, NULL, 0);
+ return nm_platform_link_add (self, name, NM_LINK_TYPE_TEAM, NULL, 0, out_link);
}
/**
* nm_platform_vlan_add:
+ * @self: platform instance
* @name: New interface name
* @vlanid: VLAN identifier
* @vlanflags: VLAN flags from libnm
+ * @out_link: on success, the link object
*
* Create a software VLAN device.
*/
-gboolean
-nm_platform_vlan_add (const char *name, int parent, int vlanid, guint32 vlanflags)
+NMPlatformError
+nm_platform_vlan_add (NMPlatform *self,
+ const char *name,
+ int parent,
+ int vlanid,
+ guint32 vlanflags,
+ NMPlatformLink *out_link)
{
- reset_error ();
+ NMPlatformError plerr;
- g_assert (platform);
- g_return_val_if_fail (parent >= 0, FALSE);
- g_return_val_if_fail (vlanid >= 0, FALSE);
- g_return_val_if_fail (name, FALSE);
- g_return_val_if_fail (klass->vlan_add, FALSE);
+ _CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
- if (nm_platform_link_exists (name)) {
- debug ("link already exists: %s", name);
- platform->error = NM_PLATFORM_ERROR_EXISTS;
- return FALSE;
- }
+ g_return_val_if_fail (parent >= 0, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail (vlanid >= 0, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail (name, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail (klass->vlan_add, NM_PLATFORM_ERROR_BUG);
+
+ plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_VLAN, out_link);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS)
+ return plerr;
- debug ("link: adding vlan '%s' parent %d vlanid %d vlanflags %x",
- name, parent, vlanid, vlanflags);
- return klass->vlan_add (platform, name, parent, vlanid, vlanflags);
+ _LOGD ("link: adding vlan '%s' parent %d vlanid %d vlanflags %x",
+ name, parent, vlanid, vlanflags);
+ if (!klass->vlan_add (self, name, parent, vlanid, vlanflags, out_link))
+ return NM_PLATFORM_ERROR_UNSPECIFIED;
+ return NM_PLATFORM_ERROR_SUCCESS;
}
gboolean
-nm_platform_master_set_option (int ifindex, const char *option, const char *value)
+nm_platform_master_set_option (NMPlatform *self, int ifindex, const char *option, const char *value)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (option, FALSE);
g_return_val_if_fail (value, FALSE);
g_return_val_if_fail (klass->master_set_option, FALSE);
- return klass->master_set_option (platform, ifindex, option, value);
+ return klass->master_set_option (self, ifindex, option, value);
}
char *
-nm_platform_master_get_option (int ifindex, const char *option)
+nm_platform_master_get_option (NMPlatform *self, int ifindex, const char *option)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (option, FALSE);
g_return_val_if_fail (klass->master_set_option, FALSE);
- return klass->master_get_option (platform, ifindex, option);
+ return klass->master_get_option (self, ifindex, option);
}
gboolean
-nm_platform_slave_set_option (int ifindex, const char *option, const char *value)
+nm_platform_slave_set_option (NMPlatform *self, int ifindex, const char *option, const char *value)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (option, FALSE);
g_return_val_if_fail (value, FALSE);
g_return_val_if_fail (klass->slave_set_option, FALSE);
- return klass->slave_set_option (platform, ifindex, option, value);
+ return klass->slave_set_option (self, ifindex, option, value);
}
char *
-nm_platform_slave_get_option (int ifindex, const char *option)
+nm_platform_slave_get_option (NMPlatform *self, int ifindex, const char *option)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (option, FALSE);
g_return_val_if_fail (klass->slave_set_option, FALSE);
- return klass->slave_get_option (platform, ifindex, option);
+ return klass->slave_get_option (self, ifindex, option);
}
gboolean
-nm_platform_vlan_get_info (int ifindex, int *parent, int *vlanid)
+nm_platform_vlan_get_info (NMPlatform *self, int ifindex, int *parent, int *vlanid)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_assert (platform);
g_return_val_if_fail (klass->vlan_get_info, FALSE);
if (parent)
@@ -1264,261 +1546,274 @@ nm_platform_vlan_get_info (int ifindex, int *parent, int *vlanid)
if (vlanid)
*vlanid = 0;
- if (nm_platform_link_get_type (ifindex) != NM_LINK_TYPE_VLAN)
+ if (nm_platform_link_get_type (self, ifindex) != NM_LINK_TYPE_VLAN)
return FALSE;
- return klass->vlan_get_info (platform, ifindex, parent, vlanid);
+ return klass->vlan_get_info (self, ifindex, parent, vlanid);
}
gboolean
-nm_platform_vlan_set_ingress_map (int ifindex, int from, int to)
+nm_platform_vlan_set_ingress_map (NMPlatform *self, int ifindex, int from, int to)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_assert (platform);
g_return_val_if_fail (klass->vlan_set_ingress_map, FALSE);
- debug ("link: setting vlan ingress map for %d from %d to %d", ifindex, from, to);
- return klass->vlan_set_ingress_map (platform, ifindex, from, to);
+ _LOGD ("link: setting vlan ingress map for %d from %d to %d", ifindex, from, to);
+ return klass->vlan_set_ingress_map (self, ifindex, from, to);
}
gboolean
-nm_platform_vlan_set_egress_map (int ifindex, int from, int to)
+nm_platform_vlan_set_egress_map (NMPlatform *self, int ifindex, int from, int to)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_assert (platform);
g_return_val_if_fail (klass->vlan_set_egress_map, FALSE);
- debug ("link: setting vlan egress map for %d from %d to %d", ifindex, from, to);
- return klass->vlan_set_egress_map (platform, ifindex, from, to);
+ _LOGD ("link: setting vlan egress map for %d from %d to %d", ifindex, from, to);
+ return klass->vlan_set_egress_map (self, ifindex, from, to);
}
-gboolean
-nm_platform_infiniband_partition_add (int parent, int p_key)
+NMPlatformError
+nm_platform_infiniband_partition_add (NMPlatform *self, int parent, int p_key, NMPlatformLink *out_link)
{
- const char *parent_name;
- char *name;
+ gs_free char *parent_name = NULL;
+ gs_free char *name = NULL;
+ NMPlatformError plerr;
- reset_error ();
+ _CHECK_SELF (self, klass, NM_PLATFORM_ERROR_BUG);
- g_return_val_if_fail (parent >= 0, FALSE);
- g_return_val_if_fail (p_key >= 0, FALSE);
- g_return_val_if_fail (klass->infiniband_partition_add, FALSE);
+ g_return_val_if_fail (parent >= 0, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail (p_key >= 0, NM_PLATFORM_ERROR_BUG);
+ g_return_val_if_fail (klass->infiniband_partition_add, NM_PLATFORM_ERROR_BUG);
- if (nm_platform_link_get_type (parent) != NM_LINK_TYPE_INFINIBAND) {
- platform->error = NM_PLATFORM_ERROR_WRONG_TYPE;
- return FALSE;
- }
+ parent_name = g_strdup (nm_platform_link_get_name (self, parent));
+ if ( !parent_name
+ || nm_platform_link_get_type (self, parent) != NM_LINK_TYPE_INFINIBAND)
+ return NM_PLATFORM_ERROR_WRONG_TYPE;
- parent_name = nm_platform_link_get_name (parent);
name = g_strdup_printf ("%s.%04x", parent_name, p_key);
- if (nm_platform_link_exists (name)) {
- debug ("infiniband: already exists");
- platform->error = NM_PLATFORM_ERROR_EXISTS;
- g_free (name);
- return FALSE;
- }
- g_free (name);
+ plerr = _link_add_check_existing (self, name, NM_LINK_TYPE_INFINIBAND, out_link);
+ if (plerr != NM_PLATFORM_ERROR_SUCCESS)
+ return plerr;
- return klass->infiniband_partition_add (platform, parent, p_key);
+ _LOGD ("link: adding infiniband partition %s for parent '%s' (%d), key %d",
+ name, parent_name, parent, p_key);
+ if (!klass->infiniband_partition_add (self, parent, p_key, out_link))
+ return NM_PLATFORM_ERROR_UNSPECIFIED;
+ return NM_PLATFORM_ERROR_SUCCESS;
}
gboolean
-nm_platform_veth_get_properties (int ifindex, NMPlatformVethProperties *props)
+nm_platform_infiniband_get_info (NMPlatform *self,
+ int ifindex,
+ int *parent,
+ int *p_key,
+ const char **mode)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
+
+ g_return_val_if_fail (ifindex > 0, FALSE);
+ g_return_val_if_fail (klass->infiniband_get_info, FALSE);
+
+ return klass->infiniband_get_info (self, ifindex, parent, p_key, mode);
+}
+
+gboolean
+nm_platform_veth_get_properties (NMPlatform *self, int ifindex, NMPlatformVethProperties *props)
+{
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (props != NULL, FALSE);
- return klass->veth_get_properties (platform, ifindex, props);
+ return klass->veth_get_properties (self, ifindex, props);
}
gboolean
-nm_platform_tun_get_properties (int ifindex, NMPlatformTunProperties *props)
+nm_platform_tun_get_properties (NMPlatform *self, int ifindex, NMPlatformTunProperties *props)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (props != NULL, FALSE);
- return klass->tun_get_properties (platform, ifindex, props);
+ return klass->tun_get_properties (self, ifindex, props);
}
gboolean
-nm_platform_macvlan_get_properties (int ifindex, NMPlatformMacvlanProperties *props)
+nm_platform_macvlan_get_properties (NMPlatform *self, int ifindex, NMPlatformMacvlanProperties *props)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (props != NULL, FALSE);
- return klass->macvlan_get_properties (platform, ifindex, props);
+ return klass->macvlan_get_properties (self, ifindex, props);
}
gboolean
-nm_platform_vxlan_get_properties (int ifindex, NMPlatformVxlanProperties *props)
+nm_platform_vxlan_get_properties (NMPlatform *self, int ifindex, NMPlatformVxlanProperties *props)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (props != NULL, FALSE);
- return klass->vxlan_get_properties (platform, ifindex, props);
+ return klass->vxlan_get_properties (self, ifindex, props);
}
gboolean
-nm_platform_gre_get_properties (int ifindex, NMPlatformGreProperties *props)
+nm_platform_gre_get_properties (NMPlatform *self, int ifindex, NMPlatformGreProperties *props)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (props != NULL, FALSE);
- return klass->gre_get_properties (platform, ifindex, props);
+ return klass->gre_get_properties (self, ifindex, props);
}
gboolean
-nm_platform_wifi_get_capabilities (int ifindex, NMDeviceWifiCapabilities *caps)
+nm_platform_wifi_get_capabilities (NMPlatform *self, int ifindex, NMDeviceWifiCapabilities *caps)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
- return klass->wifi_get_capabilities (platform, ifindex, caps);
+ return klass->wifi_get_capabilities (self, ifindex, caps);
}
gboolean
-nm_platform_wifi_get_bssid (int ifindex, guint8 *bssid)
+nm_platform_wifi_get_bssid (NMPlatform *self, int ifindex, guint8 *bssid)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
- return klass->wifi_get_bssid (platform, ifindex, bssid);
+ return klass->wifi_get_bssid (self, ifindex, bssid);
}
GByteArray *
-nm_platform_wifi_get_ssid (int ifindex)
+nm_platform_wifi_get_ssid (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex > 0, NULL);
- return klass->wifi_get_ssid (platform, ifindex);
+ return klass->wifi_get_ssid (self, ifindex);
}
guint32
-nm_platform_wifi_get_frequency (int ifindex)
+nm_platform_wifi_get_frequency (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex > 0, 0);
- return klass->wifi_get_frequency (platform, ifindex);
+ return klass->wifi_get_frequency (self, ifindex);
}
int
-nm_platform_wifi_get_quality (int ifindex)
+nm_platform_wifi_get_quality (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex > 0, 0);
- return klass->wifi_get_quality (platform, ifindex);
+ return klass->wifi_get_quality (self, ifindex);
}
guint32
-nm_platform_wifi_get_rate (int ifindex)
+nm_platform_wifi_get_rate (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex > 0, 0);
- return klass->wifi_get_rate (platform, ifindex);
+ return klass->wifi_get_rate (self, ifindex);
}
NM80211Mode
-nm_platform_wifi_get_mode (int ifindex)
+nm_platform_wifi_get_mode (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NM_802_11_MODE_UNKNOWN);
g_return_val_if_fail (ifindex > 0, NM_802_11_MODE_UNKNOWN);
- return klass->wifi_get_mode (platform, ifindex);
+ return klass->wifi_get_mode (self, ifindex);
}
void
-nm_platform_wifi_set_mode (int ifindex, NM80211Mode mode)
+nm_platform_wifi_set_mode (NMPlatform *self, int ifindex, NM80211Mode mode)
{
- reset_error ();
+ _CHECK_SELF_VOID (self, klass);
g_return_if_fail (ifindex > 0);
- klass->wifi_set_mode (platform, ifindex, mode);
+ klass->wifi_set_mode (self, ifindex, mode);
}
guint32
-nm_platform_wifi_find_frequency (int ifindex, const guint32 *freqs)
+nm_platform_wifi_find_frequency (NMPlatform *self, int ifindex, const guint32 *freqs)
{
- reset_error ();
+ _CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex > 0, 0);
g_return_val_if_fail (freqs != NULL, 0);
- return klass->wifi_find_frequency (platform, ifindex, freqs);
+ return klass->wifi_find_frequency (self, ifindex, freqs);
}
void
-nm_platform_wifi_indicate_addressing_running (int ifindex, gboolean running)
+nm_platform_wifi_indicate_addressing_running (NMPlatform *self, int ifindex, gboolean running)
{
- reset_error ();
+ _CHECK_SELF_VOID (self, klass);
g_return_if_fail (ifindex > 0);
- klass->wifi_indicate_addressing_running (platform, ifindex, running);
+ klass->wifi_indicate_addressing_running (self, ifindex, running);
}
guint32
-nm_platform_mesh_get_channel (int ifindex)
+nm_platform_mesh_get_channel (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, 0);
g_return_val_if_fail (ifindex > 0, 0);
- return klass->mesh_get_channel (platform, ifindex);
+ return klass->mesh_get_channel (self, ifindex);
}
gboolean
-nm_platform_mesh_set_channel (int ifindex, guint32 channel)
+nm_platform_mesh_set_channel (NMPlatform *self, int ifindex, guint32 channel)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
- return klass->mesh_set_channel (platform, ifindex, channel);
+ return klass->mesh_set_channel (self, ifindex, channel);
}
gboolean
-nm_platform_mesh_set_ssid (int ifindex, const guint8 *ssid, gsize len)
+nm_platform_mesh_set_ssid (NMPlatform *self, int ifindex, const guint8 *ssid, gsize len)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (ssid != NULL, FALSE);
- return klass->mesh_set_ssid (platform, ifindex, ssid, len);
+ return klass->mesh_set_ssid (self, ifindex, ssid, len);
}
#define TO_STRING_DEV_BUF_SIZE (5+15+1)
static const char *
-_to_string_dev (int ifindex, char *buf, size_t size)
+_to_string_dev (NMPlatform *self, int ifindex, char *buf, size_t size)
{
g_assert (buf && size >= TO_STRING_DEV_BUF_SIZE);
if (ifindex) {
- const char *name = ifindex > 0 ? nm_platform_link_get_name (ifindex) : NULL;
+ const char *name = ifindex > 0 && self ? nm_platform_link_get_name (self, ifindex) : NULL;
char *buf2;
strcpy (buf, " dev ");
@@ -1538,29 +1833,30 @@ _to_string_dev (int ifindex, char *buf, size_t size)
/******************************************************************/
GArray *
-nm_platform_ip4_address_get_all (int ifindex)
+nm_platform_ip4_address_get_all (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex > 0, NULL);
g_return_val_if_fail (klass->ip4_address_get_all, NULL);
- return klass->ip4_address_get_all (platform, ifindex);
+ return klass->ip4_address_get_all (self, ifindex);
}
GArray *
-nm_platform_ip6_address_get_all (int ifindex)
+nm_platform_ip6_address_get_all (NMPlatform *self, int ifindex)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex > 0, NULL);
g_return_val_if_fail (klass->ip6_address_get_all, NULL);
- return klass->ip6_address_get_all (platform, ifindex);
+ return klass->ip6_address_get_all (self, ifindex);
}
gboolean
-nm_platform_ip4_address_add (int ifindex,
+nm_platform_ip4_address_add (NMPlatform *self,
+ int ifindex,
in_addr_t address,
in_addr_t peer_address,
int plen,
@@ -1568,7 +1864,7 @@ nm_platform_ip4_address_add (int ifindex,
guint32 preferred,
const char *label)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
@@ -1590,13 +1886,14 @@ nm_platform_ip4_address_add (int ifindex,
if (label)
g_strlcpy (addr.label, label, sizeof (addr.label));
- debug ("address: adding or updating IPv4 address: %s", nm_platform_ip4_address_to_string (&addr));
+ _LOGD ("address: adding or updating IPv4 address: %s", nm_platform_ip4_address_to_string (&addr));
}
- return klass->ip4_address_add (platform, ifindex, address, peer_address, plen, lifetime, preferred, label);
+ return klass->ip4_address_add (self, ifindex, address, peer_address, plen, lifetime, preferred, label);
}
gboolean
-nm_platform_ip6_address_add (int ifindex,
+nm_platform_ip6_address_add (NMPlatform *self,
+ int ifindex,
struct in6_addr address,
struct in6_addr peer_address,
int plen,
@@ -1604,7 +1901,7 @@ nm_platform_ip6_address_add (int ifindex,
guint32 preferred,
guint flags)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
@@ -1624,74 +1921,72 @@ nm_platform_ip6_address_add (int ifindex,
addr.preferred = preferred;
addr.flags = flags;
- debug ("address: adding or updating IPv6 address: %s", nm_platform_ip6_address_to_string (&addr));
+ _LOGD ("address: adding or updating IPv6 address: %s", nm_platform_ip6_address_to_string (&addr));
}
- return klass->ip6_address_add (platform, ifindex, address, peer_address, plen, lifetime, preferred, flags);
+ return klass->ip6_address_add (self, ifindex, address, peer_address, plen, lifetime, preferred, flags);
}
gboolean
-nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen, in_addr_t peer_address)
+nm_platform_ip4_address_delete (NMPlatform *self, int ifindex, in_addr_t address, int plen, in_addr_t peer_address)
{
char str_dev[TO_STRING_DEV_BUF_SIZE];
char str_peer[NM_UTILS_INET_ADDRSTRLEN];
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
g_return_val_if_fail (klass->ip4_address_delete, FALSE);
- debug ("address: deleting IPv4 address %s/%d, %s%s%sifindex %d%s",
+ _LOGD ("address: deleting IPv4 address %s/%d, %s%s%sifindex %d%s",
nm_utils_inet4_ntop (address, NULL), plen,
peer_address ? "peer " : "",
peer_address ? nm_utils_inet4_ntop (peer_address, str_peer) : "",
peer_address ? ", " : "",
ifindex,
- _to_string_dev (ifindex, str_dev, sizeof (str_dev)));
- return klass->ip4_address_delete (platform, ifindex, address, plen, peer_address);
+ _to_string_dev (self, ifindex, str_dev, sizeof (str_dev)));
+ return klass->ip4_address_delete (self, ifindex, address, plen, peer_address);
}
gboolean
-nm_platform_ip6_address_delete (int ifindex, struct in6_addr address, int plen)
+nm_platform_ip6_address_delete (NMPlatform *self, int ifindex, struct in6_addr address, int plen)
{
char str_dev[TO_STRING_DEV_BUF_SIZE];
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (ifindex > 0, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
g_return_val_if_fail (klass->ip6_address_delete, FALSE);
- debug ("address: deleting IPv6 address %s/%d, ifindex %d%s",
+ _LOGD ("address: deleting IPv6 address %s/%d, ifindex %d%s",
nm_utils_inet6_ntop (&address, NULL), plen, ifindex,
- _to_string_dev (ifindex, str_dev, sizeof (str_dev)));
- return klass->ip6_address_delete (platform, ifindex, address, plen);
+ _to_string_dev (self, ifindex, str_dev, sizeof (str_dev)));
+ return klass->ip6_address_delete (self, ifindex, address, plen);
}
-gboolean
-nm_platform_ip4_address_exists (int ifindex, in_addr_t address, int plen)
+const NMPlatformIP4Address *
+nm_platform_ip4_address_get (NMPlatform *self, int ifindex, in_addr_t address, int plen)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
- g_return_val_if_fail (klass->ip4_address_exists, FALSE);
- return klass->ip4_address_exists (platform, ifindex, address, plen);
+ return klass->ip4_address_get (self, ifindex, address, plen);
}
-gboolean
-nm_platform_ip6_address_exists (int ifindex, struct in6_addr address, int plen)
+const NMPlatformIP6Address *
+nm_platform_ip6_address_get (NMPlatform *self, int ifindex, struct in6_addr address, int plen)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
g_return_val_if_fail (plen > 0, FALSE);
- g_return_val_if_fail (klass->ip6_address_exists, FALSE);
- return klass->ip6_address_exists (platform, ifindex, address, plen);
+ return klass->ip6_address_get (self, ifindex, address, plen);
}
static gboolean
-array_contains_ip4_address (const GArray *addresses, const NMPlatformIP4Address *address)
+array_contains_ip4_address (const GArray *addresses, const NMPlatformIP4Address *address, gint64 now, guint32 padding)
{
guint len = addresses ? addresses->len : 0;
guint i;
@@ -1699,15 +1994,20 @@ array_contains_ip4_address (const GArray *addresses, const NMPlatformIP4Address
for (i = 0; i < len; i++) {
NMPlatformIP4Address *candidate = &g_array_index (addresses, NMPlatformIP4Address, i);
- if (candidate->address == address->address && candidate->plen == address->plen)
- return TRUE;
+ if (candidate->address == address->address && candidate->plen == address->plen) {
+ guint32 lifetime, preferred;
+
+ if (nmp_utils_lifetime_get (candidate->timestamp, candidate->lifetime, candidate->preferred,
+ now, padding, &lifetime, &preferred))
+ return TRUE;
+ }
}
return FALSE;
}
static gboolean
-array_contains_ip6_address (const GArray *addresses, const NMPlatformIP6Address *address)
+array_contains_ip6_address (const GArray *addresses, const NMPlatformIP6Address *address, gint64 now, guint32 padding)
{
guint len = addresses ? addresses->len : 0;
guint i;
@@ -1715,108 +2015,27 @@ array_contains_ip6_address (const GArray *addresses, const NMPlatformIP6Address
for (i = 0; i < len; i++) {
NMPlatformIP6Address *candidate = &g_array_index (addresses, NMPlatformIP6Address, i);
- if (IN6_ARE_ADDR_EQUAL (&candidate->address, &address->address) && candidate->plen == address->plen)
- return TRUE;
- }
-
- return FALSE;
-}
-
-/**
- * Takes a pair @timestamp and @duration, and returns the remaining duration based
- * on the new timestamp @now.
- */
-static guint32
-_rebase_relative_time_on_now (guint32 timestamp, guint32 duration, guint32 now, guint32 padding)
-{
- gint64 t;
-
- if (duration == NM_PLATFORM_LIFETIME_PERMANENT)
- return NM_PLATFORM_LIFETIME_PERMANENT;
-
- if (timestamp == 0) {
- /* if the @timestamp is zero, assume it was just left unset and that the relative
- * @duration starts counting from @now. This is convenient to construct an address
- * and print it in nm_platform_ip4_address_to_string().
- *
- * In general it does not make sense to set the @duration without anchoring at
- * @timestamp because you don't know the absolute expiration time when looking
- * at the address at a later moment. */
- timestamp = now;
- }
+ if (IN6_ARE_ADDR_EQUAL (&candidate->address, &address->address) && candidate->plen == address->plen) {
+ guint32 lifetime, preferred;
- /* For timestamp > now, just accept it and calculate the expected(?) result. */
- t = (gint64) timestamp + (gint64) duration - (gint64) now;
-
- /* Optional padding to avoid potential races. */
- t += (gint64) padding;
-
- if (t <= 0)
- return 0;
- if (t >= NM_PLATFORM_LIFETIME_PERMANENT)
- return NM_PLATFORM_LIFETIME_PERMANENT - 1;
- return t;
-}
-
-static gboolean
-_address_get_lifetime (const NMPlatformIPAddress *address, guint32 now, guint32 padding, guint32 *out_lifetime, guint32 *out_preferred)
-{
- guint32 lifetime, preferred;
-
- if (address->lifetime == 0) {
- *out_lifetime = NM_PLATFORM_LIFETIME_PERMANENT;
- *out_preferred = NM_PLATFORM_LIFETIME_PERMANENT;
-
- /* We treat lifetime==0 as permanent addresses to allow easy creation of such addresses
- * (without requiring to set the lifetime fields to NM_PLATFORM_LIFETIME_PERMANENT).
- * In that case we also expect that the other fields (timestamp and preferred) are left unset. */
- g_return_val_if_fail (address->timestamp == 0 && address->preferred == 0, TRUE);
- } else {
- lifetime = _rebase_relative_time_on_now (address->timestamp, address->lifetime, now, padding);
- if (!lifetime)
- return FALSE;
- preferred = _rebase_relative_time_on_now (address->timestamp, address->preferred, now, padding);
-
- *out_lifetime = lifetime;
- *out_preferred = MIN (preferred, lifetime);
-
- /* Assert that non-permanent addresses have a (positive) @timestamp. _rebase_relative_time_on_now()
- * treats addresses with timestamp 0 as *now*. Addresses passed to _address_get_lifetime() always
- * should have a valid @timestamp, otherwise on every re-sync, their lifetime will be extended anew.
- */
- g_return_val_if_fail ( address->timestamp != 0
- || ( address->lifetime == NM_PLATFORM_LIFETIME_PERMANENT
- && address->preferred == NM_PLATFORM_LIFETIME_PERMANENT), TRUE);
- g_return_val_if_fail (preferred <= lifetime, TRUE);
- }
- return TRUE;
-}
-
-gboolean
-nm_platform_ip4_check_reinstall_device_route (int ifindex, const NMPlatformIP4Address *address, guint32 device_route_metric)
-{
- g_return_val_if_fail (address, FALSE);
-
- if ( ifindex <= 0
- || address->plen <= 0
- || address->plen >= 32)
- return FALSE;
-
- if (device_route_metric == NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE) {
- /* The automatically added route would be already our desired priority.
- * Nothing to do. */
- return FALSE;
+ if (nmp_utils_lifetime_get (candidate->timestamp, candidate->lifetime, candidate->preferred,
+ now, padding, &lifetime, &preferred))
+ return TRUE;
+ }
}
- return klass->ip4_check_reinstall_device_route (platform, ifindex, address, device_route_metric);
+ return FALSE;
}
/**
* nm_platform_ip4_address_sync:
+ * @self: platform instance
* @ifindex: Interface index
* @known_addresses: List of addresses
- * @device_route_metric: the route metric for adding subnet routes (replaces
- * the kernel added routes).
+ * @out_added_addresses: (out): (allow-none): if not %NULL, return a #GPtrArray
+ * with the addresses added. The pointers point into @known_addresses.
+ * It possibly does not contain all addresses from @known_address because
+ * some addresses might be expired.
*
* A convenience function to synchronize addresses for a specific interface
* with the least possible disturbance. It simply removes addresses that are
@@ -1825,23 +2044,28 @@ nm_platform_ip4_check_reinstall_device_route (int ifindex, const NMPlatformIP4Ad
* Returns: %TRUE on success.
*/
gboolean
-nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses, guint32 device_route_metric)
+nm_platform_ip4_address_sync (NMPlatform *self, int ifindex, const GArray *known_addresses, GPtrArray **out_added_addresses)
{
GArray *addresses;
NMPlatformIP4Address *address;
guint32 now = nm_utils_get_monotonic_timestamp_s ();
int i;
+ _CHECK_SELF (self, klass, FALSE);
+
/* Delete unknown addresses */
- addresses = nm_platform_ip4_address_get_all (ifindex);
+ addresses = nm_platform_ip4_address_get_all (self, ifindex);
for (i = 0; i < addresses->len; i++) {
address = &g_array_index (addresses, NMPlatformIP4Address, i);
- if (!array_contains_ip4_address (known_addresses, address))
- nm_platform_ip4_address_delete (ifindex, address->address, address->plen, address->peer_address);
+ if (!array_contains_ip4_address (known_addresses, address, now, ADDRESS_LIFETIME_PADDING))
+ nm_platform_ip4_address_delete (self, ifindex, address->address, address->plen, address->peer_address);
}
g_array_free (addresses, TRUE);
+ if (out_added_addresses)
+ *out_added_addresses = NULL;
+
if (!known_addresses)
return TRUE;
@@ -1849,33 +2073,18 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses, guint3
for (i = 0; i < known_addresses->len; i++) {
const NMPlatformIP4Address *known_address = &g_array_index (known_addresses, NMPlatformIP4Address, i);
guint32 lifetime, preferred;
- guint32 network;
- gboolean reinstall_device_route = FALSE;
- /* add a padding of 5 seconds to avoid potential races. */
- if (!_address_get_lifetime ((NMPlatformIPAddress *) known_address, now, 5, &lifetime, &preferred))
+ if (!nmp_utils_lifetime_get (known_address->timestamp, known_address->lifetime, known_address->preferred,
+ now, ADDRESS_LIFETIME_PADDING, &lifetime, &preferred))
continue;
- if (nm_platform_ip4_check_reinstall_device_route (ifindex, known_address, device_route_metric))
- reinstall_device_route = TRUE;
-
- if (!nm_platform_ip4_address_add (ifindex, known_address->address, known_address->peer_address, known_address->plen, lifetime, preferred, known_address->label))
+ if (!nm_platform_ip4_address_add (self, ifindex, known_address->address, known_address->peer_address, known_address->plen, lifetime, preferred, known_address->label))
return FALSE;
- if (reinstall_device_route) {
- /* Kernel automatically adds a device route for us with metric 0. That is not what we want.
- * Remove it, and re-add it.
- *
- * In face of having the same subnets on two different interfaces with the same metric,
- * this is a problem. Surprisingly, kernel is able to add two routes for the same subnet/prefix,metric
- * to different interfaces. We cannot. Adding one, would replace the other. This is avoided
- * by the above nm_platform_ip4_check_reinstall_device_route() check.
- */
- network = nm_utils_ip4_address_clear_host_address (known_address->address, known_address->plen);
- (void) nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_KERNEL, network, known_address->plen,
- 0, known_address->address, device_route_metric, 0);
- (void) nm_platform_ip4_route_delete (ifindex, network, known_address->plen,
- NM_PLATFORM_ROUTE_METRIC_IP4_DEVICE_ROUTE);
+ if (out_added_addresses) {
+ if (!*out_added_addresses)
+ *out_added_addresses = g_ptr_array_new ();
+ g_ptr_array_add (*out_added_addresses, (gpointer) known_address);
}
}
@@ -1884,6 +2093,7 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses, guint3
/**
* nm_platform_ip6_address_sync:
+ * @self: platform instance
* @ifindex: Interface index
* @known_addresses: List of addresses
* @keep_link_local: Don't remove link-local address
@@ -1895,7 +2105,7 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses, guint3
* Returns: %TRUE on success.
*/
gboolean
-nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses, gboolean keep_link_local)
+nm_platform_ip6_address_sync (NMPlatform *self, int ifindex, const GArray *known_addresses, gboolean keep_link_local)
{
GArray *addresses;
NMPlatformIP6Address *address;
@@ -1903,7 +2113,7 @@ nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses, gboole
int i;
/* Delete unknown addresses */
- addresses = nm_platform_ip6_address_get_all (ifindex);
+ addresses = nm_platform_ip6_address_get_all (self, ifindex);
for (i = 0; i < addresses->len; i++) {
address = &g_array_index (addresses, NMPlatformIP6Address, i);
@@ -1911,8 +2121,8 @@ nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses, gboole
if (keep_link_local && IN6_IS_ADDR_LINKLOCAL (&address->address))
continue;
- if (!array_contains_ip6_address (known_addresses, address))
- nm_platform_ip6_address_delete (ifindex, address->address, address->plen);
+ if (!array_contains_ip6_address (known_addresses, address, now, ADDRESS_LIFETIME_PADDING))
+ nm_platform_ip6_address_delete (self, ifindex, address->address, address->plen);
}
g_array_free (addresses, TRUE);
@@ -1924,11 +2134,11 @@ nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses, gboole
const NMPlatformIP6Address *known_address = &g_array_index (known_addresses, NMPlatformIP6Address, i);
guint32 lifetime, preferred;
- /* add a padding of 5 seconds to avoid potential races. */
- if (!_address_get_lifetime ((NMPlatformIPAddress *) known_address, now, 5, &lifetime, &preferred))
+ if (!nmp_utils_lifetime_get (known_address->timestamp, known_address->lifetime, known_address->preferred,
+ now, ADDRESS_LIFETIME_PADDING, &lifetime, &preferred))
continue;
- if (!nm_platform_ip6_address_add (ifindex, known_address->address,
+ if (!nm_platform_ip6_address_add (self, ifindex, known_address->address,
known_address->peer_address, known_address->plen,
lifetime, preferred, known_address->flags))
return FALSE;
@@ -1938,51 +2148,50 @@ nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses, gboole
}
gboolean
-nm_platform_address_flush (int ifindex)
+nm_platform_address_flush (NMPlatform *self, int ifindex)
{
- return nm_platform_ip4_address_sync (ifindex, NULL, 0)
- && nm_platform_ip6_address_sync (ifindex, NULL, FALSE);
+ _CHECK_SELF (self, klass, FALSE);
+
+ return nm_platform_ip4_address_sync (self, ifindex, NULL, NULL)
+ && nm_platform_ip6_address_sync (self, ifindex, NULL, FALSE);
}
/******************************************************************/
GArray *
-nm_platform_ip4_route_get_all (int ifindex, NMPlatformGetRouteMode mode)
+nm_platform_ip4_route_get_all (NMPlatform *self, int ifindex, NMPlatformGetRouteFlags flags)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex >= 0, NULL);
- g_return_val_if_fail (klass->ip4_route_get_all, NULL);
- return klass->ip4_route_get_all (platform, ifindex, mode);
+ return klass->ip4_route_get_all (self, ifindex, flags);
}
GArray *
-nm_platform_ip6_route_get_all (int ifindex, NMPlatformGetRouteMode mode)
+nm_platform_ip6_route_get_all (NMPlatform *self, int ifindex, NMPlatformGetRouteFlags flags)
{
- reset_error ();
+ _CHECK_SELF (self, klass, NULL);
g_return_val_if_fail (ifindex >= 0, NULL);
- g_return_val_if_fail (klass->ip6_route_get_all, NULL);
- return klass->ip6_route_get_all (platform, ifindex, mode);
+ return klass->ip6_route_get_all (self, ifindex, flags);
}
gboolean
-nm_platform_ip4_route_add (int ifindex, NMIPConfigSource source,
+nm_platform_ip4_route_add (NMPlatform *self,
+ int ifindex, NMIPConfigSource source,
in_addr_t network, int plen,
in_addr_t gateway, guint32 pref_src,
guint32 metric, guint32 mss)
{
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_return_val_if_fail (platform, FALSE);
g_return_val_if_fail (0 <= plen && plen <= 32, FALSE);
g_return_val_if_fail (klass->ip4_route_add, FALSE);
if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
NMPlatformIP4Route route = { 0 };
- char pref_src_buf[NM_UTILS_INET_ADDRSTRLEN];
route.ifindex = ifindex;
route.source = source;
@@ -1991,21 +2200,21 @@ nm_platform_ip4_route_add (int ifindex, NMIPConfigSource source,
route.gateway = gateway;
route.metric = metric;
route.mss = mss;
+ route.pref_src = pref_src;
- debug ("route: adding or updating IPv4 route: %s%s%s%s", nm_platform_ip4_route_to_string (&route),
- pref_src ? " (src: " : "",
- pref_src ? nm_utils_inet4_ntop (pref_src, pref_src_buf) : "",
- pref_src ? ")" : "");
+ _LOGD ("route: adding or updating IPv4 route: %s", nm_platform_ip4_route_to_string (&route));
}
- return klass->ip4_route_add (platform, ifindex, source, network, plen, gateway, pref_src, metric, mss);
+ return klass->ip4_route_add (self, ifindex, source, network, plen, gateway, pref_src, metric, mss);
}
gboolean
-nm_platform_ip6_route_add (int ifindex, NMIPConfigSource source,
+nm_platform_ip6_route_add (NMPlatform *self,
+ int ifindex, NMIPConfigSource source,
struct in6_addr network, int plen, struct in6_addr gateway,
guint32 metric, guint32 mss)
{
- g_return_val_if_fail (platform, FALSE);
+ _CHECK_SELF (self, klass, FALSE);
+
g_return_val_if_fail (0 <= plen && plen <= 128, FALSE);
g_return_val_if_fail (klass->ip6_route_add, FALSE);
@@ -2020,256 +2229,55 @@ nm_platform_ip6_route_add (int ifindex, NMIPConfigSource source,
route.metric = metric;
route.mss = mss;
- debug ("route: adding or updating IPv6 route: %s", nm_platform_ip6_route_to_string (&route));
+ _LOGD ("route: adding or updating IPv6 route: %s", nm_platform_ip6_route_to_string (&route));
}
- return klass->ip6_route_add (platform, ifindex, source, network, plen, gateway, metric, mss);
+ return klass->ip6_route_add (self, ifindex, source, network, plen, gateway, metric, mss);
}
gboolean
-nm_platform_ip4_route_delete (int ifindex, in_addr_t network, int plen, guint32 metric)
+nm_platform_ip4_route_delete (NMPlatform *self, int ifindex, in_addr_t network, int plen, guint32 metric)
{
char str_dev[TO_STRING_DEV_BUF_SIZE];
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_return_val_if_fail (platform, FALSE);
g_return_val_if_fail (klass->ip4_route_delete, FALSE);
- debug ("route: deleting IPv4 route %s/%d, metric=%"G_GUINT32_FORMAT", ifindex %d%s",
+ _LOGD ("route: deleting IPv4 route %s/%d, metric=%"G_GUINT32_FORMAT", ifindex %d%s",
nm_utils_inet4_ntop (network, NULL), plen, metric, ifindex,
- _to_string_dev (ifindex, str_dev, sizeof (str_dev)));
- return klass->ip4_route_delete (platform, ifindex, network, plen, metric);
+ _to_string_dev (self, ifindex, str_dev, sizeof (str_dev)));
+ return klass->ip4_route_delete (self, ifindex, network, plen, metric);
}
gboolean
-nm_platform_ip6_route_delete (int ifindex, struct in6_addr network, int plen, guint32 metric)
+nm_platform_ip6_route_delete (NMPlatform *self, int ifindex, struct in6_addr network, int plen, guint32 metric)
{
char str_dev[TO_STRING_DEV_BUF_SIZE];
- reset_error ();
+ _CHECK_SELF (self, klass, FALSE);
- g_return_val_if_fail (platform, FALSE);
g_return_val_if_fail (klass->ip6_route_delete, FALSE);
- debug ("route: deleting IPv6 route %s/%d, metric=%"G_GUINT32_FORMAT", ifindex %d%s",
+ _LOGD ("route: deleting IPv6 route %s/%d, metric=%"G_GUINT32_FORMAT", ifindex %d%s",
nm_utils_inet6_ntop (&network, NULL), plen, metric, ifindex,
- _to_string_dev (ifindex, str_dev, sizeof (str_dev)));
- return klass->ip6_route_delete (platform, ifindex, network, plen, metric);
-}
-
-gboolean
-nm_platform_ip4_route_exists (int ifindex, in_addr_t network, int plen, guint32 metric)
-{
- reset_error ();
-
- g_return_val_if_fail (platform, FALSE);
- g_return_val_if_fail (klass->ip4_route_exists, FALSE);
-
- return klass->ip4_route_exists (platform,ifindex, network, plen, metric);
-}
-
-gboolean
-nm_platform_ip6_route_exists (int ifindex, struct in6_addr network, int plen, guint32 metric)
-{
- reset_error ();
-
- g_return_val_if_fail (platform, FALSE);
- g_return_val_if_fail (klass->ip6_route_exists, FALSE);
-
- return klass->ip6_route_exists (platform, ifindex, network, plen, metric);
-}
-
-static gboolean
-array_contains_ip4_route (const GArray *routes, const NMPlatformIP4Route *route)
-{
- guint len = routes ? routes->len : 0;
- guint i;
-
- for (i = 0; i < len; i++) {
- NMPlatformIP4Route *c = &g_array_index (routes, NMPlatformIP4Route, i);
-
- if (route->network == c->network &&
- route->plen == c->plen &&
- route->gateway == c->gateway &&
- route->metric == c->metric)
- return TRUE;
- }
-
- return FALSE;
+ _to_string_dev (self, ifindex, str_dev, sizeof (str_dev)));
+ return klass->ip6_route_delete (self, ifindex, network, plen, metric);
}
-static gboolean
-array_contains_ip6_route (const GArray *routes, const NMPlatformIP6Route *route)
+const NMPlatformIP4Route *
+nm_platform_ip4_route_get (NMPlatform *self, int ifindex, in_addr_t network, int plen, guint32 metric)
{
- guint len = routes ? routes->len : 0;
- guint i;
+ _CHECK_SELF (self, klass, FALSE);
- for (i = 0; i < len; i++) {
- NMPlatformIP6Route *c = &g_array_index (routes, NMPlatformIP6Route, i);
-
- if (IN6_ARE_ADDR_EQUAL (&route->network, &c->network) &&
- route->plen == c->plen &&
- IN6_ARE_ADDR_EQUAL (&route->gateway, &c->gateway) &&
- route->metric == c->metric)
- return TRUE;
- }
-
- return FALSE;
+ return klass->ip4_route_get (self ,ifindex, network, plen, metric);
}
-/**
- * nm_platform_ip4_route_sync:
- * @ifindex: Interface index
- * @known_routes: List of routes
- *
- * A convenience function to synchronize routes for a specific interface
- * with the least possible disturbance. It simply removes routes that are
- * not listed and adds routes that are.
- * Default routes are ignored (both in @known_routes and those already
- * configured on the device).
- *
- * Returns: %TRUE on success.
- */
-gboolean
-nm_platform_ip4_route_sync (int ifindex, const GArray *known_routes)
+const NMPlatformIP6Route *
+nm_platform_ip6_route_get (NMPlatform *self, int ifindex, struct in6_addr network, int plen, guint32 metric)
{
- GArray *routes;
- NMPlatformIP4Route *route;
- const NMPlatformIP4Route *known_route;
- gboolean success;
- int i, i_type;
-
- /* Delete unknown routes */
- routes = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT);
- for (i = 0; i < routes->len; i++) {
- route = &g_array_index (routes, NMPlatformIP4Route, i);
-
- if (!array_contains_ip4_route (known_routes, route))
- (void) nm_platform_ip4_route_delete (ifindex, route->network, route->plen, route->metric);
- }
-
- if (!known_routes) {
- g_array_free (routes, TRUE);
- return TRUE;
- }
-
- /* Add missing routes */
- for (i_type = 0, success = TRUE; i_type < 2 && success; i_type++) {
- for (i = 0; i < known_routes->len && success; i++) {
- known_route = &g_array_index (known_routes, NMPlatformIP4Route, i);
-
- if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (known_route))
- continue;
+ _CHECK_SELF (self, klass, FALSE);
- if ( (i_type == 0 && known_route->gateway != 0)
- || (i_type == 1 && known_route->gateway == 0)) {
- /* Make two runs over the list of routes. On the first, only add
- * device routes, on the second the others (gateway routes). */
- continue;
- }
-
- /* Ignore routes that already exist */
- if (!array_contains_ip4_route (routes, known_route)) {
- success = nm_platform_ip4_route_add (ifindex,
- known_route->source,
- known_route->network,
- known_route->plen,
- known_route->gateway,
- 0,
- known_route->metric,
- known_route->mss);
- if (!success && known_route->source < NM_IP_CONFIG_SOURCE_USER) {
- nm_log_dbg (LOGD_PLATFORM, "ignore error adding IPv4 route to kernel: %s",
- nm_platform_ip4_route_to_string (known_route));
- success = TRUE;
- }
- }
- }
- }
-
- g_array_free (routes, TRUE);
- return success;
-}
-
-/**
- * nm_platform_ip6_route_sync:
- * @ifindex: Interface index
- * @known_routes: List of routes
- *
- * A convenience function to synchronize routes for a specific interface
- * with the least possible disturbance. It simply removes routes that are
- * not listed and adds routes that are.
- * Default routes are ignored (both in @known_routes and those already
- * configured on the device).
- *
- * Returns: %TRUE on success.
- */
-gboolean
-nm_platform_ip6_route_sync (int ifindex, const GArray *known_routes)
-{
- GArray *routes;
- NMPlatformIP6Route *route;
- const NMPlatformIP6Route *known_route;
- gboolean success;
- int i, i_type;
-
- /* Delete unknown routes */
- routes = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT);
- for (i = 0; i < routes->len; i++) {
- route = &g_array_index (routes, NMPlatformIP6Route, i);
- route->ifindex = 0;
-
- if (!array_contains_ip6_route (known_routes, route))
- nm_platform_ip6_route_delete (ifindex, route->network, route->plen, route->metric);
- }
-
- if (!known_routes) {
- g_array_free (routes, TRUE);
- return TRUE;
- }
-
- /* Add missing routes */
- for (i_type = 0, success = TRUE; i_type < 2 && success; i_type++) {
- for (i = 0; i < known_routes->len && success; i++) {
- known_route = &g_array_index (known_routes, NMPlatformIP6Route, i);
-
- if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (known_route))
- continue;
-
- if ( (i_type == 0 && !IN6_IS_ADDR_UNSPECIFIED (&known_route->gateway))
- || (i_type == 1 && IN6_IS_ADDR_UNSPECIFIED (&known_route->gateway))) {
- /* Make two runs over the list of routes. On the first, only add
- * device routes, on the second the others (gateway routes). */
- continue;
- }
-
- /* Ignore routes that already exist */
- if (!array_contains_ip6_route (routes, known_route)) {
- success = nm_platform_ip6_route_add (ifindex,
- known_route->source,
- known_route->network,
- known_route->plen,
- known_route->gateway,
- known_route->metric,
- known_route->mss);
- if (!success && known_route->source < NM_IP_CONFIG_SOURCE_USER) {
- nm_log_dbg (LOGD_PLATFORM, "ignore error adding IPv6 route to kernel: %s",
- nm_platform_ip6_route_to_string (known_route));
- success = TRUE;
- }
- }
- }
- }
-
- g_array_free (routes, TRUE);
- return success;
-}
-
-gboolean
-nm_platform_route_flush (int ifindex)
-{
- return nm_platform_ip4_route_sync (ifindex, NULL)
- && nm_platform_ip6_route_sync (ifindex, NULL);
+ return klass->ip6_route_get (self, ifindex, network, plen, metric);
}
/******************************************************************/
@@ -2278,6 +2286,10 @@ static const char *
source_to_string (NMIPConfigSource source)
{
switch (source) {
+ case NM_IP_CONFIG_SOURCE_RTPROT_KERNEL:
+ return "rtprot-kernel";
+ case _NM_IP_CONFIG_SOURCE_RTM_F_CLONED:
+ return "rtm-f-cloned";
case NM_IP_CONFIG_SOURCE_KERNEL:
return "kernel";
case NM_IP_CONFIG_SOURCE_SHARED:
@@ -2309,7 +2321,7 @@ _lifetime_to_string (guint32 timestamp, guint32 lifetime, gint32 now, char *buf,
return "forever";
g_snprintf (buf, buf_size, "%usec",
- _rebase_relative_time_on_now (timestamp, lifetime, now, 0));
+ nmp_utils_lifetime_rebase_relative_time_on_now (timestamp, lifetime, now, 0));
return buf;
}
@@ -2322,28 +2334,38 @@ _lifetime_summary_to_string (gint32 now, guint32 timestamp, guint32 preferred, g
return buf;
}
-static char to_string_buffer[256];
+char _nm_platform_to_string_buffer[256];
const char *
nm_platform_link_to_string (const NMPlatformLink *link)
{
char master[20];
char parent[20];
- char *driver, *udi, *type;
- GString *str;
+ char str_vlan[16];
+ GString *str_flags;
+ char str_addrmode[30];
+ gs_free char *str_addr = NULL;
+ gs_free char *str_inet6_token = NULL;
if (!link)
return "(unknown link)";
- str = g_string_new (NULL);
- if (!link->arp)
- g_string_append (str, "NOARP,");
- if (link->up)
- g_string_append (str, "UP");
+ str_flags = g_string_new (NULL);
+ if (NM_FLAGS_HAS (link->flags, IFF_NOARP))
+ g_string_append (str_flags, "NOARP,");
+ if (NM_FLAGS_HAS (link->flags, IFF_UP))
+ g_string_append (str_flags, "UP");
else
- g_string_append (str, "DOWN");
+ g_string_append (str_flags, "DOWN");
if (link->connected)
- g_string_append (str, ",LOWER_UP");
+ g_string_append (str_flags, ",LOWER_UP");
+
+ if (link->flags) {
+ char str_flags_buf[64];
+
+ rtnl_link_flags2str (link->flags, str_flags_buf, sizeof (str_flags_buf));
+ g_string_append_printf (str_flags, ";%s", str_flags_buf);
+ }
if (link->master)
g_snprintf (master, sizeof (master), " master %d", link->master);
@@ -2355,19 +2377,69 @@ nm_platform_link_to_string (const NMPlatformLink *link)
else
parent[0] = 0;
- driver = link->driver ? g_strdup_printf (" driver '%s'", link->driver) : NULL;
- udi = link->udi ? g_strdup_printf (" udi '%s'", link->udi) : NULL;
- type = link->type_name ? NULL : g_strdup_printf ("(%d)", link->type);
-
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%d: %s%s <%s> mtu %d%s %s%s%s",
- link->ifindex, link->name, parent, str->str,
- link->mtu, master, link->type_name ? link->type_name : type,
- driver ? driver : "", udi ? udi : "");
- g_string_free (str, TRUE);
- g_free (driver);
- g_free (udi);
- g_free (type);
- return to_string_buffer;
+ if (link->vlan_id)
+ g_snprintf (str_vlan, sizeof (str_vlan), " vlan %u", (guint) link->vlan_id);
+ else
+ str_vlan[0] = '\0';
+
+ if (link->inet6_addr_gen_mode_inv) {
+ switch (_nm_platform_uint8_inv (link->inet6_addr_gen_mode_inv)) {
+ case 0:
+ g_snprintf (str_addrmode, sizeof (str_addrmode), " addrgenmode eui64");
+ break;
+ case 1:
+ g_snprintf (str_addrmode, sizeof (str_addrmode), " addrgenmode none");
+ break;
+ default:
+ g_snprintf (str_addrmode, sizeof (str_addrmode), " addrgenmode %d", _nm_platform_uint8_inv (link->inet6_addr_gen_mode_inv));
+ break;
+ }
+ } else
+ str_addrmode[0] = '\0';
+
+ if (link->addr.len)
+ str_addr = nm_utils_hwaddr_ntoa (link->addr.data, MIN (link->addr.len, sizeof (link->addr.data)));
+ if (link->inet6_token.is_valid)
+ str_inet6_token = nm_utils_hwaddr_ntoa (&link->inet6_token.iid, sizeof (link->inet6_token.iid));
+
+ g_snprintf (_nm_platform_to_string_buffer, sizeof (_nm_platform_to_string_buffer),
+ "%d: " /* ifindex */
+ "%s" /* name */
+ "%s" /* parent */
+ " <%s>" /* flags */
+ " mtu %d"
+ "%s" /* master */
+ "%s" /* vlan */
+ " arp %u" /* arptype */
+ "%s%s" /* link->type */
+ "%s%s" /* kind */
+ "%s" /* is-in-udev */
+ "%s" /* addr-gen-mode */
+ "%s%s" /* addr */
+ "%s%s" /* inet6_token */
+ "%s%s" /* driver */
+ ,
+ link->ifindex,
+ link->name,
+ parent,
+ str_flags->str,
+ link->mtu, master,
+ str_vlan,
+ link->arptype,
+ nm_link_type_to_string (link->type) ? " " : "",
+ str_if_set (nm_link_type_to_string (link->type), "???"),
+ link->kind ? (g_strcmp0 (nm_link_type_to_string (link->type), link->kind) ? "/" : "*") : "",
+ link->kind && g_strcmp0 (nm_link_type_to_string (link->type), link->kind) ? link->kind : "",
+ link->initialized ? " init" : " not-init",
+ str_addrmode,
+ str_addr ? " addr " : "",
+ str_addr ? str_addr : "",
+ str_inet6_token ? " inet6token " : "",
+ str_inet6_token ? str_inet6_token : "",
+ link->driver ? " driver " : "",
+ link->driver ? link->driver : "");
+ g_string_free (str_flags, TRUE);
+ return _nm_platform_to_string_buffer;
}
/**
@@ -2403,7 +2475,7 @@ nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address)
str_peer = g_strconcat (" ptp ", s_peer, NULL);
}
- _to_string_dev (address->ifindex, str_dev, sizeof (str_dev));
+ _to_string_dev (NULL, address->ifindex, str_dev, sizeof (str_dev));
if (*address->label)
g_snprintf (str_label, sizeof (str_label), " label %s", address->label);
@@ -2420,14 +2492,14 @@ nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address)
now, str_pref, sizeof (str_pref)) );
str_time_p = _lifetime_summary_to_string (now, address->timestamp, address->preferred, address->lifetime, str_time, sizeof (str_time));
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d lft %s pref %s%s%s%s%s src %s",
+ g_snprintf (_nm_platform_to_string_buffer, sizeof (_nm_platform_to_string_buffer), "%s/%d lft %s pref %s%s%s%s%s src %s",
s_address, address->plen, str_lft_p, str_pref_p, str_time_p,
str_peer ? str_peer : "",
str_dev,
str_label,
source_to_string (address->source));
g_free (str_peer);
- return to_string_buffer;
+ return _nm_platform_to_string_buffer;
}
/**
@@ -2488,7 +2560,7 @@ nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address)
str_peer = g_strconcat (" ptp ", s_peer, NULL);
}
- _to_string_dev (address->ifindex, str_dev, sizeof (str_dev));
+ _to_string_dev (NULL, address->ifindex, str_dev, sizeof (str_dev));
nm_platform_addr_flags2str (address->flags, s_flags, sizeof (s_flags));
@@ -2504,7 +2576,7 @@ nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address)
now, str_pref, sizeof (str_pref)) );
str_time_p = _lifetime_summary_to_string (now, address->timestamp, address->preferred, address->lifetime, str_time, sizeof (str_time));
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d lft %s pref %s%s%s%s%s src %s",
+ g_snprintf (_nm_platform_to_string_buffer, sizeof (_nm_platform_to_string_buffer), "%s/%d lft %s pref %s%s%s%s%s src %s",
s_address, address->plen, str_lft_p, str_pref_p, str_time_p,
str_peer ? str_peer : "",
str_dev,
@@ -2512,7 +2584,7 @@ nm_platform_ip6_address_to_string (const NMPlatformIP6Address *address)
source_to_string (address->source));
g_free (str_flags);
g_free (str_peer);
- return to_string_buffer;
+ return _nm_platform_to_string_buffer;
}
/**
@@ -2531,21 +2603,38 @@ const char *
nm_platform_ip4_route_to_string (const NMPlatformIP4Route *route)
{
char s_network[INET_ADDRSTRLEN], s_gateway[INET_ADDRSTRLEN];
+ char s_pref_src[INET_ADDRSTRLEN];
char str_dev[TO_STRING_DEV_BUF_SIZE];
+ char str_scope[30];
g_return_val_if_fail (route, "(unknown)");
inet_ntop (AF_INET, &route->network, s_network, sizeof(s_network));
inet_ntop (AF_INET, &route->gateway, s_gateway, sizeof(s_gateway));
- _to_string_dev (route->ifindex, str_dev, sizeof (str_dev));
-
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d via %s%s metric %"G_GUINT32_FORMAT" mss %"G_GUINT32_FORMAT" src %s",
- s_network, route->plen, s_gateway,
+ _to_string_dev (NULL, route->ifindex, str_dev, sizeof (str_dev));
+
+ g_snprintf (_nm_platform_to_string_buffer, sizeof (_nm_platform_to_string_buffer),
+ "%s/%d"
+ " via %s"
+ "%s"
+ " metric %"G_GUINT32_FORMAT
+ " mss %"G_GUINT32_FORMAT
+ " src %s" /* source */
+ "%s%s" /* scope */
+ "%s%s" /* pref-src */
+ "",
+ s_network, route->plen,
+ s_gateway,
str_dev,
- route->metric, route->mss,
- source_to_string (route->source));
- return to_string_buffer;
+ route->metric,
+ route->mss,
+ source_to_string (route->source),
+ route->scope_inv ? " scope " : "",
+ route->scope_inv ? (rtnl_scope2str (nm_platform_route_scope_inv (route->scope_inv), str_scope, sizeof (str_scope))) : "",
+ route->pref_src ? " pref-src " : "",
+ route->pref_src ? inet_ntop (AF_INET, &route->pref_src, s_pref_src, sizeof(s_pref_src)) : "");
+ return _nm_platform_to_string_buffer;
}
/**
@@ -2571,14 +2660,23 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route)
inet_ntop (AF_INET6, &route->network, s_network, sizeof(s_network));
inet_ntop (AF_INET6, &route->gateway, s_gateway, sizeof(s_gateway));
- _to_string_dev (route->ifindex, str_dev, sizeof (str_dev));
-
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d via %s%s metric %"G_GUINT32_FORMAT" mss %"G_GUINT32_FORMAT" src %s",
- s_network, route->plen, s_gateway,
+ _to_string_dev (NULL, route->ifindex, str_dev, sizeof (str_dev));
+
+ g_snprintf (_nm_platform_to_string_buffer, sizeof (_nm_platform_to_string_buffer),
+ "%s/%d"
+ " via %s"
+ "%s"
+ " metric %"G_GUINT32_FORMAT
+ " mss %"G_GUINT32_FORMAT
+ " src %s" /* source */
+ "",
+ s_network, route->plen,
+ s_gateway,
str_dev,
- route->metric, route->mss,
+ route->metric,
+ route->mss,
source_to_string (route->source));
- return to_string_buffer;
+ return _nm_platform_to_string_buffer;
}
#define _CMP_POINTER(a, b) \
@@ -2597,6 +2695,12 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route)
return (((a)->field) < ((b)->field)) ? -1 : 1; \
} G_STMT_END
+#define _CMP_FIELD_BOOL(a, b, field) \
+ G_STMT_START { \
+ if ((!((a)->field)) != (!((b)->field))) \
+ return ((!((a)->field)) < (!((b)->field))) ? -1 : 1; \
+ } G_STMT_END
+
#define _CMP_FIELD_STR(a, b, field) \
G_STMT_START { \
int c = strcmp ((a)->field, (b)->field); \
@@ -2604,6 +2708,16 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route)
return c < 0 ? -1 : 1; \
} G_STMT_END
+#define _CMP_FIELD_STR_INTERNED(a, b, field) \
+ G_STMT_START { \
+ if (((a)->field) != ((b)->field)) { \
+ /* just to be sure, also do a strcmp() if the pointers don't match */ \
+ int c = g_strcmp0 ((a)->field, (b)->field); \
+ if (c != 0) \
+ return c < 0 ? -1 : 1; \
+ } \
+ } G_STMT_END
+
#define _CMP_FIELD_STR0(a, b, field) \
G_STMT_START { \
int c = g_strcmp0 ((a)->field, (b)->field); \
@@ -2611,6 +2725,14 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route)
return c < 0 ? -1 : 1; \
} G_STMT_END
+#define _CMP_FIELD_MEMCMP_LEN(a, b, field, len) \
+ G_STMT_START { \
+ int c = memcmp (&((a)->field), &((b)->field), \
+ MIN (len, sizeof ((a)->field))); \
+ if (c != 0) \
+ return c < 0 ? -1 : 1; \
+ } G_STMT_END
+
#define _CMP_FIELD_MEMCMP(a, b, field) \
G_STMT_START { \
int c = memcmp (&((a)->field), &((b)->field), \
@@ -2623,17 +2745,26 @@ int
nm_platform_link_cmp (const NMPlatformLink *a, const NMPlatformLink *b)
{
_CMP_POINTER (a, b);
+ _CMP_FIELD (a, b, ifindex);
_CMP_FIELD (a, b, type);
_CMP_FIELD_STR (a, b, name);
_CMP_FIELD (a, b, master);
_CMP_FIELD (a, b, parent);
- _CMP_FIELD (a, b, up);
+ _CMP_FIELD (a, b, vlan_id);
+ _CMP_FIELD (a, b, flags);
_CMP_FIELD (a, b, connected);
- _CMP_FIELD (a, b, arp);
_CMP_FIELD (a, b, mtu);
- _CMP_FIELD_STR0 (a, b, type_name);
- _CMP_FIELD_STR0 (a, b, udi);
- _CMP_FIELD_STR0 (a, b, driver);
+ _CMP_FIELD_BOOL (a, b, initialized);
+ _CMP_FIELD (a, b, arptype);
+ _CMP_FIELD (a, b, addr.len);
+ _CMP_FIELD (a, b, inet6_addr_gen_mode_inv);
+ _CMP_FIELD (a, b, inet6_token.is_valid);
+ _CMP_FIELD_STR_INTERNED (a, b, kind);
+ _CMP_FIELD_STR_INTERNED (a, b, driver);
+ if (a->addr.len)
+ _CMP_FIELD_MEMCMP_LEN (a, b, addr.data, a->addr.len);
+ if (a->inet6_token.is_valid)
+ _CMP_FIELD_MEMCMP (a, b, inet6_token.iid);
return 0;
}
@@ -2680,6 +2811,8 @@ nm_platform_ip4_route_cmp (const NMPlatformIP4Route *a, const NMPlatformIP4Route
_CMP_FIELD (a, b, gateway);
_CMP_FIELD (a, b, metric);
_CMP_FIELD (a, b, mss);
+ _CMP_FIELD (a, b, scope_inv);
+ _CMP_FIELD (a, b, pref_src);
return 0;
}
@@ -2753,8 +2886,8 @@ nm_platform_ip_address_cmp_expiry (const NMPlatformIPAddress *a, const NMPlatfor
#undef _CMP_POINTER
-static const char *
-_change_type_to_string (NMPlatformSignalChangeType change_type)
+const char *
+nm_platform_signal_change_type_to_string (NMPlatformSignalChangeType change_type)
{
switch (change_type) {
case NM_PLATFORM_SIGNAL_ADDED:
@@ -2769,76 +2902,80 @@ _change_type_to_string (NMPlatformSignalChangeType change_type)
}
static void
-log_link (NMPlatform *p, int ifindex, NMPlatformLink *device, NMPlatformSignalChangeType change_type, gpointer user_data)
+log_link (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformLink *device, NMPlatformSignalChangeType change_type, gpointer user_data)
{
- debug ("signal: link %7s: %s", _change_type_to_string (change_type), nm_platform_link_to_string (device));
+ _LOGD ("signal: link %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_link_to_string (device));
}
static void
-log_ip4_address (NMPlatform *p, int ifindex, NMPlatformIP4Address *address, NMPlatformSignalChangeType change_type, gpointer user_data)
+log_ip4_address (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP4Address *address, NMPlatformSignalChangeType change_type, gpointer user_data)
{
- debug ("signal: address 4 %7s: %s", _change_type_to_string (change_type), nm_platform_ip4_address_to_string (address));
+ _LOGD ("signal: address 4 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip4_address_to_string (address));
}
static void
-log_ip6_address (NMPlatform *p, int ifindex, NMPlatformIP6Address *address, NMPlatformSignalChangeType change_type, gpointer user_data)
+log_ip6_address (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP6Address *address, NMPlatformSignalChangeType change_type, gpointer user_data)
{
- debug ("signal: address 6 %7s: %s", _change_type_to_string (change_type), nm_platform_ip6_address_to_string (address));
+ _LOGD ("signal: address 6 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip6_address_to_string (address));
}
static void
-log_ip4_route (NMPlatform *p, int ifindex, NMPlatformIP4Route *route, NMPlatformSignalChangeType change_type, gpointer user_data)
+log_ip4_route (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP4Route *route, NMPlatformSignalChangeType change_type, gpointer user_data)
{
- debug ("signal: route 4 %7s: %s", _change_type_to_string (change_type), nm_platform_ip4_route_to_string (route));
+ _LOGD ("signal: route 4 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip4_route_to_string (route));
}
static void
-log_ip6_route (NMPlatform *p, int ifindex, NMPlatformIP6Route *route, NMPlatformSignalChangeType change_type, gpointer user_data)
+log_ip6_route (NMPlatform *self, NMPObjectType obj_type, int ifindex, NMPlatformIP6Route *route, NMPlatformSignalChangeType change_type, gpointer user_data)
{
- debug ("signal: route 6 %7s: %s", _change_type_to_string (change_type), nm_platform_ip6_route_to_string (route));
+ _LOGD ("signal: route 6 %7s: %s", nm_platform_signal_change_type_to_string (change_type), nm_platform_ip6_route_to_string (route));
}
/******************************************************************/
static gboolean
-_vtr_v4_route_add (int ifindex, const NMPlatformIPXRoute *route, guint32 v4_pref_src)
+_vtr_v4_route_add (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route, gint64 metric)
{
- return nm_platform_ip4_route_add (ifindex > 0 ? ifindex : route->rx.ifindex,
+ return nm_platform_ip4_route_add (self,
+ ifindex > 0 ? ifindex : route->rx.ifindex,
route->rx.source,
route->r4.network,
route->rx.plen,
route->r4.gateway,
- v4_pref_src,
- route->rx.metric,
+ route->r4.pref_src,
+ metric >= 0 ? (guint32) metric : route->rx.metric,
route->rx.mss);
}
static gboolean
-_vtr_v6_route_add (int ifindex, const NMPlatformIPXRoute *route, guint32 v4_pref_src)
+_vtr_v6_route_add (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route, gint64 metric)
{
- return nm_platform_ip6_route_add (ifindex > 0 ? ifindex : route->rx.ifindex,
+ return nm_platform_ip6_route_add (self,
+ ifindex > 0 ? ifindex : route->rx.ifindex,
route->rx.source,
route->r6.network,
route->rx.plen,
route->r6.gateway,
- route->rx.metric,
+ metric >= 0 ? (guint32) metric : route->rx.metric,
route->rx.mss);
}
static gboolean
-_vtr_v4_route_delete (int ifindex, const NMPlatformIPXRoute *route)
+_vtr_v4_route_delete (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route)
{
- return nm_platform_ip4_route_delete (ifindex > 0 ? ifindex : route->rx.ifindex,
+ return nm_platform_ip4_route_delete (self,
+ ifindex > 0 ? ifindex : route->rx.ifindex,
route->r4.network,
route->rx.plen,
route->rx.metric);
}
static gboolean
-_vtr_v6_route_delete (int ifindex, const NMPlatformIPXRoute *route)
+_vtr_v6_route_delete (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route)
{
- return nm_platform_ip6_route_delete (ifindex > 0 ? ifindex : route->rx.ifindex,
+ return nm_platform_ip6_route_delete (self,
+ ifindex > 0 ? ifindex : route->rx.ifindex,
route->r6.network,
route->rx.plen,
route->rx.metric);
@@ -2851,15 +2988,15 @@ _vtr_v4_metric_normalize (guint32 metric)
}
static gboolean
-_vtr_v4_route_delete_default (int ifindex, guint32 metric)
+_vtr_v4_route_delete_default (NMPlatform *self, int ifindex, guint32 metric)
{
- return nm_platform_ip4_route_delete (ifindex, 0, 0, metric);
+ return nm_platform_ip4_route_delete (self, ifindex, 0, 0, metric);
}
static gboolean
-_vtr_v6_route_delete_default (int ifindex, guint32 metric)
+_vtr_v6_route_delete_default (NMPlatform *self, int ifindex, guint32 metric)
{
- return nm_platform_ip6_route_delete (ifindex, in6addr_any, 0, metric);
+ return nm_platform_ip6_route_delete (self, ifindex, in6addr_any, 0, metric);
}
/******************************************************************/
@@ -2893,6 +3030,35 @@ const NMPlatformVTableRoute nm_platform_vtable_route_v6 = {
/******************************************************************/
static void
+set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_REGISTER_SINGLETON:
+ /* construct-only */
+ priv->register_singleton = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+constructed (GObject *object)
+{
+ NMPlatform *self = NM_PLATFORM (object);
+ NMPlatformPrivate *priv = NM_PLATFORM_GET_PRIVATE (self);
+
+ G_OBJECT_CLASS (nm_platform_parent_class)->constructed (object);
+
+ if (priv->register_singleton)
+ nm_platform_setup (self);
+}
+
+static void
nm_platform_init (NMPlatform *object)
{
}
@@ -2903,13 +3069,26 @@ nm_platform_init (NMPlatform *object)
G_SIGNAL_RUN_FIRST, \
G_CALLBACK (method), \
NULL, NULL, NULL, \
- G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_POINTER, NM_TYPE_PLATFORM_SIGNAL_CHANGE_TYPE, NM_TYPE_PLATFORM_REASON);
+ G_TYPE_NONE, 5, NM_TYPE_POBJECT_TYPE, G_TYPE_INT, G_TYPE_POINTER, NM_TYPE_PLATFORM_SIGNAL_CHANGE_TYPE, NM_TYPE_PLATFORM_REASON);
static void
nm_platform_class_init (NMPlatformClass *platform_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (platform_class);
+ g_type_class_add_private (object_class, sizeof (NMPlatformPrivate));
+
+ object_class->set_property = set_property;
+ object_class->constructed = constructed;
+
+ g_object_class_install_property
+ (object_class, PROP_REGISTER_SINGLETON,
+ g_param_spec_boolean (NM_PLATFORM_REGISTER_SINGLETON, "", "",
+ FALSE,
+ G_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
/* Signals */
SIGNAL (SIGNAL_LINK_CHANGED, log_link)
SIGNAL (SIGNAL_IP4_ADDRESS_CHANGED, log_ip4_address)
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index a49e0f11b..4d2541950 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -29,6 +29,7 @@
#include <nm-dbus-interface.h>
#include "nm-types.h"
+#include "NetworkManagerUtils.h"
#define NM_TYPE_PLATFORM (nm_platform_get_type ())
#define NM_PLATFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PLATFORM, NMPlatform))
@@ -39,6 +40,12 @@
/******************************************************************/
+#define NM_PLATFORM_REGISTER_SINGLETON "register-singleton"
+
+/******************************************************************/
+
+typedef struct _NMPlatform NMPlatform;
+
/* workaround for older libnl version, that does not define these flags. */
#ifndef IFA_F_MANAGETEMPADDR
#define IFA_F_MANAGETEMPADDR 0x100
@@ -47,19 +54,24 @@
#define IFA_F_NOPREFIXROUTE 0x200
#endif
-typedef enum {
- /* no error specified, sometimes this means the arguments were wrong */
- NM_PLATFORM_ERROR_NONE,
- /* object was not found */
+typedef enum { /*< skip >*/
+
+ /* dummy value, to enforce that the enum type is signed and has a size
+ * to hold an integer. We want to encode errno from <errno.h> as negative
+ * values. */
+ _NM_PLATFORM_ERROR_MININT = G_MININT,
+
+ NM_PLATFORM_ERROR_SUCCESS = 0,
+
+ NM_PLATFORM_ERROR_BUG,
+
+ NM_PLATFORM_ERROR_UNSPECIFIED,
+
NM_PLATFORM_ERROR_NOT_FOUND,
- /* object already exists */
NM_PLATFORM_ERROR_EXISTS,
- /* object is wrong type */
NM_PLATFORM_ERROR_WRONG_TYPE,
- /* object is not a slave */
NM_PLATFORM_ERROR_NOT_SLAVE,
- /* firmware is not found */
- NM_PLATFORM_ERROR_NO_FIRMWARE
+ NM_PLATFORM_ERROR_NO_FIRMWARE,
} NMPlatformError;
typedef enum {
@@ -83,18 +95,54 @@ struct _NMPlatformLink {
__NMPlatformObject_COMMON;
char name[IFNAMSIZ];
NMLinkType type;
- const char *type_name;
- const char *udi;
+
+ /* rtnl_link_get_type(), IFLA_INFO_KIND. */
+ /* NMPlatform initializes this field with a static string. */
+ const char *kind;
+
+ /* NMPlatform initializes this field with a static string. */
const char *driver;
+
+ gboolean initialized;
int master;
int parent;
- gboolean up;
+
+ /* rtnl_link_get_arptype(), ifinfomsg.ifi_type. */
+ guint32 arptype;
+
+ /* rtnl_link_get_addr() */
+ struct {
+ guint8 data[20]; /* NM_UTILS_HWADDR_LEN_MAX */
+ guint8 len;
+ } addr;
+
+ /* rtnl_link_inet6_get_token() */
+ struct {
+ NMUtilsIPv6IfaceId iid;
+ guint8 is_valid;
+ } inet6_token;
+
+ /* The bitwise inverse of rtnl_link_inet6_get_addr_gen_mode(). It is inverse
+ * to have a default of 0 -- meaning: unspecified. That way, a struct
+ * initialized with memset(0) has and unset value.*/
+ guint8 inet6_addr_gen_mode_inv;
+
+ /* rtnl_link_vlan_get_id(), IFLA_VLAN_ID */
+ guint16 vlan_id;
+
+ /* IFF_* flags as u32. Note that ifi_flags in 'struct ifinfomsg' is declared as 'unsigned',
+ * but libnl stores the flag internally as u32. */
+ guint32 flags;
+
+ /* @connected is mostly identical to (@flags & IFF_UP). Except for bridge/bond masters,
+ * where we coerce the link as disconnect if it has no slaves. */
gboolean connected;
- gboolean arp;
+
guint mtu;
};
typedef enum {
+ NM_PLATFORM_SIGNAL_NONE,
NM_PLATFORM_SIGNAL_ADDED,
NM_PLATFORM_SIGNAL_CHANGED,
NM_PLATFORM_SIGNAL_REMOVED,
@@ -102,11 +150,17 @@ typedef enum {
#define NM_PLATFORM_LIFETIME_PERMANENT G_MAXUINT32
-typedef enum {
- NM_PLATFORM_GET_ROUTE_MODE_ALL,
- NM_PLATFORM_GET_ROUTE_MODE_NO_DEFAULT,
- NM_PLATFORM_GET_ROUTE_MODE_ONLY_DEFAULT,
-} NMPlatformGetRouteMode;
+typedef enum { /*< skip >*/
+ NM_PLATFORM_GET_ROUTE_FLAGS_NONE = 0,
+
+ /* Whether to include default-routes/non-default-routes. Omitting
+ * both WITH_DEFAULT and WITH_NON_DEFAULT, is equal to specifying
+ * both of them. */
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT = (1LL << 0),
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT = (1LL << 1),
+
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_RTPROT_KERNEL = (1LL << 2),
+} NMPlatformGetRouteFlags;
typedef struct {
__NMPlatformObject_COMMON;
@@ -224,6 +278,14 @@ struct _NMPlatformIP4Route {
__NMPlatformIPRoute_COMMON;
in_addr_t network;
in_addr_t gateway;
+
+ /* The bitwise inverse of the route scope. It is inverted so that the
+ * default value (RT_SCOPE_NOWHERE) is nul. */
+ guint8 scope_inv;
+
+ /* RTA_PREFSRC/rtnl_route_get_pref_src(). A value of zero means that
+ * no pref-src is set. */
+ guint32 pref_src;
};
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMPlatformIPRoute, network_ptr) == G_STRUCT_OFFSET (NMPlatformIP4Route, network));
@@ -252,16 +314,17 @@ typedef struct {
gsize sizeof_route;
int (*route_cmp) (const NMPlatformIPXRoute *a, const NMPlatformIPXRoute *b);
const char *(*route_to_string) (const NMPlatformIPXRoute *route);
- GArray *(*route_get_all) (int ifindex, NMPlatformGetRouteMode mode);
- gboolean (*route_add) (int ifindex, const NMPlatformIPXRoute *route, guint32 v4_pref_src);
- gboolean (*route_delete) (int ifindex, const NMPlatformIPXRoute *route);
- gboolean (*route_delete_default) (int ifindex, guint32 metric);
+ GArray *(*route_get_all) (NMPlatform *self, int ifindex, NMPlatformGetRouteFlags flags);
+ gboolean (*route_add) (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route, gint64 metric);
+ gboolean (*route_delete) (NMPlatform *self, int ifindex, const NMPlatformIPXRoute *route);
+ gboolean (*route_delete_default) (NMPlatform *self, int ifindex, guint32 metric);
guint32 (*metric_normalize) (guint32 metric);
} NMPlatformVTableRoute;
extern const NMPlatformVTableRoute nm_platform_vtable_route_v4;
extern const NMPlatformVTableRoute nm_platform_vtable_route_v6;
+extern char _nm_platform_to_string_buffer[256];
typedef struct {
int peer;
@@ -346,68 +409,81 @@ typedef struct {
* network configuration daemons stopped. Look at the code first.
*/
-typedef struct {
+struct _NMPlatform {
GObject parent;
-
- NMPlatformError error;
-} NMPlatform;
+};
typedef struct {
GObjectClass parent;
- gboolean (*setup) (NMPlatform *);
-
gboolean (*sysctl_set) (NMPlatform *, const char *path, const char *value);
char * (*sysctl_get) (NMPlatform *, const char *path);
- gboolean (*link_get) (NMPlatform *platform, int ifindex, NMPlatformLink *link);
+ const NMPlatformLink *(*link_get) (NMPlatform *platform, int ifindex);
+ const NMPlatformLink *(*link_get_by_ifname) (NMPlatform *platform, const char *ifname);
+ const NMPlatformLink *(*link_get_by_address) (NMPlatform *platform, gconstpointer address, size_t length);
+
GArray *(*link_get_all) (NMPlatform *);
- gboolean (*link_add) (NMPlatform *, const char *name, NMLinkType type, const void *address, size_t address_len);
+ gboolean (*link_add) (NMPlatform *,
+ const char *name,
+ NMLinkType type,
+ const void *address,
+ size_t address_len,
+ NMPlatformLink *out_link);
gboolean (*link_delete) (NMPlatform *, int ifindex);
- int (*link_get_ifindex) (NMPlatform *, const char *name);
- const char *(*link_get_name) (NMPlatform *, int ifindex);
- NMLinkType (*link_get_type) (NMPlatform *, int ifindex);
const char *(*link_get_type_name) (NMPlatform *, int ifindex);
+ gboolean (*link_get_unmanaged) (NMPlatform *, int ifindex, gboolean *unmanaged);
gboolean (*link_refresh) (NMPlatform *, int ifindex);
+ void (*process_events) (NMPlatform *self);
- gboolean (*link_set_up) (NMPlatform *, int ifindex);
+ gboolean (*link_set_up) (NMPlatform *, int ifindex, gboolean *out_no_firmware);
gboolean (*link_set_down) (NMPlatform *, int ifindex);
gboolean (*link_set_arp) (NMPlatform *, int ifindex);
gboolean (*link_set_noarp) (NMPlatform *, int ifindex);
- gboolean (*link_is_up) (NMPlatform *, int ifindex);
- gboolean (*link_is_connected) (NMPlatform *, int ifindex);
- gboolean (*link_uses_arp) (NMPlatform *, int ifindex);
- gboolean (*link_get_user_ipv6ll_enabled) (NMPlatform *, int ifindex);
+ const char *(*link_get_udi) (NMPlatform *self, int ifindex);
+ GObject *(*link_get_udev_device) (NMPlatform *self, int ifindex);
+
gboolean (*link_set_user_ipv6ll_enabled) (NMPlatform *, int ifindex, gboolean enabled);
- gconstpointer (*link_get_address) (NMPlatform *, int ifindex, size_t *length);
+ gboolean (*link_get_permanent_address) (NMPlatform *,
+ int ifindex,
+ guint8 *buf,
+ size_t *length);
gboolean (*link_set_address) (NMPlatform *, int ifindex, gconstpointer address, size_t length);
- guint32 (*link_get_mtu) (NMPlatform *, int ifindex);
gboolean (*link_set_mtu) (NMPlatform *, int ifindex, guint32 mtu);
char * (*link_get_physical_port_id) (NMPlatform *, int ifindex);
guint (*link_get_dev_id) (NMPlatform *, int ifindex);
gboolean (*link_get_wake_on_lan) (NMPlatform *, int ifindex);
+ gboolean (*link_get_driver_info) (NMPlatform *,
+ int ifindex,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version);
gboolean (*link_supports_carrier_detect) (NMPlatform *, int ifindex);
gboolean (*link_supports_vlans) (NMPlatform *, int ifindex);
gboolean (*link_enslave) (NMPlatform *, int master, int slave);
gboolean (*link_release) (NMPlatform *, int master, int slave);
- gboolean (*link_get_master) (NMPlatform *, int slave);
gboolean (*master_set_option) (NMPlatform *, int ifindex, const char *option, const char *value);
char * (*master_get_option) (NMPlatform *, int ifindex, const char *option);
gboolean (*slave_set_option) (NMPlatform *, int ifindex, const char *option, const char *value);
char * (*slave_get_option) (NMPlatform *, int ifindex, const char *option);
- gboolean (*vlan_add) (NMPlatform *, const char *name, int parent, int vlanid, guint32 vlanflags);
+ gboolean (*vlan_add) (NMPlatform *, const char *name, int parent, int vlanid, guint32 vlanflags, NMPlatformLink *out_link);
gboolean (*vlan_get_info) (NMPlatform *, int ifindex, int *parent, int *vlan_id);
gboolean (*vlan_set_ingress_map) (NMPlatform *, int ifindex, int from, int to);
gboolean (*vlan_set_egress_map) (NMPlatform *, int ifindex, int from, int to);
- gboolean (*infiniband_partition_add) (NMPlatform *, int parent, int p_key);
+ gboolean (*infiniband_partition_add) (NMPlatform *, int parent, int p_key, NMPlatformLink *out_link);
+ gboolean (*infiniband_get_info) (NMPlatform *,
+ int ifindex,
+ int *parent,
+ int *p_key,
+ const char **mode);
gboolean (*veth_get_properties) (NMPlatform *, int ifindex, NMPlatformVethProperties *properties);
gboolean (*tun_get_properties) (NMPlatform *, int ifindex, NMPlatformTunProperties *properties);
@@ -441,13 +517,11 @@ typedef struct {
guint32 lifetime, guint32 preferred_lft, guint flags);
gboolean (*ip4_address_delete) (NMPlatform *, int ifindex, in_addr_t address, int plen, in_addr_t peer_address);
gboolean (*ip6_address_delete) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
- gboolean (*ip4_address_exists) (NMPlatform *, int ifindex, in_addr_t address, int plen);
- gboolean (*ip6_address_exists) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
+ const NMPlatformIP4Address *(*ip4_address_get) (NMPlatform *, int ifindex, in_addr_t address, int plen);
+ const NMPlatformIP6Address *(*ip6_address_get) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
- gboolean (*ip4_check_reinstall_device_route) (NMPlatform *, int ifindex, const NMPlatformIP4Address *address, guint32 device_route_metric);
-
- GArray * (*ip4_route_get_all) (NMPlatform *, int ifindex, NMPlatformGetRouteMode mode);
- GArray * (*ip6_route_get_all) (NMPlatform *, int ifindex, NMPlatformGetRouteMode mode);
+ GArray * (*ip4_route_get_all) (NMPlatform *, int ifindex, NMPlatformGetRouteFlags flags);
+ GArray * (*ip6_route_get_all) (NMPlatform *, int ifindex, NMPlatformGetRouteFlags flags);
gboolean (*ip4_route_add) (NMPlatform *, int ifindex, NMIPConfigSource source,
in_addr_t network, int plen, in_addr_t gateway,
guint32 pref_src, guint32 metric, guint32 mss);
@@ -456,8 +530,8 @@ typedef struct {
guint32 metric, guint32 mss);
gboolean (*ip4_route_delete) (NMPlatform *, int ifindex, in_addr_t network, int plen, guint32 metric);
gboolean (*ip6_route_delete) (NMPlatform *, int ifindex, struct in6_addr network, int plen, guint32 metric);
- gboolean (*ip4_route_exists) (NMPlatform *, int ifindex, in_addr_t network, int plen, guint32 metric);
- gboolean (*ip6_route_exists) (NMPlatform *, int ifindex, struct in6_addr network, int plen, guint32 metric);
+ const NMPlatformIP4Route *(*ip4_route_get) (NMPlatform *, int ifindex, in_addr_t network, int plen, guint32 metric);
+ const NMPlatformIP6Route *(*ip6_route_get) (NMPlatform *, int ifindex, struct in6_addr network, int plen, guint32 metric);
gboolean (*check_support_kernel_extended_ifa_flags) (NMPlatform *);
gboolean (*check_support_user_ipv6ll) (NMPlatform *);
@@ -480,139 +554,172 @@ typedef struct {
#define NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED "ip4-route-changed"
#define NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED "ip6-route-changed"
+const char *nm_platform_signal_change_type_to_string (NMPlatformSignalChangeType change_type);
+
/******************************************************************/
GType nm_platform_get_type (void);
-void nm_platform_setup (GType type);
+void nm_platform_setup (NMPlatform *instance);
NMPlatform *nm_platform_get (void);
-void nm_platform_free (void);
+NMPlatform *nm_platform_try_get (void);
+
+#define NM_PLATFORM_GET (nm_platform_get ())
/******************************************************************/
-void nm_platform_set_error (NMPlatformError error);
-NMPlatformError nm_platform_get_error (void);
-const char *nm_platform_get_error_msg (void);
-
-void nm_platform_query_devices (void);
-
-gboolean nm_platform_sysctl_set (const char *path, const char *value);
-char *nm_platform_sysctl_get (const char *path);
-gint32 nm_platform_sysctl_get_int32 (const char *path, gint32 fallback);
-gint64 nm_platform_sysctl_get_int_checked (const char *path, guint base, gint64 min, gint64 max, gint64 fallback);
-
-gboolean nm_platform_sysctl_set_ip6_hop_limit_safe (const char *iface, int value);
-
-gboolean nm_platform_link_get (int ifindex, NMPlatformLink *link);
-GArray *nm_platform_link_get_all (void);
-gboolean nm_platform_dummy_add (const char *name);
-gboolean nm_platform_bridge_add (const char *name, const void *address, size_t address_len);
-gboolean nm_platform_bond_add (const char *name);
-gboolean nm_platform_team_add (const char *name);
-gboolean nm_platform_link_exists (const char *name);
-gboolean nm_platform_link_delete (int ifindex);
-int nm_platform_link_get_ifindex (const char *name);
-const char *nm_platform_link_get_name (int ifindex);
-NMLinkType nm_platform_link_get_type (int ifindex);
-const char *nm_platform_link_get_type_name (int ifindex);
-gboolean nm_platform_link_is_software (int ifindex);
-gboolean nm_platform_link_supports_slaves (int ifindex);
-
-gboolean nm_platform_link_refresh (int ifindex);
-
-gboolean nm_platform_link_set_up (int ifindex);
-gboolean nm_platform_link_set_down (int ifindex);
-gboolean nm_platform_link_set_arp (int ifindex);
-gboolean nm_platform_link_set_noarp (int ifindex);
-gboolean nm_platform_link_is_up (int ifindex);
-gboolean nm_platform_link_is_connected (int ifindex);
-gboolean nm_platform_link_uses_arp (int ifindex);
-
-gboolean nm_platform_link_get_user_ipv6ll_enabled (int ifindex);
-gboolean nm_platform_link_set_user_ipv6ll_enabled (int ifindex, gboolean enabled);
-
-gconstpointer nm_platform_link_get_address (int ifindex, size_t *length);
-gboolean nm_platform_link_set_address (int ifindex, const void *address, size_t length);
-guint32 nm_platform_link_get_mtu (int ifindex);
-gboolean nm_platform_link_set_mtu (int ifindex, guint32 mtu);
-
-char *nm_platform_link_get_physical_port_id (int ifindex);
-guint nm_platform_link_get_dev_id (int ifindex);
-gboolean nm_platform_link_get_wake_on_lan (int ifindex);
-
-gboolean nm_platform_link_supports_carrier_detect (int ifindex);
-gboolean nm_platform_link_supports_vlans (int ifindex);
-
-gboolean nm_platform_link_enslave (int master, int slave);
-gboolean nm_platform_link_release (int master, int slave);
-int nm_platform_link_get_master (int slave);
-gboolean nm_platform_master_set_option (int ifindex, const char *option, const char *value);
-char *nm_platform_master_get_option (int ifindex, const char *option);
-gboolean nm_platform_slave_set_option (int ifindex, const char *option, const char *value);
-char *nm_platform_slave_get_option (int ifindex, const char *option);
-
-gboolean nm_platform_vlan_add (const char *name, int parent, int vlanid, guint32 vlanflags);
-gboolean nm_platform_vlan_get_info (int ifindex, int *parent, int *vlanid);
-gboolean nm_platform_vlan_set_ingress_map (int ifindex, int from, int to);
-gboolean nm_platform_vlan_set_egress_map (int ifindex, int from, int to);
-
-gboolean nm_platform_infiniband_partition_add (int parent, int p_key);
-
-gboolean nm_platform_veth_get_properties (int ifindex, NMPlatformVethProperties *properties);
-gboolean nm_platform_tun_get_properties (int ifindex, NMPlatformTunProperties *properties);
-gboolean nm_platform_macvlan_get_properties (int ifindex, NMPlatformMacvlanProperties *props);
-gboolean nm_platform_vxlan_get_properties (int ifindex, NMPlatformVxlanProperties *props);
-gboolean nm_platform_gre_get_properties (int ifindex, NMPlatformGreProperties *props);
-
-gboolean nm_platform_wifi_get_capabilities (int ifindex, NMDeviceWifiCapabilities *caps);
-gboolean nm_platform_wifi_get_bssid (int ifindex, guint8 *bssid);
-GByteArray *nm_platform_wifi_get_ssid (int ifindex);
-guint32 nm_platform_wifi_get_frequency (int ifindex);
-int nm_platform_wifi_get_quality (int ifindex);
-guint32 nm_platform_wifi_get_rate (int ifindex);
-NM80211Mode nm_platform_wifi_get_mode (int ifindex);
-void nm_platform_wifi_set_mode (int ifindex, NM80211Mode mode);
-guint32 nm_platform_wifi_find_frequency (int ifindex, const guint32 *freqs);
-void nm_platform_wifi_indicate_addressing_running (int ifindex, gboolean running);
-
-guint32 nm_platform_mesh_get_channel (int ifindex);
-gboolean nm_platform_mesh_set_channel (int ifindex, guint32 channel);
-gboolean nm_platform_mesh_set_ssid (int ifindex, const guint8 *ssid, gsize len);
-
-GArray *nm_platform_ip4_address_get_all (int ifindex);
-GArray *nm_platform_ip6_address_get_all (int ifindex);
-gboolean nm_platform_ip4_address_add (int ifindex,
+/**
+ * nm_platform_route_scope_inv:
+ * @scope: the route scope, either its original value, or its inverse.
+ *
+ * This function is useful, because the constants such as RT_SCOPE_NOWHERE
+ * are 'int', so ~scope also gives an 'int'. This function gets the type
+ * casts to guint8 right.
+ *
+ * Returns: the bitwise inverse of the route scope.
+ * */
+#define nm_platform_route_scope_inv _nm_platform_uint8_inv
+static inline guint8
+_nm_platform_uint8_inv (guint8 scope)
+{
+ return (guint8) ~scope;
+}
+
+const char *nm_link_type_to_string (NMLinkType link_type);
+
+const char *nm_platform_error_to_string (NMPlatformError error);
+
+gboolean nm_platform_sysctl_set (NMPlatform *self, const char *path, const char *value);
+char *nm_platform_sysctl_get (NMPlatform *self, const char *path);
+gint32 nm_platform_sysctl_get_int32 (NMPlatform *self, const char *path, gint32 fallback);
+gint64 nm_platform_sysctl_get_int_checked (NMPlatform *self, const char *path, guint base, gint64 min, gint64 max, gint64 fallback);
+
+gboolean nm_platform_sysctl_set_ip6_hop_limit_safe (NMPlatform *self, const char *iface, int value);
+
+const NMPlatformLink *nm_platform_link_get (NMPlatform *self, int ifindex);
+const NMPlatformLink *nm_platform_link_get_by_ifname (NMPlatform *self, const char *ifname);
+const NMPlatformLink *nm_platform_link_get_by_address (NMPlatform *self, gconstpointer address, size_t length);
+
+GArray *nm_platform_link_get_all (NMPlatform *self);
+NMPlatformError nm_platform_dummy_add (NMPlatform *self, const char *name, NMPlatformLink *out_link);
+NMPlatformError nm_platform_bridge_add (NMPlatform *self, const char *name, const void *address, size_t address_len, NMPlatformLink *out_link);
+NMPlatformError nm_platform_bond_add (NMPlatform *self, const char *name, NMPlatformLink *out_link);
+NMPlatformError nm_platform_team_add (NMPlatform *self, const char *name, NMPlatformLink *out_link);
+gboolean nm_platform_link_delete (NMPlatform *self, int ifindex);
+
+/* convienience methods to lookup the link and access fields of NMPlatformLink. */
+int nm_platform_link_get_ifindex (NMPlatform *self, const char *name);
+const char *nm_platform_link_get_name (NMPlatform *self, int ifindex);
+NMLinkType nm_platform_link_get_type (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_is_software (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_is_up (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_is_connected (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_uses_arp (NMPlatform *self, int ifindex);
+guint32 nm_platform_link_get_mtu (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_get_ipv6_token (NMPlatform *self, int ifindex, NMUtilsIPv6IfaceId *iid);
+gboolean nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex);
+gconstpointer nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length);
+int nm_platform_link_get_master (NMPlatform *self, int slave);
+
+gboolean nm_platform_link_get_unmanaged (NMPlatform *self, int ifindex, gboolean *unmanaged);
+gboolean nm_platform_link_supports_slaves (NMPlatform *self, int ifindex);
+const char *nm_platform_link_get_type_name (NMPlatform *self, int ifindex);
+
+gboolean nm_platform_link_refresh (NMPlatform *self, int ifindex);
+void nm_platform_process_events (NMPlatform *self);
+
+gboolean nm_platform_link_set_up (NMPlatform *self, int ifindex, gboolean *out_no_firmware);
+gboolean nm_platform_link_set_down (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_set_arp (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_set_noarp (NMPlatform *self, int ifindex);
+
+const char *nm_platform_link_get_udi (NMPlatform *self, int ifindex);
+
+GObject *nm_platform_link_get_udev_device (NMPlatform *self, int ifindex);
+
+gboolean nm_platform_link_set_user_ipv6ll_enabled (NMPlatform *self, int ifindex, gboolean enabled);
+
+gboolean nm_platform_link_get_permanent_address (NMPlatform *self, int ifindex, guint8 *buf, size_t *length);
+gboolean nm_platform_link_set_address (NMPlatform *self, int ifindex, const void *address, size_t length);
+gboolean nm_platform_link_set_mtu (NMPlatform *self, int ifindex, guint32 mtu);
+
+char *nm_platform_link_get_physical_port_id (NMPlatform *self, int ifindex);
+guint nm_platform_link_get_dev_id (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_get_wake_on_lan (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_get_driver_info (NMPlatform *self,
+ int ifindex,
+ char **out_driver_name,
+ char **out_driver_version,
+ char **out_fw_version);
+
+gboolean nm_platform_link_supports_carrier_detect (NMPlatform *self, int ifindex);
+gboolean nm_platform_link_supports_vlans (NMPlatform *self, int ifindex);
+
+gboolean nm_platform_link_enslave (NMPlatform *self, int master, int slave);
+gboolean nm_platform_link_release (NMPlatform *self, int master, int slave);
+gboolean nm_platform_master_set_option (NMPlatform *self, int ifindex, const char *option, const char *value);
+char *nm_platform_master_get_option (NMPlatform *self, int ifindex, const char *option);
+gboolean nm_platform_slave_set_option (NMPlatform *self, int ifindex, const char *option, const char *value);
+char *nm_platform_slave_get_option (NMPlatform *self, int ifindex, const char *option);
+
+NMPlatformError nm_platform_vlan_add (NMPlatform *self, const char *name, int parent, int vlanid, guint32 vlanflags, NMPlatformLink *out_link);
+gboolean nm_platform_vlan_get_info (NMPlatform *self, int ifindex, int *parent, int *vlanid);
+gboolean nm_platform_vlan_set_ingress_map (NMPlatform *self, int ifindex, int from, int to);
+gboolean nm_platform_vlan_set_egress_map (NMPlatform *self, int ifindex, int from, int to);
+
+NMPlatformError nm_platform_infiniband_partition_add (NMPlatform *self, int parent, int p_key, NMPlatformLink *out_link);
+gboolean nm_platform_infiniband_get_info (NMPlatform *self, int ifindex, int *parent, int *p_key, const char **mode);
+
+gboolean nm_platform_veth_get_properties (NMPlatform *self, int ifindex, NMPlatformVethProperties *properties);
+gboolean nm_platform_tun_get_properties (NMPlatform *self, int ifindex, NMPlatformTunProperties *properties);
+gboolean nm_platform_macvlan_get_properties (NMPlatform *self, int ifindex, NMPlatformMacvlanProperties *props);
+gboolean nm_platform_vxlan_get_properties (NMPlatform *self, int ifindex, NMPlatformVxlanProperties *props);
+gboolean nm_platform_gre_get_properties (NMPlatform *self, int ifindex, NMPlatformGreProperties *props);
+
+gboolean nm_platform_wifi_get_capabilities (NMPlatform *self, int ifindex, NMDeviceWifiCapabilities *caps);
+gboolean nm_platform_wifi_get_bssid (NMPlatform *self, int ifindex, guint8 *bssid);
+GByteArray *nm_platform_wifi_get_ssid (NMPlatform *self, int ifindex);
+guint32 nm_platform_wifi_get_frequency (NMPlatform *self, int ifindex);
+int nm_platform_wifi_get_quality (NMPlatform *self, int ifindex);
+guint32 nm_platform_wifi_get_rate (NMPlatform *self, int ifindex);
+NM80211Mode nm_platform_wifi_get_mode (NMPlatform *self, int ifindex);
+void nm_platform_wifi_set_mode (NMPlatform *self, int ifindex, NM80211Mode mode);
+guint32 nm_platform_wifi_find_frequency (NMPlatform *self, int ifindex, const guint32 *freqs);
+void nm_platform_wifi_indicate_addressing_running (NMPlatform *self, int ifindex, gboolean running);
+
+guint32 nm_platform_mesh_get_channel (NMPlatform *self, int ifindex);
+gboolean nm_platform_mesh_set_channel (NMPlatform *self, int ifindex, guint32 channel);
+gboolean nm_platform_mesh_set_ssid (NMPlatform *self, int ifindex, const guint8 *ssid, gsize len);
+
+const NMPlatformIP4Address *nm_platform_ip4_address_get (NMPlatform *self, int ifindex, in_addr_t address, int plen);
+const NMPlatformIP6Address *nm_platform_ip6_address_get (NMPlatform *self, int ifindex, struct in6_addr address, int plen);
+GArray *nm_platform_ip4_address_get_all (NMPlatform *self, int ifindex);
+GArray *nm_platform_ip6_address_get_all (NMPlatform *self, int ifindex);
+gboolean nm_platform_ip4_address_add (NMPlatform *self, int ifindex,
in_addr_t address, in_addr_t peer_address, int plen,
guint32 lifetime, guint32 preferred_lft,
const char *label);
-gboolean nm_platform_ip6_address_add (int ifindex,
+gboolean nm_platform_ip6_address_add (NMPlatform *self, int ifindex,
struct in6_addr address, struct in6_addr peer_address, int plen,
guint32 lifetime, guint32 preferred_lft, guint flags);
-gboolean nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen, in_addr_t peer_address);
-gboolean nm_platform_ip6_address_delete (int ifindex, struct in6_addr address, int plen);
-gboolean nm_platform_ip4_address_exists (int ifindex, in_addr_t address, int plen);
-gboolean nm_platform_ip6_address_exists (int ifindex, struct in6_addr address, int plen);
-gboolean nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses, guint32 device_route_metric);
-gboolean nm_platform_ip6_address_sync (int ifindex, const GArray *known_addresses, gboolean keep_link_local);
-gboolean nm_platform_address_flush (int ifindex);
-
-gboolean nm_platform_ip4_check_reinstall_device_route (int ifindex, const NMPlatformIP4Address *address, guint32 device_route_metric);
-
-GArray *nm_platform_ip4_route_get_all (int ifindex, NMPlatformGetRouteMode mode);
-GArray *nm_platform_ip6_route_get_all (int ifindex, NMPlatformGetRouteMode mode);
-gboolean nm_platform_ip4_route_add (int ifindex, NMIPConfigSource source,
+gboolean nm_platform_ip4_address_delete (NMPlatform *self, int ifindex, in_addr_t address, int plen, in_addr_t peer_address);
+gboolean nm_platform_ip6_address_delete (NMPlatform *self, int ifindex, struct in6_addr address, int plen);
+gboolean nm_platform_ip4_address_sync (NMPlatform *self, int ifindex, const GArray *known_addresses, GPtrArray **out_added_addresses);
+gboolean nm_platform_ip6_address_sync (NMPlatform *self, int ifindex, const GArray *known_addresses, gboolean keep_link_local);
+gboolean nm_platform_address_flush (NMPlatform *self, int ifindex);
+
+const NMPlatformIP4Route *nm_platform_ip4_route_get (NMPlatform *self, int ifindex, in_addr_t network, int plen, guint32 metric);
+const NMPlatformIP6Route *nm_platform_ip6_route_get (NMPlatform *self, int ifindex, struct in6_addr network, int plen, guint32 metric);
+GArray *nm_platform_ip4_route_get_all (NMPlatform *self, int ifindex, NMPlatformGetRouteFlags flags);
+GArray *nm_platform_ip6_route_get_all (NMPlatform *self, int ifindex, NMPlatformGetRouteFlags flags);
+gboolean nm_platform_ip4_route_add (NMPlatform *self, int ifindex, NMIPConfigSource source,
in_addr_t network, int plen, in_addr_t gateway,
guint32 pref_src, guint32 metric, guint32 mss);
-gboolean nm_platform_ip6_route_add (int ifindex, NMIPConfigSource source,
+gboolean nm_platform_ip6_route_add (NMPlatform *self, int ifindex, NMIPConfigSource source,
struct in6_addr network, int plen, struct in6_addr gateway,
guint32 metric, guint32 mss);
-gboolean nm_platform_ip4_route_delete (int ifindex, in_addr_t network, int plen, guint32 metric);
-gboolean nm_platform_ip6_route_delete (int ifindex, struct in6_addr network, int plen, guint32 metric);
-gboolean nm_platform_ip4_route_exists (int ifindex, in_addr_t network, int plen, guint32 metric);
-gboolean nm_platform_ip6_route_exists (int ifindex, struct in6_addr network, int plen, guint32 metric);
-gboolean nm_platform_ip4_route_sync (int ifindex, const GArray *known_routes);
-gboolean nm_platform_ip6_route_sync (int ifindex, const GArray *known_routes);
-gboolean nm_platform_route_flush (int ifindex);
+gboolean nm_platform_ip4_route_delete (NMPlatform *self, int ifindex, in_addr_t network, int plen, guint32 metric);
+gboolean nm_platform_ip6_route_delete (NMPlatform *self, int ifindex, struct in6_addr network, int plen, guint32 metric);
const char *nm_platform_link_to_string (const NMPlatformLink *link);
const char *nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address);
@@ -627,8 +734,8 @@ int nm_platform_ip4_route_cmp (const NMPlatformIP4Route *a, const NMPlatformIP4R
int nm_platform_ip6_route_cmp (const NMPlatformIP6Route *a, const NMPlatformIP6Route *b);
gboolean nm_platform_check_support_libnl_extended_ifa_flags (void);
-gboolean nm_platform_check_support_kernel_extended_ifa_flags (void);
-gboolean nm_platform_check_support_user_ipv6ll (void);
+gboolean nm_platform_check_support_kernel_extended_ifa_flags (NMPlatform *self);
+gboolean nm_platform_check_support_user_ipv6ll (NMPlatform *self);
void nm_platform_addr_flags2str (int flags, char *buf, size_t size);
diff --git a/src/platform/nmp-object.c b/src/platform/nmp-object.c
new file mode 100644
index 000000000..51684b93c
--- /dev/null
+++ b/src/platform/nmp-object.c
@@ -0,0 +1,1924 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-platform.c - Handle runtime kernel networking configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include "nmp-object.h"
+
+#include <unistd.h>
+
+#include "nm-platform-utils.h"
+#include "NetworkManagerUtils.h"
+#include "nm-utils.h"
+#include "nm-logging.h"
+
+/*********************************************************************************************/
+
+#define _LOG_DOMAIN LOGD_PLATFORM
+
+#define _LOG(level, domain, obj, ...) \
+ G_STMT_START { \
+ const NMLogLevel __level = (level); \
+ const NMLogDomain __domain = (domain); \
+ \
+ if (nm_logging_enabled (__level, __domain)) { \
+ const NMPObject *const __obj = (obj); \
+ \
+ _nm_log (__level, __domain, 0, \
+ "nmp-object[%p/%s]: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
+ __obj, \
+ (__obj ? NMP_OBJECT_GET_CLASS (__obj)->obj_type_name : "???") \
+ _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
+ } \
+ } G_STMT_END
+#define _LOG_LEVEL_ENABLED(level, domain) \
+ ( nm_logging_enabled ((level), (domain)) )
+
+#ifdef NM_MORE_LOGGING
+#define _LOGT_ENABLED() _LOG_LEVEL_ENABLED (LOGL_TRACE, _LOG_DOMAIN)
+#define _LOGT(obj, ...) _LOG (LOGL_TRACE, _LOG_DOMAIN, obj, __VA_ARGS__)
+#else
+#define _LOGT_ENABLED() FALSE
+#define _LOGT(obj, ...) G_STMT_START { if (FALSE) { _LOG (LOGL_TRACE, _LOG_DOMAIN, obj, __VA_ARGS__); } } G_STMT_END
+#endif
+
+#define _LOGD(obj, ...) _LOG (LOGL_DEBUG, _LOG_DOMAIN, obj, __VA_ARGS__)
+#define _LOGI(obj, ...) _LOG (LOGL_INFO , _LOG_DOMAIN, obj, __VA_ARGS__)
+#define _LOGW(obj, ...) _LOG (LOGL_WARN , _LOG_DOMAIN, obj, __VA_ARGS__)
+#define _LOGE(obj, ...) _LOG (LOGL_ERR , _LOG_DOMAIN, obj, __VA_ARGS__)
+
+/*********************************************************************************************/
+
+struct _NMPCache {
+ /* the cache contains only one hash table for all object types, and similarly
+ * it contains only one NMMultiIndex.
+ * This works, because different object types don't ever compare equal and
+ * because their index ids also don't overlap.
+ *
+ * For routes and addresses, the cache contains an address if (and only if) the
+ * object was reported via netlink.
+ * For links, the cache contain a link if it was reported by either netlink
+ * or udev. That means, a link object can be alive, even if it was already
+ * removed via netlink.
+ *
+ * This effectively merges the udev-device cache into the NMPCache.
+ */
+
+ GHashTable *idx_main;
+ NMMultiIndex *idx_multi;
+
+ gboolean use_udev;
+};
+
+/******************************************************************/
+
+static inline guint
+_id_hash_ip6_addr (const struct in6_addr *addr)
+{
+ guint hash = (guint) 0x897da53981a13ULL;
+ int i;
+
+ for (i = 0; i < sizeof (*addr); i++)
+ hash = (hash * 33) + ((const guint8 *) addr)[i];
+ return hash;
+}
+
+static const char *
+_link_get_driver (GUdevDevice *udev_device, const char *kind, const char *ifname)
+{
+ const char *driver = NULL;
+
+ nm_assert (kind == g_intern_string (kind));
+
+ if (udev_device) {
+ driver = nmp_utils_udev_get_driver (udev_device);
+ if (driver)
+ return driver;
+ }
+
+ if (kind)
+ return kind;
+
+ if (ifname) {
+ char *d;
+
+ if (nmp_utils_ethtool_get_driver_info (ifname, &d, NULL, NULL)) {
+ driver = d && d[0] ? g_intern_string (d) : NULL;
+ g_free (d);
+ if (driver)
+ return driver;
+ }
+ }
+
+ return "unknown";
+}
+
+void
+_nmp_object_fixup_link_udev_fields (NMPObject *obj, gboolean use_udev)
+{
+ const char *driver = NULL;
+ gboolean initialized = FALSE;
+
+ nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK);
+
+ /* The link contains internal fields that are combined by
+ * properties from netlink and udev. Update those properties */
+
+ /* When a link is not in netlink, it's udev fields don't matter. */
+ if (obj->_link.netlink.is_in_netlink) {
+ driver = _link_get_driver (obj->_link.udev.device,
+ obj->link.kind,
+ obj->link.name);
+ if (obj->_link.udev.device)
+ initialized = TRUE;
+ else if (!use_udev) {
+ /* If we don't use udev, we immediately mark the link as initialized.
+ *
+ * For that, we consult @use_udev argument, that is cached via
+ * nmp_cache_use_udev_get(). It is on purpose not to test
+ * for a writable /sys on every call. A minor reason for that is
+ * performance, but the real reason is reproducibility.
+ *
+ * If you want to support changing of whether udev is enabled,
+ * reset the value via nmp_cache_use_udev_set() carefully -- and
+ * possibly update the links in the cache accordingly.
+ * */
+ initialized = TRUE;
+ }
+ }
+
+ obj->link.driver = driver;
+ obj->link.initialized = initialized;
+}
+
+static void
+_nmp_object_fixup_link_master_connected (NMPObject *obj, const NMPCache *cache)
+{
+ nm_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK);
+
+ if (nmp_cache_link_connected_needs_toggle (cache, obj, NULL, NULL))
+ obj->link.connected = !obj->link.connected;
+}
+
+/******************************************************************/
+
+const NMPClass *
+nmp_class_from_type (NMPObjectType obj_type)
+{
+ g_return_val_if_fail (obj_type > NMP_OBJECT_TYPE_UNKNOWN && obj_type <= NMP_OBJECT_TYPE_MAX, NULL);
+
+ return &_nmp_classes[obj_type - 1];
+}
+
+/******************************************************************/
+
+NMPObject *
+nmp_object_ref (NMPObject *obj)
+{
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), NULL);
+ g_return_val_if_fail (obj->_ref_count != NMP_REF_COUNT_STACKINIT, NULL);
+ obj->_ref_count++;
+
+ _LOGT (obj, "ref: %d", obj->_ref_count);
+
+ return obj;
+}
+
+void
+nmp_object_unref (NMPObject *obj)
+{
+ if (obj) {
+ g_return_if_fail (obj->_ref_count > 0);
+ g_return_if_fail (obj->_ref_count != NMP_REF_COUNT_STACKINIT);
+ _LOGT (obj, "%s: %d",
+ obj->_ref_count <= 1 ? "destroy" : "unref",
+ obj->_ref_count - 1);
+ if (--obj->_ref_count <= 0) {
+ const NMPClass *klass = obj->_class;
+
+ nm_assert (!obj->is_cached);
+ if (klass->cmd_obj_dispose)
+ klass->cmd_obj_dispose (obj);
+ g_slice_free1 (klass->sizeof_data + G_STRUCT_OFFSET (NMPObject, object), obj);
+ }
+ }
+}
+
+static void
+_vt_cmd_obj_dispose_link (NMPObject *obj)
+{
+ g_clear_object (&obj->_link.udev.device);
+}
+
+static NMPObject *
+_nmp_object_new_from_class (const NMPClass *klass)
+{
+ NMPObject *obj;
+
+ nm_assert (klass);
+ nm_assert (klass->sizeof_data > 0);
+ nm_assert (klass->sizeof_public > 0 && klass->sizeof_public <= klass->sizeof_data);
+
+ obj = g_slice_alloc0 (klass->sizeof_data + G_STRUCT_OFFSET (NMPObject, object));
+ obj->_class = klass;
+ obj->_ref_count = 1;
+ _LOGT (obj, "new");
+ return obj;
+}
+
+NMPObject *
+nmp_object_new (NMPObjectType obj_type, const NMPlatformObject *plobj)
+{
+ const NMPClass *klass = nmp_class_from_type (obj_type);
+ NMPObject *obj;
+
+ obj = _nmp_object_new_from_class (klass);
+ if (plobj)
+ memcpy (&obj->object, plobj, klass->sizeof_public);
+ return obj;
+}
+
+NMPObject *
+nmp_object_new_link (int ifindex)
+{
+ NMPObject *obj;
+
+ obj = nmp_object_new (NMP_OBJECT_TYPE_LINK, NULL);
+ obj->link.ifindex = ifindex;
+ return obj;
+}
+
+/******************************************************************/
+
+static const NMPObject *
+_nmp_object_stackinit_from_class (NMPObject *obj, const NMPClass *klass)
+{
+ nm_assert (klass);
+
+ memset (obj, 0, sizeof (NMPObject));
+ obj->_class = klass;
+ obj->_ref_count = NMP_REF_COUNT_STACKINIT;
+ return obj;
+}
+
+const NMPObject *
+nmp_object_stackinit (NMPObject *obj, NMPObjectType obj_type, const NMPlatformObject *plobj)
+{
+ const NMPClass *klass = nmp_class_from_type (obj_type);
+
+ _nmp_object_stackinit_from_class (obj, klass);
+ if (plobj)
+ memcpy (&obj->object, plobj, klass->sizeof_public);
+ return obj;
+}
+
+const NMPObject *
+nmp_object_stackinit_id (NMPObject *obj, const NMPObject *src)
+{
+ nm_assert (NMP_OBJECT_IS_VALID (src));
+ nm_assert (obj);
+
+ NMP_OBJECT_GET_CLASS (src)->cmd_obj_stackinit_id (obj, src);
+ return obj;
+}
+
+const NMPObject *
+nmp_object_stackinit_id_link (NMPObject *obj, int ifindex)
+{
+ nmp_object_stackinit (obj, NMP_OBJECT_TYPE_LINK, NULL);
+ obj->link.ifindex = ifindex;
+ return obj;
+}
+
+static void
+_vt_cmd_obj_stackinit_id_link (NMPObject *obj, const NMPObject *src)
+{
+ nmp_object_stackinit_id_link (obj, src->link.ifindex);
+}
+
+const NMPObject *
+nmp_object_stackinit_id_ip4_address (NMPObject *obj, int ifindex, guint32 address, int plen)
+{
+ nmp_object_stackinit (obj, NMP_OBJECT_TYPE_IP4_ADDRESS, NULL);
+ obj->ip4_address.ifindex = ifindex;
+ obj->ip4_address.address = address;
+ obj->ip4_address.plen = plen;
+ return obj;
+}
+
+static void
+_vt_cmd_obj_stackinit_id_ip4_address (NMPObject *obj, const NMPObject *src)
+{
+ nmp_object_stackinit_id_ip4_address (obj, src->ip_address.ifindex, src->ip4_address.address, src->ip_address.plen);
+}
+
+const NMPObject *
+nmp_object_stackinit_id_ip6_address (NMPObject *obj, int ifindex, const struct in6_addr *address, int plen)
+{
+ nmp_object_stackinit (obj, NMP_OBJECT_TYPE_IP6_ADDRESS, NULL);
+ obj->ip4_address.ifindex = ifindex;
+ if (address)
+ obj->ip6_address.address = *address;
+ obj->ip6_address.plen = plen;
+ return obj;
+}
+
+static void
+_vt_cmd_obj_stackinit_id_ip6_address (NMPObject *obj, const NMPObject *src)
+{
+ nmp_object_stackinit_id_ip6_address (obj, src->ip_address.ifindex, &src->ip6_address.address, src->ip_address.plen);
+}
+
+const NMPObject *
+nmp_object_stackinit_id_ip4_route (NMPObject *obj, int ifindex, guint32 network, int plen, guint32 metric)
+{
+ nmp_object_stackinit (obj, NMP_OBJECT_TYPE_IP4_ROUTE, NULL);
+ obj->ip4_route.ifindex = ifindex;
+ obj->ip4_route.network = network;
+ obj->ip4_route.plen = plen;
+ obj->ip4_route.metric = metric;
+ return obj;
+}
+
+static void
+_vt_cmd_obj_stackinit_id_ip4_route (NMPObject *obj, const NMPObject *src)
+{
+ nmp_object_stackinit_id_ip4_route (obj, src->ip_route.ifindex, src->ip4_route.network, src->ip_route.plen, src->ip_route.metric);
+}
+
+const NMPObject *
+nmp_object_stackinit_id_ip6_route (NMPObject *obj, int ifindex, const struct in6_addr *network, int plen, guint32 metric)
+{
+ nmp_object_stackinit (obj, NMP_OBJECT_TYPE_IP6_ROUTE, NULL);
+ obj->ip6_route.ifindex = ifindex;
+ if (network)
+ obj->ip6_route.network = *network;
+ obj->ip6_route.plen = plen;
+ obj->ip6_route.metric = metric;
+ return obj;
+}
+
+static void
+_vt_cmd_obj_stackinit_id_ip6_route (NMPObject *obj, const NMPObject *src)
+{
+ nmp_object_stackinit_id_ip6_route (obj, src->ip_route.ifindex, &src->ip6_route.network, src->ip_route.plen, src->ip_route.metric);
+}
+
+/******************************************************************/
+
+const char *
+nmp_object_to_string (const NMPObject *obj, NMPObjectToStringMode to_string_mode, char *buf, gsize buf_size)
+{
+ const NMPClass *klass;
+ char buf2[sizeof (_nm_platform_to_string_buffer)];
+ char buf3[sizeof (_nm_platform_to_string_buffer)];
+ const char *str;
+
+ if (!buf) {
+ buf = _nm_platform_to_string_buffer;
+ buf_size = sizeof (_nm_platform_to_string_buffer);
+ }
+
+ if (!obj) {
+ g_strlcpy (buf, "NULL", buf_size);
+ return buf;
+ }
+
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), NULL);
+
+ klass = NMP_OBJECT_GET_CLASS (obj);
+
+ switch (to_string_mode) {
+ case NMP_OBJECT_TO_STRING_ID:
+ return klass->cmd_plobj_to_string_id (&obj->object, buf, buf_size);
+ case NMP_OBJECT_TO_STRING_ALL:
+ g_strlcpy (buf2, NMP_OBJECT_GET_CLASS (obj)->cmd_plobj_to_string (&obj->object), sizeof (buf2));
+
+ if (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK) {
+ g_snprintf (buf3, sizeof (buf3),
+ ",%cin-nl,%p",
+ obj->_link.netlink.is_in_netlink ? '+' : '-',
+ obj->_link.udev.device);
+ } else
+ buf3[0] = '\0';
+
+ g_snprintf (buf, buf_size,
+ "[%s,%p,%d,%ccache,%calive,%cvisible%s; %s]",
+ klass->obj_type_name, obj, obj->_ref_count,
+ obj->is_cached ? '+' : '-',
+ nmp_object_is_alive (obj) ? '+' : '-',
+ nmp_object_is_visible (obj) ? '+' : '-',
+ buf3, buf2);
+ return buf;
+ case NMP_OBJECT_TO_STRING_PUBLIC:
+ str = NMP_OBJECT_GET_CLASS (obj)->cmd_plobj_to_string (&obj->object);
+ if (str != buf)
+ g_strlcpy (buf, str, buf_size);
+ return buf;
+ default:
+ g_return_val_if_reached ("ERROR");
+ }
+}
+
+#define _vt_cmd_plobj_to_string_id(type, plat_type, ...) \
+static const char * \
+_vt_cmd_plobj_to_string_id_##type (const NMPlatformObject *_obj, char *buf, gsize buf_len) \
+{ \
+ plat_type *const obj = (plat_type *) _obj; \
+ char buf1[NM_UTILS_INET_ADDRSTRLEN]; \
+ \
+ (void) buf1; \
+ g_snprintf (buf, buf_len, \
+ __VA_ARGS__); \
+ return buf; \
+}
+_vt_cmd_plobj_to_string_id (link, NMPlatformLink, "%d", obj->ifindex);
+_vt_cmd_plobj_to_string_id (ip4_address, NMPlatformIP4Address, "%d: %s/%d", obj->ifindex, nm_utils_inet4_ntop ( obj->address, buf1), obj->plen);
+_vt_cmd_plobj_to_string_id (ip6_address, NMPlatformIP6Address, "%d: %s/%d", obj->ifindex, nm_utils_inet6_ntop (&obj->address, buf1), obj->plen);
+_vt_cmd_plobj_to_string_id (ip4_route, NMPlatformIP4Route, "%d: %s/%d %d", obj->ifindex, nm_utils_inet4_ntop ( obj->network, buf1), obj->plen, obj->metric);
+_vt_cmd_plobj_to_string_id (ip6_route, NMPlatformIP6Route, "%d: %s/%d %d", obj->ifindex, nm_utils_inet6_ntop (&obj->network, buf1), obj->plen, obj->metric);
+
+int
+nmp_object_cmp (const NMPObject *obj1, const NMPObject *obj2)
+{
+ if (obj1 == obj2)
+ return 0;
+ if (!obj1)
+ return -1;
+ if (!obj2)
+ return 1;
+
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj1), -1);
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj2), 1);
+
+ if (NMP_OBJECT_GET_CLASS (obj1) != NMP_OBJECT_GET_CLASS (obj2))
+ return NMP_OBJECT_GET_CLASS (obj1) < NMP_OBJECT_GET_CLASS (obj2) ? -1 : 1;
+
+ return NMP_OBJECT_GET_CLASS (obj1)->cmd_plobj_cmp (&obj1->object, &obj2->object);
+}
+
+gboolean
+nmp_object_equal (const NMPObject *obj1, const NMPObject *obj2)
+{
+ const NMPClass *klass;
+
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj1), FALSE);
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj2), FALSE);
+
+ if (obj1 == obj2)
+ return TRUE;
+
+ klass = NMP_OBJECT_GET_CLASS (obj1);
+
+ if (klass != NMP_OBJECT_GET_CLASS (obj2))
+ return FALSE;
+
+ return klass->cmd_obj_equal (obj1, obj2);
+}
+
+static gboolean
+_vt_cmd_obj_equal_plain (const NMPObject *obj1, const NMPObject *obj2)
+{
+ return NMP_OBJECT_GET_CLASS (obj1)->cmd_plobj_cmp (&obj1->object, &obj2->object) == 0;
+}
+
+static gboolean
+_vt_cmd_obj_equal_link (const NMPObject *obj1, const NMPObject *obj2)
+{
+ const NMPClass *klass = NMP_OBJECT_GET_CLASS (obj1);
+
+ if (klass->cmd_plobj_cmp (&obj1->object, &obj2->object) != 0)
+ return FALSE;
+ if (obj1->_link.netlink.is_in_netlink != obj2->_link.netlink.is_in_netlink)
+ return FALSE;
+ if (obj1->_link.udev.device != obj2->_link.udev.device)
+ return FALSE;
+ return TRUE;
+}
+
+/* @src is a const object, which is not entirely correct for link types, where
+ * we increase the ref count for src->_link.udev.device.
+ * Hence, nmp_object_copy() can violate the const promise of @src.
+ * */
+void
+nmp_object_copy (NMPObject *dst, const NMPObject *src, gboolean id_only)
+{
+ g_return_if_fail (NMP_OBJECT_IS_VALID (dst));
+ g_return_if_fail (NMP_OBJECT_IS_VALID (src));
+ g_return_if_fail (!NMP_OBJECT_IS_STACKINIT (dst));
+
+ if (src != dst) {
+ const NMPClass *klass = NMP_OBJECT_GET_CLASS (dst);
+
+ g_return_if_fail (klass == NMP_OBJECT_GET_CLASS (src));
+
+ if (id_only)
+ klass->cmd_plobj_id_copy (&dst->object, &src->object);
+ else
+ klass->cmd_obj_copy (dst, src);
+ }
+}
+
+#define _vt_cmd_plobj_id_copy(type, plat_type, cmd) \
+static void \
+_vt_cmd_plobj_id_copy_##type (NMPlatformObject *_dst, const NMPlatformObject *_src) \
+{ \
+ plat_type *const dst = (plat_type *) _dst; \
+ const plat_type *const src = (const plat_type *) _src; \
+ { cmd } \
+}
+_vt_cmd_plobj_id_copy (link, NMPlatformLink, {
+ dst->ifindex = src->ifindex;
+});
+_vt_cmd_plobj_id_copy (ip4_address, NMPlatformIP4Address, {
+ dst->ifindex = src->ifindex;
+ dst->plen = src->plen;
+ dst->address = src->address;
+});
+_vt_cmd_plobj_id_copy (ip6_address, NMPlatformIP6Address, {
+ dst->ifindex = src->ifindex;
+ dst->plen = src->plen;
+ dst->address = src->address;
+});
+_vt_cmd_plobj_id_copy (ip4_route, NMPlatformIP4Route, {
+ dst->ifindex = src->ifindex;
+ dst->plen = src->plen;
+ dst->metric = src->metric;
+ dst->network = src->network;
+});
+_vt_cmd_plobj_id_copy (ip6_route, NMPlatformIP6Route, {
+ dst->ifindex = src->ifindex;
+ dst->plen = src->plen;
+ dst->metric = src->metric;
+ dst->network = src->network;
+});
+
+static void
+_vt_cmd_obj_copy_plain (NMPObject *dst, const NMPObject *src)
+{
+ memcpy (&dst->object, &src->object, NMP_OBJECT_GET_CLASS (dst)->sizeof_data);
+}
+
+static void
+_vt_cmd_obj_copy_link (NMPObject *dst, const NMPObject *src)
+{
+ if (dst->_link.udev.device != src->_link.udev.device) {
+ if (dst->_link.udev.device)
+ g_object_unref (dst->_link.udev.device);
+ if (src->_link.udev.device)
+ g_object_ref (src->_link.udev.device);
+ }
+ dst->_link = src->_link;
+}
+
+/* Uses internally nmp_object_copy(), hence it also violates the const
+ * promise for @obj.
+ * */
+NMPObject *
+nmp_object_clone (const NMPObject *obj, gboolean id_only)
+{
+ NMPObject *dst;
+
+ if (!obj)
+ return NULL;
+
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), NULL);
+
+ dst = _nmp_object_new_from_class (NMP_OBJECT_GET_CLASS (obj));
+ nmp_object_copy (dst, obj, id_only);
+ return dst;
+}
+
+gboolean
+nmp_object_id_equal (const NMPObject *obj1, const NMPObject *obj2)
+{
+ const NMPClass *klass;
+
+ if (obj1 == obj2)
+ return TRUE;
+ if (!obj1 || !obj2)
+ return FALSE;
+
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj1), FALSE);
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj2), FALSE);
+
+ klass = NMP_OBJECT_GET_CLASS (obj1);
+ return klass == NMP_OBJECT_GET_CLASS (obj2)
+ && klass->cmd_plobj_id_equal (&obj1->object, &obj2->object);
+}
+
+#define _vt_cmd_plobj_id_equal(type, plat_type, cmd) \
+static gboolean \
+_vt_cmd_plobj_id_equal_##type (const NMPlatformObject *_obj1, const NMPlatformObject *_obj2) \
+{ \
+ const plat_type *const obj1 = (const plat_type *) _obj1; \
+ const plat_type *const obj2 = (const plat_type *) _obj2; \
+ return (cmd); \
+}
+_vt_cmd_plobj_id_equal (link, NMPlatformLink,
+ obj1->ifindex == obj2->ifindex);
+_vt_cmd_plobj_id_equal (ip4_address, NMPlatformIP4Address,
+ obj1->ifindex == obj2->ifindex
+ && obj1->plen == obj2->plen
+ && obj1->address == obj2->address);
+_vt_cmd_plobj_id_equal (ip6_address, NMPlatformIP6Address,
+ obj1->ifindex == obj2->ifindex
+ && obj1->plen == obj2->plen
+ && IN6_ARE_ADDR_EQUAL (&obj1->address, &obj2->address));
+_vt_cmd_plobj_id_equal (ip4_route, NMPlatformIP4Route,
+ obj1->ifindex == obj2->ifindex
+ && obj1->plen == obj2->plen
+ && obj1->metric == obj2->metric
+ && obj1->network == obj2->network);
+_vt_cmd_plobj_id_equal (ip6_route, NMPlatformIP6Route,
+ obj1->ifindex == obj2->ifindex
+ && obj1->plen == obj2->plen
+ && obj1->metric == obj2->metric
+ && IN6_ARE_ADDR_EQUAL( &obj1->network, &obj2->network));
+
+guint
+nmp_object_id_hash (const NMPObject *obj)
+{
+ if (!obj)
+ return 0;
+
+ g_return_val_if_fail (NMP_OBJECT_IS_VALID (obj), 0);
+ return NMP_OBJECT_GET_CLASS (obj)->cmd_plobj_id_hash (&obj->object);
+}
+
+#define _vt_cmd_plobj_id_hash(type, plat_type, cmd) \
+static guint \
+_vt_cmd_plobj_id_hash_##type (const NMPlatformObject *_obj) \
+{ \
+ const plat_type *const obj = (const plat_type *) _obj; \
+ guint hash; \
+ { cmd; } \
+ return hash; \
+}
+_vt_cmd_plobj_id_hash (link, NMPlatformLink, {
+ /* libnl considers:
+ * .oo_id_attrs = LINK_ATTR_IFINDEX | LINK_ATTR_FAMILY,
+ */
+ hash = (guint) 3982791431u;
+ hash = hash + ((guint) obj->ifindex);
+})
+_vt_cmd_plobj_id_hash (ip4_address, NMPlatformIP4Address, {
+ /* libnl considers:
+ * .oo_id_attrs = (ADDR_ATTR_FAMILY | ADDR_ATTR_IFINDEX |
+ * ADDR_ATTR_LOCAL | ADDR_ATTR_PREFIXLEN),
+ */
+ hash = (guint) 3591309853u;
+ hash = hash + ((guint) obj->ifindex);
+ hash = hash * 33 + ((guint) obj->plen);
+ hash = hash * 33 + ((guint) obj->address);
+})
+_vt_cmd_plobj_id_hash (ip6_address, NMPlatformIP6Address, {
+ hash = (guint) 2907861637u;
+ hash = hash + ((guint) obj->ifindex);
+ hash = hash * 33 + ((guint) obj->plen);
+ hash = hash * 33 + _id_hash_ip6_addr (&obj->address);
+})
+_vt_cmd_plobj_id_hash (ip4_route, NMPlatformIP4Route, {
+ /* libnl considers:
+ * .oo_id_attrs = (ROUTE_ATTR_FAMILY | ROUTE_ATTR_TOS |
+ * ROUTE_ATTR_TABLE | ROUTE_ATTR_DST |
+ * ROUTE_ATTR_PRIO),
+ */
+ hash = (guint) 2569857221u;
+ hash = hash + ((guint) obj->ifindex);
+ hash = hash * 33 + ((guint) obj->plen);
+ hash = hash * 33 + ((guint) obj->metric);
+ hash = hash * 33 + ((guint) obj->network);
+})
+_vt_cmd_plobj_id_hash (ip6_route, NMPlatformIP6Route, {
+ hash = (guint) 3999787007u;
+ hash = hash + ((guint) obj->ifindex);
+ hash = hash * 33 + ((guint) obj->plen);
+ hash = hash * 33 + ((guint) obj->metric);
+ hash = hash * 33 + _id_hash_ip6_addr (&obj->network);
+})
+
+gboolean
+nmp_object_is_alive (const NMPObject *obj)
+{
+ /* for convenience, allow NULL. */
+ if (!obj)
+ return FALSE;
+
+ return NMP_OBJECT_GET_CLASS (obj)->cmd_obj_is_alive (obj);
+}
+
+static gboolean
+_vt_cmd_obj_is_alive_link (const NMPObject *obj)
+{
+ return obj->object.ifindex > 0 && (obj->_link.netlink.is_in_netlink || obj->_link.udev.device);
+}
+
+static gboolean
+_vt_cmd_obj_is_alive_ipx_address (const NMPObject *obj)
+{
+ return obj->object.ifindex > 0;
+}
+
+static gboolean
+_vt_cmd_obj_is_alive_ipx_route (const NMPObject *obj)
+{
+ /* We want to ignore routes that are RTM_F_CLONED but we still
+ * let nmp_object_from_nl() create such route objects, instead of
+ * returning NULL right away.
+ *
+ * The idea is, that if we have the same route (according to its id)
+ * in the cache with !RTM_F_CLONED, an update that changes the route
+ * to be RTM_F_CLONED must remove the instance.
+ *
+ * If nmp_object_from_nl() would just return NULL, we couldn't look
+ * into the cache to see if it contains a route that now disappears
+ * (because it is cloned).
+ *
+ * Instead we create a dead object, and nmp_cache_update_netlink()
+ * will remove the old version of the update.
+ **/
+ return obj->object.ifindex > 0 && (obj->ip_route.source != _NM_IP_CONFIG_SOURCE_RTM_F_CLONED);
+}
+
+gboolean
+nmp_object_is_visible (const NMPObject *obj)
+
+{
+ /* for convenience, allow NULL. */
+ if (!obj)
+ return FALSE;
+
+ return NMP_OBJECT_GET_CLASS (obj)->cmd_obj_is_visible (obj);
+}
+
+static gboolean
+_vt_cmd_obj_is_visible_link (const NMPObject *obj)
+{
+ return obj->object.ifindex > 0
+ && obj->_link.netlink.is_in_netlink
+ && obj->link.name[0];
+}
+
+static gboolean
+_vt_cmd_obj_is_visible_ipx_address (const NMPObject *obj)
+{
+ return obj->object.ifindex > 0;
+}
+
+static gboolean
+_vt_cmd_obj_is_visible_ipx_route (const NMPObject *obj)
+{
+ NMIPConfigSource source = obj->ip_route.source;
+
+ return obj->object.ifindex > 0 && source != _NM_IP_CONFIG_SOURCE_RTM_F_CLONED;
+}
+
+/******************************************************************/
+
+/**
+ * nmp_object_from_nl:
+ * @platform: platform instance (needed to lookup sysctl)
+ * @nlo:
+ * @id_only: if %TRUE, only fill the id fields of the object and leave the
+ * other fields unset. This is useful to create a needle to lookup a matching
+ * item in the cache.
+ * @complete_from_cache: sometimes the netlink object doesn't contain all information.
+ * If true, look them up in the cache and preserve the original value.
+ *
+ * Convert a libnl object to a platform object.
+ * Returns: a NMPObject containing @nlo. If @id_only is %TRUE, only the id fields
+ * are defined.
+ **/
+NMPObject *
+nmp_object_from_nl (NMPlatform *platform, const struct nl_object *nlo, gboolean id_only, gboolean complete_from_cache)
+{
+ NMPObjectType obj_type = _nlo_get_object_type (nlo);
+ NMPObject *obj;
+
+ if (obj_type == NMP_OBJECT_TYPE_UNKNOWN)
+ return NULL;
+
+ obj = nmp_object_new (obj_type, NULL);
+
+ if (!NMP_OBJECT_GET_CLASS (obj)->cmd_plobj_init_from_nl (platform, &obj->object, nlo, id_only, complete_from_cache)) {
+ nmp_object_unref (obj);
+ return NULL;
+ }
+ return obj;
+}
+
+struct nl_object *
+nmp_object_to_nl (NMPlatform *platform, const NMPObject *obj, gboolean id_only)
+{
+ return NMP_OBJECT_GET_CLASS (obj)->cmd_plobj_to_nl (platform, &obj->object, id_only);
+}
+
+/******************************************************************/
+
+gboolean
+nmp_cache_id_equal (const NMPCacheId *a, const NMPCacheId *b)
+{
+ /* just memcmp() the entire id. This is potentially dangerous, because
+ * the struct is not __attribute__((packed)) and not all types have the
+ * same size. It is important, to memset() the entire struct to 0,
+ * not only the relevant fields.
+ *
+ * You anyway should use the nmp_cache_id_init_*() functions on a stack-allocated
+ * struct. */
+ return memcmp (a, b, sizeof (NMPCacheId)) == 0;
+}
+
+guint
+nmp_cache_id_hash (const NMPCacheId *id)
+{
+ guint hash = 5381;
+ guint i;
+
+ for (i = 0; i < sizeof (NMPCacheId); i++)
+ hash = ((hash << 5) + hash) + ((char *) id)[i]; /* hash * 33 + c */
+ return hash;
+}
+
+NMPCacheId *
+nmp_cache_id_clone (const NMPCacheId *id)
+{
+ NMPCacheId *id2;
+
+ id2 = g_slice_new (NMPCacheId);
+ memcpy (id2, id, sizeof (NMPCacheId));
+ return id2;
+}
+
+void
+nmp_cache_id_destroy (NMPCacheId *id)
+{
+ g_slice_free (NMPCacheId, id);
+}
+
+/******************************************************************/
+
+NMPCacheId _nmp_cache_id_static;
+
+static NMPCacheId *
+_nmp_cache_id_init (NMPCacheId *id, NMPCacheIdType id_type)
+{
+ memset (id, 0, sizeof (NMPCacheId));
+ id->_id_type = id_type;
+ return id;
+}
+
+NMPCacheId *
+nmp_cache_id_init_object_type (NMPCacheId *id, NMPObjectType obj_type, gboolean visible_only)
+{
+ _nmp_cache_id_init (id, visible_only
+ ? NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY
+ : NMP_CACHE_ID_TYPE_OBJECT_TYPE);
+ id->object_type.obj_type = obj_type;
+ return id;
+}
+
+NMPCacheId *
+nmp_cache_id_init_addrroute_visible_by_ifindex (NMPCacheId *id,
+ NMPObjectType obj_type,
+ int ifindex)
+{
+ g_return_val_if_fail (NM_IN_SET (obj_type,
+ NMP_OBJECT_TYPE_IP4_ADDRESS, NMP_OBJECT_TYPE_IP4_ROUTE,
+ NMP_OBJECT_TYPE_IP6_ADDRESS, NMP_OBJECT_TYPE_IP6_ROUTE), NULL);
+
+ if (ifindex <= 0)
+ return nmp_cache_id_init_object_type (id, obj_type, TRUE);
+
+ _nmp_cache_id_init (id, NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX);
+ id->object_type_by_ifindex.obj_type = obj_type;
+ id->object_type_by_ifindex.ifindex = ifindex;
+ return id;
+}
+
+NMPCacheId *
+nmp_cache_id_init_routes_visible (NMPCacheId *id,
+ NMPObjectType obj_type,
+ gboolean with_default,
+ gboolean with_non_default,
+ int ifindex)
+{
+ g_return_val_if_fail (NM_IN_SET (obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE), NULL);
+
+ if (with_default && with_non_default) {
+ if (ifindex <= 0)
+ return nmp_cache_id_init_object_type (id, obj_type, TRUE);
+ return nmp_cache_id_init_addrroute_visible_by_ifindex (id, obj_type, ifindex);
+ }
+
+ if (with_default)
+ _nmp_cache_id_init (id, NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT);
+ else if (with_non_default)
+ _nmp_cache_id_init (id, NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT);
+ else
+ g_return_val_if_reached (NULL);
+
+ id->object_type_by_ifindex.obj_type = obj_type;
+ id->object_type_by_ifindex.ifindex = ifindex;
+ return id;
+}
+
+/******************************************************************/
+
+static gboolean
+_nmp_object_init_cache_id (const NMPObject *obj, NMPCacheIdType id_type, NMPCacheId *id, const NMPCacheId **out_id)
+{
+ const NMPClass *klass = NMP_OBJECT_GET_CLASS (obj);
+
+ switch (id_type) {
+ case NMP_CACHE_ID_TYPE_OBJECT_TYPE:
+ *out_id = nmp_cache_id_init_object_type (id, klass->obj_type, FALSE);
+ return TRUE;
+ case NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY:
+ if (nmp_object_is_visible (obj))
+ *out_id = nmp_cache_id_init_object_type (id, klass->obj_type, TRUE);
+ else
+ *out_id = NULL;
+ return TRUE;
+ default:
+ return klass->cmd_obj_init_cache_id (obj, id_type, id, out_id);
+ }
+}
+
+static gboolean
+_vt_cmd_obj_init_cache_id_link (const NMPObject *obj, NMPCacheIdType id_type, NMPCacheId *id, const NMPCacheId **out_id)
+{
+ return FALSE;
+}
+
+static gboolean
+_vt_cmd_obj_init_cache_id_ipx_address (const NMPObject *obj, NMPCacheIdType id_type, NMPCacheId *id, const NMPCacheId **out_id)
+{
+ switch (id_type) {
+ case NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX:
+ if (_vt_cmd_obj_is_visible_ipx_address (obj)) {
+ nm_assert (obj->object.ifindex > 0);
+ *out_id = nmp_cache_id_init_addrroute_visible_by_ifindex (id, NMP_OBJECT_GET_TYPE (obj), obj->object.ifindex);
+ return TRUE;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ *out_id = NULL;
+ return TRUE;
+}
+
+static gboolean
+_vt_cmd_obj_init_cache_id_ipx_route (const NMPObject *obj, NMPCacheIdType id_type, NMPCacheId *id, const NMPCacheId **out_id)
+{
+ switch (id_type) {
+ case NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX:
+ if (_vt_cmd_obj_is_visible_ipx_route (obj)) {
+ nm_assert (obj->object.ifindex > 0);
+ *out_id = nmp_cache_id_init_addrroute_visible_by_ifindex (id, NMP_OBJECT_GET_TYPE (obj), obj->object.ifindex);
+ return TRUE;
+ }
+ break;
+ case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT:
+ if ( _vt_cmd_obj_is_visible_ipx_route (obj)
+ && !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj->ip_route)) {
+ nm_assert (obj->object.ifindex > 0);
+ *out_id = nmp_cache_id_init_routes_visible (id, NMP_OBJECT_GET_TYPE (obj), FALSE, TRUE, 0);
+ return TRUE;
+ }
+ break;
+ case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT:
+ if ( _vt_cmd_obj_is_visible_ipx_route (obj)
+ && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj->ip_route)) {
+ nm_assert (obj->object.ifindex > 0);
+ *out_id = nmp_cache_id_init_routes_visible (id, NMP_OBJECT_GET_TYPE (obj), TRUE, FALSE, 0);
+ return TRUE;
+ }
+ break;
+ case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT:
+ if ( _vt_cmd_obj_is_visible_ipx_route (obj)
+ && !NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj->ip_route)) {
+ nm_assert (obj->object.ifindex > 0);
+ *out_id = nmp_cache_id_init_routes_visible (id, NMP_OBJECT_GET_TYPE (obj), FALSE, TRUE, obj->object.ifindex);
+ return TRUE;
+ }
+ break;
+ case NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT:
+ if ( _vt_cmd_obj_is_visible_ipx_route (obj)
+ && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&obj->ip_route)) {
+ nm_assert (obj->object.ifindex > 0);
+ *out_id = nmp_cache_id_init_routes_visible (id, NMP_OBJECT_GET_TYPE (obj), TRUE, FALSE, obj->object.ifindex);
+ return TRUE;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ *out_id = NULL;
+ return TRUE;
+}
+
+/******************************************************************/
+
+gboolean
+nmp_cache_use_udev_detect ()
+{
+ return access ("/sys", W_OK) == 0;
+}
+
+gboolean
+nmp_cache_use_udev_get (const NMPCache *cache)
+{
+ g_return_val_if_fail (cache, TRUE);
+
+ return cache->use_udev;
+}
+
+gboolean
+nmp_cache_use_udev_set (NMPCache *cache, gboolean use_udev)
+{
+ g_return_val_if_fail (cache, FALSE);
+
+ use_udev = !!use_udev;
+ if (use_udev == cache->use_udev)
+ return FALSE;
+
+ cache->use_udev = use_udev;
+ return TRUE;
+}
+
+/******************************************************************/
+
+/**
+ * nmp_cache_link_connected_needs_toggle:
+ * @cache: the platform cache
+ * @master: the link object, that is checked whether its connected property
+ * needs to be toggled.
+ * @potential_slave: (allow-none): an additional link object that is treated
+ * as if it was inside @cache. If given, it shaddows a link in the cache
+ * with the same ifindex.
+ * @ignore_slave: (allow-none): if set, the check will pretend that @ignore_slave
+ * is not in the cache.
+ *
+ * NMPlatformLink has two connected flags: (master->link.flags&IFF_LOWER_UP) (as reported
+ * from netlink) and master->link.connected. For bond and bridge master, kernel reports
+ * those links as IFF_LOWER_UP if they have no slaves attached. We want to present instead
+ * a combined @connected flag that shows masters without slaves as down.
+ *
+ * Check if the connected flag of @master should be toggled according to the content
+ * of @cache (including @potential_slave).
+ *
+ * Returns: %TRUE, if @master->link.connected should be flipped/toggled.
+ **/
+gboolean
+nmp_cache_link_connected_needs_toggle (const NMPCache *cache, const NMPObject *master, const NMPObject *potential_slave, const NMPObject *ignore_slave)
+{
+ const NMPlatformLink *const *links;
+ gboolean is_lower_up = FALSE;
+ guint len, i;
+
+ if ( !master
+ || NMP_OBJECT_GET_TYPE (master) != NMP_OBJECT_TYPE_LINK
+ || master->link.ifindex <= 0
+ || !nmp_object_is_visible (master)
+ || !NM_IN_SET (master->link.type, NM_LINK_TYPE_BRIDGE, NM_LINK_TYPE_BOND))
+ return FALSE;
+
+ /* if native IFF_LOWER_UP is down, link.connected must also be down
+ * regardless of the slaves. */
+ if (!NM_FLAGS_HAS (master->link.flags, IFF_LOWER_UP))
+ return !!master->link.connected;
+
+ if (potential_slave && NMP_OBJECT_GET_TYPE (potential_slave) != NMP_OBJECT_TYPE_LINK)
+ potential_slave = NULL;
+
+ if ( potential_slave
+ && nmp_object_is_visible (potential_slave)
+ && potential_slave->link.ifindex > 0
+ && potential_slave->link.master == master->link.ifindex
+ && potential_slave->link.connected) {
+ is_lower_up = TRUE;
+ } else {
+ links = (const NMPlatformLink *const *) nmp_cache_lookup_multi (cache, nmp_cache_id_init_object_type (NMP_CACHE_ID_STATIC, NMP_OBJECT_TYPE_LINK, FALSE), &len);
+ for (i = 0; i < len; i++) {
+ const NMPlatformLink *link = links[i];
+ const NMPObject *obj = NMP_OBJECT_UP_CAST ((NMPlatformObject *) link);
+
+ nm_assert (NMP_OBJECT_GET_TYPE (NMP_OBJECT_UP_CAST ((NMPlatformObject *) link)) == NMP_OBJECT_TYPE_LINK);
+
+ if ( (!potential_slave || potential_slave->link.ifindex != link->ifindex)
+ && ignore_slave != obj
+ && link->ifindex > 0
+ && link->master == master->link.ifindex
+ && nmp_object_is_visible (obj)
+ && link->connected) {
+ is_lower_up = TRUE;
+ break;
+ }
+ }
+ }
+ return !!master->link.connected != is_lower_up;
+}
+
+/**
+ * nmp_cache_link_connected_needs_toggle_by_ifindex:
+ * @cache:
+ * @master_ifindex: the ifindex of a potential master that should be checked
+ * whether it needs toggling.
+ * @potential_slave: (allow-none): passed to nmp_cache_link_connected_needs_toggle().
+ * It considers @potential_slave as being inside the cache, replacing an existing
+ * link with the same ifindex.
+ * @ignore_slave: (allow-onne): passed to nmp_cache_link_connected_needs_toggle().
+ *
+ * The flag obj->link.connected depends on the state of other links in the
+ * @cache. See also nmp_cache_link_connected_needs_toggle(). Given an ifindex
+ * of a master, check if the cache contains such a master link that needs
+ * toogling of the connected flag.
+ *
+ * Returns: NULL if there is no master link with ifindex @master_ifindex that should be toggled.
+ * Otherwise, return the link object from inside the cache with the given ifindex.
+ * The connected flag of that master should be toggled.
+ */
+const NMPObject *
+nmp_cache_link_connected_needs_toggle_by_ifindex (const NMPCache *cache, int master_ifindex, const NMPObject *potential_slave, const NMPObject *ignore_slave)
+{
+ const NMPObject *master;
+
+ if (master_ifindex > 0) {
+ master = nmp_cache_lookup_link (cache, master_ifindex);
+ if (nmp_cache_link_connected_needs_toggle (cache, master, potential_slave, ignore_slave))
+ return master;
+ }
+ return NULL;
+}
+
+/******************************************************************/
+
+const NMPlatformObject *const *
+nmp_cache_lookup_multi (const NMPCache *cache, const NMPCacheId *cache_id, guint *out_len)
+{
+ return (const NMPlatformObject *const *) nm_multi_index_lookup (cache->idx_multi,
+ (const NMMultiIndexId *) cache_id,
+ out_len);
+}
+
+GArray *
+nmp_cache_lookup_multi_to_array (const NMPCache *cache, NMPObjectType obj_type, const NMPCacheId *cache_id)
+{
+ const NMPClass *klass = nmp_class_from_type (obj_type);
+ guint len, i;
+ const NMPlatformObject *const *objects;
+ GArray *array;
+
+ g_return_val_if_fail (klass, NULL);
+
+ objects = nmp_cache_lookup_multi (cache, cache_id, &len);
+ array = g_array_sized_new (FALSE, FALSE, klass->sizeof_public, len);
+
+ for (i = 0; i < len; i++) {
+ nm_assert (NMP_OBJECT_GET_CLASS (NMP_OBJECT_UP_CAST (objects[i])) == klass);
+ g_array_append_vals (array, objects[i], 1);
+ }
+ return array;
+}
+
+const NMPObject *
+nmp_cache_lookup_obj (const NMPCache *cache, const NMPObject *obj)
+{
+ g_return_val_if_fail (obj, NULL);
+
+ return g_hash_table_lookup (cache->idx_main, obj);
+}
+
+const NMPObject *
+nmp_cache_lookup_link (const NMPCache *cache, int ifindex)
+{
+ NMPObject obj_needle;
+
+ return nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&obj_needle, ifindex));
+}
+
+const NMPObject *
+nmp_cache_lookup_link_full (const NMPCache *cache,
+ int ifindex,
+ const char *ifname,
+ gboolean visible_only,
+ NMLinkType link_type,
+ NMPObjectMatchFn match_fn,
+ gpointer user_data)
+{
+ NMPObject obj_needle;
+ const NMPObject *obj;
+ const NMPlatformObject *const *list;
+ guint i, len;
+ NMPCacheId cache_id;
+
+ if (ifindex > 0) {
+ obj = nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&obj_needle, ifindex));
+
+ if ( !obj
+ || (visible_only && !nmp_object_is_visible (obj))
+ || (link_type != NM_LINK_TYPE_NONE && obj->link.type != link_type)
+ || (ifname && strcmp (obj->link.name, ifname))
+ || (match_fn && !match_fn (obj, user_data)))
+ return NULL;
+ return obj;
+ } else if (!ifname && !match_fn)
+ return NULL;
+ else {
+ list = nmp_cache_lookup_multi (cache, nmp_cache_id_init_object_type (&cache_id, NMP_OBJECT_TYPE_LINK, visible_only), &len);
+ for (i = 0; i < len; i++) {
+ obj = NMP_OBJECT_UP_CAST (list[i]);
+
+ if (link_type != NM_LINK_TYPE_NONE && obj->link.type != link_type)
+ continue;
+ if (ifname && strcmp (ifname, obj->link.name))
+ continue;
+ if (match_fn && !match_fn (obj, user_data))
+ continue;
+
+ return obj;
+ }
+ return NULL;
+ }
+}
+
+GHashTable *
+nmp_cache_lookup_all_to_hash (const NMPCache *cache,
+ NMPCacheId *cache_id,
+ GHashTable *hash)
+{
+ NMMultiIndexIdIter iter;
+ gpointer plobj;
+
+ nm_multi_index_id_iter_init (&iter, cache->idx_multi, (const NMMultiIndexId *) cache_id);
+
+ if (nm_multi_index_id_iter_next (&iter, &plobj)) {
+ if (!hash)
+ hash = g_hash_table_new_full (NULL, NULL, (GDestroyNotify) nmp_object_unref, NULL);
+
+ do {
+ g_hash_table_add (hash, nmp_object_ref (NMP_OBJECT_UP_CAST (plobj)));
+ } while (nm_multi_index_id_iter_next (&iter, &plobj));
+ }
+
+ return hash;
+}
+
+/******************************************************************/
+
+static void
+_nmp_cache_update_cache (NMPCache *cache, NMPObject *obj, gboolean remove)
+{
+ NMPCacheIdType id_type;
+
+ for (id_type = 0; id_type <= NMP_CACHE_ID_TYPE_MAX; id_type++) {
+ NMPCacheId cache_id_storage;
+ const NMPCacheId *cache_id;
+
+ if (!_nmp_object_init_cache_id (obj, id_type, &cache_id_storage, &cache_id))
+ continue;
+ if (!cache_id)
+ continue;
+
+ /* We don't put @obj itself into the multi index, but &obj->object. As of now, all
+ * users expect a pointer to NMPlatformObject, not NMPObject.
+ * You can use NMP_OBJECT_UP_CAST() to retrieve the original @obj pointer.
+ *
+ * If need be, we could determine based on @id_type which pointer we want to store. */
+
+ if (remove) {
+ if (!nm_multi_index_remove (cache->idx_multi, &cache_id->base, &obj->object))
+ g_assert_not_reached ();
+ } else {
+ if (!nm_multi_index_add (cache->idx_multi, &cache_id->base, &obj->object))
+ g_assert_not_reached ();
+ }
+ }
+}
+
+static void
+_nmp_cache_update_add (NMPCache *cache, NMPObject *obj)
+{
+ nm_assert (!obj->is_cached);
+ nmp_object_ref (obj);
+ nm_assert (!nm_multi_index_lookup_first_by_value (cache->idx_multi, &obj->object));
+#if GLIB_CHECK_VERSION(2, 40, 0)
+ if (!g_hash_table_add (cache->idx_main, obj))
+ g_assert_not_reached ();
+#else
+ g_hash_table_add (cache->idx_main, obj);
+#endif
+ obj->is_cached = TRUE;
+ _nmp_cache_update_cache (cache, obj, FALSE);
+}
+
+static void
+_nmp_cache_update_remove (NMPCache *cache, NMPObject *obj)
+{
+ nm_assert (obj->is_cached);
+ _nmp_cache_update_cache (cache, obj, TRUE);
+ obj->is_cached = FALSE;
+ if (!g_hash_table_remove (cache->idx_main, obj))
+ g_assert_not_reached ();
+
+ /* @obj is possibly a dangling pointer at this point. No problem, multi-index doesn't dereference. */
+ nm_assert (!nm_multi_index_lookup_first_by_value (cache->idx_multi, &obj->object));
+}
+
+static void
+_nmp_cache_update_update (NMPCache *cache, NMPObject *obj, const NMPObject *new)
+{
+ NMPCacheIdType id_type;
+
+ nm_assert (NMP_OBJECT_GET_CLASS (obj) == NMP_OBJECT_GET_CLASS (new));
+ nm_assert (obj->is_cached);
+ nm_assert (!new->is_cached);
+
+ for (id_type = 0; id_type <= NMP_CACHE_ID_TYPE_MAX; id_type++) {
+ NMPCacheId cache_id_storage_obj, cache_id_storage_new;
+ const NMPCacheId *cache_id_obj, *cache_id_new;
+
+ if (!_nmp_object_init_cache_id (obj, id_type, &cache_id_storage_obj, &cache_id_obj))
+ continue;
+ if (!_nmp_object_init_cache_id (new, id_type, &cache_id_storage_new, &cache_id_new))
+ g_assert_not_reached ();
+ if (!nm_multi_index_move (cache->idx_multi, (NMMultiIndexId *) cache_id_obj, (NMMultiIndexId *) cache_id_new, &obj->object))
+ g_assert_not_reached ();
+ }
+ nmp_object_copy (obj, new, FALSE);
+}
+
+NMPCacheOpsType
+nmp_cache_remove (NMPCache *cache, const NMPObject *obj, gboolean equals_by_ptr, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data)
+{
+ NMPObject *old;
+
+ nm_assert (NMP_OBJECT_IS_VALID (obj));
+
+ old = g_hash_table_lookup (cache->idx_main, obj);
+ if (!old) {
+ if (out_obj)
+ *out_obj = NULL;
+ if (out_was_visible)
+ *out_was_visible = FALSE;
+ return NMP_CACHE_OPS_UNCHANGED;
+ }
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (old);
+ if (out_was_visible)
+ *out_was_visible = nmp_object_is_visible (old);
+ if (equals_by_ptr && old != obj) {
+ /* We found an identical object, but we only delete it if it's the same pointer as
+ * @obj. */
+ return NMP_CACHE_OPS_UNCHANGED;
+ }
+ if (pre_hook)
+ pre_hook (cache, old, NULL, NMP_CACHE_OPS_REMOVED, user_data);
+ _nmp_cache_update_remove (cache, old);
+ return NMP_CACHE_OPS_REMOVED;
+}
+
+NMPCacheOpsType
+nmp_cache_remove_netlink (NMPCache *cache, const NMPObject *obj_needle, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data)
+{
+ if (NMP_OBJECT_GET_TYPE (obj_needle) == NMP_OBJECT_TYPE_LINK) {
+ NMPObject *old;
+ auto_nmp_obj NMPObject *obj = NULL;
+
+ /* For nmp_cache_remove_netlink() we have an incomplete @obj_needle instance to be
+ * removed from netlink. Link objects are alive without being in netlink when they
+ * have a udev-device. All we want to do in this case is clear the netlink.is_in_netlink
+ * flag. */
+
+ old = (NMPObject *) nmp_cache_lookup_link (cache, obj_needle->link.ifindex);
+ if (!old) {
+ if (out_obj)
+ *out_obj = NULL;
+ if (out_was_visible)
+ *out_was_visible = FALSE;
+ return NMP_CACHE_OPS_UNCHANGED;
+ }
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (old);
+ if (out_was_visible)
+ *out_was_visible = nmp_object_is_visible (old);
+
+ if (!old->_link.netlink.is_in_netlink) {
+ nm_assert (old->_link.udev.device);
+ return NMP_CACHE_OPS_UNCHANGED;
+ }
+
+ if (!old->_link.udev.device) {
+ /* the update would make @old invalid. Remove it. */
+ if (pre_hook)
+ pre_hook (cache, old, NULL, NMP_CACHE_OPS_REMOVED, user_data);
+ _nmp_cache_update_remove (cache, old);
+ return NMP_CACHE_OPS_REMOVED;
+ }
+
+ obj = nmp_object_clone (old, FALSE);
+ obj->_link.netlink.is_in_netlink = FALSE;
+
+ _nmp_object_fixup_link_master_connected (obj, cache);
+ _nmp_object_fixup_link_udev_fields (obj, cache->use_udev);
+
+ if (pre_hook)
+ pre_hook (cache, old, obj, NMP_CACHE_OPS_UPDATED, user_data);
+ _nmp_cache_update_update (cache, old, obj);
+ return NMP_CACHE_OPS_UPDATED;
+ } else
+ return nmp_cache_remove (cache, obj_needle, FALSE, out_obj, out_was_visible, pre_hook, user_data);
+}
+
+/**
+ * nmp_cache_update_netlink:
+ * @cache: the platform cache
+ * @obj: a #NMPObject instance as received from netlink and created via
+ * nmp_object_from_nl(). Especially for link, it must not have the udev
+ * replated fields set.
+ * This instance will be modified and might be put into the cache. When
+ * calling nmp_cache_update_netlink() you hand @obj over to the cache.
+ * Except, that the cache will increment the ref count as appropriate. You
+ * must still unref the obj to release your part of the ownership.
+ * @out_obj: (allow-none): (out): return the object instance that is inside
+ * the cache. If you specify non %NULL, you must always unref the returned
+ * instance. If the return value indicates that the object was removed,
+ * the object is no longer in the cache. Even if the return value indicates
+ * that the object was unchanged, it will still return @out_obj -- if
+ * such an object is in the cache.
+ * @out_was_visible: (allow-none): (out): whether the object was visible before
+ * the update operation.
+ * @pre_hook: (allow-none): a callback *before* the object gets updated. You cannot
+ * influence the outcome and must not do anything beyong inspecting the changes.
+ * @user_data:
+ *
+ * Returns: how the cache changed.
+ **/
+NMPCacheOpsType
+nmp_cache_update_netlink (NMPCache *cache, NMPObject *obj, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data)
+{
+ NMPObject *old;
+
+ nm_assert (NMP_OBJECT_IS_VALID (obj));
+ nm_assert (!NMP_OBJECT_IS_STACKINIT (obj));
+ nm_assert (!obj->is_cached);
+
+ /* A link object from netlink must have the udev related fields unset.
+ * We could implement to handle that, but there is no need to support such
+ * a use-case */
+ nm_assert (NMP_OBJECT_GET_TYPE (obj) != NMP_OBJECT_TYPE_LINK ||
+ ( !obj->_link.udev.device
+ && !obj->link.driver));
+
+ old = g_hash_table_lookup (cache->idx_main, obj);
+
+ if (out_obj)
+ *out_obj = NULL;
+ if (out_was_visible)
+ *out_was_visible = FALSE;
+
+ if (!old) {
+ if (!nmp_object_is_alive (obj))
+ return NMP_CACHE_OPS_UNCHANGED;
+
+ if (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK) {
+ _nmp_object_fixup_link_master_connected (obj, cache);
+ _nmp_object_fixup_link_udev_fields (obj, cache->use_udev);
+ }
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (obj);
+
+ if (pre_hook)
+ pre_hook (cache, NULL, obj, NMP_CACHE_OPS_ADDED, user_data);
+ _nmp_cache_update_add (cache, obj);
+ return NMP_CACHE_OPS_ADDED;
+ } else if (old == obj) {
+ /* updating a cached object inplace is not supported because the object contributes to hash-key
+ * for NMMultiIndex. Modifying an object that is inside NMMultiIndex means that these
+ * keys change.
+ * The problem is, that for a given object NMMultiIndex does not support (efficient)
+ * reverse lookup to get all the NMPCacheIds to which it belongs. If that would be implemented,
+ * it would be possible to implement inplace-update.
+ *
+ * There is an un-optimized reverse lookup via nm_multi_index_iter_init(), but we don't want
+ * that because we might have a large number of indexes to search.
+ *
+ * We could add efficient reverse lookup by adding a reverse index to NMMultiIndex. But that
+ * also adds some cost to support an (uncommon?) usage pattern.
+ *
+ * Instead we just don't support it. Actually, we expect the user to
+ * create a new instance with nmp_object_from_nl(). That is what nmp_cache_update_netlink().
+ *
+ * TL;DR: a cached object must never be modified.
+ */
+ g_assert_not_reached ();
+ } else {
+ gboolean is_alive = FALSE;
+
+ nm_assert (old->is_cached);
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (old);
+ if (out_was_visible)
+ *out_was_visible = nmp_object_is_visible (old);
+
+ if (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_LINK) {
+ if (!obj->_link.netlink.is_in_netlink) {
+ if (!old->_link.netlink.is_in_netlink) {
+ nm_assert (old->_link.udev.device);
+ return NMP_CACHE_OPS_UNCHANGED;
+ }
+ if (old->_link.udev.device) {
+ /* @obj is not in netlink.
+ *
+ * This is similar to nmp_cache_remove_netlink(), but there we preserve the
+ * preexisting netlink properties. The use case of that is when kernel_get_object()
+ * cannot load an object (based on the id of a needle).
+ *
+ * Here we keep the data provided from @obj. The usecase is when receiving
+ * a valid @obj instance from netlink with RTM_DELROUTE.
+ */
+ is_alive = TRUE;
+ }
+ } else
+ is_alive = TRUE;
+
+ if (is_alive) {
+ _nmp_object_fixup_link_master_connected (obj, cache);
+
+ /* Merge the netlink parts with what we have from udev. */
+ g_clear_object (&obj->_link.udev.device);
+ obj->_link.udev.device = old->_link.udev.device ? g_object_ref (old->_link.udev.device) : NULL;
+ _nmp_object_fixup_link_udev_fields (obj, cache->use_udev);
+ }
+ } else
+ is_alive = nmp_object_is_alive (obj);
+
+ if (!is_alive) {
+ /* the update would make @old invalid. Remove it. */
+ if (pre_hook)
+ pre_hook (cache, old, NULL, NMP_CACHE_OPS_REMOVED, user_data);
+ _nmp_cache_update_remove (cache, old);
+ return NMP_CACHE_OPS_REMOVED;
+ }
+
+ if (nmp_object_equal (old, obj))
+ return NMP_CACHE_OPS_UNCHANGED;
+
+ if (pre_hook)
+ pre_hook (cache, old, obj, NMP_CACHE_OPS_UPDATED, user_data);
+ _nmp_cache_update_update (cache, old, obj);
+ return NMP_CACHE_OPS_UPDATED;
+ }
+}
+
+NMPCacheOpsType
+nmp_cache_update_link_udev (NMPCache *cache, int ifindex, GUdevDevice *udev_device, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data)
+{
+ NMPObject *old;
+ auto_nmp_obj NMPObject *obj = NULL;
+
+ old = (NMPObject *) nmp_cache_lookup_link (cache, ifindex);
+
+ if (out_obj)
+ *out_obj = NULL;
+ if (out_was_visible)
+ *out_was_visible = FALSE;
+
+ if (!old) {
+ if (!udev_device)
+ return NMP_CACHE_OPS_UNCHANGED;
+
+ obj = nmp_object_new (NMP_OBJECT_TYPE_LINK, NULL);
+ obj->link.ifindex = ifindex;
+ obj->_link.udev.device = g_object_ref (udev_device);
+
+ _nmp_object_fixup_link_udev_fields (obj, cache->use_udev);
+
+ nm_assert (nmp_object_is_alive (obj));
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (obj);
+
+ if (pre_hook)
+ pre_hook (cache, NULL, obj, NMP_CACHE_OPS_ADDED, user_data);
+ _nmp_cache_update_add (cache, obj);
+ return NMP_CACHE_OPS_ADDED;
+ } else {
+ nm_assert (old->is_cached);
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (old);
+ if (out_was_visible)
+ *out_was_visible = nmp_object_is_visible (old);
+
+ if (old->_link.udev.device == udev_device)
+ return NMP_CACHE_OPS_UNCHANGED;
+
+ if (!udev_device && !old->_link.netlink.is_in_netlink) {
+ /* the update would make @old invalid. Remove it. */
+ if (pre_hook)
+ pre_hook (cache, old, NULL, NMP_CACHE_OPS_REMOVED, user_data);
+ _nmp_cache_update_remove (cache, old);
+ return NMP_CACHE_OPS_REMOVED;
+ }
+
+ obj = nmp_object_clone (old, FALSE);
+
+ g_clear_object (&obj->_link.udev.device);
+ obj->_link.udev.device = udev_device ? g_object_ref (udev_device) : NULL;
+
+ _nmp_object_fixup_link_udev_fields (obj, cache->use_udev);
+
+ nm_assert (nmp_object_is_alive (obj));
+
+ if (pre_hook)
+ pre_hook (cache, old, obj, NMP_CACHE_OPS_UPDATED, user_data);
+ _nmp_cache_update_update (cache, old, obj);
+ return NMP_CACHE_OPS_UPDATED;
+ }
+}
+
+NMPCacheOpsType
+nmp_cache_update_link_master_connected (NMPCache *cache, int ifindex, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data)
+{
+ NMPObject *old;
+ auto_nmp_obj NMPObject *obj = NULL;
+
+ old = (NMPObject *) nmp_cache_lookup_link (cache, ifindex);
+
+ if (!old) {
+ if (out_obj)
+ *out_obj = NULL;
+ if (out_was_visible)
+ *out_was_visible = FALSE;
+
+ return NMP_CACHE_OPS_UNCHANGED;
+ }
+
+ nm_assert (old->is_cached);
+
+ if (out_obj)
+ *out_obj = nmp_object_ref (old);
+ if (out_was_visible)
+ *out_was_visible = nmp_object_is_visible (old);
+
+ if (!nmp_cache_link_connected_needs_toggle (cache, old, NULL, NULL))
+ return NMP_CACHE_OPS_UNCHANGED;
+
+ obj = nmp_object_clone (old, FALSE);
+ obj->link.connected = !old->link.connected;
+
+ nm_assert (nmp_object_is_alive (obj));
+
+ if (pre_hook)
+ pre_hook (cache, old, obj, NMP_CACHE_OPS_UPDATED, user_data);
+ _nmp_cache_update_update (cache, old, obj);
+ return NMP_CACHE_OPS_UPDATED;
+}
+
+/******************************************************************/
+
+NMPCache *
+nmp_cache_new ()
+{
+ NMPCache *cache = g_new (NMPCache, 1);
+
+ cache->idx_main = g_hash_table_new_full ((GHashFunc) nmp_object_id_hash,
+ (GEqualFunc) nmp_object_id_equal,
+ (GDestroyNotify) nmp_object_unref,
+ NULL);
+ cache->idx_multi = nm_multi_index_new ((NMMultiIndexFuncHash) nmp_cache_id_hash,
+ (NMMultiIndexFuncEqual) nmp_cache_id_equal,
+ (NMMultiIndexFuncClone) nmp_cache_id_clone,
+ (NMMultiIndexFuncDestroy) nmp_cache_id_destroy);
+ cache->use_udev = nmp_cache_use_udev_detect ();
+ return cache;
+}
+
+void
+nmp_cache_free (NMPCache *cache)
+{
+ GHashTableIter iter;
+ NMPObject *obj;
+
+ /* No need to cumbersomely remove the objects properly. They are not hooked up
+ * in a complicated way, we can just unref them together with cache->idx_main.
+ *
+ * But we must clear the @is_cached flag. */
+ g_hash_table_iter_init (&iter, cache->idx_main);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &obj, NULL)) {
+ nm_assert (obj->is_cached);
+ obj->is_cached = FALSE;
+ }
+
+ nm_multi_index_free (cache->idx_multi);
+ g_hash_table_unref (cache->idx_main);
+
+ g_free (cache);
+}
+
+/******************************************************************/
+
+void
+ASSERT_nmp_cache_is_consistent (const NMPCache *cache)
+{
+#ifdef NM_MORE_ASSERTS
+ NMMultiIndexIter iter_multi;
+ GHashTableIter iter_hash;
+ guint i, len;
+ NMPCacheId cache_id_storage;
+ const NMPCacheId *cache_id, *cache_id2;
+ const NMPlatformObject *const *objects;
+ const NMPObject *obj;
+
+ g_assert (cache);
+
+ g_hash_table_iter_init (&iter_hash, cache->idx_main);
+ while (g_hash_table_iter_next (&iter_hash, (gpointer *) &obj, NULL)) {
+ NMPCacheIdType id_type;
+
+ g_assert (NMP_OBJECT_IS_VALID (obj));
+ g_assert (nmp_object_is_alive (obj));
+
+ for (id_type = 0; id_type <= NMP_CACHE_ID_TYPE_MAX; id_type++) {
+ if (!_nmp_object_init_cache_id (obj, id_type, &cache_id_storage, &cache_id))
+ continue;
+ if (!cache_id)
+ continue;
+ g_assert (nm_multi_index_contains (cache->idx_multi, &cache_id->base, &obj->object));
+ }
+ }
+
+ nm_multi_index_iter_init (&iter_multi, cache->idx_multi, NULL);
+ while (nm_multi_index_iter_next (&iter_multi,
+ (const NMMultiIndexId **) &cache_id,
+ (void *const**) &objects,
+ &len)) {
+ g_assert (len > 0 && objects && objects[len] == NULL);
+
+ for (i = 0; i < len; i++) {
+ g_assert (objects[i]);
+ obj = NMP_OBJECT_UP_CAST (objects[i]);
+ g_assert (NMP_OBJECT_IS_VALID (obj));
+
+ /* for now, enforce that all objects for a certain index are of the same type. */
+ g_assert (NMP_OBJECT_GET_CLASS (obj) == NMP_OBJECT_GET_CLASS (NMP_OBJECT_UP_CAST (objects[0])));
+
+ if (!_nmp_object_init_cache_id (obj, cache_id->_id_type, &cache_id_storage, &cache_id2))
+ g_assert_not_reached ();
+ g_assert (cache_id2);
+ g_assert (nmp_cache_id_equal (cache_id, cache_id2));
+ g_assert_cmpint (nmp_cache_id_hash (cache_id), ==, nmp_cache_id_hash (cache_id2));
+
+ g_assert (obj == g_hash_table_lookup (cache->idx_main, obj));
+ }
+ }
+#endif
+}
+/******************************************************************/
+
+const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX] = {
+ [NMP_OBJECT_TYPE_LINK - 1] = {
+ .obj_type = NMP_OBJECT_TYPE_LINK,
+ .sizeof_data = sizeof (NMPObjectLink),
+ .sizeof_public = sizeof (NMPlatformLink),
+ .obj_type_name = "link",
+ .nl_type = "route/link",
+ .addr_family = AF_UNSPEC,
+ .rtm_gettype = RTM_GETLINK,
+ .signal_type = NM_PLATFORM_SIGNAL_LINK_CHANGED,
+ .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_link,
+ .cmd_obj_equal = _vt_cmd_obj_equal_link,
+ .cmd_obj_copy = _vt_cmd_obj_copy_link,
+ .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_link,
+ .cmd_obj_dispose = _vt_cmd_obj_dispose_link,
+ .cmd_obj_is_alive = _vt_cmd_obj_is_alive_link,
+ .cmd_obj_is_visible = _vt_cmd_obj_is_visible_link,
+ .cmd_plobj_init_from_nl = _nmp_vt_cmd_plobj_init_from_nl_link,
+ .cmd_plobj_to_nl = _nmp_vt_cmd_plobj_to_nl_link,
+ .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_link,
+ .cmd_plobj_id_equal = _vt_cmd_plobj_id_equal_link,
+ .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_link,
+ .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_link,
+ .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj)) nm_platform_link_to_string,
+ .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_link_cmp,
+ },
+ [NMP_OBJECT_TYPE_IP4_ADDRESS - 1] = {
+ .obj_type = NMP_OBJECT_TYPE_IP4_ADDRESS,
+ .sizeof_data = sizeof (NMPObjectIP4Address),
+ .sizeof_public = sizeof (NMPlatformIP4Address),
+ .obj_type_name = "ip4-address",
+ .nl_type = "route/addr",
+ .addr_family = AF_INET,
+ .rtm_gettype = RTM_GETADDR,
+ .signal_type = NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
+ .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_address,
+ .cmd_obj_equal = _vt_cmd_obj_equal_plain,
+ .cmd_obj_copy = _vt_cmd_obj_copy_plain,
+ .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip4_address,
+ .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_address,
+ .cmd_obj_is_visible = _vt_cmd_obj_is_visible_ipx_address,
+ .cmd_plobj_init_from_nl = _nmp_vt_cmd_plobj_init_from_nl_ip4_address,
+ .cmd_plobj_to_nl = _nmp_vt_cmd_plobj_to_nl_ip4_address,
+ .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip4_address,
+ .cmd_plobj_id_equal = _vt_cmd_plobj_id_equal_ip4_address,
+ .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip4_address,
+ .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip4_address,
+ .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj)) nm_platform_ip4_address_to_string,
+ .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_address_cmp,
+ },
+ [NMP_OBJECT_TYPE_IP6_ADDRESS - 1] = {
+ .obj_type = NMP_OBJECT_TYPE_IP6_ADDRESS,
+ .sizeof_data = sizeof (NMPObjectIP6Address),
+ .sizeof_public = sizeof (NMPlatformIP6Address),
+ .obj_type_name = "ip6-address",
+ .nl_type = "route/addr",
+ .addr_family = AF_INET6,
+ .rtm_gettype = RTM_GETADDR,
+ .signal_type = NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
+ .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_address,
+ .cmd_obj_equal = _vt_cmd_obj_equal_plain,
+ .cmd_obj_copy = _vt_cmd_obj_copy_plain,
+ .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip6_address,
+ .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_address,
+ .cmd_obj_is_visible = _vt_cmd_obj_is_visible_ipx_address,
+ .cmd_plobj_init_from_nl = _nmp_vt_cmd_plobj_init_from_nl_ip6_address,
+ .cmd_plobj_to_nl = _nmp_vt_cmd_plobj_to_nl_ip6_address,
+ .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip6_address,
+ .cmd_plobj_id_equal = _vt_cmd_plobj_id_equal_ip6_address,
+ .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip6_address,
+ .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip6_address,
+ .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj)) nm_platform_ip6_address_to_string,
+ .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_address_cmp
+ },
+ [NMP_OBJECT_TYPE_IP4_ROUTE - 1] = {
+ .obj_type = NMP_OBJECT_TYPE_IP4_ROUTE,
+ .sizeof_data = sizeof (NMPObjectIP4Route),
+ .sizeof_public = sizeof (NMPlatformIP4Route),
+ .obj_type_name = "ip4-route",
+ .nl_type = "route/route",
+ .addr_family = AF_INET,
+ .rtm_gettype = RTM_GETROUTE,
+ .signal_type = NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED,
+ .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_route,
+ .cmd_obj_equal = _vt_cmd_obj_equal_plain,
+ .cmd_obj_copy = _vt_cmd_obj_copy_plain,
+ .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip4_route,
+ .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_route,
+ .cmd_obj_is_visible = _vt_cmd_obj_is_visible_ipx_route,
+ .cmd_plobj_init_from_nl = _nmp_vt_cmd_plobj_init_from_nl_ip4_route,
+ .cmd_plobj_to_nl = _nmp_vt_cmd_plobj_to_nl_ip4_route,
+ .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip4_route,
+ .cmd_plobj_id_equal = _vt_cmd_plobj_id_equal_ip4_route,
+ .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip4_route,
+ .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip4_route,
+ .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj)) nm_platform_ip4_route_to_string,
+ .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip4_route_cmp,
+ },
+ [NMP_OBJECT_TYPE_IP6_ROUTE - 1] = {
+ .obj_type = NMP_OBJECT_TYPE_IP6_ROUTE,
+ .sizeof_data = sizeof (NMPObjectIP6Route),
+ .sizeof_public = sizeof (NMPlatformIP6Route),
+ .obj_type_name = "ip6-route",
+ .nl_type = "route/route",
+ .addr_family = AF_INET6,
+ .rtm_gettype = RTM_GETROUTE,
+ .signal_type = NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED,
+ .cmd_obj_init_cache_id = _vt_cmd_obj_init_cache_id_ipx_route,
+ .cmd_obj_equal = _vt_cmd_obj_equal_plain,
+ .cmd_obj_copy = _vt_cmd_obj_copy_plain,
+ .cmd_obj_stackinit_id = _vt_cmd_obj_stackinit_id_ip6_route,
+ .cmd_obj_is_alive = _vt_cmd_obj_is_alive_ipx_route,
+ .cmd_obj_is_visible = _vt_cmd_obj_is_visible_ipx_route,
+ .cmd_plobj_init_from_nl = _nmp_vt_cmd_plobj_init_from_nl_ip6_route,
+ .cmd_plobj_to_nl = _nmp_vt_cmd_plobj_to_nl_ip6_route,
+ .cmd_plobj_id_copy = _vt_cmd_plobj_id_copy_ip6_route,
+ .cmd_plobj_id_equal = _vt_cmd_plobj_id_equal_ip6_route,
+ .cmd_plobj_id_hash = _vt_cmd_plobj_id_hash_ip6_route,
+ .cmd_plobj_to_string_id = _vt_cmd_plobj_to_string_id_ip6_route,
+ .cmd_plobj_to_string = (const char *(*) (const NMPlatformObject *obj)) nm_platform_ip6_route_to_string,
+ .cmd_plobj_cmp = (int (*) (const NMPlatformObject *obj1, const NMPlatformObject *obj2)) nm_platform_ip6_route_cmp,
+ },
+};
+
diff --git a/src/platform/nmp-object.h b/src/platform/nmp-object.h
new file mode 100644
index 000000000..5b1887b82
--- /dev/null
+++ b/src/platform/nmp-object.h
@@ -0,0 +1,361 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-platform.c - Handle runtime kernel networking configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#ifndef __NMP_OBJECT_H__
+#define __NMP_OBJECT_H__
+
+#include "config.h"
+
+#include "nm-platform.h"
+#include "nm-multi-index.h"
+#include "nm-macros-internal.h"
+
+#include <netlink/netlink.h>
+#include <gudev/gudev.h>
+
+
+typedef enum { /*< skip >*/
+ NMP_OBJECT_TO_STRING_ID,
+ NMP_OBJECT_TO_STRING_PUBLIC,
+ NMP_OBJECT_TO_STRING_ALL,
+} NMPObjectToStringMode;
+
+typedef enum { /*< skip >*/
+ NMP_CACHE_OPS_UNCHANGED = NM_PLATFORM_SIGNAL_NONE,
+ NMP_CACHE_OPS_UPDATED = NM_PLATFORM_SIGNAL_CHANGED,
+ NMP_CACHE_OPS_ADDED = NM_PLATFORM_SIGNAL_ADDED,
+ NMP_CACHE_OPS_REMOVED = NM_PLATFORM_SIGNAL_REMOVED,
+} NMPCacheOpsType;
+
+/* The NMPCacheIdType are the different index types.
+ *
+ * An object of a certain object-type, can be candidate to being
+ * indexed by a certain NMPCacheIdType or not. For example, all
+ * objects are indexed via an index of type NMP_CACHE_ID_TYPE_OBJECT_TYPE,
+ * but only route objects can be indexed by NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT.
+ *
+ * Of one index type, there can be multiple indexes or not.
+ * For example, of the index type NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX there
+ * are multiple instances (for different route/addresses, v4/v6, per-ifindex).
+ *
+ * But one object, can only be indexed by one particular index of a
+ * type. For example, a certain address instance is only indexed by
+ * the index NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX with
+ * matching v4/v6 and ifindex -- or maybe not at all if it isn't visible.
+ * */
+typedef enum { /*< skip >*/
+ /* all the objects of a certain type */
+ NMP_CACHE_ID_TYPE_OBJECT_TYPE,
+
+ /* all the visible objects of a certain type */
+ NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY,
+
+ /* indeces for the visible routes, ignoring ifindex. */
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT,
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT,
+
+ /* all the visible addresses/routes (by object-type) for an ifindex. */
+ NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX,
+
+ /* three indeces for the visible routes, per ifindex. */
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT,
+ NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT,
+
+ __NMP_CACHE_ID_TYPE_MAX,
+ NMP_CACHE_ID_TYPE_MAX = __NMP_CACHE_ID_TYPE_MAX - 1,
+} NMPCacheIdType;
+
+typedef struct _NMPObject NMPObject;
+
+typedef struct {
+ union {
+ NMMultiIndexId base;
+ guint8 _id_type; /* NMPCacheIdType as guint8 */
+ struct {
+ /* NMP_CACHE_ID_TYPE_OBJECT_TYPE */
+ /* NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY */
+ /* NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_NO_DEFAULT */
+ /* NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_ONLY_DEFAULT */
+ guint8 _id_type;
+ guint8 obj_type; /* NMPObjectType as guint8 */
+ } object_type;
+ struct {
+ /* NMP_CACHE_ID_TYPE_ADDRROUTE_VISIBLE_BY_IFINDEX */
+ /* NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_NO_DEFAULT */
+ /* NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_ONLY_DEFAULT */
+ guint8 _id_type;
+ guint8 obj_type; /* NMPObjectType as guint8 */
+ int ifindex;
+ } object_type_by_ifindex;
+ };
+} NMPCacheId;
+
+extern NMPCacheId _nmp_cache_id_static;
+#define NMP_CACHE_ID_STATIC (&_nmp_cache_id_static)
+
+typedef struct {
+ NMPObjectType obj_type;
+ int addr_family;
+ int rtm_gettype;
+ int sizeof_data;
+ int sizeof_public;
+ const char *obj_type_name;
+ const char *nl_type;
+ const char *signal_type;
+
+ /* returns %FALSE, if the obj type would never have an entry for index type @id_type. If @obj has an index,
+ * initialize @id and set @out_id to it. Otherwise, @out_id is NULL. */
+ gboolean (*cmd_obj_init_cache_id) (const NMPObject *obj, NMPCacheIdType id_type, NMPCacheId *id, const NMPCacheId **out_id);
+
+ gboolean (*cmd_obj_equal) (const NMPObject *obj1, const NMPObject *obj2);
+ void (*cmd_obj_copy) (NMPObject *dst, const NMPObject *src);
+ void (*cmd_obj_stackinit_id) (NMPObject *obj, const NMPObject *src);
+ void (*cmd_obj_dispose) (NMPObject *obj);
+ gboolean (*cmd_obj_is_alive) (const NMPObject *obj);
+ gboolean (*cmd_obj_is_visible) (const NMPObject *obj);
+
+ /* functions that operate on NMPlatformObject */
+ gboolean (*cmd_plobj_init_from_nl) (NMPlatform *platform, NMPlatformObject *obj, const struct nl_object *nlo, gboolean id_only, gboolean complete_from_cache);
+ struct nl_object *(*cmd_plobj_to_nl) (NMPlatform *platform, const NMPlatformObject *obj, gboolean id_only);
+ void (*cmd_plobj_id_copy) (NMPlatformObject *dst, const NMPlatformObject *src);
+ gboolean (*cmd_plobj_id_equal) (const NMPlatformObject *obj1, const NMPlatformObject *obj2);
+ guint (*cmd_plobj_id_hash) (const NMPlatformObject *obj);
+ const char *(*cmd_plobj_to_string_id) (const NMPlatformObject *obj, char *buf, gsize buf_size);
+ const char *(*cmd_plobj_to_string) (const NMPlatformObject *obj);
+ int (*cmd_plobj_cmp) (const NMPlatformObject *obj1, const NMPlatformObject *obj2);
+} NMPClass;
+
+extern const NMPClass _nmp_classes[NMP_OBJECT_TYPE_MAX];
+
+typedef struct {
+ NMPlatformLink _public;
+
+ struct {
+ guint8 is_in_netlink;
+ } netlink;
+
+ struct {
+ GUdevDevice *device;
+ } udev;
+} NMPObjectLink;
+
+typedef struct {
+ NMPlatformIP4Address _public;
+} NMPObjectIP4Address;
+
+typedef struct {
+ NMPlatformIP4Route _public;
+} NMPObjectIP4Route;
+
+typedef struct {
+ NMPlatformIP6Address _public;
+} NMPObjectIP6Address;
+
+typedef struct {
+ NMPlatformIP6Route _public;
+} NMPObjectIP6Route;
+
+struct _NMPObject {
+ const NMPClass *_class;
+ int _ref_count;
+ guint8 is_cached;
+ union {
+ NMPlatformObject object;
+
+ NMPlatformLink link;
+ NMPObjectLink _link;
+
+ NMPlatformIPAddress ip_address;
+ NMPlatformIPXAddress ipx_address;
+ NMPlatformIP4Address ip4_address;
+ NMPlatformIP6Address ip6_address;
+ NMPObjectIP4Address _ip4_address;
+ NMPObjectIP6Address _ip6_address;
+
+ NMPlatformIPRoute ip_route;
+ NMPlatformIPXRoute ipx_route;
+ NMPlatformIP4Route ip4_route;
+ NMPlatformIP6Route ip6_route;
+ NMPObjectIP4Route _ip4_route;
+ NMPObjectIP6Route _ip6_route;
+ };
+};
+
+static inline gboolean
+NMP_CLASS_IS_VALID (const NMPClass *klass)
+{
+ return klass >= &_nmp_classes[0]
+ && klass <= &_nmp_classes[G_N_ELEMENTS (_nmp_classes)]
+ && ((((char *) klass) - ((char *) NULL)) % (&_nmp_classes[1] - &_nmp_classes[0])) == 0;
+}
+
+#define NMP_REF_COUNT_STACKINIT (G_MAXINT)
+
+static inline NMPObject *
+NMP_OBJECT_UP_CAST(const NMPlatformObject *plobj)
+{
+ NMPObject *obj;
+
+ obj = plobj
+ ? (NMPObject *) ( &(((char *) plobj)[-((int) G_STRUCT_OFFSET (NMPObject, object))]) )
+ : NULL;
+ nm_assert (!obj || (obj->_ref_count > 0 && NMP_CLASS_IS_VALID (obj->_class)));
+ return obj;
+}
+#define NMP_OBJECT_UP_CAST(plobj) (NMP_OBJECT_UP_CAST ((const NMPlatformObject *) (plobj)))
+
+static inline gboolean
+NMP_OBJECT_IS_VALID (const NMPObject *obj)
+{
+ nm_assert (!obj || ( obj
+ && obj->_ref_count > 0
+ && NMP_CLASS_IS_VALID (obj->_class)));
+
+ /* There isn't really much to check. Either @obj is NULL, or we must
+ * assume that it points to valid memory. */
+ return obj != NULL;
+}
+
+static inline gboolean
+NMP_OBJECT_IS_STACKINIT (const NMPObject *obj)
+{
+ nm_assert (!obj || NMP_OBJECT_IS_VALID (obj));
+
+ return obj && obj->_ref_count == NMP_REF_COUNT_STACKINIT;
+}
+
+static inline const NMPClass *
+NMP_OBJECT_GET_CLASS (const NMPObject *obj)
+{
+ nm_assert (NMP_OBJECT_IS_VALID (obj));
+
+ return obj->_class;
+}
+
+static inline NMPObjectType
+NMP_OBJECT_GET_TYPE (const NMPObject *obj)
+{
+ nm_assert (!obj || NMP_OBJECT_IS_VALID (obj));
+
+ return obj ? obj->_class->obj_type : NMP_OBJECT_TYPE_UNKNOWN;
+}
+
+
+
+const NMPClass *nmp_class_from_type (NMPObjectType obj_type);
+
+NMPObject *nmp_object_ref (NMPObject *object);
+void nmp_object_unref (NMPObject *object);
+NMPObject *nmp_object_new (NMPObjectType obj_type, const NMPlatformObject *plob);
+NMPObject *nmp_object_new_link (int ifindex);
+
+const NMPObject *nmp_object_stackinit (NMPObject *obj, NMPObjectType obj_type, const NMPlatformObject *plobj);
+const NMPObject *nmp_object_stackinit_id (NMPObject *obj, const NMPObject *src);
+const NMPObject *nmp_object_stackinit_id_link (NMPObject *obj, int ifindex);
+const NMPObject *nmp_object_stackinit_id_ip4_address (NMPObject *obj, int ifindex, guint32 address, int plen);
+const NMPObject *nmp_object_stackinit_id_ip6_address (NMPObject *obj, int ifindex, const struct in6_addr *address, int plen);
+const NMPObject *nmp_object_stackinit_id_ip4_route (NMPObject *obj, int ifindex, guint32 network, int plen, guint32 metric);
+const NMPObject *nmp_object_stackinit_id_ip6_route (NMPObject *obj, int ifindex, const struct in6_addr *network, int plen, guint32 metric);
+
+const char *nmp_object_to_string (const NMPObject *obj, NMPObjectToStringMode to_string_mode, char *buf, gsize buf_size);
+int nmp_object_cmp (const NMPObject *obj1, const NMPObject *obj2);
+gboolean nmp_object_equal (const NMPObject *obj1, const NMPObject *obj2);
+void nmp_object_copy (NMPObject *dst, const NMPObject *src, gboolean id_only);
+NMPObject *nmp_object_clone (const NMPObject *obj, gboolean id_only);
+gboolean nmp_object_id_equal (const NMPObject *obj1, const NMPObject *obj2);
+guint nmp_object_id_hash (const NMPObject *obj);
+gboolean nmp_object_is_alive (const NMPObject *obj);
+gboolean nmp_object_is_visible (const NMPObject *obj);
+
+void _nmp_object_fixup_link_udev_fields (NMPObject *obj, gboolean use_udev);
+
+#define auto_nmp_obj __attribute__((cleanup(_nmp_auto_obj_cleanup)))
+static inline void
+_nmp_auto_obj_cleanup (NMPObject **pobj)
+{
+ nmp_object_unref (*pobj);
+}
+
+typedef struct _NMPCache NMPCache;
+
+typedef void (*NMPCachePreHook) (NMPCache *cache, const NMPObject *old, const NMPObject *new, NMPCacheOpsType ops_type, gpointer user_data);
+typedef gboolean (*NMPObjectMatchFn) (const NMPObject *obj, gpointer user_data);
+
+gboolean nmp_cache_id_equal (const NMPCacheId *a, const NMPCacheId *b);
+guint nmp_cache_id_hash (const NMPCacheId *id);
+NMPCacheId *nmp_cache_id_clone (const NMPCacheId *id);
+void nmp_cache_id_destroy (NMPCacheId *id);
+
+NMPCacheId *nmp_cache_id_init_object_type (NMPCacheId *id, NMPObjectType obj_type, gboolean visible_only);
+NMPCacheId *nmp_cache_id_init_addrroute_visible_by_ifindex (NMPCacheId *id, NMPObjectType obj_type, int ifindex);
+NMPCacheId *nmp_cache_id_init_routes_visible (NMPCacheId *id, NMPObjectType obj_type, gboolean with_default, gboolean with_non_default, int ifindex);
+
+const NMPlatformObject *const *nmp_cache_lookup_multi (const NMPCache *cache, const NMPCacheId *cache_id, guint *out_len);
+GArray *nmp_cache_lookup_multi_to_array (const NMPCache *cache, NMPObjectType obj_type, const NMPCacheId *cache_id);
+const NMPObject *nmp_cache_lookup_obj (const NMPCache *cache, const NMPObject *obj);
+const NMPObject *nmp_cache_lookup_link (const NMPCache *cache, int ifindex);
+
+const NMPObject *nmp_cache_lookup_link_full (const NMPCache *cache,
+ int ifindex,
+ const char *ifname,
+ gboolean visible_only,
+ NMLinkType link_type,
+ NMPObjectMatchFn match_fn,
+ gpointer user_data);
+GHashTable *nmp_cache_lookup_all_to_hash (const NMPCache *cache,
+ NMPCacheId *cache_id,
+ GHashTable *hash);
+
+gboolean nmp_cache_link_connected_needs_toggle (const NMPCache *cache, const NMPObject *master, const NMPObject *potential_slave, const NMPObject *ignore_slave);
+const NMPObject *nmp_cache_link_connected_needs_toggle_by_ifindex (const NMPCache *cache, int master_ifindex, const NMPObject *potential_slave, const NMPObject *ignore_slave);
+
+gboolean nmp_cache_use_udev_detect (void);
+gboolean nmp_cache_use_udev_get (const NMPCache *cache);
+gboolean nmp_cache_use_udev_set (NMPCache *cache, gboolean use_udev);
+
+void ASSERT_nmp_cache_is_consistent (const NMPCache *cache);
+
+NMPCacheOpsType nmp_cache_remove (NMPCache *cache, const NMPObject *obj, gboolean equals_by_ptr, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data);
+NMPCacheOpsType nmp_cache_remove_netlink (NMPCache *cache, const NMPObject *obj, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data);
+NMPCacheOpsType nmp_cache_update_netlink (NMPCache *cache, NMPObject *obj, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data);
+NMPCacheOpsType nmp_cache_update_link_udev (NMPCache *cache, int ifindex, GUdevDevice *udev_device, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data);
+NMPCacheOpsType nmp_cache_update_link_master_connected (NMPCache *cache, int ifindex, NMPObject **out_obj, gboolean *out_was_visible, NMPCachePreHook pre_hook, gpointer user_data);
+
+NMPCache *nmp_cache_new (void);
+void nmp_cache_free (NMPCache *cache);
+
+NMPObject *nmp_object_from_nl (NMPlatform *platform, const struct nl_object *nlo, gboolean id_only, gboolean complete_from_cache);
+struct nl_object *nmp_object_to_nl (NMPlatform *platform, const NMPObject *obj, gboolean id_only);
+
+/* the following functions are currently implemented inside nm-linux-platform, because
+ * they depend on utility functions there. */
+NMPObjectType _nlo_get_object_type (const struct nl_object *nlo);
+gboolean _nmp_vt_cmd_plobj_init_from_nl_link (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache);
+gboolean _nmp_vt_cmd_plobj_init_from_nl_ip4_address (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache);
+gboolean _nmp_vt_cmd_plobj_init_from_nl_ip6_address (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache);
+gboolean _nmp_vt_cmd_plobj_init_from_nl_ip4_route (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache);
+gboolean _nmp_vt_cmd_plobj_init_from_nl_ip6_route (NMPlatform *platform, NMPlatformObject *_obj, const struct nl_object *_nlo, gboolean id_only, gboolean complete_from_cache);
+struct nl_object *_nmp_vt_cmd_plobj_to_nl_link (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only);
+struct nl_object *_nmp_vt_cmd_plobj_to_nl_ip4_address (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only);
+struct nl_object *_nmp_vt_cmd_plobj_to_nl_ip6_address (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only);
+struct nl_object *_nmp_vt_cmd_plobj_to_nl_ip4_route (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only);
+struct nl_object *_nmp_vt_cmd_plobj_to_nl_ip6_route (NMPlatform *platform, const NMPlatformObject *_obj, gboolean id_only);
+
+#endif /* __NMP_OBJECT_H__ */
diff --git a/src/platform/tests/Makefile.am b/src/platform/tests/Makefile.am
index c10600eb5..54844ec14 100644
--- a/src/platform/tests/Makefile.am
+++ b/src/platform/tests/Makefile.am
@@ -37,6 +37,8 @@ noinst_PROGRAMS = \
test-link-linux \
test-address-fake \
test-address-linux \
+ test-general \
+ test-nmp-object \
test-route-fake \
test-route-linux \
test-cleanup-fake \
@@ -109,7 +111,27 @@ test_cleanup_linux_CPPFLAGS = \
-DKERNEL_HACKS=1
test_cleanup_linux_LDADD = $(PLATFORM_LDADD)
-@VALGRIND_RULES@
-TESTS = test-link-fake test-address-fake test-route-fake test-cleanup-fake test-address-linux test-route-linux test-cleanup-linux
+test_nmp_object_SOURCES = \
+ test-nmp-object.c
+test_nmp_object_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
+test_general_SOURCES = \
+ test-general.c
+test_general_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
+@VALGRIND_RULES@
+TESTS = \
+ test-address-fake \
+ test-address-linux \
+ test-cleanup-fake \
+ test-cleanup-linux \
+ test-general \
+ test-link-fake \
+ test-link-linux \
+ test-nmp-object \
+ test-route-fake \
+ test-route-linux
diff --git a/src/platform/tests/Makefile.in b/src/platform/tests/Makefile.in
index 16a484309..a93335399 100644
--- a/src/platform/tests/Makefile.in
+++ b/src/platform/tests/Makefile.in
@@ -92,12 +92,14 @@ host_triplet = @host@
noinst_PROGRAMS = dump$(EXEEXT) monitor$(EXEEXT) platform$(EXEEXT) \
test-link-fake$(EXEEXT) test-link-linux$(EXEEXT) \
test-address-fake$(EXEEXT) test-address-linux$(EXEEXT) \
+ test-general$(EXEEXT) test-nmp-object$(EXEEXT) \
test-route-fake$(EXEEXT) test-route-linux$(EXEEXT) \
test-cleanup-fake$(EXEEXT) test-cleanup-linux$(EXEEXT)
-TESTS = test-link-fake$(EXEEXT) test-address-fake$(EXEEXT) \
- test-route-fake$(EXEEXT) test-cleanup-fake$(EXEEXT) \
- test-address-linux$(EXEEXT) test-route-linux$(EXEEXT) \
- test-cleanup-linux$(EXEEXT)
+TESTS = test-address-fake$(EXEEXT) test-address-linux$(EXEEXT) \
+ test-cleanup-fake$(EXEEXT) test-cleanup-linux$(EXEEXT) \
+ test-general$(EXEEXT) test-link-fake$(EXEEXT) \
+ test-link-linux$(EXEEXT) test-nmp-object$(EXEEXT) \
+ test-route-fake$(EXEEXT) test-route-linux$(EXEEXT)
subdir = src/platform/tests
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib_readline.m4 \
@@ -172,6 +174,9 @@ am_test_cleanup_linux_OBJECTS = \
test_cleanup_linux-test-cleanup.$(OBJEXT) $(am__objects_9)
test_cleanup_linux_OBJECTS = $(am_test_cleanup_linux_OBJECTS)
test_cleanup_linux_DEPENDENCIES = $(PLATFORM_LDADD)
+am_test_general_OBJECTS = test-general.$(OBJEXT)
+test_general_OBJECTS = $(am_test_general_OBJECTS)
+test_general_DEPENDENCIES = $(top_builddir)/src/libNetworkManager.la
am__objects_10 = test_link_fake-nm-platform.$(OBJEXT) \
test_link_fake-nm-fake-platform.$(OBJEXT) \
test_link_fake-nm-linux-platform.$(OBJEXT)
@@ -190,6 +195,10 @@ am_test_link_linux_OBJECTS = test_link_linux-test-link.$(OBJEXT) \
$(am__objects_13)
test_link_linux_OBJECTS = $(am_test_link_linux_OBJECTS)
test_link_linux_DEPENDENCIES = $(PLATFORM_LDADD)
+am_test_nmp_object_OBJECTS = test-nmp-object.$(OBJEXT)
+test_nmp_object_OBJECTS = $(am_test_nmp_object_OBJECTS)
+test_nmp_object_DEPENDENCIES = \
+ $(top_builddir)/src/libNetworkManager.la
am__objects_14 = test_route_fake-nm-platform.$(OBJEXT) \
test_route_fake-nm-fake-platform.$(OBJEXT) \
test_route_fake-nm-linux-platform.$(OBJEXT)
@@ -245,12 +254,14 @@ am__v_CCLD_1 =
SOURCES = $(dump_SOURCES) $(monitor_SOURCES) $(platform_SOURCES) \
$(test_address_fake_SOURCES) $(test_address_linux_SOURCES) \
$(test_cleanup_fake_SOURCES) $(test_cleanup_linux_SOURCES) \
- $(test_link_fake_SOURCES) $(test_link_linux_SOURCES) \
+ $(test_general_SOURCES) $(test_link_fake_SOURCES) \
+ $(test_link_linux_SOURCES) $(test_nmp_object_SOURCES) \
$(test_route_fake_SOURCES) $(test_route_linux_SOURCES)
DIST_SOURCES = $(dump_SOURCES) $(monitor_SOURCES) $(platform_SOURCES) \
$(test_address_fake_SOURCES) $(test_address_linux_SOURCES) \
$(test_cleanup_fake_SOURCES) $(test_cleanup_linux_SOURCES) \
- $(test_link_fake_SOURCES) $(test_link_linux_SOURCES) \
+ $(test_general_SOURCES) $(test_link_fake_SOURCES) \
+ $(test_link_linux_SOURCES) $(test_nmp_object_SOURCES) \
$(test_route_fake_SOURCES) $(test_route_linux_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
@@ -298,13 +309,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -418,6 +612,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -642,10 +837,22 @@ test_cleanup_linux_CPPFLAGS = \
-DKERNEL_HACKS=1
test_cleanup_linux_LDADD = $(PLATFORM_LDADD)
+test_nmp_object_SOURCES = \
+ test-nmp-object.c
+
+test_nmp_object_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
+test_general_SOURCES = \
+ test-general.c
+
+test_general_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -713,6 +920,10 @@ test-cleanup-linux$(EXEEXT): $(test_cleanup_linux_OBJECTS) $(test_cleanup_linux_
@rm -f test-cleanup-linux$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_cleanup_linux_OBJECTS) $(test_cleanup_linux_LDADD) $(LIBS)
+test-general$(EXEEXT): $(test_general_OBJECTS) $(test_general_DEPENDENCIES) $(EXTRA_test_general_DEPENDENCIES)
+ @rm -f test-general$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_general_OBJECTS) $(test_general_LDADD) $(LIBS)
+
test-link-fake$(EXEEXT): $(test_link_fake_OBJECTS) $(test_link_fake_DEPENDENCIES) $(EXTRA_test_link_fake_DEPENDENCIES)
@rm -f test-link-fake$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_link_fake_OBJECTS) $(test_link_fake_LDADD) $(LIBS)
@@ -721,6 +932,10 @@ test-link-linux$(EXEEXT): $(test_link_linux_OBJECTS) $(test_link_linux_DEPENDENC
@rm -f test-link-linux$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_link_linux_OBJECTS) $(test_link_linux_LDADD) $(LIBS)
+test-nmp-object$(EXEEXT): $(test_nmp_object_OBJECTS) $(test_nmp_object_DEPENDENCIES) $(EXTRA_test_nmp_object_DEPENDENCIES)
+ @rm -f test-nmp-object$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_nmp_object_OBJECTS) $(test_nmp_object_LDADD) $(LIBS)
+
test-route-fake$(EXEEXT): $(test_route_fake_OBJECTS) $(test_route_fake_DEPENDENCIES) $(EXTRA_test_route_fake_DEPENDENCIES)
@rm -f test-route-fake$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_route_fake_OBJECTS) $(test_route_fake_LDADD) $(LIBS)
@@ -741,6 +956,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-linux-platform.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nm-platform.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/platform.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-general.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-nmp-object.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_address_fake-nm-fake-platform.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_address_fake-nm-linux-platform.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_address_fake-nm-platform.Po@am__quote@
@@ -1463,98 +1680,231 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-address-fake.log: test-address-fake$(EXEEXT)
+ @p='test-address-fake$(EXEEXT)'; \
+ b='test-address-fake'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-address-linux.log: test-address-linux$(EXEEXT)
+ @p='test-address-linux$(EXEEXT)'; \
+ b='test-address-linux'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-cleanup-fake.log: test-cleanup-fake$(EXEEXT)
+ @p='test-cleanup-fake$(EXEEXT)'; \
+ b='test-cleanup-fake'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-cleanup-linux.log: test-cleanup-linux$(EXEEXT)
+ @p='test-cleanup-linux$(EXEEXT)'; \
+ b='test-cleanup-linux'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-general.log: test-general$(EXEEXT)
+ @p='test-general$(EXEEXT)'; \
+ b='test-general'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-link-fake.log: test-link-fake$(EXEEXT)
+ @p='test-link-fake$(EXEEXT)'; \
+ b='test-link-fake'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-link-linux.log: test-link-linux$(EXEEXT)
+ @p='test-link-linux$(EXEEXT)'; \
+ b='test-link-linux'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-nmp-object.log: test-nmp-object$(EXEEXT)
+ @p='test-nmp-object$(EXEEXT)'; \
+ b='test-nmp-object'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-route-fake.log: test-route-fake$(EXEEXT)
+ @p='test-route-fake$(EXEEXT)'; \
+ b='test-route-fake'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-route-linux.log: test-route-linux$(EXEEXT)
+ @p='test-route-linux$(EXEEXT)'; \
+ b='test-route-linux'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -1611,6 +1961,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -1706,7 +2059,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/platform/tests/dump.c b/src/platform/tests/dump.c
index 3bb61da41..54de1da70 100644
--- a/src/platform/tests/dump.c
+++ b/src/platform/tests/dump.c
@@ -7,6 +7,7 @@
#include "nm-platform.h"
#include "nm-linux-platform.h"
#include "nm-fake-platform.h"
+#include "nm-macros-internal.h"
static void
dump_interface (NMPlatformLink *link)
@@ -26,14 +27,14 @@ dump_interface (NMPlatformLink *link)
size_t addrlen;
int i;
- g_assert (link->up || !link->connected);
+ g_assert (NM_FLAGS_HAS (link->flags, IFF_UP) || !link->connected);
- printf ("%d: %s: %s", link->ifindex, link->name, link->type_name);
- if (link->up)
+ printf ("%d: %s: %s", link->ifindex, link->name, nm_link_type_to_string (link->type));
+ if (NM_FLAGS_HAS (link->flags, IFF_UP))
printf (" %s", link->connected ? "CONNECTED" : "DISCONNECTED");
else
printf (" DOWN");
- if (!link->arp)
+ if (NM_FLAGS_HAS (link->flags, IFF_NOARP))
printf (" noarp");
if (link->master)
printf (" master %d", link->master);
@@ -43,22 +44,22 @@ dump_interface (NMPlatformLink *link)
printf ("\n");
if (link->driver)
printf (" driver: %s\n", link->driver);
- printf (" UDI: %s\n", link->udi);
- if (!nm_platform_vlan_get_info (link->ifindex, &vlan_parent, &vlan_id))
+ printf (" UDI: %s\n", nm_platform_link_get_udi (NM_PLATFORM_GET, link->ifindex));
+ if (!nm_platform_vlan_get_info (NM_PLATFORM_GET, link->ifindex, &vlan_parent, &vlan_id))
g_assert_not_reached ();
if (vlan_parent)
printf (" vlan parent %d id %d\n", vlan_parent, vlan_id);
- if (nm_platform_link_is_software (link->ifindex))
+ if (nm_platform_link_is_software (NM_PLATFORM_GET, link->ifindex))
printf (" class software\n");
- if (nm_platform_link_supports_slaves (link->ifindex))
+ if (nm_platform_link_supports_slaves (NM_PLATFORM_GET, link->ifindex))
printf (" class supports-slaves\n");
- if (nm_platform_link_supports_carrier_detect (link->ifindex))
+ if (nm_platform_link_supports_carrier_detect (NM_PLATFORM_GET, link->ifindex))
printf (" feature carrier-detect\n");
- if (nm_platform_link_supports_vlans (link->ifindex))
+ if (nm_platform_link_supports_vlans (NM_PLATFORM_GET, link->ifindex))
printf (" feature vlans\n");
- address = nm_platform_link_get_address (link->ifindex, &addrlen);
+ address = nm_platform_link_get_address (NM_PLATFORM_GET, link->ifindex, &addrlen);
if (address) {
printf (" link-address ");
for (i = 0; i < addrlen; i++)
@@ -66,8 +67,8 @@ dump_interface (NMPlatformLink *link)
printf ("\n");
}
- ip4_addresses = nm_platform_ip4_address_get_all (link->ifindex);
- ip6_addresses = nm_platform_ip6_address_get_all (link->ifindex);
+ ip4_addresses = nm_platform_ip4_address_get_all (NM_PLATFORM_GET, link->ifindex);
+ ip6_addresses = nm_platform_ip6_address_get_all (NM_PLATFORM_GET, link->ifindex);
g_assert (ip4_addresses);
g_assert (ip6_addresses);
@@ -85,8 +86,8 @@ dump_interface (NMPlatformLink *link)
g_array_unref (ip4_addresses);
g_array_unref (ip6_addresses);
- ip4_routes = nm_platform_ip4_route_get_all (link->ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
- ip6_routes = nm_platform_ip6_route_get_all (link->ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ ip4_routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, link->ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+ ip6_routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, link->ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
g_assert (ip4_routes);
g_assert (ip6_routes);
@@ -112,7 +113,7 @@ dump_interface (NMPlatformLink *link)
static void
dump_all (void)
{
- GArray *links = nm_platform_link_get_all ();
+ GArray *links = nm_platform_link_get_all (NM_PLATFORM_GET);
int i;
for (i = 0; i < links->len; i++)
diff --git a/src/platform/tests/platform.c b/src/platform/tests/platform.c
index eea6610d3..24e828c15 100644
--- a/src/platform/tests/platform.c
+++ b/src/platform/tests/platform.c
@@ -44,13 +44,13 @@ typedef const char *string_t;
static gboolean
do_sysctl_set (char **argv)
{
- return nm_platform_sysctl_set (argv[0], argv[1]);
+ return nm_platform_sysctl_set (NM_PLATFORM_GET, argv[0], argv[1]);
}
static gboolean
do_sysctl_get (char **argv)
{
- gs_free char *value = nm_platform_sysctl_get (argv[0]);
+ gs_free char *value = nm_platform_sysctl_get (NM_PLATFORM_GET, argv[0]);
printf ("%s\n", value);
@@ -66,7 +66,7 @@ parse_ifindex (const char *str)
ifindex = strtol (str, &endptr, 10);
if (*endptr) {
- ifindex = nm_platform_link_get_ifindex (str);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, str);
}
return ifindex;
@@ -79,7 +79,7 @@ do_link_get_all (char **argv)
NMPlatformLink *device;
int i;
- links = nm_platform_link_get_all ();
+ links = nm_platform_link_get_all (NM_PLATFORM_GET);
for (i = 0; i < links->len; i++) {
device = &g_array_index (links, NMPlatformLink, i);
@@ -93,25 +93,25 @@ do_link_get_all (char **argv)
static gboolean
do_dummy_add (char **argv)
{
- return nm_platform_dummy_add (argv[0]);
+ return nm_platform_dummy_add (NM_PLATFORM_GET, argv[0], NULL) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
do_bridge_add (char **argv)
{
- return nm_platform_bridge_add (argv[0], NULL, 0);
+ return nm_platform_bridge_add (NM_PLATFORM_GET, argv[0], NULL, 0, NULL) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
do_bond_add (char **argv)
{
- return nm_platform_bond_add (argv[0]);
+ return nm_platform_bond_add (NM_PLATFORM_GET, argv[0], NULL) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
do_team_add (char **argv)
{
- return nm_platform_team_add (argv[0]);
+ return nm_platform_team_add (NM_PLATFORM_GET, argv[0], NULL) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
@@ -122,13 +122,13 @@ do_vlan_add (char **argv)
int vlanid = strtol (*argv++, NULL, 10);
guint32 vlan_flags = strtol (*argv++, NULL, 10);
- return nm_platform_vlan_add (name, parent, vlanid, vlan_flags);
+ return nm_platform_vlan_add (NM_PLATFORM_GET, name, parent, vlanid, vlan_flags, NULL) == NM_PLATFORM_ERROR_SUCCESS;
}
static gboolean
do_link_exists (char **argv)
{
- gboolean value = nm_platform_link_exists (argv[0]);
+ gboolean value = !!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, argv[0]);
print_boolean (value);
@@ -140,7 +140,7 @@ do_link_exists (char **argv)
do_link_##cmdname (char **argv) \
{ \
int ifindex = parse_ifindex (argv[0]); \
- return ifindex ? nm_platform_link_##cmdname (ifindex) : FALSE; \
+ return ifindex ? nm_platform_link_##cmdname (NM_PLATFORM_GET, ifindex) : FALSE; \
}
#define LINK_CMD_GET_FULL(cmdname, type, cond) \
@@ -149,7 +149,7 @@ do_link_exists (char **argv)
{ \
int ifindex = parse_ifindex (argv[0]); \
if (ifindex) { \
- type##_t value = nm_platform_link_##cmdname (ifindex); \
+ type##_t value = nm_platform_link_##cmdname (NM_PLATFORM_GET, ifindex); \
if (cond) { \
print_##type (value); \
return TRUE; \
@@ -169,7 +169,7 @@ LINK_CMD (delete)
static gboolean
do_link_get_ifindex (char **argv)
{
- int ifindex = nm_platform_link_get_ifindex (argv[0]);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, argv[0]);
if (ifindex)
printf ("%d\n", ifindex);
@@ -182,7 +182,14 @@ LINK_CMD_GET_FULL (get_type, decimal, value > 0)
LINK_CMD_GET (is_software, boolean)
LINK_CMD_GET (supports_slaves, boolean)
-LINK_CMD (set_up)
+static gboolean
+do_link_set_up (char **argv)
+{
+ int ifindex = parse_ifindex (argv[0]);
+
+ return ifindex ? nm_platform_link_set_up (NM_PLATFORM_GET, ifindex, NULL) : FALSE;
+}
+
LINK_CMD (set_down)
LINK_CMD (set_arp)
LINK_CMD (set_noarp)
@@ -213,7 +220,7 @@ do_link_set_address (char **argv)
g_assert (!*endptr);
}
- return nm_platform_link_set_address (ifindex, address, sizeof (address));
+ return nm_platform_link_set_address (NM_PLATFORM_GET, ifindex, address, sizeof (address));
}
static gboolean
@@ -224,7 +231,7 @@ do_link_get_address (char **argv)
size_t length;
int i;
- address = nm_platform_link_get_address (ifindex, &length);
+ address = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, &length);
if (!address || length <= 0)
return FALSE;
@@ -242,7 +249,7 @@ do_link_set_mtu (char **argv)
int ifindex = parse_ifindex (*argv++);
int mtu = strtoul (*argv++, NULL, 10);
- return nm_platform_link_set_mtu (ifindex, mtu);
+ return nm_platform_link_set_mtu (NM_PLATFORM_GET, ifindex, mtu);
}
LINK_CMD_GET (get_mtu, decimal);
@@ -255,7 +262,7 @@ do_link_enslave (char **argv)
int master = parse_ifindex (*argv++);
int slave = parse_ifindex (*argv++);
- return nm_platform_link_enslave (master, slave);
+ return nm_platform_link_enslave (NM_PLATFORM_GET, master, slave);
}
static gboolean
@@ -264,7 +271,7 @@ do_link_release (char **argv)
int master = parse_ifindex (*argv++);
int slave = parse_ifindex (*argv++);
- return nm_platform_link_release (master, slave);
+ return nm_platform_link_release (NM_PLATFORM_GET, master, slave);
}
LINK_CMD_GET (get_master, decimal)
@@ -276,7 +283,7 @@ do_master_set_option (char **argv)
const char *option = *argv++;
const char *value = *argv++;
- return nm_platform_master_set_option (ifindex, option, value);
+ return nm_platform_master_set_option (NM_PLATFORM_GET, ifindex, option, value);
}
static gboolean
@@ -284,7 +291,7 @@ do_master_get_option (char **argv)
{
int ifindex = parse_ifindex (*argv++);
const char *option = *argv++;
- gs_free char *value = nm_platform_master_get_option (ifindex, option);
+ gs_free char *value = nm_platform_master_get_option (NM_PLATFORM_GET, ifindex, option);
printf ("%s\n", value);
@@ -298,7 +305,7 @@ do_slave_set_option (char **argv)
const char *option = *argv++;
const char *value = *argv++;
- return nm_platform_slave_set_option (ifindex, option, value);
+ return nm_platform_slave_set_option (NM_PLATFORM_GET, ifindex, option, value);
}
static gboolean
@@ -306,7 +313,7 @@ do_slave_get_option (char **argv)
{
int ifindex = parse_ifindex (*argv++);
const char *option = *argv++;
- gs_free char *value = nm_platform_slave_get_option (ifindex, option);
+ gs_free char *value = nm_platform_slave_get_option (NM_PLATFORM_GET, ifindex, option);
printf ("%s\n", value);
@@ -320,7 +327,7 @@ do_vlan_get_info (char **argv)
int parent;
int vlanid;
- if (!nm_platform_vlan_get_info (ifindex, &parent, &vlanid))
+ if (!nm_platform_vlan_get_info (NM_PLATFORM_GET, ifindex, &parent, &vlanid))
return FALSE;
printf ("%d %d\n", parent, vlanid);
@@ -335,7 +342,7 @@ do_vlan_set_ingress_map (char **argv)
int from = strtol (*argv++, NULL, 10);
int to = strtol (*argv++, NULL, 10);
- return nm_platform_vlan_set_ingress_map (ifindex, from, to);
+ return nm_platform_vlan_set_ingress_map (NM_PLATFORM_GET, ifindex, from, to);
}
static gboolean
@@ -345,7 +352,7 @@ do_vlan_set_egress_map (char **argv)
int from = strtol (*argv++, NULL, 10);
int to = strtol (*argv++, NULL, 10);
- return nm_platform_vlan_set_egress_map (ifindex, from, to);
+ return nm_platform_vlan_set_egress_map (NM_PLATFORM_GET, ifindex, from, to);
}
static gboolean
@@ -354,7 +361,7 @@ do_veth_get_properties (char **argv)
int ifindex = parse_ifindex (*argv++);
NMPlatformVethProperties props;
- if (!nm_platform_veth_get_properties (ifindex, &props))
+ if (!nm_platform_veth_get_properties (NM_PLATFORM_GET, ifindex, &props))
return FALSE;
printf ("peer: %d\n", props.peer);
@@ -368,7 +375,7 @@ do_tun_get_properties (char **argv)
int ifindex = parse_ifindex (*argv++);
NMPlatformTunProperties props;
- if (!nm_platform_tun_get_properties (ifindex, &props))
+ if (!nm_platform_tun_get_properties (NM_PLATFORM_GET, ifindex, &props))
return FALSE;
printf ("mode: %s\n", props.mode);
@@ -396,7 +403,7 @@ do_macvlan_get_properties (char **argv)
int ifindex = parse_ifindex (*argv++);
NMPlatformMacvlanProperties props;
- if (!nm_platform_macvlan_get_properties (ifindex, &props))
+ if (!nm_platform_macvlan_get_properties (NM_PLATFORM_GET, ifindex, &props))
return FALSE;
printf ("parent: %d\n", props.parent_ifindex);
@@ -413,7 +420,7 @@ do_vxlan_get_properties (char **argv)
NMPlatformVxlanProperties props;
char addrstr[INET6_ADDRSTRLEN];
- if (!nm_platform_vxlan_get_properties (ifindex, &props))
+ if (!nm_platform_vxlan_get_properties (NM_PLATFORM_GET, ifindex, &props))
return FALSE;
printf ("parent-ifindex: %u\n", props.parent_ifindex);
@@ -460,7 +467,7 @@ do_gre_get_properties (char **argv)
NMPlatformGreProperties props;
char addrstr[INET_ADDRSTRLEN];
- if (!nm_platform_gre_get_properties (ifindex, &props))
+ if (!nm_platform_gre_get_properties (NM_PLATFORM_GET, ifindex, &props))
return FALSE;
printf ("parent-ifindex: %u\n", props.parent_ifindex);
@@ -496,7 +503,7 @@ do_ip4_address_get_all (char **argv)
int i;
if (ifindex) {
- addresses = nm_platform_ip4_address_get_all (ifindex);
+ addresses = nm_platform_ip4_address_get_all (NM_PLATFORM_GET, ifindex);
for (i = 0; i < addresses->len; i++) {
address = &g_array_index (addresses, NMPlatformIP4Address, i);
inet_ntop (AF_INET, &address->address, addrstr, sizeof (addrstr));
@@ -518,7 +525,7 @@ do_ip6_address_get_all (char **argv)
int i;
if (ifindex) {
- addresses = nm_platform_ip6_address_get_all (ifindex);
+ addresses = nm_platform_ip6_address_get_all (NM_PLATFORM_GET, ifindex);
for (i = 0; i < addresses->len; i++) {
address = &g_array_index (addresses, NMPlatformIP6Address, i);
inet_ntop (AF_INET6, &address->address, addrstr, sizeof (addrstr));
@@ -576,7 +583,7 @@ do_ip4_address_add (char **argv)
guint32 lifetime = strtol (*argv++, NULL, 10);
guint32 preferred = strtol (*argv++, NULL, 10);
- gboolean value = nm_platform_ip4_address_add (ifindex, address, 0, plen, lifetime, preferred, NULL);
+ gboolean value = nm_platform_ip4_address_add (NM_PLATFORM_GET, ifindex, address, 0, plen, lifetime, preferred, NULL);
return value;
} else
return FALSE;
@@ -594,7 +601,7 @@ do_ip6_address_add (char **argv)
guint32 preferred = strtol (*argv++, NULL, 10);
guint flags = (*argv) ? rtnl_addr_str2flags (*argv++) : 0;
- gboolean value = nm_platform_ip6_address_add (ifindex, address, in6addr_any, plen, lifetime, preferred, flags);
+ gboolean value = nm_platform_ip6_address_add (NM_PLATFORM_GET, ifindex, address, in6addr_any, plen, lifetime, preferred, flags);
return value;
} else
return FALSE;
@@ -608,7 +615,7 @@ do_ip6_address_add (char **argv)
v##_t address; \
int plen; \
if (ifindex && parse_##v##_address (*argv++, &address, &plen)) { \
- gboolean value = nm_platform_##v##_address_##cmdname (ifindex, address, plen, ##__VA_ARGS__); \
+ gboolean value = !!nm_platform_##v##_address_##cmdname (NM_PLATFORM_GET, ifindex, address, plen, ##__VA_ARGS__); \
if (print) { \
print_boolean (value); \
return TRUE; \
@@ -621,7 +628,7 @@ do_ip6_address_add (char **argv)
#define ADDR_CMD_PRINT(cmdname) ADDR_CMD_FULL (ip4, cmdname, TRUE) ADDR_CMD_FULL (ip6, cmdname, TRUE)
ADDR_CMD (delete)
-ADDR_CMD_PRINT (exists)
+ADDR_CMD_PRINT (get)
static gboolean
do_ip4_route_get_all (char **argv)
@@ -633,7 +640,7 @@ do_ip4_route_get_all (char **argv)
int i;
if (ifindex) {
- routes = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
for (i = 0; i < routes->len; i++) {
route = &g_array_index (routes, NMPlatformIP4Route, i);
inet_ntop (AF_INET, &route->network, networkstr, sizeof (networkstr));
@@ -657,7 +664,7 @@ do_ip6_route_get_all (char **argv)
int i;
if (ifindex) {
- routes = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
for (i = 0; i < routes->len; i++) {
route = &g_array_index (routes, NMPlatformIP6Route, i);
inet_ntop (AF_INET6, &route->network, networkstr, sizeof (networkstr));
@@ -683,7 +690,7 @@ do_ip4_route_add (char **argv)
metric = strtol (*argv++, NULL, 10);
mss = strtol (*argv++, NULL, 10);
- return nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER,
+ return nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER,
network, plen, gateway, 0,
metric, mss);
}
@@ -699,7 +706,7 @@ do_ip6_route_add (char **argv)
parse_ip6_address (*argv++, &gateway, NULL);
metric = strtol (*argv++, NULL, 10);
mss = strtol (*argv++, NULL, 10);
- return nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER,
+ return nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER,
network, plen, gateway,
metric, mss);
}
@@ -714,7 +721,7 @@ do_ip4_route_delete (char **argv)
parse_ip4_address (*argv++, &network, &plen);
metric = strtol (*argv++, NULL, 10);
- return nm_platform_ip4_route_delete (ifindex, network, plen, metric);
+ return nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric);
}
static gboolean
@@ -727,11 +734,11 @@ do_ip6_route_delete (char **argv)
parse_ip6_address (*argv++, &network, &plen);
metric = strtol (*argv++, NULL, 10);
- return nm_platform_ip6_route_delete (ifindex, network, plen, metric);
+ return nm_platform_ip6_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric);
}
static gboolean
-do_ip4_route_exists (char **argv)
+do_ip4_route_get (char **argv)
{
int ifindex = parse_ifindex (*argv++);
in_addr_t network;
@@ -740,12 +747,12 @@ do_ip4_route_exists (char **argv)
parse_ip4_address (*argv++, &network, &plen);
metric = strtol (*argv++, NULL, 10);
- print_boolean (nm_platform_ip4_route_exists (ifindex, network, plen, metric));
+ print_boolean (!!nm_platform_ip4_route_get (NM_PLATFORM_GET, ifindex, network, plen, metric));
return TRUE;
}
static gboolean
-do_ip6_route_exists (char **argv)
+do_ip6_route_get (char **argv)
{
int ifindex = parse_ifindex (*argv++);
struct in6_addr network;
@@ -754,7 +761,7 @@ do_ip6_route_exists (char **argv)
parse_ip6_address (*argv++, &network, &plen);
metric = strtol (*argv++, NULL, 10);
- print_boolean (nm_platform_ip6_route_exists (ifindex, network, plen, metric));
+ print_boolean (!!nm_platform_ip6_route_get (NM_PLATFORM_GET, ifindex, network, plen, metric));
return TRUE;
}
@@ -831,9 +838,9 @@ static const command_t commands[] = {
"<ifname/ifindex> <address>/<plen>" },
{ "ip6-address-delete", "delete IPv6 address", do_ip6_address_delete, 2,
"<ifname/ifindex> <address>/<plen>" },
- { "ip4-address-exists", "check for existence of IPv4 address", do_ip4_address_exists, 2,
+ { "ip4-address-exists", "check for existence of IPv4 address", do_ip4_address_get, 2,
"<ifname/ifindex> <address>/<plen>" },
- { "ip6-address-exists", "check for existence of IPv6 address", do_ip6_address_exists, 2,
+ { "ip6-address-exists", "check for existence of IPv6 address", do_ip6_address_get, 2,
"<ifname/ifindex> <address>/<plen>" },
{ "ip4-route-get-all", "print all IPv4 routes", do_ip4_route_get_all, 1, "<ifname/ifindex>" },
{ "ip6-route-get-all", "print all IPv6 routes", do_ip6_route_get_all, 1, "<ifname/ifindex>" },
@@ -845,9 +852,9 @@ static const command_t commands[] = {
"<ifname/ifindex> <network>/<plen> <metric>" },
{ "ip6-route-delete", "delete IPv6 route", do_ip6_route_delete, 3,
"<ifname/ifindex> <network>/<plen> <metric>" },
- { "ip4-route-exists", "check for existence of IPv4 route", do_ip4_route_exists, 3,
+ { "ip4-route-exists", "check for existence of IPv4 route", do_ip4_route_get, 3,
"<ifname/ifindex> <network>/<plen> <metric>" },
- { "ip6-route-exists", "check for existence of IPv6 route", do_ip6_route_exists, 3,
+ { "ip6-route-exists", "check for existence of IPv6 route", do_ip6_route_get, 3,
"<ifname/ifindex> <network>/<plen> <metric>" },
{ NULL, NULL, NULL, 0, NULL },
};
@@ -858,7 +865,6 @@ main (int argc, char **argv)
const char *arg0 = *argv++;
const command_t *command = NULL;
gboolean status = TRUE;
- int error;
#if !GLIB_CHECK_VERSION (2, 35, 0)
g_type_init ();
@@ -892,12 +898,5 @@ main (int argc, char **argv)
error ("\n");
}
- error = nm_platform_get_error ();
- if (error) {
- const char *msg = nm_platform_get_error_msg ();
-
- error ("nm-platform: %s\n", msg);
- }
-
- return !!error;
+ return EXIT_SUCCESS;
}
diff --git a/src/platform/tests/test-address.c b/src/platform/tests/test-address.c
index 5561038de..d6f346b37 100644
--- a/src/platform/tests/test-address.c
+++ b/src/platform/tests/test-address.c
@@ -9,7 +9,7 @@
#define IP6_PLEN 64
static void
-ip4_address_callback (NMPlatform *platform, int ifindex, NMPlatformIP4Address *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
+ip4_address_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformIP4Address *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
{
g_assert (received);
g_assert_cmpint (received->ifindex, ==, ifindex);
@@ -24,14 +24,12 @@ ip4_address_callback (NMPlatform *platform, int ifindex, NMPlatformIP4Address *r
if (data->loop)
g_main_loop_quit (data->loop);
- if (data->received)
- g_error ("Received signal '%s' a second time.", data->name);
-
- data->received = TRUE;
+ data->received_count++;
+ debug ("Received signal '%s' %dth time.", data->name, data->received_count);
}
static void
-ip6_address_callback (NMPlatform *platform, int ifindex, NMPlatformIP6Address *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
+ip6_address_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformIP6Address *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
{
g_assert (received);
g_assert_cmpint (received->ifindex, ==, ifindex);
@@ -46,16 +44,14 @@ ip6_address_callback (NMPlatform *platform, int ifindex, NMPlatformIP6Address *r
if (data->loop)
g_main_loop_quit (data->loop);
- if (data->received)
- g_error ("Received signal '%s' a second time.", data->name);
-
- data->received = TRUE;
+ data->received_count++;
+ debug ("Received signal '%s' %dth time.", data->name, data->received_count);
}
static void
test_ip4_address (void)
{
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
SignalData *address_added = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_address_callback, ifindex);
SignalData *address_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip4_address_callback, ifindex);
SignalData *address_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_address_callback, ifindex);
@@ -68,23 +64,18 @@ test_ip4_address (void)
inet_pton (AF_INET, IP4_ADDRESS, &addr);
/* Add address */
- g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
- no_error ();
- g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
- no_error ();
- g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
- no_error ();
+ g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
+ g_assert (nm_platform_ip4_address_add (NM_PLATFORM_GET, ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
+ g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
accept_signal (address_added);
/* Add address again (aka update) */
- g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
- no_error ();
- accept_signal (address_changed);
+ g_assert (nm_platform_ip4_address_add (NM_PLATFORM_GET, ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
+ accept_signals (address_changed, 0, 1);
/* Test address listing */
- addresses = nm_platform_ip4_address_get_all (ifindex);
+ addresses = nm_platform_ip4_address_get_all (NM_PLATFORM_GET, ifindex);
g_assert (addresses);
- no_error ();
g_assert_cmpint (addresses->len, ==, 1);
address = &g_array_index (addresses, NMPlatformIP4Address, 0);
g_assert_cmpint (address->ifindex, ==, ifindex);
@@ -93,14 +84,12 @@ test_ip4_address (void)
g_array_unref (addresses);
/* Remove address */
- g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
- no_error ();
- g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
+ g_assert (nm_platform_ip4_address_delete (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0));
+ g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
accept_signal (address_removed);
/* Remove address again */
- g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
- no_error ();
+ g_assert (nm_platform_ip4_address_delete (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, 0));
free_signal (address_added);
free_signal (address_changed);
@@ -110,7 +99,7 @@ test_ip4_address (void)
static void
test_ip6_address (void)
{
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
SignalData *address_added = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip6_address_callback, ifindex);
SignalData *address_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip6_address_callback, ifindex);
SignalData *address_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip6_address_callback, ifindex);
@@ -124,23 +113,18 @@ test_ip6_address (void)
inet_pton (AF_INET6, IP6_ADDRESS, &addr);
/* Add address */
- g_assert (!nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
- no_error ();
- g_assert (nm_platform_ip6_address_add (ifindex, addr, in6addr_any, IP6_PLEN, lifetime, preferred, flags));
- no_error ();
- g_assert (nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
- no_error ();
+ g_assert (!nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
+ g_assert (nm_platform_ip6_address_add (NM_PLATFORM_GET, ifindex, addr, in6addr_any, IP6_PLEN, lifetime, preferred, flags));
+ g_assert (nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
accept_signal (address_added);
/* Add address again (aka update) */
- g_assert (nm_platform_ip6_address_add (ifindex, addr, in6addr_any, IP6_PLEN, lifetime, preferred, flags));
- no_error ();
- accept_signal (address_changed);
+ g_assert (nm_platform_ip6_address_add (NM_PLATFORM_GET, ifindex, addr, in6addr_any, IP6_PLEN, lifetime, preferred, flags));
+ accept_signals (address_changed, 0, 1);
/* Test address listing */
- addresses = nm_platform_ip6_address_get_all (ifindex);
+ addresses = nm_platform_ip6_address_get_all (NM_PLATFORM_GET, ifindex);
g_assert (addresses);
- no_error ();
g_assert_cmpint (addresses->len, ==, 1);
address = &g_array_index (addresses, NMPlatformIP6Address, 0);
g_assert_cmpint (address->ifindex, ==, ifindex);
@@ -149,14 +133,12 @@ test_ip6_address (void)
g_array_unref (addresses);
/* Remove address */
- g_assert (nm_platform_ip6_address_delete (ifindex, addr, IP6_PLEN));
- no_error ();
- g_assert (!nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
+ g_assert (nm_platform_ip6_address_delete (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
+ g_assert (!nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
accept_signal (address_removed);
/* Remove address again */
- g_assert (nm_platform_ip6_address_delete (ifindex, addr, IP6_PLEN));
- no_error ();
+ g_assert (nm_platform_ip6_address_delete (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
free_signal (address_added);
free_signal (address_changed);
@@ -168,7 +150,7 @@ test_ip4_address_external (void)
{
SignalData *address_added = add_signal (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_address_callback);
SignalData *address_removed = add_signal (NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_address_callback);
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
in_addr_t addr;
guint32 lifetime = 2000;
guint32 preferred = 1000;
@@ -179,28 +161,26 @@ test_ip4_address_external (void)
/* Looks like addresses are not announced by kerenl when the interface
* is down. Link-local IPv6 address is automatically added.
*/
- g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME)));
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME), NULL));
/* Add/delete notification */
run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
IP4_ADDRESS, IP4_PLEN, DEVICE_NAME, lifetime, preferred);
wait_signal (address_added);
- g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
+ g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
run_command ("ip address delete %s/%d dev %s", IP4_ADDRESS, IP4_PLEN, DEVICE_NAME);
wait_signal (address_removed);
- g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
+ g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
/* Add/delete conflict */
run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
IP4_ADDRESS, IP4_PLEN, DEVICE_NAME, lifetime, preferred);
- g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
- no_error ();
- g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
+ g_assert (nm_platform_ip4_address_add (NM_PLATFORM_GET, ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
+ g_assert (nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
accept_signal (address_added);
/*run_command ("ip address delete %s/%d dev %s", IP4_ADDRESS, IP4_PLEN, DEVICE_NAME);
g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
- no_error ();
- g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
+ g_assert (!nm_platform_ip4_address_get (NM_PLATFORM_GET, ifindex, addr, IP4_PLEN));
accept_signal (address_removed);*/
free_signal (address_added);
@@ -212,7 +192,7 @@ test_ip6_address_external (void)
{
SignalData *address_added = add_signal (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip6_address_callback);
SignalData *address_removed = add_signal (NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip6_address_callback);
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
struct in6_addr addr;
guint32 lifetime = 2000;
guint32 preferred = 1000;
@@ -224,22 +204,20 @@ test_ip6_address_external (void)
run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
IP6_ADDRESS, IP6_PLEN, DEVICE_NAME, lifetime, preferred);
wait_signal (address_added);
- g_assert (nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
+ g_assert (nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
run_command ("ip address delete %s/%d dev %s", IP6_ADDRESS, IP6_PLEN, DEVICE_NAME);
wait_signal (address_removed);
- g_assert (!nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
+ g_assert (!nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
/* Add/delete conflict */
run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
IP6_ADDRESS, IP6_PLEN, DEVICE_NAME, lifetime, preferred);
- g_assert (nm_platform_ip6_address_add (ifindex, addr, in6addr_any, IP6_PLEN, lifetime, preferred, flags));
- no_error ();
- g_assert (nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
+ g_assert (nm_platform_ip6_address_add (NM_PLATFORM_GET, ifindex, addr, in6addr_any, IP6_PLEN, lifetime, preferred, flags));
+ g_assert (nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
accept_signal (address_added);
/*run_command ("ip address delete %s/%d dev %s", IP6_ADDRESS, IP6_PLEN, DEVICE_NAME);
- g_assert (nm_platform_ip6_address_delete (ifindex, addr, IP6_PLEN));
- no_error ();
- g_assert (!nm_platform_ip6_address_exists (ifindex, addr, IP6_PLEN));
+ g_assert (nm_platform_ip6_address_delete (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
+ g_assert (!nm_platform_ip6_address_get (NM_PLATFORM_GET, ifindex, addr, IP6_PLEN));
wait_signal (address_removed);*/
free_signal (address_added);
@@ -257,9 +235,9 @@ setup_tests (void)
{
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
- nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
- g_assert (!nm_platform_link_exists (DEVICE_NAME));
- g_assert (nm_platform_dummy_add (DEVICE_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);
diff --git a/src/platform/tests/test-cleanup.c b/src/platform/tests/test-cleanup.c
index 0d0f3f63a..0b825114a 100644
--- a/src/platform/tests/test-cleanup.c
+++ b/src/platform/tests/test-cleanup.c
@@ -35,30 +35,30 @@ test_cleanup_internal (void)
inet_pton (AF_INET6, "2001:db8:e:f:1:2:3:4", &gateway6);
/* Create and set up device */
- g_assert (nm_platform_dummy_add (DEVICE_NAME));
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);
- g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME)));
- ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME), NULL));
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
g_assert (ifindex > 0);
/* Add routes and addresses */
- g_assert (nm_platform_ip4_address_add (ifindex, addr4, 0, plen4, lifetime, preferred, NULL));
- g_assert (nm_platform_ip6_address_add (ifindex, addr6, in6addr_any, plen6, lifetime, preferred, flags));
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, gateway4, 32, INADDR_ANY, 0, metric, mss));
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network4, plen4, gateway4, 0, metric, mss));
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, 0, 0, gateway4, 0, metric, mss));
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, gateway6, 128, in6addr_any, metric, mss));
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network6, plen6, gateway6, metric, mss));
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, in6addr_any, 0, gateway6, metric, mss));
-
- addresses4 = nm_platform_ip4_address_get_all (ifindex);
- addresses6 = nm_platform_ip6_address_get_all (ifindex);
- routes4 = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
- routes6 = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ g_assert (nm_platform_ip4_address_add (NM_PLATFORM_GET, ifindex, addr4, 0, plen4, lifetime, preferred, NULL));
+ g_assert (nm_platform_ip6_address_add (NM_PLATFORM_GET, ifindex, addr6, in6addr_any, plen6, lifetime, preferred, flags));
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, gateway4, 32, INADDR_ANY, 0, metric, mss));
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network4, plen4, gateway4, 0, metric, mss));
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, 0, 0, gateway4, 0, metric, mss));
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, gateway6, 128, in6addr_any, metric, mss));
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network6, plen6, gateway6, metric, mss));
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, in6addr_any, 0, gateway6, metric, mss));
+
+ addresses4 = nm_platform_ip4_address_get_all (NM_PLATFORM_GET, ifindex);
+ addresses6 = nm_platform_ip6_address_get_all (NM_PLATFORM_GET, ifindex);
+ routes4 = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+ routes6 = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
g_assert_cmpint (addresses4->len, ==, 1);
- g_assert_cmpint (addresses6->len, ==, 1);
+ g_assert_cmpint (addresses6->len, ==, 2); /* also has a IPv6 LL address. */
g_assert_cmpint (routes4->len, ==, 3);
g_assert_cmpint (routes6->len, ==, 3);
@@ -68,12 +68,12 @@ test_cleanup_internal (void)
g_array_unref (routes6);
/* Delete interface with all addresses and routes */
- g_assert (nm_platform_link_delete (ifindex));
+ g_assert (nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
- addresses4 = nm_platform_ip4_address_get_all (ifindex);
- addresses6 = nm_platform_ip6_address_get_all (ifindex);
- routes4 = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
- routes6 = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ addresses4 = nm_platform_ip4_address_get_all (NM_PLATFORM_GET, ifindex);
+ addresses6 = nm_platform_ip6_address_get_all (NM_PLATFORM_GET, ifindex);
+ routes4 = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+ routes6 = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
g_assert_cmpint (addresses4->len, ==, 0);
g_assert_cmpint (addresses6->len, ==, 0);
@@ -95,8 +95,8 @@ init_tests (int *argc, char ***argv)
void
setup_tests (void)
{
- nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
- g_assert (!nm_platform_link_exists (DEVICE_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
g_test_add_func ("/internal", test_cleanup_internal);
/* FIXME: add external cleanup check */
diff --git a/src/platform/tests/test-common.c b/src/platform/tests/test-common.c
index 1980282dc..b0eae63b7 100644
--- a/src/platform/tests/test-common.c
+++ b/src/platform/tests/test-common.c
@@ -1,9 +1,31 @@
#include "config.h"
+#include <sys/mount.h>
+#include <sched.h>
+
#include "test-common.h"
#include "nm-test-utils.h"
+#define SIGNAL_DATA_FMT "'%s-%s' ifindex %d%s%s%s (%d times received)"
+#define SIGNAL_DATA_ARG(data) (data)->name, nm_platform_signal_change_type_to_string ((data)->change_type), (data)->ifindex, (data)->ifname ? " ifname '" : "", (data)->ifname ? (data)->ifname : "", (data)->ifname ? "'" : "", (data)->received_count
+
+
+gboolean
+nmtst_platform_is_root_test (void)
+{
+ NM_PRAGMA_WARNING_DISABLE("-Wtautological-compare")
+ return (SETUP == nm_linux_platform_setup);
+ NM_PRAGMA_WARNING_REENABLE
+}
+
+gboolean
+nmtst_platform_is_sysfs_writable (void)
+{
+ return !nmtst_platform_is_root_test ()
+ || (access ("/sys/devices", W_OK) == 0);
+}
+
SignalData *
add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCallback callback, int ifindex, const char *ifname)
{
@@ -11,7 +33,7 @@ add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCall
data->name = name;
data->change_type = change_type;
- data->received = FALSE;
+ data->received_count = 0;
data->handler_id = g_signal_connect (nm_platform_get (), name, callback, data);
data->ifindex = ifindex;
data->ifname = ifname;
@@ -21,58 +43,60 @@ add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCall
return data;
}
-static const char *
-_change_type_to_string (NMPlatformSignalChangeType change_type)
+void
+_accept_signal (const char *file, int line, const char *func, SignalData *data)
{
- switch (change_type) {
- case NM_PLATFORM_SIGNAL_ADDED:
- return "added";
- case NM_PLATFORM_SIGNAL_CHANGED:
- return "changed";
- case NM_PLATFORM_SIGNAL_REMOVED:
- return "removed";
- default:
- g_return_val_if_reached ("UNKNOWN");
- }
+ debug ("NMPlatformSignalAssert: %s:%d, %s(): Accepting signal one time: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
+ if (data->received_count != 1)
+ g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to accept signal one time: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
+ data->received_count = 0;
}
void
-accept_signal (SignalData *data)
+_accept_signals (const char *file, int line, const char *func, SignalData *data, int min, int max)
{
- debug ("Accepting signal '%s-%s' ifindex %d ifname %s.", data->name, _change_type_to_string (data->change_type), data->ifindex, data->ifname);
- if (!data->received)
- g_error ("Attemted to accept a non-received signal '%s-%s'.", data->name, _change_type_to_string (data->change_type));
+ debug ("NMPlatformSignalAssert: %s:%d, %s(): Accepting signal [%d,%d] times: "SIGNAL_DATA_FMT, file, line, func, min, max, SIGNAL_DATA_ARG (data));
+ if (data->received_count < min || data->received_count > max)
+ g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to accept signal [%d,%d] times: "SIGNAL_DATA_FMT, file, line, func, min, max, SIGNAL_DATA_ARG (data));
+ data->received_count = 0;
+}
- data->received = FALSE;
+void
+_ensure_no_signal (const char *file, int line, const char *func, SignalData *data)
+{
+ debug ("NMPlatformSignalAssert: %s:%d, %s(): Accepting signal 0 times: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
+ if (data->received_count > 0)
+ g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to accept signal 0 times: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
}
void
-wait_signal (SignalData *data)
+_wait_signal (const char *file, int line, const char *func, SignalData *data)
{
- if (data->received)
- g_error ("Signal '%s' received before waiting for it.", data->name);
+ debug ("NMPlatformSignalAssert: %s:%d, %s(): wait signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
+ if (data->received_count)
+ g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to wait for signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
data->loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (data->loop);
g_clear_pointer (&data->loop, g_main_loop_unref);
- accept_signal (data);
+ _accept_signal (file, line, func, data);
}
void
-free_signal (SignalData *data)
+_free_signal (const char *file, int line, const char *func, SignalData *data)
{
- if (data->received)
- g_error ("Attempted to free received but not accepted signal '%s-%s'.", data->name, _change_type_to_string (data->change_type));
+ debug ("NMPlatformSignalAssert: %s:%d, %s(): free signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
+ if (data->received_count != 0)
+ g_error ("NMPlatformSignalAssert: %s:%d, %s(): failure to free non-accepted signal: "SIGNAL_DATA_FMT, file, line, func, SIGNAL_DATA_ARG (data));
g_signal_handler_disconnect (nm_platform_get (), data->handler_id);
g_free (data);
}
void
-link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
+link_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformLink *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
{
-
GArray *links;
NMPlatformLink *cached;
int i;
@@ -84,7 +108,7 @@ link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPl
if (data->ifindex && data->ifindex != received->ifindex)
return;
- if (data->ifname && g_strcmp0 (data->ifname, nm_platform_link_get_name (ifindex)) != 0)
+ if (data->ifname && g_strcmp0 (data->ifname, nm_platform_link_get_name (NM_PLATFORM_GET, ifindex)) != 0)
return;
if (change_type != data->change_type)
return;
@@ -94,20 +118,17 @@ link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPl
g_main_loop_quit (data->loop);
}
- if (data->received)
- g_error ("Received signal '%s-%s' a second time.", data->name, _change_type_to_string (data->change_type));
-
- debug ("Received signal '%s-%s' ifindex %d ifname '%s'.", data->name, _change_type_to_string (data->change_type), ifindex, received->name);
- data->received = TRUE;
+ data->received_count++;
+ debug ("Received signal '%s-%s' ifindex %d ifname '%s' %dth time.", data->name, nm_platform_signal_change_type_to_string (data->change_type), ifindex, received->name, data->received_count);
if (change_type == NM_PLATFORM_SIGNAL_REMOVED)
- g_assert (!nm_platform_link_get_name (ifindex));
+ g_assert (!nm_platform_link_get_name (NM_PLATFORM_GET, ifindex));
else
- g_assert (nm_platform_link_get_name (ifindex));
+ g_assert (nm_platform_link_get_name (NM_PLATFORM_GET, ifindex));
/* Check the data */
g_assert (received->ifindex > 0);
- links = nm_platform_link_get_all ();
+ links = nm_platform_link_get_all (NM_PLATFORM_GET);
for (i = 0; i < links->len; i++) {
cached = &g_array_index (links, NMPlatformLink, i);
if (cached->ifindex == received->ifindex) {
@@ -221,9 +242,9 @@ _assert_ip4_route_exists (const char *file, guint line, const char *func, gboole
exists ? "doesn't" : "does");
}
- ifindex = nm_platform_link_get_ifindex (ifname);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, ifname);
g_assert (ifindex > 0);
- if (!nm_platform_ip4_route_exists (ifindex, network, plen, metric) != !exists) {
+ if (!nm_platform_ip4_route_get (NM_PLATFORM_GET, ifindex, network, plen, metric) != !exists) {
g_error ("[%s:%u] %s(): The ip4 route %s/%d metric %u %s, but platform thinks %s",
file, line, func,
nm_utils_inet4_ntop (network, NULL), plen, metric,
@@ -249,6 +270,46 @@ run_command (const char *format, ...)
NMTST_DEFINE();
+static gboolean
+unshare_user (void)
+{
+ FILE *f;
+ uid_t uid = geteuid ();
+ gid_t gid = getegid ();
+
+ /* Already a root? */
+ if (gid == 0 && uid == 0)
+ return TRUE;
+
+ /* Become a root in new user NS. */
+ if (unshare (CLONE_NEWUSER) != 0)
+ return FALSE;
+
+ /* Since Linux 3.19 we have to disable setgroups() in order to map users.
+ * Just proceed if the file is not there. */
+ f = fopen ("/proc/self/setgroups", "w");
+ if (f) {
+ fprintf (f, "deny");
+ fclose (f);
+ }
+
+ /* Map current UID to root in NS to be created. */
+ f = fopen ("/proc/self/uid_map", "w");
+ if (!f)
+ return FALSE;
+ fprintf (f, "0 %d 1", uid);
+ fclose (f);
+
+ /* Map current GID to root in NS to be created. */
+ f = fopen ("/proc/self/gid_map", "w");
+ if (!f)
+ return FALSE;
+ fprintf (f, "0 %d 1", gid);
+ fclose (f);
+
+ return TRUE;
+}
+
int
main (int argc, char **argv)
{
@@ -257,20 +318,62 @@ main (int argc, char **argv)
init_tests (&argc, &argv);
- NM_PRAGMA_WARNING_DISABLE("-Wtautological-compare")
- if (SETUP == nm_linux_platform_setup && getuid() != 0) {
- /* Try to exec as sudo, this function does not return, if a sudo-cmd is set. */
- nmtst_reexec_sudo ();
+ if ( nmtst_platform_is_root_test ()
+ && (geteuid () != 0 || getegid () != 0)) {
+ if ( g_getenv ("NMTST_FORCE_REAL_ROOT")
+ || !unshare_user ()) {
+ /* Try to exec as sudo, this function does not return, if a sudo-cmd is set. */
+ nmtst_reexec_sudo ();
#ifdef REQUIRE_ROOT_TESTS
- g_print ("Fail test: requires root privileges (%s)\n", program);
- return EXIT_FAILURE;
+ g_print ("Fail test: requires root privileges (%s)\n", program);
+ return EXIT_FAILURE;
#else
- g_print ("Skipping test: requires root privileges (%s)\n", program);
- return 77;
+ g_print ("Skipping test: requires root privileges (%s)\n", program);
+ return g_test_run ();
#endif
+ }
+ }
+
+ if (nmtst_platform_is_root_test () && !g_getenv ("NMTST_NO_UNSHARE")) {
+ int errsv;
+
+ if (unshare (CLONE_NEWNET | CLONE_NEWNS) != 0) {
+ errsv = errno;
+ g_error ("unshare(CLONE_NEWNET|CLONE_NEWNS) failed with %s (%d)", strerror (errsv), errsv);
+ }
+
+ /* Mount our /sys instance, so that gudev sees only our devices.
+ * Needs to be read-only, because we don't run udev. */
+ if (mount (NULL, "/sys", "sysfs", MS_SLAVE, NULL) != 0) {
+ errsv = errno;
+ g_error ("mount(\"/\", MS_SLAVE) failed with %s (%d)", strerror (errsv), errsv);
+ }
+ if (mount ("sys", "/sys", "sysfs", MS_RDONLY, NULL) != 0) {
+ errsv = errno;
+ g_error ("mount(\"/sys\") failed with %s (%d)", strerror (errsv), errsv);
+ }
+
+ /* Create a writable /sys/devices tree. This makes it possible to run tests
+ * that modify values via sysfs (such as bridge forward delay). */
+ if (mount ("sys", "/sys/devices", "sysfs", 0, NULL) != 0) {
+ errsv = errno;
+ g_error ("mount(\"/sys/devices\") failed with %s (%d)", strerror (errsv), errsv);
+ }
+ if (mount (NULL, "/sys/devices", "sysfs", MS_REMOUNT, NULL) != 0) {
+ /* Read-write remount failed. Never mind, we're probably just a root in
+ * our user NS. */
+ if (umount ("/sys/devices") != 0) {
+ errsv = errno;
+ g_error ("umount(\"/sys/devices\") failed with %s (%d)", strerror (errsv), errsv);
+ }
+ } else {
+ if (mount ("/sys/devices/devices", "/sys/devices", "sysfs", MS_BIND, NULL) != 0) {
+ errsv = errno;
+ g_error ("mount(\"/sys\") failed with %s (%d)", strerror (errsv), errsv);
+ }
+ }
}
- NM_PRAGMA_WARNING_REENABLE
SETUP ();
@@ -278,8 +381,8 @@ main (int argc, char **argv)
result = g_test_run ();
- nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
- nm_platform_free ();
+ g_object_unref (nm_platform_get ());
return result;
}
diff --git a/src/platform/tests/test-common.h b/src/platform/tests/test-common.h
index 367833d11..3d6475433 100644
--- a/src/platform/tests/test-common.h
+++ b/src/platform/tests/test-common.h
@@ -15,33 +15,40 @@
#define debug(...) nm_log_dbg (LOGD_PLATFORM, __VA_ARGS__)
-#define error(err) g_assert (nm_platform_get_error () == err)
-#define no_error() error (NM_PLATFORM_ERROR_NONE)
-
typedef struct {
int handler_id;
const char *name;
NMPlatformSignalChangeType change_type;
- gboolean received;
+ gint received_count;
GMainLoop *loop;
int ifindex;
const char *ifname;
} SignalData;
+gboolean nmtst_platform_is_root_test (void);
+gboolean nmtst_platform_is_sysfs_writable (void);
+
SignalData *add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCallback callback, int ifindex, const char *ifname);
#define add_signal(name, change_type, callback) add_signal_full (name, change_type, (GCallback) callback, 0, NULL)
#define add_signal_ifindex(name, change_type, callback, ifindex) add_signal_full (name, change_type, (GCallback) callback, ifindex, NULL)
#define add_signal_ifname(name, change_type, callback, ifname) add_signal_full (name, change_type, (GCallback) callback, 0, ifname)
-void accept_signal (SignalData *data);
-void wait_signal (SignalData *data);
-void free_signal (SignalData *data);
+void _accept_signal (const char *file, int line, const char *func, SignalData *data);
+void _accept_signals (const char *file, int line, const char *func, SignalData *data, int min, int max);
+void _wait_signal (const char *file, int line, const char *func, SignalData *data);
+void _ensure_no_signal (const char *file, int line, const char *func, SignalData *data);
+void _free_signal (const char *file, int line, const char *func, SignalData *data);
+#define accept_signal(data) _accept_signal(__FILE__, __LINE__, G_STRFUNC, data)
+#define accept_signals(data, min, max) _accept_signals(__FILE__, __LINE__, G_STRFUNC, data, min, max)
+#define wait_signal(data) _wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
+#define ensure_no_signal(data) _ensure_no_signal(__FILE__, __LINE__, G_STRFUNC, data)
+#define free_signal(data) _free_signal(__FILE__, __LINE__, G_STRFUNC, data)
gboolean ip4_route_exists (const char *ifname, guint32 network, int plen, guint32 metric);
void _assert_ip4_route_exists (const char *file, guint line, const char *func, gboolean exists, const char *ifname, guint32 network, int plen, guint32 metric);
#define assert_ip4_route_exists(exists, ifname, network, plen, metric) _assert_ip4_route_exists (__FILE__, __LINE__, G_STRFUNC, exists, ifname, network, plen, metric)
-void link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data);
+void link_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformLink *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data);
void run_command (const char *format, ...);
diff --git a/src/platform/tests/test-general.c b/src/platform/tests/test-general.c
new file mode 100644
index 000000000..0a397b378
--- /dev/null
+++ b/src/platform/tests/test-general.c
@@ -0,0 +1,67 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-platform.c - Handle runtime kernel networking configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include "nm-platform-utils.h"
+
+#include <linux/rtnetlink.h>
+
+#include "nm-linux-platform.h"
+#include "nm-logging.h"
+
+#include "nm-test-utils.h"
+
+
+/******************************************************************/
+
+static void
+test_init_linux_platform (void)
+{
+ gs_unref_object NMPlatform *platform = NULL;
+
+ platform = g_object_new (NM_TYPE_LINUX_PLATFORM, NULL);
+}
+
+/******************************************************************/
+
+static void
+test_link_get_all (void)
+{
+ gs_unref_object NMPlatform *platform = NULL;
+ gs_unref_array GArray *links = NULL;
+
+ platform = g_object_new (NM_TYPE_LINUX_PLATFORM, NULL);
+
+ links = nm_platform_link_get_all (platform);
+}
+
+/******************************************************************/
+
+NMTST_DEFINE ();
+
+int
+main (int argc, char **argv)
+{
+ nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
+
+ g_test_add_func ("/general/init_linux_platform", test_init_linux_platform);
+ g_test_add_func ("/general/link_get_all", test_link_get_all);
+
+ return g_test_run ();
+}
diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c
index 99556e0a2..dc7b83975 100644
--- a/src/platform/tests/test-link.c
+++ b/src/platform/tests/test-link.c
@@ -21,112 +21,94 @@ test_bogus(void)
{
size_t addrlen;
- g_assert (!nm_platform_link_exists (BOGUS_NAME));
- no_error ();
- g_assert (!nm_platform_link_delete (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_ifindex (BOGUS_NAME));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_name (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_type (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_type_name (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
-
- g_assert (!nm_platform_link_set_up (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_set_down (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_set_arp (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_set_noarp (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_is_up (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_is_connected (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_uses_arp (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
-
- g_assert (!nm_platform_link_get_address (BOGUS_IFINDEX, &addrlen));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, BOGUS_NAME));
+ g_assert (!nm_platform_link_delete (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_get_ifindex (NM_PLATFORM_GET, BOGUS_NAME));
+ g_assert (!nm_platform_link_get_name (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_get_type (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_get_type_name (NM_PLATFORM_GET, BOGUS_IFINDEX));
+
+ g_assert (!nm_platform_link_set_up (NM_PLATFORM_GET, BOGUS_IFINDEX, NULL));
+ g_assert (!nm_platform_link_set_down (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_set_arp (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_set_noarp (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_is_connected (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_uses_arp (NM_PLATFORM_GET, BOGUS_IFINDEX));
+
+ g_assert (!nm_platform_link_get_address (NM_PLATFORM_GET, BOGUS_IFINDEX, &addrlen));
g_assert (!addrlen);
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_address (BOGUS_IFINDEX, NULL));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_set_mtu (BOGUS_IFINDEX, MTU));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_mtu (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
-
- g_assert (!nm_platform_link_supports_carrier_detect (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_supports_vlans (BOGUS_IFINDEX));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
-
- g_assert (!nm_platform_vlan_get_info (BOGUS_IFINDEX, NULL, NULL));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_vlan_set_ingress_map (BOGUS_IFINDEX, 0, 0));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_vlan_set_egress_map (BOGUS_IFINDEX, 0, 0));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
+ g_assert (!nm_platform_link_get_address (NM_PLATFORM_GET, BOGUS_IFINDEX, NULL));
+ g_assert (!nm_platform_link_set_mtu (NM_PLATFORM_GET, BOGUS_IFINDEX, MTU));
+ g_assert (!nm_platform_link_get_mtu (NM_PLATFORM_GET, BOGUS_IFINDEX));
+
+ g_assert (!nm_platform_link_supports_carrier_detect (NM_PLATFORM_GET, BOGUS_IFINDEX));
+ g_assert (!nm_platform_link_supports_vlans (NM_PLATFORM_GET, BOGUS_IFINDEX));
+
+ g_assert (!nm_platform_vlan_get_info (NM_PLATFORM_GET, BOGUS_IFINDEX, NULL, NULL));
+ g_assert (!nm_platform_vlan_set_ingress_map (NM_PLATFORM_GET, BOGUS_IFINDEX, 0, 0));
+ g_assert (!nm_platform_vlan_set_egress_map (NM_PLATFORM_GET, BOGUS_IFINDEX, 0, 0));
}
static void
test_loopback (void)
{
- g_assert (nm_platform_link_exists (LO_NAME));
- g_assert_cmpint (nm_platform_link_get_type (LO_INDEX), ==, NM_LINK_TYPE_LOOPBACK);
- g_assert_cmpint (nm_platform_link_get_ifindex (LO_NAME), ==, LO_INDEX);
- g_assert_cmpstr (nm_platform_link_get_name (LO_INDEX), ==, LO_NAME);
- g_assert_cmpstr (nm_platform_link_get_type_name (LO_INDEX), ==, LO_TYPEDESC);
-
- g_assert (nm_platform_link_supports_carrier_detect (LO_INDEX));
- g_assert (!nm_platform_link_supports_vlans (LO_INDEX));
+ g_assert (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, LO_NAME));
+ g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, LO_INDEX), ==, NM_LINK_TYPE_LOOPBACK);
+ g_assert_cmpint (nm_platform_link_get_ifindex (NM_PLATFORM_GET, LO_NAME), ==, LO_INDEX);
+ g_assert_cmpstr (nm_platform_link_get_name (NM_PLATFORM_GET, LO_INDEX), ==, LO_NAME);
+ g_assert_cmpstr (nm_platform_link_get_type_name (NM_PLATFORM_GET, LO_INDEX), ==, LO_TYPEDESC);
+
+ g_assert (nm_platform_link_supports_carrier_detect (NM_PLATFORM_GET, LO_INDEX));
+ g_assert (!nm_platform_link_supports_vlans (NM_PLATFORM_GET, LO_INDEX));
}
-static int
+static gboolean
software_add (NMLinkType link_type, const char *name)
{
switch (link_type) {
case NM_LINK_TYPE_DUMMY:
- return nm_platform_dummy_add (name);
+ return nm_platform_dummy_add (NM_PLATFORM_GET, name, NULL) == NM_PLATFORM_ERROR_SUCCESS;
case NM_LINK_TYPE_BRIDGE:
- return nm_platform_bridge_add (name, NULL, 0);
+ return nm_platform_bridge_add (NM_PLATFORM_GET, name, NULL, 0, NULL) == NM_PLATFORM_ERROR_SUCCESS;
case NM_LINK_TYPE_BOND:
{
- gboolean bond0_exists = nm_platform_link_exists ("bond0");
- gboolean result = nm_platform_bond_add (name);
- NMPlatformError error = nm_platform_get_error ();
+ gboolean bond0_exists = !!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "bond0");
+ NMPlatformError plerr;
+
+ plerr = nm_platform_bond_add (NM_PLATFORM_GET, name, NULL);
/* Check that bond0 is *not* automatically created. */
if (!bond0_exists)
- g_assert (!nm_platform_link_exists ("bond0"));
-
- nm_platform_set_error (error);
- return result;
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, "bond0"));
+ return plerr == NM_PLATFORM_ERROR_SUCCESS;
}
case NM_LINK_TYPE_TEAM:
- return nm_platform_team_add (name);
+ return nm_platform_team_add (NM_PLATFORM_GET, name, NULL) == NM_PLATFORM_ERROR_SUCCESS;
case NM_LINK_TYPE_VLAN: {
SignalData *parent_added;
SignalData *parent_changed;
/* Don't call link_callback for the bridge interface */
parent_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, PARENT_NAME);
- if (nm_platform_bridge_add (PARENT_NAME, NULL, 0))
+ if (nm_platform_bridge_add (NM_PLATFORM_GET, PARENT_NAME, NULL, 0, NULL) == NM_PLATFORM_ERROR_SUCCESS)
accept_signal (parent_added);
free_signal (parent_added);
{
- int parent_ifindex = nm_platform_link_get_ifindex (PARENT_NAME);
+ int parent_ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, PARENT_NAME);
+ gboolean was_up = nm_platform_link_is_up (NM_PLATFORM_GET, parent_ifindex);
parent_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, parent_ifindex);
- g_assert (nm_platform_link_set_up (parent_ifindex));
- accept_signal (parent_changed);
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, parent_ifindex, NULL));
+ if (was_up) {
+ /* when NM is running in the background, it will mess with addrgenmode which might cause additional signals. */
+ accept_signals (parent_changed, 0, 1);
+ } else
+ accept_signal (parent_changed);
free_signal (parent_changed);
- return nm_platform_vlan_add (name, parent_ifindex, VLAN_ID, 0);
+ return nm_platform_vlan_add (NM_PLATFORM_GET, name, parent_ifindex, VLAN_ID, 0, NULL) == NM_PLATFORM_ERROR_SUCCESS;
}
}
default:
@@ -142,9 +124,12 @@ test_slave (int master, int type, SignalData *master_changed)
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, SLAVE_NAME);
SignalData *link_changed, *link_removed;
char *value;
+ NMLinkType link_type = nm_platform_link_get_type (NM_PLATFORM_GET, master);
+
+ g_assert (NM_IN_SET (link_type, NM_LINK_TYPE_TEAM, NM_LINK_TYPE_BOND, NM_LINK_TYPE_BRIDGE));
g_assert (software_add (type, SLAVE_NAME));
- ifindex = nm_platform_link_get_ifindex (SLAVE_NAME);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, SLAVE_NAME);
g_assert (ifindex > 0);
link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex);
link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex);
@@ -154,46 +139,55 @@ test_slave (int master, int type, SignalData *master_changed)
*
* See https://bugzilla.redhat.com/show_bug.cgi?id=910348
*/
- g_assert (nm_platform_link_set_down (ifindex));
- g_assert (!nm_platform_link_is_up (ifindex));
- accept_signal (link_changed);
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_set_down (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ ensure_no_signal (link_changed);
/* Enslave */
link_changed->ifindex = ifindex;
- g_assert (nm_platform_link_enslave (master, ifindex)); no_error ();
- g_assert_cmpint (nm_platform_link_get_master (ifindex), ==, master); no_error ();
- accept_signal (link_changed);
- accept_signal (master_changed);
+ g_assert (nm_platform_link_enslave (NM_PLATFORM_GET, master, ifindex));
+ g_assert_cmpint (nm_platform_link_get_master (NM_PLATFORM_GET, ifindex), ==, master);
+
+ accept_signals (link_changed, 1, 3);
+ accept_signals (master_changed, 0, 1);
+
+ /* enslaveing brings put the slave */
+ if (NM_IN_SET (link_type, NM_LINK_TYPE_BOND, NM_LINK_TYPE_TEAM))
+ g_assert (nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ else
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
/* Set master up */
- g_assert (nm_platform_link_set_up (master));
- accept_signal (master_changed);
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, master, NULL));
+ g_assert (nm_platform_link_is_up (NM_PLATFORM_GET, master));
+ accept_signals (master_changed, 1, 2);
/* Master with a disconnected slave is disconnected
*
* For some reason, bonding and teaming slaves are automatically set up. We
* need to set them back down for this test.
*/
- switch (nm_platform_link_get_type (master)) {
+ switch (nm_platform_link_get_type (NM_PLATFORM_GET, master)) {
case NM_LINK_TYPE_BOND:
case NM_LINK_TYPE_TEAM:
- g_assert (nm_platform_link_set_down (ifindex));
+ g_assert (nm_platform_link_set_down (NM_PLATFORM_GET, ifindex));
accept_signal (link_changed);
- accept_signal (master_changed);
+ accept_signals (master_changed, 0, 2);
break;
default:
break;
}
- g_assert (!nm_platform_link_is_up (ifindex));
- g_assert (!nm_platform_link_is_connected (ifindex));
- if (nm_platform_link_is_connected (master)) {
- if (nm_platform_link_get_type (master) == NM_LINK_TYPE_TEAM) {
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
+ if (nm_platform_link_is_connected (NM_PLATFORM_GET, master)) {
+ if (nm_platform_link_get_type (NM_PLATFORM_GET, master) == NM_LINK_TYPE_TEAM) {
/* Older team versions (e.g. Fedora 17) have a bug that team master stays
* IFF_LOWER_UP even if its slave is down. Double check it with iproute2 and if
* `ip link` also claims master to be up, accept it. */
char *stdout_str = NULL;
- nmtst_spawn_sync (NULL, &stdout_str, NULL, 0, "/sbin/ip", "link", "show", "dev", nm_platform_link_get_name (master));
+ nmtst_spawn_sync (NULL, &stdout_str, NULL, 0, "/sbin/ip", "link", "show", "dev", nm_platform_link_get_name (NM_PLATFORM_GET, master));
g_assert (strstr (stdout_str, "LOWER_UP"));
g_free (stdout_str);
@@ -202,47 +196,59 @@ test_slave (int master, int type, SignalData *master_changed)
}
/* Set slave up and see if master gets up too */
- g_assert (nm_platform_link_set_up (ifindex)); no_error ();
- g_assert (nm_platform_link_is_connected (ifindex));
- g_assert (nm_platform_link_is_connected (master));
- accept_signal (link_changed);
- accept_signal (master_changed);
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, ifindex, NULL));
+ g_assert (nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_is_connected (NM_PLATFORM_GET, master));
+ accept_signals (link_changed, 1, 3);
+ /* NM running, can cause additional change of addrgenmode */
+ accept_signals (master_changed, 1, 2);
/* Enslave again
*
* Gracefully succeed if already enslaved.
*/
- g_assert (nm_platform_link_enslave (master, ifindex)); no_error ();
- accept_signal (link_changed);
- accept_signal (master_changed);
+ ensure_no_signal (link_changed);
+ g_assert (nm_platform_link_enslave (NM_PLATFORM_GET, master, ifindex));
+ accept_signals (link_changed, 0, 2);
+ ensure_no_signal (master_changed);
/* Set slave option */
switch (type) {
case NM_LINK_TYPE_BRIDGE:
- g_assert (nm_platform_slave_set_option (ifindex, "priority", "789"));
- no_error ();
- value = nm_platform_slave_get_option (ifindex, "priority");
- no_error ();
- g_assert_cmpstr (value, ==, "789");
- g_free (value);
+ if (nmtst_platform_is_sysfs_writable ()) {
+ g_assert (nm_platform_slave_set_option (NM_PLATFORM_GET, ifindex, "priority", "789"));
+ value = nm_platform_slave_get_option (NM_PLATFORM_GET, ifindex, "priority");
+ g_assert_cmpstr (value, ==, "789");
+ g_free (value);
+ }
break;
default:
break;
}
/* Release */
- g_assert (nm_platform_link_release (master, ifindex));
- g_assert_cmpint (nm_platform_link_get_master (ifindex), ==, 0); no_error ();
- accept_signal (link_changed);
- accept_signal (master_changed);
+ ensure_no_signal (link_changed);
+ g_assert (nm_platform_link_release (NM_PLATFORM_GET, master, ifindex));
+ g_assert_cmpint (nm_platform_link_get_master (NM_PLATFORM_GET, ifindex), ==, 0);
+ accept_signals (link_changed, 1, 3);
+ if (link_type != NM_LINK_TYPE_TEAM)
+ accept_signals (master_changed, 1, 2);
+ else
+ accept_signals (master_changed, 1, 1);
+
+ ensure_no_signal (master_changed);
/* Release again */
- g_assert (!nm_platform_link_release (master, ifindex));
- error (NM_PLATFORM_ERROR_NOT_SLAVE);
+ ensure_no_signal (link_changed);
+ g_assert (!nm_platform_link_release (NM_PLATFORM_GET, master, ifindex));
+
+ ensure_no_signal (master_changed);
/* Remove */
- g_assert (nm_platform_link_delete (ifindex));
- no_error ();
+ ensure_no_signal (link_changed);
+ g_assert (nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
+ accept_signals (master_changed, 0, 1);
+ accept_signals (link_changed, 0, 1);
accept_signal (link_removed);
free_signal (link_added);
@@ -262,53 +268,50 @@ test_software (NMLinkType link_type, const char *link_typename)
/* Add */
link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
g_assert (software_add (link_type, DEVICE_NAME));
- no_error ();
accept_signal (link_added);
- g_assert (nm_platform_link_exists (DEVICE_NAME));
- ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ g_assert (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
g_assert (ifindex >= 0);
- g_assert_cmpint (nm_platform_link_get_type (ifindex), ==, link_type);
- g_assert_cmpstr (nm_platform_link_get_type_name (ifindex), ==, link_typename);
+ g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, ifindex), ==, link_type);
+ g_assert_cmpstr (nm_platform_link_get_type_name (NM_PLATFORM_GET, ifindex), ==, link_typename);
link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex);
link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex);
if (link_type == NM_LINK_TYPE_VLAN) {
- g_assert (nm_platform_vlan_get_info (ifindex, &vlan_parent, &vlan_id));
- g_assert_cmpint (vlan_parent, ==, nm_platform_link_get_ifindex (PARENT_NAME));
+ g_assert (nm_platform_vlan_get_info (NM_PLATFORM_GET, ifindex, &vlan_parent, &vlan_id));
+ g_assert_cmpint (vlan_parent, ==, nm_platform_link_get_ifindex (NM_PLATFORM_GET, PARENT_NAME));
g_assert_cmpint (vlan_id, ==, VLAN_ID);
- no_error ();
}
/* Add again */
g_assert (!software_add (link_type, DEVICE_NAME));
- error (NM_PLATFORM_ERROR_EXISTS);
/* Set ARP/NOARP */
- g_assert (nm_platform_link_uses_arp (ifindex));
- g_assert (nm_platform_link_set_noarp (ifindex));
- g_assert (!nm_platform_link_uses_arp (ifindex));
- accept_signal (link_changed);
- g_assert (nm_platform_link_set_arp (ifindex));
- g_assert (nm_platform_link_uses_arp (ifindex));
+ g_assert (nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_set_noarp (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
+ accept_signals (link_changed, 1, 2);
+ g_assert (nm_platform_link_set_arp (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
accept_signal (link_changed);
/* Set master option */
switch (link_type) {
case NM_LINK_TYPE_BRIDGE:
- g_assert (nm_platform_master_set_option (ifindex, "forward_delay", "789"));
- no_error ();
- value = nm_platform_master_get_option (ifindex, "forward_delay");
- no_error ();
- g_assert_cmpstr (value, ==, "789");
- g_free (value);
+ if (nmtst_platform_is_sysfs_writable ()) {
+ g_assert (nm_platform_master_set_option (NM_PLATFORM_GET, ifindex, "forward_delay", "789"));
+ value = nm_platform_master_get_option (NM_PLATFORM_GET, ifindex, "forward_delay");
+ g_assert_cmpstr (value, ==, "789");
+ g_free (value);
+ }
break;
case NM_LINK_TYPE_BOND:
- g_assert (nm_platform_master_set_option (ifindex, "mode", "active-backup"));
- no_error ();
- value = nm_platform_master_get_option (ifindex, "mode");
- no_error ();
- /* When reading back, the output looks slightly different. */
- g_assert (g_str_has_prefix (value, "active-backup"));
- g_free (value);
+ if (nmtst_platform_is_sysfs_writable ()) {
+ g_assert (nm_platform_master_set_option (NM_PLATFORM_GET, ifindex, "mode", "active-backup"));
+ value = nm_platform_master_get_option (NM_PLATFORM_GET, ifindex, "mode");
+ /* When reading back, the output looks slightly different. */
+ g_assert (g_str_has_prefix (value, "active-backup"));
+ g_free (value);
+ }
break;
default:
break;
@@ -326,33 +329,29 @@ test_software (NMLinkType link_type, const char *link_typename)
default:
break;
}
+ free_signal (link_changed);
/* Delete */
- g_assert (nm_platform_link_delete (ifindex));
- no_error ();
- g_assert (!nm_platform_link_exists (DEVICE_NAME)); no_error ();
- g_assert_cmpint (nm_platform_link_get_type (ifindex), ==, NM_LINK_TYPE_NONE);
- error (NM_PLATFORM_ERROR_NOT_FOUND);
- g_assert (!nm_platform_link_get_type (ifindex));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
+ g_assert (nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, ifindex), ==, NM_LINK_TYPE_NONE);
+ g_assert (!nm_platform_link_get_type (NM_PLATFORM_GET, ifindex));
accept_signal (link_removed);
/* Delete again */
- g_assert (!nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME)));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
+ g_assert (!nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME)));
/* VLAN: Delete parent */
if (link_type == NM_LINK_TYPE_VLAN) {
SignalData *link_removed_parent = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, vlan_parent);
- g_assert (nm_platform_link_delete (vlan_parent));
+ g_assert (nm_platform_link_delete (NM_PLATFORM_GET, vlan_parent));
accept_signal (link_removed_parent);
free_signal (link_removed_parent);
}
/* No pending signal */
free_signal (link_added);
- free_signal (link_changed);
free_signal (link_removed);
}
@@ -365,14 +364,12 @@ test_bridge (void)
static void
test_bond (void)
{
- NM_PRAGMA_WARNING_DISABLE("-Wtautological-compare")
- if (SETUP == nm_linux_platform_setup &&
+ if (nmtst_platform_is_root_test () &&
!g_file_test ("/proc/1/net/bonding", G_FILE_TEST_IS_DIR) &&
system("modprobe --show bonding") != 0) {
g_test_skip ("Skipping test for bonding: bonding module not available");
return;
}
- NM_PRAGMA_WARNING_REENABLE
test_software (NM_LINK_TYPE_BOND, "bond");
}
@@ -400,76 +397,70 @@ test_internal (void)
int ifindex;
/* Check the functions for non-existent devices */
- g_assert (!nm_platform_link_exists (DEVICE_NAME)); no_error ();
- g_assert (!nm_platform_link_get_ifindex (DEVICE_NAME));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (!nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
/* Add device */
- g_assert (nm_platform_dummy_add (DEVICE_NAME));
- no_error ();
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
/* Try to add again */
- g_assert (!nm_platform_dummy_add (DEVICE_NAME));
- error (NM_PLATFORM_ERROR_EXISTS);
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_EXISTS);
/* Check device index, name and type */
- ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
g_assert (ifindex > 0);
- g_assert_cmpstr (nm_platform_link_get_name (ifindex), ==, DEVICE_NAME);
- g_assert_cmpint (nm_platform_link_get_type (ifindex), ==, NM_LINK_TYPE_DUMMY);
- g_assert_cmpstr (nm_platform_link_get_type_name (ifindex), ==, DUMMY_TYPEDESC);
+ g_assert_cmpstr (nm_platform_link_get_name (NM_PLATFORM_GET, ifindex), ==, DEVICE_NAME);
+ g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, ifindex), ==, NM_LINK_TYPE_DUMMY);
+ g_assert_cmpstr (nm_platform_link_get_type_name (NM_PLATFORM_GET, ifindex), ==, DUMMY_TYPEDESC);
link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex);
link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex);
/* Up/connected */
- g_assert (!nm_platform_link_is_up (ifindex)); no_error ();
- g_assert (!nm_platform_link_is_connected (ifindex)); no_error ();
- g_assert (nm_platform_link_set_up (ifindex)); no_error ();
- g_assert (nm_platform_link_is_up (ifindex)); no_error ();
- g_assert (nm_platform_link_is_connected (ifindex)); no_error ();
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, ifindex, NULL));
+ g_assert (nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
accept_signal (link_changed);
- g_assert (nm_platform_link_set_down (ifindex)); no_error ();
- g_assert (!nm_platform_link_is_up (ifindex)); no_error ();
- g_assert (!nm_platform_link_is_connected (ifindex)); no_error ();
+ g_assert (nm_platform_link_set_down (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
accept_signal (link_changed);
/* arp/noarp */
- g_assert (!nm_platform_link_uses_arp (ifindex));
- g_assert (nm_platform_link_set_arp (ifindex));
- g_assert (nm_platform_link_uses_arp (ifindex));
+ g_assert (!nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_set_arp (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
accept_signal (link_changed);
- g_assert (nm_platform_link_set_noarp (ifindex));
- g_assert (!nm_platform_link_uses_arp (ifindex));
+ g_assert (nm_platform_link_set_noarp (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
accept_signal (link_changed);
/* Features */
- g_assert (!nm_platform_link_supports_carrier_detect (ifindex));
- g_assert (nm_platform_link_supports_vlans (ifindex));
+ g_assert (!nm_platform_link_supports_carrier_detect (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_supports_vlans (NM_PLATFORM_GET, ifindex));
/* Set MAC address */
- g_assert (nm_platform_link_set_address (ifindex, mac, sizeof (mac)));
- address = nm_platform_link_get_address (ifindex, &addrlen);
+ g_assert (nm_platform_link_set_address (NM_PLATFORM_GET, ifindex, mac, sizeof (mac)));
+ address = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, &addrlen);
g_assert (addrlen == sizeof(mac));
g_assert (!memcmp (address, mac, addrlen));
- address = nm_platform_link_get_address (ifindex, NULL);
+ address = nm_platform_link_get_address (NM_PLATFORM_GET, ifindex, NULL);
g_assert (!memcmp (address, mac, addrlen));
accept_signal (link_changed);
/* Set MTU */
- g_assert (nm_platform_link_set_mtu (ifindex, MTU));
- no_error ();
- g_assert_cmpint (nm_platform_link_get_mtu (ifindex), ==, MTU);
+ g_assert (nm_platform_link_set_mtu (NM_PLATFORM_GET, ifindex, MTU));
+ g_assert_cmpint (nm_platform_link_get_mtu (NM_PLATFORM_GET, ifindex), ==, MTU);
accept_signal (link_changed);
/* Delete device */
- g_assert (nm_platform_link_delete (ifindex));
- no_error ();
+ g_assert (nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
accept_signal (link_removed);
/* Try to delete again */
- g_assert (!nm_platform_link_delete (ifindex));
- error (NM_PLATFORM_ERROR_NOT_FOUND);
+ g_assert (!nm_platform_link_delete (NM_PLATFORM_GET, ifindex));
free_signal (link_added);
free_signal (link_changed);
@@ -479,60 +470,56 @@ test_internal (void)
static void
test_external (void)
{
- NMPlatformLink link;
+ const NMPlatformLink *pllink;
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
SignalData *link_changed, *link_removed;
int ifindex;
- gboolean success;
run_command ("ip link add %s type %s", DEVICE_NAME, "dummy");
wait_signal (link_added);
- g_assert (nm_platform_link_exists (DEVICE_NAME));
- ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+
+ g_assert (nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
g_assert (ifindex > 0);
- g_assert_cmpstr (nm_platform_link_get_name (ifindex), ==, DEVICE_NAME);
- g_assert_cmpint (nm_platform_link_get_type (ifindex), ==, NM_LINK_TYPE_DUMMY);
- g_assert_cmpstr (nm_platform_link_get_type_name (ifindex), ==, DUMMY_TYPEDESC);
+ g_assert_cmpstr (nm_platform_link_get_name (NM_PLATFORM_GET, ifindex), ==, DEVICE_NAME);
+ g_assert_cmpint (nm_platform_link_get_type (NM_PLATFORM_GET, ifindex), ==, NM_LINK_TYPE_DUMMY);
+ g_assert_cmpstr (nm_platform_link_get_type_name (NM_PLATFORM_GET, ifindex), ==, DUMMY_TYPEDESC);
link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex);
link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex);
- success = nm_platform_link_get (ifindex, &link);
- g_assert (success);
- if (!link.driver) {
+ pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex);
+ g_assert (pllink);
+ if (!pllink->initialized) {
/* we still lack the notification via UDEV. Expect another link changed signal. */
wait_signal (link_changed);
}
/* Up/connected/arp */
- g_assert (!nm_platform_link_is_up (ifindex));
- g_assert (!nm_platform_link_is_connected (ifindex));
- g_assert (!nm_platform_link_uses_arp (ifindex));
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
+
run_command ("ip link set %s up", DEVICE_NAME);
wait_signal (link_changed);
- g_assert (nm_platform_link_is_up (ifindex));
- g_assert (nm_platform_link_is_connected (ifindex));
+
+ g_assert (nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
run_command ("ip link set %s down", DEVICE_NAME);
wait_signal (link_changed);
- g_assert (!nm_platform_link_is_up (ifindex));
- g_assert (!nm_platform_link_is_connected (ifindex));
- /* This test doesn't trigger a netlink event at least on
- * 3.8.2-206.fc18.x86_64. Disabling the waiting and checking code
- * because of that.
- */
+ g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
+ g_assert (!nm_platform_link_is_connected (NM_PLATFORM_GET, ifindex));
+
run_command ("ip link set %s arp on", DEVICE_NAME);
-#if 0
wait_signal (link_changed);
- g_assert (nm_platform_link_uses_arp (ifindex));
-#endif
+ g_assert (nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
run_command ("ip link set %s arp off", DEVICE_NAME);
-#if 0
wait_signal (link_changed);
- g_assert (!nm_platform_link_uses_arp (ifindex));
-#endif
+ g_assert (!nm_platform_link_uses_arp (NM_PLATFORM_GET, ifindex));
run_command ("ip link del %s", DEVICE_NAME);
wait_signal (link_removed);
- g_assert (!nm_platform_link_exists (DEVICE_NAME));
+ accept_signals (link_changed, 0, 1);
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
free_signal (link_added);
free_signal (link_changed);
@@ -548,12 +535,12 @@ init_tests (int *argc, char ***argv)
void
setup_tests (void)
{
- nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
- nm_platform_link_delete (nm_platform_link_get_ifindex (SLAVE_NAME));
- nm_platform_link_delete (nm_platform_link_get_ifindex (PARENT_NAME));
- g_assert (!nm_platform_link_exists (DEVICE_NAME));
- g_assert (!nm_platform_link_exists (SLAVE_NAME));
- g_assert (!nm_platform_link_exists (PARENT_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, SLAVE_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, PARENT_NAME));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, SLAVE_NAME));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, PARENT_NAME));
g_test_add_func ("/link/bogus", test_bogus);
g_test_add_func ("/link/loopback", test_loopback);
diff --git a/src/platform/tests/test-nmp-object.c b/src/platform/tests/test-nmp-object.c
new file mode 100644
index 000000000..88bb07078
--- /dev/null
+++ b/src/platform/tests/test-nmp-object.c
@@ -0,0 +1,425 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* nm-platform.c - Handle runtime kernel networking configuration
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ */
+
+#include "nmp-object.h"
+
+#include "nm-logging.h"
+
+#include "nm-test-utils.h"
+
+struct {
+ GList *udev_devices;
+} global;
+
+/******************************************************************/
+
+static gboolean
+_nmp_object_id_equal (const NMPObject *a, const NMPObject *b)
+{
+ gboolean a_b = nmp_object_id_equal (a, b);
+
+ g_assert (NM_IN_SET (a_b, FALSE, TRUE) && a_b == nmp_object_id_equal (b, a));
+ return a_b;
+}
+#define nmp_object_id_equal _nmp_object_id_equal
+
+static gboolean
+_nmp_object_equal (const NMPObject *a, const NMPObject *b)
+{
+ gboolean a_b = nmp_object_equal (a, b);
+
+ g_assert (NM_IN_SET (a_b, FALSE, TRUE) && a_b == nmp_object_equal (b, a));
+ return a_b;
+}
+#define nmp_object_equal _nmp_object_equal
+
+/******************************************************************/
+
+static void
+_assert_cache_multi_lookup_contains (const NMPCache *cache, const NMPCacheId *cache_id, const NMPObject *obj, gboolean contains)
+{
+ const NMPlatformObject *const *objects;
+ guint i, len;
+ gboolean found;
+
+ g_assert (cache_id);
+ g_assert (NMP_OBJECT_IS_VALID (obj));
+
+ g_assert (nmp_cache_lookup_obj (cache, obj) == obj);
+
+ objects = nmp_cache_lookup_multi (cache, cache_id, &len);
+
+ g_assert ((len == 0 && !objects) || (len > 0 && objects && !objects[len]));
+
+ found = FALSE;
+ for (i = 0; i < len; i++) {
+ NMPObject *o;
+
+ g_assert (objects[i]);
+ o = NMP_OBJECT_UP_CAST (objects[i]);
+ g_assert (NMP_OBJECT_IS_VALID (o));
+
+ if (obj == o) {
+ g_assert (!found);
+ found = TRUE;
+ }
+ }
+
+ g_assert (!!contains == found);
+}
+
+/******************************************************************/
+
+typedef struct {
+ NMPCache *cache;
+ NMPCacheOpsType expected_ops_type;
+ const NMPObject *obj_clone;
+ NMPObject *new_clone;
+ gboolean was_visible;
+ gboolean called;
+} _NMPCacheUpdateData;
+
+static void
+_nmp_cache_update_hook (NMPCache *cache, const NMPObject *old, const NMPObject *new, NMPCacheOpsType ops_type, gpointer user_data)
+{
+ _NMPCacheUpdateData *data = user_data;
+
+ g_assert (data);
+ g_assert (!data->called);
+ g_assert (data->cache == cache);
+
+ g_assert_cmpint (data->expected_ops_type, ==, ops_type);
+
+ switch (ops_type) {
+ case NMP_CACHE_OPS_ADDED:
+ g_assert (!old);
+ g_assert (NMP_OBJECT_IS_VALID (new));
+ g_assert (nmp_object_is_alive (new));
+ g_assert (nmp_object_id_equal (data->obj_clone, new));
+ g_assert (nmp_object_equal (data->obj_clone, new));
+ break;
+ case NMP_CACHE_OPS_UPDATED:
+ g_assert (NMP_OBJECT_IS_VALID (old));
+ g_assert (NMP_OBJECT_IS_VALID (new));
+ g_assert (nmp_object_is_alive (old));
+ g_assert (nmp_object_is_alive (new));
+ g_assert (nmp_object_id_equal (data->obj_clone, new));
+ g_assert (nmp_object_id_equal (data->obj_clone, old));
+ g_assert (nmp_object_id_equal (old, new));
+ g_assert (nmp_object_equal (data->obj_clone, new));
+ g_assert (!nmp_object_equal (data->obj_clone, old));
+ g_assert (!nmp_object_equal (old, new));
+ break;
+ case NMP_CACHE_OPS_REMOVED:
+ g_assert (!new);
+ g_assert (NMP_OBJECT_IS_VALID (old));
+ g_assert (nmp_object_is_alive (old));
+ g_assert (nmp_object_id_equal (data->obj_clone, old));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ data->was_visible = old ? nmp_object_is_visible (old) : FALSE;
+ data->new_clone = new ? nmp_object_clone (new, FALSE) : NULL;
+ data->called = TRUE;
+}
+
+static void
+_nmp_cache_update_netlink (NMPCache *cache, NMPObject *obj, NMPObject **out_obj, gboolean *out_was_visible, NMPCacheOpsType expected_ops_type)
+{
+ NMPCacheOpsType ops_type;
+ NMPObject *obj2;
+ gboolean was_visible;
+ auto_nmp_obj NMPObject *obj_clone = nmp_object_clone (obj, FALSE);
+ auto_nmp_obj NMPObject *new_clone = NULL;
+ const NMPObject *obj_old;
+ _NMPCacheUpdateData data = {
+ .cache = cache,
+ .expected_ops_type = expected_ops_type,
+ .obj_clone = obj_clone,
+ };
+
+ obj_old = nmp_cache_lookup_link (cache, obj->object.ifindex);
+ if (obj_old && obj_old->_link.udev.device)
+ obj_clone->_link.udev.device = g_object_ref (obj_old->_link.udev.device);
+ _nmp_object_fixup_link_udev_fields (obj_clone, nmp_cache_use_udev_get (cache));
+
+ g_assert (cache);
+ g_assert (NMP_OBJECT_IS_VALID (obj));
+
+ ops_type = nmp_cache_update_netlink (cache, obj, &obj2, &was_visible, _nmp_cache_update_hook, &data);
+
+ new_clone = data.new_clone;
+
+ g_assert_cmpint (ops_type, ==, expected_ops_type);
+
+ if (ops_type != NMP_CACHE_OPS_UNCHANGED) {
+ g_assert (NMP_OBJECT_IS_VALID (obj2));
+ g_assert (data.called);
+ g_assert_cmpint (data.was_visible, ==, was_visible);
+
+ if (ops_type == NMP_CACHE_OPS_REMOVED)
+ g_assert (!data.new_clone);
+ else {
+ g_assert (data.new_clone);
+ g_assert (nmp_object_equal (obj2, data.new_clone));
+ }
+ } else {
+ g_assert (!data.called);
+ g_assert (!obj2 || was_visible == nmp_object_is_visible (obj2));
+ }
+
+ g_assert (!obj2 || nmp_object_id_equal (obj, obj2));
+ if (ops_type != NMP_CACHE_OPS_REMOVED && obj2)
+ g_assert (nmp_object_equal (obj, obj2));
+
+ if (out_obj)
+ *out_obj = obj2;
+ else
+ nmp_object_unref (obj2);
+ if (out_was_visible)
+ *out_was_visible = was_visible;
+}
+
+static const NMPlatformLink pl_link_2 = {
+ .ifindex = 2,
+ .name = "eth0",
+ .type = NM_LINK_TYPE_ETHERNET,
+};
+
+static const NMPlatformLink pl_link_3 = {
+ .ifindex = 3,
+ .name = "wlan0",
+ .type = NM_LINK_TYPE_WIFI,
+};
+
+static void
+test_cache_link (void)
+{
+ NMPCache *cache;
+ NMPObject *obj1, *obj2;
+ NMPObject objs1;
+ gboolean was_visible;
+ NMPCacheId cache_id_storage;
+ GUdevDevice *udev_device_2 = g_list_nth_data (global.udev_devices, 0);
+ GUdevDevice *udev_device_3 = g_list_nth_data (global.udev_devices, 0);
+ NMPCacheOpsType ops_type;
+
+ cache = nmp_cache_new ();
+
+ nmp_cache_use_udev_set (cache, g_rand_int_range (nmtst_get_rand (), 0, 2));
+
+ /* if we have a link, and don't set is_in_netlink, adding it has no effect. */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ g_assert (NMP_OBJECT_UP_CAST (&obj1->object) == obj1);
+ g_assert (!nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_UNCHANGED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (!obj2);
+ g_assert (!was_visible);
+ g_assert (!nmp_cache_lookup_obj (cache, obj1));
+ g_assert (!nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)));
+ nmp_object_unref (obj1);
+
+ /* Only when setting @is_in_netlink the link is added. */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ obj1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_ADDED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (nmp_object_equal (obj1, obj2));
+ g_assert (!was_visible);
+ g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
+ g_assert (nmp_object_is_visible (obj2));
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ nmp_object_unref (obj1);
+ nmp_object_unref (obj2);
+
+ /* updating the same link with identical value, has no effect. */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ obj1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_UNCHANGED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (obj2 != obj1);
+ g_assert (nmp_object_equal (obj1, obj2));
+ g_assert (was_visible);
+ g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
+ nmp_object_unref (obj1);
+ nmp_object_unref (obj2);
+
+ /* remove the link from netlink */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ g_assert (!nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_REMOVED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (obj2 != obj1);
+ g_assert (was_visible);
+ g_assert (!nmp_cache_lookup_obj (cache, obj1));
+ g_assert (!nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)));
+ nmp_object_unref (obj1);
+ nmp_object_unref (obj2);
+
+ if (udev_device_2) {
+ /* now add the link only with aspect UDEV. */
+ ops_type = nmp_cache_update_link_udev (cache, pl_link_2.ifindex, udev_device_2, &obj2, &was_visible, NULL, NULL);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_ADDED);
+ g_assert (!was_visible);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
+ g_assert (!nmp_object_is_visible (obj2));
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, FALSE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ nmp_object_unref (obj2);
+ }
+
+ /* add it in netlink too. */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ obj1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_ADDED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (nmp_object_equal (obj1, obj2));
+ g_assert (!was_visible);
+ g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
+ g_assert (nmp_object_is_visible (obj2));
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ nmp_object_unref (obj1);
+ nmp_object_unref (obj2);
+
+ /* remove again from netlink. */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ obj1->_link.netlink.is_in_netlink = FALSE;
+ g_assert (!nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_REMOVED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (obj2 != obj1);
+ g_assert (was_visible);
+ if (udev_device_2) {
+ g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
+ g_assert (!nmp_object_is_visible (obj2));
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, FALSE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ } else {
+ g_assert (nmp_cache_lookup_obj (cache, obj1) == NULL);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == NULL);
+ g_assert (nmp_object_is_visible (obj2));
+ }
+ nmp_object_unref (obj1);
+ nmp_object_unref (obj2);
+
+ /* now another link only with aspect UDEV. */
+ if (udev_device_3) {
+ /* now add the link only with aspect UDEV. */
+ ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, udev_device_3, &obj2, &was_visible, NULL, NULL);
+ g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_ADDED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (NMP_OBJECT_IS_VALID (obj2));
+ g_assert (!was_visible);
+ g_assert (!nmp_object_is_visible (obj2));
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj2);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, FALSE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ g_assert_cmpint (obj2->_link.netlink.is_in_netlink, ==, FALSE);
+ g_assert_cmpint (obj2->link.initialized, ==, FALSE);
+ nmp_object_unref (obj2);
+
+ /* add it in netlink too. */
+ obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_3);
+ obj1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (obj1));
+ _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_UPDATED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (obj2 != obj1);
+ g_assert (nmp_object_equal (obj1, obj2));
+ g_assert (!was_visible);
+ g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj2);
+ g_assert (nmp_object_is_visible (obj2));
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ g_assert_cmpint (obj2->_link.netlink.is_in_netlink, ==, TRUE);
+ g_assert_cmpint (obj2->link.initialized, ==, TRUE);
+ nmp_object_unref (obj1);
+ nmp_object_unref (obj2);
+
+ /* remove UDEV. */
+ ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, NULL, &obj2, &was_visible, NULL, NULL);
+ g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_UPDATED);
+ ASSERT_nmp_cache_is_consistent (cache);
+ g_assert (was_visible);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj2);
+ g_assert (nmp_object_is_visible (obj2));
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
+ _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ g_assert_cmpint (obj2->_link.netlink.is_in_netlink, ==, TRUE);
+ g_assert_cmpint (obj2->link.initialized, ==, !nmp_cache_use_udev_get (cache));
+ nmp_object_unref (obj2);
+ }
+
+ nmp_cache_free (cache);
+}
+
+/******************************************************************/
+
+NMTST_DEFINE ();
+
+int
+main (int argc, char **argv)
+{
+ int result;
+ gs_unref_object GUdevClient *udev_client = NULL;
+
+ nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
+
+ udev_client = g_udev_client_new ((const char *[]) { "net", NULL });
+ {
+ gs_unref_object GUdevEnumerator *udev_enumerator = g_udev_enumerator_new (udev_client);
+
+ g_udev_enumerator_add_match_subsystem (udev_enumerator, "net");
+
+ /* Demand that the device is initialized (udev rules ran,
+ * device has a stable name now) in case udev is running
+ * (not in a container). */
+ if (access ("/sys", W_OK) == 0)
+ g_udev_enumerator_add_match_is_initialized (udev_enumerator);
+
+ global.udev_devices = g_udev_enumerator_execute (udev_enumerator);
+ }
+
+ g_test_add_func ("/nmp-object/cache_link", test_cache_link);
+
+ result = g_test_run ();
+
+ while (global.udev_devices) {
+ g_object_unref (global.udev_devices->data);
+ global.udev_devices = g_list_remove (global.udev_devices, global.udev_devices->data);
+ }
+
+ return result;
+}
+
diff --git a/src/platform/tests/test-route.c b/src/platform/tests/test-route.c
index 2d3caaf15..cf322dec6 100644
--- a/src/platform/tests/test-route.c
+++ b/src/platform/tests/test-route.c
@@ -1,5 +1,7 @@
#include "config.h"
+#include <linux/rtnetlink.h>
+
#include "test-common.h"
#include "nm-test-utils.h"
#include "NetworkManagerUtils.h"
@@ -7,7 +9,7 @@
#define DEVICE_NAME "nm-test-device"
static void
-ip4_route_callback (NMPlatform *platform, int ifindex, NMPlatformIP4Route *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
+ip4_route_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, const NMPlatformIP4Route *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
{
g_assert (received);
g_assert_cmpint (received->ifindex, ==, ifindex);
@@ -22,14 +24,12 @@ ip4_route_callback (NMPlatform *platform, int ifindex, NMPlatformIP4Route *recei
if (data->loop)
g_main_loop_quit (data->loop);
- if (data->received)
- g_error ("Received signal '%s' a second time.", data->name);
-
- data->received = TRUE;
+ data->received_count++;
+ debug ("Received signal '%s' %dth time.", data->name, data->received_count);
}
static void
-ip6_route_callback (NMPlatform *platform, int ifindex, NMPlatformIP6Route *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
+ip6_route_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, const NMPlatformIP6Route *received, NMPlatformSignalChangeType change_type, NMPlatformReason reason, SignalData *data)
{
g_assert (received);
g_assert_cmpint (received->ifindex, ==, ifindex);
@@ -44,16 +44,14 @@ ip6_route_callback (NMPlatform *platform, int ifindex, NMPlatformIP6Route *recei
if (data->loop)
g_main_loop_quit (data->loop);
- if (data->received)
- g_error ("Received signal '%s' a second time.", data->name);
-
- data->received = TRUE;
+ data->received_count++;
+ debug ("Received signal '%s' %dth time.", data->name, data->received_count);
}
static void
test_ip4_route_metric0 (void)
{
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
SignalData *route_added = add_signal (NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_route_callback);
SignalData *route_changed = add_signal (NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip4_route_callback);
SignalData *route_removed = add_signal (NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_route_callback);
@@ -67,48 +65,42 @@ test_ip4_route_metric0 (void)
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, metric);
/* add the first route */
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, INADDR_ANY, 0, metric, mss));
- no_error ();
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, INADDR_ANY, 0, metric, mss));
accept_signal (route_added);
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0);
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric);
/* Deleting route with metric 0 does nothing */
- g_assert (nm_platform_ip4_route_delete (ifindex, network, plen, 0));
- no_error ();
- g_assert (!route_removed->received);
+ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, 0));
+ ensure_no_signal (route_removed);
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0);
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric);
/* add the second route */
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, INADDR_ANY, 0, 0, mss));
- no_error ();
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, INADDR_ANY, 0, 0, mss));
accept_signal (route_added);
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, 0);
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric);
/* Delete route with metric 0 */
- g_assert (nm_platform_ip4_route_delete (ifindex, network, plen, 0));
- no_error ();
+ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, 0));
accept_signal (route_removed);
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0);
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric);
/* Delete route with metric 0 again (we expect nothing to happen) */
- g_assert (nm_platform_ip4_route_delete (ifindex, network, plen, 0));
- no_error ();
- g_assert (!route_removed->received);
+ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, 0));
+ ensure_no_signal (route_removed);
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0);
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric);
/* Delete the other route */
- g_assert (nm_platform_ip4_route_delete (ifindex, network, plen, metric));
- no_error ();
+ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric));
accept_signal (route_removed);
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, 0);
@@ -122,7 +114,7 @@ test_ip4_route_metric0 (void)
static void
test_ip4_route (void)
{
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
SignalData *route_added = add_signal (NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip4_route_callback);
SignalData *route_changed = add_signal (NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip4_route_callback);
SignalData *route_removed = add_signal (NM_PLATFORM_SIGNAL_IP4_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip4_route_callback);
@@ -139,40 +131,31 @@ test_ip4_route (void)
inet_pton (AF_INET, "198.51.100.1", &gateway);
/* Add route to gateway */
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, gateway, 32, INADDR_ANY, 0, metric, mss));
- no_error ();
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, gateway, 32, INADDR_ANY, 0, metric, mss));
accept_signal (route_added);
/* Add route */
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, metric);
- no_error ();
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, 0, metric, mss));
- no_error ();
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, 0, metric, mss));
assert_ip4_route_exists (TRUE, DEVICE_NAME, network, plen, metric);
- no_error ();
accept_signal (route_added);
/* Add route again */
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, 0, metric, mss));
- no_error ();
- accept_signal (route_changed);
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, 0, metric, mss));
+ accept_signals (route_changed, 0, 1);
/* Add default route */
assert_ip4_route_exists (FALSE, DEVICE_NAME, 0, 0, metric);
- no_error ();
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, 0, 0, gateway, 0, metric, mss));
- no_error ();
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, 0, 0, gateway, 0, metric, mss));
assert_ip4_route_exists (TRUE, DEVICE_NAME, 0, 0, metric);
- no_error ();
accept_signal (route_added);
/* Add default route again */
- g_assert (nm_platform_ip4_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, 0, 0, gateway, 0, metric, mss));
- no_error ();
- accept_signal (route_changed);
+ g_assert (nm_platform_ip4_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, 0, 0, gateway, 0, metric, mss));
+ accept_signals (route_changed, 0, 1);
/* Test route listing */
- routes = nm_platform_ip4_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
memset (rts, 0, sizeof (rts));
rts[0].source = NM_IP_CONFIG_SOURCE_USER;
rts[0].network = gateway;
@@ -181,6 +164,7 @@ test_ip4_route (void)
rts[0].gateway = INADDR_ANY;
rts[0].metric = metric;
rts[0].mss = mss;
+ rts[0].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK);
rts[1].source = NM_IP_CONFIG_SOURCE_USER;
rts[1].network = network;
rts[1].plen = plen;
@@ -188,6 +172,7 @@ test_ip4_route (void)
rts[1].gateway = gateway;
rts[1].metric = metric;
rts[1].mss = mss;
+ rts[1].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE);
rts[2].source = NM_IP_CONFIG_SOURCE_USER;
rts[2].network = 0;
rts[2].plen = 0;
@@ -195,20 +180,18 @@ test_ip4_route (void)
rts[2].gateway = gateway;
rts[2].metric = metric;
rts[2].mss = mss;
+ rts[2].scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE);
g_assert_cmpint (routes->len, ==, 3);
- g_assert (!memcmp (routes->data, rts, sizeof (rts)));
nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, rts, routes->len, TRUE);
g_array_unref (routes);
/* Remove route */
- g_assert (nm_platform_ip4_route_delete (ifindex, network, plen, metric));
- no_error ();
+ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric));
assert_ip4_route_exists (FALSE, DEVICE_NAME, network, plen, metric);
accept_signal (route_removed);
/* Remove route again */
- g_assert (nm_platform_ip4_route_delete (ifindex, network, plen, metric));
- no_error ();
+ g_assert (nm_platform_ip4_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric));
free_signal (route_added);
free_signal (route_changed);
@@ -218,7 +201,7 @@ test_ip4_route (void)
static void
test_ip6_route (void)
{
- int ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
SignalData *route_added = add_signal (NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_ADDED, ip6_route_callback);
SignalData *route_changed = add_signal (NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, ip6_route_callback);
SignalData *route_removed = add_signal (NM_PLATFORM_SIGNAL_IP6_ROUTE_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, ip6_route_callback);
@@ -235,40 +218,31 @@ test_ip6_route (void)
inet_pton (AF_INET6, "2001:db8:c:d:1:2:3:4", &gateway);
/* Add route to gateway */
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, gateway, 128, in6addr_any, metric, mss));
- no_error ();
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, gateway, 128, in6addr_any, metric, mss));
accept_signal (route_added);
/* Add route */
- g_assert (!nm_platform_ip6_route_exists (ifindex, network, plen, metric));
- no_error ();
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, metric, mss));
- no_error ();
- g_assert (nm_platform_ip6_route_exists (ifindex, network, plen, metric));
- no_error ();
+ g_assert (!nm_platform_ip6_route_get (NM_PLATFORM_GET, ifindex, network, plen, metric));
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, metric, mss));
+ g_assert (nm_platform_ip6_route_get (NM_PLATFORM_GET, ifindex, network, plen, metric));
accept_signal (route_added);
/* Add route again */
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, metric, mss));
- no_error ();
- accept_signal (route_changed);
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, network, plen, gateway, metric, mss));
+ accept_signals (route_changed, 0, 1);
/* Add default route */
- g_assert (!nm_platform_ip6_route_exists (ifindex, in6addr_any, 0, metric));
- no_error ();
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, in6addr_any, 0, gateway, metric, mss));
- no_error ();
- g_assert (nm_platform_ip6_route_exists (ifindex, in6addr_any, 0, metric));
- no_error ();
+ g_assert (!nm_platform_ip6_route_get (NM_PLATFORM_GET, ifindex, in6addr_any, 0, metric));
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, in6addr_any, 0, gateway, metric, mss));
+ g_assert (nm_platform_ip6_route_get (NM_PLATFORM_GET, ifindex, in6addr_any, 0, metric));
accept_signal (route_added);
/* Add default route again */
- g_assert (nm_platform_ip6_route_add (ifindex, NM_IP_CONFIG_SOURCE_USER, in6addr_any, 0, gateway, metric, mss));
- no_error ();
- accept_signal (route_changed);
+ g_assert (nm_platform_ip6_route_add (NM_PLATFORM_GET, ifindex, NM_IP_CONFIG_SOURCE_USER, in6addr_any, 0, gateway, metric, mss));
+ accept_signals (route_changed, 0, 1);
/* Test route listing */
- routes = nm_platform_ip6_route_get_all (ifindex, NM_PLATFORM_GET_ROUTE_MODE_ALL);
+ routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET, ifindex, NM_PLATFORM_GET_ROUTE_FLAGS_WITH_DEFAULT | NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
memset (rts, 0, sizeof (rts));
rts[0].source = NM_IP_CONFIG_SOURCE_USER;
rts[0].network = gateway;
@@ -292,19 +266,16 @@ test_ip6_route (void)
rts[2].metric = nm_utils_ip6_route_metric_normalize (metric);
rts[2].mss = mss;
g_assert_cmpint (routes->len, ==, 3);
- g_assert (!memcmp (routes->data, rts, sizeof (rts)));
nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, rts, routes->len, TRUE);
g_array_unref (routes);
/* Remove route */
- g_assert (nm_platform_ip6_route_delete (ifindex, network, plen, metric));
- no_error ();
- g_assert (!nm_platform_ip6_route_exists (ifindex, network, plen, metric));
+ g_assert (nm_platform_ip6_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric));
+ g_assert (!nm_platform_ip6_route_get (NM_PLATFORM_GET, ifindex, network, plen, metric));
accept_signal (route_removed);
/* Remove route again */
- g_assert (nm_platform_ip6_route_delete (ifindex, network, plen, metric));
- no_error ();
+ g_assert (nm_platform_ip6_route_delete (NM_PLATFORM_GET, ifindex, network, plen, metric));
free_signal (route_added);
free_signal (route_changed);
@@ -322,13 +293,13 @@ setup_tests (void)
{
SignalData *link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
- nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
- g_assert (!nm_platform_link_exists (DEVICE_NAME));
- g_assert (nm_platform_dummy_add (DEVICE_NAME));
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (!nm_platform_link_get_by_ifname (NM_PLATFORM_GET, DEVICE_NAME));
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL) == NM_PLATFORM_ERROR_SUCCESS);
accept_signal (link_added);
free_signal (link_added);
- g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME)));
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME), NULL));
g_test_add_func ("/route/ip4", test_ip4_route);
g_test_add_func ("/route/ip6", test_ip6_route);
diff --git a/src/platform/wifi/wifi-utils.c b/src/platform/wifi/wifi-utils.c
index daef881bf..068c404e0 100644
--- a/src/platform/wifi/wifi-utils.c
+++ b/src/platform/wifi/wifi-utils.c
@@ -162,20 +162,13 @@ wifi_utils_deinit (WifiData *data)
}
gboolean
-wifi_utils_is_wifi (const char *iface, const char *sysfs_path, const char *devtype)
+wifi_utils_is_wifi (const char *iface, const char *sysfs_path)
{
char phy80211_path[255];
struct stat s;
g_return_val_if_fail (iface != NULL, FALSE);
- if (g_strcmp0 (devtype, "wlan") == 0) {
- /* All Wi-Fi drivers should set DEVTYPE=wlan. Since the kernel's
- * cfg80211/nl80211 stack does, this check should match any nl80211
- * capable driver (including mac82011-based ones). */
- return TRUE;
- }
-
if (sysfs_path) {
/* Check for nl80211 sysfs paths */
g_snprintf (phy80211_path, sizeof (phy80211_path), "%s/phy80211", sysfs_path);
diff --git a/src/platform/wifi/wifi-utils.h b/src/platform/wifi/wifi-utils.h
index eb37bc22c..588386ab3 100644
--- a/src/platform/wifi/wifi-utils.h
+++ b/src/platform/wifi/wifi-utils.h
@@ -29,7 +29,7 @@
typedef struct WifiData WifiData;
-gboolean wifi_utils_is_wifi (const char *iface, const char *sysfs_path, const char *devtype);
+gboolean wifi_utils_is_wifi (const char *iface, const char *sysfs_path);
WifiData *wifi_utils_init (const char *iface, int ifindex, gboolean check_scan);
diff --git a/src/ppp-manager/Makefile.in b/src/ppp-manager/Makefile.in
index ddbb7de0b..26698e160 100644
--- a/src/ppp-manager/Makefile.in
+++ b/src/ppp-manager/Makefile.in
@@ -221,6 +221,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -334,6 +335,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/ppp-manager/nm-ppp-manager.c b/src/ppp-manager/nm-ppp-manager.c
index 65993deb2..73528aa9d 100644
--- a/src/ppp-manager/nm-ppp-manager.c
+++ b/src/ppp-manager/nm-ppp-manager.c
@@ -39,6 +39,7 @@
#ifndef aligned_u64
#define aligned_u64 unsigned long long __attribute__((aligned(8)))
#endif
+#include <linux/if.h>
#include <linux/if_ppp.h>
#include "NetworkManagerUtils.h"
@@ -46,7 +47,6 @@
#include "nm-ppp-manager.h"
#include "nm-dbus-manager.h"
#include "nm-logging.h"
-#include "nm-posix-signals.h"
#include "nm-platform.h"
#include "nm-core-internal.h"
@@ -1030,20 +1030,6 @@ create_pppd_cmd_line (NMPPPManager *self,
}
static void
-pppd_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for pppd here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
-static void
pppoe_fill_defaults (NMSettingPpp *setting)
{
if (!nm_setting_ppp_get_mtu (setting))
@@ -1086,7 +1072,6 @@ nm_ppp_manager_start (NMPPPManager *manager,
NMCmdLine *ppp_cmd;
char *cmd_str;
struct stat st;
- int ignored;
g_return_val_if_fail (NM_IS_PPP_MANAGER (manager), FALSE);
g_return_val_if_fail (NM_IS_ACT_REQUEST (req), FALSE);
@@ -1106,7 +1091,7 @@ nm_ppp_manager_start (NMPPPManager *manager,
/* Make sure /dev/ppp exists (bgo #533064) */
if (stat ("/dev/ppp", &st) || !S_ISCHR (st.st_mode))
- ignored = system ("/sbin/modprobe ppp_generic");
+ nm_utils_modprobe (NULL, FALSE, "ppp_generic", NULL);
connection = nm_act_request_get_connection (req);
g_assert (connection);
@@ -1141,8 +1126,8 @@ nm_ppp_manager_start (NMPPPManager *manager,
priv->pid = 0;
if (!g_spawn_async (NULL, (char **) ppp_cmd->array->pdata, NULL,
G_SPAWN_DO_NOT_REAP_CHILD,
- pppd_child_setup,
- NULL, &priv->pid, err)) {
+ nm_utils_setpgid, NULL,
+ &priv->pid, err)) {
goto out;
}
diff --git a/src/rdisc/Makefile.in b/src/rdisc/Makefile.in
index 349616f7a..4713fa9bb 100644
--- a/src/rdisc/Makefile.in
+++ b/src/rdisc/Makefile.in
@@ -195,6 +195,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -308,6 +309,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/rdisc/nm-lndp-rdisc.c b/src/rdisc/nm-lndp-rdisc.c
index cadbfdfab..46f814767 100644
--- a/src/rdisc/nm-lndp-rdisc.c
+++ b/src/rdisc/nm-lndp-rdisc.c
@@ -298,7 +298,7 @@ start (NMRDisc *rdisc)
static inline gint32
ipv6_sysctl_get (const char *ifname, const char *property, gint32 defval)
{
- return nm_platform_sysctl_get_int32 (nm_utils_ip6_property_path (ifname, property), defval);
+ return nm_platform_sysctl_get_int32 (NM_PLATFORM_GET, nm_utils_ip6_property_path (ifname, property), defval);
}
NMRDisc *
diff --git a/src/rdisc/nm-rdisc.c b/src/rdisc/nm-rdisc.c
index 07271a89e..a73ab7d0f 100644
--- a/src/rdisc/nm-rdisc.c
+++ b/src/rdisc/nm-rdisc.c
@@ -83,7 +83,7 @@ nm_rdisc_add_gateway (NMRDisc *rdisc, const NMRDiscGateway *new)
}
if (new->lifetime)
- g_array_insert_val (rdisc->gateways, CLAMP (insert_idx, 0, G_MAXINT), *new);
+ g_array_insert_val (rdisc->gateways, MAX (insert_idx, 0), *new);
return !!new->lifetime;
}
@@ -241,12 +241,38 @@ clear_rs_timeout (NMRDisc *rdisc)
}
}
-void
+/**
+ * nm_rdisc_set_iid:
+ * @rdisc: the #NMRDisc
+ * @iid: the new interface ID
+ *
+ * Sets the "Modified EUI-64" interface ID to be used when generating
+ * IPv6 addresses using received prefixes. Identifiers are either generated
+ * from the hardware addresses or manually set by the operator with
+ * "ip token" command.
+ *
+ * Upon token change (or initial setting) all addresses generated using
+ * the old identifier are removed. The caller should ensure the addresses
+ * will be reset by soliciting router advertisements.
+ *
+ * Returns: %TRUE if the token was changed, %FALSE otherwise.
+ **/
+gboolean
nm_rdisc_set_iid (NMRDisc *rdisc, const NMUtilsIPv6IfaceId iid)
{
- g_return_if_fail (NM_IS_RDISC (rdisc));
+ g_return_val_if_fail (NM_IS_RDISC (rdisc), FALSE);
+
+ if (rdisc->iid.id != iid.id) {
+ rdisc->iid = iid;
+ if (rdisc->addresses->len) {
+ debug ("(%s) IPv6 interface identifier changed, flushing addresses", rdisc->ifname);
+ g_array_remove_range (rdisc->addresses, 0, rdisc->addresses->len);
+ g_signal_emit_by_name (rdisc, NM_RDISC_CONFIG_CHANGED, NM_RDISC_CONFIG_ADDRESSES);
+ }
+ return TRUE;
+ }
- rdisc->iid = iid;
+ return FALSE;
}
static gboolean
diff --git a/src/rdisc/nm-rdisc.h b/src/rdisc/nm-rdisc.h
index a79e6c969..463e19121 100644
--- a/src/rdisc/nm-rdisc.h
+++ b/src/rdisc/nm-rdisc.h
@@ -141,7 +141,7 @@ typedef struct {
GType nm_rdisc_get_type (void);
-void nm_rdisc_set_iid (NMRDisc *rdisc, const NMUtilsIPv6IfaceId iid);
+gboolean nm_rdisc_set_iid (NMRDisc *rdisc, const NMUtilsIPv6IfaceId iid);
void nm_rdisc_start (NMRDisc *rdisc);
#endif /* __NETWORKMANAGER_RDISC_H__ */
diff --git a/src/rdisc/tests/Makefile.in b/src/rdisc/tests/Makefile.in
index f241fcbff..8fedb7704 100644
--- a/src/rdisc/tests/Makefile.in
+++ b/src/rdisc/tests/Makefile.in
@@ -207,13 +207,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -327,6 +510,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -505,7 +689,7 @@ test_rdisc_fake_LDADD = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -641,98 +825,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-rdisc-fake.log: test-rdisc-fake$(EXEEXT)
+ @p='test-rdisc-fake$(EXEEXT)'; \
+ b='test-rdisc-fake'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -789,6 +1043,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -884,7 +1141,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/rdisc/tests/test-rdisc-fake.c b/src/rdisc/tests/test-rdisc-fake.c
index 8b7bd37a3..33672637d 100644
--- a/src/rdisc/tests/test-rdisc-fake.c
+++ b/src/rdisc/tests/test-rdisc-fake.c
@@ -36,7 +36,7 @@ rdisc_new (void)
{
NMRDisc *rdisc;
const int ifindex = 1;
- const char *ifname = nm_platform_link_get_name (ifindex);
+ const char *ifname = nm_platform_link_get_name (NM_PLATFORM_GET, ifindex);
rdisc = nm_fake_rdisc_new (ifindex, ifname);
g_assert (rdisc);
@@ -439,7 +439,7 @@ main (int argc, char **argv)
if (nmtst_test_quick ()) {
g_print ("Skipping test: don't run long running test %s (NMTST_DEBUG=slow)\n", str_if_set (g_get_prgname (), "test-rdisc-fake"));
- return EXIT_SKIP;
+ return g_test_run ();
}
nm_fake_platform_setup ();
diff --git a/src/rdisc/tests/test-rdisc-linux.c b/src/rdisc/tests/test-rdisc-linux.c
index 9b2ccafd6..eddb3b0eb 100644
--- a/src/rdisc/tests/test-rdisc-linux.c
+++ b/src/rdisc/tests/test-rdisc-linux.c
@@ -54,7 +54,7 @@ main (int argc, char **argv)
if (argv[1]) {
ifname = argv[1];
- ifindex = nm_platform_link_get_ifindex (ifname);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, ifname);
} else {
g_print ("Missing command line argument \"interface-name\"\n");
return EXIT_FAILURE;
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index ec2052f0a..0f67a2162 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -96,6 +96,8 @@ enum {
static guint signals[LAST_SIGNAL] = { 0 };
typedef struct {
+ gboolean removed;
+
NMAgentManager *agent_mgr;
NMSessionMonitor *session_monitor;
guint session_changed_id;
@@ -1742,6 +1744,12 @@ impl_settings_connection_clear_secrets (NMSettingsConnection *self,
void
nm_settings_connection_signal_remove (NMSettingsConnection *self)
{
+ NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
+
+ if (priv->removed)
+ g_return_if_reached ();
+ priv->removed = TRUE;
+
/* Emit removed first */
g_signal_emit_by_name (self, NM_SETTINGS_CONNECTION_REMOVED);
diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c
index 9d40b06e8..4d7d697da 100644
--- a/src/settings/nm-settings.c
+++ b/src/settings/nm-settings.c
@@ -94,9 +94,10 @@ EXPORT(nm_settings_connection_replace_settings)
EXPORT(nm_settings_connection_replace_and_commit)
/* END LINKER CRACKROCK */
+#define PLUGIN_MODULE_PATH "plugin-module-path"
+
static void claim_connection (NMSettings *self,
- NMSettingsConnection *connection,
- gboolean do_export);
+ NMSettingsConnection *connection);
static gboolean impl_settings_list_connections (NMSettings *self,
GPtrArray **connections,
@@ -218,7 +219,7 @@ plugin_connection_added (NMSystemConfigInterface *config,
NMSettingsConnection *connection,
gpointer user_data)
{
- claim_connection (NM_SETTINGS (user_data), connection, TRUE);
+ claim_connection (NM_SETTINGS (user_data), connection);
}
static void
@@ -239,7 +240,7 @@ load_connections (NMSettings *self)
// priority plugin.
for (elt = plugin_connections; elt; elt = g_slist_next (elt))
- claim_connection (self, NM_SETTINGS_CONNECTION (elt->data), TRUE);
+ claim_connection (self, NM_SETTINGS_CONNECTION (elt->data));
g_slist_free (plugin_connections);
@@ -468,6 +469,21 @@ notify (GObject *object, GParamSpec *pspec)
g_slice_free (GValue, value);
}
+gboolean
+nm_settings_has_connection (NMSettings *self, NMConnection *connection)
+{
+ NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
+ GHashTableIter iter;
+ gpointer data;
+
+ g_hash_table_iter_init (&iter, priv->connections);
+ while (g_hash_table_iter_next (&iter, NULL, &data))
+ if (data == connection)
+ return TRUE;
+
+ return FALSE;
+}
+
const GSList *
nm_settings_get_unmanaged_specs (NMSettings *self)
{
@@ -489,7 +505,7 @@ get_plugin (NMSettings *self, guint32 capability)
NMSystemConfigInterfaceCapabilities caps = NM_SYSTEM_CONFIG_INTERFACE_CAP_NONE;
g_object_get (G_OBJECT (iter->data), NM_SYSTEM_CONFIG_INTERFACE_CAPABILITIES, &caps, NULL);
- if (caps & capability)
+ if (NM_FLAGS_ALL (caps, capability))
return NM_SYSTEM_CONFIG_INTERFACE (iter->data);
}
@@ -596,6 +612,7 @@ add_plugin (NMSettings *self, NMSystemConfigInterface *plugin)
NMSettingsPrivate *priv;
char *pname = NULL;
char *pinfo = NULL;
+ const char *path;
g_return_if_fail (NM_IS_SETTINGS (self));
g_return_if_fail (NM_IS_SYSTEM_CONFIG_INTERFACE (plugin));
@@ -613,7 +630,10 @@ add_plugin (NMSettings *self, NMSystemConfigInterface *plugin)
NM_SYSTEM_CONFIG_INTERFACE_INFO, &pinfo,
NULL);
- nm_log_info (LOGD_SETTINGS, "Loaded plugin %s: %s", pname, pinfo);
+ path = g_object_get_data (G_OBJECT (plugin), PLUGIN_MODULE_PATH);
+
+ nm_log_info (LOGD_SETTINGS, "Loaded settings plugin %s: %s%s%s%s", pname, pinfo,
+ NM_PRINT_FMT_QUOTED (path, " (", path, ")", ""));
g_free (pname);
g_free (pinfo);
}
@@ -665,17 +685,13 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
GModule *plugin;
gs_free char *full_name = NULL;
gs_free char *path = NULL;
- gs_free char *pname = NULL;
+ const char *pname;
GObject *obj;
GObject * (*factory_func) (void);
struct stat st;
int errsv;
- pname = g_strdup (*iter);
- g_strstrip (pname);
-
- if (!*pname)
- continue;
+ pname = *iter;
if (!*pname || strchr (pname, '/')) {
LOG (LOGL_WARN, "ignore invalid plugin \"%s\"", pname);
@@ -719,7 +735,7 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
plugin = g_module_open (path, G_MODULE_BIND_LOCAL);
if (!plugin) {
LOG (LOGL_WARN, "Could not load plugin '%s' from file '%s': %s",
- pname, full_name, g_module_error ());
+ pname, path, g_module_error ());
continue;
}
@@ -730,6 +746,7 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
"Could not find plugin '%s' factory function.",
pname);
success = FALSE;
+ g_module_close (plugin);
break;
}
@@ -739,11 +756,14 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
"Plugin '%s' returned invalid system config object.",
pname);
success = FALSE;
+ g_module_close (plugin);
break;
}
g_module_make_resident (plugin);
g_object_weak_ref (obj, (GWeakNotify) g_module_close, plugin);
+ g_object_set_data_full (obj, PLUGIN_MODULE_PATH, path, g_free);
+ path = NULL;
add_plugin (self, NM_SYSTEM_CONFIG_INTERFACE (obj));
list = g_slist_append (list, obj);
}
@@ -794,6 +814,11 @@ static void
connection_removed (NMSettingsConnection *connection, gpointer user_data)
{
NMSettings *self = NM_SETTINGS (user_data);
+ NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
+ const char *cpath = nm_connection_get_path (NM_CONNECTION (connection));
+
+ if (!g_hash_table_lookup (priv->connections, cpath))
+ g_return_if_reached ();
g_object_ref (connection);
@@ -809,8 +834,7 @@ connection_removed (NMSettingsConnection *connection, gpointer user_data)
g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_ready_changed), self);
/* Forget about the connection internally */
- g_hash_table_remove (NM_SETTINGS_GET_PRIVATE (user_data)->connections,
- (gpointer) nm_connection_get_path (NM_CONNECTION (connection)));
+ g_hash_table_remove (priv->connections, (gpointer) cpath);
/* Notify D-Bus */
g_signal_emit (self, signals[CONNECTION_REMOVED], 0, connection);
@@ -877,9 +901,7 @@ openconnect_migrate_hack (NMConnection *connection)
}
static void
-claim_connection (NMSettings *self,
- NMSettingsConnection *connection,
- gboolean do_export)
+claim_connection (NMSettings *self, NMSettingsConnection *connection)
{
NMSettingsPrivate *priv = NM_SETTINGS_GET_PRIVATE (self);
static guint32 ec_counter = 0;
@@ -1030,7 +1052,7 @@ nm_settings_add_connection (NMSettings *self,
added = nm_system_config_interface_add_connection (plugin, connection, save_to_disk, &add_error);
if (added) {
- claim_connection (self, added, TRUE);
+ claim_connection (self, added);
return added;
}
nm_log_dbg (LOGD_SETTINGS, "Failed to add %s/'%s': %s",
@@ -1576,6 +1598,9 @@ have_connection_for_device (NMSettings *self, NMDevice *device)
NMConnection *connection = NM_CONNECTION (data);
const char *ctype, *iface;
+ if (!nm_device_check_connection_compatible (device, connection))
+ continue;
+
s_con = nm_connection_get_setting_connection (connection);
iface = nm_setting_connection_get_interface_name (s_con);
@@ -1671,7 +1696,7 @@ default_wired_clear_tag (NMSettings *self,
g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (default_wired_connection_updated_by_user_cb), self);
if (add_to_no_auto_default)
- nm_config_set_ethernet_no_auto_default (NM_SETTINGS_GET_PRIVATE (self)->config, device);
+ nm_config_set_no_auto_default_for_device (NM_SETTINGS_GET_PRIVATE (self)->config, device);
}
void
diff --git a/src/settings/nm-settings.h b/src/settings/nm-settings.h
index 9c0a4c835..d196efe65 100644
--- a/src/settings/nm-settings.h
+++ b/src/settings/nm-settings.h
@@ -111,6 +111,8 @@ NMSettingsConnection *nm_settings_get_connection_by_path (NMSettings *settings,
NMSettingsConnection *nm_settings_get_connection_by_uuid (NMSettings *settings,
const char *uuid);
+gboolean nm_settings_has_connection (NMSettings *self, NMConnection *connection);
+
const GSList *nm_settings_get_unmanaged_specs (NMSettings *self);
char *nm_settings_get_hostname (NMSettings *self);
diff --git a/src/settings/plugins/Makefile.in b/src/settings/plugins/Makefile.in
index ea45e2a5e..d7b7ab145 100644
--- a/src/settings/plugins/Makefile.in
+++ b/src/settings/plugins/Makefile.in
@@ -200,6 +200,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -313,6 +314,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/example/Makefile.in b/src/settings/plugins/example/Makefile.in
index dabbdc748..3b7a15514 100644
--- a/src/settings/plugins/example/Makefile.in
+++ b/src/settings/plugins/example/Makefile.in
@@ -191,6 +191,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -304,6 +305,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/example/plugin.c b/src/settings/plugins/example/plugin.c
index 9945e13b5..0bcb38fcf 100644
--- a/src/settings/plugins/example/plugin.c
+++ b/src/settings/plugins/example/plugin.c
@@ -847,7 +847,7 @@ nm_system_config_factory (void)
priv = SC_PLUGIN_EXAMPLE_GET_PRIVATE (singleton);
/* Cache the config file path */
- priv->conf_file = nm_config_get_path (nm_config_get ());
+ priv->conf_file = nm_config_data_get_config_main_file (nm_config_get_data (nm_config_get ()));
} else {
/* This function should never be called twice */
g_assert_not_reached ();
diff --git a/src/settings/plugins/ibft/Makefile.in b/src/settings/plugins/ibft/Makefile.in
index 405c213bd..de9be286c 100644
--- a/src/settings/plugins/ibft/Makefile.in
+++ b/src/settings/plugins/ibft/Makefile.in
@@ -266,6 +266,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -379,6 +380,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ibft/reader.c b/src/settings/plugins/ibft/reader.c
index e89d9b084..9bc634627 100644
--- a/src/settings/plugins/ibft/reader.c
+++ b/src/settings/plugins/ibft/reader.c
@@ -36,7 +36,6 @@
#include "nm-core-internal.h"
#include "nm-platform.h"
-#include "nm-posix-signals.h"
#include "NetworkManagerUtils.h"
#include "nm-logging.h"
@@ -44,22 +43,6 @@
#define PARSE_WARNING(msg...) nm_log_warn (LOGD_SETTINGS, " " msg)
-static void
-iscsiadm_child_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process here; set a different process group to
- * ensure signal isolation between child and parent.
- */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for iscsiadm here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
/* Removes trailing whitespace and whitespace before and immediately after the '=' */
static char *
remove_most_whitespace (const char *src)
@@ -126,7 +109,7 @@ read_ibft_blocks (const char *iscsiadm_path,
g_return_val_if_fail (out_blocks != NULL && *out_blocks == NULL, FALSE);
if (!g_spawn_sync ("/", (char **) argv, (char **) envp, 0,
- iscsiadm_child_setup, NULL, &out, &err, &status, error))
+ NULL, NULL, &out, &err, &status, error))
goto done;
if (!WIFEXITED (status)) {
@@ -136,6 +119,15 @@ read_ibft_blocks (const char *iscsiadm_path,
}
if (WEXITSTATUS (status) != 0) {
+ if (err) {
+ char *nl;
+
+ /* the error message contains newlines. concatenate the lines with whitespace */
+ for (nl = err; *nl; nl++) {
+ if (*nl == '\n')
+ *nl = ' ';
+ }
+ }
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
"iBFT: %s exited with error %d. Message: '%s'",
iscsiadm_path, WEXITSTATUS (status), err ? err : "(none)");
@@ -405,13 +397,13 @@ connection_setting_add (const GPtrArray *block,
prefix ? prefix : "",
iface);
- uuid = nm_utils_uuid_generate_from_strings ("ibft",
- s_hwaddr,
- s_vlanid ? "V" : "v",
- s_vlanid ? s_vlanid : "",
- s_ip4addr ? "A" : "DHCP",
- s_ip4addr ? s_ip4addr : "",
- NULL);
+ uuid = _nm_utils_uuid_generate_from_strings ("ibft",
+ s_hwaddr,
+ s_vlanid ? "V" : "v",
+ s_vlanid ? s_vlanid : "",
+ s_ip4addr ? "A" : "DHCP",
+ s_ip4addr ? s_ip4addr : "",
+ NULL);
s_con = nm_setting_connection_new ();
g_object_set (s_con,
@@ -439,7 +431,7 @@ is_ibft_vlan_device (const GPtrArray *block)
/* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it
* means "no VLAN".
*/
- if (nm_utils_ascii_str_to_int64 (s_vlan_id, 10, 1, 4095, -1) != -1)
+ if (_nm_utils_ascii_str_to_int64 (s_vlan_id, 10, 1, 4095, -1) != -1)
return TRUE;
}
return FALSE;
@@ -466,7 +458,7 @@ vlan_setting_add_from_block (const GPtrArray *block,
g_assert (vlan_id_str);
/* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it means "no VLAN" */
- vlan_id = nm_utils_ascii_str_to_int64 (vlan_id_str, 10, 1, 4095, -1);
+ vlan_id = _nm_utils_ascii_str_to_int64 (vlan_id_str, 10, 1, 4095, -1);
if (vlan_id == -1) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid VLAN_ID '%s'", vlan_id_str);
diff --git a/src/settings/plugins/ibft/tests/Makefile.in b/src/settings/plugins/ibft/tests/Makefile.in
index d682318aa..266497b6c 100644
--- a/src/settings/plugins/ibft/tests/Makefile.in
+++ b/src/settings/plugins/ibft/tests/Makefile.in
@@ -205,13 +205,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -325,6 +508,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -510,7 +694,7 @@ EXTRA_DIST = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -656,98 +840,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-ibft.log: test-ibft$(EXEEXT)
+ @p='test-ibft$(EXEEXT)'; \
+ b='test-ibft'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -804,6 +1058,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -899,7 +1156,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/settings/plugins/ifcfg-rh/Makefile.in b/src/settings/plugins/ifcfg-rh/Makefile.in
index 89511983c..0cd26960e 100644
--- a/src/settings/plugins/ifcfg-rh/Makefile.in
+++ b/src/settings/plugins/ifcfg-rh/Makefile.in
@@ -269,6 +269,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -382,6 +383,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c b/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c
index 94d222582..a18920c68 100644
--- a/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c
+++ b/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.c
@@ -96,7 +96,7 @@ devtimeout_ready (gpointer user_data)
}
static void
-link_changed (NMPlatform *platform, int ifindex, NMPlatformLink *link,
+link_changed (NMPlatform *platform, NMPObjectType *obj_type, int ifindex, const NMPlatformLink *link,
NMPlatformSignalChangeType change_type, NMPlatformReason reason,
NMConnection *self)
{
@@ -164,7 +164,7 @@ nm_ifcfg_connection_check_devtimeout (NMIfcfgConnection *self)
if (!devtimeout)
return;
- if (nm_platform_link_get_ifindex (ifname) != 0)
+ if (nm_platform_link_get_ifindex (NM_PLATFORM_GET, ifname) != 0)
return;
/* ONBOOT=yes, DEVICE and DEVTIMEOUT are set, but device is not present */
@@ -201,7 +201,8 @@ files_changed_cb (NMInotifyHelper *ih,
NMIfcfgConnection *
nm_ifcfg_connection_new (NMConnection *source,
const char *full_path,
- GError **error)
+ GError **error,
+ gboolean *out_ignore_error)
{
GObject *object;
NMConnection *tmp;
@@ -211,13 +212,17 @@ nm_ifcfg_connection_new (NMConnection *source,
g_assert (source || full_path);
+ if (out_ignore_error)
+ *out_ignore_error = FALSE;
+
/* If we're given a connection already, prefer that instead of re-reading */
if (source)
tmp = g_object_ref (source);
else {
tmp = connection_from_file (full_path,
&unhandled_spec,
- error);
+ error,
+ out_ignore_error);
if (!tmp)
return NULL;
@@ -376,7 +381,7 @@ commit_changes (NMSettingsConnection *connection,
*/
filename = nm_settings_connection_get_filename (connection);
if (filename) {
- reread = connection_from_file (filename, NULL, NULL);
+ reread = connection_from_file (filename, NULL, NULL, NULL);
if (reread) {
same = nm_connection_compare (NM_CONNECTION (connection),
reread,
diff --git a/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.h b/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.h
index 328e58f5f..44e029877 100644
--- a/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.h
+++ b/src/settings/plugins/ifcfg-rh/nm-ifcfg-connection.h
@@ -48,7 +48,8 @@ GType nm_ifcfg_connection_get_type (void);
NMIfcfgConnection *nm_ifcfg_connection_new (NMConnection *source,
const char *full_path,
- GError **error);
+ GError **error,
+ gboolean *out_ignore_error);
const char *nm_ifcfg_connection_get_unmanaged_spec (NMIfcfgConnection *self);
const char *nm_ifcfg_connection_get_unrecognized_spec (NMIfcfgConnection *self);
diff --git a/src/settings/plugins/ifcfg-rh/plugin.c b/src/settings/plugins/ifcfg-rh/plugin.c
index b7efa8643..1a3f791a4 100644
--- a/src/settings/plugins/ifcfg-rh/plugin.c
+++ b/src/settings/plugins/ifcfg-rh/plugin.c
@@ -169,7 +169,8 @@ remove_connection (SCPluginIfcfg *self, NMIfcfgConnection *connection)
g_object_ref (connection);
g_hash_table_remove (priv->connections, nm_connection_get_uuid (NM_CONNECTION (connection)));
- nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection));
+ if (!unmanaged && !unrecognized)
+ nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection));
g_object_unref (connection);
/* Emit changes _after_ removing the connection */
@@ -213,6 +214,7 @@ update_connection (SCPluginIfcfg *self,
const char *new_unrecognized = NULL, *old_unrecognized = NULL;
gboolean unmanaged_changed = FALSE, unrecognized_changed = FALSE;
const char *uuid;
+ gboolean ignore_error = FALSE;
g_return_val_if_fail (!source || NM_IS_CONNECTION (source), NULL);
g_return_val_if_fail (full_path || source, NULL);
@@ -222,13 +224,16 @@ update_connection (SCPluginIfcfg *self,
/* Create a NMIfcfgConnection instance, either by reading from @full_path or
* based on @source. */
- connection_new = nm_ifcfg_connection_new (source, full_path, error);
+ connection_new = nm_ifcfg_connection_new (source, full_path, &local, &ignore_error);
if (!connection_new) {
/* Unexpected failure. Probably the file is invalid? */
if ( connection
&& !protect_existing_connection
&& (!protected_connections || !g_hash_table_contains (protected_connections, connection)))
remove_connection (self, connection);
+ if (!source && !ignore_error)
+ _LOGW ("loading \"%s\" fails: %s", full_path, local ? local->message : "(unknown reason)");
+ g_propagate_error (error, local);
return NULL;
}
@@ -421,25 +426,13 @@ ifcfg_dir_changed (GFileMonitor *monitor,
gpointer user_data)
{
SCPluginIfcfg *plugin = SC_PLUGIN_IFCFG (user_data);
- char *path, *base, *ifcfg_path;
+ char *path, *ifcfg_path;
NMIfcfgConnection *connection;
path = g_file_get_path (file);
- if (utils_should_ignore_file (path, FALSE)) {
- g_free (path);
- return;
- }
-
- _LOGD ("ifcfg_dir_changed(%s) = %d", path, event_type);
- base = g_file_get_basename (file);
- if (utils_is_ifcfg_alias_file (base, NULL)) {
- /* Alias file changed. Get the base ifcfg file from it */
- ifcfg_path = utils_get_ifcfg_from_alias (path);
- } else {
- /* Given any ifcfg, keys, or routes file, get the ifcfg file path */
- ifcfg_path = utils_get_ifcfg_path (path);
- }
+ ifcfg_path = utils_detect_ifcfg_path (path, FALSE);
+ _LOGD ("ifcfg_dir_changed(%s) = %d // %s", path, event_type, ifcfg_path ? ifcfg_path : "(none)");
if (ifcfg_path) {
connection = find_by_path (plugin, ifcfg_path);
switch (event_type) {
@@ -458,7 +451,6 @@ ifcfg_dir_changed (GFileMonitor *monitor,
g_free (ifcfg_path);
}
g_free (path);
- g_free (base);
}
static void
@@ -542,18 +534,14 @@ read_connections (SCPluginIfcfg *plugin)
filenames = g_ptr_array_new_with_free_func (g_free);
while ((item = g_dir_read_name (dir))) {
- char *full_path;
-
- if (utils_should_ignore_file (item, TRUE))
- continue;
- if (utils_is_ifcfg_alias_file (item, NULL))
- continue;
+ char *full_path, *real_path;
full_path = g_build_filename (IFCFG_DIR, item, NULL);
- if (!utils_get_ifcfg_name (full_path, TRUE))
- g_free (full_path);
- else
- g_ptr_array_add (filenames, full_path);
+ real_path = utils_detect_ifcfg_path (full_path, TRUE);
+
+ if (real_path)
+ g_ptr_array_add (filenames, real_path);
+ g_free (full_path);
}
g_dir_close (dir);
@@ -625,20 +613,25 @@ load_connection (NMSystemConfigInterface *config,
SCPluginIfcfg *plugin = SC_PLUGIN_IFCFG (config);
NMIfcfgConnection *connection;
int dir_len = strlen (IFCFG_DIR);
+ char *ifcfg_path;
if ( strncmp (filename, IFCFG_DIR, dir_len) != 0
|| filename[dir_len] != '/'
|| strchr (filename + dir_len + 1, '/') != NULL)
return FALSE;
- if (utils_should_ignore_file (filename + dir_len + 1, TRUE))
+ /* get the real ifcfg-path. This allows us to properly
+ * handle load command using a route-* file etc. */
+ ifcfg_path = utils_detect_ifcfg_path (filename, FALSE);
+ if (!ifcfg_path)
return FALSE;
- connection = find_by_path (plugin, filename);
- update_connection (plugin, NULL, filename, connection, TRUE, NULL, NULL);
+ connection = find_by_path (plugin, ifcfg_path);
+ update_connection (plugin, NULL, ifcfg_path, connection, TRUE, NULL, NULL);
if (!connection)
- connection = find_by_path (plugin, filename);
+ connection = find_by_path (plugin, ifcfg_path);
+ g_free (ifcfg_path);
return (connection != NULL);
}
@@ -1139,7 +1132,7 @@ nm_system_config_factory (void)
dbus_g_connection_register_g_object (priv->bus,
DBUS_OBJECT_PATH,
G_OBJECT (singleton));
- _LOGI ("Acquired D-Bus service %s", DBUS_SERVICE_NAME);
+ _LOGD ("Acquired D-Bus service %s", DBUS_SERVICE_NAME);
} else
g_object_ref (singleton);
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c
index 41439f615..ec8741677 100644
--- a/src/settings/plugins/ifcfg-rh/reader.c
+++ b/src/settings/plugins/ifcfg-rh/reader.c
@@ -53,7 +53,6 @@
#include <nm-utils.h>
#include "nm-platform.h"
-#include "nm-posix-signals.h"
#include "NetworkManagerUtils.h"
#include "nm-logging.h"
#include "gsystem-local-alloc.h"
@@ -178,6 +177,8 @@ make_connection_setting (const char *file,
NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MIN,
NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_MAX,
NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY_DEFAULT),
+ NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES,
+ svTrueValue (ifcfg, "AUTOCONNECT_SLAVES", NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_DEFAULT),
NULL);
value = svGetValue (ifcfg, "USERS", FALSE);
@@ -507,7 +508,7 @@ read_one_ip4_route (shvarFile *ifcfg,
/* Metric */
value = svGetValue (ifcfg, metric_tag, FALSE);
if (value) {
- metric = nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, -1);
+ metric = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, -1);
if (metric < 0) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid IP4 route metric '%s'", value);
@@ -1153,16 +1154,14 @@ read_aliases (NMSettingIPConfig *s_ip4, const char *filename, const char *networ
GDir *dir;
char *dirname, *base;
shvarFile *parsed;
- NMIPAddress *base_addr;
+ NMIPAddress *base_addr = NULL;
GError *err = NULL;
g_return_if_fail (s_ip4 != NULL);
g_return_if_fail (filename != NULL);
- if (nm_setting_ip_config_get_num_addresses (s_ip4) == 0)
- return;
-
- base_addr = nm_setting_ip_config_get_address (s_ip4, 0);
+ if (nm_setting_ip_config_get_num_addresses (s_ip4) > 0)
+ base_addr = nm_setting_ip_config_get_address (s_ip4, 0);
dirname = g_path_get_dirname (filename);
g_return_if_fail (dirname != NULL);
@@ -3351,7 +3350,7 @@ make_wireless_setting (shvarFile *ifcfg,
value = svGetValue (ifcfg, "CHANNEL", FALSE);
if (value) {
errno = 0;
- chan = nm_utils_ascii_str_to_int64 (value, 10, 1, 196, 0);
+ chan = _nm_utils_ascii_str_to_int64 (value, 10, 1, 196, 0);
if (errno || (chan == 0)) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Invalid wireless channel '%s'", value);
@@ -4335,11 +4334,11 @@ is_wifi_device (const char *name, shvarFile *parsed)
g_return_val_if_fail (name != NULL, FALSE);
g_return_val_if_fail (parsed != NULL, FALSE);
- ifindex = nm_platform_link_get_ifindex (name);
+ ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, name);
if (ifindex == 0)
return FALSE;
- return nm_platform_link_get_type (ifindex) == NM_LINK_TYPE_WIFI;
+ return nm_platform_link_get_type (NM_PLATFORM_GET, ifindex) == NM_LINK_TYPE_WIFI;
}
static void
@@ -4433,13 +4432,10 @@ make_vlan_setting (shvarFile *ifcfg,
/* Grab VLAN ID from interface name; this takes precedence over the
* separate VLAN_ID property for backwards compat.
*/
- vlan_id = (gint) g_ascii_strtoll (p, &end, 10);
- if (vlan_id < 0 || vlan_id > 4095 || end == p || *end) {
- g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "Failed to determine VLAN ID from DEVICE '%s'",
- iface_name);
- goto error;
- }
+
+ gint device_vlan_id = (gint) g_ascii_strtoll (p, &end, 10);
+ if (device_vlan_id >= 0 && device_vlan_id <= 4095 && end != p && !*end)
+ vlan_id = device_vlan_id;
}
}
@@ -4679,7 +4675,8 @@ connection_from_file_full (const char *filename,
connection = create_unhandled_connection (filename, parsed, "unmanaged", out_unhandled);
if (!connection)
- PARSE_WARNING ("NM_CONTROLLED was false but device was not uniquely identified; device will be managed");
+ g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
+ "NM_CONTROLLED was false but device was not uniquely identified; device will be managed");
goto done;
}
@@ -4841,18 +4838,13 @@ done:
NMConnection *
connection_from_file (const char *filename,
char **out_unhandled,
- GError **error)
+ GError **error,
+ gboolean *out_ignore_error)
{
- gboolean ignore_error = FALSE;
- NMConnection *conn;
-
- conn = connection_from_file_full (filename, NULL, NULL,
+ return connection_from_file_full (filename, NULL, NULL,
out_unhandled,
error,
- &ignore_error);
- if (error && *error && !ignore_error)
- PARSE_WARNING ("%s", (*error)->message);
- return conn;
+ out_ignore_error);
}
NMConnection *
@@ -4885,7 +4877,7 @@ devtimeout_from_file (const char *filename)
devtimeout_str = svGetValue (ifcfg, "DEVTIMEOUT", FALSE);
if (devtimeout_str) {
- devtimeout = nm_utils_ascii_str_to_int64 (devtimeout_str, 10, 0, G_MAXUINT, 0);
+ devtimeout = _nm_utils_ascii_str_to_int64 (devtimeout_str, 10, 0, G_MAXUINT, 0);
g_free (devtimeout_str);
} else
devtimeout = 0;
diff --git a/src/settings/plugins/ifcfg-rh/reader.h b/src/settings/plugins/ifcfg-rh/reader.h
index 70e9ce4e2..2096ffc40 100644
--- a/src/settings/plugins/ifcfg-rh/reader.h
+++ b/src/settings/plugins/ifcfg-rh/reader.h
@@ -28,7 +28,8 @@
NMConnection *connection_from_file (const char *filename,
char **out_unhandled,
- GError **error);
+ GError **error,
+ gboolean *out_ignore_error);
char *uuid_from_file (const char *filename);
diff --git a/src/settings/plugins/ifcfg-rh/shvar.c b/src/settings/plugins/ifcfg-rh/shvar.c
index 5f3d173b2..4a5ca1d18 100644
--- a/src/settings/plugins/ifcfg-rh/shvar.c
+++ b/src/settings/plugins/ifcfg-rh/shvar.c
@@ -36,7 +36,8 @@
#include "shvar.h"
-#include "NetworkManagerUtils.h"
+#include "gsystem-local-alloc.h"
+#include "nm-core-internal.h"
#include "nm-logging.h"
#define PARSE_WARNING(msg...) nm_log_warn (LOGD_SETTINGS, " " msg)
@@ -206,8 +207,8 @@ static const char escapees[] = "\"'\\$~`"; /* must be escaped */
static const char spaces[] = " \t|&;()<>"; /* only require "" */
static const char newlines[] = "\n\r"; /* will be removed */
-char *
-svEscape (const char *s)
+const char *
+svEscape (const char *s, char **to_free)
{
char *new;
int i, j, mangle = 0, space = 0, newline = 0;
@@ -223,8 +224,10 @@ svEscape (const char *s)
if (strchr (newlines, s[i]))
newline++;
}
- if (!mangle && !space && !newline)
- return strdup (s);
+ if (!mangle && !space && !newline) {
+ *to_free = NULL;
+ return s;
+ }
newlen = slen + mangle - newline + 3; /* 3 is extra ""\0 */
new = g_malloc (newlen);
@@ -243,6 +246,7 @@ svEscape (const char *s)
new[j++] = '\0';
g_assert (j == slen + mangle - newline + 3);
+ *to_free = new;
return new;
}
@@ -253,6 +257,22 @@ svEscape (const char *s)
char *
svGetValue (shvarFile *s, const char *key, gboolean verbatim)
{
+ char *value;
+
+ value = svGetValueFull (s, key, verbatim);
+ if (value && !*value) {
+ g_free (value);
+ return NULL;
+ }
+ return value;
+}
+
+/* svGetValueFull() is identical to svGetValue() except that
+ * svGetValue() will never return an empty value (but %NULL instead).
+ * svGetValueFull() will return empty values if that is the value for the @key. */
+char *
+svGetValueFull (shvarFile *s, const char *key, gboolean verbatim)
+{
char *value = NULL;
char *line;
char *keyString;
@@ -276,12 +296,7 @@ svGetValue (shvarFile *s, const char *key, gboolean verbatim)
}
g_free (keyString);
- if (value && value[0]) {
- return value;
- } else {
- g_free (value);
- return NULL;
- }
+ return value;
}
/* return TRUE if <key> resolves to any truth value (e.g. "yes", "y", "true")
@@ -321,7 +336,7 @@ svTrueValue (shvarFile *s, const char *key, gboolean def)
* @max: the maximum for range-check
* @fallback: the fallback value in any error case
*
- * Reads a value @key and converts it to an integer using nm_utils_ascii_str_to_int64().
+ * Reads a value @key and converts it to an integer using _nm_utils_ascii_str_to_int64().
* In case of error, @errno will be set and @fallback returned. */
gint64
svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, gint64 max, gint64 fallback)
@@ -330,13 +345,13 @@ svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, gint64 m
gint64 result;
int errsv;
- tmp = svGetValue (s, key, FALSE);
+ tmp = svGetValueFull (s, key, FALSE);
if (!tmp) {
errno = 0;
return fallback;
}
- result = nm_utils_ascii_str_to_int64 (tmp, base, min, max, fallback);
+ result = _nm_utils_ascii_str_to_int64 (tmp, base, min, max, fallback);
errsv = errno;
if (errsv != 0)
PARSE_WARNING ("Error reading '%s' value '%s' as integer (%d)", key, tmp, errsv);
@@ -354,20 +369,30 @@ svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, gint64 m
void
svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim)
{
- char *newval = NULL, *oldval = NULL;
+ svSetValueFull (s, key, value && value[0] ? value : NULL, verbatim);
+}
+
+/* Same as svSetValue() but it preserves empty @value -- contrary to
+ * svSetValue() for which "" effectively means to remove the value. */
+void
+svSetValueFull (shvarFile *s, const char *key, const char *value, gboolean verbatim)
+{
+ gs_free char *newval_free = NULL;
+ gs_free char *oldval = NULL;
+ const char *newval;
char *keyValue;
g_return_if_fail (s != NULL);
g_return_if_fail (key != NULL);
/* value may be NULL */
- if (value)
- newval = verbatim ? g_strdup (value) : svEscape (value);
- keyValue = g_strdup_printf ("%s=%s", key, newval ? newval : "");
-
- oldval = svGetValue (s, key, FALSE);
+ if (!value || verbatim)
+ newval = value;
+ else
+ newval = svEscape (value, &newval_free);
+ oldval = svGetValueFull (s, key, FALSE);
- if (!newval || !newval[0]) {
+ if (!newval) {
/* delete value */
if (oldval) {
/* delete line */
@@ -376,15 +401,15 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim)
g_list_free_1 (s->current);
s->modified = TRUE;
}
- g_free (keyValue);
- goto end;
+ return;
}
+ keyValue = g_strdup_printf ("%s=%s", key, newval);
if (!oldval) {
/* append line */
s->lineList = g_list_append (s->lineList, keyValue);
s->modified = TRUE;
- goto end;
+ return;
}
if (strcmp (oldval, newval) != 0) {
@@ -397,11 +422,6 @@ svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim)
s->modified = TRUE;
} else
g_free (keyValue);
-
- end:
- g_free (newval);
- g_free (oldval);
- return;
}
/* Write the current contents iff modified. Returns FALSE on error
diff --git a/src/settings/plugins/ifcfg-rh/shvar.h b/src/settings/plugins/ifcfg-rh/shvar.h
index b2a2f2636..4902541b0 100644
--- a/src/settings/plugins/ifcfg-rh/shvar.h
+++ b/src/settings/plugins/ifcfg-rh/shvar.h
@@ -56,6 +56,7 @@ shvarFile *svOpenFile (const char *name, GError **error);
* be freed by the caller.
*/
char *svGetValue (shvarFile *s, const char *key, gboolean verbatim);
+char *svGetValueFull (shvarFile *s, const char *key, gboolean verbatim);
/* return TRUE if <key> resolves to any truth value (e.g. "yes", "y", "true")
* return FALSE if <key> resolves to any non-truth value (e.g. "no", "n", "false")
@@ -71,6 +72,7 @@ gint64 svGetValueInt64 (shvarFile *s, const char *key, guint base, gint64 min, g
* to the top of the file.
*/
void svSetValue (shvarFile *s, const char *key, const char *value, gboolean verbatim);
+void svSetValueFull (shvarFile *s, const char *key, const char *value, gboolean verbatim);
/* Write the current contents iff modified. Returns FALSE on error
@@ -84,8 +86,8 @@ gboolean svWriteFile (shvarFile *s, int mode, GError **error);
/* Close the file descriptor (if open) and free the shvarFile. */
void svCloseFile (shvarFile *s);
-/* Return a new escaped string */
-char *svEscape (const char *s);
+/* Return @s unmodified or an escaped string */
+const char *svEscape (const char *s, char **to_free);
/* Unescape a string in-place */
void svUnescape (char *s);
diff --git a/src/settings/plugins/ifcfg-rh/tests/Makefile.in b/src/settings/plugins/ifcfg-rh/tests/Makefile.in
index d3c838a77..d0832e477 100644
--- a/src/settings/plugins/ifcfg-rh/tests/Makefile.in
+++ b/src/settings/plugins/ifcfg-rh/tests/Makefile.in
@@ -192,7 +192,7 @@ am__recursive_targets = \
$(RECURSIVE_CLEAN_TARGETS) \
$(am__extra_recursive_targets)
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
- distdir
+ check recheck distdir
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
@@ -234,9 +234,190 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
DIST_SUBDIRS = network-scripts
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
@@ -267,6 +448,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -380,6 +562,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -568,7 +751,7 @@ with_valgrind = @with_valgrind@
all: all-recursive
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -811,98 +994,175 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-ifcfg-rh-utils.log: test-ifcfg-rh-utils$(EXEEXT)
+ @p='test-ifcfg-rh-utils$(EXEEXT)'; \
+ b='test-ifcfg-rh-utils'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ifcfg-rh.log: test-ifcfg-rh$(EXEEXT)
+ @p='test-ifcfg-rh$(EXEEXT)'; \
+ b='test-ifcfg-rh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -985,6 +1245,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -1080,8 +1343,8 @@ uninstall-am:
install-strip installcheck installcheck-am installdirs \
installdirs-am maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
- uninstall-am
+ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+ uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.in b/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.in
index 58798f775..ef06c5ef3 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.in
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils.c
index 13f1126e4..68f236afb 100644
--- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils.c
+++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils.c
@@ -115,15 +115,9 @@ test_ignored (const char *desc, const char *path, gboolean expected_ignored)
ASSERT (result == expected_ignored, desc, "unexpected ignore result for path '%s'", path);
}
-NMTST_DEFINE ();
-
-int main (int argc, char **argv)
+static void
+test_name (void)
{
- char *base;
-
- nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
-
- /* The tests */
test_get_ifcfg_name ("get-ifcfg-name-bad", "/foo/bar/adfasdfadf", FALSE, NULL);
test_get_ifcfg_name ("get-ifcfg-name-good", "/foo/bar/ifcfg-FooBar", FALSE, "FooBar");
test_get_ifcfg_name ("get-ifcfg-name-keys", "/foo/bar/keys-BlahLbah", FALSE, "BlahLbah");
@@ -137,7 +131,11 @@ int main (int argc, char **argv)
test_get_ifcfg_name ("get-ifcfg-name-bad2-ifcfg", "/foo/bar/asdfasifcfg-Foobar", FALSE, NULL);
test_get_ifcfg_name ("get-ifcfg-name-bad2-keys", "/foo/bar/asdfaskeys-Foobar", FALSE, NULL);
test_get_ifcfg_name ("get-ifcfg-name-bad2-route", "/foo/bar/asdfasroute-Foobar", FALSE, NULL);
+}
+static void
+test_path (void)
+{
test_get_ifcfg_path ("ifcfg-path-bad", "/foo/bar/adfasdfasdf", NULL);
test_get_ifcfg_path ("ifcfg-path-from-keys-no-path", "keys-BlahBlah", "ifcfg-BlahBlah");
test_get_ifcfg_path ("ifcfg-path-from-keys", "/foo/bar/keys-BlahBlah", "/foo/bar/ifcfg-BlahBlah");
@@ -152,7 +150,11 @@ int main (int argc, char **argv)
test_get_route_path ("route-path-from-ifcfg-no-path", "ifcfg-FooBar", "route-FooBar");
test_get_route_path ("route-path-from-ifcfg", "/foo/bar/ifcfg-FooBar", "/foo/bar/route-FooBar");
test_get_route_path ("route-path-from-keys", "/foo/bar/keys-FooBar", "/foo/bar/route-FooBar");
+}
+static void
+test_ignore (void)
+{
test_ignored ("ignored-ifcfg", "ifcfg-FooBar", FALSE);
test_ignored ("ignored-keys", "keys-FooBar", FALSE);
test_ignored ("ignored-route", "route-FooBar", FALSE);
@@ -163,10 +165,19 @@ int main (int argc, char **argv)
test_ignored ("ignored-rpmnew", "ifcfg-FooBar" RPMNEW_TAG, TRUE);
test_ignored ("ignored-augnew", "ifcfg-FooBar" AUGNEW_TAG, TRUE);
test_ignored ("ignored-augtmp", "ifcfg-FooBar" AUGTMP_TAG, TRUE);
+}
+
+NMTST_DEFINE ();
+
+int main (int argc, char **argv)
+{
+ nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
+
+ /* The tests */
+ g_test_add_func ("/settings/plugins/ifcfg-rh/name", test_name);
+ g_test_add_func ("/settings/plugins/ifcfg-rh/path", test_path);
+ g_test_add_func ("/settings/plugins/ifcfg-rh/ignore", test_ignore);
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
+ return g_test_run ();
}
diff --git a/src/settings/plugins/ifcfg-rh/utils.c b/src/settings/plugins/ifcfg-rh/utils.c
index 4b7cb43d9..a793288d9 100644
--- a/src/settings/plugins/ifcfg-rh/utils.c
+++ b/src/settings/plugins/ifcfg-rh/utils.c
@@ -25,6 +25,9 @@
#include <string.h>
#include "nm-core-internal.h"
+#include "nm-macros-internal.h"
+#include "NetworkManagerUtils.h"
+#include "gsystem-local-alloc.h"
#include "utils.h"
#include "shvar.h"
@@ -149,41 +152,34 @@ check_suffix (const char *base, const char *tag)
gboolean
utils_should_ignore_file (const char *filename, gboolean only_ifcfg)
{
- char *base;
- gboolean ignore = TRUE;
- gboolean is_ifcfg = FALSE;
- gboolean is_other = FALSE;
+ gs_free char *base = NULL;
g_return_val_if_fail (filename != NULL, TRUE);
base = g_path_get_basename (filename);
- g_return_val_if_fail (base != NULL, TRUE);
/* Only handle ifcfg, keys, and routes files */
- if (!strncmp (base, IFCFG_TAG, strlen (IFCFG_TAG)))
- is_ifcfg = TRUE;
-
- if (only_ifcfg == FALSE) {
- if ( !strncmp (base, KEYS_TAG, strlen (KEYS_TAG))
- || !strncmp (base, ROUTE_TAG, strlen (ROUTE_TAG))
- || !strncmp (base, ROUTE6_TAG, strlen (ROUTE6_TAG)))
- is_other = TRUE;
+ if (strncmp (base, IFCFG_TAG, strlen (IFCFG_TAG)) != 0) {
+ if (only_ifcfg)
+ return TRUE;
+ else if ( strncmp (base, KEYS_TAG, strlen (KEYS_TAG)) != 0
+ && strncmp (base, ROUTE_TAG, strlen (ROUTE_TAG)) != 0
+ && strncmp (base, ROUTE6_TAG, strlen (ROUTE6_TAG)) != 0)
+ return TRUE;
}
/* But not those that have certain suffixes */
- if ( (is_ifcfg || is_other)
- && !check_suffix (base, BAK_TAG)
- && !check_suffix (base, TILDE_TAG)
- && !check_suffix (base, ORIG_TAG)
- && !check_suffix (base, REJ_TAG)
- && !check_suffix (base, RPMNEW_TAG)
- && !check_suffix (base, AUGNEW_TAG)
- && !check_suffix (base, AUGTMP_TAG)
- && !check_rpm_temp_suffix (base))
- ignore = FALSE;
-
- g_free (base);
- return ignore;
+ if ( check_suffix (base, BAK_TAG)
+ || check_suffix (base, TILDE_TAG)
+ || check_suffix (base, ORIG_TAG)
+ || check_suffix (base, REJ_TAG)
+ || check_suffix (base, RPMNEW_TAG)
+ || check_suffix (base, AUGNEW_TAG)
+ || check_suffix (base, AUGTMP_TAG)
+ || check_rpm_temp_suffix (base))
+ return TRUE;
+
+ return FALSE;
}
char *
@@ -205,34 +201,43 @@ utils_cert_path (const char *parent, const char *suffix)
const char *
utils_get_ifcfg_name (const char *file, gboolean only_ifcfg)
{
- const char *name = NULL, *start = NULL;
- char *base;
+ const char *name;
g_return_val_if_fail (file != NULL, NULL);
- base = g_path_get_basename (file);
- if (!base)
+ name = strrchr (file, '/');
+ if (!name)
+ name = file;
+ else
+ name++;
+ if (!*name)
return NULL;
- /* Find the point in 'file' where 'base' starts. We use 'file' since it's
- * const and thus will survive after we free 'base'.
- */
- start = file + strlen (file) - strlen (base);
- g_assert (strcmp (start, base) == 0);
- g_free (base);
-
- if (!strncmp (start, IFCFG_TAG, strlen (IFCFG_TAG)))
- name = start + strlen (IFCFG_TAG);
- else if (only_ifcfg == FALSE) {
- if (!strncmp (start, KEYS_TAG, strlen (KEYS_TAG)))
- name = start + strlen (KEYS_TAG);
- else if (!strncmp (start, ROUTE_TAG, strlen (ROUTE_TAG)))
- name = start + strlen (ROUTE_TAG);
- else if (!strncmp (start, ROUTE6_TAG, strlen (ROUTE6_TAG)))
- name = start + strlen (ROUTE6_TAG);
+#define MATCH_TAG_AND_RETURN(name, TAG) \
+ G_STMT_START { \
+ if (strncmp (name, TAG, STRLEN (TAG)) == 0) { \
+ name += STRLEN (TAG); \
+ if (name[0] == '\0') \
+ return NULL; \
+ else \
+ return name; \
+ } \
+ } G_STMT_END
+
+ /* Do not detect alias files and return 'eth0:0' instead of 'eth0'.
+ * Unfortunately, we cannot be sure that our files don't contain colons,
+ * so we cannot reject files with colons.
+ *
+ * Instead, you must not call utils_get_ifcfg_name() with an alias file
+ * or files that are ignored. */
+ MATCH_TAG_AND_RETURN (name, IFCFG_TAG);
+ if (!only_ifcfg) {
+ MATCH_TAG_AND_RETURN (name, KEYS_TAG);
+ MATCH_TAG_AND_RETURN (name, ROUTE_TAG);
+ MATCH_TAG_AND_RETURN (name, ROUTE6_TAG);
}
- return name;
+ return NULL;
}
/* Used to get any ifcfg/extra file path from any other ifcfg/extra path
@@ -420,26 +425,43 @@ utils_is_ifcfg_alias_file (const char *alias, const char *ifcfg)
}
char *
-utils_get_ifcfg_from_alias (const char *alias)
+utils_detect_ifcfg_path (const char *path, gboolean only_ifcfg)
{
- char *base, *ptr, *ifcfg = NULL;
+ gs_free char *base = NULL;
+ char *ptr, *ifcfg = NULL;
- g_return_val_if_fail (alias != NULL, NULL);
+ g_return_val_if_fail (path != NULL, NULL);
- base = g_path_get_basename (alias);
- g_return_val_if_fail (base != NULL, NULL);
+ if (utils_should_ignore_file (path, only_ifcfg))
+ return NULL;
- if (utils_is_ifcfg_alias_file (base, NULL)) {
- ifcfg = g_strdup (alias);
- ptr = strrchr (ifcfg, ':');
- if (ptr)
- *ptr = '\0';
- else {
+ base = g_path_get_basename (path);
+
+ if (strncmp (base, IFCFG_TAG, STRLEN (IFCFG_TAG)) == 0) {
+ if (base[STRLEN (IFCFG_TAG)] == '\0')
+ return NULL;
+ if (utils_is_ifcfg_alias_file (base, NULL)) {
+ ifcfg = g_strdup (path);
+ ptr = strrchr (ifcfg, ':');
+ if (ptr && ptr > ifcfg) {
+ *ptr = '\0';
+ if (g_file_test (ifcfg, G_FILE_TEST_EXISTS)) {
+ /* the file has a colon, so it is probably an alias.
+ * To be ~more~ certain that this is an alias file,
+ * check whether a corresponding base file exists. */
+ if (only_ifcfg) {
+ g_free (ifcfg);
+ return NULL;
+ }
+ return ifcfg;
+ }
+ }
g_free (ifcfg);
- ifcfg = NULL;
}
+ return g_strdup (path);
}
- g_free (base);
- return ifcfg;
+ if (only_ifcfg)
+ return NULL;
+ return utils_get_ifcfg_path (path);
}
diff --git a/src/settings/plugins/ifcfg-rh/utils.h b/src/settings/plugins/ifcfg-rh/utils.h
index 445437c48..547bfcb2d 100644
--- a/src/settings/plugins/ifcfg-rh/utils.h
+++ b/src/settings/plugins/ifcfg-rh/utils.h
@@ -59,7 +59,8 @@ gboolean utils_has_complex_routes (const char *filename);
gboolean utils_ignore_ip_config (NMConnection *connection);
gboolean utils_is_ifcfg_alias_file (const char *alias, const char *ifcfg);
-char *utils_get_ifcfg_from_alias (const char *alias);
+
+char *utils_detect_ifcfg_path (const char *path, gboolean only_ifcfg);
#endif /* _UTILS_H_ */
diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c
index d2b0c9700..52bf51d18 100644
--- a/src/settings/plugins/ifcfg-rh/writer.c
+++ b/src/settings/plugins/ifcfg-rh/writer.c
@@ -888,20 +888,22 @@ write_wireless_setting (NMConnection *connection,
svSetValue (ifcfg, "ESSID", str->str, TRUE);
g_string_free (str, TRUE);
} else {
+ const char *tmp_escaped;
+
/* Printable SSIDs always get quoted */
memset (buf, 0, sizeof (buf));
memcpy (buf, ssid_data, ssid_len);
- tmp = svEscape (buf);
+ tmp_escaped = svEscape (buf, &tmp);
/* svEscape will usually quote the string, but just for consistency,
* if svEscape doesn't quote the ESSID, we quote it ourselves.
*/
- if (tmp[0] != '"' && tmp[strlen (tmp) - 1] != '"') {
- tmp2 = g_strdup_printf ("\"%s\"", tmp);
+ if (tmp_escaped[0] != '"' && tmp_escaped[strlen (tmp_escaped) - 1] != '"') {
+ tmp2 = g_strdup_printf ("\"%s\"", tmp_escaped);
svSetValue (ifcfg, "ESSID", tmp2, TRUE);
g_free (tmp2);
} else
- svSetValue (ifcfg, "ESSID", tmp, TRUE);
+ svSetValue (ifcfg, "ESSID", tmp_escaped, TRUE);
g_free (tmp);
}
@@ -1665,7 +1667,7 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
{
guint32 n, i;
GString *str;
- const char *master;
+ const char *master, *type;
char *tmp;
gint i_int;
@@ -1682,6 +1684,20 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
svSetValue (ifcfg, "AUTOCONNECT_PRIORITY", tmp, FALSE);
g_free (tmp);
+ /* Only save the value for master connections */
+ svSetValue (ifcfg, "AUTOCONNECT_SLAVES", NULL, FALSE);
+ type = nm_setting_connection_get_connection_type (s_con);
+ if ( !g_strcmp0 (type, NM_SETTING_BOND_SETTING_NAME)
+ || !g_strcmp0 (type, NM_SETTING_TEAM_SETTING_NAME)
+ || !g_strcmp0 (type, NM_SETTING_BRIDGE_SETTING_NAME)) {
+ NMSettingConnectionAutoconnectSlaves autoconnect_slaves;
+ autoconnect_slaves = nm_setting_connection_get_autoconnect_slaves (s_con);
+ svSetValue (ifcfg, "AUTOCONNECT_SLAVES",
+ autoconnect_slaves == NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_YES ? "yes" :
+ autoconnect_slaves == NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES_NO ? "no" : NULL,
+ FALSE);
+ }
+
/* Permissions */
svSetValue (ifcfg, "USERS", NULL, FALSE);
n = nm_setting_connection_get_num_permissions (s_con);
@@ -2448,7 +2464,7 @@ escape_id (const char *id)
while (*p) {
if (*p == ' ')
*p = '_';
- else if (strchr ("\\][|/=()!", *p))
+ else if (strchr ("\\][|/=()!:", *p))
*p = '-';
p++;
}
diff --git a/src/settings/plugins/ifcfg-suse/Makefile.in b/src/settings/plugins/ifcfg-suse/Makefile.in
index f7df30b4d..3d7df19ea 100644
--- a/src/settings/plugins/ifcfg-suse/Makefile.in
+++ b/src/settings/plugins/ifcfg-suse/Makefile.in
@@ -219,6 +219,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -332,6 +333,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ifnet/Makefile.in b/src/settings/plugins/ifnet/Makefile.in
index cbedcd799..4832249aa 100644
--- a/src/settings/plugins/ifnet/Makefile.in
+++ b/src/settings/plugins/ifnet/Makefile.in
@@ -267,6 +267,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -380,6 +381,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ifnet/connection_parser.c b/src/settings/plugins/ifnet/connection_parser.c
index 41baf3150..888ee589a 100644
--- a/src/settings/plugins/ifnet/connection_parser.c
+++ b/src/settings/plugins/ifnet/connection_parser.c
@@ -706,13 +706,13 @@ make_ip4_setting (NMConnection *connection,
GError *local = NULL;
if ((metric_str = ifnet_get_data (conn_name, "metric")) != NULL) {
- metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
+ metric = _nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
} else {
metric_str = ifnet_get_global_data ("metric");
if (metric_str) {
stripped = g_strdup (metric_str);
strip_string (stripped, '"');
- metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
+ metric = _nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
g_free (stripped);
} else
metric = -1;
@@ -846,13 +846,13 @@ make_ip6_setting (NMConnection *connection,
/* metric is not per routes configuration right now
* global metric is also supported (metric="x") */
if ((metric_str = ifnet_get_data (conn_name, "metric")) != NULL)
- metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
+ metric = _nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
else {
metric_str = ifnet_get_global_data ("metric");
if (metric_str) {
stripped = g_strdup (metric_str);
strip_string (stripped, '"');
- metric = nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
+ metric = _nm_utils_ascii_str_to_int64 (metric_str, 10, 0, G_MAXUINT32, -1);
g_free (stripped);
} else
metric = 1;
diff --git a/src/settings/plugins/ifnet/net_parser.c b/src/settings/plugins/ifnet/net_parser.c
index 755767e29..8f528d0f4 100644
--- a/src/settings/plugins/ifnet/net_parser.c
+++ b/src/settings/plugins/ifnet/net_parser.c
@@ -174,9 +174,9 @@ init_block_by_line (gchar * buf)
/* ignored connection */
conn = add_new_connection_config ("ignore", pos);
} else {
- int ifindex = nm_platform_link_get_ifindex (pos);
+ int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, pos);
- if (ifindex && nm_platform_link_get_type (ifindex) != NM_LINK_TYPE_WIFI)
+ if (ifindex && nm_platform_link_get_type (NM_PLATFORM_GET, ifindex) != NM_LINK_TYPE_WIFI)
/* wired connection */
conn = add_new_connection_config ("wired", pos);
else
diff --git a/src/settings/plugins/ifnet/net_parser.h b/src/settings/plugins/ifnet/net_parser.h
index 005207adf..d10979cca 100644
--- a/src/settings/plugins/ifnet/net_parser.h
+++ b/src/settings/plugins/ifnet/net_parser.h
@@ -25,7 +25,6 @@
#include <glib.h>
#define CONF_NET_FILE SYSCONFDIR "/conf.d/net"
-#define IFNET_KEY_FILE_GROUP "ifnet"
gboolean ifnet_init (gchar * config_file);
void ifnet_destroy (void);
diff --git a/src/settings/plugins/ifnet/plugin.c b/src/settings/plugins/ifnet/plugin.c
index 33711639d..5eab31abf 100644
--- a/src/settings/plugins/ifnet/plugin.c
+++ b/src/settings/plugins/ifnet/plugin.c
@@ -47,7 +47,6 @@
#define IFNET_PLUGIN_INFO "(C) 1999-2010 Gentoo Foundation, Inc. To report bugs please use bugs.gentoo.org with [networkmanager] or [qiaomuf] prefix."
#define IFNET_SYSTEM_HOSTNAME_FILE "/etc/conf.d/hostname"
#define IFNET_MANAGE_WELL_KNOWN_DEFAULT TRUE
-#define IFNET_KEY_FILE_KEY_MANAGED "managed"
typedef struct {
GHashTable *connections; /* uuid::connection */
@@ -121,17 +120,9 @@ write_system_hostname (NMSystemConfigInterface * config,
static gboolean
is_managed_plugin (void)
{
- char *result = NULL;
-
- result = nm_config_get_value (nm_config_get (),
- IFNET_KEY_FILE_GROUP, IFNET_KEY_FILE_KEY_MANAGED,
- NULL);
- if (result) {
- gboolean ret = is_true (result);
- g_free (result);
- return ret;
- }
- return IFNET_MANAGE_WELL_KNOWN_DEFAULT;
+ return nm_config_data_get_value_boolean (NM_CONFIG_GET_DATA_ORIG,
+ NM_CONFIG_KEYFILE_GROUP_IFNET, NM_CONFIG_KEYFILE_KEY_IFNET_MANAGED,
+ IFNET_MANAGE_WELL_KNOWN_DEFAULT);
}
static void
@@ -246,8 +237,7 @@ reload_connections (NMSystemConfigInterface *config)
SCPluginIfnet *self = SC_PLUGIN_IFNET (config);
SCPluginIfnetPrivate *priv = SC_PLUGIN_IFNET_GET_PRIVATE (self);
GList *conn_names = NULL, *n_iter = NULL;
- gboolean auto_refresh = FALSE;
- char *str_auto_refresh;
+ gboolean auto_refresh;
GError *error = NULL;
/* save names for removing unused connections */
@@ -264,12 +254,9 @@ reload_connections (NMSystemConfigInterface *config)
nm_log_info (LOGD_SETTINGS, "Loading connections");
- str_auto_refresh = nm_config_get_value (nm_config_get (),
- IFNET_KEY_FILE_GROUP, "auto_refresh",
- NULL);
- if (str_auto_refresh && is_true (str_auto_refresh))
- auto_refresh = TRUE;
- g_free (str_auto_refresh);
+ auto_refresh = nm_config_data_get_value_boolean (NM_CONFIG_GET_DATA_ORIG,
+ NM_CONFIG_KEYFILE_GROUP_IFNET, NM_CONFIG_KEYFILE_KEY_IFNET_AUTO_REFRESH,
+ FALSE);
new_connections = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
diff --git a/src/settings/plugins/ifnet/tests/Makefile.in b/src/settings/plugins/ifnet/tests/Makefile.in
index 5b0dcc8de..b94a46fcb 100644
--- a/src/settings/plugins/ifnet/tests/Makefile.in
+++ b/src/settings/plugins/ifnet/tests/Makefile.in
@@ -195,6 +195,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -308,6 +309,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ifnet/tests/test_all.c b/src/settings/plugins/ifnet/tests/test_all.c
index 76ed0c7d6..55e7e283e 100644
--- a/src/settings/plugins/ifnet/tests/test_all.c
+++ b/src/settings/plugins/ifnet/tests/test_all.c
@@ -111,7 +111,7 @@ test_is_static (void)
"a dhcp interface is recognized as static");
ASSERT (is_static_ip4 ("eth0") == TRUE, "is static",
"a static interface is recognized as dhcp");
- ASSERT (!is_static_ip6 ("eth0") == TRUE, "is static",
+ ASSERT (is_static_ip6 ("eth0") == FALSE, "is static",
"a dhcp interface is recognized as static");
}
diff --git a/src/settings/plugins/ifupdown/Makefile.in b/src/settings/plugins/ifupdown/Makefile.in
index 6d0da08c0..7cd1ef4e7 100644
--- a/src/settings/plugins/ifupdown/Makefile.in
+++ b/src/settings/plugins/ifupdown/Makefile.in
@@ -266,6 +266,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -379,6 +380,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/ifupdown/plugin.c b/src/settings/plugins/ifupdown/plugin.c
index 1b5642afb..8652dd8dd 100644
--- a/src/settings/plugins/ifupdown/plugin.c
+++ b/src/settings/plugins/ifupdown/plugin.c
@@ -63,8 +63,6 @@
#define IFUPDOWN_PLUGIN_INFO "(C) 2008 Canonical Ltd. To report bugs please use the NetworkManager mailing list."
#define IFUPDOWN_SYSTEM_HOSTNAME_FILE "/etc/hostname"
-#define IFUPDOWN_KEY_FILE_GROUP "ifupdown"
-#define IFUPDOWN_KEY_FILE_KEY_MANAGED "managed"
#define IFUPDOWN_UNMANAGE_WELL_KNOWN_DEFAULT TRUE
/* #define ALWAYS_UNMANAGE TRUE */
@@ -327,8 +325,6 @@ SCPluginIfupdown_init (NMSystemConfigInterface *config)
GHashTable *auto_ifaces;
if_block *block = NULL;
NMInotifyHelper *inotify_helper;
- char *value;
- GError *error = NULL;
GList *keys, *iter;
GHashTableIter con_iter;
const char *block_name;
@@ -354,8 +350,6 @@ SCPluginIfupdown_init (NMSystemConfigInterface *config)
} else
g_signal_connect (priv->client, "uevent", G_CALLBACK (handle_uevent), self);
- priv->unmanage_well_known = IFUPDOWN_UNMANAGE_WELL_KNOWN_DEFAULT;
-
inotify_helper = nm_inotify_helper_get ();
priv->inotify_event_id = g_signal_connect (inotify_helper,
"event",
@@ -456,21 +450,10 @@ SCPluginIfupdown_init (NMSystemConfigInterface *config)
g_hash_table_destroy (auto_ifaces);
/* Check the config file to find out whether to manage interfaces */
- value = nm_config_get_value (nm_config_get (),
- IFUPDOWN_KEY_FILE_GROUP, IFUPDOWN_KEY_FILE_KEY_MANAGED,
- &error);
- if (error) {
- nm_log_info (LOGD_SETTINGS, "loading system config file (%s) caused error: %s",
- nm_config_get_path (nm_config_get ()),
- error->message);
- } else {
- gboolean manage_well_known;
- error = NULL;
-
- manage_well_known = !g_strcmp0 (value, "true") || !g_strcmp0 (value, "1");
- priv->unmanage_well_known = !manage_well_known;
- g_free (value);
- }
+ priv->unmanage_well_known = !nm_config_data_get_value_boolean (NM_CONFIG_GET_DATA_ORIG,
+ NM_CONFIG_KEYFILE_GROUP_IFUPDOWN,
+ NM_CONFIG_KEYFILE_KEY_IFUPDOWN_MANAGED,
+ !IFUPDOWN_UNMANAGE_WELL_KNOWN_DEFAULT);
nm_log_info (LOGD_SETTINGS, "management mode: %s", priv->unmanage_well_known ? "unmanaged" : "managed");
/* Add well-known interfaces */
@@ -630,7 +613,7 @@ sc_plugin_ifupdown_init (SCPluginIfupdown *plugin)
static void
GObject__get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
+ GValue *value, GParamSpec *pspec)
{
NMSystemConfigInterface *self = NM_SYSTEM_CONFIG_INTERFACE (object);
diff --git a/src/settings/plugins/ifupdown/tests/Makefile.in b/src/settings/plugins/ifupdown/tests/Makefile.in
index d8c5b39ec..a1c029c32 100644
--- a/src/settings/plugins/ifupdown/tests/Makefile.in
+++ b/src/settings/plugins/ifupdown/tests/Makefile.in
@@ -206,13 +206,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -326,6 +509,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -499,7 +683,7 @@ EXTRA_DIST = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -660,98 +844,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-ifupdown.log: test-ifupdown$(EXEEXT)
+ @p='test-ifupdown$(EXEEXT)'; \
+ b='test-ifupdown'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -808,6 +1062,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -903,7 +1160,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/settings/plugins/keyfile/Makefile.in b/src/settings/plugins/keyfile/Makefile.in
index 21c5577ce..c409d481c 100644
--- a/src/settings/plugins/keyfile/Makefile.in
+++ b/src/settings/plugins/keyfile/Makefile.in
@@ -235,6 +235,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -348,6 +349,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/keyfile/common.h b/src/settings/plugins/keyfile/common.h
index 7bde4bf3a..86fe00285 100644
--- a/src/settings/plugins/keyfile/common.h
+++ b/src/settings/plugins/keyfile/common.h
@@ -28,7 +28,5 @@
#define KEYFILE_DIR NMCONFDIR "/system-connections"
-#define VPN_SECRETS_GROUP "vpn-secrets"
-
#endif /* __COMMON_H__ */
diff --git a/src/settings/plugins/keyfile/plugin.c b/src/settings/plugins/keyfile/plugin.c
index fcdb3c3cf..7f21e71e6 100644
--- a/src/settings/plugins/keyfile/plugin.c
+++ b/src/settings/plugins/keyfile/plugin.c
@@ -585,45 +585,19 @@ get_unmanaged_specs (NMSystemConfigInterface *config)
GKeyFile *key_file;
GSList *specs = NULL;
GError *error = NULL;
- char *str;
if (!priv->conf_file)
return NULL;
- key_file = g_key_file_new ();
- if (!parse_key_file_allow_none (priv, key_file, &error))
- goto out;
-
- str = g_key_file_get_value (key_file, "keyfile", "unmanaged-devices", NULL);
- if (str) {
- char **udis;
- int i;
-
- udis = g_strsplit_set (str, ";,", -1);
- g_free (str);
-
- for (i = 0; udis[i] != NULL; i++) {
- /* Verify unmanaged specification and add it to the list */
- if (!strncmp (udis[i], "mac:", 4) && nm_utils_hwaddr_valid (udis[i] + 4, -1)) {
- specs = g_slist_append (specs, udis[i]);
- } else if (!strncmp (udis[i], "interface-name:", 15) && nm_utils_iface_valid_name (udis[i] + 15)) {
- specs = g_slist_append (specs, udis[i]);
- } else {
- nm_log_warn (LOGD_SETTINGS, "keyfile: error in file '%s': invalid unmanaged-devices entry: '%s'", priv->conf_file, udis[i]);
- g_free (udis[i]);
- }
- }
+ key_file = nm_config_create_keyfile ();
+ if (parse_key_file_allow_none (priv, key_file, &error))
+ specs = nm_config_get_device_match_spec (key_file, NM_CONFIG_KEYFILE_GROUP_KEYFILE, "unmanaged-devices", NULL);
- g_free (udis); /* Yes, g_free, not g_strfreev because we need the strings in the list */
- }
-
- out:
if (error) {
nm_log_warn (LOGD_SETTINGS, "keyfile: error getting unmanaged specs: %s", error->message);
g_error_free (error);
}
- if (key_file)
- g_key_file_free (key_file);
+ g_key_file_free (key_file);
return specs;
}
@@ -643,7 +617,7 @@ plugin_get_hostname (SCPluginKeyfile *plugin)
if (!parse_key_file_allow_none (priv, key_file, &error))
goto out;
- hostname = g_key_file_get_value (key_file, "keyfile", "hostname", NULL);
+ hostname = g_key_file_get_value (key_file, NM_CONFIG_KEYFILE_GROUP_KEYFILE, "hostname", NULL);
out:
if (error) {
@@ -679,7 +653,7 @@ plugin_set_hostname (SCPluginKeyfile *plugin, const char *hostname)
if (!parse_key_file_allow_none (priv, key_file, &error))
goto out;
- g_key_file_set_string (key_file, "keyfile", "hostname", hostname);
+ g_key_file_set_string (key_file, NM_CONFIG_KEYFILE_GROUP_KEYFILE, "hostname", hostname);
data = g_key_file_to_data (key_file, &len, &error);
if (!data)
@@ -843,7 +817,7 @@ nm_settings_keyfile_plugin_new (void)
singleton = SC_PLUGIN_KEYFILE (g_object_new (SC_TYPE_PLUGIN_KEYFILE, NULL));
priv = SC_PLUGIN_KEYFILE_GET_PRIVATE (singleton);
- priv->conf_file = nm_config_get_path (nm_config_get ());
+ priv->conf_file = nm_config_data_get_config_main_file (nm_config_get_data (nm_config_get ()));
/* plugin_set_hostname() has to be called *after* priv->conf_file is set */
priv->hostname = plugin_get_hostname (singleton);
diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c
index 1f0953e05..bd08c17d0 100644
--- a/src/settings/plugins/keyfile/reader.c
+++ b/src/settings/plugins/keyfile/reader.c
@@ -15,1253 +15,83 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2008 - 2009 Novell, Inc.
- * Copyright (C) 2008 - 2011 Red Hat, Inc.
+ * Copyright (C) 2015 Red Hat, Inc.
*/
#include "config.h"
-#include <errno.h>
-#include <stdlib.h>
#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <arpa/inet.h>
#include <string.h>
-#include "nm-core-internal.h"
-#include "nm-dbus-glib-types.h"
-#include "nm-glib-compat.h"
-#include "nm-system-config-interface.h"
-#include "nm-logging.h"
#include "reader.h"
-#include "common.h"
-#include "utils.h"
-#include "nm-core-internal.h"
-#include "NetworkManagerUtils.h"
-
-/* Some setting properties also contain setting names, such as
- * NMSettingConnection's 'type' property (which specifies the base type of the
- * connection, e.g. ethernet or wifi) or 'slave-type' (specifies type of slave
- * connection, e.g. bond or bridge). This function handles translating those
- * properties' values to the real setting name if they are an alias.
- */
-static void
-setting_alias_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- char *s;
- const char *key_setting_name;
-
- s = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL);
- if (s) {
- key_setting_name = nm_keyfile_plugin_get_setting_name_for_alias (s);
- g_object_set (G_OBJECT (setting),
- key, key_setting_name ? key_setting_name : s,
- NULL);
- g_free (s);
- }
-}
-
-static gboolean
-read_array_of_uint (GKeyFile *file,
- NMSetting *setting,
- const char *key)
-{
- GArray *array = NULL;
- gsize length;
- int i;
- gint *tmp;
-
- tmp = nm_keyfile_plugin_kf_get_integer_list (file, nm_setting_get_name (setting), key, &length, NULL);
- array = g_array_sized_new (FALSE, FALSE, sizeof (guint32), length);
- g_return_val_if_fail (array != NULL, FALSE);
-
- for (i = 0; i < length; i++)
- g_array_append_val (array, tmp[i]);
-
- g_object_set (setting, key, array, NULL);
- g_array_unref (array);
-
- return TRUE;
-}
-
-static gboolean
-get_one_int (const char *str, guint32 max_val, const char *key_name, guint32 *out)
-{
- long tmp;
- char *endptr;
-
- if (!str || !str[0]) {
- if (key_name)
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring missing number %s", __func__, key_name);
- return FALSE;
- }
-
- errno = 0;
- tmp = strtol (str, &endptr, 10);
- if (errno || (tmp < 0) || (tmp > max_val) || *endptr != 0) {
- if (key_name)
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid number %s '%s'", __func__, key_name, str);
- return FALSE;
- }
-
- *out = (guint32) tmp;
- return TRUE;
-}
-
-static gpointer
-build_address (int family, const char *address_str, guint32 plen)
-{
- NMIPAddress *addr;
- GError *error = NULL;
-
- g_return_val_if_fail (address_str, NULL);
-
- addr = nm_ip_address_new (family, address_str, plen, &error);
- if (!addr) {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid %s address: %s", __func__,
- family == AF_INET ? "IPv4" : "IPv6",
- error->message);
- g_error_free (error);
- }
-
- return addr;
-}
-
-static gpointer
-build_route (int family,
- const char *dest_str, guint32 plen,
- const char *gateway_str, const char *metric_str,
- const char *key_name)
-{
- NMIPRoute *route;
- guint32 metric = 0;
- GError *error = NULL;
-
- g_return_val_if_fail (plen, NULL);
- g_return_val_if_fail (dest_str, NULL);
-
- /* Next hop */
- if (gateway_str && gateway_str[0]) {
- if (!nm_utils_ipaddr_valid (family, gateway_str)) {
- /* Try workaround for routes written by broken keyfile writer.
- * Due to bug bgo#719851, an older version of writer would have
- * written "a:b:c:d::/plen,metric" if the gateway was ::, instead
- * of "a:b:c:d::/plen,,metric" or "a:b:c:d::/plen,::,metric"
- * Try workaround by interpreting gateway_str as metric to accept such
- * invalid routes. This broken syntax should not be not officially
- * supported.
- **/
- if ( family == AF_INET6
- && !metric_str
- && get_one_int (gateway_str, G_MAXUINT32, NULL, &metric))
- gateway_str = NULL;
- else {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid gateway '%s'", __func__, gateway_str);
- return NULL;
- }
- }
- } else
- gateway_str = NULL;
-
- /* parse metric, default to 0 */
- if (metric_str) {
- if (!get_one_int (metric_str, G_MAXUINT32, key_name, &metric))
- return NULL;
- }
-
- route = nm_ip_route_new (family, dest_str, plen, gateway_str,
- metric ? (gint64) metric : -1,
- &error);
- if (!route) {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid %s route: %s", __func__,
- family == AF_INET ? "IPv4" : "IPv6",
- error->message);
- g_error_free (error);
- }
-
- return route;
-}
-
-/* On success, returns pointer to the zero-terminated field (original @current).
- * The @current * pointer target is set to point to the rest of the input
- * or %NULL if there is no more input. Sets error to %NULL for convenience.
- *
- * On failure, returns %NULL (unspecified). The @current pointer target is
- * resets to its original value to allow skipping fields. The @error target
- * is set to the character that breaks the parsing or %NULL if @current was %NULL.
- *
- * When @current target is %NULL, gracefully fail returning %NULL while
- * leaving the @current target %NULL end setting @error to %NULL;
- */
-static char *
-read_field (char **current, char **error, const char *characters, const char *delimiters)
-{
- char *start;
-
- g_return_val_if_fail (current, NULL);
- g_return_val_if_fail (error, NULL);
- g_return_val_if_fail (characters, NULL);
- g_return_val_if_fail (delimiters, NULL);
-
- if (!*current) {
- /* graceful failure, leave '*current' NULL */
- *error = NULL;
- return NULL;
- }
-
- /* fail on empty input */
- if (!**current)
- return NULL;
-
- /* remember beginning of input */
- start = *current;
-
- while (**current && strchr (characters, **current))
- (*current)++;
- if (**current)
- if (strchr (delimiters, **current)) {
- /* success, more data available */
- *error = NULL;
- *(*current)++ = '\0';
- return start;
- } else {
- /* error, bad character */
- *error = *current;
- *current = start;
- return NULL;
- }
- else {
- /* success, end of input */
- *error = NULL;
- *current = NULL;
- return start;
- }
-}
-
-#define IP_ADDRESS_CHARS "0123456789abcdefABCDEF:.%"
-#define DIGITS "0123456789"
-#define DELIMITERS "/;,"
-
-
-/* The following IPv4 and IPv6 address formats are supported:
- *
- * address (DEPRECATED)
- * address/plen
- * address/gateway (DEPRECATED)
- * address/plen,gateway
- *
- * The following IPv4 and IPv6 route formats are supported:
- *
- * address/plen (NETWORK dev DEVICE)
- * address/plen,gateway (NETWORK via GATEWAY dev DEVICE)
- * address/plen,,metric (NETWORK dev DEVICE metric METRIC)
- * address/plen,gateway,metric (NETWORK via GATEWAY dev DEVICE metric METRIC)
- *
- * For backward, forward and sideward compatibility, slash (/),
- * semicolon (;) and comma (,) are interchangable. The choice of
- * separator in the above examples is therefore not significant.
- *
- * Leaving out the prefix length is discouraged and DEPRECATED. The
- * default value of IPv6 prefix length was 64 and has not been
- * changed. The default for IPv4 is now 24, which is the closest
- * IPv4 equivalent. These defaults may just as well be changed to
- * match the iproute2 defaults (32 for IPv4 and 128 for IPv6).
- */
-static gpointer
-read_one_ip_address_or_route (GKeyFile *file,
- const char *setting_name,
- const char *key_name,
- gboolean ipv6,
- gboolean route,
- char **out_gateway)
-{
- guint32 plen = G_MAXUINT32;
- gpointer result;
- char *address_str, *plen_str, *gateway_str, *metric_str, *value, *current, *error;
-
- current = value = nm_keyfile_plugin_kf_get_string (file, setting_name, key_name, NULL);
- if (!value)
- return NULL;
-
- /* get address field */
- address_str = read_field (&current, &error, IP_ADDRESS_CHARS, DELIMITERS);
- if (error) {
- nm_log_warn (LOGD_SETTINGS, "keyfile: Unexpected character '%c' in '%s.%s' address (position %td of '%s').",
- *error, setting_name, key_name, error - current, current);
- goto error;
- }
- /* get prefix length field (skippable) */
- plen_str = read_field (&current, &error, DIGITS, DELIMITERS);
- /* get gateway field */
- gateway_str = read_field (&current, &error, IP_ADDRESS_CHARS, DELIMITERS);
- if (error) {
- nm_log_warn (LOGD_SETTINGS, "keyfile: Unexpected character '%c' in '%s.%s' %s (position %td of '%s').",
- *error, setting_name, key_name,
- plen_str ? "gateway" : "gateway or prefix length",
- error - current, current);
- goto error;
- }
- /* for routes, get metric */
- if (route) {
- metric_str = read_field (&current, &error, DIGITS, DELIMITERS);
- if (error) {
- nm_log_warn (LOGD_SETTINGS, "keyfile: Unexpected character '%c' in '%s.%s' prefix length (position %td of '%s').",
- *error, setting_name, key_name, error - current, current);
- goto error;
- }
- } else
- metric_str = NULL;
- if (current) {
- /* there is still some data */
- if (*current) {
- /* another field follows */
- nm_log_warn (LOGD_SETTINGS, "keyfile: %s.%s: Garbage at the and of the line: %s",
- setting_name, key_name, current);
- goto error;
- } else {
- /* semicolon at the end of input */
- nm_log_info (LOGD_SETTINGS, "keyfile: %s.%s: Deprecated semicolon at the end of value.",
- setting_name, key_name);
- }
- }
-
-#define DEFAULT_PREFIX(for_route, for_ipv6) ( (for_route) ? ( (for_ipv6) ? 128 : 24 ) : ( (for_ipv6) ? 64 : 24 ) )
-
- /* parse plen, fallback to defaults */
- if (plen_str) {
- if (!get_one_int (plen_str, ipv6 ? 128 : 32, key_name, &plen)
- || (route && plen == 0)) {
- plen = DEFAULT_PREFIX (route, ipv6);
- nm_log_warn (LOGD_SETTINGS, "keyfile: invalid prefix length '%s' in '%s.%s', defaulting to %d",
- plen_str, setting_name, key_name, plen);
- }
- } else {
- plen = DEFAULT_PREFIX (route, ipv6);
- nm_log_warn (LOGD_SETTINGS, "keyfile: Missing prefix length in '%s.%s', defaulting to %d",
- setting_name, key_name, plen);
- }
-
- /* build the appropriate data structure for NetworkManager settings */
- if (route) {
- result = build_route (ipv6 ? AF_INET6 : AF_INET,
- address_str, plen, gateway_str, metric_str,
- key_name);
- } else {
- result = build_address (ipv6 ? AF_INET6 : AF_INET,
- address_str, plen);
- if (out_gateway && gateway_str)
- *out_gateway = g_strdup (gateway_str);
- }
- g_free (value);
- return result;
-error:
- g_free (value);
- return NULL;
-}
+#include "nm-logging.h"
+#include "nm-keyfile-internal.h"
+#include "NetworkManagerUtils.h"
-static void
-ip_address_or_route_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
+static const char *
+_fmt_warn (const char *group, NMSetting *setting, const char *property_name, const char *message, char **out_message)
{
- const char *setting_name = nm_setting_get_name (setting);
- gboolean ipv6 = !strcmp (setting_name, "ipv6");
- gboolean routes = !strcmp (key, "routes");
- static const char *key_names_routes[] = { "route", "routes", NULL };
- static const char *key_names_addresses[] = { "address", "addresses", NULL };
- const char **key_names = routes ? key_names_routes : key_names_addresses;
- char *gateway = NULL;
- GPtrArray *list;
- GDestroyNotify free_func;
- int i;
-
- if (routes)
- free_func = (GDestroyNotify) nm_ip_route_unref;
- else
- free_func = (GDestroyNotify) nm_ip_address_unref;
- list = g_ptr_array_new_with_free_func (free_func);
+ const char *setting_name = setting ? nm_setting_get_name (setting) : NULL;
- for (i = -1; i < 1000; i++) {
- const char **key_basename;
-
- for (key_basename = key_names; *key_basename; key_basename++) {
- char *key_name;
- gpointer item;
+ if (group) {
+ char *res;
- /* -1 means no suffix */
- if (i >= 0)
- key_name = g_strdup_printf ("%s%d", *key_basename, i);
+ if (setting_name) {
+ if (property_name && !strcmp (group, setting_name))
+ res = g_strdup_printf ("%s.%s: %s", group, property_name, message);
+ else if (property_name)
+ res = g_strdup_printf ("%s/%s.%s: %s", group, setting_name, property_name, message);
+ else if (!strcmp (group, setting_name))
+ res = g_strdup_printf ("%s: %s", group, message);
else
- key_name = g_strdup (*key_basename);
-
- item = read_one_ip_address_or_route (keyfile, setting_name, key_name, ipv6, routes,
- gateway ? NULL : &gateway);
- if (item)
- g_ptr_array_add (list, item);
-
- g_free (key_name);
- }
- }
-
- if (list->len >= 1)
- g_object_set (setting, key, list, NULL);
-
- if (gateway) {
- g_object_set (setting, "gateway", gateway, NULL);
- g_free (gateway);
- }
-
- g_ptr_array_unref (list);
-}
-
-static void
-ip4_dns_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- GPtrArray *array;
- gsize length;
- char **list, **iter;
- int ret;
-
- list = nm_keyfile_plugin_kf_get_string_list (keyfile, setting_name, key, &length, NULL);
- if (!list || !g_strv_length (list))
- return;
-
- array = g_ptr_array_sized_new (length + 1);
- for (iter = list; *iter; iter++) {
- guint32 addr;
-
- ret = inet_pton (AF_INET, *iter, &addr);
- if (ret <= 0) {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid DNS server address '%s'", __func__, *iter);
- continue;
- }
-
- g_ptr_array_add (array, *iter);
- }
- g_ptr_array_add (array, NULL);
-
- g_object_set (setting, key, array->pdata, NULL);
- g_ptr_array_unref (array);
- g_strfreev (list);
-}
-
-static void
-ip6_dns_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- GPtrArray *array = NULL;
- gsize length;
- char **list, **iter;
- int ret;
-
- list = nm_keyfile_plugin_kf_get_string_list (keyfile, setting_name, key, &length, NULL);
- if (!list || !g_strv_length (list))
- return;
-
- array = g_ptr_array_sized_new (length + 1);
-
- for (iter = list; *iter; iter++) {
- struct in6_addr addr;
-
- ret = inet_pton (AF_INET6, *iter, &addr);
- if (ret <= 0) {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid DNS server IPv6 address '%s'", __func__, *iter);
- continue;
- }
-
- g_ptr_array_add (array, *iter);
- }
- g_ptr_array_add (array, NULL);
-
- g_object_set (setting, key, array->pdata, NULL);
- g_ptr_array_unref (array);
- g_strfreev (list);
-}
-
-static void
-mac_address_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path, gsize enforce_length)
-{
- const char *setting_name = nm_setting_get_name (setting);
- char *tmp_string = NULL, *p, *mac_str;
- gint *tmp_list;
- GByteArray *array = NULL;
- gsize length;
-
- p = tmp_string = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL);
- if (tmp_string && tmp_string[0]) {
- /* Look for enough ':' characters to signify a MAC address */
- guint i = 0;
-
- while (*p) {
- if (*p == ':')
- i++;
- p++;
- }
-
- if (enforce_length == 0 || enforce_length == i+1) {
- /* If we found enough it's probably a string-format MAC address */
- array = g_byte_array_sized_new (i+1);
- g_byte_array_set_size (array, i+1);
- if (!nm_utils_hwaddr_aton (tmp_string, array->data, array->len)) {
- g_byte_array_unref (array);
- array = NULL;
- }
- }
- }
- g_free (tmp_string);
-
- if (array == NULL) {
- /* Old format; list of ints */
- tmp_list = nm_keyfile_plugin_kf_get_integer_list (keyfile, setting_name, key, &length, NULL);
- if (length > 0 && (enforce_length == 0 || enforce_length == length)) {
- gsize i;
-
- array = g_byte_array_sized_new (length);
- for (i = 0; i < length; i++) {
- int val = tmp_list[i];
- const guint8 v = (guint8) (val & 0xFF);
-
- if (val < 0 || val > 255) {
- nm_log_warn (LOGD_SETTINGS, "%s: %s / %s ignoring invalid byte element '%d' (not "
- " between 0 and 255 inclusive)", __func__, setting_name,
- key, val);
- g_byte_array_free (array, TRUE);
- array = NULL;
- break;
- }
- g_byte_array_append (array, &v, 1);
- }
- }
- g_free (tmp_list);
- }
-
- if (!array) {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid MAC address for %s / %s",
- __func__, setting_name, key);
- return;
- }
-
- mac_str = nm_utils_hwaddr_ntoa (array->data, array->len);
- g_object_set (setting, key, mac_str, NULL);
- g_free (mac_str);
- g_byte_array_free (array, TRUE);
-}
-
-static void
-mac_address_parser_ETHER (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- mac_address_parser (setting, key, keyfile, keyfile_path, ETH_ALEN);
-}
-
-static void
-mac_address_parser_INFINIBAND (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- mac_address_parser (setting, key, keyfile, keyfile_path, INFINIBAND_ALEN);
-}
-
-static void
-read_hash_of_string (GKeyFile *file, NMSetting *setting, const char *key)
-{
- char **keys, **iter;
- char *value;
- const char *setting_name = nm_setting_get_name (setting);
-
- keys = nm_keyfile_plugin_kf_get_keys (file, setting_name, NULL, NULL);
- if (!keys || !*keys)
- return;
-
- for (iter = keys; *iter; iter++) {
- value = nm_keyfile_plugin_kf_get_string (file, setting_name, *iter, NULL);
- if (!value)
- continue;
-
- if (NM_IS_SETTING_VPN (setting)) {
- /* Add any item that's not a class property to the data hash */
- if (!g_object_class_find_property (G_OBJECT_GET_CLASS (setting), *iter))
- nm_setting_vpn_add_data_item (NM_SETTING_VPN (setting), *iter, value);
- }
- if (NM_IS_SETTING_BOND (setting)) {
- if (strcmp (*iter, "interface-name"))
- nm_setting_bond_add_option (NM_SETTING_BOND (setting), *iter, value);
- }
- g_free (value);
- }
- g_strfreev (keys);
-}
-
-static void
-unescape_semicolons (char *str)
-{
- int i;
- gsize len = strlen (str);
-
- for (i = 0; i < len; i++) {
- if (str[i] == '\\' && str[i+1] == ';') {
- memmove(str + i, str + i + 1, len - (i + 1));
- len--;
- }
- str[len] = '\0';
- }
-}
-
-static GBytes *
-get_bytes (GKeyFile *keyfile,
- const char *setting_name,
- const char *key,
- gboolean zero_terminate,
- gboolean unescape_semicolon)
-{
- GByteArray *array = NULL;
- char *tmp_string;
- gint *tmp_list;
- gsize length;
- int i;
-
- /* New format: just a string
- * Old format: integer list; e.g. 11;25;38;
- */
- tmp_string = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL);
- if (tmp_string) {
- GRegex *regex;
- GMatchInfo *match_info;
- const char *pattern = "^[[:space:]]*[[:digit:]]{1,3}[[:space:]]*;([[:space:]]*[[:digit:]]{1,3}[[:space:]]*;)*([[:space:]]*)?$";
-
- regex = g_regex_new (pattern, 0, 0, NULL);
- g_regex_match (regex, tmp_string, 0, &match_info);
- if (!g_match_info_matches (match_info)) {
- /* Handle as a simple string (ie, new format) */
- if (unescape_semicolon)
- unescape_semicolons (tmp_string);
- length = strlen (tmp_string);
- if (zero_terminate)
- length++;
- array = g_byte_array_sized_new (length);
- g_byte_array_append (array, (guint8 *) tmp_string, length);
- }
- g_match_info_free (match_info);
- g_regex_unref (regex);
- g_free (tmp_string);
- }
-
- if (!array) {
- /* Old format; list of ints */
- tmp_list = nm_keyfile_plugin_kf_get_integer_list (keyfile, setting_name, key, &length, NULL);
- array = g_byte_array_sized_new (length);
- for (i = 0; i < length; i++) {
- int val = tmp_list[i];
- unsigned char v = (unsigned char) (val & 0xFF);
-
- if (val < 0 || val > 255) {
- nm_log_warn (LOGD_SETTINGS, "%s: %s / %s ignoring invalid byte element '%d' (not "
- " between 0 and 255 inclusive)", __func__, setting_name,
- key, val);
- } else
- g_byte_array_append (array, (const unsigned char *) &v, sizeof (v));
- }
- g_free (tmp_list);
- }
-
- if (array->len == 0) {
- g_byte_array_free (array, TRUE);
- return NULL;
+ res = g_strdup_printf ("%s/%s: %s", group, setting_name, message);
+ } else
+ res = g_strdup_printf ("%s: %s", group, message);
+ *out_message = res;
+ return res;
} else
- return g_byte_array_free_to_bytes (array);
-}
-
-static void
-ssid_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- GBytes *bytes;
-
- bytes = get_bytes (keyfile, setting_name, key, FALSE, TRUE);
- if (bytes) {
- g_object_set (setting, key, bytes, NULL);
- g_bytes_unref (bytes);
- } else {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid SSID for %s / %s",
- __func__, setting_name, key);
- }
-}
-
-static void
-password_raw_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- GBytes *bytes;
-
- bytes = get_bytes (keyfile, setting_name, key, FALSE, TRUE);
- if (bytes) {
- g_object_set (setting, key, bytes, NULL);
- g_bytes_unref (bytes);
- } else {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid raw password for %s / %s",
- __func__, setting_name, key);
- }
-}
-
-static char *
-get_cert_path (const char *keyfile_path, const guint8 *cert_path, gsize cert_path_len)
-{
- const char *base;
- char *p = NULL, *path, *dirname, *tmp;
-
- g_return_val_if_fail (keyfile_path != NULL, NULL);
- g_return_val_if_fail (cert_path != NULL, NULL);
-
- base = path = g_malloc0 (cert_path_len + 1);
- memcpy (path, cert_path, cert_path_len);
-
- if (path[0] == '/')
- return path;
-
- p = strrchr (path, '/');
- if (p)
- base = p + 1;
-
- dirname = g_path_get_dirname (keyfile_path);
- tmp = g_build_path ("/", dirname, base, NULL);
- g_free (dirname);
- g_free (path);
- return tmp;
-}
-
-#define SCHEME_PATH "file://"
-
-static const char *certext[] = { ".pem", ".cert", ".crt", ".cer", ".p12", ".der", ".key" };
-
-static gboolean
-has_cert_ext (const char *path)
-{
- int i;
-
- for (i = 0; i < G_N_ELEMENTS (certext); i++) {
- if (g_str_has_suffix (path, certext[i]))
- return TRUE;
- }
- return FALSE;
+ return message;
}
static gboolean
-handle_as_scheme (GBytes *bytes, NMSetting *setting, const char *key)
-{
- const guint8 *data;
- gsize data_len;
-
- data = g_bytes_get_data (bytes, &data_len);
+_handler_read (GKeyFile *keyfile,
+ NMConnection *connection,
+ NMKeyfileReadType type,
+ void *type_data,
+ void *user_data,
+ GError **error)
+{
+ if (type == NM_KEYFILE_READ_TYPE_WARN) {
+ NMKeyfileReadTypeDataWarn *warn_data = type_data;
+ NMLogLevel level;
+ char *message_free = NULL;
+
+ if (warn_data->severity > NM_KEYFILE_WARN_SEVERITY_WARN)
+ level = LOGL_ERR;
+ else if (warn_data->severity >= NM_KEYFILE_WARN_SEVERITY_WARN)
+ level = LOGL_WARN;
+ else if (warn_data->severity == NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE)
+ level = LOGL_WARN;
+ else
+ level = LOGL_INFO;
- /* It's the PATH scheme, can just set plain data */
- if ( (data_len > strlen (SCHEME_PATH))
- && g_str_has_prefix ((const char *) data, SCHEME_PATH)
- && (data[data_len - 1] == '\0')) {
- g_object_set (setting, key, bytes, NULL);
+ nm_log (level, LOGD_SETTINGS, "keyfile: %s",
+ _fmt_warn (warn_data->group, warn_data->setting,
+ warn_data->property_name, warn_data->message,
+ &message_free));
+ g_free (message_free);
return TRUE;
}
return FALSE;
}
-static gboolean
-handle_as_path (GBytes *bytes,
- NMSetting *setting,
- const char *key,
- const char *keyfile_path)
-{
- const guint8 *data;
- gsize data_len;
- gsize validate_len;
- char *path;
- gboolean exists, success = FALSE;
-
- data = g_bytes_get_data (bytes, &data_len);
- if (data_len > 500 || data_len < 1)
- return FALSE;
-
- /* If there's a trailing NULL tell g_utf8_validate() to to until the NULL */
- if (data[data_len - 1] == '\0')
- validate_len = -1;
- else
- validate_len = data_len;
-
- if (g_utf8_validate ((const char *) data, validate_len, NULL) == FALSE)
- return FALSE;
-
- /* Might be a bare path without the file:// prefix; in that case
- * if it's an absolute path, use that, otherwise treat it as a
- * relative path to the current directory.
- */
-
- path = get_cert_path (keyfile_path, data, data_len);
- exists = g_file_test (path, G_FILE_TEST_EXISTS);
- if ( exists
- || memchr (data, '/', data_len)
- || has_cert_ext (path)) {
- GByteArray *tmp;
- GBytes *val;
-
- /* Construct the proper value as required for the PATH scheme */
- tmp = g_byte_array_sized_new (strlen (SCHEME_PATH) + strlen (path) + 1);
- g_byte_array_append (tmp, (const guint8 *) SCHEME_PATH, strlen (SCHEME_PATH));
- g_byte_array_append (tmp, (const guint8 *) path, strlen (path));
- g_byte_array_append (tmp, (const guint8 *) "\0", 1);
- val = g_byte_array_free_to_bytes (tmp);
- g_object_set (setting, key, val, NULL);
- g_bytes_unref (val);
- success = TRUE;
-
- /* Warn if the certificate didn't exist */
- if (exists == FALSE)
- nm_log_warn (LOGD_SETTINGS, "certificate or key %s does not exist", path);
- }
- g_free (path);
-
- return success;
-}
-
-static void
-cert_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- GBytes *bytes;
- gboolean success = FALSE;
-
- bytes = get_bytes (keyfile, setting_name, key, TRUE, FALSE);
- if (bytes) {
- /* Try as a path + scheme (ie, starts with "file://") */
- success = handle_as_scheme (bytes, setting, key);
-
- /* If not, it might be a plain path */
- if (success == FALSE)
- success = handle_as_path (bytes, setting, key, keyfile_path);
-
- /* If neither of those two, assume blob with certificate data */
- if (success == FALSE)
- g_object_set (setting, key, bytes, NULL);
- } else {
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid key/cert value for %s / %s",
- __func__, setting_name, key);
- }
-
- if (bytes)
- g_bytes_unref (bytes);
-}
-
-static void
-parity_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path)
-{
- const char *setting_name = nm_setting_get_name (setting);
- NMSettingSerialParity parity;
- int int_val;
- char *str_val;
-
- /* Keyfile traditionally stored this as the ASCII value for 'E', 'o', or 'n'.
- * We now accept either that or the (case-insensitive) character itself (but
- * still always write it the old way, for backward compatibility).
- */
- int_val = nm_keyfile_plugin_kf_get_integer (keyfile, setting_name, key, NULL);
- if (!int_val) {
- str_val = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL);
- if (str_val) {
- if (str_val[0] && !str_val[1])
- int_val = str_val[0];
- else {
- /* This will hit the warning below */
- int_val = 'X';
- }
- }
- g_free (str_val);
- }
-
- if (!int_val)
- return;
-
- switch (int_val) {
- case 'E':
- case 'e':
- parity = NM_SETTING_SERIAL_PARITY_EVEN;
- break;
- case 'O':
- case 'o':
- parity = NM_SETTING_SERIAL_PARITY_ODD;
- break;
- case 'N':
- case 'n':
- parity = NM_SETTING_SERIAL_PARITY_NONE;
- break;
- default:
- nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid value for %s / %s",
- __func__, setting_name, key);
- return;
- }
-
- g_object_set (setting, key, parity, NULL);
-}
-
-typedef struct {
- const char *setting_name;
- const char *key;
- gboolean check_for_key;
- void (*parser) (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path);
-} KeyParser;
-
-/* A table of keys that require further parsing/conversion because they are
- * stored in a format that can't be automatically read using the key's type.
- * i.e. IPv4 addresses, which are stored in NetworkManager as guint32, but are
- * stored in keyfiles as strings, eg "10.1.1.2" or IPv6 addresses stored
- * in struct in6_addr internally, but as string in keyfiles.
- */
-static KeyParser key_parsers[] = {
- { NM_SETTING_CONNECTION_SETTING_NAME,
- NM_SETTING_CONNECTION_TYPE,
- TRUE,
- setting_alias_parser },
- { NM_SETTING_BRIDGE_SETTING_NAME,
- NM_SETTING_BRIDGE_MAC_ADDRESS,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ADDRESSES,
- FALSE,
- ip_address_or_route_parser },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ADDRESSES,
- FALSE,
- ip_address_or_route_parser },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ROUTES,
- FALSE,
- ip_address_or_route_parser },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ROUTES,
- FALSE,
- ip_address_or_route_parser },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_DNS,
- FALSE,
- ip4_dns_parser },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_DNS,
- FALSE,
- ip6_dns_parser },
- { NM_SETTING_WIRED_SETTING_NAME,
- NM_SETTING_WIRED_MAC_ADDRESS,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_WIRED_SETTING_NAME,
- NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_WIRELESS_SETTING_NAME,
- NM_SETTING_WIRELESS_MAC_ADDRESS,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_WIRELESS_SETTING_NAME,
- NM_SETTING_WIRELESS_CLONED_MAC_ADDRESS,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_WIRELESS_SETTING_NAME,
- NM_SETTING_WIRELESS_BSSID,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_BLUETOOTH_SETTING_NAME,
- NM_SETTING_BLUETOOTH_BDADDR,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_INFINIBAND_SETTING_NAME,
- NM_SETTING_INFINIBAND_MAC_ADDRESS,
- TRUE,
- mac_address_parser_INFINIBAND },
- { NM_SETTING_WIMAX_SETTING_NAME,
- NM_SETTING_WIMAX_MAC_ADDRESS,
- TRUE,
- mac_address_parser_ETHER },
- { NM_SETTING_WIRELESS_SETTING_NAME,
- NM_SETTING_WIRELESS_SSID,
- TRUE,
- ssid_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PASSWORD_RAW,
- TRUE,
- password_raw_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_CA_CERT,
- TRUE,
- cert_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_CLIENT_CERT,
- TRUE,
- cert_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PRIVATE_KEY,
- TRUE,
- cert_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PHASE2_CA_CERT,
- TRUE,
- cert_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
- TRUE,
- cert_parser },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
- TRUE,
- cert_parser },
- { NM_SETTING_SERIAL_SETTING_NAME,
- NM_SETTING_SERIAL_PARITY,
- TRUE,
- parity_parser },
- { NULL, NULL, FALSE }
-};
-
-typedef struct {
- GKeyFile *keyfile;
- const char *keyfile_path;
-} ReadInfo;
-
-static void
-read_one_setting_value (NMSetting *setting,
- const char *key,
- const GValue *value,
- GParamFlags flags,
- gpointer user_data)
-{
- ReadInfo *info = user_data;
- const char *setting_name;
- int errsv;
- GType type;
- GError *err = NULL;
- gboolean check_for_key = TRUE;
- KeyParser *parser = &key_parsers[0];
-
- /* Property is not writable */
- if (!(flags & G_PARAM_WRITABLE))
- return;
-
- /* Setting name gets picked up from the keyfile's section name instead */
- if (!strcmp (key, NM_SETTING_NAME))
- return;
-
- /* Don't read the NMSettingConnection object's 'read-only' property */
- if ( NM_IS_SETTING_CONNECTION (setting)
- && !strcmp (key, NM_SETTING_CONNECTION_READ_ONLY))
- return;
-
- setting_name = nm_setting_get_name (setting);
-
- /* Look through the list of handlers for non-standard format key values */
- while (parser->setting_name) {
- if (!strcmp (parser->setting_name, setting_name) && !strcmp (parser->key, key)) {
- check_for_key = parser->check_for_key;
- break;
- }
- parser++;
- }
-
- /* VPN properties don't have the exact key name */
- if (NM_IS_SETTING_VPN (setting))
- check_for_key = FALSE;
-
- /* Bonding 'options' don't have the exact key name. The options are right under [bond] group. */
- if (NM_IS_SETTING_BOND (setting))
- check_for_key = FALSE;
-
- /* Check for the exact key in the GKeyFile if required. Most setting
- * properties map 1:1 to a key in the GKeyFile, but for those properties
- * like IP addresses and routes where more than one value is actually
- * encoded by the setting property, this won't be true.
- */
- if (check_for_key && !nm_keyfile_plugin_kf_has_key (info->keyfile, setting_name, key, &err)) {
- /* Key doesn't exist or an error ocurred, thus nothing to do. */
- if (err) {
- nm_log_warn (LOGD_SETTINGS, "Error loading setting '%s' value: %s", setting_name, err->message);
- g_error_free (err);
- }
- return;
- }
-
- /* If there's a custom parser for this key, handle that before the generic
- * parsers below.
- */
- if (parser->setting_name) {
- (*parser->parser) (setting, key, info->keyfile, info->keyfile_path);
- return;
- }
-
- type = G_VALUE_TYPE (value);
-
- if (type == G_TYPE_STRING) {
- char *str_val;
-
- str_val = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
- g_object_set (setting, key, str_val, NULL);
- g_free (str_val);
- } else if (type == G_TYPE_UINT) {
- int int_val;
-
- int_val = nm_keyfile_plugin_kf_get_integer (info->keyfile, setting_name, key, NULL);
- if (int_val < 0)
- nm_log_warn (LOGD_SETTINGS, "Casting negative value (%i) to uint", int_val);
- g_object_set (setting, key, int_val, NULL);
- } else if (type == G_TYPE_INT) {
- int int_val;
-
- int_val = nm_keyfile_plugin_kf_get_integer (info->keyfile, setting_name, key, NULL);
- g_object_set (setting, key, int_val, NULL);
- } else if (type == G_TYPE_BOOLEAN) {
- gboolean bool_val;
-
- bool_val = nm_keyfile_plugin_kf_get_boolean (info->keyfile, setting_name, key, NULL);
- g_object_set (setting, key, bool_val, NULL);
- } else if (type == G_TYPE_CHAR) {
- int int_val;
-
- int_val = nm_keyfile_plugin_kf_get_integer (info->keyfile, setting_name, key, NULL);
- if (int_val < G_MININT8 || int_val > G_MAXINT8)
- nm_log_warn (LOGD_SETTINGS, "Casting value (%i) to char", int_val);
-
- g_object_set (setting, key, int_val, NULL);
- } else if (type == G_TYPE_UINT64) {
- char *tmp_str;
- guint64 uint_val;
-
- tmp_str = nm_keyfile_plugin_kf_get_value (info->keyfile, setting_name, key, NULL);
- uint_val = g_ascii_strtoull (tmp_str, NULL, 10);
- g_free (tmp_str);
- g_object_set (setting, key, uint_val, NULL);
- } else if (type == G_TYPE_INT64) {
- char *tmp_str;
- gint64 int_val;
-
- tmp_str = nm_keyfile_plugin_kf_get_value (info->keyfile, setting_name, key, NULL);
- int_val = nm_utils_ascii_str_to_int64 (tmp_str, 10, G_MININT64, G_MAXINT64, 0);
- errsv = errno;
- if (errsv)
- nm_log_warn (LOGD_SETTINGS, "Invalid int64 value (%s)", tmp_str);
- else
- g_object_set (setting, key, int_val, NULL);
- g_free (tmp_str);
- } else if (type == G_TYPE_BYTES) {
- gint *tmp;
- GByteArray *array;
- GBytes *bytes;
- gsize length;
- int i;
-
- tmp = nm_keyfile_plugin_kf_get_integer_list (info->keyfile, setting_name, key, &length, NULL);
-
- array = g_byte_array_sized_new (length);
- for (i = 0; i < length; i++) {
- int val = tmp[i];
- unsigned char v = (unsigned char) (val & 0xFF);
-
- if (val < 0 || val > 255) {
- nm_log_warn (LOGD_SETTINGS, "%s: %s / %s ignoring invalid byte element '%d' (not "
- " between 0 and 255 inclusive)", __func__, setting_name,
- key, val);
- } else
- g_byte_array_append (array, (const unsigned char *) &v, sizeof (v));
- }
-
- bytes = g_byte_array_free_to_bytes (array);
- g_object_set (setting, key, bytes, NULL);
- g_bytes_unref (bytes);
- g_free (tmp);
- } else if (type == G_TYPE_STRV) {
- gchar **sa;
- gsize length;
-
- sa = nm_keyfile_plugin_kf_get_string_list (info->keyfile, setting_name, key, &length, NULL);
- g_object_set (setting, key, sa, NULL);
- g_strfreev (sa);
- } else if (type == G_TYPE_HASH_TABLE) {
- read_hash_of_string (info->keyfile, setting, key);
- } else if (type == G_TYPE_ARRAY) {
- if (!read_array_of_uint (info->keyfile, setting, key)) {
- nm_log_warn (LOGD_SETTINGS, "Unhandled setting property type (read): '%s/%s' : '%s'",
- setting_name, key, G_VALUE_TYPE_NAME (value));
- }
- } else if (G_VALUE_HOLDS_FLAGS (value)) {
- guint64 uint_val;
-
- /* Flags are guint but GKeyFile has no uint reader, just uint64 */
- uint_val = nm_keyfile_plugin_kf_get_uint64 (info->keyfile, setting_name, key, &err);
- if (!err) {
- if (uint_val <= G_MAXUINT)
- g_object_set (setting, key, (guint) uint_val, NULL);
- else {
- nm_log_warn (LOGD_SETTINGS, "Too large FLAGS property (read): '%s/%s' : '%s'",
- setting_name, key, G_VALUE_TYPE_NAME (value));
- }
- }
- g_clear_error (&err);
- } else if (G_VALUE_HOLDS_ENUM (value)) {
- gint int_val;
-
- int_val = nm_keyfile_plugin_kf_get_integer (info->keyfile, setting_name, key, &err);
- if (!err)
- g_object_set (setting, key, (gint) int_val, NULL);
- g_clear_error (&err);
- } else {
- nm_log_warn (LOGD_SETTINGS, "Unhandled setting property type (read): '%s/%s' : '%s'",
- setting_name, key, G_VALUE_TYPE_NAME (value));
- }
-}
-
-static NMSetting *
-read_setting (GKeyFile *file, const char *keyfile_path, const char *group)
-{
- NMSetting *setting = NULL;
- ReadInfo info = { file, keyfile_path };
- const char *alias;
- GType type;
-
- alias = nm_keyfile_plugin_get_setting_name_for_alias (group);
- if (alias)
- group = alias;
-
- type = nm_setting_lookup_type (group);
- if (type) {
- setting = g_object_new (type, NULL);
- nm_setting_enumerate_values (setting, read_one_setting_value, &info);
- } else
- nm_log_warn (LOGD_SETTINGS, "Invalid setting name '%s'", group);
-
- return setting;
-}
-
-static void
-read_vpn_secrets (GKeyFile *file, NMSettingVpn *s_vpn)
-{
- char **keys, **iter;
-
- keys = nm_keyfile_plugin_kf_get_keys (file, VPN_SECRETS_GROUP, NULL, NULL);
- for (iter = keys; *iter; iter++) {
- char *secret;
-
- secret = nm_keyfile_plugin_kf_get_string (file, VPN_SECRETS_GROUP, *iter, NULL);
- if (secret) {
- nm_setting_vpn_add_secret (s_vpn, *iter, secret);
- g_free (secret);
- }
- }
- g_strfreev (keys);
-}
-
NMConnection *
nm_keyfile_plugin_connection_from_file (const char *filename, GError **error)
{
GKeyFile *key_file;
struct stat statbuf;
- gboolean bad_permissions;
NMConnection *connection = NULL;
- NMSettingConnection *s_con;
- NMSetting *setting;
- gchar **groups;
- gsize length;
- int i;
- gboolean vpn_secrets = FALSE;
GError *verify_error = NULL;
if (stat (filename, &statbuf) != 0 || !S_ISREG (statbuf.st_mode)) {
@@ -1270,90 +100,34 @@ nm_keyfile_plugin_connection_from_file (const char *filename, GError **error)
return NULL;
}
- bad_permissions = statbuf.st_mode & 0077;
-
- if (bad_permissions) {
+ if (statbuf.st_mode & 0077) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"File permissions (%o) were insecure",
statbuf.st_mode);
return NULL;
}
- key_file = g_key_file_new ();
- if (!g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, error))
- goto out;
-
- connection = nm_simple_connection_new ();
-
- groups = g_key_file_get_groups (key_file, &length);
- for (i = 0; i < length; i++) {
- /* Only read out secrets when needed */
- if (!strcmp (groups[i], VPN_SECRETS_GROUP)) {
- vpn_secrets = TRUE;
- continue;
- }
-
- setting = read_setting (key_file, filename, groups[i]);
- if (setting)
- nm_connection_add_setting (connection, setting);
- }
-
- s_con = nm_connection_get_setting_connection (connection);
- if (!s_con) {
- s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
- nm_connection_add_setting (connection, NM_SETTING (s_con));
- }
-
- /* Make sure that we have 'id' even if not explictly specified in the keyfile */
- if (!nm_setting_connection_get_id (s_con)) {
- char *base_name;
-
- base_name = g_path_get_basename (filename);
- g_object_set (s_con, NM_SETTING_CONNECTION_ID, base_name, NULL);
- g_free (base_name);
- }
-
- /* Make sure that we have 'uuid' even if not explictly specified in the keyfile */
- if (!nm_setting_connection_get_uuid (s_con)) {
- char *hashed_uuid;
-
- hashed_uuid = nm_utils_uuid_generate_from_strings ("keyfile", filename, NULL);
- g_object_set (s_con, NM_SETTING_CONNECTION_UUID, hashed_uuid, NULL);
- g_free (hashed_uuid);
- }
-
- /* Make sure that we have 'interface-name' even if it was specified in the
- * "wrong" (ie, deprecated) group.
- */
- if ( !nm_setting_connection_get_interface_name (s_con)
- && nm_setting_connection_get_connection_type (s_con)) {
- char *interface_name;
-
- interface_name = g_key_file_get_string (key_file,
- nm_setting_connection_get_connection_type (s_con),
- "interface-name",
- NULL);
- if (interface_name) {
- g_object_set (s_con, NM_SETTING_CONNECTION_INTERFACE_NAME, interface_name, NULL);
- g_free (interface_name);
+ if (!NM_FLAGS_HAS (nm_utils_get_testing (), NM_UTILS_TEST_NO_KEYFILE_OWNER_CHECK)) {
+ if (statbuf.st_uid != 0) {
+ g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
+ "File owner (%o) is insecure",
+ statbuf.st_mode);
+ return NULL;
}
}
- /* Handle vpn secrets after the 'vpn' setting was read */
- if (vpn_secrets) {
- NMSettingVpn *s_vpn;
-
- s_vpn = nm_connection_get_setting_vpn (connection);
- if (s_vpn)
- read_vpn_secrets (key_file, s_vpn);
- }
+ key_file = g_key_file_new ();
+ if (!g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, error))
+ goto out;
- g_strfreev (groups);
+ connection = nm_keyfile_read (key_file, filename, NULL, _handler_read, NULL, error);
+ if (!connection)
+ goto out;
/* Normalize and verify the connection */
if (!nm_connection_normalize (connection, NULL, NULL, &verify_error)) {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
- "invalid connection: %s",
+ "invalid connection: %s",
verify_error->message);
g_clear_error (&verify_error);
g_object_unref (connection);
@@ -1364,3 +138,4 @@ out:
g_key_file_free (key_file);
return connection;
}
+
diff --git a/src/settings/plugins/keyfile/tests/Makefile.in b/src/settings/plugins/keyfile/tests/Makefile.in
index c4d12459d..a65110f6e 100644
--- a/src/settings/plugins/keyfile/tests/Makefile.in
+++ b/src/settings/plugins/keyfile/tests/Makefile.in
@@ -183,7 +183,7 @@ am__recursive_targets = \
$(RECURSIVE_CLEAN_TARGETS) \
$(am__extra_recursive_targets)
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
- distdir
+ check recheck distdir
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
@@ -225,9 +225,190 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
DIST_SUBDIRS = keyfiles
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
@@ -258,6 +439,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -371,6 +553,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -546,7 +729,7 @@ with_valgrind = @with_valgrind@
all: all-recursive
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -769,98 +952,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-keyfile.log: test-keyfile$(EXEEXT)
+ @p='test-keyfile$(EXEEXT)'; \
+ b='test-keyfile'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -943,6 +1196,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -1038,8 +1294,8 @@ uninstall-am:
install-strip installcheck installcheck-am installdirs \
installdirs-am maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
- uninstall-am
+ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+ uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/settings/plugins/keyfile/tests/keyfiles/Makefile.in b/src/settings/plugins/keyfile/tests/keyfiles/Makefile.in
index f7a0c45eb..de7af82b8 100644
--- a/src/settings/plugins/keyfile/tests/keyfiles/Makefile.in
+++ b/src/settings/plugins/keyfile/tests/keyfiles/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Blob b/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Blob
index 9f4ef62fd..62e6ae31f 100644
--- a/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Blob
+++ b/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Blob
@@ -8,8 +8,8 @@ type=802-3-ethernet
eap=tls;
identity=Bill Smith
ca-cert=48;130;2;52;48;130;1;161;2;16;2;173;102;126;78;69;254;94;87;111;60;152;25;94;221;192;48;13;6;9;42;134;72;134;247;13;1;1;2;5;0;48;95;49;11;48;9;6;3;85;4;6;19;2;85;83;49;32;48;30;6;3;85;4;10;19;23;82;83;65;32;68;97;116;97;32;83;101;99;117;114;105;116;121;44;32;73;110;99;46;49;46;48;44;6;3;85;4;11;19;37;83;101;99;117;114;101;32;83;101;114;118;101;114;32;67;101;114;116;105;102;105;99;97;116;105;111;110;32;65;117;116;104;111;114;105;116;121;48;30;23;13;57;52;49;49;48;57;48;48;48;48;48;48;90;23;13;49;48;48;49;48;55;50;51;53;57;53;57;90;48;95;49;11;48;9;6;3;85;4;6;19;2;85;83;49;32;48;30;6;3;85;4;10;19;23;82;83;65;32;68;97;116;97;32;83;101;99;117;114;105;116;121;44;32;73;110;99;46;49;46;48;44;6;3;85;4;11;19;37;83;101;99;117;114;101;32;83;101;114;118;101;114;32;67;101;114;116;105;102;105;99;97;116;105;111;110;32;65;117;116;104;111;114;105;116;121;48;129;155;48;13;6;9;42;134;72;134;247;13;1;1;1;5;0;3;129;137;0;48;129;133;2;126;0;146;206;122;193;174;131;62;90;170;137;131;87;172;37;1;118;12;173;174;142;44;55;206;235;53;120;100;84;3;229;132;64;81;201;191;143;8;226;138;130;8;210;22;134;55;85;233;177;33;2;173;118;104;129;154;5;162;75;201;75;37;102;34;86;108;136;7;143;247;129;89;109;132;7;101;112;19;113;118;62;155;119;76;227;80;137;86;152;72;185;29;167;41;26;19;46;74;17;89;156;30;21;213;73;84;44;115;58;105;130;177;151;57;156;109;112;103;72;229;221;45;214;200;30;123;2;3;1;0;1;48;13;6;9;42;134;72;134;247;13;1;1;2;5;0;3;126;0;101;221;126;225;178;236;176;226;58;224;236;113;70;154;25;17;184;211;199;160;180;3;64;38;2;62;9;156;225;18;179;209;90;246;55;165;183;97;3;182;91;22;105;59;198;68;8;12;136;83;12;107;151;73;199;62;53;220;108;185;187;170;223;92;187;58;47;147;96;182;169;75;77;242;32;247;205;95;127;100;123;142;220;0;92;215;250;119;202;57;22;89;111;14;234;211;181;131;127;77;77;66;86;118;180;201;95;4;248;56;248;235;210;95;117;95;205;123;252;229;142;128;124;252;80;
-client-cert=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
-private-key=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
+client-cert=102;105;108;101;58;47;47;47;67;65;83;65;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
+private-key=102;105;108;101;58;47;47;47;67;65;83;65;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
private-key-password=12345testing
[ipv4]
diff --git a/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Old b/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Old
index 61afdd91c..d3da598c8 100644
--- a/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Old
+++ b/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_TLS_Old
@@ -7,9 +7,9 @@ type=802-3-ethernet
[802-1x]
eap=tls;
identity=Bill Smith
-ca-cert=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;67;65;47;101;97;112;116;101;115;116;95;99;97;95;99;101;114;116;46;112;101;109;0;
-client-cert=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
-private-key=102;105;108;101;58;47;47;47;104;111;109;101;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
+ca-cert=102;105;108;101;58;47;47;47;67;65;83;65;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;67;65;47;101;97;112;116;101;115;116;95;99;97;95;99;101;114;116;46;112;101;109;0;
+client-cert=102;105;108;101;58;47;47;47;67;65;83;65;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
+private-key=102;105;108;101;58;47;47;47;67;65;83;65;47;100;99;98;119;47;68;101;115;107;116;111;112;47;99;101;114;116;105;110;102;114;97;47;99;108;105;101;110;116;46;112;101;109;0;
private-key-password=12345testing
[ipv4]
diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c
index edece1b2b..4fc44c7bd 100644
--- a/src/settings/plugins/keyfile/tests/test-keyfile.c
+++ b/src/settings/plugins/keyfile/tests/test-keyfile.c
@@ -33,6 +33,7 @@
#include "reader.h"
#include "writer.h"
+#include "utils.h"
#include "nm-test-utils.h"
@@ -99,33 +100,33 @@ test_read_valid_wired_connection (void)
const char *expected6_dnssearch3 = "gnu.org";
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.addresses1*semicolon at the end*");
+ "*ipv4.addresses:*semicolon at the end*addresses1*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.addresses2*semicolon at the end*");
+ "*ipv4.addresses:*semicolon at the end*addresses2*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
- "*Missing prefix length*ipv4.address4*");
+ "*missing prefix length*address4*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
- "*Missing prefix length*ipv4.address5*");
+ "*missing prefix length*address5*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.routes2*semicolon at the end*");
+ "*ipv4.routes*semicolon at the end*routes2*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.routes3*semicolon at the end*");
+ "*ipv4.routes*semicolon at the end*routes3*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.routes5*semicolon at the end*");
+ "*ipv4.routes*semicolon at the end*routes5*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.routes8*semicolon at the end*");
+ "*ipv4.routes*semicolon at the end*routes8*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
- "*Missing prefix length*ipv6.address4*");
+ "*missing prefix length*address4*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv6.address5*semicolon at the end*");
+ "*ipv6.address*semicolon at the end*address5*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
- "*Missing prefix length*ipv6.address5*");
+ "*missing prefix length*address5*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv6.address7*semicolon at the end*");
+ "*ipv6.address*semicolon at the end*address7*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv6.routes1*semicolon at the end*");
+ "*ipv6.routes*semicolon at the end*routes1*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv6.route6*semicolon at the end*");
+ "*ipv6.route*semicolon at the end*route6*");
connection = nm_keyfile_plugin_connection_from_file (TEST_WIRED_FILE, NULL);
g_test_assert_expected_messages ();
ASSERT (connection != NULL,
@@ -772,11 +773,11 @@ test_read_wired_mac_case (void)
const char *expected_uuid = "4e80a56d-c99f-4aad-a6dd-b449bc398c57";
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.addresses1*semicolon at the end*");
+ "*ipv4.addresses*semicolon at the end*addresses1*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv4.addresses2*semicolon at the end*");
+ "*ipv4.addresses*semicolon at the end*addresses2*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
- "*ipv6.routes1*semicolon at the end*");
+ "*ipv6.routes*semicolon at the end*routes1*");
connection = nm_keyfile_plugin_connection_from_file (TEST_WIRED_MAC_CASE_FILE, NULL);
g_test_assert_expected_messages ();
ASSERT (connection != NULL,
@@ -2126,6 +2127,10 @@ test_read_wired_8021x_tls_blob_connection (void)
gboolean success;
GBytes *blob;
+ g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
+ "*<warn> keyfile: 802-1x.client-cert: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
+ g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
+ "*<warn> keyfile: 802-1x.private-key: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
connection = nm_keyfile_plugin_connection_from_file (TEST_WIRED_TLS_BLOB_FILE, &error);
if (connection == NULL) {
g_assert (error);
@@ -2173,10 +2178,10 @@ test_read_wired_8021x_tls_blob_connection (void)
g_assert_cmpint (g_bytes_get_size (blob), ==, 568);
tmp = nm_setting_802_1x_get_client_cert_path (s_8021x);
- g_assert_cmpstr (tmp, ==, "/home/dcbw/Desktop/certinfra/client.pem");
+ g_assert_cmpstr (tmp, ==, "/CASA/dcbw/Desktop/certinfra/client.pem");
tmp = nm_setting_802_1x_get_private_key_path (s_8021x);
- g_assert_cmpstr (tmp, ==, "/home/dcbw/Desktop/certinfra/client.pem");
+ g_assert_cmpstr (tmp, ==, "/CASA/dcbw/Desktop/certinfra/client.pem");
g_object_unref (connection);
}
@@ -2258,6 +2263,12 @@ test_read_wired_8021x_tls_old_connection (void)
const char *tmp;
gboolean success;
+ g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
+ "*<warn> keyfile: 802-1x.ca-cert: certificate or key file '/CASA/dcbw/Desktop/certinfra/CA/eaptest_ca_cert.pem' does not exist*");
+ g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
+ "*<warn> keyfile: 802-1x.client-cert: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
+ g_test_expect_message ("NetworkManager", G_LOG_LEVEL_WARNING,
+ "*<warn> keyfile: 802-1x.private-key: certificate or key file '/CASA/dcbw/Desktop/certinfra/client.pem' does not exist*");
connection = nm_keyfile_plugin_connection_from_file (TEST_WIRED_TLS_OLD_FILE, &error);
if (connection == NULL) {
g_assert (error);
@@ -2291,13 +2302,13 @@ test_read_wired_8021x_tls_old_connection (void)
g_assert (g_strcmp0 (tmp, "12345testing") == 0);
tmp = nm_setting_802_1x_get_ca_cert_path (s_8021x);
- g_assert (g_strcmp0 (tmp, "/home/dcbw/Desktop/certinfra/CA/eaptest_ca_cert.pem") == 0);
+ g_assert (g_strcmp0 (tmp, "/CASA/dcbw/Desktop/certinfra/CA/eaptest_ca_cert.pem") == 0);
tmp = nm_setting_802_1x_get_client_cert_path (s_8021x);
- g_assert (g_strcmp0 (tmp, "/home/dcbw/Desktop/certinfra/client.pem") == 0);
+ g_assert (g_strcmp0 (tmp, "/CASA/dcbw/Desktop/certinfra/client.pem") == 0);
tmp = nm_setting_802_1x_get_private_key_path (s_8021x);
- g_assert (g_strcmp0 (tmp, "/home/dcbw/Desktop/certinfra/client.pem") == 0);
+ g_assert (g_strcmp0 (tmp, "/CASA/dcbw/Desktop/certinfra/client.pem") == 0);
g_object_unref (connection);
}
@@ -3566,10 +3577,61 @@ test_write_flags_property (void)
g_object_unref (connection);
}
+/*****************************************************************************/
+
+static void
+_escape_filename (const char *filename, gboolean would_be_ignored)
+{
+ gs_free char *esc = NULL;
+
+ g_assert (filename && filename[0]);
+
+ if (!!would_be_ignored != !!nm_keyfile_plugin_utils_should_ignore_file (filename)) {
+ if (would_be_ignored)
+ g_error ("We expect filename \"%s\" to be ignored, but it isn't", filename);
+ else
+ g_error ("We expect filename \"%s\" not to be ignored, but it is", filename);
+ }
+
+ esc = nm_keyfile_plugin_utils_escape_filename (filename);
+ g_assert (esc && esc[0]);
+ g_assert (!strchr (esc, '/'));
+
+ if (nm_keyfile_plugin_utils_should_ignore_file (esc))
+ g_error ("Escaping filename \"%s\" yielded \"%s\", but this is ignored", filename, esc);
+}
+
+static void
+test_nm_keyfile_plugin_utils_escape_filename (void)
+{
+ _escape_filename ("ab", FALSE);
+ _escape_filename (".vim-file.swp", TRUE);
+ _escape_filename (".vim-file.Swp", TRUE);
+ _escape_filename (".vim-file.SWP", TRUE);
+ _escape_filename (".vim-file.swpx", TRUE);
+ _escape_filename (".vim-file.Swpx", TRUE);
+ _escape_filename (".vim-file.SWPX", TRUE);
+ _escape_filename (".pem-file.pem", TRUE);
+ _escape_filename (".pem-file.Pem", TRUE);
+ _escape_filename (".pem-file.PEM", TRUE);
+ _escape_filename (".pem-file.der", TRUE);
+ _escape_filename (".pem-file.Der", TRUE);
+ _escape_filename (".mkstemp.ABCEDF", TRUE);
+ _escape_filename (".mkstemp.abcdef", TRUE);
+ _escape_filename (".mkstemp.123456", TRUE);
+ _escape_filename (".mkstemp.A23456", TRUE);
+ _escape_filename (".#emacs-locking", TRUE);
+ _escape_filename ("file-with-tilde~", TRUE);
+ _escape_filename (".file-with-dot", TRUE);
+}
+
+/*****************************************************************************/
+
NMTST_DEFINE ();
int main (int argc, char **argv)
{
+ _nm_utils_set_testing (NM_UTILS_TEST_NO_KEYFILE_OWNER_CHECK);
nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
/* The tests */
@@ -3636,6 +3698,8 @@ int main (int argc, char **argv)
g_test_add_func ("/keyfile/test_read_flags_property ", test_read_flags_property);
g_test_add_func ("/keyfile/test_write_flags_property ", test_write_flags_property);
+ g_test_add_func ("/keyfile/test_nm_keyfile_plugin_utils_escape_filename ", test_nm_keyfile_plugin_utils_escape_filename);
+
return g_test_run ();
}
diff --git a/src/settings/plugins/keyfile/utils.c b/src/settings/plugins/keyfile/utils.c
index 3361d5544..4809c642c 100644
--- a/src/settings/plugins/keyfile/utils.c
+++ b/src/settings/plugins/keyfile/utils.c
@@ -23,6 +23,7 @@
#include <glib.h>
#include <stdlib.h>
#include <string.h>
+#include "gsystem-local-alloc.h"
#include "utils.h"
#include <nm-setting-wired.h>
#include <nm-setting-wireless.h>
@@ -59,7 +60,7 @@ check_prefix (const char *base, const char *tag)
len = strlen (base);
tag_len = strlen (tag);
- if ((len > tag_len) && !strncasecmp (base, tag, tag_len))
+ if ((len > tag_len) && !g_ascii_strncasecmp (base, tag, tag_len))
return TRUE;
return FALSE;
}
@@ -74,7 +75,7 @@ check_suffix (const char *base, const char *tag)
len = strlen (base);
tag_len = strlen (tag);
- if ((len > tag_len) && !strcasecmp (base + len - tag_len, tag))
+ if ((len > tag_len) && !g_ascii_strcasecmp (base + len - tag_len, tag))
return TRUE;
return FALSE;
}
@@ -87,199 +88,61 @@ check_suffix (const char *base, const char *tag)
gboolean
nm_keyfile_plugin_utils_should_ignore_file (const char *filename)
{
- char *base;
- gboolean ignore = FALSE;
+ gs_free char *base = NULL;
g_return_val_if_fail (filename != NULL, TRUE);
base = g_path_get_basename (filename);
g_return_val_if_fail (base != NULL, TRUE);
- /* Ignore files with certain patterns */
- if ( (check_prefix (base, ".") && check_suffix (base, SWP_TAG)) /* vim temporary files: .filename.swp */
- || (check_prefix (base, ".") && check_suffix (base, SWPX_TAG)) /* vim temporary files: .filename.swpx */
- || check_suffix (base, PEM_TAG) /* 802.1x certificates and keys */
- || check_suffix (base, DER_TAG) /* 802.1x certificates and keys */
- || check_mkstemp_suffix (base) /* temporary files created by mkstemp() */
- || check_prefix (base, ".#") /* Emacs locking file (link) */
- || base[strlen (base) - 1] == '~')
- ignore = TRUE;
+ /* Ignore hidden and backup files */
+ /* should_ignore_file() must mirror escape_filename() */
+ if (check_prefix (base, ".") || check_suffix (base, "~"))
+ return TRUE;
+ /* Ignore temporary files */
+ if (check_mkstemp_suffix (base))
+ return TRUE;
+ /* Ignore 802.1x certificates and keys */
+ if (check_suffix (base, PEM_TAG) || check_suffix (base, DER_TAG))
+ return TRUE;
- g_free (base);
- return ignore;
+ return FALSE;
}
-typedef struct {
- const char *setting;
- const char *alias;
-} SettingAlias;
-
-static const SettingAlias alias_list[] = {
- { NM_SETTING_WIRED_SETTING_NAME, "ethernet" },
- { NM_SETTING_WIRELESS_SETTING_NAME, "wifi" },
- { NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, "wifi-security" },
-};
-
-const char *
-nm_keyfile_plugin_get_alias_for_setting_name (const char *setting_name)
+char *
+nm_keyfile_plugin_utils_escape_filename (const char *filename)
{
- guint i;
+ GString *str;
+ const char *f = filename;
+ const char ESCAPE_CHAR = '*';
- g_return_val_if_fail (setting_name != NULL, NULL);
+ /* keyfile used to escape with '*', do not change that behavior.
+ * But for newly added escapings, use '_' instead. */
+ const char ESCAPE_CHAR2 = '_';
- for (i = 0; i < G_N_ELEMENTS (alias_list); i++) {
- if (strcmp (setting_name, alias_list[i].setting) == 0)
- return alias_list[i].alias;
- }
- return NULL;
-}
+ g_return_val_if_fail (filename && filename[0], NULL);
-const char *
-nm_keyfile_plugin_get_setting_name_for_alias (const char *alias)
-{
- guint i;
-
- g_return_val_if_fail (alias != NULL, NULL);
+ str = g_string_sized_new (60);
- for (i = 0; i < G_N_ELEMENTS (alias_list); i++) {
- if (strcmp (alias, alias_list[i].alias) == 0)
- return alias_list[i].setting;
+ /* Convert '/' to ESCAPE_CHAR */
+ for (f = filename; f[0]; f++) {
+ if (f[0] == '/')
+ g_string_append_c (str, ESCAPE_CHAR);
+ else
+ g_string_append_c (str, f[0]);
}
- return NULL;
-}
-
-/**********************************************************************/
-
-/* List helpers */
-#define DEFINE_KF_LIST_WRAPPER(stype, get_ctype, set_ctype) \
-get_ctype \
-nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- gsize *out_length, \
- GError **error) \
-{ \
- get_ctype list; \
- const char *alias; \
- GError *local = NULL; \
- \
- list = g_key_file_get_##stype##_list (kf, group, key, out_length, &local); \
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- if (alias) { \
- g_clear_error (&local); \
- list = g_key_file_get_##stype##_list (kf, alias, key, out_length, &local); \
- } \
- } \
- if (local) \
- g_propagate_error (error, local); \
- return list; \
-} \
- \
-void \
-nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype list[], \
- gsize length) \
-{ \
- const char *alias; \
- \
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- g_key_file_set_##stype##_list (kf, alias ? alias : group, key, list, length); \
-}
-
-DEFINE_KF_LIST_WRAPPER(integer, gint*, gint);
-DEFINE_KF_LIST_WRAPPER(string, gchar **, const gchar* const);
-/* Single value helpers */
-#define DEFINE_KF_WRAPPER(stype, get_ctype, set_ctype) \
-get_ctype \
-nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- GError **error) \
-{ \
- get_ctype val; \
- const char *alias; \
- GError *local = NULL; \
- \
- val = g_key_file_get_##stype (kf, group, key, &local); \
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) { \
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- if (alias) { \
- g_clear_error (&local); \
- val = g_key_file_get_##stype (kf, alias, key, &local); \
- } \
- } \
- if (local) \
- g_propagate_error (error, local); \
- return val; \
-} \
- \
-void \
-nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype value) \
-{ \
- const char *alias; \
- \
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group); \
- g_key_file_set_##stype (kf, alias ? alias : group, key, value); \
+ /* escape_filename() must avoid anything that should_ignore_file() would reject.
+ * We can escape here more aggressivly then what we would read back. */
+ if (check_prefix (str->str, "."))
+ str->str[0] = ESCAPE_CHAR2;
+ if (check_suffix (str->str, "~"))
+ str->str[str->len - 1] = ESCAPE_CHAR2;
+ if ( check_mkstemp_suffix (str->str)
+ || check_suffix (str->str, PEM_TAG)
+ || check_suffix (str->str, DER_TAG))
+ g_string_append_c (str, ESCAPE_CHAR2);
+
+ return g_string_free (str, FALSE);;
}
-DEFINE_KF_WRAPPER(string, gchar*, const gchar*);
-DEFINE_KF_WRAPPER(integer, gint, gint);
-DEFINE_KF_WRAPPER(uint64, guint64, guint64);
-DEFINE_KF_WRAPPER(boolean, gboolean, gboolean);
-DEFINE_KF_WRAPPER(value, gchar*, const gchar*);
-
-
-gchar **
-nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
- const char *group,
- gsize *out_length,
- GError **error)
-{
- gchar **keys;
- const char *alias;
- GError *local = NULL;
-
- keys = g_key_file_get_keys (kf, group, out_length, &local);
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
- if (alias) {
- g_clear_error (&local);
- keys = g_key_file_get_keys (kf, alias, out_length, &local);
- }
- }
- if (local)
- g_propagate_error (error, local);
- return keys;
-}
-
-gboolean
-nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
- const char *group,
- const char *key,
- GError **error)
-{
- gboolean has;
- const char *alias;
- GError *local = NULL;
-
- has = g_key_file_has_key (kf, group, key, &local);
- if (g_error_matches (local, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND)) {
- alias = nm_keyfile_plugin_get_alias_for_setting_name (group);
- if (alias) {
- g_clear_error (&local);
- has = g_key_file_has_key (kf, alias, key, &local);
- }
- }
- if (local)
- g_propagate_error (error, local);
- return has;
-}
-
-
diff --git a/src/settings/plugins/keyfile/utils.h b/src/settings/plugins/keyfile/utils.h
index d15336710..d0862284c 100644
--- a/src/settings/plugins/keyfile/utils.h
+++ b/src/settings/plugins/keyfile/utils.h
@@ -22,7 +22,6 @@
#define _UTILS_H_
#include <glib.h>
-#include "common.h"
#include "NetworkManagerUtils.h"
#define NM_KEYFILE_CONNECTION_LOG_PATH(path) str_if_set (path,"in-memory")
@@ -33,55 +32,7 @@
gboolean nm_keyfile_plugin_utils_should_ignore_file (const char *filename);
-const char *nm_keyfile_plugin_get_alias_for_setting_name (const char *setting_name);
-
-const char *nm_keyfile_plugin_get_setting_name_for_alias (const char *alias);
-
-/*********************************************************/
-
-/* List helpers */
-#define DEFINE_KF_LIST_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
-get_ctype nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- gsize *out_length, \
- GError **error); \
-\
-void nm_keyfile_plugin_kf_set_##stype##_list (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype list[], \
- gsize length);
-DEFINE_KF_LIST_WRAPPER_PROTO(integer, gint*, gint)
-DEFINE_KF_LIST_WRAPPER_PROTO(string, gchar**, const gchar* const)
-
-/* Single-value helpers */
-#define DEFINE_KF_WRAPPER_PROTO(stype, get_ctype, set_ctype) \
-get_ctype nm_keyfile_plugin_kf_get_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- GError **error); \
-\
-void nm_keyfile_plugin_kf_set_##stype (GKeyFile *kf, \
- const char *group, \
- const char *key, \
- set_ctype value);
-DEFINE_KF_WRAPPER_PROTO(string, gchar*, const gchar*)
-DEFINE_KF_WRAPPER_PROTO(integer, gint, gint)
-DEFINE_KF_WRAPPER_PROTO(uint64, guint64, guint64)
-DEFINE_KF_WRAPPER_PROTO(boolean, gboolean, gboolean)
-DEFINE_KF_WRAPPER_PROTO(value, gchar*, const gchar*)
-
-/* Misc */
-gchar ** nm_keyfile_plugin_kf_get_keys (GKeyFile *kf,
- const char *group,
- gsize *out_length,
- GError **error);
-
-gboolean nm_keyfile_plugin_kf_has_key (GKeyFile *kf,
- const char *group,
- const char *key,
- GError **error);
+char *nm_keyfile_plugin_utils_escape_filename (const char *filename);
#endif /* _UTILS_H_ */
diff --git a/src/settings/plugins/keyfile/writer.c b/src/settings/plugins/keyfile/writer.c
index 7aa5bfb01..b6a8786dc 100644
--- a/src/settings/plugins/keyfile/writer.c
+++ b/src/settings/plugins/keyfile/writer.c
@@ -16,7 +16,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Copyright (C) 2008 Novell, Inc.
- * Copyright (C) 2008 - 2012 Red Hat, Inc.
+ * Copyright (C) 2008 - 2015 Red Hat, Inc.
*/
#include "config.h"
@@ -24,407 +24,22 @@
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
-#include <stdio.h>
#include <errno.h>
-
-#include <nm-setting.h>
-#include <nm-setting-connection.h>
-#include <nm-setting-ip4-config.h>
-#include <nm-setting-ip6-config.h>
-#include <nm-setting-vpn.h>
-#include <nm-setting-wired.h>
-#include <nm-setting-wireless.h>
-#include <nm-setting-ip4-config.h>
-#include <nm-setting-bluetooth.h>
-#include <nm-setting-8021x.h>
-#include <nm-utils.h>
#include <string.h>
-#include <arpa/inet.h>
#include "nm-glib-compat.h"
+
#include "nm-logging.h"
#include "writer.h"
#include "common.h"
#include "utils.h"
+#include "nm-keyfile-internal.h"
-/* Some setting properties also contain setting names, such as
- * NMSettingConnection's 'type' property (which specifies the base type of the
- * connection, eg ethernet or wifi) or the 802-11-wireless setting's
- * 'security' property which specifies whether or not the AP requires
- * encrpytion. This function handles translating those properties' values
- * from the real setting name to the more-readable alias.
- */
-static void
-setting_alias_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- const char *str, *alias;
-
- str = g_value_get_string (value);
- alias = nm_keyfile_plugin_get_alias_for_setting_name (str);
- nm_keyfile_plugin_kf_set_string (file,
- nm_setting_get_name (setting),
- key,
- alias ? alias : str);
-}
-
-static gboolean
-write_array_of_uint (GKeyFile *file,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- GArray *array;
- int i;
- int *tmp_array;
-
- array = (GArray *) g_value_get_boxed (value);
- if (!array || !array->len)
- return TRUE;
-
- tmp_array = g_new (gint, array->len);
- for (i = 0; i < array->len; i++)
- tmp_array[i] = g_array_index (array, int, i);
-
- nm_keyfile_plugin_kf_set_integer_list (file, nm_setting_get_name (setting), key, tmp_array, array->len);
- g_free (tmp_array);
- return TRUE;
-}
-
-static void
-dns_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- char **list;
-
- list = g_value_get_boxed (value);
- if (list && list[0]) {
- nm_keyfile_plugin_kf_set_string_list (file, nm_setting_get_name (setting), key,
- (const char **) list, g_strv_length (list));
- }
-}
-
-static void
-write_ip_values (GKeyFile *file,
- const char *setting_name,
- GPtrArray *array,
- const char *gateway,
- gboolean is_route)
-{
- GString *output;
- int family, i;
- const char *addr, *gw;
- guint32 plen, metric;
- char key_name[30], *key_name_idx;
-
- if (!array->len)
- return;
-
- family = !strcmp (setting_name, NM_SETTING_IP4_CONFIG_SETTING_NAME) ? AF_INET : AF_INET6;
-
- strcpy (key_name, is_route ? "route" : "address");
- key_name_idx = key_name + strlen (key_name);
-
- output = g_string_sized_new (2*INET_ADDRSTRLEN + 10);
- for (i = 0; i < array->len; i++) {
- if (is_route) {
- NMIPRoute *route = array->pdata[i];
-
- addr = nm_ip_route_get_dest (route);
- plen = nm_ip_route_get_prefix (route);
- gw = nm_ip_route_get_next_hop (route);
- metric = MAX (0, nm_ip_route_get_metric (route));
- } else {
- NMIPAddress *address = array->pdata[i];
-
- addr = nm_ip_address_get_address (address);
- plen = nm_ip_address_get_prefix (address);
- gw = i == 0 ? gateway : NULL;
- metric = 0;
- }
-
- g_string_set_size (output, 0);
- g_string_append_printf (output, "%s/%u", addr, plen);
- if (metric || gw) {
- /* Older versions of the plugin do not support the form
- * "a.b.c.d/plen,,metric", so, we always have to write the
- * gateway, even if there isn't one.
- * The current version supports reading of the above form.
- */
- if (!gw) {
- if (family == AF_INET)
- gw = "0.0.0.0";
- else
- gw = "::";
- }
-
- g_string_append_printf (output, ",%s", gw);
- if (metric)
- g_string_append_printf (output, ",%lu", (unsigned long) metric);
- }
-
- sprintf (key_name_idx, "%d", i + 1);
- nm_keyfile_plugin_kf_set_string (file, setting_name, key_name, output->str);
- }
- g_string_free (output, TRUE);
-}
-
-static void
-addr_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- GPtrArray *array;
- const char *setting_name = nm_setting_get_name (setting);
- const char *gateway = nm_setting_ip_config_get_gateway (NM_SETTING_IP_CONFIG (setting));
-
- array = (GPtrArray *) g_value_get_boxed (value);
- if (array && array->len)
- write_ip_values (file, setting_name, array, gateway, FALSE);
-}
-
-static void
-ip4_addr_label_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- /* skip */
-}
-
-static void
-gateway_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- /* skip */
-}
-
-static void
-route_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- GPtrArray *array;
- const char *setting_name = nm_setting_get_name (setting);
-
- array = (GPtrArray *) g_value_get_boxed (value);
- if (array && array->len)
- write_ip_values (file, setting_name, array, NULL, TRUE);
-}
-
-static void
-write_hash_of_string (GKeyFile *file,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- GHashTableIter iter;
- const char *property = NULL, *data = NULL;
- const char *group_name = nm_setting_get_name (setting);
- gboolean vpn_secrets = FALSE;
-
- /* Write VPN secrets out to a different group to keep them separate */
- if (NM_IS_SETTING_VPN (setting) && !strcmp (key, NM_SETTING_VPN_SECRETS)) {
- group_name = VPN_SECRETS_GROUP;
- vpn_secrets = TRUE;
- }
-
- g_hash_table_iter_init (&iter, (GHashTable *) g_value_get_boxed (value));
- while (g_hash_table_iter_next (&iter, (gpointer *) &property, (gpointer *) &data)) {
- gboolean write_item = TRUE;
-
- /* Handle VPN secrets specially; they are nested in the property's hash;
- * we don't want to write them if the secret is not saved, not required,
- * or owned by a user's secret agent.
- */
- if (vpn_secrets) {
- NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
-
- nm_setting_get_secret_flags (setting, property, &secret_flags, NULL);
- if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
- write_item = FALSE;
- }
-
- if (write_item)
- nm_keyfile_plugin_kf_set_string (file, group_name, property, data);
- }
-}
-static void
-ssid_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- GBytes *bytes;
- const guint8 *ssid_data;
- gsize ssid_len;
- const char *setting_name = nm_setting_get_name (setting);
- gboolean new_format = TRUE;
- unsigned int semicolons = 0;
- int i, *tmp_array;
- char *ssid;
-
- g_return_if_fail (G_VALUE_HOLDS (value, G_TYPE_BYTES));
-
- bytes = g_value_get_boxed (value);
- if (!bytes)
- return;
- ssid_data = g_bytes_get_data (bytes, &ssid_len);
- if (ssid_len == 0)
- return;
-
- /* Check whether each byte is printable. If not, we have to use an
- * integer list, otherwise we can just use a string.
- */
- for (i = 0; i < ssid_len; i++) {
- char c = ssid_data[i] & 0xFF;
- if (!g_ascii_isprint (c)) {
- new_format = FALSE;
- break;
- }
- if (c == ';')
- semicolons++;
- }
-
- if (new_format) {
- ssid = g_malloc0 (ssid_len + semicolons + 1);
- if (semicolons == 0)
- memcpy (ssid, ssid_data, ssid_len);
- else {
- /* Escape semicolons with backslashes to make strings
- * containing ';', such as '16;17;' unambiguous */
- int j = 0;
- for (i = 0; i < ssid_len; i++) {
- if (ssid_data[i] == ';')
- ssid[j++] = '\\';
- ssid[j++] = ssid_data[i];
- }
- }
- nm_keyfile_plugin_kf_set_string (file, setting_name, key, ssid);
- g_free (ssid);
- } else {
- tmp_array = g_new (gint, ssid_len);
- for (i = 0; i < ssid_len; i++)
- tmp_array[i] = (int) ssid_data[i];
- nm_keyfile_plugin_kf_set_integer_list (file, setting_name, key, tmp_array, ssid_len);
- g_free (tmp_array);
- }
-}
-
-static void
-password_raw_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
-{
- const char *setting_name = nm_setting_get_name (setting);
- GBytes *array;
- int *tmp_array;
- gsize i, len;
- const char *data;
-
- g_return_if_fail (G_VALUE_HOLDS (value, G_TYPE_BYTES));
-
- array = (GBytes *) g_value_get_boxed (value);
- if (!array)
- return;
- data = g_bytes_get_data (array, &len);
- if (!data || !len)
- return;
-
- tmp_array = g_new (gint, len);
- for (i = 0; i < len; i++)
- tmp_array[i] = (int) data[i];
- nm_keyfile_plugin_kf_set_integer_list (file, setting_name, key, tmp_array, len);
- g_free (tmp_array);
-}
+typedef struct {
+ const char *keyfile_dir;
+} WriteInfo;
-typedef struct ObjectType {
- const char *key;
- const char *suffix;
- const char *privkey_pw_prop;
- NMSetting8021xCKScheme (*scheme_func) (NMSetting8021x *setting);
- NMSetting8021xCKFormat (*format_func) (NMSetting8021x *setting);
- const char * (*path_func) (NMSetting8021x *setting);
- GBytes * (*blob_func) (NMSetting8021x *setting);
-} ObjectType;
-
-static const ObjectType objtypes[10] = {
- { NM_SETTING_802_1X_CA_CERT,
- "ca-cert",
- NULL,
- nm_setting_802_1x_get_ca_cert_scheme,
- NULL,
- nm_setting_802_1x_get_ca_cert_path,
- nm_setting_802_1x_get_ca_cert_blob },
-
- { NM_SETTING_802_1X_PHASE2_CA_CERT,
- "inner-ca-cert",
- NULL,
- nm_setting_802_1x_get_phase2_ca_cert_scheme,
- NULL,
- nm_setting_802_1x_get_phase2_ca_cert_path,
- nm_setting_802_1x_get_phase2_ca_cert_blob },
-
- { NM_SETTING_802_1X_CLIENT_CERT,
- "client-cert",
- NULL,
- nm_setting_802_1x_get_client_cert_scheme,
- NULL,
- nm_setting_802_1x_get_client_cert_path,
- nm_setting_802_1x_get_client_cert_blob },
-
- { NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
- "inner-client-cert",
- NULL,
- nm_setting_802_1x_get_phase2_client_cert_scheme,
- NULL,
- nm_setting_802_1x_get_phase2_client_cert_path,
- nm_setting_802_1x_get_phase2_client_cert_blob },
-
- { NM_SETTING_802_1X_PRIVATE_KEY,
- "private-key",
- NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD,
- nm_setting_802_1x_get_private_key_scheme,
- nm_setting_802_1x_get_private_key_format,
- nm_setting_802_1x_get_private_key_path,
- nm_setting_802_1x_get_private_key_blob },
-
- { NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
- "inner-private-key",
- NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD,
- nm_setting_802_1x_get_phase2_private_key_scheme,
- nm_setting_802_1x_get_phase2_private_key_format,
- nm_setting_802_1x_get_phase2_private_key_path,
- nm_setting_802_1x_get_phase2_private_key_blob },
-
- { NULL },
-};
static gboolean
write_cert_key_file (const char *path,
@@ -490,61 +105,75 @@ out:
}
static void
-cert_writer (GKeyFile *file,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value)
+cert_writer (NMConnection *connection,
+ GKeyFile *file,
+ NMKeyfileWriteTypeDataCert *cert_data,
+ WriteInfo *info,
+ GError **error)
{
- const char *setting_name = nm_setting_get_name (setting);
+ const char *setting_name = nm_setting_get_name (NM_SETTING (cert_data->setting));
NMSetting8021xCKScheme scheme;
NMSetting8021xCKFormat format;
const char *path = NULL, *ext = "pem";
- const ObjectType *objtype = NULL;
- int i;
- for (i = 0; i < G_N_ELEMENTS (objtypes) && objtypes[i].key; i++) {
- if (g_strcmp0 (objtypes[i].key, key) == 0) {
- objtype = &objtypes[i];
- break;
- }
- }
- if (!objtype) {
- g_return_if_fail (objtype);
- return;
- }
-
- scheme = objtype->scheme_func (NM_SETTING_802_1X (setting));
+ scheme = cert_data->scheme_func (cert_data->setting);
if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
- path = objtype->path_func (NM_SETTING_802_1X (setting));
+ char *tmp = NULL;
+ const char *accepted_path = NULL;
+
+ path = cert_data->path_func (cert_data->setting);
g_assert (path);
- /* If the path is rooted in the keyfile directory, just use a
- * relative path instead of an absolute one.
- */
- if (g_str_has_prefix (path, keyfile_dir)) {
- path += strlen (keyfile_dir);
- while (*path == '/')
- path++;
+ if (g_str_has_prefix (path, info->keyfile_dir)) {
+ const char *p = path + strlen (info->keyfile_dir);
+
+ /* If the path is rooted in the keyfile directory, just use a
+ * relative path instead of an absolute one.
+ */
+ if (*p == '/') {
+ while (*p == '/')
+ p++;
+ if (p[0]) {
+ /* If @p looks like an integer list, the following detection will fail too and
+ * we will file:// qualify the path below. We thus avoid writing a path string
+ * that would be interpreted as legacy binary format by reader. */
+ tmp = nm_keyfile_detect_unqualified_path_scheme (info->keyfile_dir, p, -1, FALSE, NULL);
+ if (tmp) {
+ g_clear_pointer (&tmp, g_free);
+ accepted_path = p;
+ }
+ }
+ }
+ }
+ if (!accepted_path) {
+ /* What we are about to write, must also be understood by the reader.
+ * Otherwise, add a file:// prefix */
+ tmp = nm_keyfile_detect_unqualified_path_scheme (info->keyfile_dir, path, -1, FALSE, NULL);
+ if (tmp) {
+ g_clear_pointer (&tmp, g_free);
+ accepted_path = path;
+ }
}
- nm_keyfile_plugin_kf_set_string (file, setting_name, key, path);
+ if (!accepted_path)
+ accepted_path = tmp = g_strconcat (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH, path, NULL);
+ nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, accepted_path);
+ g_free (tmp);
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
GBytes *blob;
const guint8 *blob_data;
gsize blob_len;
gboolean success;
- GError *error = NULL;
+ GError *local = NULL;
char *new_path;
- blob = objtype->blob_func (NM_SETTING_802_1X (setting));
+ blob = cert_data->blob_func (cert_data->setting);
g_assert (blob);
blob_data = g_bytes_get_data (blob, &blob_len);
- if (objtype->format_func) {
+ if (cert_data->format_func) {
/* Get the extension for a private key */
- format = objtype->format_func (NM_SETTING_802_1X (setting));
+ format = cert_data->format_func (cert_data->setting);
if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12)
ext = "p12";
} else {
@@ -556,246 +185,46 @@ cert_writer (GKeyFile *file,
/* Write the raw data out to the standard file so that we can use paths
* from now on instead of pushing around the certificate data.
*/
- new_path = g_strdup_printf ("%s/%s-%s.%s", keyfile_dir, uuid, objtype->suffix, ext);
- g_assert (new_path);
+ new_path = g_strdup_printf ("%s/%s-%s.%s", info->keyfile_dir, nm_connection_get_uuid (connection),
+ cert_data->suffix, ext);
- success = write_cert_key_file (new_path, blob_data, blob_len, &error);
+ success = write_cert_key_file (new_path, blob_data, blob_len, &local);
if (success) {
- /* Write the path value to the keyfile */
- nm_keyfile_plugin_kf_set_string (file, setting_name, key, new_path);
+ /* Write the path value to the keyfile.
+ * We know, that basename(new_path) starts with a UUID, hence no conflict with "data:;base64," */
+ nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, strrchr (new_path, '/') + 1);
} else {
- nm_log_warn (LOGD_SETTINGS, "Failed to write certificate/key %s: %s",
- new_path, error->message);
- g_error_free (error);
+ nm_log_warn (LOGD_SETTINGS, "keyfile: %s.%s: failed to write certificate to file %s: %s",
+ setting_name, cert_data->property_name, new_path, local->message);
+ g_error_free (local);
}
g_free (new_path);
- } else
- g_assert_not_reached ();
-}
-
-typedef struct {
- const char *setting_name;
- const char *key;
- void (*writer) (GKeyFile *keyfile,
- const char *keyfile_dir,
- const char *uuid,
- NMSetting *setting,
- const char *key,
- const GValue *value);
-} KeyWriter;
-
-/* A table of keys that require further parsing/conversion because they are
- * stored in a format that can't be automatically read using the key's type.
- * i.e. IPv4 addresses, which are stored in NetworkManager as guint32, but are
- * stored in keyfiles as strings, eg "10.1.1.2" or IPv6 addresses stored
- * in struct in6_addr internally, but as string in keyfiles.
- */
-static KeyWriter key_writers[] = {
- { NM_SETTING_CONNECTION_SETTING_NAME,
- NM_SETTING_CONNECTION_TYPE,
- setting_alias_writer },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ADDRESSES,
- addr_writer },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- "address-labels",
- ip4_addr_label_writer },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ADDRESSES,
- addr_writer },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_GATEWAY,
- gateway_writer },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_GATEWAY,
- gateway_writer },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ROUTES,
- route_writer },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_ROUTES,
- route_writer },
- { NM_SETTING_IP4_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_DNS,
- dns_writer },
- { NM_SETTING_IP6_CONFIG_SETTING_NAME,
- NM_SETTING_IP_CONFIG_DNS,
- dns_writer },
- { NM_SETTING_WIRELESS_SETTING_NAME,
- NM_SETTING_WIRELESS_SSID,
- ssid_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PASSWORD_RAW,
- password_raw_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_CA_CERT,
- cert_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_CLIENT_CERT,
- cert_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PRIVATE_KEY,
- cert_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PHASE2_CA_CERT,
- cert_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
- cert_writer },
- { NM_SETTING_802_1X_SETTING_NAME,
- NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
- cert_writer },
- { NULL, NULL, NULL }
-};
-
-typedef struct {
- GKeyFile *keyfile;
- const char *keyfile_dir;
- const char *uuid;
-} WriteInfo;
-
-static void
-write_setting_value (NMSetting *setting,
- const char *key,
- const GValue *value,
- GParamFlags flag,
- gpointer user_data)
-{
- WriteInfo *info = user_data;
- const char *setting_name;
- GType type = G_VALUE_TYPE (value);
- KeyWriter *writer = &key_writers[0];
- GParamSpec *pspec;
-
- /* Setting name gets picked up from the keyfile's section name instead */
- if (!strcmp (key, NM_SETTING_NAME))
- return;
-
- /* Don't write the NMSettingConnection object's 'read-only' property */
- if ( NM_IS_SETTING_CONNECTION (setting)
- && !strcmp (key, NM_SETTING_CONNECTION_READ_ONLY))
- return;
-
- setting_name = nm_setting_get_name (setting);
-
- /* If the value is the default value, remove the item from the keyfile */
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), key);
- if (pspec) {
- if (g_param_value_defaults (pspec, (GValue *) value)) {
- g_key_file_remove_key (info->keyfile, setting_name, key, NULL);
- return;
- }
- }
-
- /* Don't write secrets that are owned by user secret agents or aren't
- * supposed to be saved. VPN secrets are handled specially though since
- * the secret flags there are in a third-level hash in the 'secrets'
- * property.
- */
- if (pspec && (pspec->flags & NM_SETTING_PARAM_SECRET) && !NM_IS_SETTING_VPN (setting)) {
- NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
-
- if (!nm_setting_get_secret_flags (setting, key, &secret_flags, NULL))
- g_assert_not_reached ();
- if (secret_flags != NM_SETTING_SECRET_FLAG_NONE)
- return;
- }
-
- /* Look through the list of handlers for non-standard format key values */
- while (writer->setting_name) {
- if (!strcmp (writer->setting_name, setting_name) && !strcmp (writer->key, key)) {
- (*writer->writer) (info->keyfile, info->keyfile_dir, info->uuid, setting, key, value);
- return;
- }
- writer++;
- }
-
- if (type == G_TYPE_STRING) {
- const char *str;
-
- str = g_value_get_string (value);
- if (str)
- nm_keyfile_plugin_kf_set_string (info->keyfile, setting_name, key, str);
- } else if (type == G_TYPE_UINT)
- nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, (int) g_value_get_uint (value));
- else if (type == G_TYPE_INT)
- nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, g_value_get_int (value));
- else if (type == G_TYPE_UINT64) {
- char *numstr;
-
- numstr = g_strdup_printf ("%" G_GUINT64_FORMAT, g_value_get_uint64 (value));
- nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr);
- g_free (numstr);
- } else if (type == G_TYPE_INT64) {
- char *numstr;
-
- numstr = g_strdup_printf ("%" G_GINT64_FORMAT, g_value_get_int64 (value));
- nm_keyfile_plugin_kf_set_value (info->keyfile, setting_name, key, numstr);
- g_free (numstr);
- } else if (type == G_TYPE_BOOLEAN) {
- nm_keyfile_plugin_kf_set_boolean (info->keyfile, setting_name, key, g_value_get_boolean (value));
- } else if (type == G_TYPE_CHAR) {
- nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, (int) g_value_get_schar (value));
- } else if (type == G_TYPE_BYTES) {
- GBytes *bytes;
- const guint8 *data;
- gsize len = 0;
-
- bytes = g_value_get_boxed (value);
- data = bytes ? g_bytes_get_data (bytes, &len) : NULL;
-
- if (data != NULL && len > 0) {
- int *tmp_array;
- int i;
-
- tmp_array = g_new (gint, len);
- for (i = 0; i < len; i++)
- tmp_array[i] = (int) data[i];
-
- nm_keyfile_plugin_kf_set_integer_list (info->keyfile, setting_name, key, tmp_array, len);
- g_free (tmp_array);
- }
- } else if (type == G_TYPE_STRV) {
- char **array;
-
- array = (char **) g_value_get_boxed (value);
- nm_keyfile_plugin_kf_set_string_list (info->keyfile, setting_name, key, (const gchar **const) array, g_strv_length (array));
- } else if (type == G_TYPE_HASH_TABLE) {
- write_hash_of_string (info->keyfile, setting, key, value);
- } else if (type == G_TYPE_ARRAY) {
- if (!write_array_of_uint (info->keyfile, setting, key, value)) {
- nm_log_warn (LOGD_SETTINGS, "Unhandled setting property type (write) '%s/%s' : '%s'",
- setting_name, key, g_type_name (type));
- }
- } else if (G_VALUE_HOLDS_FLAGS (value)) {
- /* Flags are guint but GKeyFile has no uint reader, just uint64 */
- nm_keyfile_plugin_kf_set_uint64 (info->keyfile, setting_name, key, (guint64) g_value_get_flags (value));
- } else if (G_VALUE_HOLDS_ENUM (value))
- nm_keyfile_plugin_kf_set_integer (info->keyfile, setting_name, key, (gint) g_value_get_enum (value));
- else {
- nm_log_warn (LOGD_SETTINGS, "Unhandled setting property type (write) '%s/%s' : '%s'",
- setting_name, key, g_type_name (type));
+ } else {
+ /* scheme_func() returns UNKNOWN in all other cases. The only valid case
+ * where a scheme is allowed to be UNKNOWN, is unsetting the value. In this
+ * case, we don't expect the writer to be called, because the default value
+ * will not be serialized.
+ * The only other reason for the scheme to be UNKNOWN is an invalid cert.
+ * But our connection verifies, so that cannot happen either. */
+ g_return_if_reached ();
}
}
-static char *
-_writer_id_to_filename (const char *id)
+static gboolean
+_handler_write (NMConnection *connection,
+ GKeyFile *keyfile,
+ NMKeyfileWriteType type,
+ void *type_data,
+ void *user_data,
+ GError **error)
{
- char *filename, *f;
- const char *i = id;
-
- f = filename = g_malloc0 (strlen (id) + 1);
-
- /* Convert '/' to '*' */
- while (*i) {
- if (*i == '/')
- *f++ = '*';
- else
- *f++ = *i;
- i++;
+ if (type == NM_KEYFILE_WRITE_TYPE_CERT) {
+ cert_writer (connection, keyfile,
+ (NMKeyfileWriteTypeDataCert *) type_data,
+ (WriteInfo *) user_data, error);
+ return TRUE;
}
-
- return filename;
+ return FALSE;
}
static gboolean
@@ -811,12 +240,13 @@ _internal_write_connection (NMConnection *connection,
char *data;
gsize len;
gboolean success = FALSE;
- char *filename = NULL, *path;
+ char *path;
const char *id;
- WriteInfo info;
+ WriteInfo info = { 0 };
GError *local_err = NULL;
g_return_val_if_fail (!out_path || !*out_path, FALSE);
+ g_return_val_if_fail (keyfile_dir && keyfile_dir[0] == '/', FALSE);
if (!nm_connection_verify (connection, error))
g_return_val_if_reached (FALSE);
@@ -824,14 +254,15 @@ _internal_write_connection (NMConnection *connection,
id = nm_connection_get_id (connection);
g_assert (id && *id);
- info.keyfile = key_file = g_key_file_new ();
info.keyfile_dir = keyfile_dir;
- info.uuid = nm_connection_get_uuid (connection);
- g_assert (info.uuid);
- nm_connection_for_each_setting_value (connection, write_setting_value, &info);
+
+ key_file = nm_keyfile_write (connection, _handler_write, &info, error);
+ if (!key_file)
+ return FALSE;
data = g_key_file_to_data (key_file, &len, error);
+ g_key_file_unref (key_file);
if (!data)
- goto out;
+ return FALSE;
/* If we have existing file path, use it. Else generate one from
* connection's ID.
@@ -839,8 +270,10 @@ _internal_write_connection (NMConnection *connection,
if (existing_path != NULL) {
path = g_strdup (existing_path);
} else {
- filename = _writer_id_to_filename (id);
- path = g_build_filename (keyfile_dir, filename, NULL);
+ char *filename_escaped = nm_keyfile_plugin_utils_escape_filename (id);
+
+ path = g_build_filename (keyfile_dir, filename_escaped, NULL);
+ g_free (filename_escaped);
}
/* If a file with this path already exists (but isn't the existing path
@@ -850,24 +283,42 @@ _internal_write_connection (NMConnection *connection,
* there's a race here, but there's not a lot we can do about it, and
* we shouldn't get more than one connection with the same UUID either.
*/
- if (g_file_test (path, G_FILE_TEST_EXISTS) && (g_strcmp0 (path, existing_path) != 0)) {
- /* A keyfile with this connection's ID already exists. Pick another name. */
- g_free (path);
+ if (g_strcmp0 (path, existing_path) != 0 && g_file_test (path, G_FILE_TEST_EXISTS)) {
+ guint i;
+ gboolean name_found = FALSE;
- path = g_strdup_printf ("%s/%s-%s", keyfile_dir, filename, nm_connection_get_uuid (connection));
- if (g_file_test (path, G_FILE_TEST_EXISTS)) {
- if (existing_path == NULL || g_strcmp0 (path, existing_path) != 0) {
- /* This should not happen. But, it actually occurs when
- * two connections have the same UUID, and one of the connections
- * is edited to contain the same ID as the other one.
- * Give up.
- */
+ /* A keyfile with this connection's ID already exists. Pick another name. */
+ for (i = 0; i < 100; i++) {
+ char *filename, *filename_escaped;
+
+ if (i == 0)
+ filename = g_strdup_printf ("%s-%s", id, nm_connection_get_uuid (connection));
+ else
+ filename = g_strdup_printf ("%s-%s-%u", id, nm_connection_get_uuid (connection), i);
+
+ filename_escaped = nm_keyfile_plugin_utils_escape_filename (filename);
+
+ g_free (path);
+ path = g_strdup_printf ("%s/%s", keyfile_dir, filename_escaped);
+ g_free (filename);
+ g_free (filename_escaped);
+ if (g_strcmp0 (path, existing_path) == 0 || !g_file_test (path, G_FILE_TEST_EXISTS)) {
+ name_found = TRUE;
+ break;
+ }
+ }
+ if (!name_found) {
+ if (existing_path == NULL) {
+ /* this really should not happen, we tried hard to find an unused name... bail out. */
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
- "%s.%d: could not find suitable keyfile file name (%s already used)",
- __FILE__, __LINE__, path);
+ "could not find suitable keyfile file name (%s already used)", path);
g_free (path);
goto out;
}
+ /* Both our preferred path based on connection id and id-uuid are taken.
+ * Fallback to @existing_path */
+ g_free (path);
+ path = g_strdup (existing_path);
}
}
@@ -909,9 +360,7 @@ _internal_write_connection (NMConnection *connection,
g_free (path);
out:
- g_free (filename);
g_free (data);
- g_key_file_free (key_file);
return success;
}
diff --git a/src/settings/plugins/keyfile/writer.h b/src/settings/plugins/keyfile/writer.h
index a602f2f4a..8b08812d8 100644
--- a/src/settings/plugins/keyfile/writer.h
+++ b/src/settings/plugins/keyfile/writer.h
@@ -22,7 +22,6 @@
#ifndef _KEYFILE_PLUGIN_WRITER_H
#define _KEYFILE_PLUGIN_WRITER_H
-#include <sys/types.h>
#include <glib.h>
#include <nm-connection.h>
diff --git a/src/supplicant-manager/nm-call-store.c b/src/supplicant-manager/nm-call-store.c
deleted file mode 100644
index 6e910a96b..000000000
--- a/src/supplicant-manager/nm-call-store.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager -- Network link manager
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Copyright (C) 2007 Novell, Inc.
- * Copyright (C) 2010 Red Hat, Inc.
- */
-
-#include "config.h"
-
-#include "nm-call-store.h"
-#include "nm-logging.h"
-
-NMCallStore *
-nm_call_store_new (void)
-{
- /* Maps { DBusGProxy :: GHashTable { DBusGProxyCall :: NULL } } */
- return g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_hash_table_destroy);
-}
-
-static void
-proxy_destroyed_cb (gpointer data, GObject *proxy)
-{
- g_hash_table_remove ((NMCallStore *) data, proxy);
-}
-
-void
-nm_call_store_add (NMCallStore *store,
- DBusGProxy *proxy,
- DBusGProxyCall *call)
-{
- GHashTable *calls;
-
- g_return_if_fail (store != NULL);
- g_return_if_fail (proxy != NULL);
-
- if (!call) {
- /* Allow calling nm_call_store_add() with NULL @call for convenience.
- * This way you can pass the result of dbus_g_proxy_begin_call() directly
- * to nm_call_store_add() without checking for NULL. */
- return;
- }
-
- calls = g_hash_table_lookup (store, proxy);
- if (!calls) {
- calls = g_hash_table_new (NULL, NULL);
- g_hash_table_insert (store, proxy, calls);
- g_object_weak_ref (G_OBJECT (proxy), proxy_destroyed_cb, store);
- }
-
- g_hash_table_add (calls, call);
-}
-
-void
-nm_call_store_remove (NMCallStore *store,
- DBusGProxy *proxy,
- DBusGProxyCall *call)
-{
- GHashTable *calls;
-
- g_return_if_fail (store != NULL);
- g_return_if_fail (proxy != NULL);
- g_return_if_fail (call != NULL);
-
- calls = g_hash_table_lookup (store, proxy);
- if (!calls)
- return;
-
- g_hash_table_remove (calls, call);
- if (g_hash_table_size (calls) == 0) {
- g_hash_table_remove (store, proxy);
- g_object_weak_unref (G_OBJECT (proxy), proxy_destroyed_cb, store);
- }
-}
-
-void
-nm_call_store_clear (NMCallStore *store)
-{
- DBusGProxy *proxy;
- GHashTable *calls;
- GHashTableIter proxies_iter;
-
- g_return_if_fail (store != NULL);
-
- g_hash_table_iter_init (&proxies_iter, store);
- while (g_hash_table_iter_next (&proxies_iter, (gpointer) &proxy, (gpointer) &calls)) {
- GHashTableIter calls_iter;
- DBusGProxyCall *call;
-
- g_hash_table_iter_init (&calls_iter, calls);
- while (g_hash_table_iter_next (&calls_iter, (gpointer) &call, NULL)) {
- dbus_g_proxy_cancel_call (proxy, call);
- g_hash_table_iter_remove (&calls_iter);
- }
- g_object_weak_unref (G_OBJECT (proxy), proxy_destroyed_cb, store);
- g_hash_table_iter_remove (&proxies_iter);
- }
- g_assert_cmpint (g_hash_table_size (store), ==, 0);
-}
-
-void
-nm_call_store_destroy (NMCallStore *store)
-{
- g_return_if_fail (store);
- g_hash_table_destroy (store);
-}
diff --git a/src/supplicant-manager/nm-call-store.h b/src/supplicant-manager/nm-call-store.h
deleted file mode 100644
index bcee54cfb..000000000
--- a/src/supplicant-manager/nm-call-store.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-/* NetworkManager -- Network link manager
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * (C) Copyright 2007 Novell, Inc.
- */
-
-#ifndef __NETWORKMANAGER_CALLBACK_STORE_H__
-#define __NETWORKMANAGER_CALLBACK_STORE_H__
-
-#include <glib-object.h>
-#include <dbus/dbus-glib.h>
-
-typedef GHashTable NMCallStore;
-
-NMCallStore *nm_call_store_new (void);
-void nm_call_store_add (NMCallStore *store,
- DBusGProxy *proxy,
- DBusGProxyCall *call);
-
-void nm_call_store_remove (NMCallStore *store,
- DBusGProxy *proxy,
- DBusGProxyCall *call);
-
-void nm_call_store_clear (NMCallStore *store);
-void nm_call_store_destroy (NMCallStore *store);
-
-#endif /* __NETWORKMANAGER_CALLBACK_STORE_H__ */
diff --git a/src/supplicant-manager/nm-supplicant-config.c b/src/supplicant-manager/nm-supplicant-config.c
index c60027ada..b78a24d03 100644
--- a/src/supplicant-manager/nm-supplicant-config.c
+++ b/src/supplicant-manager/nm-supplicant-config.c
@@ -260,65 +260,44 @@ nm_supplicant_config_fast_required (NMSupplicantConfig *self)
return NM_SUPPLICANT_CONFIG_GET_PRIVATE (self)->fast_required;
}
-static void
-get_hash_cb (gpointer key, gpointer value, gpointer user_data)
-{
- ConfigOption *opt = (ConfigOption *) value;
- GValue *variant;
- GByteArray *array;
-
- variant = g_slice_new0 (GValue);
-
- switch (opt->type) {
- case TYPE_INT:
- g_value_init (variant, G_TYPE_INT);
- g_value_set_int (variant, atoi (opt->value));
- break;
- case TYPE_BYTES:
- case TYPE_UTF8:
- array = g_byte_array_sized_new (opt->len);
- g_byte_array_append (array, (const guint8 *) opt->value, opt->len);
- g_value_init (variant, DBUS_TYPE_G_UCHAR_ARRAY);
- g_value_set_boxed (variant, array);
- g_byte_array_free (array, TRUE);
- break;
- case TYPE_KEYWORD:
- case TYPE_STRING:
- g_value_init (variant, G_TYPE_STRING);
- g_value_set_string (variant, opt->value);
- break;
- default:
- g_slice_free (GValue, variant);
- return;
- }
-
- g_hash_table_insert ((GHashTable *) user_data, g_strdup (key), variant);
-}
-
-static void
-destroy_hash_value (gpointer data)
-{
- GValue *value = (GValue *) data;
-
- g_value_unset (value);
- g_slice_free (GValue, value);
-}
-
-GHashTable *
-nm_supplicant_config_get_hash (NMSupplicantConfig * self)
+GVariant *
+nm_supplicant_config_to_variant (NMSupplicantConfig *self)
{
NMSupplicantConfigPrivate *priv;
- GHashTable *hash;
+ GVariantBuilder builder;
+ GHashTableIter iter;
+ ConfigOption *option;
+ const char *key;
g_return_val_if_fail (NM_IS_SUPPLICANT_CONFIG (self), NULL);
- hash = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- destroy_hash_value);
-
priv = NM_SUPPLICANT_CONFIG_GET_PRIVATE (self);
- g_hash_table_foreach (priv->config, get_hash_cb, hash);
- return hash;
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+
+ g_hash_table_iter_init (&iter, priv->config);
+ while (g_hash_table_iter_next (&iter, (gpointer) &key, (gpointer) &option)) {
+ switch (option->type) {
+ case TYPE_INT:
+ g_variant_builder_add (&builder, "{sv}", key, g_variant_new_int32 (atoi (option->value)));
+ break;
+ case TYPE_BYTES:
+ case TYPE_UTF8:
+ g_variant_builder_add (&builder, "{sv}",
+ key,
+ g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+ option->value, option->len, 1));
+ break;
+ case TYPE_KEYWORD:
+ case TYPE_STRING:
+ g_variant_builder_add (&builder, "{sv}", key, g_variant_new_string (option->value));
+ break;
+ default:
+ break;
+ }
+ }
+
+ return g_variant_builder_end (&builder);
}
GHashTable *
@@ -754,6 +733,7 @@ nm_supplicant_config_add_setting_8021x (NMSupplicantConfig *self,
gboolean fast = FALSE;
guint32 i, num_eap;
gboolean fast_provisoning_allowed = FALSE;
+ const char *ca_path_override = NULL, *ca_cert_override = NULL;
g_return_val_if_fail (NM_IS_SUPPLICANT_CONFIG (self), FALSE);
g_return_val_if_fail (setting != NULL, FALSE);
@@ -891,10 +871,18 @@ nm_supplicant_config_add_setting_8021x (NMSupplicantConfig *self,
}
}
+ /* If user wants to use system CA certs, either populate ca_path (if the path
+ * is a directory) or ca_cert (the path is a file name) */
+ if (nm_setting_802_1x_get_system_ca_certs (setting)) {
+ if (g_file_test (SYSTEM_CA_PATH, G_FILE_TEST_IS_DIR))
+ ca_path_override = SYSTEM_CA_PATH;
+ else
+ ca_cert_override = SYSTEM_CA_PATH;
+ }
+
/* CA path */
path = nm_setting_802_1x_get_ca_path (setting);
- if (nm_setting_802_1x_get_system_ca_certs (setting))
- path = SYSTEM_CA_PATH;
+ path = ca_path_override ? ca_path_override : path;
if (path) {
if (!add_string_val (self, path, "ca_path", FALSE, FALSE))
return FALSE;
@@ -902,41 +890,50 @@ nm_supplicant_config_add_setting_8021x (NMSupplicantConfig *self,
/* Phase2 CA path */
path = nm_setting_802_1x_get_phase2_ca_path (setting);
- if (nm_setting_802_1x_get_system_ca_certs (setting))
- path = SYSTEM_CA_PATH;
+ path = ca_path_override ? ca_path_override : path;
if (path) {
if (!add_string_val (self, path, "ca_path2", FALSE, FALSE))
return FALSE;
}
/* CA certificate */
- switch (nm_setting_802_1x_get_ca_cert_scheme (setting)) {
- case NM_SETTING_802_1X_CK_SCHEME_BLOB:
- bytes = nm_setting_802_1x_get_ca_cert_blob (setting);
- ADD_BLOB_VAL (bytes, "ca_cert", con_uuid);
- break;
- case NM_SETTING_802_1X_CK_SCHEME_PATH:
- path = nm_setting_802_1x_get_ca_cert_path (setting);
- if (!add_string_val (self, path, "ca_cert", FALSE, FALSE))
+ if (ca_cert_override) {
+ if (!add_string_val (self, ca_cert_override, "ca_cert", FALSE, FALSE))
return FALSE;
- break;
- default:
- break;
+ } else {
+ switch (nm_setting_802_1x_get_ca_cert_scheme (setting)) {
+ case NM_SETTING_802_1X_CK_SCHEME_BLOB:
+ bytes = nm_setting_802_1x_get_ca_cert_blob (setting);
+ ADD_BLOB_VAL (bytes, "ca_cert", con_uuid);
+ break;
+ case NM_SETTING_802_1X_CK_SCHEME_PATH:
+ path = nm_setting_802_1x_get_ca_cert_path (setting);
+ if (!add_string_val (self, path, "ca_cert", FALSE, FALSE))
+ return FALSE;
+ break;
+ default:
+ break;
+ }
}
/* Phase 2 CA certificate */
- switch (nm_setting_802_1x_get_phase2_ca_cert_scheme (setting)) {
- case NM_SETTING_802_1X_CK_SCHEME_BLOB:
- bytes = nm_setting_802_1x_get_phase2_ca_cert_blob (setting);
- ADD_BLOB_VAL (bytes, "ca_cert2", con_uuid);
- break;
- case NM_SETTING_802_1X_CK_SCHEME_PATH:
- path = nm_setting_802_1x_get_phase2_ca_cert_path (setting);
- if (!add_string_val (self, path, "ca_cert2", FALSE, FALSE))
+ if (ca_cert_override) {
+ if (!add_string_val (self, ca_cert_override, "ca_cert2", FALSE, FALSE))
return FALSE;
- break;
- default:
- break;
+ } else {
+ switch (nm_setting_802_1x_get_phase2_ca_cert_scheme (setting)) {
+ case NM_SETTING_802_1X_CK_SCHEME_BLOB:
+ bytes = nm_setting_802_1x_get_phase2_ca_cert_blob (setting);
+ ADD_BLOB_VAL (bytes, "ca_cert2", con_uuid);
+ break;
+ case NM_SETTING_802_1X_CK_SCHEME_PATH:
+ path = nm_setting_802_1x_get_phase2_ca_cert_path (setting);
+ if (!add_string_val (self, path, "ca_cert2", FALSE, FALSE))
+ return FALSE;
+ break;
+ default:
+ break;
+ }
}
/* Subject match */
diff --git a/src/supplicant-manager/nm-supplicant-config.h b/src/supplicant-manager/nm-supplicant-config.h
index 482e3545b..3324f637f 100644
--- a/src/supplicant-manager/nm-supplicant-config.h
+++ b/src/supplicant-manager/nm-supplicant-config.h
@@ -59,7 +59,7 @@ void nm_supplicant_config_set_ap_scan (NMSupplicantConfig *self,
gboolean nm_supplicant_config_fast_required (NMSupplicantConfig *self);
-GHashTable *nm_supplicant_config_get_hash (NMSupplicantConfig *self);
+GVariant *nm_supplicant_config_to_variant (NMSupplicantConfig *self);
GHashTable *nm_supplicant_config_get_blobs (NMSupplicantConfig *self);
diff --git a/src/supplicant-manager/nm-supplicant-interface.c b/src/supplicant-manager/nm-supplicant-interface.c
index 02b82b7ee..e9775a199 100644
--- a/src/supplicant-manager/nm-supplicant-interface.c
+++ b/src/supplicant-manager/nm-supplicant-interface.c
@@ -27,13 +27,11 @@
#include "NetworkManagerUtils.h"
#include "nm-supplicant-interface.h"
-#include "nm-supplicant-manager.h"
#include "nm-logging.h"
#include "nm-supplicant-config.h"
-#include "nm-dbus-manager.h"
-#include "nm-call-store.h"
-#include "nm-dbus-glib-types.h"
#include "nm-glib-compat.h"
+#include "gsystem-local-alloc.h"
+#include "nm-core-internal.h"
#define WPAS_DBUS_IFACE_INTERFACE WPAS_DBUS_INTERFACE ".Interface"
#define WPAS_DBUS_IFACE_BSS WPAS_DBUS_INTERFACE ".BSS"
@@ -43,16 +41,6 @@
G_DEFINE_TYPE (NMSupplicantInterface, nm_supplicant_interface, G_TYPE_OBJECT)
-static void wpas_iface_properties_changed (DBusGProxy *proxy,
- GHashTable *props,
- gpointer user_data);
-
-static void wpas_iface_scan_done (DBusGProxy *proxy,
- gboolean success,
- gpointer user_data);
-
-static void wpas_iface_get_props (NMSupplicantInterface *self);
-
#define NM_SUPPLICANT_INTERFACE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
NM_TYPE_SUPPLICANT_INTERFACE, \
NMSupplicantInterfacePrivate))
@@ -81,89 +69,53 @@ enum {
typedef struct {
- NMSupplicantManager * smgr;
- gulong smgr_avail_id;
- NMDBusManager * dbus_mgr;
- char * dev;
- gboolean is_wireless;
- gboolean has_credreq; /* Whether querying 802.1x credentials is supported */
- ApSupport ap_support; /* Lightweight AP mode support */
- gboolean fast_supported;
- guint32 max_scan_ssids;
- guint32 ready_count;
-
- char * object_path;
- guint32 state;
- int disconnect_reason;
- NMCallStore * assoc_pcalls;
- NMCallStore * other_pcalls;
-
- gboolean scanning;
-
- DBusGProxy * wpas_proxy;
- DBusGProxy * introspect_proxy;
- DBusGProxy * iface_proxy;
- DBusGProxy * props_proxy;
- char * net_path;
- guint32 blobs_left;
- GHashTable * bss_proxies;
-
- gint32 last_scan; /* timestamp as returned by nm_utils_get_monotonic_timestamp_s() */
-
- NMSupplicantConfig * cfg;
-
- gboolean disposed;
+ char * dev;
+ gboolean is_wireless;
+ gboolean has_credreq; /* Whether querying 802.1x credentials is supported */
+ ApSupport ap_support; /* Lightweight AP mode support */
+ gboolean fast_supported;
+ guint32 max_scan_ssids;
+ guint32 ready_count;
+
+ char * object_path;
+ guint32 state;
+ int disconnect_reason;
+
+ gboolean scanning;
+
+ GDBusProxy * wpas_proxy;
+ GCancellable * init_cancellable;
+ GDBusProxy * iface_proxy;
+ GCancellable * other_cancellable;
+ GCancellable * assoc_cancellable;
+ char * net_path;
+ guint32 blobs_left;
+ GHashTable * bss_proxies;
+
+ gint32 last_scan; /* timestamp as returned by nm_utils_get_monotonic_timestamp_s() */
+
+ NMSupplicantConfig *cfg;
} NMSupplicantInterfacePrivate;
-static void
-emit_error_helper (NMSupplicantInterface *self,
- GError *err)
-{
- const char *name = NULL;
-
- if (err->domain == DBUS_GERROR && err->code == DBUS_GERROR_REMOTE_EXCEPTION)
- name = dbus_g_error_get_name (err);
-
- g_signal_emit (self, signals[CONNECTION_ERROR], 0, name, err->message);
-}
+/***************************************************************/
static void
-signal_new_bss (NMSupplicantInterface *self,
- const char *object_path,
- GHashTable *props)
+emit_error_helper (NMSupplicantInterface *self, GError *error)
{
- g_signal_emit (self, signals[NEW_BSS], 0, object_path, props);
-}
+ char *name = NULL;
-static void
-bssid_properties_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *error = NULL;
- GHashTable *props = NULL;
-
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if (dbus_g_proxy_end_call (proxy, call_id, &error,
- DBUS_TYPE_G_MAP_OF_VARIANT, &props,
- G_TYPE_INVALID)) {
- signal_new_bss (self, dbus_g_proxy_get_path (proxy), props);
- g_hash_table_destroy (props);
- } else {
- if (!strstr (error->message, "The BSSID requested was invalid")) {
- nm_log_warn (LOGD_SUPPLICANT, "Couldn't retrieve BSSID properties: %s.",
- error->message);
- }
- g_error_free (error);
- }
+ if (g_dbus_error_is_remote_error (error))
+ name = g_dbus_error_get_remote_error (error);
+
+ g_signal_emit (self, signals[CONNECTION_ERROR], 0, name, error->message);
+ g_free (name);
}
static void
-bss_properties_changed (DBusGProxy *proxy,
- const char *interface,
- GHashTable *props,
- const char **unused,
- gpointer user_data)
+bss_props_changed_cb (GDBusProxy *proxy,
+ GVariant *changed_properties,
+ char **invalidated_properties,
+ gpointer user_data)
{
NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
@@ -171,111 +123,77 @@ bss_properties_changed (DBusGProxy *proxy,
if (priv->scanning)
priv->last_scan = nm_utils_get_monotonic_timestamp_s ();
- if (g_strcmp0 (interface, WPAS_DBUS_IFACE_BSS) == 0)
- g_signal_emit (self, signals[BSS_UPDATED], 0, dbus_g_proxy_get_path (proxy), props);
+ g_signal_emit (self, signals[BSS_UPDATED], 0,
+ g_dbus_proxy_get_object_path (proxy),
+ changed_properties);
}
static void
-handle_new_bss (NMSupplicantInterface *self,
- const char *object_path,
- GHashTable *props)
+on_bss_proxy_acquired (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxy *bss_proxy;
- DBusGProxyCall *call;
-
- g_return_if_fail (object_path != NULL);
-
- if (g_hash_table_lookup (priv->bss_proxies, object_path))
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_free_error GError *error = NULL;
+ gs_strfreev char **properties = NULL;
+ gs_unref_variant GVariant *props = NULL;
+ GVariantBuilder builder;
+ char **iter;
+
+ if (!g_async_initable_init_finish (G_ASYNC_INITABLE (proxy), result, &error)) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ nm_log_dbg (LOGD_SUPPLICANT, "Failed to acquire BSS proxy: (%s)", error->message);
+ g_hash_table_remove (NM_SUPPLICANT_INTERFACE_GET_PRIVATE (user_data)->bss_proxies,
+ g_dbus_proxy_get_object_path (proxy));
+ }
return;
+ }
- bss_proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
- WPAS_DBUS_SERVICE,
- object_path,
- DBUS_INTERFACE_PROPERTIES);
- g_hash_table_insert (priv->bss_proxies,
- (gpointer) dbus_g_proxy_get_path (bss_proxy),
- bss_proxy);
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- /* Standard D-Bus PropertiesChanged signal */
- dbus_g_object_register_marshaller (g_cclosure_marshal_generic,
- G_TYPE_NONE,
- G_TYPE_STRING, DBUS_TYPE_G_MAP_OF_VARIANT, G_TYPE_STRV,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal (bss_proxy, "PropertiesChanged",
- G_TYPE_STRING, DBUS_TYPE_G_MAP_OF_VARIANT, G_TYPE_STRV,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (bss_proxy, "PropertiesChanged",
- G_CALLBACK (bss_properties_changed),
- self, NULL);
-
- if (props) {
- signal_new_bss (self, object_path, props);
- } else {
- call = dbus_g_proxy_begin_call (bss_proxy, "GetAll",
- bssid_properties_cb,
- self,
- NULL,
- G_TYPE_STRING, WPAS_DBUS_IFACE_BSS,
- G_TYPE_INVALID);
- nm_call_store_add (priv->other_pcalls, bss_proxy, call);
- }
-}
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
-static void
-wpas_iface_bss_added (DBusGProxy *proxy,
- const char *object_path,
- GHashTable *props,
- gpointer user_data)
-{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+ iter = properties = g_dbus_proxy_get_cached_property_names (proxy);
+ while (*iter) {
+ GVariant *copy = g_dbus_proxy_get_cached_property (proxy, *iter);
- if (priv->scanning)
- priv->last_scan = nm_utils_get_monotonic_timestamp_s ();
+ g_variant_builder_add (&builder, "{sv}", *iter++, copy);
+ g_variant_unref (copy);
+ }
- handle_new_bss (self, object_path, props);
+ props = g_variant_builder_end (&builder);
+ g_signal_emit (self, signals[NEW_BSS], 0,
+ g_dbus_proxy_get_object_path (proxy),
+ g_variant_ref_sink (props));
}
static void
-wpas_iface_bss_removed (DBusGProxy *proxy,
- const char *object_path,
- gpointer user_data)
+handle_new_bss (NMSupplicantInterface *self, const char *object_path)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+ GDBusProxy *bss_proxy;
- g_signal_emit (self, signals[BSS_REMOVED], 0, object_path);
-
- g_hash_table_remove (priv->bss_proxies, object_path);
-}
+ g_return_if_fail (object_path != NULL);
-static int
-wpas_state_string_to_enum (const char *str_state)
-{
- if (!strcmp (str_state, "interface_disabled"))
- return NM_SUPPLICANT_INTERFACE_STATE_DISABLED;
- else if (!strcmp (str_state, "disconnected"))
- return NM_SUPPLICANT_INTERFACE_STATE_DISCONNECTED;
- else if (!strcmp (str_state, "inactive"))
- return NM_SUPPLICANT_INTERFACE_STATE_INACTIVE;
- else if (!strcmp (str_state, "scanning"))
- return NM_SUPPLICANT_INTERFACE_STATE_SCANNING;
- else if (!strcmp (str_state, "authenticating"))
- return NM_SUPPLICANT_INTERFACE_STATE_AUTHENTICATING;
- else if (!strcmp (str_state, "associating"))
- return NM_SUPPLICANT_INTERFACE_STATE_ASSOCIATING;
- else if (!strcmp (str_state, "associated"))
- return NM_SUPPLICANT_INTERFACE_STATE_ASSOCIATED;
- else if (!strcmp (str_state, "4way_handshake"))
- return NM_SUPPLICANT_INTERFACE_STATE_4WAY_HANDSHAKE;
- else if (!strcmp (str_state, "group_handshake"))
- return NM_SUPPLICANT_INTERFACE_STATE_GROUP_HANDSHAKE;
- else if (!strcmp (str_state, "completed"))
- return NM_SUPPLICANT_INTERFACE_STATE_COMPLETED;
+ if (g_hash_table_lookup (priv->bss_proxies, object_path))
+ return;
- nm_log_warn (LOGD_SUPPLICANT, "Unknown supplicant state '%s'", str_state);
- return -1;
+ bss_proxy = g_object_new (G_TYPE_DBUS_PROXY,
+ "g-bus-type", G_BUS_TYPE_SYSTEM,
+ "g-flags", G_DBUS_PROXY_FLAGS_NONE,
+ "g-name", WPAS_DBUS_SERVICE,
+ "g-object-path", object_path,
+ "g-interface-name", WPAS_DBUS_IFACE_BSS,
+ NULL);
+ g_hash_table_insert (priv->bss_proxies,
+ (char *) g_dbus_proxy_get_object_path (bss_proxy),
+ bss_proxy);
+ g_signal_connect (bss_proxy, "g-properties-changed", G_CALLBACK (bss_props_changed_cb), self);
+ g_async_initable_init_async (G_ASYNC_INITABLE (bss_proxy),
+ G_PRIORITY_DEFAULT,
+ priv->other_cancellable,
+ (GAsyncReadyCallback) on_bss_proxy_acquired,
+ self);
}
static void
@@ -297,39 +215,23 @@ set_state (NMSupplicantInterface *self, guint32 new_state)
g_return_if_fail (new_state > NM_SUPPLICANT_INTERFACE_STATE_READY);
if (new_state == NM_SUPPLICANT_INTERFACE_STATE_READY) {
- /* Get properties again to update to the actual wpa_supplicant
- * interface state.
- */
- wpas_iface_get_props (self);
- } else if (new_state == NM_SUPPLICANT_INTERFACE_STATE_DOWN) {
- /* Cancel all pending calls when going down */
- nm_call_store_clear (priv->other_pcalls);
- nm_call_store_clear (priv->assoc_pcalls);
-
- /* Disconnect supplicant manager state listeners since we're done */
- if (priv->smgr_avail_id) {
- g_signal_handler_disconnect (priv->smgr, priv->smgr_avail_id);
- priv->smgr_avail_id = 0;
+ if (priv->other_cancellable) {
+ g_warn_if_fail (priv->other_cancellable == NULL);
+ g_cancellable_cancel (priv->other_cancellable);
+ g_clear_object (&priv->other_cancellable);
}
+ priv->other_cancellable = g_cancellable_new ();
+ } else if (new_state == NM_SUPPLICANT_INTERFACE_STATE_DOWN) {
+ if (priv->init_cancellable)
+ g_cancellable_cancel (priv->init_cancellable);
+ g_clear_object (&priv->init_cancellable);
- if (priv->iface_proxy) {
- dbus_g_proxy_disconnect_signal (priv->iface_proxy,
- "PropertiesChanged",
- G_CALLBACK (wpas_iface_properties_changed),
- self);
- dbus_g_proxy_disconnect_signal (priv->iface_proxy,
- "ScanDone",
- G_CALLBACK (wpas_iface_scan_done),
- self);
- dbus_g_proxy_disconnect_signal (priv->iface_proxy,
- "BSSAdded",
- G_CALLBACK (wpas_iface_bss_added),
- self);
- dbus_g_proxy_disconnect_signal (priv->iface_proxy,
- "BSSRemoved",
- G_CALLBACK (wpas_iface_bss_removed),
- self);
- }
+ if (priv->other_cancellable)
+ g_cancellable_cancel (priv->other_cancellable);
+ g_clear_object (&priv->other_cancellable);
+
+ if (priv->iface_proxy)
+ g_signal_handlers_disconnect_by_data (priv->iface_proxy, self);
}
priv->state = new_state;
@@ -348,6 +250,34 @@ set_state (NMSupplicantInterface *self, guint32 new_state)
priv->disconnect_reason);
}
+static int
+wpas_state_string_to_enum (const char *str_state)
+{
+ if (!strcmp (str_state, "interface_disabled"))
+ return NM_SUPPLICANT_INTERFACE_STATE_DISABLED;
+ else if (!strcmp (str_state, "disconnected"))
+ return NM_SUPPLICANT_INTERFACE_STATE_DISCONNECTED;
+ else if (!strcmp (str_state, "inactive"))
+ return NM_SUPPLICANT_INTERFACE_STATE_INACTIVE;
+ else if (!strcmp (str_state, "scanning"))
+ return NM_SUPPLICANT_INTERFACE_STATE_SCANNING;
+ else if (!strcmp (str_state, "authenticating"))
+ return NM_SUPPLICANT_INTERFACE_STATE_AUTHENTICATING;
+ else if (!strcmp (str_state, "associating"))
+ return NM_SUPPLICANT_INTERFACE_STATE_ASSOCIATING;
+ else if (!strcmp (str_state, "associated"))
+ return NM_SUPPLICANT_INTERFACE_STATE_ASSOCIATED;
+ else if (!strcmp (str_state, "4way_handshake"))
+ return NM_SUPPLICANT_INTERFACE_STATE_4WAY_HANDSHAKE;
+ else if (!strcmp (str_state, "group_handshake"))
+ return NM_SUPPLICANT_INTERFACE_STATE_GROUP_HANDSHAKE;
+ else if (!strcmp (str_state, "completed"))
+ return NM_SUPPLICANT_INTERFACE_STATE_COMPLETED;
+
+ nm_log_warn (LOGD_SUPPLICANT, "Unknown supplicant state '%s'", str_state);
+ return -1;
+}
+
static void
set_state_from_string (NMSupplicantInterface *self, const char *new_state)
{
@@ -396,107 +326,36 @@ nm_supplicant_interface_get_last_scan_time (NMSupplicantInterface *self)
return NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self)->last_scan;
}
-static void
-wpas_iface_scan_done (DBusGProxy *proxy,
- gboolean success,
- gpointer user_data)
-{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
-
- /* Cache last scan completed time */
- priv->last_scan = nm_utils_get_monotonic_timestamp_s ();
- g_signal_emit (self, signals[SCAN_DONE], 0, success);
-}
+#define MATCH_PROPERTY(p, n, v, t) (!strcmp (p, n) && g_variant_is_of_type (v, t))
static void
-parse_capabilities (NMSupplicantInterface *self, GHashTable *props)
+parse_capabilities (NMSupplicantInterface *self, GVariant *capabilities)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GValue *value;
gboolean have_active = FALSE, have_ssid = FALSE;
+ gint32 max_scan_ssids = -1;
+ const char **array;
- g_return_if_fail (props != NULL);
-
- value = g_hash_table_lookup (props, "Scan");
- if (value && G_VALUE_HOLDS (value, G_TYPE_STRV)) {
- const char **vals = g_value_get_boxed (value);
- const char **iter = vals;
+ g_return_if_fail (capabilities && g_variant_is_of_type (capabilities, G_VARIANT_TYPE_VARDICT));
- while (iter && *iter && (!have_active || !have_ssid)) {
- if (g_strcmp0 (*iter, "active") == 0)
- have_active = TRUE;
- else if (g_strcmp0 (*iter, "ssid") == 0)
- have_ssid = TRUE;
- iter++;
- }
+ if (g_variant_lookup (capabilities, "Scan", "^a&s", &array)) {
+ if (_nm_utils_string_in_list ("active", array))
+ have_active = TRUE;
+ if (_nm_utils_string_in_list ("ssid", array))
+ have_ssid = TRUE;
+ g_free (array);
}
- value = g_hash_table_lookup (props, "MaxScanSSID");
- if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) {
+ if (g_variant_lookup (capabilities, "MaxScanSSID", "i", &max_scan_ssids)) {
/* We need active scan and SSID probe capabilities to care about MaxScanSSIDs */
- if (have_active && have_ssid) {
+ if (max_scan_ssids > 0 && have_active && have_ssid) {
/* wpa_supplicant's WPAS_MAX_SCAN_SSIDS value is 16, but for speed
* and to ensure we don't disclose too many SSIDs from the hidden
* list, we'll limit to 5.
*/
- priv->max_scan_ssids = CLAMP (g_value_get_int (value), 0, 5);
+ priv->max_scan_ssids = CLAMP (max_scan_ssids, 0, 5);
nm_log_info (LOGD_SUPPLICANT, "(%s) supports %d scan SSIDs",
- priv->dev, priv->max_scan_ssids);
- }
- }
-}
-
-static void
-wpas_iface_properties_changed (DBusGProxy *proxy,
- GHashTable *props,
- gpointer user_data)
-{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GValue *value;
-
- value = g_hash_table_lookup (props, "Scanning");
- if (value && G_VALUE_HOLDS_BOOLEAN (value))
- set_scanning (self, g_value_get_boolean (value));
-
- value = g_hash_table_lookup (props, "State");
- if (value && G_VALUE_HOLDS_STRING (value)) {
- if (priv->state >= NM_SUPPLICANT_INTERFACE_STATE_READY) {
- /* Only transition to actual wpa_supplicant interface states (ie,
- * anything > READY) after the NMSupplicantInterface has had a
- * chance to initialize, which is signalled by entering the READY
- * state.
- */
- set_state_from_string (self, g_value_get_string (value));
- }
- }
-
- value = g_hash_table_lookup (props, "BSSs");
- if (value && G_VALUE_HOLDS (value, DBUS_TYPE_G_ARRAY_OF_OBJECT_PATH)) {
- GPtrArray *paths = g_value_get_boxed (value);
- int i;
-
- for (i = 0; paths && (i < paths->len); i++)
- handle_new_bss (self, g_ptr_array_index (paths, i), NULL);
- }
-
- value = g_hash_table_lookup (props, "Capabilities");
- if (value && G_VALUE_HOLDS (value, DBUS_TYPE_G_MAP_OF_VARIANT))
- parse_capabilities (self, g_value_get_boxed (value));
-
- /* Disconnect reason is currently only given for deauthentication events,
- * not disassociation; currently they are IEEE 802.11 "reason codes",
- * defined by (IEEE 802.11-2007, 7.3.1.7, Table 7-22). Any locally caused
- * deauthentication will be negative, while authentications caused by the
- * AP will be positive.
- */
- value = g_hash_table_lookup (props, "DisconnectReason");
- if (value && G_VALUE_HOLDS (value, G_TYPE_INT)) {
- priv->disconnect_reason = g_value_get_int (value);
- if (priv->disconnect_reason != 0) {
- nm_log_warn (LOGD_SUPPLICANT, "Connection disconnected (reason %d)",
- priv->disconnect_reason);
+ priv->dev, priv->max_scan_ssids);
}
}
}
@@ -513,43 +372,6 @@ iface_check_ready (NMSupplicantInterface *self)
}
}
-static void
-iface_get_props_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GHashTable *props = NULL;
- GError *error = NULL;
-
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if (dbus_g_proxy_end_call (proxy, call_id, &error,
- DBUS_TYPE_G_MAP_OF_VARIANT, &props,
- G_TYPE_INVALID)) {
- wpas_iface_properties_changed (NULL, props, self);
- g_hash_table_destroy (props);
- } else {
- nm_log_warn (LOGD_SUPPLICANT, "could not get interface properties: %s.",
- error && error->message ? error->message : "(unknown)");
- g_clear_error (&error);
- }
- iface_check_ready (self);
-}
-
-static void
-wpas_iface_get_props (NMSupplicantInterface *self)
-{
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxyCall *call;
-
- call = dbus_g_proxy_begin_call (priv->props_proxy, "GetAll",
- iface_get_props_cb,
- self,
- NULL,
- G_TYPE_STRING, WPAS_DBUS_IFACE_INTERFACE,
- G_TYPE_INVALID);
- nm_call_store_add (priv->other_pcalls, priv->props_proxy, call);
-}
-
gboolean
nm_supplicant_interface_credentials_reply (NMSupplicantInterface *self,
const char *field,
@@ -557,6 +379,7 @@ nm_supplicant_interface_credentials_reply (NMSupplicantInterface *self,
GError **error)
{
NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *reply = NULL;
g_return_val_if_fail (NM_IS_SUPPLICANT_INTERFACE (self), FALSE);
g_return_val_if_fail (field != NULL, FALSE);
@@ -567,74 +390,62 @@ nm_supplicant_interface_credentials_reply (NMSupplicantInterface *self,
/* Need a network block object path */
g_return_val_if_fail (priv->net_path, FALSE);
- return dbus_g_proxy_call_with_timeout (priv->iface_proxy, "NetworkReply",
- 5000,
- error,
- DBUS_TYPE_G_OBJECT_PATH, priv->net_path,
- G_TYPE_STRING, field,
- G_TYPE_STRING, value,
- G_TYPE_INVALID);
+ reply = g_dbus_proxy_call_sync (priv->iface_proxy,
+ "NetworkReply",
+ g_variant_new ("(oss)",
+ priv->net_path,
+ field,
+ value),
+ G_DBUS_CALL_FLAGS_NONE,
+ 5000,
+ NULL,
+ error);
+ /* reply will be unrefed when function exits */
+ return !!reply;
}
-static void
-wpas_iface_network_request (DBusGProxy *proxy,
- const char *object_path,
- const char *field,
- const char *message,
- gpointer user_data)
+static gboolean
+_dbus_error_has_name (GError *error, const char *dbus_error_name)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
-
- g_return_if_fail (priv->has_credreq == TRUE);
- g_return_if_fail (priv->net_path != NULL);
- g_return_if_fail (g_strcmp0 (object_path, priv->net_path) == 0);
+ gs_free char *error_name = NULL;
+ gboolean is_error = FALSE;
- g_signal_emit (self, signals[CREDENTIALS_REQUEST], 0, field, message);
+ if (error && g_dbus_error_is_remote_error (error)) {
+ error_name = g_dbus_error_get_remote_error (error);
+ is_error = !g_strcmp0 (error_name, dbus_error_name);
+ }
+ return is_error;
}
static void
-iface_check_netreply_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+iface_check_netreply_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *error = NULL;
-
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if ( dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)
- || dbus_g_error_has_name (error, "fi.w1.wpa_supplicant1.InvalidArgs")) {
- /* We know NetworkReply is supported if the NetworkReply method returned
- * successfully (which is unexpected since we sent a bogus network
- * object path) or if we got an "InvalidArgs" (which indicates NetworkReply
- * is supported). We know it's not supported if we get an
- * "UnknownMethod" error.
- */
- priv->has_credreq = TRUE;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *variant = NULL;
+ gs_free_error GError *error = NULL;
+
+ /* We know NetworkReply is supported if the NetworkReply method returned
+ * successfully (which is unexpected since we sent a bogus network
+ * object path) or if we got an "InvalidArgs" (which indicates NetworkReply
+ * is supported). We know it's not supported if we get an
+ * "UnknownMethod" error.
+ */
- nm_log_dbg (LOGD_SUPPLICANT, "Supplicant %s network credentials requests",
- priv->has_credreq ? "supports" : "does not support");
- }
- g_clear_error (&error);
+ variant = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
- iface_check_ready (self);
-}
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
-static void
-wpas_iface_check_network_reply (NMSupplicantInterface *self)
-{
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxyCall *call;
+ if (variant || _dbus_error_has_name (error, "fi.w1.wpa_supplicant1.InvalidArgs"))
+ priv->has_credreq = TRUE;
- priv->ready_count++;
- call = dbus_g_proxy_begin_call (priv->iface_proxy, "NetworkReply",
- iface_check_netreply_cb,
- self,
- NULL,
- DBUS_TYPE_G_OBJECT_PATH, "/foobaraasdfasdf",
- G_TYPE_STRING, "foobar",
- G_TYPE_STRING, "foobar",
- G_TYPE_INVALID);
- nm_call_store_add (priv->other_pcalls, priv->iface_proxy, call);
+ nm_log_dbg (LOGD_SUPPLICANT, "Supplicant %s network credentials requests",
+ priv->has_credreq ? "supports" : "does not support");
+
+ iface_check_ready (self);
}
ApSupport
@@ -657,207 +468,271 @@ nm_supplicant_interface_set_ap_support (NMSupplicantInterface *self,
}
static void
-iface_check_ap_mode_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+iface_check_ap_mode_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- char *data;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *variant = NULL;
+ gs_free_error GError *error = NULL;
+ const char *data;
/* The ProbeRequest method only exists if AP mode has been enabled */
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if (dbus_g_proxy_end_call (proxy, call_id, NULL,
- G_TYPE_STRING,
- &data,
- G_TYPE_INVALID)) {
- if (data && strstr (data, "ProbeRequest"))
+ variant = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+
+ if (variant && g_variant_is_of_type (variant, G_VARIANT_TYPE ("(s)"))) {
+ g_variant_get (variant, "(&s)", &data);
+ if (strstr (data, "ProbeRequest"))
priv->ap_support = AP_SUPPORT_YES;
- g_free (data);
}
iface_check_ready (self);
}
+#define MATCH_SIGNAL(s, n, v, t) (!strcmp (s, n) && g_variant_is_of_type (v, t))
+
static void
-wpas_iface_check_ap_mode (NMSupplicantInterface *self)
+signal_cb (GDBusProxy *proxy,
+ const gchar *sender,
+ const gchar *signal,
+ GVariant *args,
+ gpointer user_data)
{
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxyCall *call;
+ const char *path, *field, *message;
+ gboolean success;
- priv->ready_count++;
+ if (MATCH_SIGNAL (signal, "ScanDone", args, G_VARIANT_TYPE ("(b)"))) {
+ /* Cache last scan completed time */
+ priv->last_scan = nm_utils_get_monotonic_timestamp_s ();
- /* If the global supplicant capabilities property is not present, we can
- * fall back to checking whether the ProbeRequest method is supported. If
- * neither of these works we have no way of determining if AP mode is
- * supported or not. hostap 1.0 and earlier don't support either of these.
- */
- call = dbus_g_proxy_begin_call (priv->introspect_proxy, "Introspect",
- iface_check_ap_mode_cb,
- self,
- NULL,
- G_TYPE_INVALID);
- nm_call_store_add (priv->other_pcalls, priv->introspect_proxy, call);
+ g_variant_get (args, "(b)", &success);
+ g_signal_emit (self, signals[SCAN_DONE], 0, success);
+ } else if (MATCH_SIGNAL (signal, "BSSAdded", args, G_VARIANT_TYPE ("(oa{sv})"))) {
+ if (priv->scanning)
+ priv->last_scan = nm_utils_get_monotonic_timestamp_s ();
+
+ g_variant_get (args, "(&oa{sv})", &path, NULL);
+ handle_new_bss (self, path);
+ } else if (MATCH_SIGNAL (signal, "BSSRemoved", args, G_VARIANT_TYPE ("(o)"))) {
+ g_variant_get (args, "(&o)", &path);
+ g_signal_emit (self, signals[BSS_REMOVED], 0, path);
+ g_hash_table_remove (priv->bss_proxies, path);
+ } else if (MATCH_SIGNAL (signal, "NetworkRequest", args, G_VARIANT_TYPE ("(oss)"))) {
+ g_variant_get (args, "(&o&s&s)", &path, &field, &message);
+ if (priv->has_credreq && priv->net_path && !g_strcmp0 (path, priv->net_path))
+ g_signal_emit (self, signals[CREDENTIALS_REQUEST], 0, field, message);
+ }
}
static void
-interface_add_done (NMSupplicantInterface *self, char *path)
+props_changed_cb (GDBusProxy *proxy,
+ GVariant *changed_properties,
+ GStrv invalidated_properties,
+ gpointer user_data)
{
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+ const char *s, **array, **iter;
+ gboolean b = FALSE;
+ gint32 i32;
+ GVariant *v;
+
+ if (g_variant_lookup (changed_properties, "Scanning", "b", &b))
+ set_scanning (self, b);
+
+ if ( g_variant_lookup (changed_properties, "State", "&s", &s)
+ && priv->state >= NM_SUPPLICANT_INTERFACE_STATE_READY) {
+ /* Only transition to actual wpa_supplicant interface states (ie,
+ * anything > READY) after the NMSupplicantInterface has had a
+ * chance to initialize, which is signalled by entering the READY
+ * state.
+ */
+ set_state_from_string (self, s);
+ }
- nm_log_dbg (LOGD_SUPPLICANT, "(%s): interface added to supplicant", priv->dev);
+ if (g_variant_lookup (changed_properties, "BSSs", "^a&s", &array)) {
+ iter = array;
+ while (*iter)
+ handle_new_bss (self, *iter++);
+ g_free (array);
+ }
- priv->object_path = path;
-
- priv->iface_proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
- WPAS_DBUS_SERVICE,
- path,
- WPAS_DBUS_IFACE_INTERFACE);
-
- dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__BOXED,
- G_TYPE_NONE,
- DBUS_TYPE_G_MAP_OF_VARIANT,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal (priv->iface_proxy, "PropertiesChanged",
- DBUS_TYPE_G_MAP_OF_VARIANT, G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->iface_proxy, "PropertiesChanged",
- G_CALLBACK (wpas_iface_properties_changed),
- self, NULL);
-
- dbus_g_proxy_add_signal (priv->iface_proxy, "ScanDone",
- G_TYPE_BOOLEAN, G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->iface_proxy, "ScanDone",
- G_CALLBACK (wpas_iface_scan_done),
- self,
- NULL);
-
- dbus_g_object_register_marshaller (g_cclosure_marshal_generic,
- G_TYPE_NONE,
- DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_MAP_OF_VARIANT,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal (priv->iface_proxy, "BSSAdded",
- DBUS_TYPE_G_OBJECT_PATH, DBUS_TYPE_G_MAP_OF_VARIANT,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->iface_proxy, "BSSAdded",
- G_CALLBACK (wpas_iface_bss_added),
- self,
- NULL);
-
- dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__BOXED,
- G_TYPE_NONE,
- DBUS_TYPE_G_OBJECT_PATH,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal (priv->iface_proxy, "BSSRemoved",
- DBUS_TYPE_G_OBJECT_PATH,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->iface_proxy, "BSSRemoved",
- G_CALLBACK (wpas_iface_bss_removed),
- self,
- NULL);
-
- dbus_g_object_register_marshaller (g_cclosure_marshal_generic,
- G_TYPE_NONE,
- DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal (priv->iface_proxy, "NetworkRequest",
- DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->iface_proxy, "NetworkRequest",
- G_CALLBACK (wpas_iface_network_request),
- self,
- NULL);
-
- priv->introspect_proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
- WPAS_DBUS_SERVICE,
- priv->object_path,
- DBUS_INTERFACE_INTROSPECTABLE);
-
- priv->props_proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
- WPAS_DBUS_SERVICE,
- path,
- DBUS_INTERFACE_PROPERTIES);
- /* Get initial properties and check whether NetworkReply is supported */
- priv->ready_count = 1;
- wpas_iface_get_props (self);
+ v = g_variant_lookup_value (changed_properties, "Capabilities", G_VARIANT_TYPE_VARDICT);
+ if (v) {
+ parse_capabilities (self, v);
+ g_variant_unref (v);
+ }
- /* These two increment ready_count themselves */
- wpas_iface_check_network_reply (self);
- if (priv->ap_support == AP_SUPPORT_UNKNOWN)
- wpas_iface_check_ap_mode (self);
+ if (g_variant_lookup (changed_properties, "DisconnectReason", "i", &i32)) {
+ /* Disconnect reason is currently only given for deauthentication events,
+ * not disassociation; currently they are IEEE 802.11 "reason codes",
+ * defined by (IEEE 802.11-2007, 7.3.1.7, Table 7-22). Any locally caused
+ * deauthentication will be negative, while authentications caused by the
+ * AP will be positive.
+ */
+ priv->disconnect_reason = i32;
+ if (priv->disconnect_reason != 0) {
+ nm_log_warn (LOGD_SUPPLICANT, "Connection disconnected (reason %d)",
+ priv->disconnect_reason);
+ }
+ }
}
static void
-interface_get_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+on_iface_proxy_acquired (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *error = NULL;
- char *path = NULL;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_free_error GError *error = NULL;
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if (dbus_g_proxy_end_call (proxy, call_id, &error,
- DBUS_TYPE_G_OBJECT_PATH, &path,
- G_TYPE_INVALID)) {
- interface_add_done (self, path);
- } else {
- nm_log_err (LOGD_SUPPLICANT, "(%s): error getting interface: %s",
- priv->dev, error->message);
- g_clear_error (&error);
- set_state (self, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
+ if (!g_async_initable_init_finish (G_ASYNC_INITABLE (proxy), result, &error)) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ nm_log_warn (LOGD_SUPPLICANT, "Failed to acquire wpa_supplicant interface proxy: (%s)", error->message);
+ set_state (NM_SUPPLICANT_INTERFACE (user_data), NM_SUPPLICANT_INTERFACE_STATE_DOWN);
+ }
+ return;
+ }
+
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+
+ g_signal_connect (priv->iface_proxy, "g-signal", G_CALLBACK (signal_cb), self);
+
+ /* Check whether NetworkReply and AP mode are supported */
+ priv->ready_count = 1;
+ g_dbus_proxy_call (priv->iface_proxy,
+ "NetworkReply",
+ g_variant_new ("(oss)",
+ "/fff",
+ "foobar",
+ "foobar"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->init_cancellable,
+ (GAsyncReadyCallback) iface_check_netreply_cb,
+ self);
+
+ if (priv->ap_support == AP_SUPPORT_UNKNOWN) {
+ /* If the global supplicant capabilities property is not present, we can
+ * fall back to checking whether the ProbeRequest method is supported. If
+ * neither of these works we have no way of determining if AP mode is
+ * supported or not. hostap 1.0 and earlier don't support either of these.
+ */
+ priv->ready_count++;
+ g_dbus_proxy_call (priv->iface_proxy,
+ "org.freedesktop.DBus.Introspectable.Introspect",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->init_cancellable,
+ (GAsyncReadyCallback) iface_check_ap_mode_cb,
+ self);
}
}
static void
-interface_get (NMSupplicantInterface *self)
+interface_add_done (NMSupplicantInterface *self, const char *path)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxyCall *call;
- call = dbus_g_proxy_begin_call (priv->wpas_proxy, "GetInterface",
- interface_get_cb,
- self,
- NULL,
- G_TYPE_STRING, priv->dev,
- G_TYPE_INVALID);
- nm_call_store_add (priv->other_pcalls, priv->wpas_proxy, call);
+ nm_log_dbg (LOGD_SUPPLICANT, "(%s): interface added to supplicant", priv->dev);
+
+ priv->object_path = g_strdup (path);
+ priv->iface_proxy = g_object_new (G_TYPE_DBUS_PROXY,
+ "g-bus-type", G_BUS_TYPE_SYSTEM,
+ "g-flags", G_DBUS_PROXY_FLAGS_NONE,
+ "g-name", WPAS_DBUS_SERVICE,
+ "g-object-path", priv->object_path,
+ "g-interface-name", WPAS_DBUS_IFACE_INTERFACE,
+ NULL);
+ g_signal_connect (priv->iface_proxy, "g-properties-changed", G_CALLBACK (props_changed_cb), self);
+ g_async_initable_init_async (G_ASYNC_INITABLE (priv->iface_proxy),
+ G_PRIORITY_DEFAULT,
+ priv->init_cancellable,
+ (GAsyncReadyCallback) on_iface_proxy_acquired,
+ self);
}
static void
-interface_add_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+interface_get_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *error = NULL;
- char *path = NULL;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *variant = NULL;
+ gs_free_error GError *error = NULL;
+ char *path;
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if (dbus_g_proxy_end_call (proxy, call_id, &error,
- DBUS_TYPE_G_OBJECT_PATH, &path,
- G_TYPE_INVALID)) {
+ variant = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+
+ if (variant && g_variant_is_of_type (variant, G_VARIANT_TYPE ("(o)"))) {
+ g_variant_get (variant, "(o)", &path);
interface_add_done (self, path);
+ g_free (path);
} else {
- if (dbus_g_error_has_name (error, WPAS_ERROR_EXISTS_ERROR)) {
- /* Interface already added, just get its object path */
- interface_get (self);
- } else if ( g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SERVICE_UNKNOWN)
- || g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SPAWN_EXEC_FAILED)
- || g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SPAWN_FORK_FAILED)
- || g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SPAWN_FAILED)
- || g_error_matches (error, DBUS_GERROR, DBUS_GERROR_TIMEOUT)
- || g_error_matches (error, DBUS_GERROR, DBUS_GERROR_NO_REPLY)
- || g_error_matches (error, DBUS_GERROR, DBUS_GERROR_TIMED_OUT)
- || dbus_g_error_has_name (error, DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND)) {
- /* Supplicant wasn't running and could not be launched via service
- * activation. Wait for it to start by moving back to the INIT
- * state.
- */
- nm_log_dbg (LOGD_SUPPLICANT, "(%s): failed to activate supplicant: %s",
- priv->dev, error->message);
- set_state (self, NM_SUPPLICANT_INTERFACE_STATE_INIT);
- } else {
- nm_log_err (LOGD_SUPPLICANT, "(%s): error adding interface: %s",
- priv->dev, error->message);
- set_state (self, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
- }
- g_clear_error (&error);
+ nm_log_err (LOGD_SUPPLICANT, "(%s): error getting interface: %s", priv->dev, error->message);
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
+ }
+}
+
+static void
+interface_add_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
+{
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_free_error GError *error = NULL;
+ gs_unref_variant GVariant *variant = NULL;
+ char *path;
+
+ variant = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+
+ if (variant && g_variant_is_of_type (variant, G_VARIANT_TYPE ("(o)"))) {
+ g_variant_get (variant, "(o)", &path);
+ interface_add_done (self, path);
+ g_free (path);
+ } else if (_dbus_error_has_name (error, WPAS_ERROR_EXISTS_ERROR)) {
+ /* Interface already added, just get its object path */
+ g_dbus_proxy_call (priv->wpas_proxy,
+ "GetInterface",
+ g_variant_new ("(s)", priv->dev),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->init_cancellable,
+ (GAsyncReadyCallback) interface_get_cb,
+ self);
+ } else if ( g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SPAWN_EXEC_FAILED)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SPAWN_FORK_FAILED)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SPAWN_FAILED)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_TIMEOUT)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_NO_REPLY)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_TIMED_OUT)
+ || g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND)) {
+ /* Supplicant wasn't running and could not be launched via service
+ * activation. Wait for it to start by moving back to the INIT
+ * state.
+ */
+ nm_log_dbg (LOGD_SUPPLICANT, "(%s): failed to activate supplicant: %s",
+ priv->dev, error->message);
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_INIT);
+ } else {
+ nm_log_err (LOGD_SUPPLICANT, "(%s): error adding interface: %s", priv->dev, error->message);
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
}
}
@@ -868,59 +743,90 @@ interface_add_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data
#endif
static void
-interface_add (NMSupplicantInterface *self, gboolean is_wireless)
+on_wpas_proxy_acquired (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxyCall *call;
- GHashTable *hash;
- GValue driver = G_VALUE_INIT;
- GValue ifname = G_VALUE_INIT;
-
- /* Can only start the interface from INIT state */
- g_return_if_fail (priv->state == NM_SUPPLICANT_INTERFACE_STATE_INIT);
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_free_error GError *error = NULL;
+ GDBusProxy *wpas_proxy;
+ GVariantBuilder props;
+
+ wpas_proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
+ if (!wpas_proxy) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ nm_log_warn (LOGD_SUPPLICANT, "Failed to acquire wpa_supplicant proxy: (%s)",
+ error ? error->message : "unknown");
+ set_state (NM_SUPPLICANT_INTERFACE (user_data), NM_SUPPLICANT_INTERFACE_STATE_DOWN);
+ }
+ return;
+ }
- nm_log_dbg (LOGD_SUPPLICANT, "(%s): adding interface to supplicant", priv->dev);
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- /* Move to starting to prevent double-calls of interface_add() */
- set_state (self, NM_SUPPLICANT_INTERFACE_STATE_STARTING);
+ priv->wpas_proxy = wpas_proxy;
/* Try to add the interface to the supplicant. If the supplicant isn't
* running, this will start it via D-Bus activation and return the response
* when the supplicant has started.
*/
- hash = g_hash_table_new (g_str_hash, g_str_equal);
+ g_variant_builder_init (&props, G_VARIANT_TYPE_VARDICT);
+ g_variant_builder_add (&props, "{sv}",
+ "Driver",
+ g_variant_new_string (priv->is_wireless ? DEFAULT_WIFI_DRIVER : "wired"));
+ g_variant_builder_add (&props, "{sv}",
+ "Ifname",
+ g_variant_new_string (priv->dev));
+
+ g_dbus_proxy_call (priv->wpas_proxy,
+ "CreateInterface",
+ g_variant_new ("(a{sv})", &props),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->init_cancellable,
+ (GAsyncReadyCallback) interface_add_cb,
+ self);
+}
- g_value_init (&driver, G_TYPE_STRING);
- g_value_set_string (&driver, is_wireless ? DEFAULT_WIFI_DRIVER : "wired");
- g_hash_table_insert (hash, "Driver", &driver);
+static void
+interface_add (NMSupplicantInterface *self, gboolean is_wireless)
+{
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- g_value_init (&ifname, G_TYPE_STRING);
- g_value_set_string (&ifname, priv->dev);
- g_hash_table_insert (hash, "Ifname", &ifname);
+ /* Can only start the interface from INIT state */
+ g_return_if_fail (priv->state == NM_SUPPLICANT_INTERFACE_STATE_INIT);
- call = dbus_g_proxy_begin_call (priv->wpas_proxy, "CreateInterface",
- interface_add_cb,
- self,
- NULL,
- DBUS_TYPE_G_MAP_OF_VARIANT, hash,
- G_TYPE_INVALID);
- nm_call_store_add (priv->other_pcalls, priv->wpas_proxy, call);
+ nm_log_dbg (LOGD_SUPPLICANT, "(%s): adding interface to supplicant", priv->dev);
+
+ priv->is_wireless = is_wireless;
+
+ /* Move to starting to prevent double-calls of interface_add() */
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_STARTING);
- g_hash_table_destroy (hash);
- g_value_unset (&driver);
- g_value_unset (&ifname);
+ g_warn_if_fail (priv->init_cancellable == NULL);
+ g_clear_object (&priv->init_cancellable);
+ priv->init_cancellable = g_cancellable_new ();
+
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+ NULL,
+ WPAS_DBUS_SERVICE,
+ WPAS_DBUS_PATH,
+ WPAS_DBUS_INTERFACE,
+ priv->init_cancellable,
+ (GAsyncReadyCallback) on_wpas_proxy_acquired,
+ self);
}
-static void
-smgr_avail_cb (NMSupplicantManager *smgr,
- GParamSpec *pspec,
- gpointer user_data)
+void
+nm_supplicant_interface_set_supplicant_available (NMSupplicantInterface *self,
+ gboolean available)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- if (nm_supplicant_manager_available (smgr)) {
+ if (available) {
/* This can happen if the supplicant couldn't be activated but
* for some reason was started after the activation failure.
*/
@@ -933,27 +839,14 @@ smgr_avail_cb (NMSupplicantManager *smgr,
}
static void
-remove_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-{
- GError *error = NULL;
-
- if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)) {
- nm_log_dbg (LOGD_SUPPLICANT, "Couldn't remove network from supplicant interface: %s.",
- error && error->message ? error->message : "(unknown)");
- g_clear_error (&error);
- }
-}
-
-static void
-disconnect_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+log_result_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- GError *error = NULL;
+ gs_unref_variant GVariant *reply = NULL;
+ gs_free_error GError *error = NULL;
- if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)) {
- nm_log_warn (LOGD_SUPPLICANT, "Couldn't disconnect supplicant interface: %s.",
- error && error->message ? error->message : "(unknown)");
- g_clear_error (&error);
- }
+ reply = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (!reply && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ nm_log_warn (LOGD_SUPPLICANT, "Failed to %s: %s.", error->message, (char *) user_data);
}
void
@@ -965,10 +858,11 @@ nm_supplicant_interface_disconnect (NMSupplicantInterface * self)
priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- /* Clear and cancel all pending calls related to a prior
- * connection attempt.
- */
- nm_call_store_clear (priv->assoc_pcalls);
+ /* Cancel all pending calls related to a prior connection attempt */
+ if (priv->assoc_cancellable) {
+ g_cancellable_cancel (priv->assoc_cancellable);
+ g_clear_object (&priv->assoc_cancellable);
+ }
/* Don't do anything if there is no connection to the supplicant yet. */
if (!priv->iface_proxy)
@@ -977,36 +871,41 @@ nm_supplicant_interface_disconnect (NMSupplicantInterface * self)
/* Disconnect from the current AP */
if ( (priv->state >= NM_SUPPLICANT_INTERFACE_STATE_SCANNING)
&& (priv->state <= NM_SUPPLICANT_INTERFACE_STATE_COMPLETED)) {
- dbus_g_proxy_begin_call (priv->iface_proxy, "Disconnect",
- disconnect_cb,
- NULL, NULL,
- G_TYPE_INVALID);
+ g_dbus_proxy_call (priv->iface_proxy,
+ "Disconnect",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ (GAsyncReadyCallback) log_result_cb,
+ "disconnect");
}
/* Remove any network that was added by NetworkManager */
if (priv->net_path) {
- dbus_g_proxy_begin_call (priv->iface_proxy, "RemoveNetwork",
- remove_network_cb,
- NULL, NULL,
- DBUS_TYPE_G_OBJECT_PATH, priv->net_path,
- G_TYPE_INVALID);
+ g_dbus_proxy_call (priv->iface_proxy,
+ "RemoveNetwork",
+ g_variant_new ("(o)", priv->net_path),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->other_cancellable,
+ (GAsyncReadyCallback) log_result_cb,
+ "remove network");
g_free (priv->net_path);
priv->net_path = NULL;
}
}
static void
-select_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+select_network_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *err = NULL;
+ gs_unref_variant GVariant *reply = NULL;
+ gs_free_error GError *err = NULL;
- nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
- if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID)) {
+ reply = g_dbus_proxy_call_finish (proxy, result, &err);
+ if (!reply && !g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't select network config: %s.", err->message);
- emit_error_helper (self, err);
- g_error_free (err);
+ emit_error_helper (NM_SUPPLICANT_INTERFACE (user_data), err);
}
}
@@ -1014,111 +913,136 @@ static void
call_select_network (NMSupplicantInterface *self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGProxyCall *call;
/* We only select the network after all blobs (if any) have been set */
if (priv->blobs_left == 0) {
- call = dbus_g_proxy_begin_call (priv->iface_proxy, "SelectNetwork",
- select_network_cb,
- self,
- NULL,
- DBUS_TYPE_G_OBJECT_PATH, priv->net_path,
- G_TYPE_INVALID);
- nm_call_store_add (priv->assoc_pcalls, priv->iface_proxy, call);
+ g_dbus_proxy_call (priv->iface_proxy,
+ "SelectNetwork",
+ g_variant_new ("(o)", priv->net_path),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->assoc_cancellable,
+ (GAsyncReadyCallback) select_network_cb,
+ self);
}
}
static void
-add_blob_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+add_blob_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *err = NULL;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *reply = NULL;
+ gs_free_error GError *err = NULL;
- priv->blobs_left--;
+ reply = g_dbus_proxy_call_finish (proxy, result, &err);
+ if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
- if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID)) {
+ priv->blobs_left--;
+ if (reply)
+ call_select_network (self);
+ else {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't set network certificates: %s.", err->message);
emit_error_helper (self, err);
- g_error_free (err);
- } else
- call_select_network (self);
+ }
}
static void
-add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+add_network_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *err = NULL;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *reply = NULL;
+ gs_free_error GError *error = NULL;
GHashTable *blobs;
GHashTableIter iter;
- gpointer name, data;
- DBusGProxyCall *call;
+ const char *blob_name;
+ GByteArray *blob_data;
+
+ reply = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+
+ if (reply && !g_variant_is_of_type (reply, G_VARIANT_TYPE ("(o)"))) {
+ error = g_error_new (NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED,
+ "Unexpected AddNetwork reply type %s",
+ g_variant_get_type_string (reply));
+ }
g_free (priv->net_path);
priv->net_path = NULL;
- nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
- if (!dbus_g_proxy_end_call (proxy, call_id, &err,
- DBUS_TYPE_G_OBJECT_PATH, &priv->net_path,
- G_TYPE_INVALID)) {
- nm_log_warn (LOGD_SUPPLICANT, "Couldn't add a network to the supplicant interface: %s.",
- err->message);
- emit_error_helper (self, err);
- g_error_free (err);
+ if (error) {
+ nm_log_warn (LOGD_SUPPLICANT, "Adding network to supplicant failed: %s.", error->message);
+ emit_error_helper (self, error);
return;
}
- /* Send blobs first; otherwise jump to sending the config settings */
+ g_variant_get (reply, "(o)", &priv->net_path);
+ g_assert (priv->net_path);
+
+ /* Send blobs first; otherwise jump to selecting the network */
blobs = nm_supplicant_config_get_blobs (priv->cfg);
priv->blobs_left = g_hash_table_size (blobs);
+
g_hash_table_iter_init (&iter, blobs);
- while (g_hash_table_iter_next (&iter, &name, &data)) {
- call = dbus_g_proxy_begin_call (priv->iface_proxy, "AddBlob",
- add_blob_cb,
- self,
- NULL,
- G_TYPE_STRING, name,
- DBUS_TYPE_G_UCHAR_ARRAY, data,
- G_TYPE_INVALID);
- nm_call_store_add (priv->assoc_pcalls, priv->iface_proxy, call);
+ while (g_hash_table_iter_next (&iter, (gpointer) &blob_name, (gpointer) &blob_data)) {
+ g_dbus_proxy_call (priv->iface_proxy,
+ "AddBlob",
+ g_variant_new ("(s@ay)",
+ blob_name,
+ g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+ blob_data->data, blob_data->len, 1)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->assoc_cancellable,
+ (GAsyncReadyCallback) add_blob_cb,
+ self);
}
call_select_network (self);
}
static void
-set_ap_scan_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+set_ap_scan_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *err = NULL;
- DBusGProxyCall *call;
- GHashTable *config_hash;
+ NMSupplicantInterface *self;
+ NMSupplicantInterfacePrivate *priv;
+ gs_unref_variant GVariant *reply = NULL;
+ gs_free_error GError *error = NULL;
+
+ reply = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
- nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
- if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID)) {
+ self = NM_SUPPLICANT_INTERFACE (user_data);
+ priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
+
+ if (!reply) {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't send AP scan mode to the supplicant interface: %s.",
- err->message);
- emit_error_helper (self, err);
- g_error_free (err);
+ error->message);
+ emit_error_helper (self, error);
return;
}
nm_log_info (LOGD_SUPPLICANT, "Config: set interface ap_scan to %d",
nm_supplicant_config_get_ap_scan (priv->cfg));
- config_hash = nm_supplicant_config_get_hash (priv->cfg);
- call = dbus_g_proxy_begin_call (priv->iface_proxy, "AddNetwork",
- add_network_cb,
- self,
- NULL,
- DBUS_TYPE_G_MAP_OF_VARIANT, config_hash,
- G_TYPE_INVALID);
- g_hash_table_destroy (config_hash);
- nm_call_store_add (priv->assoc_pcalls, priv->iface_proxy, call);
+ g_dbus_proxy_call (priv->iface_proxy,
+ "AddNetwork",
+ g_variant_new ("(@a{sv})", nm_supplicant_config_to_variant (priv->cfg)),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->assoc_cancellable,
+ (GAsyncReadyCallback) add_network_cb,
+ self);
}
gboolean
@@ -1126,8 +1050,6 @@ nm_supplicant_interface_set_config (NMSupplicantInterface *self,
NMSupplicantConfig *cfg)
{
NMSupplicantInterfacePrivate *priv;
- DBusGProxyCall *call;
- GValue value = G_VALUE_INIT;
g_return_val_if_fail (NM_IS_SUPPLICANT_INTERFACE (self), FALSE);
@@ -1143,103 +1065,75 @@ nm_supplicant_interface_set_config (NMSupplicantInterface *self,
return FALSE;
}
- if (priv->cfg)
- g_object_unref (priv->cfg);
- priv->cfg = cfg;
-
- if (cfg == NULL)
- return TRUE;
-
- g_object_ref (priv->cfg);
-
- g_value_init (&value, G_TYPE_UINT);
- g_value_set_uint (&value, nm_supplicant_config_get_ap_scan (priv->cfg));
-
- call = dbus_g_proxy_begin_call (priv->props_proxy, "Set",
- set_ap_scan_cb,
- self,
- NULL,
- G_TYPE_STRING, WPAS_DBUS_IFACE_INTERFACE,
- G_TYPE_STRING, "ApScan",
- G_TYPE_VALUE, &value,
- G_TYPE_INVALID);
- nm_call_store_add (priv->assoc_pcalls, priv->props_proxy, call);
-
- g_value_unset (&value);
- return call != NULL;
-}
-
-static void
-scan_request_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
-{
- NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- GError *err = NULL;
-
- nm_call_store_remove (priv->other_pcalls, proxy, call_id);
- if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID))
- nm_log_warn (LOGD_SUPPLICANT, "Could not get scan request result: %s", err->message);
-
- g_signal_emit (self, signals[SCAN_DONE], 0, err ? FALSE : TRUE);
- g_clear_error (&err);
+ g_clear_object (&priv->cfg);
+ if (cfg) {
+ priv->cfg = g_object_ref (cfg);
+ g_dbus_proxy_call (priv->iface_proxy,
+ "org.freedesktop.DBus.Properties.Set",
+ g_variant_new ("(ssv)",
+ WPAS_DBUS_IFACE_INTERFACE,
+ "ApScan",
+ g_variant_new_uint32 (nm_supplicant_config_get_ap_scan (priv->cfg))),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->assoc_cancellable,
+ (GAsyncReadyCallback) set_ap_scan_cb,
+ self);
+ }
+ return TRUE;
}
static void
-destroy_gvalue (gpointer data)
-{
- GValue *value = (GValue *) data;
-
- g_value_unset (value);
- g_slice_free (GValue, value);
-}
-
-static GValue *
-string_to_gvalue (const char *str)
+scan_request_cb (GDBusProxy *proxy, GAsyncResult *result, gpointer user_data)
{
- GValue *val = g_slice_new0 (GValue);
+ gs_unref_variant GVariant *reply = NULL;
+ gs_free_error GError *error = NULL;
- g_value_init (val, G_TYPE_STRING);
- g_value_set_string (val, str);
- return val;
-}
-
-static GValue *
-byte_array_array_to_gvalue (const GPtrArray *array)
-{
- GValue *val = g_slice_new0 (GValue);
+ reply = g_dbus_proxy_call_finish (proxy, result, &error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
- g_value_init (val, DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR);
- g_value_set_boxed (val, array);
- return val;
+ if (error)
+ nm_log_warn (LOGD_SUPPLICANT, "Could not get scan request result: %s", error->message);
+ g_signal_emit (NM_SUPPLICANT_INTERFACE (user_data), signals[SCAN_DONE], 0, error ? FALSE : TRUE);
}
gboolean
nm_supplicant_interface_request_scan (NMSupplicantInterface *self, const GPtrArray *ssids)
{
NMSupplicantInterfacePrivate *priv;
- DBusGProxyCall *call;
- GHashTable *hash;
+ GVariantBuilder builder;
+ guint i;
g_return_val_if_fail (NM_IS_SUPPLICANT_INTERFACE (self), FALSE);
priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
/* Scan parameters */
- hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, destroy_gvalue);
- g_hash_table_insert (hash, "Type", string_to_gvalue ("active"));
- if (ssids)
- g_hash_table_insert (hash, "SSIDs", byte_array_array_to_gvalue (ssids));
-
- call = dbus_g_proxy_begin_call (priv->iface_proxy, "Scan",
- scan_request_cb,
- self,
- NULL,
- DBUS_TYPE_G_MAP_OF_VARIANT, hash,
- G_TYPE_INVALID);
- g_hash_table_destroy (hash);
- nm_call_store_add (priv->other_pcalls, priv->iface_proxy, call);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
+ g_variant_builder_add (&builder, "{sv}", "Type", g_variant_new_string ("active"));
+ if (ssids) {
+ GVariantBuilder ssids_builder;
+
+ g_variant_builder_init (&ssids_builder, G_VARIANT_TYPE_BYTESTRING_ARRAY);
+ for (i = 0; i < ssids->len; i++) {
+ GByteArray *ssid = g_ptr_array_index (ssids, i);
+ g_variant_builder_add (&ssids_builder, "@ay",
+ g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+ ssid->data, ssid->len, 1));
+ }
+ g_variant_builder_add (&builder, "{sv}", "SSIDs", g_variant_builder_end (&ssids_builder));
+ }
- return call != NULL;
+ g_dbus_proxy_call (priv->iface_proxy,
+ "Scan",
+ g_variant_new ("(a{sv})", &builder),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ priv->other_cancellable,
+ (GAsyncReadyCallback) scan_request_cb,
+ self);
+ return TRUE;
}
guint32
@@ -1323,8 +1217,7 @@ nm_supplicant_interface_get_max_scan_ssids (NMSupplicantInterface *self)
/*******************************************************************/
NMSupplicantInterface *
-nm_supplicant_interface_new (NMSupplicantManager *smgr,
- const char *ifname,
+nm_supplicant_interface_new (const char *ifname,
gboolean is_wireless,
gboolean fast_supported,
ApSupport ap_support,
@@ -1332,21 +1225,12 @@ nm_supplicant_interface_new (NMSupplicantManager *smgr,
{
NMSupplicantInterface *self;
NMSupplicantInterfacePrivate *priv;
- guint id;
- g_return_val_if_fail (NM_IS_SUPPLICANT_MANAGER (smgr), NULL);
g_return_val_if_fail (ifname != NULL, NULL);
self = g_object_new (NM_TYPE_SUPPLICANT_INTERFACE, NULL);
priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- priv->smgr = g_object_ref (smgr);
- id = g_signal_connect (priv->smgr,
- "notify::" NM_SUPPLICANT_MANAGER_AVAILABLE,
- G_CALLBACK (smgr_avail_cb),
- self);
- priv->smgr_avail_id = id;
-
priv->dev = g_strdup (ifname);
priv->is_wireless = is_wireless;
priv->fast_supported = fast_supported;
@@ -1362,19 +1246,8 @@ static void
nm_supplicant_interface_init (NMSupplicantInterface * self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- DBusGConnection *bus;
priv->state = NM_SUPPLICANT_INTERFACE_STATE_INIT;
- priv->assoc_pcalls = nm_call_store_new ();
- priv->other_pcalls = nm_call_store_new ();
- priv->dbus_mgr = nm_dbus_manager_get ();
-
- bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
- priv->wpas_proxy = dbus_g_proxy_new_for_name (bus,
- WPAS_DBUS_SERVICE,
- WPAS_DBUS_PATH,
- WPAS_DBUS_INTERFACE);
-
priv->bss_proxies = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
}
@@ -1412,49 +1285,26 @@ dispose (GObject *object)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (object);
- if (priv->disposed) {
- G_OBJECT_CLASS (nm_supplicant_interface_parent_class)->dispose (object);
- return;
- }
- priv->disposed = TRUE;
-
- /* Cancel pending calls before unrefing the dbus manager */
- nm_call_store_clear (priv->other_pcalls);
- nm_call_store_destroy (priv->other_pcalls);
-
- nm_call_store_clear (priv->assoc_pcalls);
- nm_call_store_destroy (priv->assoc_pcalls);
-
- if (priv->props_proxy)
- g_object_unref (priv->props_proxy);
-
if (priv->iface_proxy)
- g_object_unref (priv->iface_proxy);
+ g_signal_handlers_disconnect_by_data (priv->iface_proxy, NM_SUPPLICANT_INTERFACE (object));
+ g_clear_object (&priv->iface_proxy);
- g_free (priv->net_path);
+ if (priv->init_cancellable)
+ g_cancellable_cancel (priv->init_cancellable);
+ g_clear_object (&priv->init_cancellable);
- if (priv->introspect_proxy)
- g_object_unref (priv->introspect_proxy);
+ if (priv->other_cancellable)
+ g_cancellable_cancel (priv->other_cancellable);
+ g_clear_object (&priv->other_cancellable);
- if (priv->wpas_proxy)
- g_object_unref (priv->wpas_proxy);
+ g_clear_object (&priv->wpas_proxy);
+ g_clear_pointer (&priv->bss_proxies, (GDestroyNotify) g_hash_table_destroy);
- g_hash_table_destroy (priv->bss_proxies);
+ g_clear_pointer (&priv->net_path, g_free);
+ g_clear_pointer (&priv->dev, g_free);
+ g_clear_pointer (&priv->object_path, g_free);
- if (priv->smgr) {
- if (priv->smgr_avail_id)
- g_signal_handler_disconnect (priv->smgr, priv->smgr_avail_id);
- g_object_unref (priv->smgr);
- }
-
- g_free (priv->dev);
-
- priv->dbus_mgr = NULL;
-
- if (priv->cfg)
- g_object_unref (priv->cfg);
-
- g_free (priv->object_path);
+ g_clear_object (&priv->cfg);
/* Chain up to the parent class */
G_OBJECT_CLASS (nm_supplicant_interface_parent_class)->dispose (object);
@@ -1502,7 +1352,7 @@ nm_supplicant_interface_class_init (NMSupplicantInterfaceClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NMSupplicantInterfaceClass, new_bss),
NULL, NULL, NULL,
- G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_POINTER);
+ G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_VARIANT);
signals[BSS_UPDATED] =
g_signal_new (NM_SUPPLICANT_INTERFACE_BSS_UPDATED,
diff --git a/src/supplicant-manager/nm-supplicant-interface.h b/src/supplicant-manager/nm-supplicant-interface.h
index 0112e40ea..1b1139d40 100644
--- a/src/supplicant-manager/nm-supplicant-interface.h
+++ b/src/supplicant-manager/nm-supplicant-interface.h
@@ -119,13 +119,15 @@ typedef struct {
GType nm_supplicant_interface_get_type (void);
-NMSupplicantInterface * nm_supplicant_interface_new (NMSupplicantManager * smgr,
- const char *ifname,
+NMSupplicantInterface * nm_supplicant_interface_new (const char *ifname,
gboolean is_wireless,
gboolean fast_supported,
ApSupport ap_support,
gboolean start_now);
+void nm_supplicant_interface_set_supplicant_available (NMSupplicantInterface *self,
+ gboolean available);
+
gboolean nm_supplicant_interface_set_config (NMSupplicantInterface * iface,
NMSupplicantConfig * cfg);
diff --git a/src/supplicant-manager/nm-supplicant-manager.c b/src/supplicant-manager/nm-supplicant-manager.c
index 01e35929d..6358c1809 100644
--- a/src/supplicant-manager/nm-supplicant-manager.c
+++ b/src/supplicant-manager/nm-supplicant-manager.c
@@ -25,11 +25,12 @@
#include <glib.h>
#include <dbus/dbus.h>
+#include "nm-glib-compat.h"
+
#include "nm-supplicant-manager.h"
#include "nm-supplicant-interface.h"
-#include "nm-dbus-manager.h"
#include "nm-logging.h"
-#include "nm-dbus-glib-types.h"
+#include "nm-core-internal.h"
#define NM_SUPPLICANT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
NM_TYPE_SUPPLICANT_MANAGER, \
@@ -37,25 +38,16 @@
G_DEFINE_TYPE (NMSupplicantManager, nm_supplicant_manager, G_TYPE_OBJECT)
-/* Properties */
-enum {
- PROP_0 = 0,
- PROP_AVAILABLE,
- LAST_PROP
-};
-
typedef struct {
- NMDBusManager * dbus_mgr;
- guint name_owner_id;
- DBusGProxy * proxy;
- DBusGProxy * props_proxy;
- gboolean running;
+ GDBusProxy * proxy;
+ GCancellable * cancellable;
+ gboolean running;
+
GHashTable * ifaces;
gboolean fast_supported;
ApSupport ap_support;
guint die_count_reset_id;
guint die_count;
- gboolean disposed;
} NMSupplicantManagerPrivate;
/********************************************************************/
@@ -90,14 +82,16 @@ nm_supplicant_manager_iface_get (NMSupplicantManager * self,
start_now = !die_count_exceeded (priv->die_count);
nm_log_dbg (LOGD_SUPPLICANT, "(%s): creating new supplicant interface", ifname);
- iface = nm_supplicant_interface_new (self,
- ifname,
+ iface = nm_supplicant_interface_new (ifname,
is_wireless,
priv->fast_supported,
priv->ap_support,
start_now);
- if (iface)
- g_hash_table_insert (priv->ifaces, g_strdup (ifname), iface);
+ if (iface) {
+ g_hash_table_insert (priv->ifaces,
+ (char *) nm_supplicant_interface_get_ifname (iface),
+ iface);
+ }
} else {
nm_log_dbg (LOGD_SUPPLICANT, "(%s): returning existing supplicant interface", ifname);
}
@@ -125,35 +119,27 @@ nm_supplicant_manager_iface_release (NMSupplicantManager *self,
/* Ask wpa_supplicant to remove this interface */
op = nm_supplicant_interface_get_object_path (iface);
if (priv->running && priv->proxy && op) {
- dbus_g_proxy_call_no_reply (priv->proxy, "RemoveInterface",
- DBUS_TYPE_G_OBJECT_PATH, op,
- G_TYPE_INVALID);
+ g_dbus_proxy_call (priv->proxy,
+ "RemoveInterface",
+ g_variant_new ("(o)", op),
+ G_DBUS_CALL_FLAGS_NONE,
+ 3000,
+ NULL,
+ NULL,
+ NULL);
}
g_hash_table_remove (priv->ifaces, ifname);
}
static void
-get_capabilities_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+update_capabilities (NMSupplicantManager *self)
{
- NMSupplicantManager *self = NM_SUPPLICANT_MANAGER (user_data);
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
NMSupplicantInterface *iface;
GHashTableIter hash_iter;
- GError *error = NULL;
- GHashTable *props = NULL;
- GValue *value;
- char **iter;
-
- if (!dbus_g_proxy_end_call (proxy, call_id, &error,
- DBUS_TYPE_G_MAP_OF_VARIANT, &props,
- G_TYPE_INVALID)) {
- nm_log_warn (LOGD_CORE, "Unexpected error requesting supplicant properties: (%d) %s",
- error ? error->code : -1,
- error && error->message ? error->message : "(unknown)");
- g_clear_error (&error);
- return;
- }
+ const char **array;
+ GVariant *value;
/* The supplicant only advertises global capabilities if the following
* commit has been applied:
@@ -165,13 +151,17 @@ get_capabilities_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_
* dbus: Add global capabilities property
*/
priv->ap_support = AP_SUPPORT_UNKNOWN;
- value = g_hash_table_lookup (props, "Capabilities");
- if (value && G_VALUE_HOLDS (value, G_TYPE_STRV)) {
- priv->ap_support = AP_SUPPORT_NO;
- for (iter = g_value_get_boxed (value); iter && *iter; iter++) {
- if (strcasecmp (*iter, "ap") == 0)
+
+ value = g_dbus_proxy_get_cached_property (priv->proxy, "Capabilities");
+ if (value) {
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING_ARRAY)) {
+ array = g_variant_get_strv (value, NULL);
+ priv->ap_support = AP_SUPPORT_NO;
+ if (_nm_utils_string_in_list ("ap", array))
priv->ap_support = AP_SUPPORT_YES;
+ g_free (array);
}
+ g_variant_unref (value);
}
/* Tell all interfaces about results of the AP check */
@@ -185,32 +175,35 @@ get_capabilities_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_
/* EAP-FAST */
priv->fast_supported = FALSE;
- value = g_hash_table_lookup (props, "EapMethods");
- if (value && G_VALUE_HOLDS (value, G_TYPE_STRV)) {
- for (iter = g_value_get_boxed (value); iter && *iter; iter++) {
- if (strcasecmp (*iter, "fast") == 0)
+ value = g_dbus_proxy_get_cached_property (priv->proxy, "EapMethods");
+ if (value) {
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING_ARRAY)) {
+ array = g_variant_get_strv (value, NULL);
+ if (_nm_utils_string_in_list ("fast", array))
priv->fast_supported = TRUE;
+ g_free (array);
}
+ g_variant_unref (value);
}
nm_log_dbg (LOGD_SUPPLICANT, "EAP-FAST is %ssupported", priv->fast_supported ? "" : "not ");
-
- g_hash_table_unref (props);
}
static void
-check_capabilities (NMSupplicantManager *self)
+availability_changed (NMSupplicantManager *self, gboolean available)
{
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
+ GList *ifaces, *iter;
- dbus_g_proxy_begin_call (priv->props_proxy, "GetAll",
- get_capabilities_cb, self, NULL,
- G_TYPE_STRING, WPAS_DBUS_INTERFACE,
- G_TYPE_INVALID);
+ /* priv->ifaces may be modified if availability changes; can't use GHashTableIter */
+ ifaces = g_hash_table_get_values (priv->ifaces);
+ for (iter = ifaces; iter; iter = iter->next)
+ nm_supplicant_interface_set_supplicant_available (NM_SUPPLICANT_INTERFACE (iter->data), available);
+ g_list_free (ifaces);
}
-gboolean
-nm_supplicant_manager_available (NMSupplicantManager *self)
+static gboolean
+is_available (NMSupplicantManager *self)
{
g_return_val_if_fail (NM_IS_SUPPLICANT_MANAGER (self), FALSE);
@@ -223,22 +216,26 @@ static void
set_running (NMSupplicantManager *self, gboolean now_running)
{
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
- gboolean old_available = nm_supplicant_manager_available (self);
+ gboolean old_available = is_available (self);
+ gboolean new_available;
priv->running = now_running;
- if (old_available != nm_supplicant_manager_available (self))
- g_object_notify (G_OBJECT (self), NM_SUPPLICANT_MANAGER_AVAILABLE);
+ new_available = is_available (self);
+ if (old_available != new_available)
+ availability_changed (self, new_available);
}
static void
set_die_count (NMSupplicantManager *self, guint new_die_count)
{
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
- gboolean old_available = nm_supplicant_manager_available (self);
+ gboolean old_available = is_available (self);
+ gboolean new_available;
priv->die_count = new_die_count;
- if (old_available != nm_supplicant_manager_available (self))
- g_object_notify (G_OBJECT (self), NM_SUPPLICANT_MANAGER_AVAILABLE);
+ new_available = is_available (self);
+ if (old_available != new_available)
+ availability_changed (self, new_available);
}
static gboolean
@@ -255,28 +252,21 @@ wpas_die_count_reset_cb (gpointer user_data)
}
static void
-name_owner_changed (NMDBusManager *dbus_mgr,
- const char *name,
- const char *old_owner,
- const char *new_owner,
- gpointer user_data)
+name_owner_cb (GDBusProxy *proxy, GParamSpec *pspec, gpointer user_data)
{
NMSupplicantManager *self = NM_SUPPLICANT_MANAGER (user_data);
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
- gboolean old_owner_good = (old_owner && strlen (old_owner));
- gboolean new_owner_good = (new_owner && strlen (new_owner));
+ char *owner;
- /* We only care about the supplicant here */
- if (strcmp (WPAS_DBUS_SERVICE, name) != 0)
- return;
+ g_return_if_fail (proxy == priv->proxy);
- if (!old_owner_good && new_owner_good) {
- nm_log_info (LOGD_SUPPLICANT, "wpa_supplicant started");
- set_running (self, TRUE);
- check_capabilities (self);
- } else if (old_owner_good && !new_owner_good) {
- nm_log_info (LOGD_SUPPLICANT, "wpa_supplicant stopped");
+ owner = g_dbus_proxy_get_name_owner (proxy);
+ nm_log_info (LOGD_SUPPLICANT, "wpa_supplicant %s", owner ? "running" : "stopped");
+ if (owner) {
+ set_running (self, TRUE);
+ update_capabilities (self);
+ } else if (priv->running) {
/* Reschedule the die count reset timeout. Every time the supplicant
* dies we wait 10 seconds before resetting the counter. If the
* supplicant died more than twice before the timer is reset, then
@@ -297,6 +287,33 @@ name_owner_changed (NMDBusManager *dbus_mgr,
priv->fast_supported = FALSE;
}
+
+ g_free (owner);
+}
+
+static void
+on_proxy_acquired (GObject *object, GAsyncResult *result, gpointer user_data)
+{
+ NMSupplicantManager *self;
+ NMSupplicantManagerPrivate *priv;
+ GError *error = NULL;
+ GDBusProxy *proxy;
+
+ proxy = g_dbus_proxy_new_for_bus_finish (result, &error);
+ if (!proxy) {
+ nm_log_warn (LOGD_SUPPLICANT,
+ "Failed to acquire wpa_supplicant proxy: Wi-Fi and 802.1x will not be available (%s)",
+ error->message);
+ g_clear_error (&error);
+ return;
+ }
+
+ self = NM_SUPPLICANT_MANAGER (user_data);
+ priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
+
+ priv->proxy = proxy;
+ g_signal_connect (priv->proxy, "notify::g-name-owner", G_CALLBACK (name_owner_cb), self);
+ name_owner_cb (priv->proxy, NULL, self);
}
/*******************************************************************/
@@ -319,50 +336,19 @@ static void
nm_supplicant_manager_init (NMSupplicantManager *self)
{
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (self);
- DBusGConnection *bus;
-
- priv->dbus_mgr = nm_dbus_manager_get ();
- priv->name_owner_id = g_signal_connect (priv->dbus_mgr,
- NM_DBUS_MANAGER_NAME_OWNER_CHANGED,
- G_CALLBACK (name_owner_changed),
- self);
- priv->running = nm_dbus_manager_name_has_owner (priv->dbus_mgr, WPAS_DBUS_SERVICE);
-
- bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
- priv->proxy = dbus_g_proxy_new_for_name (bus,
- WPAS_DBUS_SERVICE,
- WPAS_DBUS_PATH,
- WPAS_DBUS_INTERFACE);
-
- priv->props_proxy = dbus_g_proxy_new_for_name (bus,
- WPAS_DBUS_SERVICE,
- WPAS_DBUS_PATH,
- DBUS_INTERFACE_PROPERTIES);
-
- priv->ifaces = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
-
- /* Check generic supplicant capabilities */
- if (priv->running)
- check_capabilities (self);
-}
-static void
-set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-}
-
-static void
-get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- switch (prop_id) {
- case PROP_AVAILABLE:
- g_value_set_boolean (value, nm_supplicant_manager_available (NM_SUPPLICANT_MANAGER (object)));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ priv->ifaces = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
+
+ priv->cancellable = g_cancellable_new ();
+ g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ WPAS_DBUS_SERVICE,
+ WPAS_DBUS_PATH,
+ WPAS_DBUS_INTERFACE,
+ priv->cancellable,
+ (GAsyncReadyCallback) on_proxy_acquired,
+ self);
}
static void
@@ -370,29 +356,19 @@ dispose (GObject *object)
{
NMSupplicantManagerPrivate *priv = NM_SUPPLICANT_MANAGER_GET_PRIVATE (object);
- if (priv->disposed)
- goto out;
- priv->disposed = TRUE;
-
- if (priv->die_count_reset_id)
+ if (priv->die_count_reset_id) {
g_source_remove (priv->die_count_reset_id);
-
- if (priv->dbus_mgr) {
- if (priv->name_owner_id)
- g_signal_handler_disconnect (priv->dbus_mgr, priv->name_owner_id);
- priv->dbus_mgr = NULL;
+ priv->die_count_reset_id = 0;
}
- g_hash_table_destroy (priv->ifaces);
-
- if (priv->proxy)
- g_object_unref (priv->proxy);
+ if (priv->cancellable) {
+ g_cancellable_cancel (priv->cancellable);
+ g_clear_object (&priv->cancellable);
+ }
- if (priv->props_proxy)
- g_object_unref (priv->props_proxy);
+ g_clear_pointer (&priv->ifaces, g_hash_table_unref);
+ g_clear_object (&priv->proxy);
-out:
- /* Chain up to the parent class */
G_OBJECT_CLASS (nm_supplicant_manager_parent_class)->dispose (object);
}
@@ -403,15 +379,6 @@ nm_supplicant_manager_class_init (NMSupplicantManagerClass *klass)
g_type_class_add_private (object_class, sizeof (NMSupplicantManagerPrivate));
- object_class->get_property = get_property;
- object_class->set_property = set_property;
object_class->dispose = dispose;
-
- g_object_class_install_property
- (object_class, PROP_AVAILABLE,
- g_param_spec_boolean (NM_SUPPLICANT_MANAGER_AVAILABLE, "", "",
- FALSE,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
}
diff --git a/src/supplicant-manager/nm-supplicant-manager.h b/src/supplicant-manager/nm-supplicant-manager.h
index 5e7f1eb59..3b8fddf4e 100644
--- a/src/supplicant-manager/nm-supplicant-manager.h
+++ b/src/supplicant-manager/nm-supplicant-manager.h
@@ -26,11 +26,6 @@
#include "nm-supplicant-types.h"
#include "nm-device.h"
-#define WPAS_DBUS_SERVICE "fi.w1.wpa_supplicant1"
-#define WPAS_DBUS_PATH "/fi/w1/wpa_supplicant1"
-#define WPAS_DBUS_INTERFACE "fi.w1.wpa_supplicant1"
-
-
G_BEGIN_DECLS
#define NM_TYPE_SUPPLICANT_MANAGER (nm_supplicant_manager_get_type ())
@@ -40,8 +35,6 @@ G_BEGIN_DECLS
#define NM_IS_SUPPLICANT_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SUPPLICANT_MANAGER))
#define NM_SUPPLICANT_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SUPPLICANT_MANAGER, NMSupplicantManagerClass))
-#define NM_SUPPLICANT_MANAGER_AVAILABLE "available"
-
struct _NMSupplicantManager
{
GObject parent;
@@ -63,6 +56,4 @@ NMSupplicantInterface *nm_supplicant_manager_iface_get (NMSupplicantManager *mgr
void nm_supplicant_manager_iface_release (NMSupplicantManager *mgr,
NMSupplicantInterface *iface);
-gboolean nm_supplicant_manager_available (NMSupplicantManager *mgr);
-
#endif /* __NETWORKMANAGER_SUPPLICANT_MANAGER_H__ */
diff --git a/src/supplicant-manager/nm-supplicant-types.h b/src/supplicant-manager/nm-supplicant-types.h
index 619f0c3e9..1c16e4943 100644
--- a/src/supplicant-manager/nm-supplicant-types.h
+++ b/src/supplicant-manager/nm-supplicant-types.h
@@ -21,6 +21,10 @@
#ifndef __NETWORKMANAGER_SUPPLICANT_TYPES_H__
#define __NETWORKMANAGER_SUPPLICANT_TYPES_H__
+#define WPAS_DBUS_SERVICE "fi.w1.wpa_supplicant1"
+#define WPAS_DBUS_PATH "/fi/w1/wpa_supplicant1"
+#define WPAS_DBUS_INTERFACE "fi.w1.wpa_supplicant1"
+
typedef struct _NMSupplicantManager NMSupplicantManager;
typedef struct _NMSupplicantInterface NMSupplicantInterface;
typedef struct _NMSupplicantConfig NMSupplicantConfig;
diff --git a/src/supplicant-manager/tests/Makefile.in b/src/supplicant-manager/tests/Makefile.in
index 50981a193..ef5233b25 100644
--- a/src/supplicant-manager/tests/Makefile.in
+++ b/src/supplicant-manager/tests/Makefile.in
@@ -203,13 +203,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -323,6 +506,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -487,7 +671,7 @@ test_supplicant_config_LDADD = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -618,98 +802,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-supplicant-config.log: test-supplicant-config$(EXEEXT)
+ @p='test-supplicant-config$(EXEEXT)'; \
+ b='test-supplicant-config'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -766,6 +1020,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -861,7 +1118,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/supplicant-manager/tests/test-supplicant-config.c b/src/supplicant-manager/tests/test-supplicant-config.c
index 5ffead40d..937757b22 100644
--- a/src/supplicant-manager/tests/test-supplicant-config.c
+++ b/src/supplicant-manager/tests/test-supplicant-config.c
@@ -41,78 +41,67 @@
static gboolean
validate_opt (const char *detail,
- GHashTable *hash,
+ GVariant *config,
const char *key,
OptType val_type,
gconstpointer expected,
size_t expected_len)
{
- GValue *value;
- gint int_val;
- GByteArray *array;
+ char *config_key;
+ GVariant *config_value;
+ gboolean found = FALSE;
+ const guint8 *bytes;
+ gsize len;
const char *s;
const unsigned char *expected_array = expected;
- int result;
-
- ASSERT (hash != NULL, detail, "hash was NULL");
-
- value = g_hash_table_lookup (hash, key);
- ASSERT (value != NULL,
- detail, "option '%s' expected but not found in config hash.");
-
- switch (val_type) {
- case TYPE_INT:
- ASSERT (G_VALUE_HOLDS_INT (value),
- detail, "config hash item '%s' was not TYPE_INT.", key);
- int_val = g_value_get_int (value);
- ASSERT (int_val == GPOINTER_TO_INT (expected),
- detail, "unexpected config hash item '%s' value %d (expected %d)",
- key, int_val, GPOINTER_TO_INT (expected));
- break;
- case TYPE_BYTES:
- ASSERT (G_VALUE_HOLDS (value, DBUS_TYPE_G_UCHAR_ARRAY),
- detail, "config hash item '%s' was not TYPE_BYTES.", key);
- array = g_value_get_boxed (value);
- ASSERT (array->len == expected_len,
- detail, "unexpected config hash item '%s' length %d (expected %d)",
- key, array->len, expected_len);
- result = memcmp (array->data, expected_array, expected_len);
- ASSERT (result == 0, detail, "unexpected config hash item '%s' value", key);
- break;
- case TYPE_KEYWORD:
- case TYPE_STRING:
- ASSERT (G_VALUE_HOLDS_STRING (value),
- detail, "config hash item '%s' was not TYPE_STRING or TYPE_KEYWORD.", key);
- if (expected_len == -1)
- expected_len = strlen ((const char *) expected);
- s = g_value_get_string (value);
- ASSERT (s != NULL, detail, "unexpected NULL config hash string item '%s'.", key);
- ASSERT (strlen (s) == expected_len,
- detail, "unexpected config hash string item '%s' length %d (expected %d)",
- key, strlen (s), expected_len);
- result = strcmp (s, (const char *) expected);
- ASSERT (result == 0,
- detail, "unexpected config hash string item '%s' value '%s' (expected '%s')",
- key, s, (const char *) expected);
- break;
- default:
- g_warning ("unknown supplicant config hash item '%s' option type %d",
- key, val_type);
- return FALSE;
+ GVariantIter iter;
+
+ g_assert (g_variant_is_of_type (config, G_VARIANT_TYPE_VARDICT));
+
+ g_variant_iter_init (&iter, config);
+ while (g_variant_iter_next (&iter, "{&sv}", (gpointer) &config_key, (gpointer) &config_value)) {
+ if (!strcmp (key, config_key)) {
+ found = TRUE;
+ switch (val_type) {
+ case TYPE_INT:
+ g_assert (g_variant_is_of_type (config_value, G_VARIANT_TYPE_INT32));
+ g_assert_cmpint (g_variant_get_int32 (config_value), ==, GPOINTER_TO_INT (expected));
+ break;
+ case TYPE_BYTES:
+ g_assert (g_variant_is_of_type (config_value, G_VARIANT_TYPE_BYTESTRING));
+ bytes = g_variant_get_fixed_array (config_value, &len, 1);
+ g_assert_cmpint (len, ==, expected_len);
+ g_assert (memcmp (bytes, expected_array, expected_len) == 0);
+ break;
+ case TYPE_KEYWORD:
+ case TYPE_STRING:
+ g_assert (g_variant_is_of_type (config_value, G_VARIANT_TYPE_STRING));
+ if (expected_len == -1)
+ expected_len = strlen ((const char *) expected);
+ s = g_variant_get_string (config_value, NULL);
+ g_assert_cmpint (strlen (s), ==, expected_len);
+ g_assert_cmpstr (s, ==, expected);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ g_variant_unref (config_value);
}
- return TRUE;
+ return found;
}
static void
test_wifi_open (void)
{
- NMConnection *connection;
+ gs_unref_object NMConnection *connection = NULL;
+ gs_unref_object NMSupplicantConfig *config = NULL;
+ gs_unref_variant GVariant *config_dict = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingIPConfig *s_ip4;
- gs_unref_object NMSupplicantConfig *config = NULL;
- GHashTable *hash;
char *uuid;
gboolean success;
GError *error = NULL;
@@ -156,9 +145,9 @@ test_wifi_open (void)
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
- ASSERT (nm_connection_verify (connection, &error) == TRUE,
- "wifi-open", "failed to verify connection: %s",
- (error && error->message) ? error->message : "(unknown)");
+ success = nm_connection_verify (connection, &error);
+ g_assert_no_error (error);
+ g_assert (success);
config = nm_supplicant_config_new ();
@@ -170,29 +159,21 @@ test_wifi_open (void)
"*added 'bssid' value '11:22:33:44:55:66'*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
"*added 'freq_list' value *");
- success = nm_supplicant_config_add_setting_wireless (config, s_wifi, 0);
- ASSERT (success == TRUE,
- "wifi-open", "failed to add wireless setting to supplicant config.");
+ g_assert (nm_supplicant_config_add_setting_wireless (config, s_wifi, 0));
g_test_assert_expected_messages ();
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
"*added 'key_mgmt' value 'NONE'");
- success = nm_supplicant_config_add_no_security (config);
- ASSERT (success == TRUE,
- "wifi-open", "failed to add wireless security to supplicant config.");
+ g_assert (nm_supplicant_config_add_no_security (config));
g_test_assert_expected_messages ();
- hash = nm_supplicant_config_get_hash (config);
- ASSERT (hash != NULL,
- "wifi-open", "failed to hash supplicant config options.");
-
- validate_opt ("wifi-open", hash, "scan_ssid", TYPE_INT, GINT_TO_POINTER (1), -1);
- validate_opt ("wifi-open", hash, "ssid", TYPE_BYTES, ssid_data, sizeof (ssid_data));
- validate_opt ("wifi-open", hash, "bssid", TYPE_KEYWORD, bssid_str, -1);
- validate_opt ("wifi-open", hash, "key_mgmt", TYPE_KEYWORD, "NONE", -1);
+ config_dict = nm_supplicant_config_to_variant (config);
+ g_assert (config_dict);
- g_hash_table_unref (hash);
- g_object_unref (connection);
+ validate_opt ("wifi-open", config_dict, "scan_ssid", TYPE_INT, GINT_TO_POINTER (1), -1);
+ validate_opt ("wifi-open", config_dict, "ssid", TYPE_BYTES, ssid_data, sizeof (ssid_data));
+ validate_opt ("wifi-open", config_dict, "bssid", TYPE_KEYWORD, bssid_str, -1);
+ validate_opt ("wifi-open", config_dict, "key_mgmt", TYPE_KEYWORD, "NONE", -1);
}
static void
@@ -202,13 +183,13 @@ test_wifi_wep_key (const char *detail,
const unsigned char *expected,
size_t expected_size)
{
- NMConnection *connection;
+ gs_unref_object NMConnection *connection = NULL;
+ gs_unref_object NMSupplicantConfig *config = NULL;
+ gs_unref_variant GVariant *config_dict = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingWirelessSecurity *s_wsec;
NMSettingIPConfig *s_ip4;
- gs_unref_object NMSupplicantConfig *config = NULL;
- GHashTable *hash;
char *uuid;
gboolean success;
GError *error = NULL;
@@ -262,9 +243,9 @@ test_wifi_wep_key (const char *detail,
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
- ASSERT (nm_connection_verify (connection, &error) == TRUE,
- detail, "failed to verify connection: %s",
- (error && error->message) ? error->message : "(unknown)");
+ success = nm_connection_verify (connection, &error);
+ g_assert_no_error (error);
+ g_assert (success);
config = nm_supplicant_config_new ();
@@ -276,9 +257,7 @@ test_wifi_wep_key (const char *detail,
"*added 'bssid' value '11:22:33:44:55:66'*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
"*added 'freq_list' value *");
- success = nm_supplicant_config_add_setting_wireless (config, s_wifi, 0);
- ASSERT (success == TRUE,
- detail, "failed to add wireless setting to supplicant config.");
+ g_assert (nm_supplicant_config_add_setting_wireless (config, s_wifi, 0));
g_test_assert_expected_messages ();
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
@@ -287,27 +266,21 @@ test_wifi_wep_key (const char *detail,
"*added 'wep_key0' value *");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
"*added 'wep_tx_keyidx' value '0'");
- success = nm_supplicant_config_add_setting_wireless_security (config,
+ g_assert (nm_supplicant_config_add_setting_wireless_security (config,
s_wsec,
NULL,
- "376aced7-b28c-46be-9a62-fcdf072571da");
- ASSERT (success == TRUE,
- detail, "failed to add wireless security to supplicant config.");
+ "376aced7-b28c-46be-9a62-fcdf072571da"));
g_test_assert_expected_messages ();
- hash = nm_supplicant_config_get_hash (config);
- ASSERT (hash != NULL,
- detail, "failed to hash supplicant config options.");
+ config_dict = nm_supplicant_config_to_variant (config);
+ g_assert (config_dict);
- validate_opt (detail, hash, "scan_ssid", TYPE_INT, GINT_TO_POINTER (1), -1);
- validate_opt (detail, hash, "ssid", TYPE_BYTES, ssid_data, sizeof (ssid_data));
- validate_opt (detail, hash, "bssid", TYPE_KEYWORD, bssid_str, -1);
- validate_opt (detail, hash, "key_mgmt", TYPE_KEYWORD, "NONE", -1);
- validate_opt (detail, hash, "wep_tx_keyidx", TYPE_INT, GINT_TO_POINTER (0), -1);
- validate_opt (detail, hash, "wep_key0", TYPE_BYTES, expected, expected_size);
-
- g_hash_table_unref (hash);
- g_object_unref (connection);
+ validate_opt (detail, config_dict, "scan_ssid", TYPE_INT, GINT_TO_POINTER (1), -1);
+ validate_opt (detail, config_dict, "ssid", TYPE_BYTES, ssid_data, sizeof (ssid_data));
+ validate_opt (detail, config_dict, "bssid", TYPE_KEYWORD, bssid_str, -1);
+ validate_opt (detail, config_dict, "key_mgmt", TYPE_KEYWORD, "NONE", -1);
+ validate_opt (detail, config_dict, "wep_tx_keyidx", TYPE_INT, GINT_TO_POINTER (0), -1);
+ validate_opt (detail, config_dict, "wep_key0", TYPE_BYTES, expected, expected_size);
}
static void
@@ -340,13 +313,13 @@ test_wifi_wpa_psk (const char *detail,
const unsigned char *expected,
size_t expected_size)
{
- NMConnection *connection;
+ gs_unref_object NMConnection *connection = NULL;
+ gs_unref_object NMSupplicantConfig *config = NULL;
+ gs_unref_variant GVariant *config_dict = NULL;
NMSettingConnection *s_con;
NMSettingWireless *s_wifi;
NMSettingWirelessSecurity *s_wsec;
NMSettingIPConfig *s_ip4;
- gs_unref_object NMSupplicantConfig *config = NULL;
- GHashTable *hash;
char *uuid;
gboolean success;
GError *error = NULL;
@@ -406,9 +379,9 @@ test_wifi_wpa_psk (const char *detail,
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
- ASSERT (nm_connection_verify (connection, &error) == TRUE,
- detail, "failed to verify connection: %s",
- (error && error->message) ? error->message : "(unknown)");
+ success = nm_connection_verify (connection, &error);
+ g_assert_no_error (error);
+ g_assert (success);
config = nm_supplicant_config_new ();
@@ -420,9 +393,7 @@ test_wifi_wpa_psk (const char *detail,
"*added 'bssid' value '11:22:33:44:55:66'*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
"*added 'freq_list' value *");
- success = nm_supplicant_config_add_setting_wireless (config, s_wifi, 0);
- ASSERT (success == TRUE,
- detail, "failed to add wireless setting to supplicant config.");
+ g_assert (nm_supplicant_config_add_setting_wireless (config, s_wifi, 0));
g_test_assert_expected_messages ();
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
@@ -435,29 +406,23 @@ test_wifi_wpa_psk (const char *detail,
"*added 'pairwise' value 'TKIP CCMP'");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
"*added 'group' value 'TKIP CCMP'");
- success = nm_supplicant_config_add_setting_wireless_security (config,
+ g_assert (nm_supplicant_config_add_setting_wireless_security (config,
s_wsec,
NULL,
- "376aced7-b28c-46be-9a62-fcdf072571da");
- ASSERT (success == TRUE,
- detail, "failed to add wireless security to supplicant config.");
+ "376aced7-b28c-46be-9a62-fcdf072571da"));
g_test_assert_expected_messages ();
- hash = nm_supplicant_config_get_hash (config);
- ASSERT (hash != NULL,
- detail, "failed to hash supplicant config options.");
-
- validate_opt (detail, hash, "scan_ssid", TYPE_INT, GINT_TO_POINTER (1), -1);
- validate_opt (detail, hash, "ssid", TYPE_BYTES, ssid_data, sizeof (ssid_data));
- validate_opt (detail, hash, "bssid", TYPE_KEYWORD, bssid_str, -1);
- validate_opt (detail, hash, "key_mgmt", TYPE_KEYWORD, "WPA-PSK", -1);
- validate_opt (detail, hash, "proto", TYPE_KEYWORD, "WPA RSN", -1);
- validate_opt (detail, hash, "pairwise", TYPE_KEYWORD, "TKIP CCMP", -1);
- validate_opt (detail, hash, "group", TYPE_KEYWORD, "TKIP CCMP", -1);
- validate_opt (detail, hash, "psk", key_type, expected, expected_size);
-
- g_hash_table_unref (hash);
- g_object_unref (connection);
+ config_dict = nm_supplicant_config_to_variant (config);
+ g_assert (config_dict);
+
+ validate_opt (detail, config_dict, "scan_ssid", TYPE_INT, GINT_TO_POINTER (1), -1);
+ validate_opt (detail, config_dict, "ssid", TYPE_BYTES, ssid_data, sizeof (ssid_data));
+ validate_opt (detail, config_dict, "bssid", TYPE_KEYWORD, bssid_str, -1);
+ validate_opt (detail, config_dict, "key_mgmt", TYPE_KEYWORD, "WPA-PSK", -1);
+ validate_opt (detail, config_dict, "proto", TYPE_KEYWORD, "WPA RSN", -1);
+ validate_opt (detail, config_dict, "pairwise", TYPE_KEYWORD, "TKIP CCMP", -1);
+ validate_opt (detail, config_dict, "group", TYPE_KEYWORD, "TKIP CCMP", -1);
+ validate_opt (detail, config_dict, "psk", key_type, expected, expected_size);
}
static void
@@ -478,18 +443,12 @@ NMTST_DEFINE ();
int main (int argc, char **argv)
{
- char *base;
-
nmtst_init (&argc, &argv, TRUE);
- /* The tests */
- test_wifi_open ();
- test_wifi_wep ();
- test_wifi_wpa_psk_types ();
+ g_test_add_func ("/supplicant-config/wifi-open", test_wifi_open);
+ g_test_add_func ("/supplicant-config/wifi-wep", test_wifi_wep);
+ g_test_add_func ("/supplicant-config/wifi-wpa-psk-types", test_wifi_wpa_psk_types);
- base = g_path_get_basename (argv[0]);
- fprintf (stdout, "%s: SUCCESS\n", base);
- g_free (base);
- return 0;
+ return g_test_run ();
}
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
index a96d1ce91..83632bd19 100644
--- a/src/tests/Makefile.am
+++ b/src/tests/Makefile.am
@@ -20,6 +20,8 @@ noinst_PROGRAMS = \
test-general-with-expect \
test-ip4-config \
test-ip6-config \
+ test-route-manager-linux \
+ test-route-manager-fake \
test-dcb \
test-resolvconf-capture \
test-wired-defname
@@ -40,6 +42,34 @@ test_ip6_config_SOURCES = \
test_ip6_config_LDADD = \
$(top_builddir)/src/libNetworkManager.la
+####### route manager test #######
+
+test_route_manager_fake_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir)/src/platform/tests \
+ -DSETUP=nm_fake_platform_setup \
+ -DKERNEL_HACKS=0
+
+test_route_manager_fake_SOURCES = \
+ $(top_srcdir)/src/platform/tests/test-common.c \
+ test-route-manager.c
+
+test_route_manager_fake_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
+test_route_manager_linux_SOURCES = \
+ $(top_srcdir)/src/platform/tests/test-common.c \
+ test-route-manager.c
+
+test_route_manager_linux_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir)/src/platform/tests \
+ -DSETUP=nm_linux_platform_setup \
+ -DKERNEL_HACKS=1
+
+test_route_manager_linux_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
####### DCB test #######
test_dcb_SOURCES = \
@@ -90,6 +120,8 @@ EXTRA_DIST = test-secret-agent.py
TESTS = \
test-ip4-config \
test-ip6-config \
+ test-route-manager-fake \
+ test-route-manager-linux \
test-dcb \
test-resolvconf-capture \
test-general \
diff --git a/src/tests/Makefile.in b/src/tests/Makefile.in
index 61e757e7c..f84c5536a 100644
--- a/src/tests/Makefile.in
+++ b/src/tests/Makefile.in
@@ -90,12 +90,14 @@ build_triplet = @build@
host_triplet = @host@
noinst_PROGRAMS = test-general$(EXEEXT) \
test-general-with-expect$(EXEEXT) test-ip4-config$(EXEEXT) \
- test-ip6-config$(EXEEXT) test-dcb$(EXEEXT) \
+ test-ip6-config$(EXEEXT) test-route-manager-linux$(EXEEXT) \
+ test-route-manager-fake$(EXEEXT) test-dcb$(EXEEXT) \
test-resolvconf-capture$(EXEEXT) test-wired-defname$(EXEEXT)
TESTS = test-ip4-config$(EXEEXT) test-ip6-config$(EXEEXT) \
- test-dcb$(EXEEXT) test-resolvconf-capture$(EXEEXT) \
- test-general$(EXEEXT) test-general-with-expect$(EXEEXT) \
- test-wired-defname$(EXEEXT)
+ test-route-manager-fake$(EXEEXT) \
+ test-route-manager-linux$(EXEEXT) test-dcb$(EXEEXT) \
+ test-resolvconf-capture$(EXEEXT) test-general$(EXEEXT) \
+ test-general-with-expect$(EXEEXT) test-wired-defname$(EXEEXT)
subdir = src/tests
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib_readline.m4 \
@@ -149,6 +151,20 @@ test_resolvconf_capture_OBJECTS = \
$(am_test_resolvconf_capture_OBJECTS)
test_resolvconf_capture_DEPENDENCIES = \
$(top_builddir)/src/libNetworkManager.la
+am_test_route_manager_fake_OBJECTS = \
+ test_route_manager_fake-test-common.$(OBJEXT) \
+ test_route_manager_fake-test-route-manager.$(OBJEXT)
+test_route_manager_fake_OBJECTS = \
+ $(am_test_route_manager_fake_OBJECTS)
+test_route_manager_fake_DEPENDENCIES = \
+ $(top_builddir)/src/libNetworkManager.la
+am_test_route_manager_linux_OBJECTS = \
+ test_route_manager_linux-test-common.$(OBJEXT) \
+ test_route_manager_linux-test-route-manager.$(OBJEXT)
+test_route_manager_linux_OBJECTS = \
+ $(am_test_route_manager_linux_OBJECTS)
+test_route_manager_linux_DEPENDENCIES = \
+ $(top_builddir)/src/libNetworkManager.la
am_test_wired_defname_OBJECTS = test-wired-defname.$(OBJEXT)
test_wired_defname_OBJECTS = $(am_test_wired_defname_OBJECTS)
test_wired_defname_DEPENDENCIES = \
@@ -190,10 +206,14 @@ am__v_CCLD_1 =
SOURCES = $(test_dcb_SOURCES) $(test_general_SOURCES) \
$(test_general_with_expect_SOURCES) $(test_ip4_config_SOURCES) \
$(test_ip6_config_SOURCES) $(test_resolvconf_capture_SOURCES) \
+ $(test_route_manager_fake_SOURCES) \
+ $(test_route_manager_linux_SOURCES) \
$(test_wired_defname_SOURCES)
DIST_SOURCES = $(test_dcb_SOURCES) $(test_general_SOURCES) \
$(test_general_with_expect_SOURCES) $(test_ip4_config_SOURCES) \
$(test_ip6_config_SOURCES) $(test_resolvconf_capture_SOURCES) \
+ $(test_route_manager_fake_SOURCES) \
+ $(test_route_manager_linux_SOURCES) \
$(test_wired_defname_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
ctags-recursive dvi-recursive html-recursive info-recursive \
@@ -215,7 +235,7 @@ am__recursive_targets = \
$(RECURSIVE_CLEAN_TARGETS) \
$(am__extra_recursive_targets)
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
- distdir
+ check recheck distdir
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
# and print each of them once, without duplicates. Input order is
@@ -257,9 +277,190 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
@@ -290,6 +491,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -403,6 +605,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -579,6 +782,34 @@ test_ip6_config_LDADD = \
$(top_builddir)/src/libNetworkManager.la
+####### route manager test #######
+test_route_manager_fake_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir)/src/platform/tests \
+ -DSETUP=nm_fake_platform_setup \
+ -DKERNEL_HACKS=0
+
+test_route_manager_fake_SOURCES = \
+ $(top_srcdir)/src/platform/tests/test-common.c \
+ test-route-manager.c
+
+test_route_manager_fake_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
+test_route_manager_linux_SOURCES = \
+ $(top_srcdir)/src/platform/tests/test-common.c \
+ test-route-manager.c
+
+test_route_manager_linux_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir)/src/platform/tests \
+ -DSETUP=nm_linux_platform_setup \
+ -DKERNEL_HACKS=1
+
+test_route_manager_linux_LDADD = \
+ $(top_builddir)/src/libNetworkManager.la
+
+
####### DCB test #######
test_dcb_SOURCES = \
test-dcb.c
@@ -624,7 +855,7 @@ EXTRA_DIST = test-secret-agent.py
all: all-recursive
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -688,6 +919,14 @@ test-resolvconf-capture$(EXEEXT): $(test_resolvconf_capture_OBJECTS) $(test_reso
@rm -f test-resolvconf-capture$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_resolvconf_capture_OBJECTS) $(test_resolvconf_capture_LDADD) $(LIBS)
+test-route-manager-fake$(EXEEXT): $(test_route_manager_fake_OBJECTS) $(test_route_manager_fake_DEPENDENCIES) $(EXTRA_test_route_manager_fake_DEPENDENCIES)
+ @rm -f test-route-manager-fake$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_route_manager_fake_OBJECTS) $(test_route_manager_fake_LDADD) $(LIBS)
+
+test-route-manager-linux$(EXEEXT): $(test_route_manager_linux_OBJECTS) $(test_route_manager_linux_DEPENDENCIES) $(EXTRA_test_route_manager_linux_DEPENDENCIES)
+ @rm -f test-route-manager-linux$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_route_manager_linux_OBJECTS) $(test_route_manager_linux_LDADD) $(LIBS)
+
test-wired-defname$(EXEEXT): $(test_wired_defname_OBJECTS) $(test_wired_defname_DEPENDENCIES) $(EXTRA_test_wired_defname_DEPENDENCIES)
@rm -f test-wired-defname$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(test_wired_defname_OBJECTS) $(test_wired_defname_LDADD) $(LIBS)
@@ -705,6 +944,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ip6-config.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-resolvconf-capture.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-wired-defname.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_route_manager_fake-test-common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_route_manager_fake-test-route-manager.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_route_manager_linux-test-common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_route_manager_linux-test-route-manager.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -727,6 +970,62 @@ distclean-compile:
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+test_route_manager_fake-test-common.o: $(top_srcdir)/src/platform/tests/test-common.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_fake-test-common.o -MD -MP -MF $(DEPDIR)/test_route_manager_fake-test-common.Tpo -c -o test_route_manager_fake-test-common.o `test -f '$(top_srcdir)/src/platform/tests/test-common.c' || echo '$(srcdir)/'`$(top_srcdir)/src/platform/tests/test-common.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_fake-test-common.Tpo $(DEPDIR)/test_route_manager_fake-test-common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/src/platform/tests/test-common.c' object='test_route_manager_fake-test-common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_fake-test-common.o `test -f '$(top_srcdir)/src/platform/tests/test-common.c' || echo '$(srcdir)/'`$(top_srcdir)/src/platform/tests/test-common.c
+
+test_route_manager_fake-test-common.obj: $(top_srcdir)/src/platform/tests/test-common.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_fake-test-common.obj -MD -MP -MF $(DEPDIR)/test_route_manager_fake-test-common.Tpo -c -o test_route_manager_fake-test-common.obj `if test -f '$(top_srcdir)/src/platform/tests/test-common.c'; then $(CYGPATH_W) '$(top_srcdir)/src/platform/tests/test-common.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/platform/tests/test-common.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_fake-test-common.Tpo $(DEPDIR)/test_route_manager_fake-test-common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/src/platform/tests/test-common.c' object='test_route_manager_fake-test-common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_fake-test-common.obj `if test -f '$(top_srcdir)/src/platform/tests/test-common.c'; then $(CYGPATH_W) '$(top_srcdir)/src/platform/tests/test-common.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/platform/tests/test-common.c'; fi`
+
+test_route_manager_fake-test-route-manager.o: test-route-manager.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_fake-test-route-manager.o -MD -MP -MF $(DEPDIR)/test_route_manager_fake-test-route-manager.Tpo -c -o test_route_manager_fake-test-route-manager.o `test -f 'test-route-manager.c' || echo '$(srcdir)/'`test-route-manager.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_fake-test-route-manager.Tpo $(DEPDIR)/test_route_manager_fake-test-route-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-route-manager.c' object='test_route_manager_fake-test-route-manager.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_fake-test-route-manager.o `test -f 'test-route-manager.c' || echo '$(srcdir)/'`test-route-manager.c
+
+test_route_manager_fake-test-route-manager.obj: test-route-manager.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_fake-test-route-manager.obj -MD -MP -MF $(DEPDIR)/test_route_manager_fake-test-route-manager.Tpo -c -o test_route_manager_fake-test-route-manager.obj `if test -f 'test-route-manager.c'; then $(CYGPATH_W) 'test-route-manager.c'; else $(CYGPATH_W) '$(srcdir)/test-route-manager.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_fake-test-route-manager.Tpo $(DEPDIR)/test_route_manager_fake-test-route-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-route-manager.c' object='test_route_manager_fake-test-route-manager.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_fake_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_fake-test-route-manager.obj `if test -f 'test-route-manager.c'; then $(CYGPATH_W) 'test-route-manager.c'; else $(CYGPATH_W) '$(srcdir)/test-route-manager.c'; fi`
+
+test_route_manager_linux-test-common.o: $(top_srcdir)/src/platform/tests/test-common.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_linux-test-common.o -MD -MP -MF $(DEPDIR)/test_route_manager_linux-test-common.Tpo -c -o test_route_manager_linux-test-common.o `test -f '$(top_srcdir)/src/platform/tests/test-common.c' || echo '$(srcdir)/'`$(top_srcdir)/src/platform/tests/test-common.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_linux-test-common.Tpo $(DEPDIR)/test_route_manager_linux-test-common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/src/platform/tests/test-common.c' object='test_route_manager_linux-test-common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_linux-test-common.o `test -f '$(top_srcdir)/src/platform/tests/test-common.c' || echo '$(srcdir)/'`$(top_srcdir)/src/platform/tests/test-common.c
+
+test_route_manager_linux-test-common.obj: $(top_srcdir)/src/platform/tests/test-common.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_linux-test-common.obj -MD -MP -MF $(DEPDIR)/test_route_manager_linux-test-common.Tpo -c -o test_route_manager_linux-test-common.obj `if test -f '$(top_srcdir)/src/platform/tests/test-common.c'; then $(CYGPATH_W) '$(top_srcdir)/src/platform/tests/test-common.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/platform/tests/test-common.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_linux-test-common.Tpo $(DEPDIR)/test_route_manager_linux-test-common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/src/platform/tests/test-common.c' object='test_route_manager_linux-test-common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_linux-test-common.obj `if test -f '$(top_srcdir)/src/platform/tests/test-common.c'; then $(CYGPATH_W) '$(top_srcdir)/src/platform/tests/test-common.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/platform/tests/test-common.c'; fi`
+
+test_route_manager_linux-test-route-manager.o: test-route-manager.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_linux-test-route-manager.o -MD -MP -MF $(DEPDIR)/test_route_manager_linux-test-route-manager.Tpo -c -o test_route_manager_linux-test-route-manager.o `test -f 'test-route-manager.c' || echo '$(srcdir)/'`test-route-manager.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_linux-test-route-manager.Tpo $(DEPDIR)/test_route_manager_linux-test-route-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-route-manager.c' object='test_route_manager_linux-test-route-manager.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_linux-test-route-manager.o `test -f 'test-route-manager.c' || echo '$(srcdir)/'`test-route-manager.c
+
+test_route_manager_linux-test-route-manager.obj: test-route-manager.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_route_manager_linux-test-route-manager.obj -MD -MP -MF $(DEPDIR)/test_route_manager_linux-test-route-manager.Tpo -c -o test_route_manager_linux-test-route-manager.obj `if test -f 'test-route-manager.c'; then $(CYGPATH_W) 'test-route-manager.c'; else $(CYGPATH_W) '$(srcdir)/test-route-manager.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_route_manager_linux-test-route-manager.Tpo $(DEPDIR)/test_route_manager_linux-test-route-manager.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test-route-manager.c' object='test_route_manager_linux-test-route-manager.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_route_manager_linux_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_route_manager_linux-test-route-manager.obj `if test -f 'test-route-manager.c'; then $(CYGPATH_W) 'test-route-manager.c'; else $(CYGPATH_W) '$(srcdir)/test-route-manager.c'; fi`
+
mostlyclean-libtool:
-rm -f *.lo
@@ -832,98 +1131,224 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-ip4-config.log: test-ip4-config$(EXEEXT)
+ @p='test-ip4-config$(EXEEXT)'; \
+ b='test-ip4-config'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-ip6-config.log: test-ip6-config$(EXEEXT)
+ @p='test-ip6-config$(EXEEXT)'; \
+ b='test-ip6-config'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-route-manager-fake.log: test-route-manager-fake$(EXEEXT)
+ @p='test-route-manager-fake$(EXEEXT)'; \
+ b='test-route-manager-fake'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-route-manager-linux.log: test-route-manager-linux$(EXEEXT)
+ @p='test-route-manager-linux$(EXEEXT)'; \
+ b='test-route-manager-linux'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-dcb.log: test-dcb$(EXEEXT)
+ @p='test-dcb$(EXEEXT)'; \
+ b='test-dcb'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-resolvconf-capture.log: test-resolvconf-capture$(EXEEXT)
+ @p='test-resolvconf-capture$(EXEEXT)'; \
+ b='test-resolvconf-capture'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-general.log: test-general$(EXEEXT)
+ @p='test-general$(EXEEXT)'; \
+ b='test-general'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-general-with-expect.log: test-general-with-expect$(EXEEXT)
+ @p='test-general-with-expect$(EXEEXT)'; \
+ b='test-general-with-expect'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-wired-defname.log: test-wired-defname$(EXEEXT)
+ @p='test-wired-defname$(EXEEXT)'; \
+ b='test-wired-defname'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -1007,6 +1432,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -1103,7 +1531,7 @@ uninstall-am:
installcheck-am installdirs installdirs-am maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/tests/config/Makefile.in b/src/tests/config/Makefile.in
index 73ff9d480..6d1dd4bcb 100644
--- a/src/tests/config/Makefile.in
+++ b/src/tests/config/Makefile.in
@@ -203,13 +203,196 @@ am__tty_colors = { \
std=''; \
fi; \
}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
am__DIST_COMMON = $(srcdir)/Makefile.in \
- $(top_srcdir)/build-aux/depcomp
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -323,6 +506,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -498,7 +682,7 @@ EXTRA_DIST = \
all: all-am
.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@@ -630,98 +814,168 @@ cscopelist-am: $(am__tagged_files)
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-check-TESTS: $(TESTS)
- @failed=0; all=0; xfail=0; xpass=0; skip=0; \
- srcdir=$(srcdir); export srcdir; \
- list=' $(TESTS) '; \
- $(am__tty_colors); \
- if test -n "$$list"; then \
- for tst in $$list; do \
- if test -f ./$$tst; then dir=./; \
- elif test -f $$tst; then dir=; \
- else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xpass=`expr $$xpass + 1`; \
- failed=`expr $$failed + 1`; \
- col=$$red; res=XPASS; \
- ;; \
- *) \
- col=$$grn; res=PASS; \
- ;; \
- esac; \
- elif test $$? -ne 77; then \
- all=`expr $$all + 1`; \
- case " $(XFAIL_TESTS) " in \
- *[\ \ ]$$tst[\ \ ]*) \
- xfail=`expr $$xfail + 1`; \
- col=$$lgn; res=XFAIL; \
- ;; \
- *) \
- failed=`expr $$failed + 1`; \
- col=$$red; res=FAIL; \
- ;; \
- esac; \
- else \
- skip=`expr $$skip + 1`; \
- col=$$blu; res=SKIP; \
- fi; \
- echo "$${col}$$res$${std}: $$tst"; \
- done; \
- if test "$$all" -eq 1; then \
- tests="test"; \
- All=""; \
- else \
- tests="tests"; \
- All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
fi; \
- if test "$$failed" -eq 0; then \
- if test "$$xfail" -eq 0; then \
- banner="$$All$$all $$tests passed"; \
- else \
- if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
- banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
- fi; \
- else \
- if test "$$xpass" -eq 0; then \
- banner="$$failed of $$all $$tests failed"; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
else \
- if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
- banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
fi; \
- fi; \
- dashes="$$banner"; \
- skipped=""; \
- if test "$$skip" -ne 0; then \
- if test "$$skip" -eq 1; then \
- skipped="($$skip test was not run)"; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
else \
- skipped="($$skip tests were not run)"; \
+ color_start= color_end=; \
fi; \
- test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$skipped"; \
- fi; \
- report=""; \
- if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
- report="Please report to $(PACKAGE_BUGREPORT)"; \
- test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
- dashes="$$report"; \
- fi; \
- dashes=`echo "$$dashes" | sed s/./=/g`; \
- if test "$$failed" -eq 0; then \
- col="$$grn"; \
- else \
- col="$$red"; \
- fi; \
- echo "$${col}$$dashes$${std}"; \
- echo "$${col}$$banner$${std}"; \
- test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
- test -z "$$report" || echo "$${col}$$report$${std}"; \
- echo "$${col}$$dashes$${std}"; \
- test "$$failed" -eq 0; \
- else :; fi
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+test-config.log: test-config$(EXEEXT)
+ @p='test-config$(EXEEXT)'; \
+ b='test-config'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -778,6 +1032,9 @@ install-strip:
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
clean-generic:
@@ -873,7 +1130,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags tags-am uninstall uninstall-am
+ recheck tags tags-am uninstall uninstall-am
.PRECIOUS: Makefile
diff --git a/src/tests/config/NetworkManager.conf b/src/tests/config/NetworkManager.conf
index 401ba48a7..a750c801e 100644
--- a/src/tests/config/NetworkManager.conf
+++ b/src/tests/config/NetworkManager.conf
@@ -13,3 +13,71 @@ response=Hello
[extra-section]
extra-key=some value
+
+
+
+[connection]
+ipv4.route-metric=50
+ipv6.ip6_privacy=0
+dummy.test1=no
+dummy.test2=no
+
+ord.key00=A-0.0.00
+ord.key01=A-0.0.01
+ord.key02=A-0.0.02
+ord.key03=A-0.0.03
+ord.key04=A-0.0.04
+ord.key05=A-0.0.05
+ord.key06=A-0.0.06
+ord.key07=A-0.0.07
+ord.key08=A-0.0.08
+ord.key09=A-0.0.09
+
+[connection.dev51]
+match-device=mac:00:00:00:00:00:51
+stop-match=yes
+ipv4.route-metric=51
+dummy.test1=yes
+
+[connection.dev52]
+match-device=mac:00:00:00:00:00:52
+ipv4.route-metric=52
+
+[connection.public]
+match-device=interface-name:wlan1
+# match-wifi is not yet implemented. Just an idea what could be useful.
+match-wifi=ssid:*[Ss]tarbucks*|*University*
+ipv6.ip6_privacy=2
+
+
+# the following sections are tested for their order across
+# multiple files.
+[connection.ord.0.1]
+ord.key03=A-0.1.03
+ord.key04=A-0.1.04
+ord.key05=A-0.1.05
+ord.key06=A-0.1.06
+ord.key07=A-0.1.07
+ord.key08=A-0.1.08
+ord.key09=A-0.1.09
+ord.ovw01=A-0.1.ovw01
+[connection.ord.0.2]
+ord.key02=A-0.2.02
+ord.key03=A-0.2.03
+ord.key04=A-0.2.04
+ord.key05=A-0.2.05
+ord.key06=A-0.2.06
+ord.key07=A-0.2.07
+ord.key08=A-0.2.08
+ord.key09=A-0.2.09
+[connection.ord.0.3]
+ord.key01=A-0.3.01
+ord.key02=A-0.3.02
+ord.key03=A-0.3.03
+ord.key04=A-0.3.04
+ord.key05=A-0.3.05
+ord.key06=A-0.3.06
+ord.key07=A-0.3.07
+ord.key08=A-0.3.08
+ord.key09=A-0.3.09
+ord.ovw01=A-0.3.ovw01
diff --git a/src/tests/config/conf.d/00-overrides.conf b/src/tests/config/conf.d/00-overrides.conf
index 0aa19d484..f26ed93b9 100644
--- a/src/tests/config/conf.d/00-overrides.conf
+++ b/src/tests/config/conf.d/00-overrides.conf
@@ -1,11 +1,57 @@
[main]
dhcp=dhcpcd
+no-auto-default=spec1,spec2
+ignore-carrier=\s space1 \s
+
[logging]
domains=PLATFORM,DNS,WIFI
+[appendable-test]
+non-appendable-key1+=i-will-be-dropped
+non-appendable-key2-=i-will-be-dropped
+
[order]
a=0
b=0
c=0
+
+# the following sections are tested for their order across
+# multiple files.
+[connection.ord.1.1]
+ord.key06=B-1.1.06
+ord.key07=B-1.1.07
+ord.key08=B-1.1.08
+ord.key09=B-1.1.09
+[connection.ord.1.2]
+ord.key05=B-1.2.05
+ord.key06=B-1.2.06
+ord.key07=B-1.2.07
+ord.key08=B-1.2.08
+ord.key09=B-1.2.09
+[connection.ord.1.3]
+ord.key04=B-1.3.04
+ord.key05=B-1.3.05
+ord.key06=B-1.3.06
+ord.key07=B-1.3.07
+ord.key08=B-1.3.08
+ord.key09=B-1.3.09
+
+
+[.test-append-stringlist.1]
+val1=a,b
+
+val2-=VAL2
+val2=VAL2
+
+val3=VAL3
+val3-=VAL3
+
+val4=VAL4
+val4+=VAL4,va,vb,va,vb
+val4-=VAL4,va
+
+val5=VAL5
+val5-=VAL5
+val5+=VAL5
diff --git a/src/tests/config/conf.d/10-more.conf b/src/tests/config/conf.d/10-more.conf
index b1424a4bc..eadb7f96f 100644
--- a/src/tests/config/conf.d/10-more.conf
+++ b/src/tests/config/conf.d/10-more.conf
@@ -1,5 +1,12 @@
[main]
extra=hello
+
+no-auto-default-=spec1
+no-auto-default+=spec3
+
+ignore-carrier+=\sspace2\t
+
+[.test-append-stringlist.0]
new+=something
[connectivity]
@@ -9,3 +16,25 @@ uri=http://example.net
a=10
b=10
+# the following sections are tested for their order across
+# multiple files.
+[connection.ord.2.1]
+ord.key09=C-2.1.09
+[connection.ord.2.2]
+ord.key08=C-2.2.08
+ord.key09=C-2.2.09
+[connection.ord.2.3]
+ord.key07=C-2.3.07
+ord.key08=C-2.3.08
+ord.key09=C-2.3.09
+
+# you can overwrite individual settings in a file loaded
+# previously. But note that this does not bump the priority
+# of the section, i.e. [connection.ord.0.1] still has a pretty
+# low priority and is shadowed by [connection.ord.2.1].
+[connection.ord.0.1]
+ord.ovw01=C-0.1.ovw01
+
+
+[.test-append-stringlist.1]
+val1-=b
diff --git a/src/tests/config/conf.d/90-last.conf b/src/tests/config/conf.d/90-last.conf
index dc1de394f..7d078788d 100644
--- a/src/tests/config/conf.d/90-last.conf
+++ b/src/tests/config/conf.d/90-last.conf
@@ -3,3 +3,6 @@ plugins+=one,two
[order]
a=90
+
+[.test-append-stringlist.1]
+val1+=c,a
diff --git a/src/tests/config/nm-test-device.c b/src/tests/config/nm-test-device.c
index 512085e99..b5f65ded6 100644
--- a/src/tests/config/nm-test-device.c
+++ b/src/tests/config/nm-test-device.c
@@ -61,7 +61,7 @@ dispose (GObject *object)
g_object_class->dispose (object);
}
-static guint32
+static NMDeviceCapabilities
get_generic_capabilities (NMDevice *device)
{
return NM_DEVICE_CAP_IS_NON_KERNEL;
diff --git a/src/tests/config/test-config.c b/src/tests/config/test-config.c
index e027eab84..8b8028e63 100644
--- a/src/tests/config/test-config.c
+++ b/src/tests/config/test-config.c
@@ -32,8 +32,8 @@
#include "nm-test-utils.h"
-static void
-setup_config (const char *config_file, const char *config_dir, ...)
+static NMConfig *
+setup_config (GError **error, const char *config_file, const char *config_dir, ...)
{
va_list ap;
GPtrArray *args;
@@ -41,6 +41,11 @@ setup_config (const char *config_file, const char *config_dir, ...)
int argc;
GOptionContext *context;
gboolean success;
+ NMConfig *config;
+ GError *local_error = NULL;
+ NMConfigCmdLineOptions *cli;
+
+ g_assert (!error || !*error);
args = g_ptr_array_new ();
g_ptr_array_add (args, "test-config");
@@ -57,8 +62,10 @@ setup_config (const char *config_file, const char *config_dir, ...)
argv = (char **)args->pdata;
argc = args->len;
+ cli = nm_config_cmd_line_options_new ();
+
context = g_option_context_new (NULL);
- g_option_context_add_main_entries (context, nm_config_get_options (), NULL);
+ nm_config_cmd_line_options_add_to_entries (cli, context);
success = g_option_context_parse (context, &argc, &argv, NULL);
g_option_context_free (context);
@@ -66,24 +73,36 @@ setup_config (const char *config_file, const char *config_dir, ...)
g_printerr ("Invalid options.\n");
g_ptr_array_free (args, TRUE);
+
+ config = nm_config_setup (cli, &local_error);
+ if (error) {
+ g_assert (!config);
+ g_assert (local_error);
+ g_propagate_error (error, local_error);
+ } else {
+ g_assert (config);
+ g_assert_no_error (local_error);
+ }
+ nm_config_cmd_line_options_free (cli);
+ return config;
}
static void
test_config_simple (void)
{
NMConfig *config;
- GError *error = NULL;
const char **plugins;
char *value;
+ gs_unref_object NMDevice *dev50 = nm_test_device_new ("00:00:00:00:00:50");
+ gs_unref_object NMDevice *dev51 = nm_test_device_new ("00:00:00:00:00:51");
+ gs_unref_object NMDevice *dev52 = nm_test_device_new ("00:00:00:00:00:52");
- setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir", NULL);
- config = nm_config_new (&error);
- g_assert_no_error (error);
+ config = setup_config (NULL, SRCDIR "/NetworkManager.conf", "/no/such/dir", NULL);
- g_assert_cmpstr (nm_config_get_path (config), ==, SRCDIR "/NetworkManager.conf");
+ g_assert_cmpstr (nm_config_data_get_config_main_file (nm_config_get_data_orig (config)), ==, SRCDIR "/NetworkManager.conf");
g_assert_cmpstr (nm_config_get_dhcp_client (config), ==, "dhclient");
g_assert_cmpstr (nm_config_get_log_level (config), ==, "INFO");
- g_assert_cmpint (nm_config_get_connectivity_interval (config), ==, 100);
+ g_assert_cmpint (nm_config_data_get_connectivity_interval (nm_config_get_data_orig (config)), ==, 100);
plugins = nm_config_get_plugins (config);
g_assert_cmpint (g_strv_length ((char **)plugins), ==, 3);
@@ -91,19 +110,63 @@ test_config_simple (void)
g_assert_cmpstr (plugins[1], ==, "bar");
g_assert_cmpstr (plugins[2], ==, "baz");
- value = nm_config_get_value (config, "extra-section", "extra-key", NULL);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "extra-section", "extra-key", NM_CONFIG_GET_VALUE_NONE);
g_assert_cmpstr (value, ==, "some value");
g_free (value);
- value = nm_config_get_value (config, "extra-section", "no-key", &error);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "extra-section", "no-key", NM_CONFIG_GET_VALUE_NONE);
g_assert (!value);
- g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND);
- g_clear_error (&error);
- value = nm_config_get_value (config, "no-section", "no-key", &error);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "no-section", "no-key", NM_CONFIG_GET_VALUE_NONE);
g_assert (!value);
- g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND);
- g_clear_error (&error);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "connection", "ipv6.ip6_privacy", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, "0");
+ g_free (value);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "connection.dev51", "ipv4.route-metric", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, "51");
+ g_free (value);
+
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "ipv6.route-metric", NULL);
+ g_assert_cmpstr (value, ==, NULL);
+ g_free (value);
+
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "ipv4.route-metric", NULL);
+ g_assert_cmpstr (value, ==, "50");
+ g_free (value);
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "ipv4.route-metric", dev50);
+ g_assert_cmpstr (value, ==, "50");
+ g_free (value);
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "ipv4.route-metric", dev51);
+ g_assert_cmpstr (value, ==, "51");
+ g_free (value);
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "ipv4.route-metric", dev52);
+ g_assert_cmpstr (value, ==, "52");
+ g_free (value);
+
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "dummy.test1", dev51);
+ g_assert_cmpstr (value, ==, "yes");
+ g_free (value);
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "dummy.test1", dev50);
+ g_assert_cmpstr (value, ==, "no");
+ g_free (value);
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "dummy.test2", dev51);
+ g_assert_cmpstr (value, ==, NULL);
+ g_free (value);
+
+ value = nm_config_data_get_connection_default (nm_config_get_data_orig (config), "dummy.test2", dev50);
+ g_assert_cmpstr (value, ==, "no");
+ g_free (value);
+
g_object_unref (config);
}
@@ -111,45 +174,38 @@ test_config_simple (void)
static void
test_config_non_existent (void)
{
- NMConfig *config;
gs_free_error GError *error = NULL;
- setup_config (SRCDIR "/no-such-file", "/no/such/dir", NULL);
- config = nm_config_new (&error);
- g_assert (!config);
+ setup_config (&error, SRCDIR "/no-such-file", "/no/such/dir", NULL);
g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND);
+ g_clear_error (&error);
}
static void
test_config_parse_error (void)
{
- NMConfig *config;
gs_free_error GError *error = NULL;
- setup_config (SRCDIR "/bad.conf", "/no/such/dir", NULL);
- config = nm_config_new (&error);
- g_assert (!config);
+ setup_config (&error, SRCDIR "/bad.conf", "/no/such/dir", NULL);
g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
+ g_clear_error (&error);
}
static void
test_config_override (void)
{
NMConfig *config;
- GError *error = NULL;
const char **plugins;
- setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir",
- "--plugins", "alpha,beta,gamma,delta",
- "--connectivity-interval", "12",
- NULL);
- config = nm_config_new (&error);
- g_assert_no_error (error);
+ config = setup_config (NULL, SRCDIR "/NetworkManager.conf", "/no/such/dir",
+ "--plugins", "alpha,beta,gamma,delta",
+ "--connectivity-interval", "12",
+ NULL);
- g_assert_cmpstr (nm_config_get_path (config), ==, SRCDIR "/NetworkManager.conf");
+ g_assert_cmpstr (nm_config_data_get_config_main_file (nm_config_get_data_orig (config)), ==, SRCDIR "/NetworkManager.conf");
g_assert_cmpstr (nm_config_get_dhcp_client (config), ==, "dhclient");
g_assert_cmpstr (nm_config_get_log_level (config), ==, "INFO");
- g_assert_cmpint (nm_config_get_connectivity_interval (config), ==, 12);
+ g_assert_cmpint (nm_config_data_get_connectivity_interval (nm_config_get_data_orig (config)), ==, 12);
plugins = nm_config_get_plugins (config);
g_assert_cmpint (g_strv_length ((char **)plugins), ==, 4);
@@ -179,37 +235,36 @@ test_config_no_auto_default (void)
g_assert_cmpint (nwrote, ==, 18);
close (fd);
- setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir",
- "--no-auto-default", state_file,
- NULL);
- config = nm_config_new (&error);
- g_assert_no_error (error);
+ config = setup_config (NULL, SRCDIR "/NetworkManager.conf", "/no/such/dir",
+ "--no-auto-default", state_file,
+ NULL);
dev1 = nm_test_device_new ("11:11:11:11:11:11");
dev2 = nm_test_device_new ("22:22:22:22:22:22");
dev3 = nm_test_device_new ("33:33:33:33:33:33");
dev4 = nm_test_device_new ("44:44:44:44:44:44");
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev1));
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev2));
- g_assert (nm_config_get_ethernet_can_auto_default (config, dev3));
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev4));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev1));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev2));
+ g_assert (!nm_config_get_no_auto_default_for_device (config, dev3));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev4));
+
+ g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*config: update * (no-auto-default)*");
+ nm_config_set_no_auto_default_for_device (config, dev3);
+ g_test_assert_expected_messages ();
- nm_config_set_ethernet_no_auto_default (config, dev3);
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev3));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev3));
g_object_unref (config);
- setup_config (SRCDIR "/NetworkManager.conf", "/no/such/dir",
- "--no-auto-default", state_file,
- NULL);
- config = nm_config_new (&error);
- g_assert_no_error (error);
+ config = setup_config (NULL, SRCDIR "/NetworkManager.conf", "/no/such/dir",
+ "--no-auto-default", state_file,
+ NULL);
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev1));
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev2));
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev3));
- g_assert (!nm_config_get_ethernet_can_auto_default (config, dev4));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev1));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev2));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev3));
+ g_assert (nm_config_get_no_auto_default_for_device (config, dev4));
g_object_unref (config);
@@ -226,20 +281,18 @@ static void
test_config_confdir (void)
{
NMConfig *config;
- GError *error = NULL;
const char **plugins;
char *value;
+ GSList *specs;
- setup_config (SRCDIR "/NetworkManager.conf", SRCDIR "/conf.d", NULL);
- config = nm_config_new (&error);
- g_assert_no_error (error);
+ config = setup_config (NULL, SRCDIR "/NetworkManager.conf", SRCDIR "/conf.d", NULL);
- g_assert_cmpstr (nm_config_get_path (config), ==, SRCDIR "/NetworkManager.conf");
+ g_assert_cmpstr (nm_config_data_get_config_main_file (nm_config_get_data_orig (config)), ==, SRCDIR "/NetworkManager.conf");
g_assert_cmpstr (nm_config_get_dhcp_client (config), ==, "dhcpcd");
g_assert_cmpstr (nm_config_get_log_level (config), ==, "INFO");
g_assert_cmpstr (nm_config_get_log_domains (config), ==, "PLATFORM,DNS,WIFI");
- g_assert_cmpstr (nm_config_get_connectivity_uri (config), ==, "http://example.net");
- g_assert_cmpint (nm_config_get_connectivity_interval (config), ==, 100);
+ g_assert_cmpstr (nm_config_data_get_connectivity_uri (nm_config_get_data_orig (config)), ==, "http://example.net");
+ g_assert_cmpint (nm_config_data_get_connectivity_interval (nm_config_get_data_orig (config)), ==, 100);
plugins = nm_config_get_plugins (config);
g_assert_cmpint (g_strv_length ((char **)plugins), ==, 5);
@@ -249,38 +302,98 @@ test_config_confdir (void)
g_assert_cmpstr (plugins[3], ==, "one");
g_assert_cmpstr (plugins[4], ==, "two");
- value = nm_config_get_value (config, "main", "extra", NULL);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "main", "extra", NM_CONFIG_GET_VALUE_NONE);
g_assert_cmpstr (value, ==, "hello");
g_free (value);
- value = nm_config_get_value (config, "main", "new", NULL);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "main", "no-auto-default", NM_CONFIG_GET_VALUE_TYPE_SPEC);
+ specs = nm_match_spec_split (value);
+ g_free (value);
+ g_assert_cmpint (g_slist_length (specs), ==, 2);
+ g_assert_cmpstr (g_slist_nth_data (specs, 0), ==, "spec2");
+ g_assert_cmpstr (g_slist_nth_data (specs, 1), ==, "spec3");
+ g_slist_free_full (specs, g_free);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "main", "ignore-carrier", NM_CONFIG_GET_VALUE_TYPE_SPEC);
+ specs = nm_match_spec_split (value);
+ g_free (value);
+ g_assert_cmpint (g_slist_length (specs), ==, 2);
+ g_assert_cmpstr (g_slist_nth_data (specs, 0), ==, " space1 ");
+ g_assert_cmpstr (g_slist_nth_data (specs, 1), ==, " space2\t");
+ g_slist_free_full (specs, g_free);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST".0", "new", NM_CONFIG_GET_VALUE_NONE);
g_assert_cmpstr (value, ==, "something"); /* not ",something" */
g_free (value);
- value = nm_config_get_value (config, "order", "a", NULL);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "order", "a", NM_CONFIG_GET_VALUE_NONE);
g_assert_cmpstr (value, ==, "90");
g_free (value);
- value = nm_config_get_value (config, "order", "b", NULL);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "order", "b", NM_CONFIG_GET_VALUE_NONE);
g_assert_cmpstr (value, ==, "10");
g_free (value);
- value = nm_config_get_value (config, "order", "c", NULL);
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), "order", "c", NM_CONFIG_GET_VALUE_NONE);
g_assert_cmpstr (value, ==, "0");
g_free (value);
+ g_assert (!nm_config_data_has_value (nm_config_get_data_orig (config), "appendable-test", "non-appendable-key1", NM_CONFIG_GET_VALUE_RAW));
+ g_assert (!nm_config_data_has_value (nm_config_get_data_orig (config), "appendable-test", "non-appendable-key1+", NM_CONFIG_GET_VALUE_RAW));
+ g_assert (!nm_config_data_has_value (nm_config_get_data_orig (config), "appendable-test", "non-appendable-key1-", NM_CONFIG_GET_VALUE_RAW));
+ g_assert (!nm_config_data_has_value (nm_config_get_data_orig (config), "appendable-test", "non-appendable-key2", NM_CONFIG_GET_VALUE_RAW));
+ g_assert (!nm_config_data_has_value (nm_config_get_data_orig (config), "appendable-test", "non-appendable-key2+", NM_CONFIG_GET_VALUE_RAW));
+ g_assert (!nm_config_data_has_value (nm_config_get_data_orig (config), "appendable-test", "non-appendable-key2-", NM_CONFIG_GET_VALUE_RAW));
+
+#define ASSERT_GET_CONN_DEFAULT(xconfig, xname, xvalue) \
+ G_STMT_START { \
+ gs_free char *_value = nm_config_data_get_connection_default (nm_config_get_data_orig (xconfig), (xname), NULL); \
+ g_assert_cmpstr (_value, ==, (xvalue)); \
+ } G_STMT_END
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key00", "A-0.0.00");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key01", "A-0.3.01");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key02", "A-0.2.02");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key03", "A-0.1.03");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key04", "B-1.3.04");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key05", "B-1.2.05");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key06", "B-1.1.06");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key07", "C-2.3.07");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key08", "C-2.2.08");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.key09", "C-2.1.09");
+ ASSERT_GET_CONN_DEFAULT (config, "ord.ovw01", "C-0.1.ovw01");
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST".1", "val1", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, "a,c");
+ g_free (value);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST".1", "val2", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, "VAL2");
+ g_free (value);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST".1", "val3", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, NULL);
+ g_free (value);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST".1", "val4", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, "vb,vb");
+ g_free (value);
+
+ value = nm_config_data_get_value (nm_config_get_data_orig (config), NM_CONFIG_KEYFILE_GROUPPREFIX_TEST_APPEND_STRINGLIST".1", "val5", NM_CONFIG_GET_VALUE_NONE);
+ g_assert_cmpstr (value, ==, "VAL5");
+ g_free (value);
+
+ nm_config_data_log (nm_config_get_data_orig (config), ">>> TEST: ");
+
g_object_unref (config);
}
static void
test_config_confdir_parse_error (void)
{
- NMConfig *config;
- gs_free_error GError *error = NULL;
+ GError *error = NULL;
/* Using SRCDIR as the conf dir will pick up bad.conf */
- setup_config (SRCDIR "/NetworkManager.conf", SRCDIR, NULL);
- config = nm_config_new (&error);
- g_assert (!config);
+ setup_config (&error, SRCDIR "/NetworkManager.conf", SRCDIR, NULL);
g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
+ g_clear_error (&error);
}
NMTST_DEFINE ();
diff --git a/src/tests/test-general-with-expect.c b/src/tests/test-general-with-expect.c
index 4a0627c9a..bb52bde20 100644
--- a/src/tests/test-general-with-expect.c
+++ b/src/tests/test-general-with-expect.c
@@ -29,6 +29,7 @@
#include "NetworkManagerUtils.h"
#include "nm-logging.h"
+#include "nm-multi-index.h"
#include "nm-test-utils.h"
@@ -330,11 +331,109 @@ test_nm_utils_kill_child (void)
g_test_assert_expected_messages ();
}
+/*******************************************/
+
+static void
+_remove_at_indexes_init_random_idx (GArray *idx, guint array_len, guint idx_len)
+{
+ GRand *rand = nmtst_get_rand ();
+ gs_free char *mask = NULL;
+ guint i, max_test_idx;
+
+ g_assert (idx);
+ g_assert (array_len > 0);
+ g_assert (idx_len >= 1 && idx_len <= array_len);
+
+ mask = g_new0 (char, array_len);
+
+ max_test_idx = array_len - 1;
+ for (i = 0; i < idx_len; i++) {
+ guint itest;
+
+ /* find a index itest that is not yet taken */
+ if (max_test_idx == 0)
+ itest = 0;
+ else
+ itest = g_rand_int_range (rand, 0, max_test_idx);
+ while (itest < array_len && mask[itest])
+ itest++;
+ g_assert (itest <= max_test_idx);
+ g_assert (!mask[itest]);
+
+ mask[itest] = TRUE;
+ if (itest == max_test_idx) {
+ g_assert (max_test_idx > 0 || i == idx_len - 1);
+
+ if (max_test_idx == 0)
+ g_assert_cmpint (i, ==, idx_len - 1);
+ else {
+ max_test_idx--;
+ while (max_test_idx > 0 && mask[max_test_idx])
+ max_test_idx--;
+ if (mask[max_test_idx])
+ g_assert_cmpint (i, ==, idx_len - 1);
+ }
+ }
+ }
+
+ g_array_set_size (idx, 0);
+ for (i = 0; i < array_len; i++) {
+ if (mask[i])
+ g_array_append_val (idx, i);
+ }
+ g_assert_cmpint (idx->len, ==, idx_len);
+}
+
+static void
+test_nm_utils_array_remove_at_indexes ()
+{
+ gs_unref_array GArray *idx = NULL, *array = NULL;
+ gs_unref_hashtable GHashTable *unique = NULL;
+ guint i_len, i_idx_len, i_rnd, i;
+
+ idx = g_array_new (FALSE, FALSE, sizeof (guint));
+ array = g_array_new (FALSE, FALSE, sizeof (gssize));
+ unique = g_hash_table_new (NULL, NULL);
+ for (i_len = 1; i_len < 20; i_len++) {
+ for (i_idx_len = 1; i_idx_len <= i_len; i_idx_len++) {
+ for (i_rnd = 0; i_rnd < 20; i_rnd++) {
+
+ _remove_at_indexes_init_random_idx (idx, i_len, i_idx_len);
+ g_array_set_size (array, i_len);
+ for (i = 0; i < i_len; i++)
+ g_array_index (array, gssize, i) = i;
+
+ nm_utils_array_remove_at_indexes (array, &g_array_index (idx, guint, 0), i_idx_len);
+
+ g_hash_table_remove_all (unique);
+ /* ensure that all the indexes are still unique */
+ for (i = 0; i < array->len; i++)
+ g_hash_table_add (unique, GUINT_TO_POINTER (g_array_index (array, gssize, i)));
+ g_assert_cmpint (g_hash_table_size (unique), ==, array->len);
+
+ for (i = 0; i < idx->len; i++)
+ g_hash_table_add (unique, GUINT_TO_POINTER (g_array_index (idx, guint, i)));
+ g_assert_cmpint (g_hash_table_size (unique), ==, i_len);
+
+ /* ensure proper sort order in array */
+ for (i = 0; i < array->len; i++) {
+ gssize i1 = g_array_index (array, gssize, i);
+
+ g_assert (i1 >= 0 && i1 < i_len);
+ if (i > 0) {
+ gsize i0 = g_array_index (array, gssize, i - 1);
+ g_assert_cmpint (i0, <, i1);
+ }
+ }
+ }
+ }
+ }
+}
/*******************************************/
static void
-test_nm_ethernet_address_is_valid ()
+test_nm_ethernet_address_is_valid (void)
{
g_assert (!nm_ethernet_address_is_valid (NULL, -1));
g_assert (!nm_ethernet_address_is_valid (NULL, ETH_ALEN));
@@ -360,6 +459,362 @@ test_nm_ethernet_address_is_valid ()
/*******************************************/
+typedef struct {
+ union {
+ NMMultiIndexId id_base;
+ guint bucket;
+ };
+} NMMultiIndexIdTest;
+
+typedef struct {
+ guint64 buckets;
+ gpointer ptr_value;
+} NMMultiIndexTestValue;
+
+static gboolean
+_mi_value_bucket_has (const NMMultiIndexTestValue *value, guint bucket)
+{
+ g_assert (value);
+ g_assert (bucket < 64);
+
+ return (value->buckets & (((guint64) 0x01) << bucket)) != 0;
+}
+
+static gboolean
+_mi_value_bucket_set (NMMultiIndexTestValue *value, guint bucket)
+{
+ g_assert (value);
+ g_assert (bucket < 64);
+
+ if (_mi_value_bucket_has (value, bucket))
+ return FALSE;
+
+ value->buckets |= (((guint64) 0x01) << bucket);
+ return TRUE;
+}
+
+static gboolean
+_mi_value_bucket_unset (NMMultiIndexTestValue *value, guint bucket)
+{
+ g_assert (value);
+ g_assert (bucket < 64);
+
+ if (!_mi_value_bucket_has (value, bucket))
+ return FALSE;
+
+ value->buckets &= ~(((guint64) 0x01) << bucket);
+ return TRUE;
+}
+
+static guint
+_mi_idx_hash (const NMMultiIndexIdTest *id)
+{
+ g_assert (id && id->bucket < 64);
+ return id->bucket;
+}
+
+static gboolean
+_mi_idx_equal (const NMMultiIndexIdTest *a, const NMMultiIndexIdTest *b)
+{
+ g_assert (a && a->bucket < 64);
+ g_assert (b && b->bucket < 64);
+
+ return a->bucket == b->bucket;
+}
+
+static NMMultiIndexIdTest *
+_mi_idx_clone (const NMMultiIndexIdTest *id)
+{
+ NMMultiIndexIdTest *n;
+
+ g_assert (id && id->bucket < 64);
+
+ n = g_new0 (NMMultiIndexIdTest, 1);
+ n->bucket = id->bucket;
+ return n;
+}
+
+static void
+_mi_idx_destroy (NMMultiIndexIdTest *id)
+{
+ g_assert (id && id->bucket < 64);
+ g_free (id);
+}
+
+static NMMultiIndexTestValue *
+_mi_create_array (guint num_values)
+{
+ NMMultiIndexTestValue *array = g_new0 (NMMultiIndexTestValue, num_values);
+ guint i;
+
+ g_assert (num_values > 0);
+
+ for (i = 0; i < num_values; i++) {
+ array[i].buckets = 0;
+ array[i].ptr_value = GUINT_TO_POINTER (i + 1);
+ }
+ return array;
+}
+
+typedef struct {
+ guint num_values;
+ guint num_buckets;
+ NMMultiIndexTestValue *array;
+ int test_idx;
+} NMMultiIndexAssertData;
+
+static gboolean
+_mi_assert_index_equals_array_cb (const NMMultiIndexIdTest *id, void *const* values, guint len, NMMultiIndexAssertData *data)
+{
+ guint i;
+ gboolean has_test_idx = FALSE;
+
+ g_assert (id && id->bucket < 64);
+ g_assert (data);
+ g_assert (values);
+ g_assert (len > 0);
+ g_assert (values[len] == NULL);
+ g_assert (data->test_idx >= -1 || data->test_idx < data->num_buckets);
+
+ g_assert (id->bucket < data->num_buckets);
+
+ for (i = 0; i < data->num_values; i++)
+ g_assert (!_mi_value_bucket_has (&data->array[i], id->bucket));
+
+ for (i = 0; i < len; i++) {
+ guint vi = GPOINTER_TO_UINT (values[i]);
+
+ g_assert (vi >= 1);
+ g_assert (vi <= data->num_values);
+ vi--;
+ if (data->test_idx == vi)
+ has_test_idx = TRUE;
+ g_assert (data->array[vi].ptr_value == values[i]);
+ if (!_mi_value_bucket_set (&data->array[vi], id->bucket))
+ g_assert_not_reached ();
+ }
+ g_assert ((data->test_idx == -1 && !has_test_idx) || has_test_idx);
+ return TRUE;
+}
+
+static void
+_mi_assert_index_equals_array (guint num_values, guint num_buckets, int test_idx, const NMMultiIndexTestValue *array, const NMMultiIndex *index)
+{
+ NMMultiIndexAssertData data = {
+ .num_values = num_values,
+ .num_buckets = num_buckets,
+ .test_idx = test_idx,
+ };
+ NMMultiIndexIter iter;
+ const NMMultiIndexIdTest *id;
+ void *const* values;
+ guint len;
+ NMMultiIndexTestValue *v;
+
+ data.array = _mi_create_array (num_values);
+ v = test_idx >= 0 ? data.array[test_idx].ptr_value : NULL;
+ nm_multi_index_foreach (index, v, (NMMultiIndexFuncForeach) _mi_assert_index_equals_array_cb, &data);
+ if (test_idx >= 0)
+ g_assert (memcmp (&data.array[test_idx], &array[test_idx], sizeof (NMMultiIndexTestValue)) == 0);
+ else
+ g_assert (memcmp (data.array, array, sizeof (NMMultiIndexTestValue) * num_values) == 0);
+ g_free (data.array);
+
+
+ data.array = _mi_create_array (num_values);
+ v = test_idx >= 0 ? data.array[test_idx].ptr_value : NULL;
+ nm_multi_index_iter_init (&iter, index, v);
+ while (nm_multi_index_iter_next (&iter, (gpointer) &id, &values, &len))
+ _mi_assert_index_equals_array_cb (id, values, len, &data);
+ if (test_idx >= 0)
+ g_assert (memcmp (&data.array[test_idx], &array[test_idx], sizeof (NMMultiIndexTestValue)) == 0);
+ else
+ g_assert (memcmp (data.array, array, sizeof (NMMultiIndexTestValue) * num_values) == 0);
+ g_free (data.array);
+}
+
+typedef enum {
+ MI_OP_ADD,
+ MI_OP_REMOVE,
+ MI_OP_MOVE,
+} NMMultiIndexOperation;
+
+static void
+_mi_rebucket (GRand *rand, guint num_values, guint num_buckets, NMMultiIndexOperation op, guint bucket, guint bucket_old, guint array_idx, NMMultiIndexTestValue *array, NMMultiIndex *index)
+{
+ NMMultiIndexTestValue *v;
+ NMMultiIndexIdTest id, id_old;
+ const NMMultiIndexIdTest *id_reverse;
+ guint64 buckets_old;
+ guint i;
+ gboolean had_bucket, had_bucket_old;
+
+ g_assert (array_idx < num_values);
+ g_assert (bucket < (int) num_buckets);
+
+ v = &array[array_idx];
+
+ buckets_old = v->buckets;
+ if (op == MI_OP_MOVE)
+ had_bucket_old = _mi_value_bucket_has (v, bucket_old);
+ else
+ had_bucket_old = FALSE;
+ had_bucket = _mi_value_bucket_has (v, bucket);
+
+ switch (op) {
+
+ case MI_OP_ADD:
+ _mi_value_bucket_set (v, bucket);
+ id.bucket = bucket;
+ if (nm_multi_index_add (index, &id.id_base, v->ptr_value))
+ g_assert (!had_bucket);
+ else
+ g_assert (had_bucket);
+ break;
+
+ case MI_OP_REMOVE:
+ _mi_value_bucket_unset (v, bucket);
+ id.bucket = bucket;
+ if (nm_multi_index_remove (index, &id.id_base, v->ptr_value))
+ g_assert (had_bucket);
+ else
+ g_assert (!had_bucket);
+ break;
+
+ case MI_OP_MOVE:
+
+ _mi_value_bucket_unset (v, bucket_old);
+ _mi_value_bucket_set (v, bucket);
+
+ id.bucket = bucket;
+ id_old.bucket = bucket_old;
+
+ if (nm_multi_index_move (index, &id_old.id_base, &id.id_base, v->ptr_value)) {
+ if (bucket == bucket_old)
+ g_assert (had_bucket_old && had_bucket);
+ else
+ g_assert (had_bucket_old && !had_bucket);
+ } else {
+ if (bucket == bucket_old)
+ g_assert (!had_bucket_old && !had_bucket);
+ else
+ g_assert (!had_bucket_old || had_bucket);
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+#if 0
+ g_print (">>> rebucket: idx=%3u, op=%3s, bucket=%3i%c -> %3i%c, buckets=%08llx -> %08llx %s\n", array_idx,
+ op == MI_OP_ADD ? "ADD" : (op == MI_OP_REMOVE ? "REM" : "MOV"),
+ bucket_old, had_bucket_old ? '*' : ' ',
+ bucket, had_bucket ? '*' : ' ',
+ (long long unsigned) buckets_old, (long long unsigned) v->buckets,
+ buckets_old != v->buckets ? "(changed)" : "(unchanged)");
+#endif
+
+ id_reverse = (const NMMultiIndexIdTest *) nm_multi_index_lookup_first_by_value (index, v->ptr_value);
+ if (id_reverse)
+ g_assert (_mi_value_bucket_has (v, id_reverse->bucket));
+ else
+ g_assert (v->buckets == 0);
+
+ for (i = 0; i < 64; i++) {
+ id.bucket = i;
+ if (nm_multi_index_contains (index, &id.id_base, v->ptr_value))
+ g_assert (_mi_value_bucket_has (v, i));
+ else
+ g_assert (!_mi_value_bucket_has (v, i));
+ }
+
+ _mi_assert_index_equals_array (num_values, num_buckets, -1, array, index);
+ _mi_assert_index_equals_array (num_values, num_buckets, array_idx, array, index);
+ _mi_assert_index_equals_array (num_values, num_buckets, g_rand_int_range (rand, 0, num_values), array, index);
+}
+
+static void
+_mi_test_run (guint num_values, guint num_buckets)
+{
+ NMMultiIndex *index = nm_multi_index_new ((NMMultiIndexFuncHash) _mi_idx_hash,
+ (NMMultiIndexFuncEqual) _mi_idx_equal,
+ (NMMultiIndexFuncClone) _mi_idx_clone,
+ (NMMultiIndexFuncDestroy) _mi_idx_destroy);
+ gs_free NMMultiIndexTestValue *array = _mi_create_array (num_values);
+ GRand *rand = nmtst_get_rand ();
+ guint i, i_rd, i_idx, i_bucket;
+ guint num_buckets_all = num_values * num_buckets;
+
+ g_assert (array[0].ptr_value == GUINT_TO_POINTER (1));
+
+ _mi_assert_index_equals_array (num_values, num_buckets, -1, array, index);
+
+ _mi_rebucket (rand, num_values, num_buckets, MI_OP_ADD, 0, 0, 0, array, index);
+ _mi_rebucket (rand, num_values, num_buckets, MI_OP_REMOVE, 0, 0, 0, array, index);
+
+ if (num_buckets >= 3) {
+ _mi_rebucket (rand, num_values, num_buckets, MI_OP_ADD, 0, 0, 0, array, index);
+ _mi_rebucket (rand, num_values, num_buckets, MI_OP_MOVE, 2, 0, 0, array, index);
+ _mi_rebucket (rand, num_values, num_buckets, MI_OP_REMOVE, 2, 0, 0, array, index);
+ }
+
+ g_assert (nm_multi_index_get_num_groups (index) == 0);
+
+ /* randomly change the bucket of entries. */
+ for (i = 0; i < 5 * num_values; i++) {
+ guint array_idx = g_rand_int_range (rand, 0, num_values);
+ guint bucket = g_rand_int_range (rand, 0, num_buckets);
+ NMMultiIndexOperation op = g_rand_int_range (rand, 0, MI_OP_MOVE + 1);
+ guint bucket_old = 0;
+
+ if (op == MI_OP_MOVE) {
+ if ((g_rand_int (rand) % 2) && array[array_idx].buckets != 0) {
+ guint64 b;
+
+ /* choose the highest (existing) bucket. */
+ bucket_old = 0;
+ for (b = array[array_idx].buckets; b; b >>= 1)
+ bucket_old++;
+ } else {
+ /* choose a random bucket (even if the item is currently not in that bucket). */
+ bucket_old = g_rand_int_range (rand, 0, num_buckets);
+ }
+ }
+
+ _mi_rebucket (rand, num_values, num_buckets, op, bucket, bucket_old, array_idx, array, index);
+ }
+
+ /* remove all elements from all buckets */
+ i_rd = g_rand_int (rand);
+ for (i = 0; i < num_buckets_all; i++) {
+ i_rd = (i_rd + 101) % num_buckets_all;
+ i_idx = i_rd / num_buckets;
+ i_bucket = i_rd % num_buckets;
+
+ if (_mi_value_bucket_has (&array[i_idx], i_bucket))
+ _mi_rebucket (rand, num_values, num_buckets, MI_OP_REMOVE, i_bucket, 0, i_idx, array, index);
+ }
+
+ g_assert (nm_multi_index_get_num_groups (index) == 0);
+ nm_multi_index_free (index);
+}
+
+static void
+test_nm_multi_index (void)
+{
+ guint i, j;
+
+ for (i = 1; i < 7; i++) {
+ for (j = 1; j < 6; j++)
+ _mi_test_run (i, j);
+ }
+ _mi_test_run (50, 3);
+ _mi_test_run (50, 18);
+}
+
+/*******************************************/
+
NMTST_DEFINE ();
int
@@ -369,6 +824,8 @@ main (int argc, char **argv)
g_test_add_func ("/general/nm_utils_kill_child", test_nm_utils_kill_child);
g_test_add_func ("/general/nm_ethernet_address_is_valid", test_nm_ethernet_address_is_valid);
+ g_test_add_func ("/general/nm_multi_index", test_nm_multi_index);
+ g_test_add_func ("/general/nm_utils_array_remove_at_indexes", test_nm_utils_array_remove_at_indexes);
return g_test_run ();
}
diff --git a/src/tests/test-general.c b/src/tests/test-general.c
index f118156b3..de65d50fd 100644
--- a/src/tests/test-general.c
+++ b/src/tests/test-general.c
@@ -30,135 +30,6 @@
#include "nm-test-utils.h"
-static void
-test_nm_utils_ascii_str_to_int64_check (const char *str, guint base, gint64 min,
- gint64 max, gint64 fallback, int exp_errno,
- gint64 exp_val)
-{
- gint64 v;
-
- errno = 1;
- v = nm_utils_ascii_str_to_int64 (str, base, min, max, fallback);
- g_assert_cmpint (errno, ==, exp_errno);
- g_assert_cmpint (v, ==, exp_val);
-}
-
-static void
-test_nm_utils_ascii_str_to_int64_do (const char *str, guint base, gint64 min,
- gint64 max, gint64 fallback, int exp_errno,
- gint64 exp_val)
-{
- const char *sign = "";
- const char *val;
- static const char *whitespaces[] = {
- "",
- " ",
- "\r\n\t",
- " \r\n\t ",
- " \r\n\t \t\r\n\t",
- NULL,
- };
- static const char *nulls[] = {
- "",
- "0",
- "00",
- "0000",
- "0000000000000000",
- "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
- "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
- NULL,
- };
- const char **ws_pre, **ws_post, **null;
- guint i;
-
- if (str == NULL || exp_errno != 0) {
- test_nm_utils_ascii_str_to_int64_check (str, base, min, max, fallback, exp_errno, exp_val);
- return;
- }
-
- if (strncmp (str, "-", 1) == 0)
- sign = "-";
-
- val = str + strlen (sign);
-
- for (ws_pre = whitespaces; *ws_pre; ws_pre++) {
- for (ws_post = whitespaces; *ws_post; ws_post++) {
- for (null = nulls; *null; null++) {
- for (i = 0; ; i++) {
- char *s;
- const char *str_base = "";
-
- if (base == 16) {
- if (i == 1)
- str_base = "0x";
- else if (i > 1)
- break;
- } else if (base == 8) {
- if (i == 1)
- str_base = "0";
- else if (i > 1)
- break;
- } else if (base == 0) {
- if (i > 0)
- break;
- /* with base==0, a leading zero would be interpreted as octal. Only test without *null */
- if ((*null)[0])
- break;
- } else {
- if (i > 0)
- break;
- }
-
- s = g_strdup_printf ("%s%s%s%s%s%s", *ws_pre, sign, str_base, *null, val, *ws_post);
-
- test_nm_utils_ascii_str_to_int64_check (s, base, min, max, fallback, exp_errno, exp_val);
- g_free (s);
- }
- }
- }
- }
-}
-
-static void
-test_nm_utils_ascii_str_to_int64 (void)
-{
- test_nm_utils_ascii_str_to_int64_do (NULL, 10, 0, 10000, -1, EINVAL, -1);
- test_nm_utils_ascii_str_to_int64_do ("", 10, 0, 10000, -1, EINVAL, -1);
- test_nm_utils_ascii_str_to_int64_do ("1x", 10, 0, 10000, -1, EINVAL, -1);
- test_nm_utils_ascii_str_to_int64_do ("4711", 10, 0, 10000, -1, 0, 4711);
- test_nm_utils_ascii_str_to_int64_do ("10000", 10, 0, 10000, -1, 0, 10000);
- test_nm_utils_ascii_str_to_int64_do ("10001", 10, 0, 10000, -1, ERANGE, -1);
- test_nm_utils_ascii_str_to_int64_do ("FF", 16, 0, 10000, -1, 0, 255);
- test_nm_utils_ascii_str_to_int64_do ("FF", 10, 0, 10000, -2, EINVAL, -2);
- test_nm_utils_ascii_str_to_int64_do ("9223372036854775807", 10, 0, G_MAXINT64, -2, 0, G_MAXINT64);
- test_nm_utils_ascii_str_to_int64_do ("7FFFFFFFFFFFFFFF", 16, 0, G_MAXINT64, -2, 0, G_MAXINT64);
- test_nm_utils_ascii_str_to_int64_do ("9223372036854775808", 10, 0, G_MAXINT64, -2, ERANGE, -2);
- test_nm_utils_ascii_str_to_int64_do ("-9223372036854775808", 10, G_MININT64, 0, -2, 0, G_MININT64);
- test_nm_utils_ascii_str_to_int64_do ("-9223372036854775808", 10, G_MININT64+1, 0, -2, ERANGE, -2);
- test_nm_utils_ascii_str_to_int64_do ("-9223372036854775809", 10, G_MININT64, 0, -2, ERANGE, -2);
- test_nm_utils_ascii_str_to_int64_do ("1.0", 10, 1, 1, -1, EINVAL, -1);
- test_nm_utils_ascii_str_to_int64_do ("1x0", 16, -10, 10, -100, EINVAL, -100);
- test_nm_utils_ascii_str_to_int64_do ("0", 16, -10, 10, -100, 0, 0);
- test_nm_utils_ascii_str_to_int64_do ("10001111", 2, -1000, 1000, -100000, 0, 0x8F);
- test_nm_utils_ascii_str_to_int64_do ("-10001111", 2, -1000, 1000, -100000, 0, -0x8F);
- test_nm_utils_ascii_str_to_int64_do ("1111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7F);
- test_nm_utils_ascii_str_to_int64_do ("111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFF);
- test_nm_utils_ascii_str_to_int64_do ("11111111111111111111111111111111111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFFFFFFFFFF);
- test_nm_utils_ascii_str_to_int64_do ("111111111111111111111111111111111111111111111111111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFFFFFFFFFFFFFF);
- test_nm_utils_ascii_str_to_int64_do ("100000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, 0, 0x4000000000000000);
- test_nm_utils_ascii_str_to_int64_do ("1000000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, ERANGE, -1);
- test_nm_utils_ascii_str_to_int64_do ("-100000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, 0, -0x4000000000000000);
- test_nm_utils_ascii_str_to_int64_do ("111111111111111111111111111111111111111111111111111111111111111", 2, G_MININT64, G_MAXINT64, -1, 0, 0x7FFFFFFFFFFFFFFF);
- test_nm_utils_ascii_str_to_int64_do ("-100000000000000000000000000000000000000000000000000000000000000", 2, G_MININT64, G_MAXINT64, -1, 0, -0x4000000000000000);
- test_nm_utils_ascii_str_to_int64_do ("0x70", 10, G_MININT64, G_MAXINT64, -1, EINVAL, -1);
- test_nm_utils_ascii_str_to_int64_do ("4711", 0, G_MININT64, G_MAXINT64, -1, 0, 4711);
- test_nm_utils_ascii_str_to_int64_do ("04711", 0, G_MININT64, G_MAXINT64, -1, 0, 04711);
- test_nm_utils_ascii_str_to_int64_do ("0x4711", 0, G_MININT64, G_MAXINT64, -1, 0, 0x4711);
- test_nm_utils_ascii_str_to_int64_do ("080", 0, G_MININT64, G_MAXINT64, -1, EINVAL, -1);
- test_nm_utils_ascii_str_to_int64_do ("070", 0, G_MININT64, G_MAXINT64, -1, 0, 7*8);
- test_nm_utils_ascii_str_to_int64_do ("0x70", 0, G_MININT64, G_MAXINT64, -1, 0, 0x70);
-}
-
/* Reference implementation for nm_utils_ip6_address_clear_host_address.
* Taken originally from set_address_masked(), src/rdisc/nm-lndp-rdisc.c
**/
@@ -727,49 +598,134 @@ test_connection_sort_autoconnect_priority (void)
/*******************************************/
-static void
-__test_uuid (const char *expected_uuid, const char *str, gssize slen, char *uuid_test)
+static const char *_test_match_spec_all[] = {
+ "e",
+ "em",
+ "em*",
+ "em\\",
+ "em\\*",
+ "em\\1",
+ "em\\11",
+ "em\\2",
+ "em1",
+ "em11",
+ "em2",
+ "=em*",
+ NULL
+};
+
+static gboolean
+_test_match_spec_contains (const char **matches, const char *match)
{
- g_assert (uuid_test);
- g_assert (nm_utils_is_uuid (uuid_test));
+ guint i;
- if (strcmp (uuid_test, expected_uuid)) {
- g_error ("UUID test failed (1): text=%s, len=%lld, expected=%s, uuid_test=%s",
- str, (long long) slen, expected_uuid, uuid_test);
+ for (i = 0; matches && matches[i]; i++) {
+ if (strcmp (match, matches[i]) == 0)
+ return TRUE;
}
- g_free (uuid_test);
+ return FALSE;
+}
+
+static void
+test_match_spec_ifname (const char *spec_str, const char **matches, const char **neg_matches)
+{
+ const char *m;
+ GSList *specs, *specs_reverse = NULL, *specs_resplit, *specs_i, *specs_j;
+ guint i;
+ gs_free char *specs_joined = NULL;
- uuid_test = nm_utils_uuid_generate_from_string (str, slen, NM_UTILS_UUID_TYPE_VARIANT3, NM_UTILS_UUID_NS);
+ g_assert (spec_str);
- g_assert (uuid_test);
- g_assert (nm_utils_is_uuid (uuid_test));
+ specs = nm_match_spec_split (spec_str);
- if (strcmp (uuid_test, expected_uuid)) {
- g_error ("UUID test failed (2): text=%s; len=%lld, expected=%s, uuid2=%s",
- str, (long long) slen, expected_uuid, uuid_test);
+ /* assert that split(join(specs)) == specs */
+ specs_joined = nm_match_spec_join (specs);
+ specs_resplit = nm_match_spec_split (specs_joined);
+ specs_i = specs;
+ specs_j = specs_resplit;
+ while (specs_i && specs_j && g_strcmp0 (specs_i->data, specs_j->data) == 0) {
+ specs_i = specs_i->next;
+ specs_j = specs_j->next;
}
- g_free (uuid_test);
-}
+ g_assert (!specs_i);
+ g_assert (!specs_j);
+ g_slist_free_full (specs_resplit, g_free);
+
+ /* also check the matches in the reverse order. They must yield the same result because
+ * matches are inclusive -- except "except:" which always wins. */
+ specs_reverse = g_slist_reverse (g_slist_copy (specs));
-#define _test_uuid(expected_uuid, str, strlen, ...) __test_uuid (expected_uuid, str, strlen, nm_utils_uuid_generate_from_strings(__VA_ARGS__, NULL))
+ for (i = 0; matches && matches[i]; i++) {
+ g_assert (nm_match_spec_interface_name (specs, matches[i]) == NM_MATCH_SPEC_MATCH);
+ g_assert (nm_match_spec_interface_name (specs_reverse, matches[i]) == NM_MATCH_SPEC_MATCH);
+ }
+ for (i = 0; neg_matches && neg_matches[i]; i++) {
+ g_assert (nm_match_spec_interface_name (specs, neg_matches[i]) == NM_MATCH_SPEC_NEG_MATCH);
+ g_assert (nm_match_spec_interface_name (specs_reverse, neg_matches[i]) == NM_MATCH_SPEC_NEG_MATCH);
+ }
+ for (i = 0; (m = _test_match_spec_all[i]); i++) {
+ if (_test_match_spec_contains (matches, m))
+ continue;
+ if (_test_match_spec_contains (neg_matches, m))
+ continue;
+ g_assert (nm_match_spec_interface_name (specs, m) == NM_MATCH_SPEC_NO_MATCH);
+ g_assert (nm_match_spec_interface_name (specs_reverse, m) == NM_MATCH_SPEC_NO_MATCH);
+ }
+
+ g_slist_free (specs_reverse);
+ g_slist_free_full (specs, g_free);
+}
static void
-test_nm_utils_uuid_generate_from_strings (void)
+test_nm_match_spec_interface_name (void)
{
- _test_uuid ("b07c334a-399b-32de-8d50-58e4e08f98e3", "", 0, NULL);
- _test_uuid ("b8a426cb-bcb5-30a3-bd8f-6786fea72df9", "\0", 1, "");
- _test_uuid ("12a4a982-7aae-39e1-951e-41aeb1250959", "a\0", 2, "a");
- _test_uuid ("69e22c7e-f89f-3a43-b239-1cb52ed8db69", "aa\0", 3, "aa");
- _test_uuid ("59829fd3-5ad5-3d90-a7b0-4911747e4088", "\0\0", 2, "", "");
- _test_uuid ("01ad0e06-6c50-3384-8d86-ddab81421425", "a\0\0", 3, "a", "");
- _test_uuid ("e1ed8647-9ed3-3ec8-8c6d-e8204524d71d", "aa\0\0", 4, "aa", "");
- _test_uuid ("fb1c7cd6-275c-3489-9382-83b900da8af0", "\0a\0", 3, "", "a");
- _test_uuid ("5d79494e-c4ba-31a6-80a2-d6016ccd7e17", "a\0a\0", 4, "a", "a");
- _test_uuid ("fd698d86-1b60-3ebe-855f-7aada9950a8d", "aa\0a\0", 5, "aa", "a");
- _test_uuid ("8c573b48-0f01-30ba-bb94-c5f59f4fe517", "\0aa\0", 4, "", "aa");
- _test_uuid ("2bdd3d46-eb83-3c53-a41b-a724d04b5544", "a\0aa\0", 5, "a", "aa");
- _test_uuid ("13d4b780-07c1-3ba7-b449-81c4844ef039", "aa\0aa\0", 6, "aa", "aa");
- _test_uuid ("dd265bf7-c05a-3037-9939-b9629858a477", "a\0b\0", 4, "a", "b");
+#define S(...) ((const char *[]) { __VA_ARGS__, NULL } )
+ test_match_spec_ifname ("em1",
+ S ("em1"),
+ NULL);
+ test_match_spec_ifname ("em1,em2",
+ S ("em1", "em2"),
+ NULL);
+ test_match_spec_ifname ("em1,em2,interface-name:em2",
+ S ("em1", "em2"),
+ NULL);
+ test_match_spec_ifname ("interface-name:em1",
+ S ("em1"),
+ NULL);
+ test_match_spec_ifname ("interface-name:em*",
+ S ("em", "em*", "em\\", "em\\*", "em\\1", "em\\11", "em\\2", "em1", "em11", "em2", "em3"),
+ NULL);
+ test_match_spec_ifname ("interface-name:em\\*",
+ S ("em\\", "em\\*", "em\\1", "em\\11", "em\\2"),
+ NULL);
+ test_match_spec_ifname ("interface-name:~em\\*",
+ S ("em\\", "em\\*", "em\\1", "em\\11", "em\\2"),
+ NULL);
+ test_match_spec_ifname ("interface-name:=em*",
+ S ("em*"),
+ NULL);
+ test_match_spec_ifname ("interface-name:em*,except:interface-name:em1*",
+ S ("em", "em*", "em\\", "em\\*", "em\\1", "em\\11", "em\\2", "em2", "em3"),
+ S ("em1", "em11"));
+ test_match_spec_ifname ("interface-name:em*,except:interface-name:=em*",
+ S ("em", "em\\", "em\\*", "em\\1", "em\\11", "em\\2", "em1", "em11", "em2", "em3"),
+ S ("em*"));
+ test_match_spec_ifname ("aa,bb,cc\\,dd,e,,",
+ S ("aa", "bb", "cc,dd", "e"),
+ NULL);
+ test_match_spec_ifname ("aa;bb;cc\\;dd;e,;",
+ S ("aa", "bb", "cc;dd", "e"),
+ NULL);
+ test_match_spec_ifname ("interface-name:em\\;1,em\\,2,\\,,\\\\,,em\\\\x",
+ S ("em;1", "em,2", ",", "\\", "em\\x"),
+ NULL);
+ test_match_spec_ifname ("\\s\\s,\\sinterface-name:a,\\s,",
+ S (" ", " ", " interface-name:a"),
+ NULL);
+ test_match_spec_ifname (" aa ; bb ; cc\\;dd ;e , ; \t\\t , ",
+ S ("aa", "bb", "cc;dd", "e", "\t"),
+ NULL);
+#undef S
}
/*******************************************/
@@ -781,7 +737,6 @@ main (int argc, char **argv)
{
nmtst_init_with_logging (&argc, &argv, NULL, "ALL");
- g_test_add_func ("/general/nm_utils_ascii_str_to_int64", test_nm_utils_ascii_str_to_int64);
g_test_add_func ("/general/nm_utils_ip6_address_clear_host_address", test_nm_utils_ip6_address_clear_host_address);
g_test_add_func ("/general/nm_utils_log_connection_diff", test_nm_utils_log_connection_diff);
@@ -796,7 +751,7 @@ main (int argc, char **argv)
g_test_add_func ("/general/connection-sort/autoconnect-priority", test_connection_sort_autoconnect_priority);
- g_test_add_func ("/general/nm_utils_uuid_generate_from_strings", test_nm_utils_uuid_generate_from_strings);
+ g_test_add_func ("/general/nm_match_spec_interface_name", test_nm_match_spec_interface_name);
return g_test_run ();
}
diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c
index 657f7e05b..c8bdc75fb 100644
--- a/src/tests/test-ip4-config.c
+++ b/src/tests/test-ip4-config.c
@@ -322,11 +322,11 @@ test_merge_subtract_mss_mtu (void)
g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu2);
nm_ip4_config_merge (cfg1, cfg3);
- /* ensure again the same MSS and MTU are in cfg1 */
- g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, expected_mss2);
- g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu2);
+ /* ensure again the MSS and MTU in cfg1 got overriden */
+ g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, expected_mss3);
+ g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, expected_mtu3);
- nm_ip4_config_subtract (cfg1, cfg2);
+ nm_ip4_config_subtract (cfg1, cfg3);
/* ensure MSS and MTU are zero in cfg1 */
g_assert_cmpuint (nm_ip4_config_get_mss (cfg1), ==, 0);
g_assert_cmpuint (nm_ip4_config_get_mtu (cfg1), ==, 0);
diff --git a/src/tests/test-route-manager.c b/src/tests/test-route-manager.c
new file mode 100644
index 000000000..0164930d6
--- /dev/null
+++ b/src/tests/test-route-manager.c
@@ -0,0 +1,917 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2015 Red Hat, Inc.
+ *
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <arpa/inet.h>
+#include <linux/rtnetlink.h>
+
+#include "test-common.h"
+
+#include "nm-platform.h"
+#include "nm-route-manager.h"
+#include "nm-logging.h"
+
+#include "nm-test-utils.h"
+
+typedef struct {
+ int ifindex0, ifindex1;
+} test_fixture;
+
+/*****************************************************************************/
+
+static void
+setup_dev0_ip4 (int ifindex, guint mss_of_first_route, guint32 metric_of_second_route)
+{
+ GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
+ NMPlatformIP4Route route = { 0 };
+
+ route.ifindex = ifindex;
+ route.mss = 0;
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "6.6.6.0", &route.network);
+ route.plen = 24;
+ route.gateway = INADDR_ANY;
+ route.metric = 20;
+ route.mss = mss_of_first_route;
+ g_array_append_val (routes, route);
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "7.0.0.0", &route.network);
+ route.plen = 8;
+ inet_pton (AF_INET, "6.6.6.1", &route.gateway);
+ route.metric = metric_of_second_route;
+ route.mss = 0;
+ g_array_append_val (routes, route);
+
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, TRUE);
+ g_array_free (routes, TRUE);
+}
+
+static void
+setup_dev1_ip4 (int ifindex)
+{
+ GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
+ NMPlatformIP4Route route = { 0 };
+
+ route.ifindex = ifindex;
+ route.mss = 0;
+
+ /* Add some route outside of route manager. The route manager
+ * should get rid of it upon sync. */
+ nm_platform_ip4_route_add (NM_PLATFORM_GET,
+ route.ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ nmtst_inet4_from_string ("9.0.0.0"),
+ 8,
+ INADDR_ANY,
+ 0,
+ 10,
+ route.mss);
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "6.6.6.0", &route.network);
+ route.plen = 24;
+ route.gateway = INADDR_ANY;
+ route.metric = 20;
+ g_array_append_val (routes, route);
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "7.0.0.0", &route.network);
+ route.plen = 8;
+ route.gateway = INADDR_ANY;
+ route.metric = 22;
+ g_array_append_val (routes, route);
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "8.0.0.0", &route.network);
+ route.plen = 8;
+ inet_pton (AF_INET, "6.6.6.2", &route.gateway);
+ route.metric = 22;
+ g_array_append_val (routes, route);
+
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, TRUE);
+ g_array_free (routes, TRUE);
+}
+
+static void
+update_dev0_ip4 (int ifindex)
+{
+ GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
+ NMPlatformIP4Route route = { 0 };
+
+ route.ifindex = ifindex;
+ route.mss = 0;
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "6.6.6.0", &route.network);
+ route.plen = 24;
+ route.gateway = INADDR_ANY;
+ route.metric = 20;
+ g_array_append_val (routes, route);
+
+ route.source = NM_IP_CONFIG_SOURCE_USER;
+ inet_pton (AF_INET, "7.0.0.0", &route.network);
+ route.plen = 8;
+ route.gateway = INADDR_ANY;
+ route.metric = 21;
+ g_array_append_val (routes, route);
+
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, TRUE);
+ g_array_free (routes, TRUE);
+}
+
+
+static GArray *
+ip4_routes (test_fixture *fixture)
+{
+ GArray *routes = nm_platform_ip4_route_get_all (NM_PLATFORM_GET,
+ fixture->ifindex0,
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+ GArray *routes1 = nm_platform_ip4_route_get_all (NM_PLATFORM_GET,
+ fixture->ifindex1,
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+
+ g_array_append_vals (routes, routes1->data, routes1->len);
+ g_array_free (routes1, TRUE);
+
+ return routes;
+}
+
+static void
+test_ip4 (test_fixture *fixture, gconstpointer user_data)
+{
+ GArray *routes;
+
+ NMPlatformIP4Route state1[] = {
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("6.6.6.0"),
+ .plen = 24,
+ .ifindex = fixture->ifindex0,
+ .gateway = INADDR_ANY,
+ .metric = 20,
+ .mss = 1000,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("7.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex0,
+ .gateway = nmtst_inet4_from_string ("6.6.6.1"),
+ .metric = 21021,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("7.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ .metric = 22,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("6.6.6.0"),
+ .plen = 24,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ .metric = 21,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("8.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex1,
+ .gateway = nmtst_inet4_from_string ("6.6.6.2"),
+ .metric = 22,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
+ },
+ };
+
+ NMPlatformIP4Route state2[] = {
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("6.6.6.0"),
+ .plen = 24,
+ .ifindex = fixture->ifindex0,
+ .gateway = INADDR_ANY,
+ .metric = 20,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("7.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex0,
+ .gateway = INADDR_ANY,
+ .metric = 21,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("7.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ .metric = 22,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("6.6.6.0"),
+ .plen = 24,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ .metric = 21,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("8.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex1,
+ .gateway = nmtst_inet4_from_string ("6.6.6.2"),
+ .metric = 22,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
+ },
+ };
+
+ NMPlatformIP4Route state3[] = {
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("7.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ .metric = 22,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("6.6.6.0"),
+ .plen = 24,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ .metric = 20,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("8.0.0.0"),
+ .plen = 8,
+ .ifindex = fixture->ifindex1,
+ .gateway = nmtst_inet4_from_string ("6.6.6.2"),
+ .metric = 22,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_UNIVERSE),
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = nmtst_inet4_from_string ("6.6.6.0"),
+ .plen = 24,
+ .ifindex = fixture->ifindex1,
+ .gateway = INADDR_ANY,
+ /* this is a ghost entry because we synced ifindex0 and restore the route
+ * with metric 20 (above). But we don't remove the metric 21. */
+ .metric = 21,
+ .mss = 0,
+ .scope_inv = nm_platform_route_scope_inv (RT_SCOPE_LINK),
+ },
+ };
+
+ setup_dev0_ip4 (fixture->ifindex0, 1000, 21021);
+ setup_dev1_ip4 (fixture->ifindex1);
+ g_test_assert_expected_messages ();
+
+ /* - 6.6.6.0/24 on dev0 won over 6.6.6.0/24 on dev1
+ * - 6.6.6.0/24 on dev1 has metric bumped.
+ * - 7.0.0.0/8 route, metric 21021 added
+ * - 7.0.0.0/8 route, metric 22 added
+ * - 8.0.0.0/8 could be added. */
+ routes = ip4_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state1));
+ nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, state1, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ setup_dev1_ip4 (fixture->ifindex1);
+ g_test_assert_expected_messages ();
+
+ setup_dev0_ip4 (fixture->ifindex0, 0, 21);
+
+ /* Ensure nothing changed. */
+ routes = ip4_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state1));
+ state1[0].mss = 0;
+ state1[1].metric = 21;
+ nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, state1, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ update_dev0_ip4 (fixture->ifindex0);
+
+ /* minor changes in the routes. Quite similar to state1. */
+ routes = ip4_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state2));
+ nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, state2, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ nm_route_manager_route_flush (nm_route_manager_get (), fixture->ifindex0);
+
+ /* 6.6.6.0/24 is now on dev1
+ * 6.6.6.0/24 is also still on dev1 with bumped metric 21.
+ * 7.0.0.0/8 gone from dev0, still present on dev1
+ * 8.0.0.0/8 is present on dev1
+ * No dev0 routes left. */
+ routes = ip4_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state3));
+ nmtst_platform_ip4_routes_equal ((NMPlatformIP4Route *) routes->data, state3, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ nm_route_manager_route_flush (nm_route_manager_get (), fixture->ifindex1);
+
+ /* No routes left. */
+ routes = ip4_routes (fixture);
+ g_assert_cmpint (routes->len, ==, 0);
+ g_array_free (routes, TRUE);
+}
+
+static void
+setup_dev0_ip6 (int ifindex)
+{
+ GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Route));
+ NMPlatformIP6Route *route;
+
+ /* Add an address so that a route to the gateway below gets added. */
+ nm_platform_ip6_address_add (NM_PLATFORM_GET,
+ ifindex,
+ *nmtst_inet6_from_string ("2001:db8:8086::2"),
+ in6addr_any,
+ 64,
+ 3600,
+ 3600,
+ 0);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:8086::",
+ 48,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 20,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:1337::",
+ 48,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 0,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:abad:c0de::",
+ 64,
+ "2001:db8:8086::1",
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 21,
+ 0);
+ g_array_append_val (routes, *route);
+
+ nm_route_manager_ip6_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, TRUE);
+ g_array_free (routes, TRUE);
+}
+
+static void
+setup_dev1_ip6 (int ifindex)
+{
+ GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Route));
+ NMPlatformIP6Route *route;
+
+ /* Add some route outside of route manager. The route manager
+ * should get rid of it upon sync. */
+ nm_platform_ip6_route_add (NM_PLATFORM_GET,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ *nmtst_inet6_from_string ("2001:db8:8088::"),
+ 48,
+ in6addr_any,
+ 10,
+ 0);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:8086::",
+ 48,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 20,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:1337::",
+ 48,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 1024,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:d34d::",
+ 64,
+ "2001:db8:8086::2",
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 20,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:abad:c0de::",
+ 64,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 22,
+ 0);
+ g_array_append_val (routes, *route);
+
+ nm_route_manager_ip6_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, TRUE);
+ g_array_free (routes, TRUE);
+}
+
+static void
+update_dev0_ip6 (int ifindex)
+{
+ GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Route));
+ NMPlatformIP6Route *route;
+
+ /* Add an address so that a route to the gateway below gets added. */
+ nm_platform_ip6_address_add (NM_PLATFORM_GET,
+ ifindex,
+ *nmtst_inet6_from_string ("2001:db8:8086::2"),
+ in6addr_any,
+ 64,
+ 3600,
+ 3600,
+ 0);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:8086::",
+ 48,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 20,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:1337::",
+ 48,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 0,
+ 0);
+ g_array_append_val (routes, *route);
+
+ route = nmtst_platform_ip6_route_full ("2001:db8:abad:c0de::",
+ 64,
+ NULL,
+ ifindex,
+ NM_IP_CONFIG_SOURCE_USER,
+ 21,
+ 0);
+ g_array_append_val (routes, *route);
+
+ nm_route_manager_ip6_route_sync (nm_route_manager_get (), ifindex, routes, TRUE, TRUE);
+ g_array_free (routes, TRUE);
+}
+
+static GArray *
+ip6_routes (test_fixture *fixture)
+{
+ GArray *routes = nm_platform_ip6_route_get_all (NM_PLATFORM_GET,
+ fixture->ifindex0,
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+ GArray *routes1 = nm_platform_ip6_route_get_all (NM_PLATFORM_GET,
+ fixture->ifindex1,
+ NM_PLATFORM_GET_ROUTE_FLAGS_WITH_NON_DEFAULT);
+
+ g_array_append_vals (routes, routes1->data, routes1->len);
+ g_array_free (routes1, TRUE);
+
+ return routes;
+}
+
+static void
+test_ip6 (test_fixture *fixture, gconstpointer user_data)
+{
+ GArray *routes;
+
+ NMPlatformIP6Route state1[] = {
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:8086::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex0,
+ .gateway = in6addr_any,
+ .metric = 20,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:1337::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex0,
+ .gateway = in6addr_any,
+ .metric = 1024,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex0,
+ .gateway = *nmtst_inet6_from_string ("2001:db8:8086::1"),
+ .metric = 21,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 22,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:1337::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 1025,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:8086::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 21,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:d34d::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex1,
+ .gateway = *nmtst_inet6_from_string ("2001:db8:8086::2"),
+ .metric = 20,
+ .mss = 0,
+ },
+ };
+
+ NMPlatformIP6Route state2[] = {
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:8086::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex0,
+ .gateway = in6addr_any,
+ .metric = 20,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:1337::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex0,
+ .gateway = in6addr_any,
+ .metric = 1024,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex0,
+ .gateway = in6addr_any,
+ .metric = 21,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 22,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:1337::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 1025,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:8086::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 21,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:d34d::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex1,
+ .gateway = *nmtst_inet6_from_string ("2001:db8:8086::2"),
+ .metric = 20,
+ .mss = 0,
+ },
+ };
+
+ NMPlatformIP6Route state3[] = {
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:abad:c0de::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 22,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:8086::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 20,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:1337::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 1024,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:1337::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 1025,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:8086::"),
+ .plen = 48,
+ .ifindex = fixture->ifindex1,
+ .gateway = in6addr_any,
+ .metric = 21,
+ .mss = 0,
+ },
+ {
+ .source = NM_IP_CONFIG_SOURCE_USER,
+ .network = *nmtst_inet6_from_string ("2001:db8:d34d::"),
+ .plen = 64,
+ .ifindex = fixture->ifindex1,
+ .gateway = *nmtst_inet6_from_string ("2001:db8:8086::2"),
+ .metric = 20,
+ .mss = 0,
+ },
+ };
+
+ setup_dev0_ip6 (fixture->ifindex0);
+ setup_dev1_ip6 (fixture->ifindex1);
+ g_test_assert_expected_messages ();
+
+ /* 2001:db8:8086::/48 on dev0 won over 2001:db8:8086::/48 on dev1
+ * 2001:db8:d34d::/64 on dev1 could not be added
+ * 2001:db8:1337::/48 on dev0 won over 2001:db8:1337::/48 on dev1 and has metric 1024
+ * 2001:db8:abad:c0de::/64 routes did not clash */
+ routes = ip6_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state1));
+ nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, state1, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+
+ setup_dev1_ip6 (fixture->ifindex1);
+ g_test_assert_expected_messages ();
+ setup_dev0_ip6 (fixture->ifindex0);
+
+ /* Ensure nothing changed. */
+ routes = ip6_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state1));
+ nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, state1, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ update_dev0_ip6 (fixture->ifindex0);
+
+ /* 2001:db8:abad:c0de::/64 on dev0 was updated for gateway removal*/
+ routes = ip6_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state2));
+ nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, state2, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ nm_route_manager_route_flush (nm_route_manager_get (), fixture->ifindex0);
+
+ /* 2001:db8:abad:c0de::/64 on dev1 is still there, went away from dev0
+ * 2001:db8:8086::/48 is now on dev1
+ * 2001:db8:1337::/48 is now on dev1, metric of 1024 still applies
+ * 2001:db8:d34d::/64 is present now that 2001:db8:8086::/48 is on dev1
+ * No dev0 routes left. */
+ routes = ip6_routes (fixture);
+ g_assert_cmpint (routes->len, ==, G_N_ELEMENTS (state3));
+ nmtst_platform_ip6_routes_equal ((NMPlatformIP6Route *) routes->data, state3, routes->len, TRUE);
+ g_array_free (routes, TRUE);
+
+ nm_route_manager_route_flush (nm_route_manager_get (), fixture->ifindex1);
+
+ /* No routes left. */
+ routes = ip6_routes (fixture);
+ g_assert_cmpint (routes->len, ==, 0);
+ g_array_free (routes, TRUE);
+}
+
+/*****************************************************************************/
+
+static void
+_assert_route_check (const NMPlatformVTableRoute *vtable, gboolean has, const NMPlatformIPXRoute *route)
+{
+ const NMPlatformIPXRoute *r;
+
+ g_assert (route);
+
+ if (vtable->is_ip4)
+ r = (const NMPlatformIPXRoute *) nm_platform_ip4_route_get (NM_PLATFORM_GET, route->rx.ifindex, route->r4.network, route->rx.plen, route->rx.metric);
+ else
+ r = (const NMPlatformIPXRoute *) nm_platform_ip6_route_get (NM_PLATFORM_GET, route->rx.ifindex, route->r6.network, route->rx.plen, route->rx.metric);
+
+ if (!has) {
+ g_assert (!r);
+ } else {
+ if (!r || vtable->route_cmp (route, r) != 0)
+ g_error ("Invalid route. Expect %s, has %s",
+ nmtst_static_1024_01 (vtable->route_to_string (route)),
+ nmtst_static_1024_02 (vtable->route_to_string (r)));
+ g_assert (r);
+ }
+}
+
+static void
+test_ip4_full_sync (test_fixture *fixture, gconstpointer user_data)
+{
+ const NMPlatformVTableRoute *vtable = &nm_platform_vtable_route_v4;
+ gs_unref_array GArray *routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route));
+ NMPlatformIP4Route r01, r02, r03;
+
+ nm_log_dbg (LOGD_CORE, "TEST start test_ip4_full_sync(): start");
+
+ r01 = *nmtst_platform_ip4_route_full ("12.3.4.0", 24, NULL,
+ fixture->ifindex0, NM_IP_CONFIG_SOURCE_USER,
+ 100, 0, RT_SCOPE_LINK, NULL);
+ r02 = *nmtst_platform_ip4_route_full ("13.4.5.6", 32, "12.3.4.1",
+ fixture->ifindex0, NM_IP_CONFIG_SOURCE_USER,
+ 100, 0, RT_SCOPE_UNIVERSE, NULL);
+ r03 = *nmtst_platform_ip4_route_full ("14.5.6.7", 32, "12.3.4.1",
+ fixture->ifindex0, NM_IP_CONFIG_SOURCE_USER,
+ 110, 0, RT_SCOPE_UNIVERSE, NULL);
+ g_array_set_size (routes, 2);
+ g_array_index (routes, NMPlatformIP4Route, 0) = r01;
+ g_array_index (routes, NMPlatformIP4Route, 1) = r02;
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), fixture->ifindex0, routes, TRUE, TRUE);
+
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r02);
+ _assert_route_check (vtable, FALSE, (const NMPlatformIPXRoute *) &r03);
+
+ vtable->route_add (NM_PLATFORM_GET, 0, (const NMPlatformIPXRoute *) &r03, -1);
+
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r02);
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r03);
+
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), fixture->ifindex0, routes, TRUE, FALSE);
+
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r02);
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r03);
+
+ g_array_set_size (routes, 1);
+
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), fixture->ifindex0, routes, TRUE, FALSE);
+
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
+ _assert_route_check (vtable, FALSE, (const NMPlatformIPXRoute *) &r02);
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r03);
+
+ nm_route_manager_ip4_route_sync (nm_route_manager_get (), fixture->ifindex0, routes, TRUE, TRUE);
+
+ _assert_route_check (vtable, TRUE, (const NMPlatformIPXRoute *) &r01);
+ _assert_route_check (vtable, FALSE, (const NMPlatformIPXRoute *) &r02);
+ _assert_route_check (vtable, FALSE, (const NMPlatformIPXRoute *) &r03);
+
+ nm_log_dbg (LOGD_CORE, "TEST test_ip4_full_sync(): done");
+}
+
+/*****************************************************************************/
+
+static void
+fixture_setup (test_fixture *fixture, gconstpointer user_data)
+{
+ SignalData *link_added;
+
+ link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED,
+ NM_PLATFORM_SIGNAL_ADDED,
+ link_callback,
+ "nm-test-device0");
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, "nm-test-device0"));
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, "nm-test-device0", NULL) == NM_PLATFORM_ERROR_SUCCESS);
+ accept_signal (link_added);
+ free_signal (link_added);
+ fixture->ifindex0 = nm_platform_link_get_ifindex (NM_PLATFORM_GET, "nm-test-device0");
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, fixture->ifindex0, NULL));
+
+ link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED,
+ NM_PLATFORM_SIGNAL_ADDED,
+ link_callback,
+ "nm-test-device1");
+ nm_platform_link_delete (NM_PLATFORM_GET, nm_platform_link_get_ifindex (NM_PLATFORM_GET, "nm-test-device1"));
+ g_assert (nm_platform_dummy_add (NM_PLATFORM_GET, "nm-test-device1", NULL) == NM_PLATFORM_ERROR_SUCCESS);
+ accept_signal (link_added);
+ free_signal (link_added);
+ fixture->ifindex1 = nm_platform_link_get_ifindex (NM_PLATFORM_GET, "nm-test-device1");
+ g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, fixture->ifindex1, NULL));
+}
+
+static void
+fixture_teardown (test_fixture *fixture, gconstpointer user_data)
+{
+ nm_platform_link_delete (NM_PLATFORM_GET, fixture->ifindex0);
+ nm_platform_link_delete (NM_PLATFORM_GET, fixture->ifindex1);
+}
+
+/*****************************************************************************/
+
+void
+init_tests (int *argc, char ***argv)
+{
+ nmtst_init_assert_logging (argc, argv, "WARN", "ALL");
+}
+
+void
+setup_tests (void)
+{
+ g_test_add ("/route-manager/ip4", test_fixture, NULL, fixture_setup, test_ip4, fixture_teardown);
+ g_test_add ("/route-manager/ip6", test_fixture, NULL, fixture_setup, test_ip6, fixture_teardown);
+
+ g_test_add ("/route-manager/ip4-full-sync", test_fixture, NULL, fixture_setup, test_ip4_full_sync, fixture_teardown);
+}
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index cb07c7f9a..795a81873 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -44,6 +44,8 @@
#include "nm-agent-manager.h"
#include "nm-core-internal.h"
#include "nm-default-route-manager.h"
+#include "nm-route-manager.h"
+#include "nm-firewall-manager.h"
#include "nm-vpn-connection-glue.h"
@@ -92,6 +94,9 @@ typedef struct {
NMVpnServiceState service_state;
+ /* Firewall */
+ NMFirewallPendingCall fw_call;
+
DBusGProxy *proxy;
GHashTable *connect_hash;
guint connect_timeout;
@@ -227,19 +232,38 @@ call_plugin_disconnect (NMVpnConnection *self)
}
static void
+fw_call_cleanup (NMVpnConnection *connection)
+{
+ NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
+
+ if (priv->fw_call) {
+ nm_firewall_manager_cancel_call (nm_firewall_manager_get (), priv->fw_call);
+ priv->fw_call = NULL;
+ }
+}
+
+static void
vpn_cleanup (NMVpnConnection *connection, NMDevice *parent_dev)
{
NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
if (priv->ip_ifindex) {
- nm_platform_link_set_down (priv->ip_ifindex);
- nm_platform_route_flush (priv->ip_ifindex);
- nm_platform_address_flush (priv->ip_ifindex);
+ nm_platform_link_set_down (NM_PLATFORM_GET, priv->ip_ifindex);
+ nm_route_manager_route_flush (nm_route_manager_get (), priv->ip_ifindex);
+ nm_platform_address_flush (NM_PLATFORM_GET, priv->ip_ifindex);
}
nm_device_set_vpn4_config (parent_dev, NULL);
nm_device_set_vpn6_config (parent_dev, NULL);
+ /* Remove zone from firewall */
+ if (priv->ip_iface)
+ nm_firewall_manager_remove_from_zone (nm_firewall_manager_get (),
+ priv->ip_iface,
+ NULL);
+ /* Cancel pending firewall call */
+ fw_call_cleanup (connection);
+
g_free (priv->banner);
priv->banner = NULL;
@@ -252,6 +276,7 @@ vpn_cleanup (NMVpnConnection *connection, NMDevice *parent_dev)
*/
if (priv->connection)
nm_connection_clear_secrets (priv->connection);
+
}
static void
@@ -903,10 +928,17 @@ apply_parent_device_config (NMVpnConnection *connection)
* be done on the parent interface instead.
*/
- if (vpn4_parent_config)
+ /* Also clear the gateway. We don't configure the gateway as part of the
+ * vpn-config. Instead we tell NMDefaultRouteManager directly about the
+ * default route. */
+ if (vpn4_parent_config) {
nm_ip4_config_merge (vpn4_parent_config, priv->ip4_config);
- if (vpn6_parent_config)
+ nm_ip4_config_set_gateway (vpn4_parent_config, 0);
+ }
+ if (vpn6_parent_config) {
nm_ip6_config_merge (vpn6_parent_config, priv->ip6_config);
+ nm_ip6_config_set_gateway (vpn6_parent_config, NULL);
+ }
}
if (vpn4_parent_config) {
@@ -933,16 +965,19 @@ nm_vpn_connection_apply_config (NMVpnConnection *connection)
NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
if (priv->ip_ifindex > 0) {
- nm_platform_link_set_up (priv->ip_ifindex);
+ nm_platform_link_set_up (NM_PLATFORM_GET, priv->ip_ifindex, NULL);
if (priv->ip4_config) {
if (!nm_ip4_config_commit (priv->ip4_config, priv->ip_ifindex,
+ TRUE,
nm_vpn_connection_get_ip4_route_metric (connection)))
return FALSE;
}
if (priv->ip6_config) {
- if (!nm_ip6_config_commit (priv->ip6_config, priv->ip_ifindex))
+ if (!nm_ip6_config_commit (priv->ip6_config,
+ priv->ip_ifindex,
+ TRUE))
return FALSE;
}
}
@@ -959,10 +994,47 @@ nm_vpn_connection_apply_config (NMVpnConnection *connection)
}
static void
+_cleanup_failed_config (NMVpnConnection *connection)
+{
+ NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
+
+ g_clear_object (&priv->ip4_config);
+ g_clear_object (&priv->ip6_config);
+
+ nm_log_warn (LOGD_VPN, "VPN connection '%s' did not receive valid IP config information.",
+ nm_connection_get_id (priv->connection));
+ _set_vpn_state (connection, STATE_FAILED, NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID, FALSE);
+}
+
+static void
+fw_change_zone_cb (GError *error, gpointer user_data)
+{
+ NMVpnConnection *connection = NM_VPN_CONNECTION (user_data);
+ NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
+
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ priv->fw_call = NULL;
+
+ if (error) {
+ nm_log_warn (LOGD_VPN, "VPN connection '%s': setting firewall zone failed: '%s'",
+ nm_connection_get_id (priv->connection), error->message);
+ // FIXME: fail the activation?
+ }
+
+ if (!nm_vpn_connection_apply_config (connection))
+ _cleanup_failed_config (connection);
+}
+
+static void
nm_vpn_connection_config_maybe_complete (NMVpnConnection *connection,
gboolean success)
{
NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
+ NMConnection *base_con;
+ NMSettingConnection *s_con;
+ const char *zone;
if (priv->vpn_state < STATE_IP_CONFIG_GET || priv->vpn_state > STATE_ACTIVATED)
return;
@@ -983,16 +1055,29 @@ nm_vpn_connection_config_maybe_complete (NMVpnConnection *connection,
if (success) {
print_vpn_config (connection);
- if (nm_vpn_connection_apply_config (connection))
+ /* Add the tunnel interface to the specified firewall zone */
+ if (priv->ip_iface) {
+ base_con = nm_vpn_connection_get_connection (connection);
+ g_assert (base_con);
+ s_con = nm_connection_get_setting_connection (base_con);
+ zone = nm_setting_connection_get_zone (s_con);
+
+ nm_log_dbg (LOGD_VPN, "VPN connection '%s': setting firewall zone '%s' for '%s'",
+ nm_connection_get_id (base_con), zone ? zone : "default", priv->ip_iface);
+ fw_call_cleanup (connection);
+ priv->fw_call = nm_firewall_manager_add_or_change_zone (nm_firewall_manager_get (),
+ priv->ip_iface,
+ zone,
+ FALSE,
+ fw_change_zone_cb,
+ connection);
return;
+ } else
+ if (nm_vpn_connection_apply_config (connection))
+ return;
}
- g_clear_object (&priv->ip4_config);
- g_clear_object (&priv->ip6_config);
-
- nm_log_warn (LOGD_VPN, "VPN connection '%s' did not receive valid IP config information.",
- nm_connection_get_id (priv->connection));
- _set_vpn_state (connection, STATE_FAILED, NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID, FALSE);
+ _cleanup_failed_config (connection);
}
#define LOG_INVALID_ARG(property) \
@@ -1027,7 +1112,7 @@ process_generic_config (NMVpnConnection *connection,
if (priv->ip_iface) {
/* Grab the interface index for address/routing operations */
- priv->ip_ifindex = nm_platform_link_get_ifindex (priv->ip_iface);
+ priv->ip_ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, priv->ip_iface);
if (!priv->ip_ifindex) {
nm_log_err (LOGD_VPN, "(%s): failed to look up VPN interface index", priv->ip_iface);
nm_vpn_connection_config_maybe_complete (connection, FALSE);
@@ -1193,13 +1278,13 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
memset (&address, 0, sizeof (address));
address.plen = 24;
- if (priv->ip4_external_gw)
- nm_ip4_config_set_gateway (config, priv->ip4_external_gw);
/* Internal address of the VPN subnet's gateway */
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY);
- if (val)
+ if (val) {
priv->ip4_internal_gw = g_value_get_uint (val);
+ nm_ip4_config_set_gateway (config, priv->ip4_internal_gw);
+ }
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS);
if (val)
@@ -1338,8 +1423,6 @@ nm_vpn_connection_ip6_config_get (DBusGProxy *proxy,
memset (&address, 0, sizeof (address));
address.plen = 128;
- if (priv->ip6_external_gw)
- nm_ip6_config_set_gateway (config, priv->ip6_external_gw);
/* Internal address of the VPN subnet's gateway */
g_clear_pointer (&priv->ip6_internal_gw, g_free);
@@ -1347,8 +1430,10 @@ nm_vpn_connection_ip6_config_get (DBusGProxy *proxy,
if (val) {
GByteArray *ba = g_value_get_boxed (val);
- if (ba->len == sizeof (struct in6_addr))
+ if (ba->len == sizeof (struct in6_addr)) {
priv->ip6_internal_gw = g_memdup (ba->data, ba->len);
+ nm_ip6_config_set_gateway (config, priv->ip6_internal_gw);
+ }
}
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS);
@@ -1894,7 +1979,7 @@ get_secrets_cb (NMSettingsConnection *connection,
priv->secrets_id = 0;
- if (error) {
+ if (error && priv->secrets_idx >= SECRETS_REQ_NEW) {
nm_log_err (LOGD_VPN, "Failed to request VPN secrets #%d: (%d) %s",
priv->secrets_idx + 1, error->code, error->message);
_set_vpn_state (self, STATE_FAILED, NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS, FALSE);
@@ -2101,6 +2186,8 @@ dispose (GObject *object)
g_clear_object (&priv->proxy);
g_clear_object (&priv->connection);
+ fw_call_cleanup (NM_VPN_CONNECTION (object));
+
G_OBJECT_CLASS (nm_vpn_connection_parent_class)->dispose (object);
}
diff --git a/src/vpn-manager/nm-vpn-service.c b/src/vpn-manager/nm-vpn-service.c
index b46d13ecf..77220dd2e 100644
--- a/src/vpn-manager/nm-vpn-service.c
+++ b/src/vpn-manager/nm-vpn-service.c
@@ -31,7 +31,6 @@
#include "nm-vpn-service.h"
#include "nm-dbus-manager.h"
#include "nm-logging.h"
-#include "nm-posix-signals.h"
#include "nm-vpn-manager.h"
#include "nm-glib-compat.h"
@@ -167,20 +166,6 @@ nm_vpn_service_stop_connections (NMVpnService *service,
g_clear_pointer (&priv->pending, g_slist_free);
}
-static void
-_daemon_setup (gpointer user_data G_GNUC_UNUSED)
-{
- /* We are in the child process at this point */
- pid_t pid = getpid ();
- setpgid (pid, pid);
-
- /*
- * We blocked signals in main(). We need to restore original signal
- * mask for VPN service here so that it can receive signals.
- */
- nm_unblock_posix_signals (NULL);
-}
-
static gboolean
_daemon_exec_timeout (gpointer data)
{
@@ -207,7 +192,7 @@ nm_vpn_service_daemon_exec (NMVpnService *service, GError **error)
vpn_argv[0] = priv->program;
vpn_argv[1] = NULL;
- success = g_spawn_async (NULL, vpn_argv, NULL, 0, _daemon_setup, NULL, &pid, &spawn_error);
+ success = g_spawn_async (NULL, vpn_argv, NULL, 0, nm_utils_setpgid, NULL, &pid, &spawn_error);
if (success) {
nm_log_info (LOGD_VPN, "VPN service '%s' started (%s), PID %ld",
priv->name, priv->dbus_service, (long int) pid);
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 626bf6a35..4d93bbd52 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -135,6 +135,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -248,6 +249,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
diff --git a/tools/run-test-valgrind.sh b/tools/run-test-valgrind.sh
index 200a27d13..ff5bc44ce 100755
--- a/tools/run-test-valgrind.sh
+++ b/tools/run-test-valgrind.sh
@@ -3,18 +3,17 @@
LIBTOOL="$1"; shift
VALGRIND="$1"; shift
SUPPRESSIONS="$1"; shift
+VALGRIND_ERROR=37
if [ "$1" = "--launch-dbus" ]; then
- # Spawn DBus if there's none
- if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
- eval `dbus-launch --sh-syntax`
- trap "kill $DBUS_SESSION_BUS_PID" EXIT
- fi
+ # Spawn DBus
+ eval `dbus-launch --sh-syntax`
+ trap "kill $DBUS_SESSION_BUS_PID" EXIT
shift
fi
-TEST="$1"; shift
+TEST="$1"
if [ "$NMTST_NO_VALGRIND" != "" ]; then
- "$TEST"
+ "$@"
exit $?
fi
@@ -24,21 +23,48 @@ export G_SLICE=always-malloc
export G_DEBUG=gc-friendly
$LIBTOOL --mode=execute "$VALGRIND" \
--quiet \
- --error-exitcode=1 \
+ --error-exitcode=$VALGRIND_ERROR \
--leak-check=full \
--gen-suppressions=all \
--suppressions="$SUPPRESSIONS" \
+ --num-callers=100 \
--log-file="$LOGFILE" \
- "$TEST"
+ "$@"
RESULT=$?
-if [ $RESULT -eq 0 -a "$(wc -c "$LOGFILE" | awk '{print$1}')" -ne 0 ]; then
- echo "valgrind succeeded, but log is not empty: $LOGFILE"
- exit 1
-fi
+test -s "$LOGFILE"
+HAS_ERRORS=$?
if [ $RESULT -ne 0 -a $RESULT -ne 77 ]; then
- echo "Don't forget to check the valgrind log at '`realpath $LOGFILE`'." >&2
+ if [ $HAS_ERRORS -ne 0 ]; then
+ rm -f "$LOGFILE"
+ elif [ $RESULT -ne $VALGRIND_ERROR ]; then
+ # the test (probably) didn't fail due to valgrind.
+ echo "The test failed. Also check the valgrind log at '`realpath "$LOGFILE"`'" >&2
+ else
+ echo "valgrind failed! Check the log at '`realpath "$LOGFILE"`'" >&2
+ UNRESOLVED=$(awk -F: '/obj:\// {print $NF}' "$LOGFILE" | sort | uniq)
+ if [ -n "$UNRESOLVED" ]; then
+ echo Some addresses could not be resolved into symbols. >&2
+ echo The errors might get suppressed when you install the debuging symbols. >&2
+ if [ -x /usr/bin/dnf ]; then
+ echo Hint: dnf debuginfo-install $UNRESOLVED >&2
+ elif [ -x /usr/bin/debuginfo-install ]; then
+ echo Hint: debuginfo-install $UNRESOLVED >&2
+ else
+ echo Files without debugging symbols: $UNRESOLVED >&2
+ fi
+ fi
+ fi
+ exit $RESULT
+fi
+
+if [ $HAS_ERRORS -eq 0 ]; then
+ # shouldn't actually happen...
+ echo "valgrind succeeded, but log is not empty: '`realpath "$LOGFILE"`'" >&2
+ exit 1
fi
+rm -f "$LOGFILE"
+
exit $RESULT
diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py
index 50803c887..6035fecd5 100755
--- a/tools/test-networkmanager-service.py
+++ b/tools/test-networkmanager-service.py
@@ -1148,7 +1148,7 @@ def main():
sys.exit(1)
# Watch stdin; if it closes, assume our parent has crashed, and exit
- io = GLib.IOChannel.unix_new(0)
+ io = GLib.IOChannel(0)
io.add_watch(GLib.IOCondition.HUP, stdin_cb)
# also quit after inactivity to ensure we don't stick around if the above fails somehow
diff --git a/valgrind.suppressions b/valgrind.suppressions
index 05ac7da7b..5a345fd93 100644
--- a/valgrind.suppressions
+++ b/valgrind.suppressions
@@ -108,6 +108,23 @@
obj:/*/ld-*.so
}
{
+ # added on Fedora 22
+ # This happens when setting LD_LIBRARY_PATH and the linker is searching the libraries to load.
+ # for example:
+ # LD_LIBRARY_PATH=./././././././././././././././././libnm/.libs:./libnm-util/.libs:./libnm-glib/.libs
+ _dl_expand_dynamic_string_token
+ Memcheck:Cond
+ fun:index
+ fun:expand_dynamic_string_token
+ ...
+ fun:dl_main
+ fun:_dl_sysdep_start
+ fun:_dl_start_final
+ fun:_dl_start
+ obj:/*/ld-*.so
+ ...
+}
+{
all_gobject_init_ctor
Memcheck:Leak
...
@@ -396,3 +413,46 @@
...
}
+###############################################################
+# libnl3
+###############################################################
+
+{
+ # fixed by https://github.com/thom311/libnl/commit/d65c32a7205e679c7fc13f0e4565b13e698ba906
+ # Same issue as libnl_rtnl_link_set_type_01, but different backtrace by calling nl_msg_parse().
+ libnl_rtnl_link_set_type_02
+ Memcheck:Leak
+ match-leak-kinds: definite
+ fun:calloc
+ fun:vlan_alloc
+ fun:rtnl_link_set_type
+ fun:link_msg_parser
+ fun:nl_cache_parse
+ fun:nl_msg_parse
+ ...
+}
+
+# disable the following suppression. I cannot remember why it was needed,
+# maybe it's wrong.
+#
+# {
+# libnl_02
+# libnl_rtnl_link_alloc_cache
+# Memcheck:Leak
+# match-leak-kinds: definite
+# fun:calloc
+# fun:nl_object_alloc
+# fun:link_msg_parser
+# fun:nl_cache_parse
+# fun:update_msg_parser
+# fun:nl_cb_call
+# fun:recvmsgs
+# fun:nl_recvmsgs_report
+# fun:nl_recvmsgs
+# fun:__cache_pickup
+# fun:nl_cache_pickup
+# fun:nl_cache_refill
+# fun:rtnl_link_alloc_cache
+# ...
+# }
+
diff --git a/vapi/Makefile.in b/vapi/Makefile.in
index fb321ea20..cf170108e 100644
--- a/vapi/Makefile.in
+++ b/vapi/Makefile.in
@@ -203,6 +203,7 @@ ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_TESTS_FD_REDIRECT = @AM_TESTS_FD_REDIRECT@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
@@ -316,6 +317,7 @@ LIBTEAMDCTL_LIBS = @LIBTEAMDCTL_LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
+LOG_DRIVER = @LOG_DRIVER@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@