summaryrefslogtreecommitdiff
path: root/src/settings
Commit message (Collapse)AuthorAgeFilesLines
...
* ifcfg: strip whitespaces around "DEVTIMEOUT"Thomas Haller2020-04-011-2/+4
| | | | | | Be more graceful and allow whitespaces around the floating point number for DEVTIMEOUT. Note that _nm_utils_ascii_str_to_int64() is already graceful against whitespace, so also be it with the g_ascii_strtod() code path.
* meson: merge branch 'inigomartinez/meson-license'Thomas Haller2020-03-286-0/+12
|\ | | | | | | | | | | | | | | | | | | Add SPDX license headers for meson files. As far as I can tell, according to RELICENSE.md file, almost everybody who contributed to the meson files agreed to the LGPL-2.1+ licensing. This entails the vast majority of code in question. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/397
| * license: Add license using SPDX identifiers to meson build filesIñigo Martínez2020-02-176-0/+12
| | | | | | | | | | License is missing in meson build files. This has been added using SPDX identifiers and licensed under LGPL-2.1+.
* | core: prevent multiple attempts to create default wired connectionThomas Haller2020-03-281-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Scenario: - have ethernet connection as unmanaged. - create (or have) a suitable profile for the connection. - make the device as managed. No default wired connection gets created. - delete the profile. Note that NMManager does in manager_device_state_changed(): »···if (NM_IN_SET (new_state, »··· NM_DEVICE_STATE_UNAVAILABLE, »··· NM_DEVICE_STATE_DISCONNECTED)) »···»···nm_settings_device_added (priv->settings, device); that means, when the device the next time goes through UNAVAILABLE/DISCONNECTED states, we will suddenly create the default "Wired connection 1" profile. That doesn't seem right. When a device is suitable to have a default-wired connection, we should only check once whether to create it. We should not retry that later. The !no-auto-default mechanism exists so we can start NetworkManager without a profile for the device. It doesn't mean that we later one (after previously deciding not to create a profile), we still create it. https://bugzilla.redhat.com/show_bug.cgi?id=1687937 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/450
* | Add domain_match mode for wifi certificate domain comparisonNiklas Goerke2020-03-234-1/+16
| | | | | | | | | | https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/308 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/437
* | all: use nm_clear_pointer() instead of g_clear_pointer()Thomas Haller2020-03-233-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | g_clear_pointer() would always cast the destroy notify function pointer to GDestroyNotify. That means, it lost some type safety, like GPtrArray *ptr_arr = ... g_clear_pointer (&ptr_arr, g_array_unref); Since glib 2.58 ([1]), g_clear_pointer() is also more type safe. But this is not used by NetworkManager, because we don't set GLIB_VERSION_MIN_REQUIRED to 2.58. [1] https://gitlab.gnome.org/GNOME/glib/-/commit/f9a9902aac826ab4aecc25f6eb533a418a4fa559 We have nm_clear_pointer() to avoid this issue for a long time (pre 1.12.0). Possibly we should redefine in our source tree g_clear_pointer() as nm_clear_pointer(). However, I don't like to patch glib functions with our own variant. Arguably, we do patch g_clear_error() in such a manner. But there the point is to make the function inlinable. Also, nm_clear_pointer() returns a boolean that indicates whether anything was cleared. That is sometimes useful. I think we should just consistently use nm_clear_pointer() instead, which does always the preferable thing. Replace: sed 's/\<g_clear_pointer *(\([^;]*\), *\([a-z_A-Z0-9]\+\) *)/nm_clear_pointer (\1, \2)/g' $(git grep -l g_clear_pointer) -i
* | all: use nm_clear_g_free() instead of g_clear_pointer()Thomas Haller2020-03-232-3/+3
| | | | | | | | | | | | | | | | | | I think it's preferable to use nm_clear_g_free() instead of g_clear_pointer(, g_free). The reasons are not very strong, but I think it is overall preferable to have a shorthand for this frequently used functionality. sed 's/\<g_clear_pointer *(\([^;]*\), *\(g_free\) *)/nm_clear_g_free (\1)/g' $(git grep -l g_clear_pointer) -i
* | ifcfg-rh: add 'timestamp' property before comparing a reread connectionAntonio Cardace2020-03-191-0/+5
| | | | | | | | | | | | | | | | Since ifcfg-rh doesn't write out to file the 'connection.timestamp' property let's add it before comparing an updated connection with the plugin's reread one otherwise the comparison operation would always fail. The fix is not necessary for the keyfile plugin, because the reader/writer correctly reads/writes the connection timestamp.
* | ifcfg-rh: use binary search for converting string to ethtool IDThomas Haller2020-03-061-31/+87
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Don't do a linear search through all names, but use binary search. Upside: calling nms_ifcfg_rh_utils_get_ethtool_by_name() in a loop (once over all 60 names) is 75% faster. Downside: when adding a new feature, we have yet another line that we need to add. Previously, adding a new feature required adding 7 lines, not it is 8. But we didn't add a single feature since this was added, so that happens very seldom. Possible downside: is this code harder to read? Now we track both how to convert the ID to name and back. This is redundant (and thus harder to maintain). But it's really just one extra line per feature, for which there is a unit test. So, when adding a new NMEthtoolID it would be pretty hard to mess this up, because of all the tests and assertions. So, maybe it's slightly harder to read. On the other hand, it unifies handling for ethtool and kernel names, and the code has less logic and is more descriptive. I don't think this is actually harder to maintain and it should be easy to see that it is correct (readability).
* | ifcfg-rh/tests: add test for consistency of ethtool ifcfg namesThomas Haller2020-03-061-0/+57
| |
* | ifcfg-rh: use nm_utils_ifname_valid() for validating interface-name in readerThomas Haller2020-02-261-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Maybe the reader should not try to add its own validation. It could just read the value, set it in the profile, and let nm_connection_verify() handle it. However: - in this form the code only logs a warning about invalid setting. If we let it come to nm_connection_verify(), the connection profile will be entirely rejected. I think this makes sense, because ifcfg files may be edited by the user and we don't know what is out there. - it's nicer to show a warning that specifically mentions the DEVICE= variable. There error message we get from nm_connection_verify() is no longer aware of ifcfg peculiarities. Instead: use the appropriate validation function.
* | libnm: sort "mode" in nm_setting_bond_get_option() firstThomas Haller2020-02-191-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Internally, the options are tracked in a hash table and of undefined sort order. However, nm_setting_bond_get_option() always returns a stable (sorted) order. Move "mode" as first, because that is usually the most interesting option. The effect is: $ nmcli -o connection show "$BOND_PROFILE" ... -bond.options: arp_interval=5,arp_ip_target=192.168.7.7,arp_validate=active,mode=balance-rr,use_carrier=0 +bond.options: mode=balance-rr,arp_interval=5,arp_ip_target=192.168.7.7,arp_validate=active,use_carrier=0 This doesn't affect keyfile, which sorts the hash keys themself (and doesn't treat the "mode" special). This however does affect ifcfg-rh writer how it writes the BONDING_OPTS variable. I think this change is fine and preferable.
* | all: use nm_utils_ifname_valid_kernel() instead of ↵Antonio Cardace2020-02-171-1/+1
| | | | | | | | | | | | | | | | | | nm_utils_is_valid_iface_name() nm_utils_is_valid_iface_name() is a public API of libnm-core, let's use our internal API. $ sed -i 's/\<nm_utils_is_valid_iface_name\>/nm_utils_ifname_valid_kernel/g' $(git grep -l nm_utils_is_valid_iface_name)
* | libnm,cli,ifcfg-rh: add ipv6.ra-timeout configuration optionThomas Haller2020-02-174-1/+9
| |
* | ifcfg-rh: belatedly add support for "ipv6.dhcp-timeout" settingThomas Haller2020-02-174-4/+13
| |
* | ifcfg-rh: fix potential crash with variadic argument make_ip6_setting()Thomas Haller2020-02-171-1/+1
| | | | | | | | | | | | | | It is undefined behavior and can lead to crashes or memory corruption. In practice, this only had an issue on Big Endian systems. Fixes: fdbf4ae5e6ae ('ifcfg-rh: add IPV4_DHCP_TIMEOUT key for ipv4.dhcp-timeout property')
* | ifcfg-rh: inline unnecessary function write_ip6_setting_dhcp_hostname()Thomas Haller2020-02-171-23/+16
|/ | | | | | | If a function is only called once, it may not help to simplify the code but make it more complicated. It would only simplify the code, if it had a clear, distinct purpose. That isn't the case here. Also, the IPv4 writer doesn't have such a function either. Drop and inline it.
* all: drop explicit casts from _GET_PRIVATE() macro callsThomas Haller2020-02-141-1/+1
| | | | | | | | | The _GET_PRIVATE() macros are all implemented based on _NM_GET_PRIVATE(). That macro tries to be more type safe and uses _Generic() to do the right thing. Explicitly casting is not only unnecessary, it defeats these (static) type checks. Don't do that.
* shared: drop _STATIC variant of macros that define functionsThomas Haller2020-02-133-4/+8
| | | | | | | | | | | | | | | | | | Several macros are used to define function. They had a "_STATIC" variant, to define the function as static. I think those macros should not try to abstract entirely what they do. They should not accept the function scope as argument (or have two variants per scope). This also because it might make sense to add additional __attribute__(()) to the function. That only works, if the macro does not pretend to *not* define a plain function. Instead, embrace what the function does and let the users place the function scope as they see fit. This also follows what is already done with static NM_CACHED_QUARK_FCN ("autoconnect-root", autoconnect_root_quark)
* all: use g_ascii_strcasecmp() instead of the locale dependent strcasecmp()Thomas Haller2020-02-112-16/+16
| | | | | | In all the cases, we don't want to perform locale dependent comparison. $ sed -i 's/\<strcasecmp\>/g_ascii_\0/g' $(git grep -w -l strcasecmp -- ':(exclude)shared/systemd/' )
* all: add nm_utils_error_is_cancelled() and ↵Thomas Haller2020-02-101-1/+1
| | | | | | | | nm_utils_error_is_cancelled_or_disposing() Most callers would pass FALSE to nm_utils_error_is_cancelled(). That's not very useful. Split the two functions and have nm_utils_error_is_cancelled() and nm_utils_error_is_cancelled_is_disposing().
* ifcfg-rh: add missing 'extern' keywordBeniamino Galvani2020-02-031-1/+1
| | | | | | | | Add missing 'extern' keyword to fix the following error caused by GCC 10 defaulting to -fno-common: src/settings/plugins/ifcfg-rh/.libs/libnms-ifcfg-rh-core.a(libnms_ifcfg_rh_core_la-shvar.o):/root/NetworkManager/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h:36: multiple definition of `nms_ifcfg_well_known_keys'; src/settings/plugins/ifcfg-rh/.libs/libnm_settings_plugin_ifcfg_rh_la-nms-ifcfg-rh-plugin.o:/root/NetworkManager/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h:36: first defined here
* all: use nm_utils_ipaddr_is_valid() instead of nm_utils_ipaddr_valid()Thomas Haller2020-01-283-8/+8
| | | | | | | | We should use the same "is-valid" function everywhere. Since nm_utils_ipaddr_valid() is part of libnm, it does not qualify. Use nm_utils_ipaddr_is_valid() instead.
* all: use _nm_utils_inet4_ntop() instead of nm_utils_inet4_ntop()Thomas Haller2020-01-282-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | and _nm_utils_inet6_ntop() instead of nm_utils_inet6_ntop(). nm_utils_inet4_ntop()/nm_utils_inet6_ntop() are public API of libnm. For one, that means they are only available in code that links with libnm/libnm-core. But such basic helpers should be available everywhere. Also, they accept NULL as destination buffers. We keep that behavior for potential libnm users, but internally we never want to use the static buffers. This patch needs to take care that there are no callers of _nm_utils_inet[46]_ntop() that pass NULL buffers. Also, _nm_utils_inet[46]_ntop() are inline functions and the compiler can get rid of them. We should consistently use the same variant of the helper. The only downside is that the "good" name is already taken. The leading underscore is rather ugly and inconsistent. Also, with our internal variants we can use "static array indices in function parameter declarations" next. Thereby the compiler helps to ensure that the provided buffers are of the right size.
* ifcfg-rh: avoid creaing route file twice in make_ip4_setting()Thomas Haller2020-01-161-16/+17
| | | | | | | | | Just read the content once. It's wasteful to read the file twice while parsing. But what is worse, the file content can change any time we read it. We make decisions based on what we read, and hence we should only read the file once in the parsing process to get one consistent result.
* ifcfg-rh: expose constructor for shvarFile that doesn't read content from fileThomas Haller2020-01-162-26/+46
|
* ifcfg-rh: split reading file and parsing from read_route_file() functionThomas Haller2020-01-161-21/+46
| | | | | | | | | | Split the parsing of the file content to a separate function. Next we will load IPv4 files only once, and thus only need to parse the content without reading it. Note that the function temporarily modifies the input buffer, but restores the original content before returning.
* ifcfg-rh: split reading file and parsing in ↵Thomas Haller2020-01-162-4/+19
| | | | | | | | | | | | utils_has_route_file_new_syntax() function We will need both variants, so that the caller can read the file only once. Note that also utils_has_route_file_new_syntax_content() will restore the original contents and not modify the input (from point of view of the caller). In practice it will momentarily modify the content.
* ifcfg-rh: don't use GRegex in utils_has_route_file_new_syntax()Thomas Haller2020-01-161-14/+34
| | | | | It's simple enough to iterate the file content line by line and search for a suitable prefix.
* ifcfg-rh/tests: add test for utils_has_route_file_new_syntax()Thomas Haller2020-01-161-0/+37
|
* ifcfg-rh: add support for VRF slavesBeniamino Galvani2020-01-144-1/+24
| | | | | | Even if the ifcfg-rh plugin doesn't support VRF connections, it must be able to read and write other connection types that have a VRF master.
* libnm/keyfile: build keyfile code as separate GPL licensed internal libraryThomas Haller2020-01-075-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Keyfile support was initially added under GPL-2.0+ license as part of core. It was moved to "libnm-core" in commit 59eb5312a5d6 ('keyfile: merge branch 'th/libnm-keyfile-bgo744699''). "libnm-core" is statically linked with by core and "libnm". In the former case under terms of GPL-2.0+ (good) and in the latter case under terms of LGPL-2.1+ (bad). In fact, to this day, "libnm" doesn't actually use the code. The linker will probably remove all the GPL-2.0+ symbols when compiled with gc-sections or LTO. Still, linking them together in the first place makes "libnm" only available under GPL code (despite the code not actually being used). Instead, move the GPL code to a separate static library "shared/nm-keyfile/libnm-keyfile.la" and only link it to the part that actually uses the code (and which is GPL licensed too). This fixes the license violation. Eventually, it would be very useful to be able to expose keyfile handling via "libnm". However that is not straight forward due to the licensing conflict. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/381
* agent-manager: fix races registering secret agent and track auth-chain per agentThomas Haller2019-12-313-95/+91
| | | | | | | | | | | | | | | | | | | | | | We don't need a separate "GSList *chains" to track the NMAuthChain requests for the agents. Every agent should only have one auth-chain in fly at any time. We can attach that NMAuthChain to the secret-agent. Also, fix a race where: 1) A secret agent registers. We would start an auth-chain check, but not yet track the secret agent. 2) Then the secret agent unregisters. The unregistration request will fail, because the secret agent is not yet in the list of fully registered agents. The same happens if the secret agent disconnects at this point. agent_disconnect_cb() would not find the secret agent to remove. 3) afterwards, authentication completes and we register the secret-agent, although we should not. There is also another race: if we get authority_changed_cb() we would not restart the authentication for the secret-agent that is still registering. Hence, we don't know whether the result once it completes would already contain the latest state.
* agent-manager: move and inline _agent_remove_by_owner() to ↵Thomas Haller2019-12-311-17/+6
| | | | impl_agent_manager_unregister()
* agent-manager: disconnect agent_disconnected_cb handler from secret-agentThomas Haller2019-12-311-3/+5
| | | | | Also, we don't need to use _agent_remove_by_owner(). We know now the agent to be removed.
* agent-manager: pass agent-manager to maybe_remove_agent_on_error() and don't ↵Thomas Haller2019-12-311-8/+12
| | | | | | | | | | lookup by name Don't access the singleton getter here. Pass the agent-manager argument instead to maybe_remove_agent_on_error(). Also, don't lookup the agent by name. We already know, whether the agent is still tracked or not. Look at agent->agent_lst.
* agent-manager: let nm_settings_connection_check_permission() check all ↵Thomas Haller2019-12-313-26/+24
| | | | | | | | | | | secret-agents searching for permission nm_agent_manager_get_agent_by_user() would only return the first matching secret agent for the user. This way, we might miss an agent that has permissions. Instead, add nm_agent_manager_has_agent_with_permission() and search all agents.
* agent-manager: track secret agents with CList instead of hash tableThomas Haller2019-12-313-76/+100
| | | | | | | | | | | | | | | There was literally only one place where we would make use of O(1) lookup of secret-agents: during removal. In all other cases (which are the common cases) we had to iterate the known agents. CList is more efficient and more convenient to use when the main mode of operation is iterating. Also note that handling secret agents inevitably scales linear with the number of agents. That is, because for every check we will have to sort the list of agents and send requests to them. It would be very complicated (and probably less efficient for reasonable numbers of secret agents) to avoid O(n).
* agent-manager: expose NMSecretAgent struct in header for tight coupling with ↵Thomas Haller2019-12-312-11/+19
| | | | | | | | | | | | | NMAgentManager NMAgentManager and NMSecretAgent work closely together. In particular, the NMAgentManager creates and tracks the NMSecretAgents and controls it. Move NMSecretAgent struct to the header, so that some fields may become accessible to NMAgentManager. In particular, we will track secret agents with a CList, and this CList element can be embedded in the NMSecretAgent structure.
* agent-manager/trivial: rename CList fields to track Request instancesThomas Haller2019-12-311-15/+15
|
* agent-manager: don't handle failure of nm_secret_agent_new() in ↵Thomas Haller2019-12-311-6/+0
| | | | | | agent_manager_register_with_capabilities() This never fails. There is no need to handle an "error".
* agent-manager: use cleanup macro for subject in ↵Thomas Haller2019-12-311-2/+1
| | | | | | agent_manager_register_with_capabilities() More cleanup macros.
* agent-manager: drop unused error handling in ↵Thomas Haller2019-12-311-12/+4
| | | | | | agent_manager_register_with_capabilities() nm_auth_chain_new_subject() cannot fail.
* shared: nm-auth-subject: add unix-session typeAntonio Cardace2019-12-242-5/+6
|
* shared: move nm-dbus-auth-subject to shared/nm-libnm-core-internAntonio Cardace2019-12-244-7/+7
| | | | | | | | Move it to shared as it's useful for clients as well. Move and rename nm_dbus_manager_new_auth_subject_from_context() and nm_dbus_manager_new_auth_subject_from_message() in nm-dbus-manager.c as they're needed there.
* ifcfg-rh: remove calls to svUnsetAll()Thomas Haller2019-12-211-26/+2
| | | | | We no longer need to explicitly clear values. Those that we don't set, will be cleared automatically.
* ifcfg-rh: treat base name as numbered tag and fix detection of NETMASKThomas Haller2019-12-212-21/+37
| | | | | | | | | | | | | | | | | We call svFindFirstNumberedKey() to check whether we have any NETMASK set. Since commit 9085c5c3a9c2 ('ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding NETMASK') that function would no longer find the "NETMASK" without number. Fix that, by letting nms_ifcfg_rh_utils_is_numbered_tag() return TRUE for the tag itself. This also makes more sense, because it matches our common understanding what numbered tags are. Adjust the other callers that don't want this behavior to explicitly check. Fixes: 9085c5c3a9c2 ('ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding NETMASK')
* ifcfg-rh: add index for O(1) access of variables in shvarFileThomas Haller2019-12-211-49/+88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously, setting or getting a variable required to scan all lines. Note that frequently we would look up variables that didn't actually exist, which we could only determine after searching the entire list. Also, since we needed to handle having the same variable specified multiple times (where the last occurrence wins), we always had to search all keys and couldn't stop when finding the first key. Well, technically we could have searched in reverse order for the getter, but that wasn't done. For the setter we wanted to delete all but the last occurrences, so to find them, we really had to search them all. We want to support profiles with hundreds or thousands of addresses and routes. This does not scale well. Add an hash table to find the variables in constant time. Test this commit and the parent commit: $ git clean -fdx && CFLAGS=-O2 ./autogen.sh --with-more-asserts=0 && ./tools/run-nm-test.sh -m src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh && perf stat -r 50 -B src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh 1>/dev/null Before: Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs): 330.94 msec task-clock:u # 0.961 CPUs utilized ( +- 0.33% ) 0 context-switches:u # 0.000 K/sec 0 cpu-migrations:u # 0.000 K/sec 1,081 page-faults:u # 0.003 M/sec ( +- 0.07% ) 1,035,923,116 cycles:u # 3.130 GHz ( +- 0.29% ) 1,800,084,022 instructions:u # 1.74 insn per cycle ( +- 0.01% ) 362,313,301 branches:u # 1094.784 M/sec ( +- 0.02% ) 6,259,421 branch-misses:u # 1.73% of all branches ( +- 0.13% ) 0.34454 +- 0.00116 seconds time elapsed ( +- 0.34% ) Now: Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs): 329.78 msec task-clock:u # 0.962 CPUs utilized ( +- 0.39% ) 0 context-switches:u # 0.000 K/sec 0 cpu-migrations:u # 0.000 K/sec 1,084 page-faults:u # 0.003 M/sec ( +- 0.05% ) 1,036,130,698 cycles:u # 3.142 GHz ( +- 0.13% ) 1,799,851,979 instructions:u # 1.74 insn per cycle ( +- 0.01% ) 360,374,338 branches:u # 1092.756 M/sec ( +- 0.01% ) 6,160,796 branch-misses:u # 1.71% of all branches ( +- 0.08% ) 0.34287 +- 0.00133 seconds time elapsed ( +- 0.39% ) So, not much difference. But this is not surprising, because test-ifcfg-rh loads and writes predominantly ifcfg files with few variables. The difference should be visible when having large files.
* ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for ↵Thomas Haller2019-12-213-7/+5
| | | | | | | | | finding NETMASK svFindFirstKeyWithPrefix() only had one caller: to find whether there are any NETMASK variables set. NETMASK is a numbered variable, so we should only find variables that indeed follow the pattern. Since there was only one caller, rename and repurpose the function.
* ifcfg-rh: remove explicit svUnsetValue() calls and rely on automatic removal ↵Thomas Haller2019-12-211-266/+89
| | | | | | of unvisited keys Part 2 of previous commit. See there.