1. 18 Feb, 2021 4 commits
  2. 17 Feb, 2021 5 commits
  3. 16 Feb, 2021 4 commits
  4. 15 Feb, 2021 11 commits
    • Thomas Haller's avatar
      platform: downgrade severity of message for failure to create NMPNetns · c7fa8d0a
      Thomas Haller authored
      Under restricted permissions (like inside a podman container) opening
      "/proc/self/ns/net" fails with Permission denied. Consequently we cannot
      create our bottom NMPNetns instance. That is mostly fine, however we
      would log an error message with severity <error>.
      
      Note that test "src/core/platform/tests/test-platform-general" asserts
      that no <warn> and <error> messages get logged. Hence, the test will
      fail.
      
      That is undesirable. Downgrade the message to <debug> so that the test
      passes. Also, it's not clear that this error message is useful here.
      Being unable to open a netns fd is fine and not necessarily an error
      condition.
      
      (cherry picked from commit 0213300d)
      c7fa8d0a
    • Thomas Haller's avatar
      platform: reorder code in _netns_stack_get_impl() · f6c07c39
      Thomas Haller authored
      We should always register the GArray stack with pthread
      for cleanup the thread local storage. Do that first, before
      creating the NMPNetns instance at the bottom of the stack.
      
      (cherry picked from commit f9636080)
      f6c07c39
    • Thomas Haller's avatar
      platform/tests: skip tests if "unshare(CLONE_NEWNET|CLONE_NEWNS)" fails · 4113e93b
      Thomas Haller authored
      Inside a podman container (without `--priviledged`) we don't have
      permissions for "unshare(CLONE_NEWNET|CLONE_NEWNS)".
      
      It's not useful to fail tests in environments where they cannot run.
      Skip them.
      
      (cherry picked from commit ecdbb1ab)
      4113e93b
    • Thomas Haller's avatar
      tests: add "/bin:/sbin" to "$PATH" for unit tests · 67b0deff
      Thomas Haller authored
      We call `tc` from iproute2, which commonly is at "/sbin/tc".
      That might not be in the "$PATH" of a regular user, and consequently
      we fail to run the test.
      
      Work around that by always adding "/bin" and "/sbin" to the $PATH.
      
      (cherry picked from commit f591aa41)
      67b0deff
    • Thomas Haller's avatar
      shared: refactor nm_assert() for NMRefString · a18155fc
      Thomas Haller authored
      - also check consistency of the string.
      
      - disable more expensive check unless running with NM_MORE_ASSERTS>10.
      
      (cherry picked from commit ac1c66eb)
      a18155fc
    • Thomas Haller's avatar
      libnm: add assertion in _dbus_handle_properties_changed() · 4a50d5a4
      Thomas Haller authored
      (cherry picked from commit 3ceec9c6)
      4a50d5a4
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      libnm: fix tracking object state in NMClient cache · 1db2314a
      Thomas Haller authored
      NMClient has a NMLDBusObject instance for each D-Bus object
      that it sees. This object can be in different states, like that we
      already saw it on D-Bus or that it is only referred to by another
      property. Due to a bug, we would wrongly not update the state and
      trigger an assertion.
      
      Reproduce with python-dbusmock (commit e89e28bf1bc0254a1eb71b71cf68ef7a97d11e5b)
      by running `pytest -v -s tests/test_networkmanager.py -k test_one_wifi_with_accesspoints`.
      With LIBNM_CLIENT_DEBUG we get:
      
      >>> libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: properties-changed: properties changed for interface org.freedesktop.NetworkManager.Device { {'ActiveConnection': <objectpath '/org/freedesktop/NetworkManager/ActiveConnection/0'>} }
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: properties-changed: set property org.freedesktop.NetworkManager.Device.ActiveConnection
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x01 linked
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x01 consumed
      >>> libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: set D-Bus object state watched-only
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x02 linked
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager]: changed-type 0x02 linked
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x02 consumed
      >>> libnm-dbus[96085]: <error> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: property ActiveConnection references /org/freedesktop/NetworkManager/ActiveConnection/0 but object is not present on D-Bus
          libnm-dbus[96085]: <trace> [6464.06459] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager]: changed-type 0x02 consumed
          libnm-dbus[96085]: <trace> [6464.06460] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: properties-changed: properties changed for interface org.freedesktop.NetworkManager.Device { {'State': <uint32 100>} }
          libnm-dbus[96085]: <trace> [6464.06460] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: properties-changed: set property org.freedesktop.NetworkManager.Device.State
          libnm-dbus[96085]: <trace> [6464.06460] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x01 linked
          libnm-dbus[96085]: <trace> [6464.06460] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x01 consumed
          libnm-dbus[96085]: <trace> [6464.06460] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x02 linked
          libnm-dbus[96085]: <trace> [6464.06460] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager]: changed-type 0x02 linked
          libnm-dbus[96085]: <trace> [6464.06461] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x02 consumed
          libnm-dbus[96085]: <trace> [6464.06461] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager]: changed-type 0x02 consumed
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: properties-changed: properties changed for interface org.freedesktop.NetworkManager.Device { {'StateReason': <(uint32 100, uint32 0)>} }
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: properties-changed: set property org.freedesktop.NetworkManager.Device.StateReason
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x01 linked
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x01 consumed
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x02 linked
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager]: changed-type 0x02 linked
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/Devices/mock_WiFi2]: changed-type 0x02 consumed
          libnm-dbus[96085]: <trace> [6464.06462] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager]: changed-type 0x02 consumed
      >>> libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: properties changed for interface org.freedesktop.NetworkManager.Connection.Active { {'Devices': <[objectpath '/org/freedesktop/NetworkManager/Devices/mock_WiFi2']>, 'Default6': <false>, 'Default': <true>, 'Type': <'802-11-wireless'>, 'Vpn': <false>, 'Connection': <objectpath '/org/freedesktop/NetworkManager/Settings/Mock_AP3'>, 'Master': <objectpath '/'>, 'SpecificObject': <objectpath '/org/freedesktop/NetworkManager/AccessPoint/Mock_AP3'>, 'Uuid': <'72757a57-8cb6-4052-a18f-4e2be4ba27d9'>, 'State': <uint32 2>, 'Id': <'AP_3'>} }
      >>> here we lack "set D-Bus object state on-dbus"
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Devices
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Default6
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Default
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Type
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Vpn
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Connection
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Master
          libnm-dbus[96085]: <trace> [6464.06465] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.SpecificObject
          libnm-dbus[96085]: <trace> [6464.06466] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Uuid
          libnm-dbus[96085]: <trace> [6464.06466] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.State
          libnm-dbus[96085]: <trace> [6464.06466] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: interfaces-added: set property org.freedesktop.NetworkManager.Connection.Active.Id
          libnm-dbus[96085]: <trace> [6464.06466] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: changed-type 0x01 linked
          libnm-dbus[96085]: <trace> [6464.06466] nmclient[c9bf1eaa1f4b6c99]: [/org/freedesktop/NetworkManager/ActiveConnection/0]: changed-type 0x01 consumed
          Bail out! libnm:ERROR:libnm/nm-client.c:2863:_dbus_handle_obj_changed_dbus: assertion failed: (dbobj->obj_state >= NML_DBUS_OBJ_STATE_ON_DBUS)
      
      Backtrace:
      
        #3  0x00007f0bd11173bf in g_assertion_message_expr
            (domain=domain@entry=0x7f0bd1576018 "libnm", file=file@entry=0x7f0bd1576006 "libnm/nm-client.c", line=line@entry=2863, func=func@entry=0x7f0bd157f1b0 <__func__.170> "_dbus_handle_obj_changed_dbus", expr=expr@entry=0x7f0bd157cba0 "dbobj->obj_state >= NML_DBUS_OBJ_STATE_ON_DBUS") at ../glib/gtestutils.c:2963
        #4  0x00007f0bd14959dd in _dbus_handle_obj_changed_dbus (self=self@entry=0x5612d4f5a130, log_context=<optimized out>) at libnm/nm-client.c:2863
        #5  0x00007f0bd1495c29 in _dbus_handle_changes (self=self@entry=0x5612d4f5a130, log_context=<optimized out>, allow_init_start_check_complete=allow_init_start_check_complete@entry=1)
            at libnm/nm-client.c:2909
        #6  0x00007f0bd1497e56 in _dbus_managed_objects_changed_cb
            (connection=<optimized out>, sender_name=<optimized out>, arg_object_path=<optimized out>, interface_name=<optimized out>, signal_name=<optimized out>, parameters=0x7f0bb800d720, user_data=0x5612d4f5a130) at libnm/nm-client.c:3172
        #7  0x00007f0bd132a8df in emit_signal_instance_in_idle_cb (data=data@entry=0x7f0bb8003700) at ../gio/gdbusconnection.c:3789
        #8  0x00007f0bd10f1b5b in g_idle_dispatch (source=source@entry=0x7f0bb8012260, callback=0x7f0bd132a860 <emit_signal_instance_in_idle_cb>, user_data=0x7f0bb8003700) at ../glib/gmain.c:5836
        #9  0x00007f0bd10f2a9f in g_main_dispatch (context=0x5612d4f4b630) at ../glib/gmain.c:3325
        #10 g_main_context_dispatch (context=0x5612d4f4b630) at ../glib/gmain.c:4043
        #11 0x00007f0bd1144a98 in g_main_context_iterate.constprop.0 (context=0x5612d4f4b630, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4119
        #12 0x00007f0bd10f2163 in g_main_loop_run (loop=0x5612d4f4b720) at ../glib/gmain.c:4317
        #13 0x00005612d44b6543 in main (argc=7, argv=0x7fff4414f1d8) at clients/cli/nmcli.c:1036
      
      https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=982613
      #662
      
      Fixes: ce0e898f ('libnm: refactor caching of D-Bus objects in NMClient')
      (cherry picked from commit e1e9abdf)
      1db2314a
    • Thomas Haller's avatar
    • Thomas Haller's avatar
      libnm: log PID in LIBNM_CLIENT_DEBUG debug logging · 98b55a63
      Thomas Haller authored
      (cherry picked from commit 6da5fc59)
      98b55a63
    • Andrew Zaborowski's avatar
      iwd: Fix the leaks in get_agent_request_network_path · 210d2696
      Andrew Zaborowski authored
      Don't request new copies of strings from g_variant_get() to avoid
      leaking memory as pointed out by Thomas Haller.
      
      Fixes: dc0e31fb ('iwd: Add the wifi.iwd.autoconnect setting')
      (cherry picked from commit 5ccb8ce1)
      210d2696
  5. 12 Feb, 2021 1 commit
    • Thomas Haller's avatar
      build: make path to polkit-agent-helper-1 binary configurable · 8f2ca652
      Thomas Haller authored
      Add new configure option to set the path to "polkit-agent-helper-1".
      
      The path cannot be obtained from pkg-config and `pkg-config
      --variable=prefix polkit-agent-1` is not good enough.
      
      On Fedora, the path is "/usr/lib/polkit-1/polkit-agent-helper-1".
      On Debian Buster, the path is "/usr/lib/policykit-1/polkit-agent-helper-1"
      On Debian Sid, the path is "/usr/libexec/polkit-agent-helper-1" (but
      currently it is also symlinked from "/usr/lib/policykit-1/polkit-agent-helper-1".
      
      (cherry picked from commit 801c41a1)
      8f2ca652
  6. 11 Feb, 2021 15 commits
    • Thomas Haller's avatar
      4e11b182
    • Andrew Zaborowski's avatar
      iwd: Fix agent DBus method parameter types · 190ed7b2
      Andrew Zaborowski authored
      The object path DBus type wasn't being used correctly in the parameters
      signatures, fix them.
      190ed7b2
    • Andrew Zaborowski's avatar
    • Thomas Haller's avatar
      lldp/tests: try workaround failure with ioctl(TUNSETIFF) · 5ca018c0
      Thomas Haller authored
      On copr build, it seems possible that the ioctl fails with
      
        ERROR: src/core/devices/tests/test-lldp - Bail out! NetworkManager:ERROR:src/core/devices/tests/test-lldp.c:823:_test_recv_fixture_setup: assertion failed (errno == 0): (1 == 0)
      
      (1 is EPERM). Unclear why this happens. But as it only affects the
      test setup, retry a few times.
      5ca018c0
    • Thomas Haller's avatar
      a21fdd42
    • Thomas Haller's avatar
      dhcp: downgrade logging messages for DHCP to <debug> · 4b874019
      Thomas Haller authored
      Granted, for debugging this information is useful. However, to actually
      debug an issue thoroughly, level=TRACE is anyway required. There is simply
      no way how we can log useful debug information and not flood logging
      messages for regular use.
      
      For example, logging the DHCP lease options can easily print 30 lines.
      And this, every time you get a lease update (e.g. every 30 minutes) and
      for every interface that does DHCP.
      
      It's simply too verbose. Downgrade the logging level.
      
      Yes, now our default <info> level is even less useful to understand what
      is going on. But the majority of time, users don't care so not spamming
      the log is more important.
      
      However, we still log the DHCP event (and the IP address) with <info>
      level.
      4b874019
    • Thomas Haller's avatar
      dhcp: binary search in nm_dhcp_option_find() · 24abf132
      Thomas Haller authored
      Let's use binary search.
      
      Test patch:
      
          diff --git a/src/core/dhcp/tests/test-dhcp-utils.c b/src/core/dhcp/tests/test-dhcp-utils.c
          index 9b54e2cd0228..007993341672 100644
          --- a/src/core/dhcp/tests/test-dhcp-utils.c
          +++ b/src/core/dhcp/tests/test-dhcp-utils.c
          @@ -788,6 +788,24 @@ NMTST_DEFINE();
           int
           main(int argc, char **argv)
           {
          +    int i;
          +    guint idx;
          +    guint c;
          +
          +    idx = 0;
          +    c = 0;
          +    for (i = 0; i < 1000000; i++) {
          +        const guint option = _nm_dhcp_option_dhcp4_options[idx % G_N_ELEMENTS(_nm_dhcp_option_dhcp4_options)].option_num;
          +
          +        idx += 2010055757;
          +
          +        if (nm_dhcp_option_find(AF_INET, option)->name)
          +            c++;
          +    }
          +    g_print(">%u\n", c);
          +
          +    return 0;
          +
               nmtst_init_assert_logging(&argc, &argv, "WARN", "DEFAULT");
      
               g_test_add_func("/dhcp/generic-options", test_generic_options);
      
      Build:
      
        CFLAGS='-O2' ./autogen.sh --with-more-asserts=0
        make -j 10 src/core/dhcp/tests/test-dhcp-utils && \
          src/core/dhcp/tests/test-dhcp-utils && \
          perf stat -r 200 -B src/core/dhcp/tests/test-dhcp-utils
      
      Before:
      
       Performance counter stats for 'src/core/dhcp/tests/test-dhcp-utils' (200 runs):
      
                   82.83 msec task-clock:u              #    0.994 CPUs utilized            ( +-  0.21% )
                       0      context-switches:u        #    0.000 K/sec
                       0      cpu-migrations:u          #    0.000 K/sec
                     579      page-faults:u             #    0.007 M/sec                    ( +-  0.03% )
             264,676,245      cycles:u                  #    3.195 GHz                      ( +-  0.06% )
             544,792,266      instructions:u            #    2.06  insn per cycle           ( +-  0.00% )
             151,624,848      branches:u                # 1830.472 M/sec                    ( +-  0.00% )
               1,083,780      branch-misses:u           #    0.71% of all branches          ( +-  0.01% )
      
                0.083328 +- 0.000178 seconds time elapsed  ( +-  0.21% )
      
      After:
      
       Performance counter stats for 'src/core/dhcp/tests/test-dhcp-utils' (200 runs):
      
                   39.21 msec task-clock:u              #    0.987 CPUs utilized            ( +-  0.57% )
                       0      context-switches:u        #    0.000 K/sec
                       0      cpu-migrations:u          #    0.000 K/sec
                     579      page-faults:u             #    0.015 M/sec                    ( +-  0.03% )
             115,396,123      cycles:u                  #    2.943 GHz                      ( +-  0.23% )
             137,664,630      instructions:u            #    1.19  insn per cycle           ( +-  0.00% )
              25,866,025      branches:u                #  659.597 M/sec                    ( +-  0.00% )
               1,919,616      branch-misses:u           #    7.42% of all branches          ( +-  0.12% )
      
                0.039717 +- 0.000227 seconds time elapsed  ( +-  0.57% )
      24abf132
    • Thomas Haller's avatar
      dhcp: rework DHCP options to not carry around option array · 1cbe926c
      Thomas Haller authored
      Previously, we would pass around the list of options. However,
      
      - that isn't too nice to read. Also, usually when we want to treat
        IP address families generically, then we have an addr_family argument.
        Having to first resolve the addr_family to another set of variables
        is inconvenient.
      
      - the option array itself doesn't have enough information. For example,
        we don't know how many elements there are, we don't know which address
        family it is (unless we compare it to one of the two well known
        lists).
        For example, I'd like to do a binary search for the option. But that's
        not immediately possible, because the length is unknown.
      
      - in practice, there are only two address families: AF_INET and
        AF_INET6. It is extremely unlikely that we will require a third
        DHCP options list, and even if we had that, the addr_family argument
        still abstracts them nicely.
        We also don't need two different lists for one DHCP type. While that
        would currently be possible (and afterwards not anymore), it would
        be wrong to do.
      
      - also add a new accessor nm_dhcp_option_find() to find the NMDhcpOption
        instance by option number.
      1cbe926c
    • Thomas Haller's avatar
      dhcp/nettools: accept any number of trailing NULs in string options · 53f137af
      Thomas Haller authored
      https://tools.ietf.org/html/rfc2132#section-2 says:
      
         Options containing NVT ASCII data SHOULD NOT include a trailing NULL;
         however, the receiver of such options MUST be prepared to delete trailing
         nulls if they exist.
      
      It speaks in plurals.
      53f137af
    • Thomas Haller's avatar
      3b8882b9
    • Thomas Haller's avatar
      4707cf5f
    • Thomas Haller's avatar
      dhcp/nettools: make data pointer const · 8366fd87
      Thomas Haller authored
      8366fd87
    • Thomas Haller's avatar
    • Thomas Haller's avatar
    • Thomas Haller's avatar