Commit Graph

7207 Commits

Author SHA1 Message Date
Dan Winship
3c13d9e3fd misc: remove some dead code
The G_DISABLE_CHECKS version of g_return_if_reached() still returns,
it just doesn't log. So don't include a manual return after a
return-if-reached.
2014-06-12 17:13:56 -04:00
Jiří Klimeš
948a27257a bluetooth: don't crash when switching off bluetooth (rh #1059494)
When connected to a phone via bluetooth and turning bluetooth off on the
computer NetworkManegr crashed due to accessing invalid device.

Reproducer:
- activate bluetooth on a computer and a phone
- pair the devices
- $ nmcli con add type blue con-name phone bt-type panu addr 00:17:EA:84:E7:41
- turn off bluetooth on computer (either with a hardware or software switch)

https://bugzilla.redhat.com/show_bug.cgi?id=1059494
2014-06-12 13:52:45 +02:00
Yegor Yefremov
c62639d572 nm-dispatcher: explicitly include gio/gio.h
Without this header Buildroot's build complains about unknown
types like GFile etc.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-11 18:53:13 +02:00
Jiří Klimeš
9ee3ac20b0 ifcfg-rh: accept IPv6 routes without "via" in route6 file (bgo #697525)
Routes without nexthop are legal and should be treated as a device route
(direct route).

https://bugzilla.gnome.org/show_bug.cgi?id=697525
2014-06-11 10:44:18 +02:00
Dan Winship
cdd09286d7 core: fix metrics of user-added routes
Adding a route with a metric of 0 to an IP4 or IP6 setting used to
implicitly mean "use the default metric for the device", but this got
broken by 722c9034. Fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=731402
2014-06-10 09:14:48 -04:00
Thomas Haller
63ef089f69 platform: pass optional padding to _rebase_relative_time_on_now()
_rebase_relative_time_on_now() is used both by _address_get_lifetime()/nm_platform_ip[46]_address_sync()
and the to_string() functions.

In the latter case, we want to print the original value, without padding. Otherwise in
the addresses are printed in the logs with an additional 5 seconds
padding, which is confusing.

For adding addresses in platform however, we still want to keep the
padding. So pass it on as additional parameter.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-07 11:35:22 +02:00
Thomas Haller
8366d7cd1b platform: fix setting preferred time off-by-one in _init_ip_address_lifetime()
This error was introduced only recently with commit
8310a039d8.

Signed-off-by: Thomas Haller <thaller@redhat.com>
2014-06-07 11:18:51 +02:00
Dan Williams
e5ccc30e3c core: suppress missing MAC address warning during connection matching
One of the connetions may not have a MAC address, so don't expect one.
2014-06-06 16:37:03 -05:00
Dan Winship
c4ca23137e core: fix lag in NMManager:state moving to CONNECTED_GLOBAL
Something changed at some point so that NMManager was now recomputing
its state after a connection was activated, but before NMPolicy had
decided whether to give that connection the default route, meaning
NMManager would set the state to CONNECTED_LOCAL rather than
CONNECTED_GLOBAL.

Fix this by watching the active connection :default and :default6
properties too, so we do the right thing regardless of what order the
AC properties change in.
2014-06-06 15:33:03 -04:00
Dan Williams
02252224e2 dispatcher: bump overall timeout to 10 minutes (rh #982734) (rh #1048345)
Since NM now handles long-running dispatcher scripts better, allow them
to run for really long times.
2014-06-06 13:43:47 -05:00
Dan Williams
df601ad68c dispatcher: enhance debug logging
Attach a request ID to every request, and print that out in the debug
messages so you can see which results match up with which dispatcher
requests.
2014-06-06 13:43:47 -05:00
Dan Williams
1383f4bc14 dispatcher: use separate directories for pre-up/pre-down events
To ensure that NetworkManager does not block needlessly for events
which have no scripts, require scripts that respond to blocking
events to opt into the action.
2014-06-06 13:43:46 -05:00
Dan Williams
7eaaa6a475 core: block on dispatcher scripts when quitting
Like VPN connections, block on dispatcher scripts when quitting.  Since
the event loop is no longer running we can't schedule callbacks.
2014-06-06 13:43:46 -05:00
Dan Williams
38e6b7387f core: implement PRE_UP dispatcher actions 2014-06-06 13:43:46 -05:00
Dan Williams
d00e2147de core: implement PRE_DOWN dispatcher actions (bgo #387832)
https://bugzilla.gnome.org/show_bug.cgi?id=387832
2014-06-06 13:43:46 -05:00
Dan Williams
ce3d2cf0e6 vpn: implement PRE_UP dispatcher actions 2014-06-06 13:43:46 -05:00
Dan Williams
beb5529c42 vpn: make DOWN dispatcher action block on quit
Since the event loop isn't running on quit, but we want to ensure that
scripts can fully process the DOWN event, block on scripts completing
when disconnecting the VPN when quitting.
2014-06-06 13:43:46 -05:00
Dan Williams
e1ec6a5173 vpn: implement PRE_DOWN dispatcher actions (bgo #387832)
https://bugzilla.gnome.org/show_bug.cgi?id=387832
2014-06-06 13:43:46 -05:00
Dan Williams
27cb927d8f dispatcher: convert action_to_string to a table
Oddly, this increases the compiled+stripped size of the object file
by 24 bytes (8296 -> 8320), but I think it produces more readable code.
2014-06-06 13:43:46 -05:00
Dan Williams
19d7386b2f dispatcher: add PRE_UP states
This event runs before a connection/device is announced as
"activated" or "connected", to enable scripts to do things
before applications begin using connectivity.  For example,
this could be used to manage /etc/resolv.conf outside of
NetworkManager and ensure that resolv.conf had correct
information before DNS is used.

Note that this is different than the Debian or Gentoo "pre-up"
event used in /etc/network/interfaces, as that event runs before
any L2 configuration has started.  If we really need an event
like that, we'll add it later as "lower-up".
2014-06-06 13:43:46 -05:00
Dan Williams
286e926ee8 dispatcher: robustify canceling dispatcher calls
Thomas pointed out that using the address of the DispatcherInfo
structure as the dispatcher call ID could cause a mis-cancelation
if malloc re-used the same block in the future.  While the code
should be correctly clearing call IDs after the callback runs
or is canceled, just use numeric IDs to avoid potential crashses.
2014-06-06 13:43:46 -05:00
Dan Williams
90b747fa11 dispatcher: add synchronous dispatcher calls
On shutdown we can't defer the response to a callback, so we need to
use synchronous D-Bus calls.  Second, sometimes we want to block on
the dispatcher response, like for pre-down.
2014-06-06 13:43:46 -05:00
Dan Williams
5150cb88c2 dispatcher: only dispatch if scripts exist
If there are no dispatcher scripts, don't bother dispatching any
events.  This saves some time configuring networking if the event
would have no effect anyway.
2014-06-06 13:43:45 -05:00
Dan Williams
4cc13befd3 dispatcher: rename executable to 'nm-dispatcher' 2014-06-06 13:43:45 -05:00
Dan Williams
c93ae45b42 core: don't do anything interesting in NMDevice dispose()
The NMDevice dispose() function contained some badly-duplicated logic
about when to deactivate a device on its last ref.  This logic should
only run when the device is removed by the manager, since the  manager
controls the device's life-cycle, and the manager knows best when to
clean up the device.  But since it was tied to the device's refcount,
it could have run later than the manager wanted, or not at all.

It gets better.  Dispose duplicated logic that was already done in
nm_device_cleanup(), and then *called* nm_device_cleanup() if the
device was still activated and managed.  But the manager already
unmanages the device when removing it, which triggers a call to
nm_device_cleanup(), takes the device down, and resets the IPv6
sysctl properties, which dispose() duplicated too.  So by the time
dispose() runs, the device should already be unmanaged if the
manager wants to deconfigure it, and most of the dispose() code
should be a no-op.

Clean all that up and remove duplicated functions.  Now, the flow
should be like this:

1) manager decides to remove the device and calls remove_device()
2) if the device should be deconfigured, the manager unmanages
   the device
3) the NMDevice state change handler tears down the active connection
   via nm_device_cleanup() and resets IPv6 sysctl properties
4) when the device's last reference is finally released, only internal
   data members are freed in dispose() because the device should
   already have been cleaned up by the manager and be unmanaged
5) if the device should be left running because it has an assumable
   connection, then the device is not unmanaged, and no cleanup
   happens in the state change handler or in dispose()
2014-06-06 13:43:45 -05:00
Dan Williams
90242d74a9 core: consolidate generic device cleanup tasks
dispose() and nm_device_cleanup() both do common tasks; consolidate
these common tasks in one place and call when appropriate.
2014-06-06 13:43:45 -05:00
Dan Williams
47622420da core: (trivial) some NMDevice dispose/finalize cleanups
Ensure autoip4 is cleaned up when disposing, like we clean up DHCP.

Move things that only free stuff to finalize(), and move things that
unref stuff to dispose (eg, the Firewall Manager stuff).
2014-06-06 13:43:45 -05:00
Dan Williams
4b6f0d50a4 core: fix deactivation of assumed connections on device removal (bgo #729833)
The following procedure leaves an NMActiveConnection around for a deactivated
device, which causes errors in libnm-glib clients when they cannot create the
GObject for the non-existent device of the AC.

1) allow a device which can assume connections to be activated
2) stop NM, which should leave the device's IP configuration up
3) start NM and allow it to assume the device's existing connection
4) remove the device, either by unplugging it or 'rmmod'

The device is removed by nm-manager.c::remove_device(), but the device object
is not moved to UNMANAGED state, leaving the NMActiveConnection completely
unaware the device has gone away.

The nm-manager.c::remove_device() code did not correctly handle moving a
forcibly removed (eg, by unplugging or 'ip link del' or 'rmmod') device to
the UNMANAGED state when the device was active with an assumed connection.
To fix this, make the conditions when the device should be deactivated
on removal much more explicit.

A device should be deactivated on removal if:

1) it is forcibly removed, eg by the kernel network interface being
removed due to 'ip link del' or hotplugging, or internally by NM due
to a parent WWAN interface taking priority over a WWAN ethernet interface

2) if the device cannot assume connections, in which case NetworkManager
must have activated the device and since we cannot assume the connection
on restart, we should deactivate it

3) if the device is not activated, to ensure that its IPv6 parameters
and other things get reset to the pre-NetworkManager values

https://bugzilla.gnome.org/show_bug.cgi?id=729833
2014-06-06 13:43:45 -05:00
Dan Williams
76aa8ce40e core: simplify DHCP cleanup
dhcp6_cleanup() frees priv->dhcp6_ip6_config so dispose() doesn't need
to do that.  Also use g_clear_object() when appropriate.

Lastly, notify that the DHCP4/6 config objects have changed *after*
clearing them, so that the PropertiesChanged signal is emitted with a
blank path to indicate the object is gone.  Previously the PC signal
would have been emitted with the valid path of the DHCP4/6 config object,
but the object would already be dead.
2014-06-06 13:43:45 -05:00
Dan Williams
4809898e08 trivial: simplify nm_device_set_is_nm_owned()
Nothing used its return value or passed FALSE.
2014-06-06 13:43:45 -05:00
Dan Williams
f3fbbf4a77 core: rearrange and remove some NMDevice getters
For any function in nm-device.h which is not used outside of
nm-device.c, remove the public prototypes.  Functions that
are actually used get moved above their caller, and functions
that have no callers are removed.
2014-06-06 13:43:45 -05:00
Dan Williams
b4c368692d core: let NMDevice export itself
Saves some code and a memory allocation.
2014-06-06 13:43:45 -05:00
Dan Williams
c958540bcc core: clean up NMDevice simple getters/setters
Group most of the simple getters together near the top, and remove
getters that have no callers (mtu, firmware-version).
2014-06-06 13:43:44 -05:00
Dan Williams
ef2edfce4f trivial: re-organize IPv6 /proc property util functions 2014-06-06 13:43:44 -05:00
Dan Williams
1856a1c315 core: refactor state/reason string functions to use static tables 2014-06-06 13:43:44 -05:00
Dan Williams
1c737f230f core: re-order NMDevice functions to match current idoms
Move the GObject-related stuff to the bottom of the file and get
rid of no-longer-necessary forward prototypes since the stuff that
required those prototypes is now below the implementation.
2014-06-06 13:43:44 -05:00
Dan Williams
a2fc57beef trivial: remove redundant check
check_if_startup_complete() already checks priv->startup and returns
if it's FALSE.  This if() is redundant.
2014-06-06 13:43:44 -05:00
Dan Williams
d1095e00cb vpn: stop all connections of a service outside of dispose
Future patches will allow blocking dispatcher calls, which we
don't want to happen when deactivating a VPN connection during
normal operation.  So move code that stops VPN connections outside
of the VPNService object's dispose() function and require the object
that owns the VPNService (the VPNManager) to stop connections at the
right times.

When quitting, blocking calls are acceptable (because NetworkManager's
D-Bus interface is no longer useful, plus we can't easily schedule
callbacks because no mainloop is running), so it's ok to stop
connections from NMVPNManager:dispose.
2014-06-06 13:43:44 -05:00
Dan Williams
fbb38ebefe vpn: remove pointless child watch on VPN service daemons
D-Bus already watches the life-cycle, and we'll get a NameOwnerChanged
signal when the VPN service daemon quit.  So the GLib child watch is
just duplicated code that we don't need.  Remove it.
2014-06-06 13:43:44 -05:00
Dan Williams
e957a25db3 vpn: queue additional VPN connections
If a VPN connection is already active, tell it to deactivate and
queue the new VPN connection for activation when the first one is
disconnected.
2014-06-06 13:43:44 -05:00
Dan Williams
b6558ecf47 vpn: consolidate nm_vpn_connection_fail() and nm_vpn_connection_disconnect() 2014-06-06 13:43:44 -05:00
Dan Williams
f3c67726dc vpn: simplify VPN connection lookup 2014-06-06 13:43:44 -05:00
Dan Williams
0596939565 vpn: implement placeholder DEACTIVATING state 2014-06-06 13:43:43 -05:00
Dan Williams
cf62986857 vpn: add DEACTIVATING state
Since NM_VPN_CONNECTION_STATE_* are linear in number and defined API,
we can't add a DEACTIVATING state in the right place.  So create a
NMVPNConnection internal VPN state and convert that to the old
NM_VPN_CONNECTION_STATE_* numbers at exit points from the object.

(This will also allow us to get rid of priv->secrets_req in the future
and fold that into the VPN states)
2014-06-06 13:43:43 -05:00
Dan Williams
13a9f2781a vpn: remove useless 'disposed' member from NMVPNConnection 2014-06-06 13:43:43 -05:00
Dan Williams
c9d183f7fc vpn: simplify duplicate service checking 2014-06-06 13:43:43 -05:00
Dan Williams
063411df42 vpn: remove useless 'disposed' member from NMVPNManager
Just make dispose() able to be called again.
2014-06-06 13:43:43 -05:00
Dan Williams
ca7fd98bbe vpn: simplify creation of VPN service objects 2014-06-06 13:43:43 -05:00
Dan Williams
5d1610b347 vpn: optimize un-needed strlen (trivial) 2014-06-06 13:43:43 -05:00
Dan Williams
4b57f6920e vpn: let VPN services quit themselves
Instead of telling a VPN service to quit, leave that up to the service
itself.  Services based on libnm-glib-vpn already have a quit timeout
of 20 seconds.  We also eventually want to D-Bus activate the VPN
services, and at that point we won't have a PID we can send signals
to.
2014-06-06 13:43:43 -05:00