Commit Graph

13873 Commits

Author SHA1 Message Date
Dan Williams
37f11fbdf8 platform: add support for kernel IPv6LL address generation modes
This patch requires both upstream kernel support for
IFLA_INET6_ADDR_GEN_MODE which was merged in this patch:

ipv6: addrconf: implement address generation modes
bc91b0f07ada5535427373a4e2050877bcc12218

and corresponding libnl support, merged in these patches:

veth: add kernel header linux/veth.h for VETH defines
9dc6e6da90016a33929f262bea0187396e1a061b

link: update copy of kernel header include/linux/if_link.h
b51815a9dbd8e45fd2558bbe337fb360ca2fd861

link/inet6: add link IPv6 address generation mode support
558f966782539f6d975da705fd73cea561c9dc83
2014-09-04 15:10:26 -05:00
Dan Williams
899df02e4c merge: fix some nmtui password issues (bgo #733002) 2014-09-04 09:53:06 -05:00
Dan Williams
82b0ea8707 tui: fix updating of NmtPasswordFields passwords (bgo #733002)
The actual entry is a sub-widget, and was getting updated when the
user changed the password, but those changes were not being
propagated to the NmtPasswordFields object's 'password' property.

https://bugzilla.gnome.org/show_bug.cgi?id=733002
2014-09-04 09:49:14 -05:00
Dan Williams
240a9a92ae tui: fix requesting and displaying secrets
nmt_sync_op_complete_pointer() completes the operation after the
caller of this function returns.  This means that any values passed
to this function must either be allocated from its caller, or
referenced by the caller.

nm_remote_connection_get_secrets() owns the 'secrets' hash passed
to the callback, and it is destroyed when the callback returns.
So nmtui's got_secrets() must copy the hash to ensure the data
sticks around for nmt_sync_op_wait_pointer() later.
2014-09-04 09:49:10 -05:00
Dan Winship
e7f01ae590 libnm: simplify property types [bgo #734492] 2014-09-04 09:21:10 -04:00
Dan Winship
98959d5432 libnm: fix NMIP4Config/NMIP6Config addresses/routes properties
The docs for NMIP4Config:addresses and NMIP4Config:routes claimed that
they were GPtrArrays of NMIP4Address/NMIP4Route, but get_property()
was actually trying to set them the D-Bus representation type, and it
was failing anyway because it used g_value_set_boxed() on a parameter
that was declared GParamSpecPointer. Fix it to use a GPtrArray-valued
property, and set it to the right thing.

NMIP6Config did the right thing with its :addresses and :routes
properties, but was using custom types (NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY and
NM_TYPE_IP6_ROUTE_OBJECT_ARRAY). Make it use G_TYPE_PTR_ARRAY instead.

nm-types.c, nm-types.h, and nm-types-private.h are now empty, and so
can be dropped.
2014-09-04 09:21:05 -04:00
Dan Winship
356fb7d77e libnm: drop libnm IP-address-array types, use G_TYPE_STRV
Make NMIP4Config:nameservers, NMIP4Config:wins-servers, and
NMIP6Config:nameservers be G_TYPE_STRV, with stringified IP addresses,
and update the APIs accordingly.
2014-09-04 09:21:05 -04:00
Dan Winship
3e5b3833aa libnm: change empty-GPtrArray-return semantics
libnm functions that return GPtrArrays of objects had a rule that if
the array was empty, they would return NULL rather than a 0-length
array. As it turns out, this is just a nuisance to clients, since in
most places the code for the non-empty case would end up doing the
right thing for the empty case as well (and where it doesn't, we can
check "array->len == 0" just as easily as "array == NULL"). So just
return the 0-length array instead.
2014-09-04 09:21:05 -04:00
Dan Winship
074c2093b6 libnm: drop NM_TYPE_OBJECT_ARRAY, use G_TYPE_PTR_ARRAY
Use G_TYPE_PTR_ARRAY for GPtrArray-of-NMObject-valued properties,
because it has better introspection/bindings support.

As with the strdict change in libnm-core, we need to manually copy the
array in get_property() implementations, to preserve the standard
semantics that get_property() returns a copy, not the internal array.

(This patch also changes those properties so that they are always
non-NULL until dispose(); previously some of them could be either NULL
or 0-length at different times.)
2014-09-04 09:21:04 -04:00
Dan Winship
20dc44bda9 libnm: drop NM_TYPE_SSID, use G_TYPE_BYTES
Make NMAccessPoint:ssid be G_TYPE_BYTES and update the corresponding
APIs accordingly.
2014-09-04 09:21:04 -04:00
Dan Winship
4eb04dbcf8 libnm: drop NM_TYPE_STRING_ARRAY, use G_TYPE_STRV
Make NMIP4Config and NMIP6Config's array-of-string properties be
G_TYPE_STRV, and update the corresponding APIs accordingly.
2014-09-04 09:21:04 -04:00
Dan Winship
f71218d70a libnm: simplify NMDevice:state-reason
The NMDevice:state-reason property was awkward to work with since it
was a tuple of two values (state and reason), and likewise, although
we had nm_device_get_state() to return just the state, there was no
corresponding function to get just the reason.

Fix this; make the state-reason property contain just the
NMDeviceStateReason, and make nm_device_get_state_reason() return just
that.
2014-09-04 09:21:04 -04:00
Dan Winship
fa0fde04fa libnm-core: add NMSetting property transforms, improve object property types [bgo #734492] 2014-09-04 09:20:17 -04:00
Dan Winship
22b92a7574 libnm-core: change DCB DBUS_TYPE_G_UINT_ARRAY properties to G_TYPE_ARRAY
Change NMSettingDCB's guint-array properties to G_TYPE_ARRAY, with
annotations indicating the element type.

Since DBUS_TYPE_G_UINT_ARRAY was already represented as a GArray, this
does not require any changes anywhere else.
2014-09-04 09:20:12 -04:00
Dan Winship
c43f88907b libnm-core: change DBUS_TYPE_G_UCHAR_ARRAY properties to G_TYPE_BYTES
Change all DBUS_TYPE_G_UCHAR_ARRAY properties to G_TYPE_BYTES, and
update corresponding APIs. Notably, this means they are now refcounted
rather than being copied.

Update the rest of NM for the changes. The daemon still converts SSIDs
to GByteArrays internally, because changing it to use GBytes has lots
of trickle-down effects. It can possibly be changed later.
2014-09-04 09:20:11 -04:00
Dan Winship
3fbabde4c3 libnm-core: replace GByteArray with pointer + length in some APIs
APIs that take arbitrary data should take it in the form of a pointer
and length, not a GByteArray, so that you can use them regardless of
what format you have the data in (GByteArray, GBytes, plain array,
etc).
2014-09-04 09:20:11 -04:00
Dan Winship
9837565789 libnm-core: improve NMSettingIP4Config / NMSettingIP6Config property types
Make the :addresses and :routes properties be GPtrArrays of
NMIP4Address, etc, rather than just reflecting the D-Bus data.

Make the :dns properties be arrays of strings rather than arrays of
binary IP addresses (and update the corresponding APIs as well).
2014-09-04 09:20:11 -04:00
Dan Winship
9ed6bd2be5 libnm-core: change map-of-string properties to G_TYPE_HASH_TABLE
Change all DBUS_TYPE_G_MAP_OF_STRING properties to G_TYPE_HASH_TABLE,
with annotations indicating they are string->string. Not much outside
libnm-core needs to changed for this, since DBUS_TYPE_G_MAP_OF_STRING
was already represented as a hash table.

(One change needed within libnm-core is that we now need to copy the
hash tables in get_property(), or else the caller will receive a
reffed copy of the object's own hash table, which we don't want.)
2014-09-04 09:20:11 -04:00
Dan Winship
6a4127cfa0 libnm-core: change list-of-string and array-of-string properties to G_TYPE_STRV
Change all DBUS_TYPE_G_LIST_OF_STRING and DBUS_TYPE_G_ARRAY_OF_STRING
properties to G_TYPE_STRV, and update everything accordingly.

(This doesn't actually require using
_nm_setting_class_transform_property(); dbus-glib is happy to transform
between 'as' and G_TYPE_STRV.)
2014-09-04 09:20:10 -04:00
Dan Winship
3a54d05098 libnm-core: change all mac-address properties to G_TYPE_STRING
Make all mac-address properties (including NMSettingBluetooth:bdaddr,
NMSettingOlpcMesh:dhcp-anycast-addr, and NMSettingWireless:bssid) be
strings, using _nm_setting_class_transform_property() to handle
translating to/from binary form when dealing with D-Bus.

Update everything accordingly for the change, and also add a test for
transformed setting properties to test-general.
2014-09-04 09:20:10 -04:00
Dan Winship
f4957eb0b7 libnm-core: add _nm_setting_class_transform_property()
Add a new kind of setting property override, for indicating that a
property exists in both the NMSetting and the D-Bus representation,
but in different formats, requiring conversion from one to the other.

Also, if a property is transformable, then compare the transformed
forms in nm_setting_compare() (since the D-Bus property types have
more metadata built-in).
2014-09-04 09:20:10 -04:00
Dan Winship
ca9938f458 libnm-core: drop NMParamSpecSpecialized, add nm_property_compare()
NMParamSpecSpecialized existed basically to provide a version of
GParamSpecBoxed that could compare dbus-glib-valued properties
correctly.

However, g_param_values_cmp() was only used by NM directly in one
place (NMSetting's compare_property()), and we don't actually need to
indirect through GParamSpec there; we could just call
NMParamSpecSpecialized's value-comparison function directly.

So, change all NMParamSpecSpecialized properties to GParamSpecBoxed,
rename the _gvalues_compare() function it used to
"nm_property_compare()", and use that from NMSetting.

(g_param_values_cmp() also gets used internally by
g_param_value_defaults(), but all NMParamSpecSpecialized properties
have a default value of NULL, so GParamSpecBoxed's pointer-equality
check will do the job just fine there.)
2014-09-04 09:20:10 -04:00
Dan Winship
99e1699d89 libnm-core: fix up the new property-comparison test program
Make the formerly-nm-param-spec-specialized test compile (fix use of
inet_pton), and pass (include the mandatory "gateway" element in the
IPv6 addresses), make it use gtestutils and g_assert (so it actually
fails when it fails), and test a few more cases.
2014-09-04 09:20:09 -04:00
Dan Winship
290598494d libnm-core: split the test program out of nm-param-spec-specialized.c 2014-09-04 09:20:09 -04:00
Dan Winship
0bf7311716 libnm-core: drop virtual setting :interface-name props [bgo #734492] 2014-09-04 09:19:06 -04:00
Dan Winship
7d233cc956 core: abstract out the duplicated default-ifname-generating code
NMDeviceBond, NMDeviceBridge, and NMDeviceTeam all used basically the
same code to generate a default interface name. Move it into
nm_utils_complete_generic().
2014-09-04 09:18:44 -04:00
Dan Winship
6217c1e74c libnm-core: drop :interface-name properties on virtual NMSetting types
Remove the virtual :interface-name properties and their getters, and
use property overrides to do backward-compat handling when
serializing/deserializing.

Now when constructing an NMConnection from a hash, if the virtual
property is set and the NMSettingConnection property isn't, then the
override for NMSettingConnection:interface-name will set that property
to the value of the virtual interface-name. And when converting an
NMConnection to a hash, the overrides for the virtual properties will
return the value of NMSettingConnection:interface-name.
2014-09-04 09:18:44 -04:00
Dan Winship
40bb402898 libnm-core: simplify _nm_register_setting(), register error types too
Simplify the use of _nm_register_setting() by having it splice
together various symbol names itself rather than requiring them to be
specified explicitly, and extend it to also ensure that the type's
corresponding error type is registered (allowing one to find it via
g_type_from_name() if necessary).
2014-09-04 09:18:44 -04:00
Dan Winship
8faef95dae libnm-core: add property overrides to NMSettingClass
Add _nm_setting_class_override_property(), for modifying the mapping
between a GObject property and its D-Bus serialization.
2014-09-04 09:18:44 -04:00
Dan Winship
ee3467e531 libnm-core: add nm_connection_is_virtual()
Add a method to determine if a connection applies to a virtual device.

Perhaps eventually the logic should be spread across the NMSetting
classes, but for now it's better off having it in NMConnection than
once in NMManager and once in nmcli.
2014-09-04 09:18:43 -04:00
Dan Winship
ab26964c56 all: stop using virtual interface-name properties
The virtual :interface-name properties (eg,
NMDeviceBond:interface-name) are deprecated in favor of
NMSettingConnection:interface-name, and nm_connection_verify() ensures
that their values are kept in sync. So (a) there is no need to set
those properties when we can just set
NMSettingConnection:interface-name instead, and (b) we can replace any
calls to the setting-specific get_interface_name() methods with
nm_connection_get_interface_name() or
nm_setting_connection_get_interface_name().
2014-09-04 09:18:43 -04:00
Dan Winship
7314256b77 libnm-core: drop nm_{setting,connection}_get_virtual_iface_name()
Since we enforce the fact that bond, bridge, team, and vlan
interface-name properties match NMSettingConnection:interface-name,
nm_connection_get_virtual_iface_name() can be replaced with
nm_connection_get_interface_name() basically everywhere.

The one place this doesn't work is with InfiniBand partitions (where
get_virtual_iface_name() was actually computing the name), but for the
most part we only need to care about the interface names of InfiniBand
partitions in places where we also already need to do some other
InfiniBand-specific handling as well, so we can use an
InfiniBand-specific method
(nm_setting_infiniband_get_virtual_interface_name()) to get it.

(Also, while updating nm_device_get_virtual_device_description(), fix
it to handle InfiniBand partitions too.)
2014-09-04 09:18:43 -04:00
Dan Winship
608b13e797 libnm-core: replace deprecated settings props with "dbus-only" props [bgo #734492] 2014-09-04 09:17:37 -04:00
Dan Winship
a5ac95ca4b libnm-core: drop previously-deprecated NMSetting properties
Drop the NMSetting properties that were marked deprecated in
libnm-util in 0.9.10, but use nm_setting_class_add_dbus_property() to
deal with them appropriately when serializing/deserializing.
2014-09-04 09:17:37 -04:00
Dan Winship
002b19f4f1 libnm-core: add dbus-only properties to NMSettingClass
Add _nm_setting_class_add_dbus_only_property(), for declaring
properties that appear in the D-Bus serialization, but which don't
correspond to GObject properties.

Since some property overrides will require examining settings other
than the setting that they are on (eg, the value of
802-11-wireless.security depends on whether an
NMSettingWirelessSecurity setting is present, and
NMSettingConnection:interface-name might sometimes be set from, eg,
bond.interface-name), we also update _nm_setting_to_dbus() to take the
full NMConnection as an argument, and _nm_setting_new_from_dbus() to
take the full connection hash.

Additionally, with some deprecated properties, we'll want to validate
them on construction, but we don't need to keep the value around after
that. So allow _nm_setting_new_from_dbus() to return a verification
error directly, so we don't need to store the value until the verify()
call.
2014-09-04 09:17:37 -04:00
Dan Winship
504c292d73 libnm-core: clean up nm_connection_replace_settings()'s semantics
On failure, nm_connection_replace_settings() would leave the
connection in an undefined state. Fix it so that either (a) the
settings are replaced and the resulting connection is valid and we
return TRUE, or (b) the connection is untouched and we return FALSE
and an error. (And add a test case for this.)
2014-09-04 09:17:37 -04:00
Dan Winship
05f3068163 libnm-core: clarify nm_setting_lookup_type*() failure
nm_setting_lookup_type() and nm_setting_lookup_type_by_quark() return
G_TYPE_INVALID on failure.
2014-09-04 09:17:37 -04:00
Dan Winship
c191c38a5f libnm-core: reorganize _nm_setting_new_from_dbus()
Reorganize _nm_setting_new_from_dbus() to create an empty NMSetting
first and then set each of its properties, rather than passing all of
the properties to g_object_newv(). We don't need to pass them at
construct time since no NMSetting properties are CONSTRUCT_ONLY, and
organizing the function this way is a prereq for some later
functionality (being able to run code when a property *isn't* present
in the hash).
2014-09-04 09:17:37 -04:00
Dan Winship
773d3f0ab6 libnm-core: rename NMConnection to/from_hash methods
Rename nm_connection_to_hash() to nm_connection_to_dbus(), and
nm_connection_new_from_hash() to nm_connection_new_from_dbus(). In
addition to clarifying that this is specifically the D-Bus
serialization format, these names will also work better in the
GDBus-based future where the serialization format is GVariant, not
GHashTable.

Also, move NMSettingHashFlags to nm-connection.h, and rename it
NMConnectionSerializationFlags.
2014-09-04 09:17:36 -04:00
Dan Winship
c9653a9e67 libnm-core: make the NMSetting hash methods private
Make nm_setting_to_hash() and nm_setting_new_from_hash() private, and
remove the public nm_setting_update_secrets() wrapper around the
existing private _nm_setting_update_secrets().

These functions should really only be called from the corresponding
NMConnection-level methods, and in particular, with certain
compatibility properties in the future, we will need to consider the
entire connection all at once when setting properties, so it won't
make sense to serialize/deserialize a single setting in isolation.
2014-09-04 09:17:36 -04:00
Dan Winship
98e4a2be30 libnm-core, libnm-util: remove some useless code in nm-settings.c
g_object_class_list_properties() can't return NULL if called
correctly.

Also remove two failed attempts to use g_value_transform():
nm_setting_new_from_hash() was transforming src_value to its own type
(rather than to param_spec->value_type, which was presumably
intended), so it was a no-op (in addition to being unnecessary anyway,
since GObject will attempt to transform the value internally if
needed). And update_one_secret() was calling g_value_transform() on an
uninitialized GValue, so it would have always hit a
g_return_val_if_fail() in g_value_transform() if that code was ever
reached (which apparently it wasn't).
2014-09-04 09:17:36 -04:00
Nilamdyuti Goswami
1e1bde7d83 po: update Assamese (as) translation (bgo #736024)
https://bugzilla.gnome.org/show_bug.cgi?id=736024
2014-09-04 14:36:21 +02:00
Dan Winship
799922c14b libnm-util: generate-plugin-docs.pl-related fixes
generate-plugin-docs.pl was assuming that it was being run out of
srcdir, and so failed in srcdir!=builddir builds (such as "make
distcheck"). Fix that.

Also, update .gitignore
2014-09-03 23:06:00 -04:00
Dan Williams
968f7958c9 ifcfg-rh: fix testcase to expect error reading iBFT configurations 2014-09-03 09:51:00 -05:00
Dan Winship
1838db9e71 all: remove a bunch of unnecessary dbus/dbus-glib includes 2014-09-03 10:45:24 -04:00
Jiří Klimeš
151645a648 bluetooth: don't crash when switching off bluetooth
Testcase:
- add a bluetooth connection (with auto-activate)
  $ nmcli con add type blue con-name phone bt-type panu addr 00:17:EA:84:E7:41
- make NM go to sleep (close a lid of laptop to suspend)
- switch off hardware wireless button
- resume the computer (open the lid)

Trace (from RHEL 7):
 (NetworkManager:3619): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'NMDeviceBt'
 (NetworkManager:3619): GLib-GObject-CRITICAL **: g_type_instance_get_private: assertion 'instance != NULL && instance->g_class != NULL' failed
 NetworkManager[3619]: <warn> Error connecting with bluez: Timeout was reached
 (NetworkManager:3619): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'NMDevice'
 (NetworkManager:3619): GLib-GObject-CRITICAL **: g_type_instance_get_private: assertion 'instance != NULL && instance->g_class != NULL' failed
 Program received signal SIGSEGV, Segmentation fault.
 nm_device_state_changed (device=0x7f8ffe63c7f0, state=state@entry=NM_DEVICE_STATE_FAILED, reason=reason@entry=
     NM_DEVICE_STATE_REASON_BT_FAILED) at devices/nm-device.c:6685
 6685            g_warn_if_fail (priv->in_state_changed == FALSE);
 Missing separate debuginfos, use: debuginfo-install ModemManager-glib-1.1.0-6.git20130913.el7.x86_64 dbus-glib-0.100-7.el7.x86_64 dbus-libs-1.6.12-8.el7.x86_64 glib2-2.40.0-2.el7.x86_64 glibc-2.17-58.el7.x86_64 gvfs-1.16.4-7.el7.x86_64 libbluray-0.2.3-5.el7.x86_64 libffi-3.0.13-11.el7.x86_64 libgcc-4.8.3-5.el7.x86_64 libgudev1-208-11.el7_0.2.x86_64 libndp-1.2-4.el7.x86_64 libnl3-3.2.21-6.el7.x86_64 libselinux-2.2.2-6.el7.x86_64 libsoup-2.46.0-2.el7.x86_64 libuuid-2.23.2-16.el7.x86_64 libxml2-2.9.1-5.el7.x86_64 nspr-4.10.6-2.el7.x86_64 nss-3.16.2-4.el7.x86_64 nss-softokn-3.16.2-2.el7.x86_64 nss-softokn-freebl-3.16.2-2.el7.x86_64 nss-util-3.16.2-2.el7.x86_64 pcre-8.32-13.el7.x86_64 polkit-0.112-5.el7.x86_64 sqlite-3.7.17-4.el7.x86_64 systemd-libs-208-11.el7_0.2.x86_64 teamd-1.12-1.el7.x86_64 xz-libs-5.1.2-8alpha.el7.x86_64 zlib-1.2.7-13.el7.x86_64
 (gdb) DHCPREQUEST on enp0s25 to 255.255.255.255 port 67 (xid=0x566289d3)
 DHCPACK from 10.34.0.254 (xid=0x566289d3)
 bt
 #0  nm_device_state_changed (device=0x7f8ffe63c7f0, state=state@entry=NM_DEVICE_STATE_FAILED, reason=reason@entry=
     NM_DEVICE_STATE_REASON_BT_FAILED) at devices/nm-device.c:6685
 #1  0x00007f8fee0847bf in bluez_connect_cb (object=<optimized out>, res=<optimized out>, user_data=<optimized out>)
     at nm-device-bt.c:738
 #2  0x00007f8ff93eb557 in g_simple_async_result_complete (simple=0x7f8ffe67d8a0) at gsimpleasyncresult.c:763
 #3  0x00007f8fee07ec85 in bluez_connect_cb (dbus_connection=<optimized out>, res=0x7f8ffe67d730, user_data=<optimized out>)
     at nm-bluez-device.c:484
 #4  0x00007f8ff93eb557 in g_simple_async_result_complete (simple=0x7f8ffe67d730) at gsimpleasyncresult.c:763
 #5  0x00007f8ff944637f in g_dbus_connection_call_done (source=<optimized out>, result=<optimized out>, user_data=0x7f8ffe64a840)
     at gdbusconnection.c:5492
 #6  0x00007f8ff93eb557 in g_simple_async_result_complete (simple=0x7f8ffe66de30) at gsimpleasyncresult.c:763
 #7  0x00007f8ff93eb5b9 in complete_in_idle_cb (data=<optimized out>) at gsimpleasyncresult.c:775
 #8  0x00007f8ff8c3b9ea in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
 #9  0x00007f8ff8c3bd38 in g_main_context_iterate.isra.24 () from /lib64/libglib-2.0.so.0
 #10 0x00007f8ff8c3c00a in g_main_loop_run () from /lib64/libglib-2.0.so.0
 #11 0x00007f8ffcaba9ba in main (argc=1, argv=0x7ffff6b335b8) at main.c:642
 (gdb)
2014-09-02 14:53:47 +02:00
Jiří Klimeš
6ed48691f7 man: add/update bonding and team examples in nm-settings-ifcfg-rh 2014-09-01 14:17:45 +02:00
Dan Williams
fc9c1f1557 merge: add settings plugin for reading iBFT configuration (bgo #734009) (rh #990480) 2014-08-29 18:51:34 -05:00
Dan Williams
a175ff090c core: allow connection assumption on pre-configured software devices
In the specific case that triggered this bug, both eth0 and eth0.123
existed and were configured before NM started, and a valid saved connection
existed for eth0.123.  eth0 was ordered before eth0.123 in the Platform's
link list.  When the end of add_devices() was reached for eth0 and
system_create_virtual_devices() was called, NM created an NMDevice for
the pre-existing eth0.123 link due to the saved connection, and
ignored the existing configuration because system_create_virtual_device()
re-calls add_device() with generate_con = FALSE.

Instead, we should allow system_create_virtual_device() to call add_device()
with generate_con = TRUE if the interface existed before NM created it. We
only want to skip connection assumption if the device was actually just
created by NM, in which case it cannot have any configuration to assume.
2014-08-29 18:46:11 -05:00
Dan Williams
af13376e2b core: allow plugin/factory originated devices to assume connections
This didn't previously matter because BT/WWAN/WiFi/ADSL can't easily
assume existing connections due to the external helpers involved, but
when we converted Team support to a plugin we now want to allow this.
2014-08-29 18:46:11 -05:00