Commit graph

792 commits

Author SHA1 Message Date
Thomas Haller
83d8a9e094 platform: streamline fields in platform's structures
- sort the fields to better fill gaps due to alignment.
- use "bool" bitfield instead of gboolean.
2016-02-29 16:04:54 +01:00
Thomas Haller
866925e65c platform/trivial: rename NMPlatformLink's "flags" field to "n_ifi_flags"
There are far too many "flags". Rename the "flags" to "n_ifi_flags"
which reminds to "ifi_flags" in 'struct ifinfomsg', but with a
distinctive "n_" prefix.
2016-02-29 15:56:01 +01:00
Thomas Haller
41b46f1393 platform: adjust type of link flags to guint
The type of ifi_flags is unsigned, not uint32_t.
2016-02-29 15:53:19 +01:00
Thomas Haller
b913e1d641 platform: optimize sysctl_set() to use stack allocated buffer
The value written to sysctl is usually a short string. It makes sense
to optimize for this case and avoid allocating a temporary string
on the heap.

An alternative would be to use writev(), which effectively does the same
and also creates a temporary buffer (preferably stack allocated).

https://mail.gnome.org/archives/networkmanager-list/2016-February/msg00070.html
2016-02-24 11:24:13 +01:00
Thomas Haller
8bace23beb all: cleanup includes and let "nm-default.h" include "config.h"
- All internal source files (except "examples", which are not internal)
  should include "config.h" first. As also all internal source
  files should include "nm-default.h", let "config.h" be included
  by "nm-default.h" and include "nm-default.h" as first in every
  source file.
  We already wanted to include "nm-default.h" before other headers
  because it might contains some fixes (like "nm-glib.h" compatibility)
  that is required first.

- After including "nm-default.h", we optinally allow for including the
  corresponding header file for the source file at hand. The idea
  is to ensure that each header file is self contained.

- Don't include "config.h" or "nm-default.h" in any header file
  (except "nm-sd-adapt.h"). Public headers anyway must not include
  these headers, and internal headers are never included after
  "nm-default.h", as of the first previous point.

- Include all internal headers with quotes instead of angle brackets.
  In practice it doesn't matter, because in our public headers we must
  include other headers with angle brackets. As we use our public
  headers also to compile our interal source files, effectively the
  result must be the same. Still do it for consistency.

- Except for <config.h> itself. Include it with angle brackets as suggested by
  https://www.gnu.org/software/autoconf/manual/autoconf.html#Configuration-Headers
2016-02-19 17:53:25 +01:00
Thomas Haller
328c733a6a platform: expose nmp_utils_ip4_address_is_link_local() function 2016-02-18 20:21:27 +01:00
Thomas Haller
e13925597f platform: add IN6_ADDR_GEN_MODE_RANDOM to nm_platform_link_inet6_addrgenmode2str()
There is a new address generation mode.
2016-02-17 14:19:19 +01:00
Thomas Haller
c6849be179 platform: use nm_platform_link_inet6_addrgenmode2str() in link-to-string
Reuse the to-string function nm_platform_link_inet6_addrgenmode2str() to print the
addrgenmode for nm_platform_link_to_string().

Also, now we support NM_IN6_ADDR_GEN_MODE_STABLE_PRIVACY.
2016-02-17 14:01:49 +01:00
Thomas Haller
c205ee6ce0 platform: stack-allocate temporary string in nm_platform_link_tun_get_properties_ifname() 2016-02-17 13:39:55 +01:00
Thomas Haller
3d759b1f11 platform: during @abort_parsing goto stop in event_handler_recvmsgs()
Now, that we no longer overwrite @err, we can jump to stop: instead
of out:.
2016-02-16 14:13:25 +01:00
Thomas Haller
329ac02d38 platform: don't set @err during stop: in event_handler_recvmsgs()
If we break the loop normally, @err must be already set to zero.
The only other way this can happen is when the credentials are
invalid. Move setting @err to there.
2016-02-16 14:13:25 +01:00
Thomas Haller
3f00899bde platform: continue reading in event_handler_recvmsgs() when not handling events
If @handle_events is FALSE, we want to drain the socket. In that case
even when encountering an error error we don't want to abort, but instead
continue reading the next message.
2016-02-16 14:13:25 +01:00
Thomas Haller
dc97a3b39b platform: fix error handling in event_handler_recvmsgs()
@abort_parsing is set TRUE at two places, which also explicitly
set @err to something. We don't want to reset @err and got to the
next @hdr. Instead error out first.
2016-02-16 14:13:25 +01:00
Thomas Haller
43381f9b85 platform: downgrade logging message to TRACE level in event_handler_recvmsgs()
Doesn't seem important and might be triggered by other processes.
2016-02-16 14:13:25 +01:00
Thomas Haller
9254cbe875 platform: don't return number of messages from event_handler_recvmsgs()
The value is not used by the callers. Also, with @handle_events set
to false, it is not clear what the value really means because we skip
over errors.
2016-02-16 14:13:25 +01:00
Thomas Haller
04805f659f platform: simplify event_handler_recvmsgs() by using cleanup attribute 2016-02-16 14:13:25 +01:00
Thomas Haller
dec682f6d1 platform/tests: workaround test failure for kernel bug
Unenslaving from a bridge can cause a spurious RTM_DELLINK signal.
NMPlatform does raise those signals, but fixes the state of the
cache afterwards. Workaround the test failure.

Related: https://bugzilla.redhat.com/show_bug.cgi?id=1285719
2016-02-16 13:01:47 +01:00
Thomas Haller
9c0cfbbae6 platform: fix detection of link-type for netlink event
Often a netlink event doesn't contain enough information to determine
the link type. Then we consult sysctl or ethtool. However, if we already
have the same object cached, we want to reused the (once detected) link-type.

There was a bug in lookup of the cached object.
2016-02-15 17:19:22 +01:00
Thomas Haller
9ce0995efb platform: change format to print link-type in nm_platform_link_to_string() 2016-02-15 16:23:38 +01:00
Thomas Haller
e663b88c59 all/trivial: rename STRLEN() macro to NM_STRLEN()
We should not have defines/macros in header files without a nm/NM
prefix. STRLEN() was one of the few offenders.

https://mail.gnome.org/archives/networkmanager-list/2016-February/msg00048.html
2016-02-14 11:34:42 +01:00
Lubomir Rintel
ace8d96bed test: assert that the signal connection succeeds properly
0 is not success and negative can not happen, as Coverity points out.
2016-02-12 15:48:12 +01:00
Lubomir Rintel
86a0a14687 test: avoid assert with side effect
Not a real problem, but makes Coverity uncomfortable.
2016-02-12 15:48:12 +01:00
Thomas Haller
2c2d9d2e4c build: cleanup default includes
- "gsystem-local-alloc.h" and <gio/gio.h> are already included via
  "nm-default.h". No need to include them separately.

- include "nm-macros-internal.h" via "nm-default.h" and drop all
  explict includes.

- in the modified files, ensure that we always include "config.h"
  and "nm-default.h" first. As second, include the header file
  for the current source file (if applicable). Then follow external
  includes and finally internal nm includes.

- include nm headers inside source code files with quotes

- internal header files don't need to include default headers.
  They can savely assume that "nm-default.h" is already included
  and with it glib, nm-glib.h, nm-macros-internal.h, etc.
2016-02-12 15:36:01 +01:00
Beniamino Galvani
97be12b662 platform: always try to refetch new ethernet links
Due to a kernel bug [1], we sometimes receive spurious NEWLINK
messages after a wifi interface has disappeared. Since the link is not
present anymore we can't determine its type and thus it will show up
as a Ethernet one, with no address specified.  Request the link again
to check if it really exists.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1302037

https://bugzilla.gnome.org/show_bug.cgi?id=761151
2016-02-12 14:41:56 +01:00
Thomas Haller
04ec21ccc2 logging: add new logging macros _LOGx_err() to log errno
Not yet used, only implemented for nm-linux-platform.c as a
show case.

Use it like:

  _LOGW_err (errno, "failed to popen()");
2016-02-05 11:10:38 +01:00
Thomas Haller
bd17fc6d24 platform: assume support for IPv6 temporary addrsses if detection fails
We detect support for IPv6 temporary addresses (IFA_F_MANAGETEMPADDR) or /64 v6 prefixes
(IFA_F_NOPREFIXROUTE) based on the presence of extended address flags. For the most part
this just works, but it fails down if upon initialization no addresses are present.

In such a case we would have assumed no support. Change that to default to available
support as the feature is already 2 years in upstream kernel.
2016-02-04 18:04:43 +01:00
Thomas Haller
72255b71d7 utils: pass entire return statement to NM_UTILS_LOOKUP_DEFINE() 2016-02-01 14:20:26 +01:00
Thomas Haller
572b60a203 utils: change _NM_UTILS_LOOKUP_DEFINE() to generate compiler warning about missing enum values
Don't implement a "default" case so that we get a compiler warning
about unused enum values.
2016-02-01 14:10:04 +01:00
Dan Williams
d442dcd174 platform: ignore permanent MAC addresses of all ones (FF:FF:FF:FF:FF:FF)
Drivers are stupid, and just like the platform ignores an all zeros
permanent address, so should it ignore all ones.

NetworkManager[509]: <debug> [1453743778.854919] [devices/nm-device.c:8885] nm_device_update_hw_address(): [0x190370] (eth0): hardware address now 86:18:52:xx:xx:xx
NetworkManager[509]: <debug> [1453743778.855438] [devices/nm-device.c:9138] constructed(): [0x190370] (eth0): read initial MAC address 86:18:52:xx:xx:xx
NetworkManager[509]: <debug> [1453743778.861602] [devices/nm-device.c:9148] constructed(): [0x190370] (eth0): read permanent MAC address FF:FF:FF:FF:FF:FF
2016-01-29 17:37:39 -06:00
Lubomir Rintel
503b714f15 wext: avoid division by zero
Coverity is angry:

CID 59367 (#1-3 of 3): Division or modulo by float zero (DIVIDE_BY_ZERO)
30. divide_by_zero: In expression
  ((double)max_level - (double)level) /
  ((double)max_level - (double)noise),
division by expression (double)max_level - (double)noise which may be zero has
undefined behavior.
2016-01-29 20:18:22 +01:00
Lubomir Rintel
9b85179840 fake-platform: check link_get return
Can not fail no fake platform, but makes Coverity worried:

CID 59381 (#1 of 1): Dereference null return value (NULL_RETURNS)
6.  dereference: Dereferencing a null pointer device.
2016-01-29 20:18:22 +01:00
Thomas Haller
f00c472ee8 platform: increase netlink socket receive buffer size
When the receive buffer is too small, we easily can hit ENOBUFS during recvmsg()
and need to resync the platform cache. But even worse, we possibly also loose
ACKs for pending netlink requests so that requests seem to fail (although they
might have succeeded).

Avoid that harder by increasing the buffer size to 8MB. This is also
done by networkd:

  be660c371b
2016-01-25 15:48:09 +01:00
Thomas Haller
45df49ebdd platform: improve detecting ENOBUFS for recvmsg() on netlink socket
libnl3 maps different error codes to NLE_NOMEM. Only resync platform cache
when we really experienced a ENOBUFS from recvmsg().
2016-01-25 15:08:32 +01:00
Thomas Haller
4ba999e41e platform: refactor check for error in event_handler_recvmsgs() to switch statement 2016-01-25 15:07:10 +01:00
Thomas Haller
8ab968d4ef platform: fix draining netlink socket on cache resync
Fixes: 809c547b6c
2016-01-25 14:38:35 +01:00
Thomas Haller
809c547b6c platform: handle netlink ACKs in event_handler_recvmsgs() during cache-resync
When reading from netlink-socket fails with NLE_NOMEM, messages were
lost. In this case the cache must be resynced and all pending messages
from the socket are rejected via "event_handler_recvmsgs (platform, FALSE)".

In this case, we don't want to handle the received messages as the
cache anyway needs to resync. However, we are still interested in
all queued ACKs that are there.

We are also interested in RTM_NEWADDR messages which we use to detect
kernel support via _support_kernel_extended_ifa_flags_detect().
2016-01-25 13:33:10 +01:00
Thomas Haller
ba187e054d core: refactor functions to use NM_UTILS_LOOKUP*()
Also use NM_UTILS_LOOKUP_STR() macro, which can transform
unknown values to their numerical representation using
alloca().
2016-01-24 15:04:36 +01:00
Dan Williams
356b4ce29c platform: fix leak when netlink dump is too large 2016-01-21 12:28:13 -06:00
Lubomir Rintel
88da21caa1 linux-platform: fix accidental Python
Coverity: CID 59378 (#1 of 1): Nesting level does not match indentation
(NESTING_INDENT_MISMATCH) This statement is indented to column 41, as if
it were nested within the preceding parent statement, but it is not.
2016-01-21 16:53:56 +01:00
Lubomir Rintel
d03322b2a5 linux-platform: fix a file descriptor leak
Coverity: CID 59384 (#3-1 of 3): Resource leak (RESOURCE_LEAK)26.
leaked_handle: Handle variable fd going out of scope leaks the handle
2016-01-21 16:32:23 +01:00
Lubomir Rintel
c1cf3c25c8 linux-platform: treat gadget devices as ethernet devices
Also, don't manage them by default. Whatver created it should take care of
management.
2016-01-21 11:33:59 +01:00
Thomas Haller
4b917123ef platform: use NM_UTILS_ENUM2STR_DEFINE() to implement to-string functions 2016-01-18 13:10:18 +01:00
Thomas Haller
94fabafc1a platform: use RT_SCOPE_* names in nm_platform_route_scope2str() 2016-01-18 13:10:18 +01:00
Thomas Haller
262ba62708 core/trivial: add code comment explaining route-handling and gateway 2016-01-18 13:10:18 +01:00
Thomas Haller
7a2a96f8ef platform/tests: add test for handling IPv4 zero gateways
Adding a route via iproute2 with explicit gateway 0.0.0.0
sets the route scope to GLOBAL, contrary to a on-link device-route
which has scope LINK.

Add a test adding two such routes.
2016-01-16 21:27:12 +01:00
Thomas Haller
4c79b605bc platform: implement nmp_object_is_visible() based on nmp_object_is_alive()
An object should only be visible if it is also alive.
Hence, refactor nmp_object_is_visible() to be reject
object that fail nmp_object_is_alive().
2016-01-16 13:43:23 +01:00
Thomas Haller
3294e06c28 platform: add "link" scope to nm_platform_route_scope2str() 2016-01-16 13:43:23 +01:00
Lubomir Rintel
a6c8a45463 platform: fix a typo when comparing the peer addresses 2016-01-12 17:59:23 +01:00
Beniamino Galvani
24d8604637 core: use NM_PLATFORM_GET instead of nm_platform_get() in function calls
Replacement was done with command:

spatch --sp-file nm_platform_get.cocci --in-place --smpl-spacing --dir src

where nm_platform_get.cocci contains:

@@
identifier func;
expression list args;
@@
- func (nm_platform_get())
+ func (NM_PLATFORM_GET)

@@
identifier func;
expression list args;
@@
- func (nm_platform_get(), args)
+ func (NM_PLATFORM_GET, args)
2016-01-06 21:25:56 +01:00
Beniamino Galvani
f96abc8be5 core: always use gulong to store signal handler ids
We inconsistently use gulong,guint,int types to store signal handler
id, but the type returned by g_signal_connect() is a gulong.

This has no practical consequences because a int/guint is enough to
store the value, however it is better to use a consistent type, also
because nm_clear_g_signal_handler() accepts a pointer to the signal id
and thus it must be always called with the same pointer type.
2016-01-06 21:25:55 +01:00