Commit graph

11681 commits

Author SHA1 Message Date
Thomas Haller
5551b3ab55 Revert "build/meson: name platform tests like autotools"
Older versions of meson don't support building the same names
multiple times.

  Meson encountered an error in file src/tests/meson.build, line 14, column 2:
  Tried to create target "test-general", but a target of that name already exists.

We really need to use unique filenames everywhere. Revert the name
change for now.

This breaks again the valgrind workaround in "tools/run-nm-test.sh".

This reverts commit 5466edc63e.
2019-02-23 07:40:03 +01:00
Thomas Haller
5466edc63e build/meson: name platform tests like autotools
Meson and autotools should name the tests the same way.
Also, all tests binaries built by autotools start on purpose
with "test-". Do that for meson too.

Also, otherwise "tools/run-nm-test.sh" fails to workaround
valgrind failures for platform tests as it does not expect
the tests to be named that way:

    if [ $HAS_ERRORS -eq 0 ]; then
        # valgrind doesn't support setns syscall and spams the logfile.
        # hack around it...
        if [ "$TEST_NAME" = 'test-link-linux' -o \
             "$TEST_NAME" = 'test-acd' ]; then
            if [ -z "$(sed -e '/^--[0-9]\+-- WARNING: unhandled .* syscall: /,/^--[0-9]\+-- it at http.*\.$/d' "$LOGFILE")" ]; then
                HAS_ERRORS=1
            fi
        fi
    fi
2019-02-23 07:24:35 +01:00
Thomas Haller
b1f6d53bc4 build/meson: increase timeouts for some tests
The defaults for test timeouts in meson is 30 seconds. That is not long
enough when running

  $ NMTST_USE_VALGRIND=1 ninja -C build test

Note that meson supports --timeout-multiplier, and automatically
increases the timeout when running under valgrind. However, meson
does not understand that we are running tests under valgrind via
NMTST_USE_VALGRIND=1 environment variable.

Timeouts are really not expected to be reached and are a mean of last
resort. Hence, increasing the timeout to a large value is likely to
have no effect or to fix test failures where the timeout was too rigid.
It's unlikely that the test indeed hangs and the increase of timeout
causes a unnecessary increase of waittime before aborting.
2019-02-23 07:20:49 +01:00
Thomas Haller
8f62c76c0a license: re-license initrd-generator and ibft reader as LGPL
New code we want to add LGPL licensed to make it easier to share code
between libnm and the daemon.

The code in question was only recently added in commit b544f7243d
("initrd: add iBFT reader") and mostly written from scratch by Lubomir.

Some parts were adapted from earlier ibft code.

  $ git shortlog -s -e -- src/settings/plugins/ibft/  ':(exclude)*/meson.build'
       3    Beniamino Galvani <bgalvani@redhat.com>
       1    Colin Walters <walters@verbum.org>
       2    Dan Williams <dcbw@redhat.com>
      17    Dan Winship <danw@redhat.com>
       7    Lubomir Rintel <lkundrak@v3.sk>
      46    Thomas Haller <thaller@redhat.com>

  $ git log --no-merges -L '/^fill_ip4_setting_from_ibft/,/^}/:src/settings/plugins/ifcfg-rh/reader.c' fc9c1f1557b517e799d15802e8f3d0ea43b0daea~ | grep '^Author: ' | sort | uniq
  Author: Dan Williams <dcbw@redhat.com>
  Author: Dan Winship <danw@redhat.org>
  Author: Jiří Klimeš <jklimes@redhat.com>
  Author: Pavel Šimerda <psimerda@redhat.com>

Hence, all non-trival contributions were provided by Red Hat employees
and the copy-right is with Red Hat.

Acked-by: Dan Williams <dcbw@redhat.com>
Acked-by: Dan Winship <danw@redhat.com>
Acked-by: Lubomir Rintel <lkundrak@v3.sk>
2019-02-22 21:06:00 +01:00
Thomas Haller
79af876e0e all/trivial: fix whitespace/indentation 2019-02-22 16:28:12 +01:00
Thomas Haller
46bc5feb99 device: fix suppressing warning log about unsupported IPv6LL handling
Wrongly did not suppress the message

    <warn>  [1550844832.3749] device (tunl0): failed to disable userspace IPv6LL address handling (not-supported)

Fixes: d18f40320d
2019-02-22 15:32:17 +01:00
Beniamino Galvani
de1022285a device: do ARP announcements only after masters have a slave
Delay ARP announcements for masters until the first interfaces gets
enslaved. There is no point in doing it before as the ARP packets
would be dropped in most cases; also, if the first slave is added when
we already started announcing, the MAC of the master is going to
change and so the remaining ARPs will have a wrong "sender mac
address" field.

https://bugzilla.redhat.com/show_bug.cgi?id=1678796

https://github.com/NetworkManager/NetworkManager/pull/301
2019-02-22 14:30:40 +01:00
Thomas Haller
53b747fff5 all: move nm_utils_hexstr2bin*() to shared
libnm exposes simplified variants of hexstr2bin in its public API. I
think that was a mistake, because libnm should provide NetworkManager
specific utils. It should not provide such string functions.

However, nmcli used to need this, so it was added to libnm.

The better approach is to add it to our internally shared static
library, so that all interested components can make use of it.
2019-02-22 14:04:13 +01:00
Thomas Haller
2148d09482 core/wireguard: add support for WireGuard peers
That is slightly complex, because we need to (DNS) resolve the endpoints,
and we also have to retry periodically. For example, initially we may be
unable to resolve an endpoint, but later we may be.

What is also interesting is that during assume and reapply, we may not
have all information in the profile. Most notably, the private keys will
be missing. We need to cope with that and not reconfigure keys. However,
we still need to resolve names and update the endpoints.
2019-02-22 11:01:04 +01:00
Thomas Haller
7f455f0519 core/wireguard: add basic support for creating wireguard devices
Configuring peers (and allowed-ips of the peers) is not
yet supported.
2019-02-22 11:00:11 +01:00
Thomas Haller
b521f426ab libnm,cli: add NMSettingWireGuard
For now only add the core settings, no peers' data.

To support peers and the allowed-ips of the peers is more complicated
and will be done later. It's more complicated because these are nested
lists (allowed-ips) inside a list (peers). That is quite unusual and to
conveniently support that in D-Bus API, in keyfile format, in libnm,
and nmcli, is a effort.
Also, it's further complicated by the fact that each peer has a secret (the
preshared-key). Thus we probably need secret flags for each peer, which
is a novelty as well (until now we require a fixed set of secrets per
profile that is well known).
2019-02-22 11:00:10 +01:00
Thomas Haller
bf863aba93 platform: move creation of nlmsg dump request in separate function
Split out the creation of the nlmsg with the netlink dump request.
Also, add a (still unused) parameter to overwrite the preferred
address family.
2019-02-22 10:08:00 +01:00
Thomas Haller
40e0ff9fbf platform: pass lookup instance to nmp_cache_dirty_set_all() instead of object-type
We already have NMPLookup to express a set of objects that can be looked
up via the multi-index.

Change the behavior of nmp_cache_dirty_set_all(), not to accept an
object-type. Instead, make it generally useful and accept a lookup
instance that is used to filter the elements that should be set as
dirty.
2019-02-22 10:08:00 +01:00
Thomas Haller
d431de70ac platform: refactor FOR_EACH_DELAYED_ACTION() macro to have only one for(;;) statement
for-each macros can be nice to use. However, such macros are potentially
error prone, as they abstract C control statements and scoping blocks.

I find it ugly to expand the macro to:

    for (...)
       if (...)

Instead, move the additional "if" check inside the loop's condition
expression, so that the macro only expands to one "for(;;)" statement.
2019-02-22 10:07:33 +01:00
Thomas Haller
7bb6433214 platform: create id-only objects for deleting qdisc/tfilter in event_valid_msg()
It does not matter too much, but the code optimizes for deletion events.
In that case, we don't require parsing the full netlink message.
Instead, it's enough to parse only the ID part so that we can find the
object in the cache that is to be removed removed.

Fix that for qdisc/tfilter objects.
2019-02-22 10:06:35 +01:00
Thomas Haller
e43d1d90f3 platform: minor cleanup in event_valid_msg() 2019-02-22 10:05:00 +01:00
Thomas Haller
08bc38cb5c platform/wifi: don't use __u32 type in "nm-wifi-utils-nl80211.c"
Also, use unsignd (guint) variable as index. That is fine, because
nla_len() returns a (signed) int.
2019-02-22 10:05:00 +01:00
Thomas Haller
60e4595101 platform: cleanup parsing of RTA_MULTIPATH in _new_from_nl_route()
I think the code before was correct. At the very least because
we only run the while-loop at most once because multipath routes
are not supported.

However, it seems odd that the while loop checks for

    "tlen >= rtnh->rtnh_len"

but later we do

    "tlen -= RTNH_ALIGN (rtnh->rtnh_len)"

Well, arguably, tlen itself is aligned to 4 bytes (as kernel sends
the netlink message that way). So, it was indeed fine.

Still, confusing. Try to check more explicitly for the buffer sizes.
2019-02-22 10:05:00 +01:00
Thomas Haller
1b7e89ad7d platform: use nla_data_as() at some places
nla_data_as() has a static assertion that casting to the pointer is
valid (regarding the alignment of the structure). It also contains
an nm_assert() that the data is in fact large enough.

It's safer, hence prefer it a some places where it makes sense.
2019-02-22 10:04:48 +01:00
Thomas Haller
f7e4310a0f platform: use nm_auto_nlmsg cleanup macro instead of explict nlmsg_free() 2019-02-22 09:58:09 +01:00
Thomas Haller
a41ca7cc89 platform: use nlmsg_append_struct() macro instead of nlmsg_append()
- nlmsg_append_struct() determines the size based on the argument.
  It avoids typing, but more importantly: it avoids typing redundant
  information (which we might get wrong).

- also, declare the structs as const, where possible.
2019-02-22 09:58:09 +01:00
Thomas Haller
98e42a4552 platform: prettify parsing MACSec from netlink 2019-02-22 09:58:09 +01:00
Thomas Haller
dca6d24aab platform: drop READ_STAT64() macro from _new_from_nl_link()
It doesn't make it easier to read. Also, the code comment points
out something rather obvious, as we later use unaligned API to access the
fields.
2019-02-22 09:58:09 +01:00
Thomas Haller
9cc592ae05 platform: don't use memset() to initialize variable in _new_from_nl_route() 2019-02-22 09:58:09 +01:00
Thomas Haller
495cfd9129 platform: sort #include in "nm-linux-platform.h" 2019-02-22 09:58:09 +01:00
Thomas Haller
451073e5bb platform: use nla_get_be64() helper 2019-02-22 09:58:09 +01:00
Thomas Haller
815e0329c0 platform/netlink: cleanup nlmsg_append() and add nlmsg_append_struct() macro 2019-02-22 09:58:09 +01:00
Thomas Haller
020000433b platform/netlink: add nla_data_as() macro
This macro casts the return pointer and asserts that the netlink attribute
is suitably large.
2019-02-22 09:58:09 +01:00
Thomas Haller
5920f187d3 platform/netlink: add more RTM message types in to-string function nl_nlmsghdr_to_str() 2019-02-22 09:58:09 +01:00
Thomas Haller
bc7bf3c861 platform/netlink: add nla_get_be64() helper 2019-02-22 09:58:09 +01:00
Thomas Haller
fac357ac8b platform/netlink: require valid nla argument for nla_get_u64()
nla_get_u64() was unlike all other nla_get_u*() implementations, in that it
would allow for a missing/invalid nla argument, and return 0.

Don't do this. For one, don't behave different than other getters.
Also, there really is no space to report errors. Hence, the caller must
make sure that the attribute is present and suitable -- like for other
nla_get_*() functions.

None of the callers relied on being able to pass NULL attribute.

Also, inline the function and use unaligned_read_ne64(). That is our
preferred way for reading unaligned data, not memcpy().
2019-02-22 09:58:09 +01:00
Thomas Haller
af13eb6cac platform/netlink: add assertions for nla_get_*() functions
These are only nm_assert(), meaning on non-DEBUG builds they
are not enabled.

Callers are supposed to first check that the netlink attribute
is suitable. Hence, we just assert.
2019-02-22 09:58:09 +01:00
Thomas Haller
5044c33ead platform/netlink: use designated initializer in nlmsg_alloc_size() 2019-02-22 09:58:09 +01:00
Thomas Haller
f7df8fda1a platform/netlink: assert for valid policy for string attribute in validate_nla
The policy for strings must indicate a minlen of at least 1.

Everything else is a bug, because the policy contains invalid
data -- and is determined at compile-time.
2019-02-22 09:58:09 +01:00
Thomas Haller
82e31b2816 platform/netlink: cleanup nla_memcpy()
- use size_t arguments for the memory sizes. While sizes from netlink
  API currently are int typed and inherrently limited, use the more
  appropriate data type.

- rename the arguments. The "count" is really the size of the
  destination buffer.

- return how many bytes we wanted to write (like g_strlcpy()).
  That makes more sense than how many bytes we actually wrote
  because previously, we could not detect truncation.
  Anyway, none of the callers cared about the return-value either
  way.
2019-02-22 09:58:09 +01:00
Thomas Haller
b080146cc6 platform/netlink: cleanup nla_strlcpy()
- let nla_strlcpy() return how many bytes we would like to have
  copied. That way, the caller could detect string truncation.
  In practice, no caller cared about that.

- the code before would also fill the entire buffer with zeros first,
  like strncpy(). We still do that. However, only copy the bytes up
  to the first NUL byte. The previous version would have copied
  "a\0b\0" (with srclen 4) as "a\0b". Strip all bytes after the
  first NUL character from src. That seems more correct here.

- accept nla argument as %NULL.
2019-02-22 09:58:09 +01:00
Thomas Haller
6c24846929 platform/trivial: coding style fixes/whitespace 2019-02-22 09:58:09 +01:00
Thomas Haller
6f8208c0d4 platform/netlink: cleanup nla_parse*() code by using safer macros
- drop explicit MAX sizes like

      static const struct nla_policy policy[IFLA_INET6_MAX+1] = {

  The compiler will deduce that.

  It saves redundant information (which is possibly wrong). Also,
  the max define might be larger than we actually need it, so we
  just waste a few bytes of static memory and do unnecesary steps
  during validation.

  Also, the compiler will catch bugs, if the array size of policy/tb
  is too short for what we access later (-Warray-bounds).

- avoid redundant size specifiers like:

      static const struct nla_policy policy[IFLA_INET6_MAX+1] = {
      ...
      struct nlattr *tb[IFLA_INET6_MAX+1];
      ...
      err = nla_parse_nested (tb, IFLA_INET6_MAX, attr, policy);

- use the nla_parse*_arr() macros that determine the maxtype
  based on the argument types.

- move declaration of "static const struct nla_policy policy" variable
  to the beginning, before auto variables.

- drop unneeded temporay error variables.
2019-02-22 09:58:09 +01:00
Thomas Haller
cf22d28c2e platform/netlink: add nla_parse* macros that safely determine the max-type
The common idiom is to stack allocate the tb array. Hence,
the maxtype is redundant. Add macros that autodetect the
maxtype based on the C type infomation.

Also, there is a static assertion that the size of the policy
(if provided) matches.
2019-02-22 09:58:09 +01:00
Thomas Haller
6245569c6d platform/netlink: cleanup unnecessary "goto out" from nla_parse() 2019-02-22 09:58:09 +01:00
Thomas Haller
d8727f6aa9 platform/netlink: fix return value of nla_get_s8() 2019-02-22 09:58:09 +01:00
Thomas Haller
7f1865cad9 platform/wifi: fix size check for parsing netlink attribute NL80211_BSS_BSSID 2019-02-22 09:58:09 +01:00
Thomas Haller
a4cff10ceb platform: fix error handling for creating nlmsg in do_request_all_no_delayed_actions()
In practice, we don't fail to create the nlmsg, because in glib
malloc() cannot fail and we always create large enough buffers.

Anyway, handle the error correctly, and reduce the in-progress
counter again.
2019-02-22 09:58:09 +01:00
Thomas Haller
106e4ebc13 platform/netlink: fix _genl_parse_getfamily() for checking error code from genlmsg_parse()
Errors are negative numbers.

This had no effect however, because currently genlmsg_parse() won't ever return
positive values.
2019-02-22 09:58:09 +01:00
Thomas Haller
b7d4ad8547 wifi-p2p: drop WiFi-P2P "group-owner" property from D-Bus API and libnm
It's not yet implemented server-side.

Until it is clear that we need this property and until it is implemented,
drop it again from public API.

See-also: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/80#note_118004
2019-02-21 15:34:55 +01:00
Jonathan Kang
243af16c5b Add polkit action for Wi-Fi scans
Previously, Wi-Fi scans uses polkit action
"org.freedesktop.NetworkManager.network-control". This is introduced
in commit 5e3e19d0. But in a system with restrict polkit rules, for
example "org.freedesktop.NetworkManager.network-control" was set as
auth_admin. When you open the network panel of GNOME Control Center, a
polkit dialog will keep showing up asking for admin password, as GNOME
Control Center scans the Wi-Fi list every 15 seconds.

Fix that by adding a new polkit action
"org.freedesktop.NetworkManager.wifi.scan" so that distributions can
add specific rule to allow Wi-Fi scans.

[thaller@redhat.com: fix macro in "shared/nm-common-macros.h"]

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/68
2019-02-21 13:49:17 +01:00
Thomas Haller
696cf38f45 supplicant: avoid G_VARIANT_BUILDER_INIT() from glib 2.50
G_VARIANT_BUILDER_INIT() was only added in glib 2.50, hence we cannot use
it.

Maybe nm-glib.h should provide a compat macro, but the macro relies
on the magic number GVSB_MAGIC_PARTIAL, which is private to glib.
It's not clear that we can savely provide such a compat implementation
for older glib variants.

Fixes: 642f15f2f6
2019-02-21 13:27:34 +01:00
Benjamin Berg
8fd5505ed5 device: Set WFD IEs when connecting to P2P device
Set the WFD IEs before trying to connect to a P2P device. Reset the
value when cancelling or when disconnecting.
2019-02-21 10:10:20 +01:00
Benjamin Berg
642f15f2f6 supplicant: Add API to set WFD IEs
This API allows setting the global WFDIEs property of wpa_supplicant.
Ideally it would be better if this property was per-device, but this is
a limitation of wpa_supplicant.
2019-02-21 10:10:20 +01:00
Benjamin Berg
3d12dbc0a7 Remove WFD IEs property from P2P device
While this can be considered a property of the P2P device, the API will
require setting it through the settings when activating a connection. As
such, having a (read only) property on the device is not very useful, so
remove it again.
2019-02-21 10:10:20 +01:00