summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
...
* | platform: pass full route object to platform delete functionThomas Haller2017-07-259-237/+208
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Contrary to addresses, routes have no ID. When deleting a route, you cannot just specify certain properties like network/plen,metric. Well, actually you can specify only certain properties, but then kernel will treat unspecified properties as wildcard and delete the first matching route. That is not something we want, because we need to be in control which exact route shall be deleted. Also, rtm_tos *must* match. Even if we like the wildcard behavior, we would need to pass TOS to nm_platform_ip4_route_delete() to be able to delete routes with non-zero TOS. So, while certain properties may be omitted, some must not. See how test_ip4_route_options() was broken. For NetworkManager it only makes ever sense to call delete on a route, if the route is already fully known. Which means, we only delete routes that we have already in the platform cache (otherwise, how would we know that there is something to delete). Because of that, no longer have separate IPv4 and IPv6 functions. Instead, have nm_platform_ip_route_delete() which accepts a full NMPObject from the platform cache. The code in core doesn't jet make use of this new functionality. It will in the future. At least, it fixes deleting routes with differing TOS.
* | platform: fix return value for do_delete_object()Thomas Haller2017-07-252-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | The return value for the delete methods checks whether the object is actually deleted. That is questionable behavior, because if the netlink request succeeds, there is little point in checking with the platform cache. As it is, it is racy. Anyway, the previous value was totally wrong. But it also uncovers another platform bug, which currently breaks route tests. Will be fixed next.
* | platform: refactor nm_platform_ip4_address_sync()Thomas Haller2017-07-258-229/+297
| | | | | | | | | | | | | | To reuse array of NMPObject instances instead of creating a GArray clone. Also get rid of the nm_platform_ipx_address_get_all() functions.
* | core: cache GVariant for NMIP4Config/NMIP6Config's "route-data" and "routes"Thomas Haller2017-07-252-97/+117
| |
* | core: track addresses for NMIP4Config/NMIP6Config via NMDedupMultiIndexThomas Haller2017-07-2519-818/+1110
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Reasons: - it adds an O(1) lookup index for accessing NMIPxConfig's addresses. Hence, operations like merge/intersect have now runtime O(n) instead of O(n^2). Arguably, we expect low numbers of addresses in general. For low numbers, the O(n^2) doesn't matter and quite likely in those cases the previous implementation was just fine -- maybe even faster. But the simple case works fine either way. It's important to scale well in the exceptional case. - the tracked objects can be shared between the various NMPI4Config, NMIP6Config instances with NMPlatform and everybody else. - the NMPObject can be treated generically, meaning it enables code to handle both IPv4 and IPv6, or addresses and routes. See for example _nm_ip_config_add_obj(). - I want core to evolve to somewhere where we don't keep copies of NMPlatformIP4Address, et al. instances. Instead they shall all be shared. I hope this will reduce memory consumption (although tracking a reference consumes some memory too). Also, it shortcuts nmp_object_equal() when comparing the same object. Calling nmp_object_equal() on the identical objects would be a common case after the hash function pre-evaluates equality.
* | core: rename self argument for NMIP4Config and NMIP6ConfigThomas Haller2017-07-254-618/+618
| | | | | | | | | | The @config name is inconsistent. We name the self argument commonly @self.
* | route-manager: fix timeout for cleanup device-route monitoringThomas Haller2017-07-251-2/+2
| | | | | | | | | | | | The timeout was wrongly set to a huge number, and would never hit. This leaked some data, that we could instead clean up. It's not serious however.
* | connectivity: fix memory leakBeniamino Galvani2017-07-191-0/+1
| | | | | | | | Fixes: 9d43869e473b47542520c807dace93a6f9520964
* | core: fix detection of relevant changes in nm_ipX_config_replace()Beniamino Galvani2017-07-172-2/+6
| | | | | | | | | | | | | | | | | | | | | | The @relevant_changes output value must match the result of !nm_ipX_config_equal(), so route metric and gateway must be taken into account too. Fixes: 935411e5c03dcb62d5b2a85e67bf3220c75d0f5e Fixes: cfd1851c0067773211524c2b648330b6ee7a066c https://bugzilla.redhat.com/show_bug.cgi?id=1471244
* | dns: perform the public-suffix check only for the hostname-derived domainBeniamino Galvani2017-07-171-9/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The DNS manager drops from the search list domains that are public suffixes to prevent a possible domain hijack when using two-labels hostnames [1]. This is a problem now that every single-label domain can be a TLD since this means that such domains can't be used in the search list. While it's useful to apply such restriction to the domain automatically derived from the system hostname, it seems wrong to drop domains specified by users in the configuration or provided by DHCP. This commit keeps the public-suffix check only for the hostname-derived domain [1] https://bugzilla.redhat.com/show_bug.cgi?id=812394 https://bugzilla.redhat.com/show_bug.cgi?id=1404350
* | core: fix route synchronizationBeniamino Galvani2017-07-151-1/+3
| | | | | | | | Fixes: 667c50f5d920e91d798d51c61e63e3ce87e277d3
* | core: fix heap overflow accessing NMIP4Config's idx_ip4_routesThomas Haller2017-07-102-2/+8
| | | | | | | | | | | | and NMIP6Config. Fixes: 935411e5c03dcb62d5b2a85e67bf3220c75d0f5e
* | dhcp/tests: add test parsing dhclient configThomas Haller2017-07-101-8/+62
| |
* | dhcp/dhclient: improve "interface" statement parsingJonathan Kang2017-07-101-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In commit d405cfd9089f9552969e6a3e1a1c4550fc3c1695, parsing "interface" statement is introduced. But it leads to uncommplete parsing of the "request" entry, if one of the lines in "request" entry is prefixed with word "interface". For example, the default configuration of openSUSE distribution: request subnet-mask, broadcast-address, routers, rfc3442-classless-static-routes, interface-mtu, host-name, domain-name, domain-search, domain-name-servers, nis-domain, nis-servers, nds-context, nds-servers, nds-tree-name, netbios-name-servers, netbios-dd-server, netbios-node-type, netbios-scope, ntp-servers; Fixes: d405cfd9089f9552969e6a3e1a1c4550fc3c1695 https://bugzilla.opensuse.org/show_bug.cgi?id=1047004 https://mail.gnome.org/archives/networkmanager-list/2017-July/msg00015.html
* | platform: refactor NMPObject cast macros using _Generic()th/dedup-multi-bgo784220Thomas Haller2017-07-055-39/+32
| | | | | | | | This way, we also accept void pointers, while preserving constness.
* | platform: refactor nm_platform_link_get_all() to return GPtrArrayThomas Haller2017-07-055-61/+74
| | | | | | | | | | Instead of doing a full clone, return a pointer array (with references owned). The NMPlatformLink instances are now immutable.
* | platform: move link accessors to NMPlatform base classThomas Haller2017-07-057-538/+538
| | | | | | | | | | | | | | | | | | | | | | | | and refactor NMFakePlatform to also track links via NMPCache. For one, now NMFakePlatform also tests NMPCache, increasing the coverage of what we care about. Also, all our NMPlatform implementations now use NMPObject and NMPCache. That means, we can expose those as part of the public API. Which is great, because callers can keep a reference to the NMPObject object and make use of generic functions like nmp_object_to_string().
* | platform: refactor fake platform to use NMPCache for addressesThomas Haller2017-07-055-266/+140
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | And move some code from NMLinuxPlatform to NMPlatform, where it belongs. The advantage is that we reuse (and test!) the NMPCache implementation for tracking addresses. Also, we now always expose proper NMPObjects from both linux and fake platform. For example, obj = NMP_OBJECT_UP_CAST (nm_platform_ip4_address_get (...)); will work as expected. Also, the caller is now by NMPlatform API allowed to take and keep a reference to the returned objects.
* | platform/trivial: rename cache-id-type indexesThomas Haller2017-07-052-12/+12
| |
* | platform: drop separate index for visible objectsThomas Haller2017-07-055-104/+48
| | | | | | | | | | | | | | | | | | | | Routes and addresses don't implement cmd_obj_is_visible(), hence they are always visible, and NMP_CACHE_ID_TYPE_OBJECT_TYPE_VISIBLE_ONLY is identical to NMP_CACHE_ID_TYPE_OBJECT_TYPE. Only link objects can be alive but invisible. Still, drop the index for looking up visible links entirely. Let callers do the filtering, if they care.
* | platform: reduce number of route indexesThomas Haller2017-07-059-77/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Maintaining an index is expensive.Not so much in term of runtime, but in term of memory. Drop some indexes, and require the caller to use a more broad index (and filter out unwanted elements). Dropped: - can no longer lookup visible default-routes by ifindex. If you care about default-routes, lookup all and search for the desired ifindex. The overall number of default-routes is expected to be small. We drop NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_IFINDEX_WITH_DEFAULT entirely. - no longer have a separate index for non-default routes. We expect that the most routes are non-default routes. So, don't have an index without default-routes, instead let the caller just lookup all routes, and reject default-routes themself. We keep NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_BY_DEFAULT, but it now no longer tracks non-default routes. This drops 1 out of 6 route indexes, and modifes another one, so that we expect that there are almost no entires tracked by it.
* | platform: drop nm_platform_ip6_route_get_all()Thomas Haller2017-07-054-99/+23
| | | | | | | | | | We no longer need a full clone of routes. The only remaining uses are in test code. Rework it.
* | platform: refactor nm_dedup_multi_objs_to_ptr_array_head()Thomas Haller2017-07-051-23/+3
| | | | | | | | | | | | | | by moving the core functionality to "nm-dedup-multi.c". As the ref-counting mechanism now is part of "nm-dedup-multi.c", this works better and is reusable outside of platform.
* | core: refactor NMIP6Config to use dedup-index for IPv6 routesThomas Haller2017-07-059-204/+366
| |
* | core: remove NMDedupMultiBox object and track NMDedupMultiObj instances directlyThomas Haller2017-07-055-145/+147
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Implement the reference counting of NMPObject as part of NMDedupMultiObj and get rid of NMDedupMultiBox. With this change, the NMPObject is aware in which NMDedupMultiIndex instance it is tracked. - this saves an additional GSlice allocation for the NMDedupMultiBox. - it is immediately known, whether an NMPObject is tracked by a certain NMDedupMultiIndex or not. This saves an additional hash lookup. - previously, when all idx-types cease to reference an NMDedupMultiObj instance, it was removed. Now, a tracked objects stays in the NMDedupMultiIndex until it's last reference is deleted. This possibly extends the lifetime of the object and we may reuse it better. - it is no longer possible to add one object to more then one NMDedupMultiIndex instance. As we anyway want to have only one instance to deduplicate the objects, this is fine. - the ref-counting implementation is now part of NMDedupMultiObj. Previously, NMDedupMultiIndex could also track objects that were not ref-counted. Hoever, the object anyway *must* implement the NMDedupMultiObj API, so this flexibility is unneeded and was not used. - a downside is, that NMPObject grows by one pointer size, even if it isn't tracked in the NMDedupMultiIndex. But we really want to put all objects into the index for sharing and deduplication. So this downside should be acceptable. Still, code like nmp_object_stackinit*() needs to handle a larger object.
* | core: avoid cloning platform routes but iterate the cache directlyThomas Haller2017-07-0512-160/+392
| |
* | platform: track routes in NMFakePlatform via NMPCacheThomas Haller2017-07-055-343/+219
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | NMPlatform's cache should be directly accessible to the users, at least the NMPLookup part and the fact that the cache contains ref-counted, immutable NMPObjects. This allows users to inspect the cache with zero overhead. Meaning, they can obtain an NMDedupMultiHeadEntry and iterate the objects themself. It also means, the are free to take and keep references of the NMPObject instances (of course, without modifying them!). NMFakePlatform will use the very same cache. The fake platform should only differ when modifying the objects. Another reason why this makes sense is because NMFakePlatform is for one a test-stup but also tests behavior of platform itself. Using a separate internal implementation for the caching is a pointless excecise, because only the real NMPCache's implementation really matters for production. So, either NMFakePlatform behaves idential, or it is buggy. Reuse it. Port fake platform's tracking of routes to NMPCache and move duplicate code from NMLinuxPlatform to the base class. This commit only ports IP routes, eventually also addresses and links should be tracked via the NMPCache instance.
* | platform: expose index lookup for objects in public APIThomas Haller2017-07-053-2/+86
| |
* | platform: expose emit-signal function from platformThomas Haller2017-07-053-82/+87
| | | | | | | | It will be used by NMFakePlatform too.
* | platform: move the NMPCache from linux platform to NMPlatformThomas Haller2017-07-053-82/+120
| | | | | | | | | | | | | | | | We want to expose the NMPLookup and NMDedupMultiHeadEntry to the users of NMPlatform, so that they can iterate the cache directly. That means, NMPCache becames an integral part of NMPlatform's API and must also be implemented by NMFakePlatform.
* | platform: add use-udev property for NMPlatformThomas Haller2017-07-053-6/+34
| | | | | | | | | | | | | | We want to move the multi_idx from NMLinuxPlatform to NMPlatform, so that it can be used by NMFakePlatform as well. For that, we need to know whether NMPlatform will use udev or not. Add a constrctor property.
* | platform: implement hash function for NMPlatformLnk typesThomas Haller2017-07-054-17/+197
| |
* | platform: fix nmp_object_hash() to include object typeThomas Haller2017-07-051-10/+7
| | | | | | | | | | | | NMPlatformLnkMacvtap is a typedef of NMPlatformLnkMacvlan, hence, their plobj implementation is idential. nmp_object_equal() already correctly compares the object type, so we should hash it too.
* | core: remove NMMultiIndexThomas Haller2017-07-053-936/+0
| | | | | | | | It's unused now.
* | platform: merge NMP_CACHE_ID_TYPE_ROUTES_BY_DESTINATION* indexThomas Haller2017-07-052-43/+21
| | | | | | | | | | In this case, not much is saved, because previously IPv4 and IPv6 routes had completely distinct indexes.
* | platform: merge NMP_CACHE_ID_TYPE_ROUTES_VISIBLE_*_DEFAULT indexesThomas Haller2017-07-052-79/+27
| | | | | | | | | | | | Maintaining an index is expensive. We can merge indexes that are strictly distinct, because one index can just partition the objects into distinct sets.
* | platform: use NMDedupMultiIndex for routes in NMPCacheThomas Haller2017-07-058-1301/+1695
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Rework platform object cache to use NMDedupMultiIndex. Already previously, NMPCache used NMMultiIndex and had thus O(1) for most operations. What is new is: - Contrary to NMMultiIndex, NMDedupMultiIndex preserves the order of the cached items. That is crucial to handle routes properly as kernel will replace the first matching route based on network/plen/metric properties. See related bug rh#1337855. Without tracking the order of routes as they are exposed by kernel, we cannot properly maintain the route cache. - All NMPObject instances are now treated immutable, refcounted and get de-duplicated via NMDedupMultiIndex. This allows to have a global NMDedupMultiIndex that can be shared with NMIP4Config and NMRouteManager. It also allows to share the objects themselves. Immutable objects are so much nicer. We can get rid of the update pre-hook callback, which was required previously because we would mutate the object inplace. Now, we can just update the cache, and compare obj_old and obj_new after the fact. - NMMultiIndex was treated as an internal of NMPCache. On the other hand, NMDedupMultiIndex exposes NMDedupMultiHeadEntry, which is basically an object that allows to iterate over all related objects. That means, we can now lookup objects in the cache and give the NMDedupMultiHeadEntry instance to the caller, which then can iterate the list on it's own -- without need for copying anything. Currently, at various places we still create copies of lookup results. That can be improved later. The ability to share NMPObject instances should enable us to significantly improve performance and scale with large number of routes. Of course there is a memory overhead of having an index for each list entry. Each NMPObject may also require an NMDedupMultiEntry, NMDedupMultiHeadEntry, and NMDedupMultiBox item, which are tracked in a GHashTable. Optimally, one NMDedupMultiHeadEntry is the head for multiple objects, and NMDedupMultiBox is able to deduplicate several NMPObjects, so that there is a net saving. Also, each object type has several indexes of type NMPCacheIdType. So, worst case an NMPlatformIP4Route in the platform cache is tracked by 8 NMPCacheIdType indexes, for each we require a NMDedupMultiEntry, plus the shared NMDedupMultiHeadEntry. The NMDedupMultiBox instance is shared between the 8 indexes (and possibly other).
* | platform: fix lookup of all routes unrestricted to an ifindexThomas Haller2017-07-051-2/+12
| | | | | | | | | | | | | | Need to use the right NMPCacheIdType when looking up routes across all ifindexes. Fixes: 8f9dac01ac01a6a401a101f264b4f280c9ad4b9d
* | platform/trivial: rename variableThomas Haller2017-07-051-94/+94
| |
* | platform: use NM_SET_OUT() macroThomas Haller2017-07-051-27/+16
| |
* | core: refactor NMIP4Config to use dedup-index for IPv4 routesThomas Haller2017-07-058-188/+410
| | | | | | | | | | | | | | | | | | | | | | | | Eventually, every NMPlatformIP4Route, NMPlatformIP6Route, NMPlatformIP4Address and NMPlatformIP6Address should be shared an deduplicated via the global NMDedupMultiIndex instance. As first proof of concept, refactor NMIP4Config to track IPv4 routes via the shared multi_idx. There is later potential for improvement, when we pass (deduplicated) NMPObject instances around instead of plain NMPlatformIP4Route, which needs still a lot of comparing and cloning.
* | core: pass NMDedupMultiIndex instance to NMIP4Config and otherThomas Haller2017-07-0531-135/+366
| | | | | | | | | | | | | | | | | | | | | | | | | | | | NMIP4Config, NMIP6Config, and NMPlatform shall share one NMDedupMultiIndex instance. For that, pass an NMDedupMultiIndex instance to NMPlatform and NMNetns. NMNetns than passes it on to NMDevice, NMDhcpClient, NMIP4Config and NMIP6Config. So currently NMNetns is the access point to the shared NMDedupMultiIndex instance, and it gets it from it's NMPlatform instance. The NMDedupMultiIndex instance is really a singleton, we don't want multiple instances of it. However, for testing, instead of adding a singleton instance, pass the instance explicitly around.
* | platform: let NMPObject implement NMDedupIndexObjThomas Haller2017-07-057-22/+228
| |
* | all: add base object type in "nm-obj.h"Thomas Haller2017-07-053-14/+68
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Platform has it's own, simple implementation of object types: NMPObject. Extract a base type and move it to "shared/nm-utils/nm-obj.h" so it can be reused. The base type is trival, but it allows us to implement other objects which are compatible with NMPObjects. Currently there is no API for generic NMObjBaseInst type, so compatible in this case only means, that they can be used in the same context (see example below). The only thing that you can do with a NMObjBaseInst is check it's NMObjBaseClass. Incidentally, NMObjBaseInst is also made compatible to GTypeInstance. It means, an NMObjBaseInst is not necessarily a valid GTypeInstance (like NMPObject is not), but it could be implemented as such. For example, you could do: if (NMP_CLASS_IS_VALID ((NMPClass *) obj->klass)) { /* is an NMPObject */ } else if (G_TYPE_CHECK_INSTANCE_TYPE (obj, NM_TYPE_SOMETHING)) { /* it a NMSometing GType */ } else { /* something else? */ } The reason why NMPObject is not implemented as proper GTypeInstance is because it would require us to register a GType (like g_type_register_fundamental). However, then the NMPClass struct can no longer be const and immutable memory. But we could. NMObjBaseInst may or may not be a GTypeInstance. In a sense, it's a base type of GTypeInstance and all our objects should be based on it (optionally, they we may make them valid GTypes too).
* | core: use NM_HASH_COMBINE() functionThomas Haller2017-07-052-26/+26
| |
* | platform: fix nm_platform_lnk_macvlan_cmp() to consider "tap" fieldThomas Haller2017-07-051-1/+2
| |
* | checkpoint: disconnect device before reactivation during rollbackBeniamino Galvani2017-07-051-0/+11
| | | | | | | | | | | | | | | | | | | | Since commit 0922a177385b ("manager: avoid that auto-activations preempt user activations") the manager doesn't allow a internal activation to disconnect the same connection already active on the device. Thus, during a rollback we must ensure that the device is deactivated before. Fixes: 0922a177385be188b9c9c8ad39c1068533f5a4b3
* | core,cli: replace wrong pattern for clearing GErrorBeniamino Galvani2017-06-272-3/+3
| | | | | | | | Use gs_free_error instead of gs_free.
* | Move CONF_DHCP definition to nm-hostname-manager.cMike Gorse2017-06-272-3/+3
| | | | | | | | | | | | | | | | | | It is only referenced from there. Fixes the build if HOSTNAME_PERSIST_SUSE is defined. Fixes: 5bfb7c3c89afe4da5b1ac2395391e9a986c722f0 https://bugzilla.gnome.org/show_bug.cgi?id=784225
* | bond: ignore miimon option only when it is zeroBeniamino Galvani2017-06-231-11/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The default value for miimon, when missing in the setting, is 0 if arp_interval is != 0, and 100 otherwise. So, when generating a connection, let's ignore miimon=0 (which means that miimon is disabled) and accept any other value. Adding miimon=100 does not cause any harm to the connection assumption. While at it, slightly improve the code: ignore_if_zero() is not useful for 'updelay','downdelay','arp_interval' because zero is their default value, so introduce a new function that checks if the value is the default (and specially handles 'miimon'). Reported-by: Taketo Kabe <rkabe@vega.pgw.jp> https://bugzilla.redhat.com/show_bug.cgi?id=1463077