summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* device/trivial: add comment about lifetime of "kind" in tc_commit()th/various-cleanup-platform-libnmThomas Haller2019-05-074-0/+66
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In general, all fields of public NMPlatform* structs must be plain/simple. Meaning: copying the struct must be possible without caring about cloning/duplicating memory. In other words, if there are fields which lifetime is limited, then these fields cannot be inside the public part NMPlatform*. That is why - "NMPlatformLink.kind", "NMPlatformQdisc.kind", "NMPlatformTfilter.kind" are set by platform code to an interned string (g_intern_string()) that has a static lifetime. - the "ingress_qos_map" field is inside the ref-counted struct NMPObjectLnkVlan and not NMPlatformLnkVlan. This field requires managing the lifetime of the array and NMPlatformLnkVlan cannot provide that. See also for example NMPClass.cmd_obj_copy() which can deep-copy an object. But this is only suitable for fields in NMPObject*. The purpose of this rule is that you always can safely copy a NMPlatform* struct without worrying about the ownership and lifetime of the fields (the field's lifetime is unlimited). This rule and managing of resource lifetime is the main reason for the NMPlatform*/NMPObject* split. NMPlatform* structs simply have no mechanism for copying/releasing fields, that is why the NMPObject* counterpart exists (which is ref-counted and has a copy and destructor function). This is violated in tc_commit() for the "kind" strings. The lifetime of these strings is tied to the setting instance. We cannot intern the strings (because these are arbitrary strings and interned strings are leaked indefinitely). We also cannot g_strdup() the strings, because NMPlatform* is not supposed to own strings. So, just add comments that warn about this ugliness. The more correct solution would be to move the "kind" fields inside NMPObjectQdisc and NMPObjectTfilter, but that is a lot of extra effort.
* device: don't rely on nm_platform_link_get_ifindex() returning 0Thomas Haller2019-05-071-4/+7
| | | | | | | | | While nm_platform_link_get_ifindex() is documented to return 0 if the device is not found, don't rely on it. Instead, check that a valid(!) ifindex was returned, and only then set the ifindex. Otherwise leave it at zero. There is of course no difference in practice, but we generally treat invalid ifindexes as <= 0, so it's not immediately clear what nm_platform_link_get_ifindex() returns to signal no device.
* device/trivial: add space between macro name and arguments and vertically ↵Thomas Haller2019-05-071-8/+8
| | | | | | | | | align lines Also calling macros we commonly put a space between the macro name and the parenthesis. Also align the parameters. Otherwise it's hard to read for me.
* platform: merge _add_action(), _add_action_simple() and _add_action_mirred() ↵Thomas Haller2019-05-071-79/+46
| | | | | | | | | | | | | into _nl_msg_new_tfilter() There is only one caller, hence it's simpler to see it all in one place. I prefer this, because then I can read the code top to bottom and see what's happening, without following helper functions. Also, this way we can "reuse" the nla_put_failure label and assertion. Previously, if the assertion was hit we would not rewind the buffer but continue constructing the message (which is already borked). Not that it matters too much, because this was on an "failed-assertion" code path.
* platform: assert for out-of-memory in netlink codeThomas Haller2019-05-073-15/+15
| | | | | | These lines can be reached if the allocated buffer is too small to hold the netlink message. That is actually a bug that we need to fix. Assert.
* platform: use bool bitfields in NMPlatformActionMirred structureThomas Haller2019-05-072-13/+14
| | | | | | | | | | | Arguably, the structure is used inside a union with another (larger) struct, hence no memory is saved. In fact, it may well be slower performance wise to access a boolean bitfield than a gboolean (int). Still, boolean fields in structures should be bool:1 bitfields for consistency.
* libnm: rename "memory" parameter of fq_codel QDisc to "memory_limit"Thomas Haller2019-05-075-11/+11
| | | | | | | | Kernel calls the netlink attribute TCA_FQ_CODEL_MEMORY_LIMIT. Likewise, iproute2 calls this "memory_limit". Rename because TC parameters are inherrently tied to the kernel implementation and we should use the familiar name.
* platform: fix handling of default value for TCA_FQ_CODEL_CE_THRESHOLDThomas Haller2019-05-075-5/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | iproute2 uses the special value ~0u to indicate not to set TCA_FQ_CODEL_CE_THRESHOLD in RTM_NEWQDISC. When not explicitly setting the value, kernel treats the threshold as disabled. However note that 0xFFFFFFFFu is not an invalid threshold (as far as kernel is concerned). Thus, we should not use that as value to indicate that the value is unset. Note that iproute2 uses the special value ~0u only internally thereby making it impossible to set the threshold to 0xFFFFFFFFu). But kernel does not have this limitation. Maybe the cleanest way would be to add another field to NMPlatformQDisc: guint32 ce_threshold; bool ce_threshold_set:1; that indicates whether the threshold is enable or not. But note that kernel does: static void codel_params_init(struct codel_params *params) { ... params->ce_threshold = CODEL_DISABLED_THRESHOLD; static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack) { ... if (tb[TCA_FQ_CODEL_CE_THRESHOLD]) { u64 val = nla_get_u32(tb[TCA_FQ_CODEL_CE_THRESHOLD]); q->cparams.ce_threshold = (val * NSEC_PER_USEC) >> CODEL_SHIFT; } static int fq_codel_dump(struct Qdisc *sch, struct sk_buff *skb) { ... if (q->cparams.ce_threshold != CODEL_DISABLED_THRESHOLD && nla_put_u32(skb, TCA_FQ_CODEL_CE_THRESHOLD, codel_time_to_us(q->cparams.ce_threshold))) goto nla_put_failure; This means, kernel internally uses the special value 0x83126E97u to indicate that the threshold is disabled (WTF). That is because (((guint64) 0x83126E97u) * NSEC_PER_USEC) >> CODEL_SHIFT == CODEL_DISABLED_THRESHOLD So in kernel API this value is reserved (and has a special meaning to indicate that the threshold is disabled). So, instead of adding a ce_threshold_set flag, use the same value that kernel anyway uses.
* platform: fix handling of fq_codel's memory limit default valueThomas Haller2019-05-075-4/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The memory-limit is an unsigned integer. It is ugly (if not wrong) to compare unsigned values with "-1". When comparing with the default value we must also use an u32 type. Instead add a define NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET. Note that like iproute2 we treat NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET to indicate to not set TCA_FQ_CODEL_MEMORY_LIMIT in RTM_NEWQDISC. This special value is entirely internal to NetworkManager (or iproute2) and kernel will then choose a default memory limit (of 32MB). So setting NM_PLATFORM_FQ_CODEL_MEMORY_LIMIT_UNSET means to leave it to kernel to choose a value (which then chooses 32MB). See kernel's net/sched/sch_fq_codel.c: static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack) { ... q->memory_limit = 32 << 20; /* 32 MBytes */ static int fq_codel_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack) ... if (tb[TCA_FQ_CODEL_MEMORY_LIMIT]) q->memory_limit = min(1U << 31, nla_get_u32(tb[TCA_FQ_CODEL_MEMORY_LIMIT])); Note that not having zero as default value is problematic. In fields like "NMPlatformIP4Route.table_coerced" and "NMPlatformRoutingRule.suppress_prefixlen_inverse" we avoid this problem by storing a coerced value in the structure so that zero is still the default. We don't do that here for memory-limit, so the caller must always explicitly set the value.
* platform: fix nm_platform_qdisc_to_string()Thomas Haller2019-05-071-1/+4
| | | | | When using nm_utils_strbuf_*() API, the buffer gets always moved to the current end. We must thus remember and return the original start of the buffer.
* platform: use u32 netlink type for TCA_FQ_CODEL_ECNThomas Haller2019-05-071-2/+2
| | | | | | | | | In practice, there is no difference when representing 0 or 1 as signed/unsigned 32 bit integer. But still use the correct type that also kernel uses. Also, the implicit conversation from uint32 to bool was correct already. Still, explicitly convert the uint32 value to boolean in _new_from_nl_qdisc(). It's no change in behavior.
* platform: use NM_CMP_FIELD_UNSAFE() for comparing bitfield in ↵Thomas Haller2019-05-071-2/+3
| | | | | | | | | | | | | | | nm_platform_qdisc_cmp() "NM_CMP_FIELD (a, b, fq_codel.ecn == TRUE)" is quite a hack as it relies on the implementation of the macro in a particular way. The problem is, that NM_CMP_FIELD() uses typeof() which cannot be used with bitfields. So, the nicer solution is to use NM_CMP_FIELD_UNSAFE() which exists exactly for bitfields (it's "unsafe", because it evaluates arguments more than once as it avoids the temporary variable with typeof()). Same with nm_hash_update_vals() which uses typeof() to avoid evaluating arguments more than once. But that again does not work with bitfields. The "proper" way is to use NM_HASH_COMBINE_BOOLS().
* device: fix type of loop variable in tc_commit()Thomas Haller2019-05-071-1/+1
| | | | | nqdiscs and ntfilters are unsigned integers. The loop variable must agree in range and signedness.
* libnm: use macro and designated initializers for NMVariantAttributeSpecThomas Haller2019-05-074-64/+62
| | | | | | | | | | | | I think initializing structs should (almost) be always done with designated initializers, because otherwise it's easy to get the order wrong. The problem is that otherwise the order of fields gets additional meaning not only for the memory layout, but also for the code that initialize the structs. Add a macro NM_VARIANT_ATTRIBUTE_SPEC_DEFINE() that replaces the other (duplicate) macros. This macro also gets it right to mark the struct as const.
* libnm: mark NMVariantAttributeSpec pointers as constThomas Haller2019-05-073-3/+3
| | | | | | | | | This actually allows the compiler/linker to mark the memory as read-only and any modification will cause a segmentation fault. I would also think that it allows the compiler to put the structure directly beside the outer constant array (in which this pointer is embedded). That is good locality-wise.
* libnm: cleanup _nm_utils_parse_tc_handle()Thomas Haller2019-05-072-20/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - g_ascii_strtoll() accepts leading spaces, but it leaves the end pointer at the first space after the digit. That means, we accepted "1: 0" but not "1 :0". We should either consistently accept spaces around the digits/colon or reject it. - g_ascii_strtoll() accepts "\v" as a space (just like `man 3 isspace` comments that "\v" is a space in C and POSIX locale. For some reasons (unknown to me) g_ascii_isspace() does not treat "\v" as space. And neither does NM_ASCII_SPACES and nm_str_skip_leading_spaces(). We should be consistent about what we consider spaces and what not. It's already odd to accept '\n' as spaces here, but well, lets do it for the sake of consistency (so that it matches with our understanding of ASCII spaces, albeit not POSIX's). - don't use bogus error domains in "g_set_error (error, 1, 0, ..." That is a bug and we have NM_UTILS_ERROR exactly for error instances with unspecified domain and code. - as before, accept a trailing ":" with omitted minor number. - reject all unexpected characters. strtoll() accepts '+' / '-' and a "0x" prefix of the numbers (and leading POSIX spaces). Be strict here and only accepts NM_ASCII_SPACES, ':', and hexdigits. In particular, don't accept the "0x" prefix. This parsing would be significantly simpler to implement, if we could just strdup() the string, split the string at the colon delimiter and use _nm_utils_ascii_str_to_int64() which gets leading/trailing spaces right. But let's save the "overhead" of an additional alloc.
* libnm/tests: add test for _nm_utils_parse_tc_handle()Thomas Haller2019-05-071-0/+56
|
* shared: use nm_str_skip_leading_spaces() in _nm_utils_ascii_str_to_int64()Thomas Haller2019-05-071-6/+3
|
* modem/broadband: set the gsm.device-id in complete_connection()Lubomir Rintel2019-05-071-2/+16
| | | | | | | This is the preferred way of associating the connection with a particualr modem. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/138
* core: merge branch 'th/cache-state-keyfiles'Thomas Haller2019-05-0718-231/+794
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/134
| * settings: cache keyfile databases for "timestamps" and "seen-bssids"Thomas Haller2019-05-078-207/+266
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Only read the keyfile databases once and cache them for the remainder of the program. - this avoids the overhead of opening the file over and over again. - it also avoids the data changing without us expecting it. The state files are internal and we don't support changing it outside of NetworkManager. So in the base case we read the same data over and over. In the worst case, we read different data but are not interested in handling the changes. - only write the file when the content changes or before exiting (normally). - better log what is happening. - our state files tend to grow as we don't garbage collect old entries. Keeping this all in memory might be problematic. However, the right solution for this is that we come up with some form of garbage collection so that the state files are reaonsably small to begin with.
| * shared: add NMKeyFileDB APIThomas Haller2019-05-072-0/+443
| | | | | | | | | | | | It will be used for "/var/lib/NetworkManager/seen-bssids" and "/var/lib/NetworkManager/timestamps" which currently is implemented in NMSettingConnection.
| * shared: add "shared/nm-glib-aux/nm-keyfile-aux.h"Thomas Haller2019-05-075-1/+52
| |
| * shared: add nm_log_level_from_syslog() helper to convert from syslog levelsThomas Haller2019-05-073-18/+28
| |
| * core: use NM_SETTINGS_GET for singlton instead of nm_settings_get()Thomas Haller2019-05-072-5/+5
|/ | | | We have it, so use it. Also, we use a similar macro for other singletons.
* platform: merge branch 'th/ethtool-retry'Thomas Haller2019-05-073-171/+369
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/133
| * platform/ethtool,mii: retry ioctl when interface name was renamed for ↵Thomas Haller2019-05-072-171/+314
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ehttool/mii ethtool/mii API is based on the ifname. As an interface can be renamed, this API is inherently racy. We would prefer to use the ifindex instead. The ifindex of a device cannot change (altough it can repeat, which opens a different race *sigh*). Anyway, we were already trying to minimize the race be resolving the name from ifindex immediately before the call to ethtool/mii. Do better than that. Now resolve the name before and after the call. If the name changed in the meantime, we have an indication that a race might have happend (but we cannot be sure). Note that this can not catch every possible kind of rename race. If you are very unlucky a swapping of names cannot be detected. For getters this is relatively straight forward. Just retry when we have an indication to fall victim to a race (up to a few times). Yes, we still cannot be 100% sure, but this should be very reliable in practice. For setters (that modify the device) we also retry. We do so under the assumption that setting the same options multiple times has no bad effect. Note that for setters the race of swapping interface names is particularly bad. If we hit a very unlucky race condition, we might set the setting on the wrong interface and there is nothing we can do about it. The retry only ensures that eventually we will set it on the right interface. Note that this involves one more if_indextoname() call for each operation (in the common case when there is no renaming race). In cases where we make multiple ioctl calls, we cache and reuse the information though. So, for such calls the overhead is even smaller.
| * shared: add nm_malloc_maybe_a(), nm_malloc0_maybe_a() and ↵Thomas Haller2019-05-071-0/+55
|/ | | | nm_memdup_maybe_a() utils
* device: fix reapply of MTUBeniamino Galvani2019-05-061-0/+3
| | | | | | | | | | | | | | | | | When we set the MTU on the link we remember its previous source (ip-config, parent-device or connection profile) and don't change it again afterwards to avoid interfering with user's manual changes. The only exceptions when we change it again are (1) if the parent device MTU changes and (2) if the new MTU has higher priority than the one previously set. To allow a live reapply of the MTU property we also need to clear the saved source, or the checks described above will prevent setting the new value. Fixes: 2f8917237fdf ('device: rework mtu priority handling') https://bugzilla.redhat.com/show_bug.cgi?id=1702657
* cli: merge branch 'bg/rh1702199'Beniamino Galvani2019-05-065-26/+65
|\ | | | | | | | | | | | | | | Don't print blob certificates unless the '--show-secrets' option is passed to nmcli; plus other related changes. https://bugzilla.redhat.com/show_bug.cgi?id=1702199 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/122
| * cli: hide certificate blobs unless --show-secrets is passedBeniamino Galvani2019-05-061-2/+1
| | | | | | | | | | | | This restores the behavior before commit 99711579ed43. Fixes: 99711579ed43 ('cli: add property type for 802-1x certificate properties (pt2)').
| * cli: complete 802.1x certificate file namesBeniamino Galvani2019-05-061-0/+21
| |
| * cli: allow completing filenamesBeniamino Galvani2019-05-065-8/+24
| | | | | | | | | | Allow the completion function to indicate that the word should be completed as a filename by the shell.
| * cli: remove bluetooth completion codeBeniamino Galvani2019-05-061-8/+2
| | | | | | | | | | | | | | The 'bt-type' property alias accepts values provided by gen_func_bt_type(); instead the 'bluetooth.type' property can only be set to [dun, panu, nap] and therefore it doesn't need special handling.
| * cli: parse escape sequences when reading an 802.1x private keyBeniamino Galvani2019-05-061-10/+18
| | | | | | | | | | In this way it become possible to specify a filename that includes one of the delimiters.
| * cli: fix setting private key passwordBeniamino Galvani2019-05-061-0/+1
|/ | | | Fixes: fe390556abfe ('cli: add property type for 802-1x certificate properties (pt3)')
* settings: fix failed assertionBeniamino Galvani2019-05-061-1/+1
| | | | | | | | | | Fix the following assertion failure: g_object_ref: assertion 'G_IS_OBJECT (object)' failed. nm_settings_add_connection() can return a NULL connection. Fixes: f034f17ff69c ('settings: keep the added connection alive for a bit longer')
* po: update Spanish (es) translationRodrigo Lledó2019-05-041-2399/+2987
| | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/135
* release: bump version to 1.19.2-dev1.19.2-devLubomir Rintel2019-05-032-2/+2
|
* build: fix an out-of-tree buildLubomir Rintel2019-05-031-1/+1
| | | | | | | | | | | make[3]: Entering directory 'NetworkManager/_build/sub' CC clients/cli/nmcli-common.o cc1: error: ./clients/common: No such file or directory [-Werror=missing-include-dirs] cc1: all warnings being treated as errors The only generated header in $builddir/clients/common is settings-docs.h and only libnmc.la needs it. Include the directory on the command line only when we know it exists.
* NEWS: updateLubomir Rintel2019-05-031-0/+2
|
* device/wireguard: fix memleak for NMDeviceWireGuardThomas Haller2019-05-031-0/+2
| | | | Fixes: 2148d0948202 ('core/wireguard: add support for WireGuard peers')
* platform/tests: workaround routing-rules test failure due to ↵Thomas Haller2019-05-021-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | suppress_prefixlen on older kernels On Ubuntu 14.04 kernel (4.4.0-146-generic, x86_64) this easily causes test failures: make -j 8 src/platform/tests/test-route-linux \ && while true; do \ NMTST_SEED_RANDOM= ./tools/run-nm-test.sh src/platform/tests/test-route-linux -p /route/rule \ || break; \ done outputs: ... /route/rule/1: nmtst: initialize nmtst_get_rand() with NMTST_SEED_RAND=22892021 OK /route/rule/2: >>> failing... >>> no fuzzy match between: [routing-rule,0x205ab30,1,+alive,+visible; [6] 0: from all suppress_prefixlen 8 none] >>> and: [routing-rule,0x205c0c0,1,+alive,+visible; [6] 0: from all suppress_prefixlen -1579099242 none] ** test:ERROR:src/platform/tests/test-route.c:1695:test_rule: code should not be reached
* po: update Spanish (es) translationRodrigo Lledó2019-05-011-32/+30
| | | | | | | | | Changing "Token" translation from "identificador" to "testigo" as discussed in the GNOME Spanish Translation Team's mailing list. Special thanks to Daniel Mustieles our coordinator. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/130
* po: update Ukrainian (uk) translationYuri Chornoivan2019-05-011-2518/+2618
| | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/128
* libnm: merge branch 'th/libnm-setting-cleanup'Thomas Haller2019-05-0125-385/+555
|\ | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/126
| * libnm: unify property-to-dbus handling of NMSettingThomas Haller2019-05-0111-135/+136
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Merge the function pointer get_func() into to_dbus_fcn(). Previously, get_func() as handled separately from to_dbus_fnc() (formerly synth_func()). The notion was that synth-func would syntetize properties that are D-Bus only. But that distinction does not seem very helpful to me. Instaed, we want to convert a property to D-Bus. Period. The implementation should be handled uniformly. Hence, now that is all done by property_to_dbus(). Note that property_to_dbus() is also called as default implementation for compare-property. At least, for properties that are backed by a GObject property.
| * libnm: rename function pointers of NMSettInfoPropertyThomas Haller2019-05-014-87/+97
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The naming was not very clear. How does get_func(), synth_func() and to_dbus() relate? What does synth_func() do anyway? Answers: - get_func() and synth_func() do very similar. They should be merged in a next step. synth_func() has the notion of "synthetize" a property for D-Bus. As such, these properties are a bit unusual in that they don't have a backing GObject property in the setting. But it'd rather treat such properties like other properties. The step in that direction will be to merge the to-dbus functions. - to_dbus() converts a GValue of the GObject property go GVariant. It's a simplified form of get_func()/synth_func() and a better name is gprop_to_dbus_fcn(). The same for gprop_from_dbus_fcn(). For now, just rename.
| * libnm: pass connection to compare_property() functionThomas Haller2019-05-0118-129/+236
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We have certain artificial properties that not only depend on one property alone or that depend on a property in another(!) setting. For that, we have synth_func. Other than that, synth_func and get_func are really fundamentally similar and should be merged. That is because the distinction whether a property value is "synthetized" or just based on a plain property is minor. It's better to have the general concept of "convert property to GVariant" in one form only. Note that compare_property() is by default implemented based on get_func. Hence, if get_func and synth_func get merged, compare_property() will also require access to the NMConnection. Also it makes some sense: some properties are artificial and actually stored in "another" setting of the connection. But still, the property descriptor for the property is in this setting. The example is the "bond.interface-name" which only exists on D-Bus. It's stored as "connection.interface-name". I don't really like to say "exists on D-Bus only". It's still a valid property, despite in NMSetting it's stored somehow differently (or not at all). So, this is also just a regular property for which we have a property-info vtable. Does it make sense to compare such properties? Maybe. But the point is that compare_property() function needs sometimes access to the entire connection. So add the argument.
| * libnm: cleanup converting properties to GVariantThomas Haller2019-05-012-61/+99
| | | | | | | | | | | | | | | | | | | | | | Always properly set NMSettInfoProperty.dbus_type, instead of leaving it unspecified for GObject property based properties, and detect it each time anew with variant_type_for_gtype(). Instead, autodetect and remember the dbus-type during _properties_override_add_struct(). For types that need special handling (GBytes, enums and flags) set a to_dbus() function. This allows us to handle properties uniformly by either calling the to_dbus() function or g_dbus_gvalue_to_gvariant().