1. 18 Dec, 2017 8 commits
  2. 16 Dec, 2017 2 commits
    • Inigo Martínez's avatar
      build: Merge no introspection headers with public headers · e2562d2b
      Inigo Martínez authored
      There are three headers `nm-secret-agent-old.h`,
      `nm-vpn-plugin-old.h`, and `nm-vpn-service-plugin.h`, which are
      named as no introspection headers. However, these files also
      join to the rest headers to generate introspection data.
      
      This patch merges those no introspection headers with the public
      headers.
      e2562d2b
    • Inigo Martínez's avatar
      build: Make generate-plugin-docs.pl independent of autotools · 28914f6a
      Inigo Martínez authored
      `generate-plugin-docs.pl` script which is used to parse
      `nm-setting-c*.c` files depends on autotools. This is because it
      parses the `Makefile.am` in order to figure out the setting files
      it needs to parse.
      
      This patch makes the script independent of autotools by passing
      the necessary setting files by command line instead of parsing the
      `Makefile.am` file. It also changes the autotools' and meson's
      accordingly.
      28914f6a
  3. 15 Dec, 2017 19 commits
    • Thomas Haller's avatar
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      build: add "-Wvla" to warn about uses of variable-length arrays · 9c3402aa
      Thomas Haller authored
      We don't use them, so add a compiler warning about their use.
      I think they are annoying, because sizeof(x) and typeof(x) might
      evaluate at runtime. Especially the typeof() extension is useful
      for macros, but behaves badly with variable-length arrays due to
      running code at runtime.
      
      But the worst is, G_STATIC_ASSERT() is implemented by declaring
      an array of negative length. Usually, the checked condition should
      be a compile time constant, but with VLAs the compiler would not evaluate
      the static-assert at compile time and instead accept it silently. It's easy
      to mess up static asserts to wrongly have a non-constant condition,
      especially when the static-assert is used inside a macro.
      
      Just say no.
      9c3402aa
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      tests: fix invalid static-asserts with non-const expression · 08d41ada
      Thomas Haller authored
      The expression is not const. Use a run-time assert instead
      08d41ada
    • Thomas Haller's avatar
      core: don't use variable length arrays · ea1f77f9
      Thomas Haller authored
      Let's compile with -Wvla, so that G_STATIC_ASSERT() is really
      static. But then we cannot use variable length arrays.
      ea1f77f9
    • Thomas Haller's avatar
      all: don't use NM_FLAGS_HAS() with non-constant argument · c696a226
      Thomas Haller authored
      NM_FLAGS_HAS() uses a static-assert that the second argument is a
      single flag (power of two). With a single flag, NM_FLAGS_HAS(),
      NM_FLAGS_ANY() and NM_FLAGS_ALL() are all identical.
      
      The second argument must be a compile time constant, and if that is
      not the case, one must not use NM_FLAGS_HAS().
      
      Use NM_FLAGS_ANY() in these cases.
      c696a226
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      device: generate unique default route-metrics per interface · 6a32c64d
      Thomas Haller authored
      In the past we had NMDefaultRouteManager which would coordinate adding
      the default-route with identical metrics. That especially happened, when
      activating two devices of the same type, without explicitly specifying
      ipv4.route-metric. For example, with ethernet devices, the routes on
      both interfaces would get a metric of 100.
      
      Coordinating routes was especially necessary, because we added
      routes with NLM_F_EXCL flag, akin to `ip route replace`. We not
      only had to avoid that activating two devices in NetworkManager would
      result in a fight over the default-route, but more importently
      to preserve externally added default-routes on unmanaged interfaces.
      
      NMDefaultRouteManager would ensure that in case of duplicate
      metrics, that the device that activated first would keep the
      best default-route. It would do so by bumping the metric
      of the second device to find a unused metric. The bumping itself
      was not very important -- MDefaultRouteManager could also just not
      configure any default-routes that show up as second, the result
      would be quite similar. More important was to keep the best
      default-route on the first activating device until the device
      deactivates or a device activates that really has a better
      default-route..
      
      Likewise, NMRouteManager would globally manage non-default-routes.
      It would not do any bumping of metrics, but it would also ensure that the routes
      of the device that activates first are not overwritten by a device activating
      later.
      
      However, the `ip route replace` approach has downsides, especially
      that it messes with routes on other interfaces, interfaces that are
      possibly not managed by NetworkManager. Another downside is, that
      binding a socket to an interface might not result in correct
      routes, because the route might just not be there (in case of
      NMRouteManager, which wouldn't configure duplicate routes by bumping
      their metric).
      
      Since commit 77ec3027 we would no longer
      use NLM_F_EXCL, but add routes akin to `ip route append`. When
      activating for example two ethernet devices with no explict route
      metric configuration, there are two routes like
      
         default via 10.16.122.254 dev eth0 proto dhcp metric 100
         default via 192.168.100.1 dev eth1 proto dhcp metric 100
      
      This does not only affect default routes. In case of a multi-homing
      setup you'd get
      
        192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.1 metric 100
        192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.1 metric 100
      
      but it's visible the most for default-routes.
      
      Note that we would append the routes that are activated later, as the order
      of `ip route show` confirms. One might hence expect, that kernel selects
      a route based on the order in the routing tables. However, that isn't
      the case, and activating the second interface will non-deterministically
      re-route traffic via the new interface. That will interfere badly with
      with NAT, stateful firewalls, and existing connections (like TCP).
      
      The solution is to have NMManager keep a global index of the default route-metrics
      currently in use. So, instead of determining the default-route metric based solely
      on the device-type, we now in addition generate default metrics that do not
      overlap. For example, if you activate eth0 first, it gets route-metric 100,
      and if you then activate eth1, it gets 101. Note that if you deactivate
      and re-activate eth0, then it will get route-metric 102, because the
      best route should stick on eth1 (which reserves the range 100 to 101).
      
      Note that when a connection explititly selects a particular metric, then that
      choice is honored (contrary to NMDefaultRouteManager which was more concerned
      with avoiding conflicts, then keeping the exact metric).
      
      https://bugzilla.redhat.com/show_bug.cgi?id=1505893
      6a32c64d
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      core: cache device state in NMConfig and load all at once · ea08df92
      Thomas Haller authored
      NMManager will need to know the state of all device at once.
      Hence, load it once and cache it in NMConfig.
      
      Note that this wastes a bit of memory in the order of
      O(number-of-interfaces). But each device state entry is
      rather small, and we always consume memory in the order
      of O(number-of-interfaces).
      ea08df92
    • Thomas Haller's avatar
      3f38b765
    • Thomas Haller's avatar
      989b5fab
    • Thomas Haller's avatar
      utils: extend binary-search to return the first/last index · d83eee5d
      Thomas Haller authored
      binary-search can find an index of a matching entry in a sorted
      list. However, if the list contains multiple entries that compare
      equal, it can be interesting to find the first/last entry. For example,
      if you want to append new items after the last.
      
      Extend binary search to optionally continue the binary search
      to determine the range that compares equal.
      d83eee5d
    • Beniamino Galvani's avatar
      cli: fix editor crash · 54c0572d
      Beniamino Galvani authored
      Ensure @cmd_arg0 is not freed when returning it.
      
      Fixes: 88699435
      54c0572d
    • Beniamino Galvani's avatar
      platform: fix ipv6 address synchronization · ffc04e17
      Beniamino Galvani authored
      The @keep_link_local logic was wrong: when set to TRUE we must not
      delete addresses and when set to FALSE we must delete addresses only
      if they are unknown.
      
      Also, ignore link-local addresses when comparing positions.
      
      Fixes: 19d6d54b
      ffc04e17
    • Thomas Haller's avatar
      58c07d33
    • Thomas Haller's avatar
      src/tests: fix test_nm_utils_kill_child() under meson · bb7fcdf2
      Thomas Haller authored
      meson spawns the tests in a way that the test process is
      a session leader. Since the test wants to create a new
      process group to kill a group of processes that it starts,
      it failed.
      
        $ meson test -C build test-general-with-expect
      
      The test would have succeed when wrapping the test for example
      by strace:
      
        $ meson test -C build --wrap='strace' test-general-with-expect
      
      Fix that, by forking once more.
      bb7fcdf2
    • Thomas Haller's avatar
      src/tests: split test code in test_nm_utils_kill_child() · c04f4feb
      Thomas Haller authored
      Move the actual tests to a separate function. The remaingin parts currently
      setup and kill a process group, but that needs adjustment.
      c04f4feb
  4. 14 Dec, 2017 8 commits
    • Inigo Martínez's avatar
      build: rename unit tests with the `test-` pattern · d8493662
      Inigo Martínez authored
      There are some tests located in different directories which are
      using the same name. To avoid any confussion a prefix was used to
      name the test and the target.
      
      This patch uses the prefix just for the target, to avoid any
      collision that may happen, and uses the `test-` pattern as the
      name.
      
      https://mail.gnome.org/archives/networkmanager-list/2017-December/msg00051.html
      d8493662
    • Inigo Martínez's avatar
      build: fix test-ndisc-linux test · 8e009baa
      Inigo Martínez authored
      The `test-ndisc-linux` test is being run as an unit test. However,
      it is not meant to be run as one of them.
      
      This patch simply builts it as not installable binary.
      
      https://mail.gnome.org/archives/networkmanager-list/2017-December/msg00050.html
      8e009baa
    • Inigo Martínez's avatar
      build: fix libnm_linking test · a09f3aaa
      Inigo Martínez authored
      The `libnm_linking` test that belongs to the libnm-util's general
      tests is failing because the test is not able to find the
      `test-libnm-linking` binary, which is executed as a child process.
      
      The problem lies to the `BUILD_DIR` macro definition which is
      used to set the place to find the binary, and is wrongly defined
      with the source directory.
      
      This patch changes its value to the build directory that fixes
      the problem.
      
      https://mail.gnome.org/archives/networkmanager-list/2017-December/msg00049.html
      a09f3aaa
    • Inigo Martínez's avatar
      build: fix targets generated by generate-settings-docs.py · 48d4cda9
      Inigo Martínez authored
      generate-settings-docs.py script is used to generate the
      `nm-settings-docs.xml` and `nm-property-docs.xml` files. However,
      to generate these files properly, the path where `libnm` shared
      library is built must be passed to the script.
      
      This patch uses the recently added `--lib-path` parameter to
      pass the `libnm`'s built directory, which allows the proper
      generation of the files in meson.
      
      https://mail.gnome.org/archives/networkmanager-list/2017-December/msg00045.html
      48d4cda9
    • Inigo Martínez's avatar
      build: library paths as parameters for generate-settings-docs.py · 9fc990e8
      Inigo Martínez authored
      generate-settings-docs.py script uses the `LD_LIBRARY_PATH` to
      prepend directories to the library search path, which is useful to
      load a just built libnm shared library, when generating the
      `nm-settings-docs.xml` and `nm-property-docs.xml` files.
      
      However, this is a problem for meson, which is not able to set
      environment variables when executing the script.
      
      This patch adds a new optional parameter, `-l` or `--lib-path` that
      can be used to pass different paths to be prepended without using
      the `LD_LIBRARY_PATH` environment, which can still be used.
      
      [thaller@redhat.com: fix script to handle None lib_path argument]
      
      https://mail.gnome.org/archives/networkmanager-list/2017-December/msg00044.html
      9fc990e8
    • Thomas Haller's avatar
      systemd: merge branch systemd into master · 7d074fa6
      Thomas Haller authored
      Reimport systemd because it uses STRLEN() macro.
      We need to when building with -Wvla warning enabled.
      
      Related: https://github.com/systemd/systemd/pull/7625
      7d074fa6
    • Francesco Giudici's avatar
      devices/test: reapply commit 5c6a382d · d82c7eb5
      Francesco Giudici authored
      The commit was accidentally reverted during systemd code merge from
      upstream.
      
      devices/test: give more time to dad checking in test-arping
      
        # random seed: R02Sc708af827453d4ace33cd27ffd3d7f0b
        1..2
        # Start of arping tests
        **
        NetworkManager:ERROR:src/devices/tests/test-arping.c:95:test_arping_common: assertion failed (nm_arping_manager_check_address (manager, info->addresses[i]) == info->expected_result[i]): (1 == 0)
        ok 1 /arping/1
        PASS: src/devices/tests/test-arping 1 /arping/1
        ./tools/run-nm-test.sh: line 193:  2836 Aborted                 "${NMTST_DBUS_RUN_SESSION[@]}" "$TEST" "$@"
        # NetworkManager:ERROR:src/devices/tests/test-arping.c:95:test_arping_common: assertion failed (nm_arping_manager_check_address (manager, info->addresses[i]) == info->expected_result[i]): (1 == 0)
        ERROR: src/devices/tests/test-arping - too few tests run (expected 2, got 1)
        ERROR: src/devices/tests/test-arping - exited with status 134 (terminated by signal 6?)
      
      Fixes: 8c0dfd71
      d82c7eb5
    • Thomas Haller's avatar
      systemd: update code from upstream (2017-12-14) · 60afcc36
      Thomas Haller authored
      This is a direct dump from systemd git on 2017-12-14, git commit
      a327431bd168b2f327f3cd422379e213c643f2a5.
      
      ======
      
      SYSTEMD_DIR=../systemd
      COMMIT=a327431bd168b2f327f3cd422379e213c643f2a5
      
      (
        cd "$SYSTEMD_DIR"
        git checkout "$COMMIT"
        git reset --hard
        git clean -fdx
      )
      
      git ls-files :/src/systemd/src/ \
                   :/shared/nm-utils/siphash24.c \
                   :/shared/nm-utils/siphash24.h \
                   :/shared/nm-utils/unaligned.h | \
        xargs -d '\n' rm -f
      
      nm_copy_sd() {
          mkdir -p "./src/systemd/$(dirname "$1")"
          cp "$SYSTEMD_DIR/$1" "./src/systemd/$1"
      }
      
      nm_copy_sd_shared() {
          mkdir -p "./shared/nm-utils/"
          cp "$SYSTEMD_DIR/$1" "./shared/nm-utils/${1##*/}"
      }
      
      nm_copy_sd "src/basic/alloc-util.c"
      nm_copy_sd "src/basic/alloc-util.h"
      nm_copy_sd "src/basic/async.h"
      nm_copy_sd "src/basic/escape.c"
      nm_copy_sd "src/basic/escape.h"
      nm_copy_sd "src/basic/ether-addr-util.c"
      nm_copy_sd "src/basic/ether-addr-util.h"
      nm_copy_sd "src/basic/extract-word.c"
      nm_copy_sd "src/basic/extract-word.h"
      nm_copy_sd "src/basic/fileio.c"
      nm_copy_sd "src/basic/fileio.h"
      nm_copy_sd "src/basic/fd-util.c"
      nm_copy_sd "src/basic/fd-util.h"
      nm_copy_sd "src/basic/fs-util.c"
      nm_copy_sd "src/basic/fs-util.h"
      nm_copy_sd "src/basic/hash-funcs.c"
      nm_copy_sd "src/basic/hash-funcs.h"
      nm_copy_sd "src/basic/hashmap.c"
      nm_copy_sd "src/basic/hashmap.h"
      nm_copy_sd "src/basic/hexdecoct.c"
      nm_copy_sd "src/basic/hexdecoct.h"
      nm_copy_sd "src/basic/hostname-util.c"
      nm_copy_sd "src/basic/hostname-util.h"
      nm_copy_sd "src/basic/in-addr-util.c"
      nm_copy_sd "src/basic/in-addr-util.h"
      nm_copy_sd "src/basic/io-util.c"
      nm_copy_sd "src/basic/io-util.h"
      nm_copy_sd "src/basic/list.h"
      nm_copy_sd "src/basic/log.h"
      nm_copy_sd "src/basic/macro.h"
      nm_copy_sd "src/basic/mempool.h"
      nm_copy_sd "src/basic/mempool.c"
      nm_copy_sd "src/basic/parse-util.c"
      nm_copy_sd "src/basic/parse-util.h"
      nm_copy_sd "src/basic/path-util.c"
      nm_copy_sd "src/basic/path-util.h"
      nm_copy_sd "src/basic/prioq.h"
      nm_copy_sd "src/basic/prioq.c"
      nm_copy_sd "src/basic/process-util.h"
      nm_copy_sd "src/basic/process-util.c"
      nm_copy_sd "src/basic/random-util.c"
      nm_copy_sd "src/basic/random-util.h"
      nm_copy_sd "src/basic/refcnt.h"
      nm_copy_sd "src/basic/set.h"
      nm_copy_sd "src/basic/signal-util.h"
      nm_copy_sd_shared "src/basic/siphash24.c"
      nm_copy_sd_shared "src/basic/siphash24.h"
      nm_copy_sd "src/basic/socket-util.c"
      nm_copy_sd "src/basic/socket-util.h"
      nm_copy_sd "src/basic/sparse-endian.h"
      nm_copy_sd "src/basic/stdio-util.h"
      nm_copy_sd "src/basic/string-table.c"
      nm_copy_sd "src/basic/string-table.h"
      nm_copy_sd "src/basic/string-util.c"
      nm_copy_sd "src/basic/string-util.h"
      nm_copy_sd "src/basic/strv.c"
      nm_copy_sd "src/basic/strv.h"
      nm_copy_sd "src/basic/time-util.c"
      nm_copy_sd "src/basic/time-util.h"
      nm_copy_sd "src/basic/umask-util.h"
      nm_copy_sd_shared "src/basic/unaligned.h"
      nm_copy_sd "src/basic/utf8.c"
      nm_copy_sd "src/basic/utf8.h"
      nm_copy_sd "src/basic/util.c"
      nm_copy_sd "src/basic/util.h"
      nm_copy_sd "src/libsystemd-network/arp-util.c"
      nm_copy_sd "src/libsystemd-network/arp-util.h"
      nm_copy_sd "src/libsystemd-network/dhcp6-internal.h"
      nm_copy_sd "src/libsystemd-network/dhcp6-lease-internal.h"
      nm_copy_sd "src/libsystemd-network/dhcp6-network.c"
      nm_copy_sd "src/libsystemd-network/dhcp6-option.c"
      nm_copy_sd "src/libsystemd-network/dhcp6-protocol.h"
      nm_copy_sd "src/libsystemd-network/dhcp-identifier.c"
      nm_copy_sd "src/libsystemd-network/dhcp-identifier.h"
      nm_copy_sd "src/libsystemd-network/dhcp-internal.h"
      nm_copy_sd "src/libsystemd-network/dhcp-lease-internal.h"
      nm_copy_sd "src/libsystemd-network/dhcp-network.c"
      nm_copy_sd "src/libsystemd-network/dhcp-option.c"
      nm_copy_sd "src/libsystemd-network/dhcp-packet.c"
      nm_copy_sd "src/libsystemd-network/dhcp-protocol.h"
      nm_copy_sd "src/libsystemd-network/lldp-internal.h"
      nm_copy_sd "src/libsystemd-network/lldp-neighbor.c"
      nm_copy_sd "src/libsystemd-network/lldp-neighbor.h"
      nm_copy_sd "src/libsystemd-network/lldp-network.c"
      nm_copy_sd "src/libsystemd-network/lldp-network.h"
      nm_copy_sd "src/libsystemd-network/network-internal.c"
      nm_copy_sd "src/libsystemd-network/network-internal.h"
      nm_copy_sd "src/libsystemd-network/sd-dhcp6-client.c"
      nm_copy_sd "src/libsystemd-network/sd-dhcp6-lease.c"
      nm_copy_sd "src/libsystemd-network/sd-dhcp-client.c"
      nm_copy_sd "src/libsystemd-network/sd-dhcp-lease.c"
      nm_copy_sd "src/libsystemd-network/sd-ipv4ll.c"
      nm_copy_sd "src/libsystemd-network/sd-ipv4acd.c"
      nm_copy_sd "src/libsystemd-network/sd-lldp.c"
      nm_copy_sd "src/libsystemd/sd-event/sd-event.c"
      nm_copy_sd "src/libsystemd/sd-id128/id128-util.c"
      nm_copy_sd "src/libsystemd/sd-id128/id128-util.h"
      nm_copy_sd "src/libsystemd/sd-id128/sd-id128.c"
      nm_copy_sd "src/shared/dns-domain.c"
      nm_copy_sd "src/shared/dns-domain.h"
      nm_copy_sd "src/systemd/_sd-common.h"
      nm_copy_sd "src/systemd/sd-dhcp6-client.h"
      nm_copy_sd "src/systemd/sd-dhcp6-lease.h"
      nm_copy_sd "src/systemd/sd-dhcp-client.h"
      nm_copy_sd "src/systemd/sd-dhcp-lease.h"
      nm_copy_sd "src/systemd/sd-event.h"
      nm_copy_sd "src/systemd/sd-ndisc.h"
      nm_copy_sd "src/systemd/sd-id128.h"
      nm_copy_sd "src/systemd/sd-ipv4acd.h"
      nm_copy_sd "src/systemd/sd-ipv4ll.h"
      nm_copy_sd "src/systemd/sd-lldp.h"
      60afcc36
  5. 13 Dec, 2017 3 commits