summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* dhcp/internal: handle localhost and 0.0.0.0 DNS/NTP servers speciallyth/dhcp-internal-mulitple-routersThomas Haller2019-02-191-7/+9
| | | | | | | | | | | | | | | | | - regarding the DHCP options, we should not suppress them. If the lease contains such bogus(?) addresses, we still want to expose them on D-Bus without modification. - regrading using the DNS server, ignore localhost addresses like done for systemd-networkd ([1], [2]). Until recently, the DHCP library would internally suppress such addresses ([3]). That is no longer the case, and we should handle them specially. [1] Systemd-pull-requst #4524 [2] https://github.com/systemd/systemd/commit/d9ec2e632df4905201facf76d6a205edc952116a [3] Systemd-pull-request #11208
* dhcp/internal: handle multiple Router options in internal DHCP clintThomas Haller2019-02-191-16/+35
|
* systemd: network: avoid inet_ntoa() in favor of inet_ntop()Thomas Haller2019-02-192-8/+12
| | | | | | | | | | | Imported from systemd: inet_ntop() is not documented to be thread-safe, so it should not be used in the DHCP library. Arguably, glibc uses a thread local buffer, so indeed there is no problem with a suitable libc. Anyway, just avoid it. https://github.com/systemd/systemd/commit/189255d2b546bc10c280a1d7bd7def702bca1769
* systemd: dhcp: move filtering of bogus DNS/NTP addresses out of DHCP clientThomas Haller2019-02-195-34/+43
| | | | | | | | | | | | | | | | | | Imported from systemd: The DHCP client should not pre-filter addresses beyond what RFC requires. If a client's user (like networkd) wishes to skip/filter certain addresses, it's their responsibility. The point of this is that the DHCP library does not hide/abstract information that might be relevant for certain users. For example, NetworkManager exposes DHCP options in its API. When doing that, the options should be close to the actual lease. This is related to commit d9ec2e632df4905201facf76d6a205edc952116a (dhcp4: filter bogus DNS/NTP server addresses silently). https://github.com/systemd/systemd/commit/072320eab04d29247d7eb1b1fc32ae10e25c020f
* systemd: dhcp: handle multiple addresses for "Router" (option 3) in DHCP libraryThomas Haller2019-02-194-29/+37
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Imported from systemd: The Router DHCP option may contain a list of one or more routers ([1]). Extend the API of sd_dhcp_lease to return a list instead of only the first. Note that networkd still only uses the first router (if present). Aside from extending the internal API of the DHCP client, there is almost no change in behavior. The only visible difference in behavior is that the "ROUTER" variable in the lease file is now a list of addresses. Note how RFC 2132 does not define certain IP addresses as invalid for the router option. Still, previously sd_dhcp_lease_get_router() would never return a "0.0.0.0" address. In fact, the previous API could not differenciate whether no router option was present, whether it was invalid, or whether its first router was "0.0.0.0". No longer let the DHCP client library impose additional restrictions that are not part of RFC. Instead, the caller should handle this. The patch does that, and networkd only consideres the first router entry if it is not "0.0.0.0". [1] https://tools.ietf.org/html/rfc2132#section-3.5 This also required adjusting "src/dhcp/nm-dhcp-systemd.c" due to the changed internal API. https://github.com/systemd/systemd/commit/f8862395e8f802e4106a07ceaaf02b6a1faa5a6d
* systemd: network: don't return allocated buffer of zero length from ↵Thomas Haller2019-02-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | deserialize_in_addrs() Imported from systemd: deserialize_in_addrs() allocates the buffer before trying to parse the IP address. Since a parsing error is silently ignored, the returned size might be zero. In such a case we shouldn't return any buffer. Anyway, there was no leak, because there are only two callers like r = deserialize_in_addrs(&lease->dns, dns); which both keep the unused buffer and later release it. Note that deserialize_in_addrs() doesn't free the pointer before reassigning the new output. The caller must take care to to pass "ret" with an allocated buffer that would be leaked when returning the result. https://github.com/systemd/systemd/commit/c24b68216222156a45c5a8a918e7a44c144e9555
* dhcp/internal: cleanup logging and failure handling in lease_to_ip4_config()Thomas Haller2019-02-191-46/+46
| | | | | | | | | | | | | | | | | | | | | | | | ... and lease_to_ip6_config(). - Handle reasons that render the lease invalid first, before logging anything. This way, upon invalid lease we don't have partially logged about the lease. - prefer logging one line for options that contain multiple values, for example for search domains. - reorder statements to consistently log first before calling add_option(). - prefer g_string_append (nm_gstring_add_space_delimiter (str), ... over g_string_append_printf (str, "%s%s", str->len ? " " : "", ... - use @addr_str buffer directly, instead of assigning to another temporary variable.
* shared: add nm_ip4_addr_is_localhost() utilThomas Haller2019-02-192-0/+20
|
* docs: use numeric values in enum definitions in public headersThomas Haller2019-02-196-52/+51
| | | | | | | | | The public headers are parsed with gtk-doc. Define enum values as plain numbers, otherwise the documentation might have problems picking up the right value. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/126 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/83
* wifi-p2p: merge branch 'benzea/fix-p2p-crash'Thomas Haller2019-02-192-0/+14
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/85
| * device: Recheck P2P availability after setting a supplicant interfaceBenjamin Berg2019-02-191-0/+4
| | | | | | | | | | | | The newly set interface may already be in a READY state. In that case, the device should progress into the DISCONNECTED state rather than remaining in the UNAVAILABLE state.
| * device: Destroy P2P device with its parent Wifi deviceBenjamin Berg2019-02-191-0/+6
| | | | | | | | This can for example happen when a wifi device is unmanaged.
| * device: Ensure P2P device is unavailable without wpa_supplicantBenjamin Berg2019-02-191-0/+4
|/ | | | | | | Put the device into UNAVAILABLE state when the corresponding WPA supplicant management interface is unset. This is important to explicitly clear any pending state changes that are not permissible when there is no management interface.
* libnm: fix leaking checkpoints from NMManagerThomas Haller2019-02-191-0/+2
| | | | Fixes: c3efedf54bc64fd130849096849540ed1294df55
* libnm: fix memleak for NMDeviceTun:hw-addressThomas Haller2019-02-191-0/+1
| | | | Fixes: 337304f19df43eaa6c76a7571094ccc9dc99a4c5
* libnm: fix duplicate free in nm_client_checkpoint_rollback()Thomas Haller2019-02-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | #0 0x00007fffea7481e5 in _g_log_abort (breakpoint=1) at gmessages.c:554 #1 0x00007fffea74951d in g_logv (log_domain=0x7fffea78e00e "GLib", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=args@entry=0x7fffffffcbb0) at gmessages.c:1371 #2 0x00007fffea7496f3 in g_log (log_domain=log_domain@entry=0x7fffea78e00e "GLib", log_level=log_level@entry=G_LOG_LEVEL_CRITICAL, format=format@entry=0x7fffea798320 "%s: assertion '%s' failed") at gmessages.c:1413 #3 0x00007fffea749f2d in g_return_if_fail_warning (log_domain=log_domain@entry=0x7fffea78e00e "GLib", pretty_function=pretty_function@entry=0x7fffea799d40 <__func__.4759> "g_atomic_ref_count_dec", expression=expression@entry=0x7fffea799ca1 "g_atomic_int_get (arc) > 0") at gmessages.c:2762 #4 0x00007fffea754c12 in g_atomic_ref_count_dec (arc=arc@entry=0x5555558c5280) at grefcount.c:260 #5 0x00007fffea7302c6 in g_hash_table_unref (hash_table=0x5555558c5240) at ghash.c:1101 #6 0x00007fffea4b6dbc in clear_op_res (simple=0x55555587ed90 [GSimpleAsyncResult]) at gsimpleasyncresult.c:248 #7 0x00007fffea4b6dbc in g_simple_async_result_finalize (object=0x55555587ed90 [GSimpleAsyncResult]) at gsimpleasyncresult.c:268 #8 0x00007fffea67b949 in g_object_unref (_object=<optimized out>) at gobject.c:3346 #9 0x00007fffea67b949 in g_object_unref (_object=0x55555587ed90) at gobject.c:3238 #10 0x00007fffe95dea2d in checkpoint_rollback_cb (object=<optimized out>, result=<optimized out>, user_data=0x55555587ed90) at libnm/nm-manager.c:1584 #11 0x00007fffea4ca834 in g_task_return_now (task=0x5555558b5c80 [GTask]) at gtask.c:1148 #12 0x00007fffea4cb196 in g_task_return (task=0x5555558b5c80 [GTask], type=<optimized out>) at gtask.c:1206 #13 0x00007fffea5096bb in reply_cb (connection=<optimized out>, res=<optimized out>, user_data=0x5555558b5c80) at gdbusproxy.c:2596 #14 0x00007fffea4ca834 in g_task_return_now (task=0x5555558b5d50 [GTask]) at gtask.c:1148 #15 0x00007fffea4cb196 in g_task_return (task=0x5555558b5d50 [GTask], type=<optimized out>) at gtask.c:1206 #16 0x00007fffea4fdd4a in g_dbus_connection_call_done (source=<optimized out>, result=0x5555558b5e20, user_data=0x5555558b5d50) at gdbusconnection.c:5715 #17 0x00007fffea4ca834 in g_task_return_now (task=0x5555558b5e20 [GTask]) at gtask.c:1148 #18 0x00007fffea4ca86d in complete_in_idle_cb (task=task@entry=0x5555558b5e20) at gtask.c:1162 #19 0x00007fffea73e97b in g_idle_dispatch (source=0x7fffdc04eb90, callback=0x7fffea4ca860 <complete_in_idle_cb>, user_data=0x5555558b5e20) at gmain.c:5620 #20 0x00007fffea74206d in g_main_dispatch (context=0x5555557c8410) at gmain.c:3182 #21 0x00007fffea74206d in g_main_context_dispatch (context=context@entry=0x5555557c8410) at gmain.c:3847 #22 0x00007fffea742438 in g_main_context_iterate (context=0x5555557c8410, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at gmain.c:3920 #23 0x00007fffea742762 in g_main_loop_run (loop=0x55555584ed00) at gmain.c:4116 Fixes: c3efedf54bc64fd130849096849540ed1294df55
* shared: add nm_g_type_find_implementing_class_for_property() helperThomas Haller2019-02-192-0/+52
| | | | | | | | | A helper method, only useful for printf debugging -- and thus unused in the source-tree. It is relatively cumbersome to lookup the GType that implements a property. For example, for NMDeviceBond.driver, it should return NMDevice (which implements the "driver" property).
* platform/wireguard: fix parsing WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL from ↵Thomas Haller2019-02-181-1/+1
| | | | | | netlink Fixes: 0827d4c2e402b8c82d58e053e922d9d22679b960
* all: merge branch 'th/c-list-move'Thomas Haller2019-02-183-44/+51
|\ | | | | | | https://github.com/NetworkManager/NetworkManager/pull/298
| * all: use nm_c_list_move_*() helpersThomas Haller2019-02-182-44/+15
| |
| * shared: add nm_c_list_move_*() helpersThomas Haller2019-02-181-0/+36
|/
* ovs: merge branch 'bg/ovs-leaks'Beniamino Galvani2019-02-172-41/+40
|\ | | | | | | https://github.com/NetworkManager/NetworkManager/pull/296
| * ovs: fix dispose()Beniamino Galvani2019-02-171-5/+11
| | | | | | | | | | | | | | | | input and output must be freed only when not NULL. Also, ovsdb_disconnect() should do nothing if there is no client. Fixes: 830a5a14cb29ca00b73a9623c1ea7c5cd92f4d00
| * ovs: don't leak a GCancellable on connection failureBeniamino Galvani2019-02-171-3/+1
| | | | | | | | | | | | | | Every time we clear priv->client we should also clear the cancellable or it will be leaked. Fixes: 830a5a14cb29ca00b73a9623c1ea7c5cd92f4d00
| * ovs: fix leak of json objectsBeniamino Galvani2019-02-171-4/+5
| | | | | | | | Fixes: 830a5a14cb29ca00b73a9623c1ea7c5cd92f4d00
| * ovs: use nm_auto_decref_jsonBeniamino Galvani2019-02-171-29/+20
| |
| * shared: add nm_auto_decref_jsonBeniamino Galvani2019-02-171-0/+3
|/
* wifi/iwd: fix compiler warning about pointer cast in powered_changed()Thomas Haller2019-02-171-1/+1
| | | | | | | ../src/devices/wifi/nm-device-iwd.c: In function ‘powered_changed’: ../src/devices/wifi/nm-device-iwd.c:2336:15: warning: assignment from incompatible pointer type [enabled by default] interface = g_object_ref (priv->dbus_device_proxy); ^
* release: update NEWSThomas Haller2019-02-151-0/+3
|
* settings/ifupdown: fix ifupdown plugin after merging eni_ifaces and ↵Thomas Haller2019-02-151-2/+4
| | | | | | | | | | | | | connections hashes The @eni_ifaces hash may now contain %NULL elements. They are only markers for interface names, but are not actual connections. They must be skipped. Fixes: 6aa66426a4168b3db115646f410bcb5deea6847b https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/124
* all: merge branch 'th/various-for-wireguard-3'Thomas Haller2019-02-1421-230/+946
|\ | | | | | | https://github.com/NetworkManager/NetworkManager/pull/293
| * platform: print persistent-keepalive setting of WireGuard peersThomas Haller2019-02-141-2/+7
| |
| * platform: add peer_flags argument to nm_platform_link_wireguard_change()Thomas Haller2019-02-144-52/+121
| |
| * platform: add flags for setting individual WireGuard options of linkThomas Haller2019-02-144-15/+32
| |
| * platform: add change-flags argument to platform's link_wireguard_change()Thomas Haller2019-02-144-11/+21
| | | | | | | | | | | | | | | | | | We will need more flags. WireGuard internal tools solve this by embedding the change flags inside the structure that corresponds to NMPlatformLnkWireGuard. We don't do that, NMPlatformLnkWireGuard is only for containing the information about the link.
| * device: add mechanism to invoke act_stage2_config() function also for ↵Thomas Haller2019-02-142-2/+10
| | | | | | | | | | | | | | | | | | | | external/assume case Usually, for external/assume we skip calling act_stage2_config(). Add a flag that allows the device to indicate that it always wants to be called. This is useful, if the device wants to do some initialization also for external/assume cases.
| * device: split activate_stage2_device_config() steps for assumed/external checkThomas Haller2019-02-141-6/+11
| | | | | | | | | | | | | | | | | | | | | | Instead of performing a series of steps inside one check for "!nm_device_sys_iface_state_is_external_or_assume (self)", perform all steps individually (under the same check). There is no change in behavior, but this is more logical to me. We perform a series of steps, depending on condition. Each step individually depends on a set of conditions, instead of checking for a set of conditions and doing a series of independent steps.
| * device: abort device activation if tc_commit() fails in stage2Thomas Haller2019-02-141-0/+1
| | | | | | | | | | | | | | After we change the device's state to NM_DEVICE_STATE_FAILED, we must abort processing the current stage. Fixes: e4bdb219091004f751706aadc39e4fed21e86368
| * policy: treat WireGuard devices as VPN for DNSThomas Haller2019-02-144-13/+41
| | | | | | | | | | | | | | WireGuard devices are (will be) regular NMDevice implementations, but NMDnsManager should treat them like VPN. For that, reuse the device's type and nm_device_get_route_metric_default().
| * clients/secret-agent: allow suppressing prompting the entry-id when ↵Thomas Haller2019-02-143-7/+18
| | | | | | | | | | | | | | | | requesting secrets When asking for the preshared-key for WireGuard peers, the secret request will be very verbose with redundant information. Allow suppressing the entry id from the prompt.
| * clients/secret-agent: split creation of secret-request dataThomas Haller2019-02-142-125/+123
| |
| * clients/secret-agent: fail request_secrets_from_ui() if there are no secrets ↵Thomas Haller2019-02-141-0/+3
| | | | | | | | | | | | to be requested From looking at the code above, this likely shouldn't actually happen.
| * clients/secret-agent: keep setting-name in request-dataThomas Haller2019-02-141-0/+7
| | | | | | | | | | | | | | | | | | | | It's not really used, but we shouldn't just forget about it. Currently, we fill requests only based on the connection-type, ignoring the setting-name. I guess, the concept of requesting secrets for a setting is utterly broken. But equally broken it is to just look at the connection (type). At least, don't just throw parts of the request away but keep it.
| * libnm: add NMSockAddrEndpoint APIThomas Haller2019-02-144-0/+446
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | NMSockAddrEndpoint is an immutable structure that contains the endpoint string of a service. It also includes the (naive) parsing of the host and port/service parts. This will be used for the endpoint of WireGuard's peers. But since endpoints are not something specific to WireGuard, give it a general name (and purpose) independent from WireGuard. Essentially, this structure takes a string in a manner that libnm understands, and uses it for node and service arguments for getaddrinfo(). NMSockAddrEndpoint allows to have endpoints that are not parsable into a host and port part. That is useful because our settings need to be able to hold invalid values. That is for forward compatibility (server sends a new endpoint format) and for better error handling (have invalid settings that can be constructed without loss, but fail later during the NMSetting:verify() step).
| * libnm: add internal _nm_utils_secret_flags_validate() utilThomas Haller2019-02-142-0/+62
| |
| * libnm/trivial: rename NM_SETTING_SECRET_FLAG_ALL flag (formerly ↵Thomas Haller2019-02-142-3/+3
| | | | | | | | | | | | NM_SETTING_SECRET_FLAGS_ALL) It should mirror the naming pattern of the flags.
| * shared: add macros for initializing NMSecretPtrThomas Haller2019-02-131-0/+25
| |
| * shared: make nm_streq() and nm_streq0() inline functionsThomas Haller2019-02-131-2/+12
| | | | | | | | | | | | | | | | | | | | There is no advantage in having these as macros. Make them inline functions, compiler should be able to decide that they are in fact inlinable. Also, don't call g_strcmp0() for nm_streq0(). It means we first have to call glib function, only to call a glibc function. No need for this abstraction.
| * shared: add NM_STR_HAS_SUFFIX()Thomas Haller2019-02-131-1/+12
| | | | | | | | | | | | | | | | Contrary to g_str_has_suffix(), it exploits the fact the the suffix length is known at compile time. No need to call a glib function, to find out what we already know, to call strcmp(). Instead just calculate the string length and call memcmp().
| * libnm: fix usage of nm_streq() macroThomas Haller2019-02-131-7/+7
|/ | | | | | | | | | | | | | | | | Yes, C has a preprocessor and nm_streq() currently is a macro. Still, macros should very much behave like regular functions. For example, no unexpected side-effects aside what a regular function would have, evaluating all arguments exactly once, or no side-effects w.r.t. the order in which arguments are evaluated. In some cases, we deviate from that for good reasons. For example NM_IN_SET() may not evaluate all arguments. _LOGD() may not evaluate any arguments, and NM_UTILS_LOOKUP_STR_DEFINE() is not a function-like macro at all. Still, that is not the case here. We avoid to misuse macros to write code that does not look like C.