Commit Graph

22921 Commits

Author SHA1 Message Date
Thomas Haller
ca38ce95ee cli/dcb: merge handling NM_SETTING_DCB_PRIORITY_FLOW_CONTROL and NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH 2019-03-25 09:12:32 +01:00
Thomas Haller
fa4ed3ac0d cli/dcb: merge getter for dcb flags 2019-03-25 09:12:32 +01:00
Thomas Haller
d1016cfade cli/trivial: drop unused macro 2019-03-25 09:12:32 +01:00
Thomas Haller
da4648d48f cli: implement DEFINE_SETTER_STR_LIST() as _pt_multilist type 2019-03-25 09:12:32 +01:00
Thomas Haller
74f922b64f cli: implement str-list-multi properties as property type and not via macros
Instead of using a macro to define the individual set/remove functions,
add a new property type _pt_multilist.

This way, we have more the concept of a property having a type, instead
of a property having a set of handlers how to implement something.

Also, this is only the first step. There are several similar properties
that also can be implemented as the same type.
2019-03-25 09:12:32 +01:00
Thomas Haller
03502cf5bf cli/trivial: add code comment about nmc_value_transforms_register() 2019-03-25 09:12:32 +01:00
Thomas Haller
3c82db710f cli: reset default value of properties via set_fcn()
The property implementation must itself decide how to reset a value.
We must not rely on properties being plain GObject properties.

Let set_fcn() accept %NULL value to indicate resetting the default.
2019-03-25 09:12:32 +01:00
Thomas Haller
20afdeb19a cli: let DEFINE_REMOVER_INDEX_OR_VALUE_DIRECT handle static value list
Previously we had DEFINE_REMOVER_INDEX_OR_VALUE_DIRECT() and
DEFINE_REMOVER_INDEX_OR_VALUE_VALIDATING_STATIC().

Note that all property-infos of DEFINE_REMOVER_INDEX_OR_VALUE_VALIDATING_STATIC()
would also define values_static list, while DEFINE_REMOVER_INDEX_OR_VALUE_DIRECT()
would not.

Merge the two macros. The property-info should define how the
implementation behaves, we should not have two implementations.
2019-03-25 09:12:32 +01:00
Thomas Haller
f933fb3cfb cli: validate remove_fcn() for NM_SETTING_802_1X_EAP against allowed values
set_fcn() of NM_SETTING_802_1X_EAP is implemented via
DEFINE_SETTER_STR_LIST_MULTI() -- thus, considering valid values
from the static list.

The remove_fcn() should do that too, to be consistent.
2019-03-25 09:12:32 +01:00
Thomas Haller
18c22443f3 cli: reuse property info in DEFINE_REMOVER_INDEX_OR_VALUE_VALIDATING_STATIC()
The property-info already tracks the "values_static" list. No need to pass
it on redundantly.
2019-03-25 09:12:32 +01:00
Thomas Haller
10aa2fafab cli: directly define setter function via DEFINE_SETTER_STR_LIST_MULTI()
We don't need DEFINE_SETTER_STR_LIST_MULTI() to define a static function
that is called by the set_fcn() implementation. Instead, let the macro
define the actual set_fcn() function.
2019-03-25 09:12:32 +01:00
Thomas Haller
70c99d176b cli: merge property implementations for vlan.ingress-priority-map and egress-priority-map 2019-03-25 09:12:32 +01:00
Thomas Haller
67b64ce868 cli: minor cleanup parsing dcb priorities 2019-03-25 09:12:32 +01:00
Thomas Haller
d8043664eb cli: use cleanup attributes in "nm-meta-setting-desc.c" 2019-03-25 09:12:32 +01:00
Thomas Haller
2b20b13e27 cli: don't use bogus error domains for GError 2019-03-25 09:12:32 +01:00
Thomas Haller
2bc29453bd cli: avoid unnecessary string clones for stripping whitespace for property values 2019-03-25 09:12:32 +01:00
Thomas Haller
649968632e cli: merge remove-property, reset-property and set-property
It's fundamentally wrong to have separate "remove_fcn" and "set_fcn"
implementations. Set, reset, add, and remove are all similar, and should
be implemented in a similar manner.

Merge the implementations all in set-property, which now can:

 - reset the value (value == NULL && modifier == '\0')
 - set a value     (value != NULL && modifier == '\0')
 - add a value     (value != NULL && modifier == '+')
 - remove a value  (value != NULL && modifier == '-')

The real problem is that remove_fcn() behaves fundamentally different
from set_fcn(). You can do "+setting.property value1,value2" but you
cannot remove them the same way. That is because most remove_fcn()
implementations don't expect a list of values. But it's also because of
the unnatural split between set_fcn() and remove_fcn().

The next commit will merge set_fcn(), remove_fcn() and reset property.
This commit just merges them all in nmc_setting_set_property().
2019-03-25 09:12:32 +01:00
Thomas Haller
de93bc0712 cli: don't use nmc_property_get_gvalue() in ipv4_method_changed_cb()
ipv4_method_changed_cb() and ipv6_method_changed_cb() are horrible hacks, as they
use a static variable to cache the previous value.

Anyway, don't fix that now.

We are going to drop nmc_property_get_gvalue()/nmc_property_set_gvalue()
because that works only with GObject based properties -- and having this
API around wrongly suggests it works in general. Use the native types
directly.
2019-03-25 09:12:32 +01:00
Thomas Haller
f24ada398a cli: drop nmc_property_set_default_value()
It's wrong to pretend that all properties are GObject based. Drop
nmc_property_set_default_value() and use nmc_setting_reset_property()
instead.
2019-03-25 09:12:32 +01:00
Thomas Haller
7b5d514aef cli: implement nmc_setting_reset_property() based on nmc_setting_set_property()
"reset" is just a special case of "set". We can keep nmc_setting_reset_property() as a convenience
function, but it must be implemented based on nmc_setting_set_property().

Also, reset only used nmc_property_set_default_value(), which only works
with GObject based properties. It's wrong to assume that all properties
are GObject based. By implementing it based via nmc_setting_set_property()
we can fix this (later).
2019-03-25 09:12:32 +01:00
Thomas Haller
cb5a81399a cli: don't interpret value as index too early for nmc_setting_remove_property_option()
Not all implementations support having the value being an index.
For example, the implementations that are done via DEFINE_REMOVER_OPTION() macro.

The meaning of the "value" string must not be determined by
nmc_setting_remove_property_option(). It's up to the implementation
to decide whether to allow an index and how to interpret it.
2019-03-25 09:12:32 +01:00
Thomas Haller
d3cfe20598 cli: support removing multiple vlan ingress/egress priority mappings
$ nmcli connection add type vlan autoconnect no con-name v dev vlan.1 id 1
    $ nmcli connection modify v +vlan.ingress-priority-map 1:2,2:3
    $ nmcli connection modify v +vlan.ingress-priority-map 2:3,4:5
    $ nmcli connection modify v -vlan.ingress-priority-map 1:2,4:5
    Warning: only one mapping at a time is supported; taking the first one (1:2)
2019-03-25 09:12:32 +01:00
Thomas Haller
626aed64e7 cli: don't fail removing non-existing option (pt6)
Part 6, which addresses the issue for VLAN priority maps.
2019-03-25 09:12:32 +01:00
Thomas Haller
eff01cd256 cli: don't fail removing non-existing option (pt5)
Part 5, which addresses the issue for DEFINE_REMOVER_OPTION(),
which are simple properties.
2019-03-25 09:12:32 +01:00
Thomas Haller
6baaa20763 cli: don't fail removing non-existing option (pt4)
Part 4, which addresses the issue for properties that have
complex values.
2019-03-25 09:12:32 +01:00
Thomas Haller
936912cad0 cli: don't fail removing non-existing option (pt3)
Part 3, which addresses the issue for properties that have
a simple validation function.
2019-03-25 09:12:32 +01:00
Thomas Haller
83fb6bcb42 cli: don't fail removing non-existing option (pt2)
Part 2, which addresses the issue for properties with a static
list of valid values.
2019-03-25 09:12:32 +01:00
Thomas Haller
0055d8ed58 cli: don't fail removing non-existing option (pt1)
Part 1, which addresses the issue for simple properties that have
a plain remove-by-value function.

Rationale:

Removing a value/index that does not exist should not be a failure.

Woule you like:

    $ nmcli connection modify "$PROFILE" autoconnect no
    $ nmcli connection modify "$PROFILE" autoconnect no
    Error: autoconnect is already disabled

So, why would it be a good idea to fail during

    $ nmcli connection modify "$PROFILE" -vpn.data ca
    $ nmcli connection modify "$PROFILE" -vpn.data ca
    Error: failed to remove a value from vpn.data: invalid option 'ca'.

Generally, it should not be an error to remove an option, as long
as the option itself is valid. For example,

    $ nmcli connection modify "$PROFILE" -vlan.ingress-priority-map bogus

should fail, but

    $ nmcli connection modify "$PROFILE" -vlan.ingress-priority-map 1:5

should succeed even if there was nothing to remove.
2019-03-25 09:12:32 +01:00
Thomas Haller
d178c25728 libnm,cli: move cleanup macros to "shared/nm-libnm-core-utils.h" 2019-03-25 09:12:32 +01:00
Thomas Haller
25ef45ff3d libnm/cli: support deleting VLAN egress/ingress priority map by "from"
The "from" part is like a key for the egress/ingress priority map.

Extend nm_setting_vlan_remove_priority_str_by_value() to accept only the
"from" part when finding and deleting value. This allows for:

    $ nmcli connection modify "$PROFILE" -vlan.ingress-priority-map '4:'
    $ nmcli connection modify "$PROFILE" -vlan.ingress-priority-map '4:*'

to fuzzy match the value to remove.
2019-03-25 09:12:32 +01:00
Thomas Haller
bb4e5a7a62 cli: don't treat empty string as valid number in nmc_string_to_uint_base()
How hard can it be to use strtol()? Apparently very. You need to check
errno, the endpointer, and also not pass in an empty string.

Previously, nmc_string_to_uint_base() would silently accept "" as valid
number. That's a bug.

Btw, let's not use strtol() (or nmc_string_to_uint*()). We have
_nm_utils_ascii_str_to_int64(), which gets all of this right.
2019-03-25 09:12:32 +01:00
Thomas Haller
b56e430da9 cli: reuse nm_utils_vlan_priority_map_parse_str() in _parse_vlan_priority_maps() 2019-03-25 09:12:32 +01:00
Thomas Haller
5079cd9942 libnm: move parsing VLAN priority mapping to "shared/nm-libnm-core-utils.h"
The same code is used by nmcli. Obviously, clients also need to
parse string representations.

That begs the question whether this should be public API of libnm.
Maybe, but don't decide that now, just reuse the code internally via
"shared/nm-libnm-core-utils.h".
2019-03-25 09:12:32 +01:00
Thomas Haller
d0f1e68b3e shared: add "shared/nm-libnm-core-utils.h" utils
We have code in "shared/nm-utils" which are general purpose
helpers, independent of "libnm", "libnm-core", "clients" and "src".

We have shared code like "shared/nm-ethtool-utils.h" and
"shared/nm-meta-setting.h", which is statically linked, shared
code that contains libnm related helpers. But these helpers already
have a specific use (e.g. they are related to ethtool or NMSetting
metadata).

Add a general purpose helper that:

 - depends (and extends) libnm-core

 - contains unrelated helpers

 - can be shared (meaning it will be statically linked).

 - this code can be used by any library user of "libnm.so"
   (nmcli, nm-applet) and by "libnm-core" itself. Thus, "src/"
   and "libnm/" may also use this code indirectly, via "libnm-core/".
2019-03-25 09:12:32 +01:00
Thomas Haller
aaaccfd264 libnm: refactor parsing of NMVlanQosMapping and support wildcard for "to"
- avoid the memory allocations by not using g_strsplit().

- add a helper function priority_map_parse_str(). This will
  be used later, to avoid allocating a NMVlanQosMapping
  result, when we don't need it on the heap.

- for the priority mappings, the "from" part is the key and must
  be unique. As such, it would make sense to say

    $ nmcli connection modify "$PROFILE" -vlan.ingress-priority-map '1:*'

  or

    $ nmcli connection modify "$PROFILE" -vlan.ingress-priority-map '1:'

  to delete any mapping for that priority, regardless of the "to" part.
  Add an option to leave the "to" part unspecified. This will be used
  later.
2019-03-25 09:12:32 +01:00
Thomas Haller
395738900f libnm: don't use strlen() for checking for non-empty string
It's well understood that these are NUL terminated strings.
We don't need strlen() to check that the strings aren't
empty.
2019-03-25 09:12:32 +01:00
Thomas Haller
731d251cc0 shared: don't implement nm_utils_parse_inaddr() based on nm_utils_parse_inaddr_bin()
nm_utils_parse_inaddr() is trivial enough to reimplement it, instead of calling
nm_utils_parse_inaddr_bin(). Calling nm_utils_parse_inaddr_bin() involves several
things that don't matter for nm_utils_parse_inaddr() -- like assigning
out_addr_family or returning the binary address.
2019-03-25 09:12:32 +01:00
Thomas Haller
e187bd08fe cli: fix leaking error variables setting vfs, qdiscs and tfilters 2019-03-25 09:12:32 +01:00
Thomas Haller
4e7eadd6d3 cli: fix appending team link-watchers
The set_fcn() function is supposed to only append. For the set-all
mode, the caller ensures to clear the array first.
2019-03-25 09:12:32 +01:00
Thomas Haller
c7864fc1b2 libnm/team: merge branch 'th/libnm-team-fixes'
https://github.com/NetworkManager/NetworkManager/pull/318
2019-03-25 08:09:29 +01:00
Thomas Haller
2a93ce9122 libnm/team: preserve unset priv->runner_tx_hash in _align_team_properties()
There is a difference between an unset JSON array element and an empty
one. Don't loose that information.
2019-03-24 09:21:14 +01:00
Thomas Haller
5478853a0b libnm/team: check for changes to team:runner-tx-hash in _align_team_properties()
We will need to emit property changed signals. For that we need to know
whether the property changes. Compare it.
2019-03-24 09:21:14 +01:00
Thomas Haller
9d2a15514a libnm/team: add function to compare list of link-watchers 2019-03-24 09:21:14 +01:00
Thomas Haller
265864952d libnm/team: simplify handling in _nm_utils_team_config_set()
- use nm_auto_decref_json for "json_value" to indicate ownership
  transfer.
- don't reuse variable json_element and json_link to construct
  watchers list. It's confusing. In general, use different variables
  for different purposes.
2019-03-24 09:21:14 +01:00
Thomas Haller
0cff18e055 libnm/team: indicate whether there were changes in _nm_utils_team_config_set() 2019-03-24 09:21:13 +01:00
Thomas Haller
f84323bf47 libnm/team: return early from _nm_utils_team_config_set() 2019-03-24 09:21:13 +01:00
Thomas Haller
00b0dfb5df libnm/team: avoid assertions parsing JSON of invalid type
_nm_utils_team_config_get() determines the type based on the JSON content.
Hence, the caller must validate that the returned GValue is of the expected
type, or it will trigger an assertion/crash.
2019-03-24 09:21:13 +01:00
Thomas Haller
3b69816ed6 libnm/team: fix memleaks in getting json values
Use nm_auto*, it's almost always harder to get wrong, because
ownership (and lifetime management of a variable, and what it points
to) is more clearly expressed.
2019-03-24 09:21:13 +01:00
Thomas Haller
1283d9d321 libnm/team: minor coding style cleanup 2019-03-24 09:21:13 +01:00
Thomas Haller
047adae242 libnm/team: fix crash with nm_setting_team_remove_runner_tx_hash_by_value() having no runner_tx_hash array 2019-03-24 09:21:13 +01:00