diff options
| author | Michael Biebl <biebl@debian.org> | 2020-10-05 22:27:18 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2020-10-05 22:27:18 +0200 |
| commit | aafc1dbe4712c86189bbc1d4d54ad8cb4c69be7e (patch) | |
| tree | a2a9bb4d007339a0b1304540388230ccedac32bd /src/platform/nm-fake-platform.c | |
| parent | e7b44ef4c80907346ec7492a09c45277459924fc (diff) | |
New upstream version 1.27.90 upstream/1.27.90
Diffstat (limited to 'src/platform/nm-fake-platform.c')
| -rw-r--r-- | src/platform/nm-fake-platform.c | 2124 |
1 files changed, 1060 insertions, 1064 deletions
diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c index d9cf2de5..94c3f0e8 100644 --- a/src/platform/nm-fake-platform.c +++ b/src/platform/nm-fake-platform.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2012 - 2017 Red Hat, Inc. */ @@ -25,1380 +25,1376 @@ /*****************************************************************************/ typedef struct { - const NMPObject *obj; - char *udi; - struct in6_addr ip6_lladdr; + const NMPObject *obj; + char * udi; + struct in6_addr ip6_lladdr; } NMFakePlatformLink; typedef struct { - GHashTable *options; - GArray *links; + GHashTable *options; + GArray * links; } NMFakePlatformPrivate; struct _NMFakePlatform { - NMPlatform parent; - NMFakePlatformPrivate _priv; + NMPlatform parent; + NMFakePlatformPrivate _priv; }; struct _NMFakePlatformClass { - NMPlatformClass parent; + NMPlatformClass parent; }; -G_DEFINE_TYPE (NMFakePlatform, nm_fake_platform, NM_TYPE_PLATFORM) +G_DEFINE_TYPE(NMFakePlatform, nm_fake_platform, NM_TYPE_PLATFORM) -#define NM_FAKE_PLATFORM_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMFakePlatform, NM_IS_FAKE_PLATFORM, NMPlatform) +#define NM_FAKE_PLATFORM_GET_PRIVATE(self) \ + _NM_GET_PRIVATE(self, NMFakePlatform, NM_IS_FAKE_PLATFORM, NMPlatform) /*****************************************************************************/ -#define _NMLOG_PREFIX_NAME "platform-fake" -#define _NMLOG_DOMAIN LOGD_PLATFORM -#define _NMLOG(level, ...) _LOG(level, _NMLOG_DOMAIN, platform, __VA_ARGS__) - -#define _LOG(level, domain, self, ...) \ - G_STMT_START { \ - const NMLogLevel __level = (level); \ - const NMLogDomain __domain = (domain); \ - \ - if (nm_logging_enabled (__level, __domain)) { \ - char __prefix[32]; \ - const char *__p_prefix = _NMLOG_PREFIX_NAME; \ - NMPlatform *const __self = (self); \ - \ - if (__self && nm_platform_get_log_with_ptr (self)) { \ - g_snprintf (__prefix, sizeof (__prefix), "%s[%p]", _NMLOG_PREFIX_NAME, __self); \ - __p_prefix = __prefix; \ - } \ - _nm_log (__level, __domain, 0, NULL, NULL, \ - "%s: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \ - __p_prefix _NM_UTILS_MACRO_REST (__VA_ARGS__)); \ - } \ - } G_STMT_END +#define _NMLOG_PREFIX_NAME "platform-fake" +#define _NMLOG_DOMAIN LOGD_PLATFORM +#define _NMLOG(level, ...) _LOG(level, _NMLOG_DOMAIN, platform, __VA_ARGS__) + +#define _LOG(level, domain, self, ...) \ + G_STMT_START \ + { \ + const NMLogLevel __level = (level); \ + const NMLogDomain __domain = (domain); \ + \ + if (nm_logging_enabled(__level, __domain)) { \ + char __prefix[32]; \ + const char * __p_prefix = _NMLOG_PREFIX_NAME; \ + NMPlatform *const __self = (self); \ + \ + if (__self && nm_platform_get_log_with_ptr(self)) { \ + g_snprintf(__prefix, sizeof(__prefix), "%s[%p]", _NMLOG_PREFIX_NAME, __self); \ + __p_prefix = __prefix; \ + } \ + _nm_log(__level, \ + __domain, \ + 0, \ + NULL, \ + NULL, \ + "%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \ + __p_prefix _NM_UTILS_MACRO_REST(__VA_ARGS__)); \ + } \ + } \ + G_STMT_END /*****************************************************************************/ -static void link_changed (NMPlatform *platform, - NMFakePlatformLink *device, - NMPCacheOpsType cache_op, - const NMPObject *obj_old); - -static gboolean ipx_address_delete (NMPlatform *platform, - int addr_family, - int ifindex, - gconstpointer addr, - const guint8 *plen, - gconstpointer peer_addr); - -static gboolean ipx_route_delete (NMPlatform *platform, - int addr_family, - int ifindex, - const NMPObject *obj); - -static gboolean ip6_address_add (NMPlatform *platform, - int ifindex, - struct in6_addr addr, - guint8 plen, - struct in6_addr peer_addr, - guint32 lifetime, - guint32 preferred, - guint flags); -static gboolean ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, guint8 plen); +static void link_changed(NMPlatform * platform, + NMFakePlatformLink *device, + NMPCacheOpsType cache_op, + const NMPObject * obj_old); + +static gboolean ipx_address_delete(NMPlatform * platform, + int addr_family, + int ifindex, + gconstpointer addr, + const guint8 *plen, + gconstpointer peer_addr); + +static gboolean +ipx_route_delete(NMPlatform *platform, int addr_family, int ifindex, const NMPObject *obj); + +static gboolean ip6_address_add(NMPlatform * platform, + int ifindex, + struct in6_addr addr, + guint8 plen, + struct in6_addr peer_addr, + guint32 lifetime, + guint32 preferred, + guint flags); +static gboolean +ip6_address_delete(NMPlatform *platform, int ifindex, struct in6_addr addr, guint8 plen); /*****************************************************************************/ -#define ASSERT_SYSCTL_ARGS(pathid, dirfd, path) \ - G_STMT_START { \ - const char *const _pathid = (pathid); \ - const int _dirfd = (dirfd); \ - const char *const _path = (path); \ - \ - g_assert (_path && _path[0]); \ - g_assert (!strstr (_path, "/../")); \ - if (_dirfd < 0) { \ - g_assert (!_pathid); \ - g_assert (_path[0] == '/'); \ - g_assert ( g_str_has_prefix (_path, "/proc/sys/") \ - || g_str_has_prefix (_path, "/sys/")); \ - } else { \ - g_assert_not_reached (); \ - } \ - } G_STMT_END +#define ASSERT_SYSCTL_ARGS(pathid, dirfd, path) \ + G_STMT_START \ + { \ + const char *const _pathid = (pathid); \ + const int _dirfd = (dirfd); \ + const char *const _path = (path); \ + \ + g_assert(_path &&_path[0]); \ + g_assert(!strstr(_path, "/../")); \ + if (_dirfd < 0) { \ + g_assert(!_pathid); \ + g_assert(_path[0] == '/'); \ + g_assert(g_str_has_prefix(_path, "/proc/sys/") || g_str_has_prefix(_path, "/sys/")); \ + } else { \ + g_assert_not_reached(); \ + } \ + } \ + G_STMT_END static gboolean -sysctl_set (NMPlatform *platform, const char *pathid, int dirfd, const char *path, const char *value) +sysctl_set(NMPlatform *platform, const char *pathid, int dirfd, const char *path, const char *value) { - NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform); + NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE(platform); - ASSERT_SYSCTL_ARGS (pathid, dirfd, path); + ASSERT_SYSCTL_ARGS(pathid, dirfd, path); - g_hash_table_insert (priv->options, g_strdup (path), g_strdup (value)); + g_hash_table_insert(priv->options, g_strdup(path), g_strdup(value)); - return TRUE; + return TRUE; } static char * -sysctl_get (NMPlatform *platform, const char *pathid, int dirfd, const char *path) +sysctl_get(NMPlatform *platform, const char *pathid, int dirfd, const char *path) { - NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform); - const char *v; + NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE(platform); + const char * v; - ASSERT_SYSCTL_ARGS (pathid, dirfd, path); + ASSERT_SYSCTL_ARGS(pathid, dirfd, path); - v = g_hash_table_lookup (priv->options, path); - if (!v) { - errno = ENOENT; - return NULL; - } + v = g_hash_table_lookup(priv->options, path); + if (!v) { + errno = ENOENT; + return NULL; + } - return g_strdup (v); + return g_strdup(v); } static NMFakePlatformLink * -link_get (NMPlatform *platform, int ifindex) +link_get(NMPlatform *platform, int ifindex) { - NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform); - NMFakePlatformLink *device; - int idx; + NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE(platform); + NMFakePlatformLink * device; + int idx; - if (ifindex <= 0) - g_return_val_if_reached (NULL); + if (ifindex <= 0) + g_return_val_if_reached(NULL); - idx = ifindex - 1; - if (idx >= priv->links->len) - goto not_found; + idx = ifindex - 1; + if (idx >= priv->links->len) + goto not_found; - device = &g_array_index (priv->links, NMFakePlatformLink, idx); - if (!device->obj) - goto not_found; + device = &g_array_index(priv->links, NMFakePlatformLink, idx); + if (!device->obj) + goto not_found; - g_assert (ifindex == NMP_OBJECT_CAST_LINK (device->obj)->ifindex); - g_assert (device->obj == nm_platform_link_get_obj (platform, ifindex, FALSE)); + g_assert(ifindex == NMP_OBJECT_CAST_LINK(device->obj)->ifindex); + g_assert(device->obj == nm_platform_link_get_obj(platform, ifindex, FALSE)); - return device; + return device; not_found: - _LOGD ("link not found: %d", ifindex); - return NULL; + _LOGD("link not found: %d", ifindex); + return NULL; } static void -link_add_prepare (NMPlatform *platform, - NMFakePlatformLink *device, - NMPObject *obj_tmp) +link_add_prepare(NMPlatform *platform, NMFakePlatformLink *device, NMPObject *obj_tmp) { - gboolean connected; - - /* we must clear the driver, because platform cache wants to set it */ - g_assert (obj_tmp->link.driver == g_intern_string (obj_tmp->link.driver)); - obj_tmp->link.driver = NULL; - - if (NM_IN_SET (obj_tmp->link.type, NM_LINK_TYPE_BRIDGE, - NM_LINK_TYPE_BOND)) { - connected = FALSE; - if (NM_FLAGS_HAS (obj_tmp->link.n_ifi_flags, IFF_UP)) { - NMPLookup lookup; - NMDedupMultiIter iter; - const NMPObject *slave_candidate = NULL; - - nmp_cache_iter_for_each (&iter, - nmp_cache_lookup (nm_platform_get_cache (platform), - nmp_lookup_init_obj_type (&lookup, - NMP_OBJECT_TYPE_LINK)), - &slave_candidate) { - if (nmp_cache_link_connected_for_slave (obj_tmp->link.ifindex, slave_candidate)) { - connected = TRUE; - break; - } - } - } - } else - connected = NM_FLAGS_HAS (obj_tmp->link.n_ifi_flags, IFF_UP); - - obj_tmp->link.n_ifi_flags = NM_FLAGS_ASSIGN (obj_tmp->link.n_ifi_flags, IFF_LOWER_UP, connected); - obj_tmp->link.connected = connected; + gboolean connected; + + /* we must clear the driver, because platform cache wants to set it */ + g_assert(obj_tmp->link.driver == g_intern_string(obj_tmp->link.driver)); + obj_tmp->link.driver = NULL; + + if (NM_IN_SET(obj_tmp->link.type, NM_LINK_TYPE_BRIDGE, NM_LINK_TYPE_BOND)) { + connected = FALSE; + if (NM_FLAGS_HAS(obj_tmp->link.n_ifi_flags, IFF_UP)) { + NMPLookup lookup; + NMDedupMultiIter iter; + const NMPObject *slave_candidate = NULL; + + nmp_cache_iter_for_each ( + &iter, + nmp_cache_lookup(nm_platform_get_cache(platform), + nmp_lookup_init_obj_type(&lookup, NMP_OBJECT_TYPE_LINK)), + &slave_candidate) { + if (nmp_cache_link_connected_for_slave(obj_tmp->link.ifindex, slave_candidate)) { + connected = TRUE; + break; + } + } + } + } else + connected = NM_FLAGS_HAS(obj_tmp->link.n_ifi_flags, IFF_UP); + + obj_tmp->link.n_ifi_flags = NM_FLAGS_ASSIGN(obj_tmp->link.n_ifi_flags, IFF_LOWER_UP, connected); + obj_tmp->link.connected = connected; } static NMFakePlatformLink * -link_add_pre (NMPlatform *platform, - const char *name, - NMLinkType type, - const void *address, - size_t address_len) +link_add_pre(NMPlatform *platform, + const char *name, + NMLinkType type, + const void *address, + size_t address_len) { - NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform); - NMFakePlatformLink *device; - int ifindex; - NMPObject *o; - NMPlatformLink *link; - gs_free char *ip6_lladdr = NULL; - - g_assert (!name || strlen (name) < IFNAMSIZ); - - g_array_set_size (priv->links, priv->links->len + 1); - device = &g_array_index (priv->links, NMFakePlatformLink, priv->links->len - 1); - ifindex = priv->links->len; - - memset (device, 0, sizeof (*device)); - - o = nmp_object_new_link (ifindex); - link = NMP_OBJECT_CAST_LINK (o); - - ip6_lladdr = ifindex > 0 ? g_strdup_printf ("fe80::fa1e:%0x:%0x", ifindex / 256, ifindex % 256) : NULL; - - link->ifindex = name ? ifindex : 0; - link->type = type; - link->kind = g_intern_string (nm_link_type_to_string (type)); - link->initialized = TRUE; - if (name) - strcpy (link->name, name); - switch (link->type) { - case NM_LINK_TYPE_DUMMY: - link->n_ifi_flags = NM_FLAGS_SET (link->n_ifi_flags, IFF_NOARP); - break; - default: - link->n_ifi_flags = NM_FLAGS_UNSET (link->n_ifi_flags, IFF_NOARP); - break; - } - - o->_link.netlink.is_in_netlink = TRUE; - - if (address) { - g_assert (address_len > 0 && address_len <= sizeof (link->l_address.data)); - memcpy (link->l_address.data, address, address_len); - link->l_address.len = address_len; - } else - g_assert (address_len == 0); - - device->obj = o; - device->ip6_lladdr = *nmtst_inet6_from_string (ip6_lladdr); - - return device; + NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE(platform); + NMFakePlatformLink * device; + int ifindex; + NMPObject * o; + NMPlatformLink * link; + gs_free char * ip6_lladdr = NULL; + + g_assert(!name || strlen(name) < IFNAMSIZ); + + g_array_set_size(priv->links, priv->links->len + 1); + device = &g_array_index(priv->links, NMFakePlatformLink, priv->links->len - 1); + ifindex = priv->links->len; + + memset(device, 0, sizeof(*device)); + + o = nmp_object_new_link(ifindex); + link = NMP_OBJECT_CAST_LINK(o); + + ip6_lladdr = + ifindex > 0 ? g_strdup_printf("fe80::fa1e:%0x:%0x", ifindex / 256, ifindex % 256) : NULL; + + link->ifindex = name ? ifindex : 0; + link->type = type; + link->kind = g_intern_string(nm_link_type_to_string(type)); + link->initialized = TRUE; + if (name) + strcpy(link->name, name); + switch (link->type) { + case NM_LINK_TYPE_DUMMY: + link->n_ifi_flags = NM_FLAGS_SET(link->n_ifi_flags, IFF_NOARP); + break; + default: + link->n_ifi_flags = NM_FLAGS_UNSET(link->n_ifi_flags, IFF_NOARP); + break; + } + + o->_link.netlink.is_in_netlink = TRUE; + + if (address) { + g_assert(address_len > 0 && address_len <= sizeof(link->l_address.data)); + memcpy(link->l_address.data, address, address_len); + link->l_address.len = address_len; + } else + g_assert(address_len == 0); + + device->obj = o; + device->ip6_lladdr = *nmtst_inet6_from_string(ip6_lladdr); + + return device; } static int -link_add (NMPlatform *platform, - NMLinkType type, - const char *name, - int parent, - const void *address, - size_t address_len, - gconstpointer extra_data, - const NMPlatformLink **out_link) +link_add(NMPlatform * platform, + NMLinkType type, + const char * name, + int parent, + const void * address, + size_t address_len, + gconstpointer extra_data, + const NMPlatformLink **out_link) { - NMFakePlatformLink *device; - NMFakePlatformLink *device_veth = NULL; - nm_auto_nmpobj const NMPObject *obj_old = NULL; - nm_auto_nmpobj const NMPObject *obj_new = NULL; - nm_auto_nmpobj const NMPObject *obj_old_veth = NULL; - nm_auto_nmpobj const NMPObject *obj_new_veth = NULL; - NMPCacheOpsType cache_op; - NMPCacheOpsType cache_op_veth = NMP_CACHE_OPS_UNCHANGED; - const char *veth_peer = NULL; - NMPObject *dev_obj; - NMPObject *dev_lnk = NULL; - - device = link_add_pre (platform, name, type, address, address_len); - - g_assert (device); - - dev_obj = (NMPObject *) device->obj; - - if (parent > 0) - dev_obj->link.parent = parent; - else - g_assert (parent == 0); - - g_assert ((parent != 0) == NM_IN_SET (type, NM_LINK_TYPE_VLAN)); - - switch (type) { - case NM_LINK_TYPE_VETH: - veth_peer = extra_data; - g_assert (veth_peer); - device_veth = link_add_pre (platform, veth_peer, type, NULL, 0); - break; - case NM_LINK_TYPE_VLAN: { - const NMPlatformLnkVlan *props = extra_data; - - g_assert (props); - - dev_lnk = nmp_object_new (NMP_OBJECT_TYPE_LNK_VLAN, props); - break; - } - case NM_LINK_TYPE_VXLAN: { - const NMPlatformLnkVxlan *props = extra_data; - - g_assert (props); - - dev_lnk = nmp_object_new (NMP_OBJECT_TYPE_LNK_VXLAN, props); - break; - } - default: - g_assert (!extra_data); - break; - } - - if (dev_lnk) - dev_obj->_link.netlink.lnk = dev_lnk; - - link_add_prepare (platform, device, (NMPObject *) device->obj); - cache_op = nmp_cache_update_netlink (nm_platform_get_cache (platform), - (NMPObject *) device->obj, - FALSE, - &obj_old, &obj_new); - g_assert (cache_op == NMP_CACHE_OPS_ADDED); - nmp_object_unref (device->obj); - device->obj = nmp_object_ref (obj_new); - if (veth_peer) { - link_add_prepare (platform, device_veth, (NMPObject *) device_veth->obj); - cache_op_veth = nmp_cache_update_netlink (nm_platform_get_cache (platform), - (NMPObject *) device_veth->obj, - FALSE, - &obj_old_veth, &obj_new_veth); - g_assert (cache_op == NMP_CACHE_OPS_ADDED); - nmp_object_unref (device->obj); - device->obj = nmp_object_ref (obj_new); - } - - if (out_link) - *out_link = NMP_OBJECT_CAST_LINK (device->obj); - - link_changed (platform, device, cache_op, NULL); - if (veth_peer) - link_changed (platform, device_veth, cache_op_veth, NULL); - - return 0; + NMFakePlatformLink * device; + NMFakePlatformLink * device_veth = NULL; + nm_auto_nmpobj const NMPObject *obj_old = NULL; + nm_auto_nmpobj const NMPObject *obj_new = NULL; + nm_auto_nmpobj const NMPObject *obj_old_veth = NULL; + nm_auto_nmpobj const NMPObject *obj_new_veth = NULL; + NMPCacheOpsType cache_op; + NMPCacheOpsType cache_op_veth = NMP_CACHE_OPS_UNCHANGED; + const char * veth_peer = NULL; + NMPObject * dev_obj; + NMPObject * dev_lnk = NULL; + + device = link_add_pre(platform, name, type, address, address_len); + + g_assert(device); + + dev_obj = (NMPObject *) device->obj; + + if (parent > 0) + dev_obj->link.parent = parent; + else + g_assert(parent == 0); + + g_assert((parent != 0) == NM_IN_SET(type, NM_LINK_TYPE_VLAN)); + + switch (type) { + case NM_LINK_TYPE_BRIDGE: + { + const NMPlatformLnkBridge *props = extra_data; + + g_assert(props); + + dev_lnk = nmp_object_new(NMP_OBJECT_TYPE_LNK_BRIDGE, props); + break; + } + case NM_LINK_TYPE_VETH: + veth_peer = extra_data; + g_assert(veth_peer); + device_veth = link_add_pre(platform, veth_peer, type, NULL, 0); + break; + case NM_LINK_TYPE_VLAN: + { + const NMPlatformLnkVlan *props = extra_data; + + g_assert(props); + + dev_lnk = nmp_object_new(NMP_OBJECT_TYPE_LNK_VLAN, props); + break; + } + case NM_LINK_TYPE_VXLAN: + { + const NMPlatformLnkVxlan *props = extra_data; + + g_assert(props); + + dev_lnk = nmp_object_new(NMP_OBJECT_TYPE_LNK_VXLAN, props); + break; + } + default: + g_assert(!extra_data); + break; + } + + if (dev_lnk) + dev_obj->_link.netlink.lnk = dev_lnk; + + link_add_prepare(platform, device, (NMPObject *) device->obj); + cache_op = nmp_cache_update_netlink(nm_platform_get_cache(platform), + (NMPObject *) device->obj, + FALSE, + &obj_old, + &obj_new); + g_assert(cache_op == NMP_CACHE_OPS_ADDED); + nmp_object_unref(device->obj); + device->obj = nmp_object_ref(obj_new); + if (veth_peer) { + link_add_prepare(platform, device_veth, (NMPObject *) device_veth->obj); + cache_op_veth = nmp_cache_update_netlink(nm_platform_get_cache(platform), + (NMPObject *) device_veth->obj, + FALSE, + &obj_old_veth, + &obj_new_veth); + g_assert(cache_op == NMP_CACHE_OPS_ADDED); + nmp_object_unref(device->obj); + device->obj = nmp_object_ref(obj_new); + } + + if (out_link) + *out_link = NMP_OBJECT_CAST_LINK(device->obj); + + link_changed(platform, device, cache_op, NULL); + if (veth_peer) + link_changed(platform, device_veth, cache_op_veth, NULL); + + return 0; } static NMFakePlatformLink * -link_add_one (NMPlatform *platform, - const char *name, - NMLinkType link_type, - void (*prepare_fcn) (NMPlatform *platform, NMFakePlatformLink *device, gconstpointer user_data), - gconstpointer user_data, - const NMPlatformLink **out_link) +link_add_one(NMPlatform *platform, + const char *name, + NMLinkType link_type, + void (*prepare_fcn)(NMPlatform * platform, + NMFakePlatformLink *device, + gconstpointer user_data), + gconstpointer user_data, + const NMPlatformLink **out_link) { - NMFakePlatformLink *device; - nm_auto_nmpobj const NMPObject *obj_old = NULL; - nm_auto_nmpobj const NMPObject *obj_new = NULL; - NMPCacheOpsType cache_op; - int ifindex; + NMFakePlatformLink * device; + nm_auto_nmpobj const NMPObject *obj_old = NULL; + nm_auto_nmpobj const NMPObject *obj_new = NULL; + NMPCacheOpsType cache_op; + int ifindex; - device = link_add_pre (platform, name, NM_LINK_TYPE_VLAN, NULL, 0); + device = link_add_pre(platform, name, NM_LINK_TYPE_VLAN, NULL, 0); - ifindex = NMP_OBJECT_CAST_LINK (device->obj)->ifindex; + ifindex = NMP_OBJECT_CAST_LINK(device->obj)->ifindex; - if (prepare_fcn) - prepare_fcn (platform, device, user_data); + if (prepare_fcn) + prepare_fcn(platform, device, user_data); - link_add_prepare (platform, device, (NMPObject *) device->obj); - cache_op = nmp_cache_update_netlink (nm_platform_get_cache (platform), - (NMPObject *) device->obj, - FALSE, - &obj_old, &obj_new); - g_assert (cache_op == NMP_CACHE_OPS_ADDED); - nmp_object_unref (device->obj); - device->obj = nmp_object_ref (obj_new); + link_add_prepare(platform, device, (NMPObject *) device->obj); + cache_op = nmp_cache_update_netlink(nm_platform_get_cache(platform), + (NMPObject *) device->obj, + FALSE, + &obj_old, + &obj_new); + g_assert(cache_op == NMP_CACHE_OPS_ADDED); + nmp_object_unref(device->obj); + device->obj = nmp_object_ref(obj_new); - link_changed (platform, device, cache_op, obj_old); + link_changed(platform, device, cache_op, obj_old); - device = link_get (platform, ifindex); - if (!device) - g_assert_not_reached (); + device = link_get(platform, ifindex); + if (!device) + g_assert_not_reached(); - NM_SET_OUT (out_link, NMP_OBJECT_CAST_LINK (device->obj)); - return device; + NM_SET_OUT(out_link, NMP_OBJECT_CAST_LINK(device->obj)); + return device; } static gboolean -link_delete (NMPlatform *platform, int ifindex) +link_delete(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); - nm_auto_nmpobj const NMPObject *obj_old = NULL; - nm_auto_nmpobj const NMPObject *obj_old2 = NULL; - NMPCacheOpsType cache_op; - - if (!device) - return FALSE; - - obj_old = g_steal_pointer (&device->obj); - - cache_op = nmp_cache_remove (nm_platform_get_cache (platform), - obj_old, - FALSE, - FALSE, - &obj_old2); - g_assert (cache_op == NMP_CACHE_OPS_REMOVED); - g_assert (obj_old2); - g_assert (obj_old == obj_old2); - - /* Remove addresses and routes which belong to the deleted interface */ - ipx_address_delete (platform, AF_INET, ifindex, NULL, NULL, NULL); - ipx_address_delete (platform, AF_INET6, ifindex, NULL, NULL, NULL); - ipx_route_delete (platform, AF_INET, ifindex, NULL); - ipx_route_delete (platform, AF_INET6, ifindex, NULL); - - nm_platform_cache_update_emit_signal (platform, - cache_op, - obj_old2, - NULL); - return TRUE; + NMFakePlatformLink * device = link_get(platform, ifindex); + nm_auto_nmpobj const NMPObject *obj_old = NULL; + nm_auto_nmpobj const NMPObject *obj_old2 = NULL; + NMPCacheOpsType cache_op; + + if (!device) + return FALSE; + + obj_old = g_steal_pointer(&device->obj); + + cache_op = nmp_cache_remove(nm_platform_get_cache(platform), obj_old, FALSE, FALSE, &obj_old2); + g_assert(cache_op == NMP_CACHE_OPS_REMOVED); + g_assert(obj_old2); + g_assert(obj_old == obj_old2); + + /* Remove addresses and routes which belong to the deleted interface */ + ipx_address_delete(platform, AF_INET, ifindex, NULL, NULL, NULL); + ipx_address_delete(platform, AF_INET6, ifindex, NULL, NULL, NULL); + ipx_route_delete(platform, AF_INET, ifindex, NULL); + ipx_route_delete(platform, AF_INET6, ifindex, NULL); + + nm_platform_cache_update_emit_signal(platform, cache_op, obj_old2, NULL); + return TRUE; } static void -link_set_obj (NMPlatform *platform, - NMFakePlatformLink *device, - NMPObject *obj_tmp) +link_set_obj(NMPlatform *platform, NMFakePlatformLink *device, NMPObject *obj_tmp) { - nm_auto_nmpobj const NMPObject *obj_new = NULL; - nm_auto_nmpobj const NMPObject *obj_old = NULL; - nm_auto_nmpobj NMPObject *obj_tmp_tmp = NULL; - NMPCacheOpsType cache_op; - - g_assert (device); - g_assert (NMP_OBJECT_GET_TYPE (device->obj) == NMP_OBJECT_TYPE_LINK); - - if (!obj_tmp) { - obj_tmp_tmp = nmp_object_clone (device->obj, FALSE); - obj_tmp = obj_tmp_tmp; - } - - g_assert (NMP_OBJECT_GET_TYPE (obj_tmp) == NMP_OBJECT_TYPE_LINK); - - link_add_prepare (platform, device, obj_tmp); - cache_op = nmp_cache_update_netlink (nm_platform_get_cache (platform), - obj_tmp, - FALSE, - &obj_old, &obj_new); - g_assert (NM_IN_SET (cache_op, NMP_CACHE_OPS_UNCHANGED, - NMP_CACHE_OPS_UPDATED)); - g_assert (obj_old == device->obj); - g_assert (obj_new); - - nmp_object_unref (device->obj); - device->obj = nmp_object_ref (obj_new); - - link_changed (platform, device, cache_op, obj_old); + nm_auto_nmpobj const NMPObject *obj_new = NULL; + nm_auto_nmpobj const NMPObject *obj_old = NULL; + nm_auto_nmpobj NMPObject *obj_tmp_tmp = NULL; + NMPCacheOpsType cache_op; + + g_assert(device); + g_assert(NMP_OBJECT_GET_TYPE(device->obj) == NMP_OBJECT_TYPE_LINK); + + if (!obj_tmp) { + obj_tmp_tmp = nmp_object_clone(device->obj, FALSE); + obj_tmp = obj_tmp_tmp; + } + + g_assert(NMP_OBJECT_GET_TYPE(obj_tmp) == NMP_OBJECT_TYPE_LINK); + + link_add_prepare(platform, device, obj_tmp); + cache_op = nmp_cache_update_netlink(nm_platform_get_cache(platform), + obj_tmp, + FALSE, + &obj_old, + &obj_new); + g_assert(NM_IN_SET(cache_op, NMP_CACHE_OPS_UNCHANGED, NMP_CACHE_OPS_UPDATED)); + g_assert(obj_old == device->obj); + g_assert(obj_new); + + nmp_object_unref(device->obj); + device->obj = nmp_object_ref(obj_new); + + link_changed(platform, device, cache_op, obj_old); } static void -link_set_flags (NMPlatform *platform, - NMFakePlatformLink *device, - guint n_ifi_flags) +link_set_flags(NMPlatform *platform, NMFakePlatformLink *device, guint n_ifi_flags) { - nm_auto_nmpobj NMPObject *obj_tmp = NULL; + nm_auto_nmpobj NMPObject *obj_tmp = NULL; - g_assert (device); - g_assert (NMP_OBJECT_GET_TYPE (device->obj) == NMP_OBJECT_TYPE_LINK); + g_assert(device); + g_assert(NMP_OBJECT_GET_TYPE(device->obj) == NMP_OBJECT_TYPE_LINK); - obj_tmp = nmp_object_clone (device->obj, FALSE); - obj_tmp->link.n_ifi_flags = n_ifi_flags; - link_set_obj (platform, device, obj_tmp); + obj_tmp = nmp_object_clone(device->obj, FALSE); + obj_tmp->link.n_ifi_flags = n_ifi_flags; + link_set_obj(platform, device, obj_tmp); } static void -link_changed (NMPlatform *platform, - NMFakePlatformLink *device, - NMPCacheOpsType cache_op, - const NMPObject *obj_old) +link_changed(NMPlatform * platform, + NMFakePlatformLink *device, + NMPCacheOpsType cache_op, + const NMPObject * obj_old) { - g_assert (device->obj); - - g_assert (!nmp_cache_link_connected_needs_toggle (nm_platform_get_cache (platform), - device->obj, NULL, NULL)); - - nm_platform_cache_update_emit_signal (platform, - cache_op, - obj_old, - device->obj); - - if (!IN6_IS_ADDR_UNSPECIFIED (&device->ip6_lladdr)) { - if (device->obj->link.connected) - ip6_address_add (platform, device->obj->link.ifindex, device->ip6_lladdr, 64, in6addr_any, NM_PLATFORM_LIFETIME_PERMANENT, NM_PLATFORM_LIFETIME_PERMANENT, 0); - else - ip6_address_delete (platform, device->obj->link.ifindex, device->ip6_lladdr, 64); - } - - if (device->obj->link.master) { - NMFakePlatformLink *master; - - master = link_get (platform, device->obj->link.master); - link_set_obj (platform, master, NULL); - } + g_assert(device->obj); + + g_assert(!nmp_cache_link_connected_needs_toggle(nm_platform_get_cache(platform), + device->obj, + NULL, + NULL)); + + nm_platform_cache_update_emit_signal(platform, cache_op, obj_old, device->obj); + + if (!IN6_IS_ADDR_UNSPECIFIED(&device->ip6_lladdr)) { + if (device->obj->link.connected) + ip6_address_add(platform, + device->obj->link.ifindex, + device->ip6_lladdr, + 64, + in6addr_any, + NM_PLATFORM_LIFETIME_PERMANENT, + NM_PLATFORM_LIFETIME_PERMANENT, + 0); + else + ip6_address_delete(platform, device->obj->link.ifindex, device->ip6_lladdr, 64); + } + + if (device->obj->link.master) { + NMFakePlatformLink *master; + + master = link_get(platform, device->obj->link.master); + link_set_obj(platform, master, NULL); + } } static gboolean -link_set_up (NMPlatform *platform, int ifindex, gboolean *out_no_firmware) +link_set_up(NMPlatform *platform, int ifindex, gboolean *out_no_firmware) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (out_no_firmware) - *out_no_firmware = FALSE; + if (out_no_firmware) + *out_no_firmware = FALSE; - if (!device) { - _LOGE ("failure changing link: netlink error (No such device)"); - return FALSE; - } + if (!device) { + _LOGE("failure changing link: netlink error (No such device)"); + return FALSE; + } - link_set_flags (platform, - device, - NM_FLAGS_ASSIGN (device->obj->link.n_ifi_flags, IFF_UP, TRUE)); - return TRUE; + link_set_flags(platform, device, NM_FLAGS_ASSIGN(device->obj->link.n_ifi_flags, IFF_UP, TRUE)); + return TRUE; } static gboolean -link_set_down (NMPlatform *platform, int ifindex) +link_set_down(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (!device) { - _LOGE ("failure changing link: netlink error (No such device)"); - return FALSE; - } + if (!device) { + _LOGE("failure changing link: netlink error (No such device)"); + return FALSE; + } - link_set_flags (platform, - device, - NM_FLAGS_UNSET (device->obj->link.n_ifi_flags, IFF_UP)); - return TRUE; + link_set_flags(platform, device, NM_FLAGS_UNSET(device->obj->link.n_ifi_flags, IFF_UP)); + return TRUE; } static gboolean -link_set_arp (NMPlatform *platform, int ifindex) +link_set_arp(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (!device) { - _LOGE ("failure changing link: netlink error (No such device)"); - return FALSE; - } + if (!device) { + _LOGE("failure changing link: netlink error (No such device)"); + return FALSE; + } - link_set_flags (platform, - device, - NM_FLAGS_UNSET (device->obj->link.n_ifi_flags, IFF_NOARP)); - return TRUE; + link_set_flags(platform, device, NM_FLAGS_UNSET(device->obj->link.n_ifi_flags, IFF_NOARP)); + return TRUE; } static gboolean -link_set_noarp (NMPlatform *platform, int ifindex) +link_set_noarp(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (!device) { - _LOGE ("failure changing link: netlink error (No such device)"); - return FALSE; - } + if (!device) { + _LOGE("failure changing link: netlink error (No such device)"); + return FALSE; + } - link_set_flags (platform, - device, - NM_FLAGS_SET (device->obj->link.n_ifi_flags, IFF_NOARP)); - return TRUE; + link_set_flags(platform, device, NM_FLAGS_SET(device->obj->link.n_ifi_flags, IFF_NOARP)); + return TRUE; } static int -link_set_address (NMPlatform *platform, int ifindex, gconstpointer addr, size_t len) +link_set_address(NMPlatform *platform, int ifindex, gconstpointer addr, size_t len) { - NMFakePlatformLink *device = link_get (platform, ifindex); - nm_auto_nmpobj NMPObject *obj_tmp = NULL; + NMFakePlatformLink *device = link_get(platform, ifindex); + nm_auto_nmpobj NMPObject *obj_tmp = NULL; - if ( len == 0 - || len > NM_UTILS_HWADDR_LEN_MAX - || !addr) - g_return_val_if_reached (-NME_BUG); + if (len == 0 || len > NM_UTILS_HWADDR_LEN_MAX || !addr) + g_return_val_if_reached(-NME_BUG); - if (!device) - return -NME_PL_EXISTS; + if (!device) + return -NME_PL_EXISTS; - obj_tmp = nmp_object_clone (device->obj, FALSE); - obj_tmp->link.l_address.len = len; - memset (obj_tmp->link.l_address.data, 0, sizeof (obj_tmp->link.l_address.data)); - memcpy (obj_tmp->link.l_address.data, addr, len); + obj_tmp = nmp_object_clone(device->obj, FALSE); + obj_tmp->link.l_address.len = len; + memset(obj_tmp->link.l_address.data, 0, sizeof(obj_tmp->link.l_address.data)); + memcpy(obj_tmp->link.l_address.data, addr, len); - link_set_obj (platform, device, obj_tmp); - return 0; + link_set_obj(platform, device, obj_tmp); + return 0; } static int -link_set_mtu (NMPlatform *platform, int ifindex, guint32 mtu) +link_set_mtu(NMPlatform *platform, int ifindex, guint32 mtu) { - NMFakePlatformLink *device = link_get (platform, ifindex); - nm_auto_nmpobj NMPObject *obj_tmp = NULL; - - if (!device) { - _LOGE ("failure changing link: netlink error (No such device)"); - return -NME_PL_EXISTS; - } - - obj_tmp = nmp_object_clone (device->obj, FALSE); - obj_tmp->link.mtu = mtu; - link_set_obj (platform, device, obj_tmp); - return 0; + NMFakePlatformLink *device = link_get(platform, ifindex); + nm_auto_nmpobj NMPObject *obj_tmp = NULL; + + if (!device) { + _LOGE("failure changing link: netlink error (No such device)"); + return -NME_PL_EXISTS; + } + + obj_tmp = nmp_object_clone(device->obj, FALSE); + obj_tmp->link.mtu = mtu; + link_set_obj(platform, device, obj_tmp); + return 0; } static gboolean -link_get_driver_info (NMPlatform *platform, - int ifindex, - char **out_driver_name, - char **out_driver_version, - char **out_fw_version) +link_get_driver_info(NMPlatform *platform, + int ifindex, + char ** out_driver_name, + char ** out_driver_version, + char ** out_fw_version) { - if (out_driver_name) - *out_driver_name = NULL; - if (out_driver_version) - *out_driver_version = NULL; - if (out_fw_version) - *out_fw_version = NULL; - - return TRUE; + if (out_driver_name) + *out_driver_name = NULL; + if (out_driver_version) + *out_driver_version = NULL; + if (out_fw_version) + *out_fw_version = NULL; + + return TRUE; } static gboolean -link_supports_carrier_detect (NMPlatform *platform, int ifindex) +link_supports_carrier_detect(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (!device) - return FALSE; + if (!device) + return FALSE; - switch (device->obj->link.type) { - case NM_LINK_TYPE_DUMMY: - return FALSE; - default: - return TRUE; - } + switch (device->obj->link.type) { + case NM_LINK_TYPE_DUMMY: + return FALSE; + default: + return TRUE; + } } static gboolean -link_supports_vlans (NMPlatform *platform, int ifindex) +link_supports_vlans(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (!device) - return FALSE; + if (!device) + return FALSE; - switch (device->obj->link.type) { - case NM_LINK_TYPE_LOOPBACK: - return FALSE; - default: - return TRUE; - } + switch (device->obj->link.type) { + case NM_LINK_TYPE_LOOPBACK: + return FALSE; + default: + return TRUE; + } } static gboolean -link_supports_sriov (NMPlatform *platform, int ifindex) +link_supports_sriov(NMPlatform *platform, int ifindex) { - NMFakePlatformLink *device = link_get (platform, ifindex); + NMFakePlatformLink *device = link_get(platform, ifindex); - if (!device) - return FALSE; + if (!device) + return FALSE; - switch (device->obj->link.type) { - case NM_LINK_TYPE_LOOPBACK: - return FALSE; - default: - return TRUE; - } + switch (device->obj->link.type) { + case NM_LINK_TYPE_LOOPBACK: + return FALSE; + default: + return TRUE; + } } static gboolean -link_enslave (NMPlatform *platform, int master, int slave) +link_enslave(NMPlatform *platform, int master, int slave) { - NMFakePlatformLink *device = link_get (platform, slave); - NMFakePlatformLink *master_device = link_get (platform, master); + NMFakePlatformLink *device = link_get(platform, slave); + NMFakePlatformLink *master_device = link_get(platform, master); - g_return_val_if_fail (device, FALSE); - g_return_val_if_fail (master_device, FALSE); + g_return_val_if_fail(device, FALSE); + g_return_val_if_fail(master_device, FALSE); - if (device->obj->link.master != master) { - nm_auto_nmpobj NMPObject *obj_tmp = NULL; + if (device->obj->link.master != master) { + nm_auto_nmpobj NMPObject *obj_tmp = NULL; - obj_tmp = nmp_object_clone (device->obj, FALSE); - obj_tmp->link.master = master; - if (NM_IN_SET (master_device->obj->link.type, NM_LINK_TYPE_BOND, NM_LINK_TYPE_TEAM)) - obj_tmp->link.n_ifi_flags = NM_FLAGS_SET (device->obj->link.n_ifi_flags, IFF_UP); - link_set_obj (platform, device, obj_tmp); - } + obj_tmp = nmp_object_clone(device->obj, FALSE); + obj_tmp->link.master = master; + if (NM_IN_SET(master_device->obj->link.type, NM_LINK_TYPE_BOND, NM_LINK_TYPE_TEAM)) + obj_tmp->link.n_ifi_flags = NM_FLAGS_SET(device->obj->link.n_ifi_flags, IFF_UP); + link_set_obj(platform, device, obj_tmp); + } - return TRUE; + return TRUE; } static gboolean -link_release (NMPlatform *platform, int master_idx, int slave_idx) +link_release(NMPlatform *platform, int master_idx, int slave_idx) { - NMFakePlatformLink *master = link_get (platform, master_idx); - NMFakePlatformLink *slave = link_get (platform, slave_idx); - nm_auto_nmpobj NMPObject *obj_tmp = NULL; + NMFakePlatformLink *master = link_get(platform, master_idx); + NMFakePlatformLink *slave = link_get(platform, slave_idx); + nm_auto_nmpobj NMPObject *obj_tmp = NULL; - g_return_val_if_fail (master, FALSE); - g_return_val_if_fail (slave, FALSE); + g_return_val_if_fail(master, FALSE); + g_return_val_if_fail(slave, FALSE); - if (slave->obj->link.master != master->obj->link.ifindex) - return FALSE; + if (slave->obj->link.master != master->obj->link.ifindex) + return FALSE; - obj_tmp = nmp_object_clone (slave->obj, FALSE); - obj_tmp->link.master = 0; - link_set_obj (platform, slave, obj_tmp); - return TRUE; + obj_tmp = nmp_object_clone(slave->obj, FALSE); + obj_tmp->link.master = 0; + link_set_obj(platform, slave, obj_tmp); + return TRUE; } static gboolean -link_vlan_change (NMPlatform *platform, - int ifindex, - NMVlanFlags flags_mask, - NMVlanFlags flags_set, - gboolean ingress_reset_all, - const NMVlanQosMapping *ingress_map, - gsize n_ingress_map, - gboolean egress_reset_all, - const NMVlanQosMapping *egress_map, - gsize n_egress_map) +link_vlan_change(NMPlatform * platform, + int ifindex, + NMVlanFlags flags_mask, + NMVlanFlags flags_set, + gboolean ingress_reset_all, + const NMVlanQosMapping *ingress_map, + gsize n_ingress_map, + gboolean egress_reset_all, + const NMVlanQosMapping *egress_map, + gsize n_egress_map) { - return FALSE; + return FALSE; } struct infiniband_add_data { - int parent; - int p_key; + int parent; + int p_key; }; static void -_infiniband_add_prepare (NMPlatform *platform, - NMFakePlatformLink *device, - gconstpointer user_data) +_infiniband_add_prepare(NMPlatform *platform, NMFakePlatformLink *device, gconstpointer user_data) { - const struct infiniband_add_data *d = user_data; - NMPObject *obj_tmp; - NMPObject *lnk; + const struct infiniband_add_data *d = user_data; + NMPObject * obj_tmp; + NMPObject * lnk; - obj_tmp = (NMPObject *) device->obj; + obj_tmp = (NMPObject *) device->obj; - lnk = nmp_object_new (NMP_OBJECT_TYPE_LNK_INFINIBAND, NULL); - lnk->lnk_infiniband.p_key = d->p_key; - lnk->lnk_infiniband.mode = "datagram"; + lnk = nmp_object_new(NMP_OBJECT_TYPE_LNK_INFINIBAND, NULL); + lnk->lnk_infiniband.p_key = d->p_key; + lnk->lnk_infiniband.mode = "datagram"; - obj_tmp->link.parent = d->parent; - obj_tmp->_link.netlink.lnk = lnk; + obj_tmp->link.parent = d->parent; + obj_tmp->_link.netlink.lnk = lnk; } static gboolean -infiniband_partition_add (NMPlatform *platform, int parent, int p_key, const NMPlatformLink **out_link) +infiniband_partition_add(NMPlatform * platform, + int parent, + int p_key, + const NMPlatformLink **out_link) { - NMFakePlatformLink *parent_device; - char name[IFNAMSIZ]; - const struct infiniband_add_data d = { - .parent = parent, - .p_key = p_key, - }; + NMFakePlatformLink * parent_device; + char name[IFNAMSIZ]; + const struct infiniband_add_data d = { + .parent = parent, + .p_key = p_key, + }; - parent_device = link_get (platform, parent); - g_return_val_if_fail (parent_device != NULL, FALSE); + parent_device = link_get(platform, parent); + g_return_val_if_fail(parent_device != NULL, FALSE); - nm_utils_new_infiniband_name (name, parent_device->obj->link.name, p_key); + nm_utils_new_infiniband_name(name, parent_device->obj->link.name, p_key); - link_add_one (platform, name, NM_LINK_TYPE_INFINIBAND, - _infiniband_add_prepare, &d, out_link); - return TRUE; + link_add_one(platform, name, NM_LINK_TYPE_INFINIBAND, _infiniband_add_prepare, &d, out_link); + return TRUE; } static gboolean -infiniband_partition_delete (NMPlatform *platform, int parent, int p_key) +infiniband_partition_delete(NMPlatform *platform, int parent, int p_key) { - NMFakePlatformLink *parent_device; - gs_free char *name = NULL; + NMFakePlatformLink *parent_device; + gs_free char * name = NULL; - parent_device = link_get (platform, parent); - g_return_val_if_fail (parent_device != NULL, FALSE); + parent_device = link_get(platform, parent); + g_return_val_if_fail(parent_device != NULL, FALSE); - nm_utils_new_infiniband_name (name, parent_device->obj->link.name, p_key); - return link_delete (platform, nm_platform_link_get_ifindex (platform, name)); + nm_utils_new_infiniband_name(name, parent_device->obj->link.name, p_key); + return link_delete(platform, nm_platform_link_get_ifindex(platform, name)); } static gboolean -wifi_get_capabilities (NMPlatform *platform, int ifindex, NMDeviceWifiCapabilities *caps) +wifi_get_capabilities(NMPlatform *platform, int ifindex, NMDeviceWifiCapabilities *caps) { - NMFakePlatformLink *device = link_get (platform, ifindex); - - g_return_val_if_fail (device, FALSE); - - if (device->obj->link.type != NM_LINK_TYPE_WIFI) - return FALSE; - - if (caps) { - *caps = ( NM_WIFI_DEVICE_CAP_CIPHER_WEP40 - | NM_WIFI_DEVICE_CAP_CIPHER_WEP104 - | NM_WIFI_DEVICE_CAP_CIPHER_TKIP - | NM_WIFI_DEVICE_CAP_CIPHER_CCMP - | NM_WIFI_DEVICE_CAP_WPA - | NM_WIFI_DEVICE_CAP_RSN - | NM_WIFI_DEVICE_CAP_AP - | NM_WIFI_DEVICE_CAP_ADHOC); - } - return TRUE; + NMFakePlatformLink *device = link_get(platform, ifindex); + + g_return_val_if_fail(device, FALSE); + + if (device->obj->link.type != NM_LINK_TYPE_WIFI) + return FALSE; + + if (caps) { + *caps = (NM_WIFI_DEVICE_CAP_CIPHER_WEP40 | NM_WIFI_DEVICE_CAP_CIPHER_WEP104 + | NM_WIFI_DEVICE_CAP_CIPHER_TKIP | NM_WIFI_DEVICE_CAP_CIPHER_CCMP + | NM_WIFI_DEVICE_CAP_WPA | NM_WIFI_DEVICE_CAP_RSN | NM_WIFI_DEVICE_CAP_AP + | NM_WIFI_DEVICE_CAP_ADHOC); + } + return TRUE; } static gboolean -wifi_get_bssid (NMPlatform *platform, int ifindex, guint8 *bssid) +wifi_get_bssid(NMPlatform *platform, int ifindex, guint8 *bssid) { - return FALSE; + return FALSE; } static guint32 -wifi_get_frequency (NMPlatform *platform, int ifindex) +wifi_get_frequency(NMPlatform *platform, int ifindex) { - return 0; + return 0; } static int -wifi_get_quality (NMPlatform *platform, int ifindex) +wifi_get_quality(NMPlatform *platform, int ifindex) { - return 0; + return 0; } static guint32 -wifi_get_rate (NMPlatform *platform, int ifindex) +wifi_get_rate(NMPlatform *platform, int ifindex) { - return 0; + return 0; } static NM80211Mode -wifi_get_mode (NMPlatform *platform, int ifindex) +wifi_get_mode(NMPlatform *platform, int ifindex) { - return NM_802_11_MODE_UNKNOWN; + return NM_802_11_MODE_UNKNOWN; } static void -wifi_set_mode (NMPlatform *platform, int ifindex, NM80211Mode mode) +wifi_set_mode(NMPlatform *platform, int ifindex, NM80211Mode mode) { - ; + ; } static guint32 -wifi_find_frequency (NMPlatform *platform, int ifindex, const guint32 *freqs) +wifi_find_frequency(NMPlatform *platform, int ifindex, const guint32 *freqs) { - return freqs[0]; + return freqs[0]; } static void -wifi_indicate_addressing_running (NMPlatform *platform, int ifindex, gboolean running) -{ -} +wifi_indicate_addressing_running(NMPlatform *platform, int ifindex, gboolean running) +{} static guint32 -mesh_get_channel (NMPlatform *platform, int ifindex) +mesh_get_channel(NMPlatform *platform, int ifindex) { - return 0; + return 0; } static gboolean -mesh_set_channel (NMPlatform *platform, int ifindex, guint32 channel) +mesh_set_channel(NMPlatform *platform, int ifindex, guint32 channel) { - return FALSE; + return FALSE; } static gboolean -mesh_set_ssid (NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len) +mesh_set_ssid(NMPlatform *platform, int ifindex, const guint8 *ssid, gsize len) { - return FALSE; + return FALSE; } /*****************************************************************************/ static gboolean -ipx_address_add (NMPlatform *platform, int addr_family, const NMPlatformObject *address) +ipx_address_add(NMPlatform *platform, int addr_family, const NMPlatformObject *address) { - nm_auto_nmpobj NMPObject *obj = NULL; - NMPCacheOpsType cache_op; - nm_auto_nmpobj const NMPObject *obj_old = NULL; - nm_auto_nmpobj const NMPObject *obj_new = NULL; - NMPCache *cache = nm_platform_get_cache (platform); - - g_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6)); - - obj = nmp_object_new (addr_family == AF_INET - ? NMP_OBJECT_TYPE_IP4_ADDRESS - : NMP_OBJECT_TYPE_IP6_ADDRESS, - address); - - cache_op = nmp_cache_update_netlink (cache, obj, FALSE, &obj_old, &obj_new); - nm_platform_cache_update_emit_signal (platform, cache_op, obj_old, obj_new); - return TRUE; + nm_auto_nmpobj NMPObject *obj = NULL; + NMPCacheOpsType cache_op; + nm_auto_nmpobj const NMPObject *obj_old = NULL; + nm_auto_nmpobj const NMPObject *obj_new = NULL; + NMPCache * cache = nm_platform_get_cache(platform); + + g_assert(NM_IN_SET(addr_family, AF_INET, AF_INET6)); + + obj = nmp_object_new(addr_family == AF_INET ? NMP_OBJECT_TYPE_IP4_ADDRESS + : NMP_OBJECT_TYPE_IP6_ADDRESS, + address); + + cache_op = nmp_cache_update_netlink(cache, obj, FALSE, &obj_old, &obj_new); + nm_platform_cache_update_emit_signal(platform, cache_op, obj_old, obj_new); + return TRUE; } static gboolean -ip4_address_add (NMPlatform *platform, - int ifindex, - in_addr_t addr, - guint8 plen, - in_addr_t peer_addr, - in_addr_t broadcast_address, - guint32 lifetime, - guint32 preferred, - guint32 flags, - const char *label) +ip4_address_add(NMPlatform *platform, + int ifindex, + in_addr_t addr, + guint8 plen, + in_addr_t peer_addr, + in_addr_t broadcast_address, + guint32 lifetime, + guint32 preferred, + guint32 flags, + const char *label) { - NMPlatformIP4Address address; - - address = (NMPlatformIP4Address) { - .addr_source = NM_IP_CONFIG_SOURCE_KERNEL, - .ifindex = ifindex, - .address = addr, - .plen = plen, - .peer_address = peer_addr, - .broadcast_address = broadcast_address, - .use_ip4_broadcast_address = TRUE, - .timestamp = nm_utils_get_monotonic_timestamp_sec (), - .lifetime = lifetime, - .preferred = preferred, - .n_ifa_flags = flags, - }; - if (label) - g_strlcpy (address.label, label, sizeof (address.label)); - - return ipx_address_add (platform, AF_INET, (const NMPlatformObject *) &address); + NMPlatformIP4Address address; + + address = (NMPlatformIP4Address){ + .addr_source = NM_IP_CONFIG_SOURCE_KERNEL, + .ifindex = ifindex, + .address = addr, + .plen = plen, + .peer_address = peer_addr, + .broadcast_address = broadcast_address, + .use_ip4_broadcast_address = TRUE, + .timestamp = nm_utils_get_monotonic_timestamp_sec(), + .lifetime = lifetime, + .preferred = preferred, + .n_ifa_flags = flags, + }; + if (label) + g_strlcpy(address.label, label, sizeof(address.label)); + + return ipx_address_add(platform, AF_INET, (const NMPlatformObject *) &address); } static gboolean -ip6_address_add (NMPlatform *platform, - int ifindex, - struct in6_addr addr, - guint8 plen, - struct in6_addr peer_addr, - guint32 lifetime, - guint32 preferred, - guint32 flags) +ip6_address_add(NMPlatform * platform, + int ifindex, + struct in6_addr addr, + guint8 plen, + struct in6_addr peer_addr, + guint32 lifetime, + guint32 preferred, + guint32 flags) { - NMPlatformIP6Address address; - - memset (&address, 0, sizeof (address)); - address.addr_source = NM_IP_CONFIG_SOURCE_KERNEL; - address.ifindex = ifindex; - address.address = addr; - address.peer_address = (IN6_IS_ADDR_UNSPECIFIED (&peer_addr) || IN6_ARE_ADDR_EQUAL (&addr, &peer_addr)) ? in6addr_any : peer_addr; - address.plen = plen; - address.timestamp = nm_utils_get_monotonic_timestamp_sec (); - address.lifetime = lifetime; - address.preferred = preferred; - address.n_ifa_flags = flags; - - return ipx_address_add (platform, AF_INET6, (const NMPlatformObject *) &address); + NMPlatformIP6Address address; + + memset(&address, 0, sizeof(address)); + address.addr_source = NM_IP_CONFIG_SOURCE_KERNEL; + address.ifindex = ifindex; + address.address = addr; + address.peer_address = + (IN6_IS_ADDR_UNSPECIFIED(&peer_addr) || IN6_ARE_ADDR_EQUAL(&addr, &peer_addr)) ? in6addr_any + : peer_addr; + address.plen = plen; + address.timestamp = nm_utils_get_monotonic_timestamp_sec(); + address.lifetime = lifetime; + address.preferred = preferred; + address.n_ifa_flags = flags; + + return ipx_address_add(platform, AF_INET6, (const NMPlatformObject *) &address); } static gboolean -ipx_address_delete (NMPlatform *platform, - int addr_family, - int ifindex, - gconstpointer addr, - const guint8 *plen, - gconstpointer peer_addr) +ipx_address_delete(NMPlatform * platform, + int addr_family, + int ifindex, + gconstpointer addr, + const guint8 *plen, + gconstpointer peer_addr) { - gs_unref_ptrarray GPtrArray *objs = g_ptr_array_new_with_free_func ((GDestroyNotify) nmp_object_unref); - NMDedupMultiIter iter; - const NMPObject *o = NULL; - guint i; - guint32 peer_addr_i; - - g_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6)); - - peer_addr_i = peer_addr ? *((guint32 *) peer_addr) : 0; - - nmp_cache_iter_for_each (&iter, - nm_platform_lookup_object (platform, - addr_family == AF_INET - ? NMP_OBJECT_TYPE_IP4_ADDRESS - : NMP_OBJECT_TYPE_IP6_ADDRESS, - 0), - &o) { - const NMPObject *obj_old = NULL; - - if (addr_family == AF_INET) { - const NMPlatformIP4Address *address = NMP_OBJECT_CAST_IP4_ADDRESS (o); - - if ( address->ifindex != ifindex - || (addr && address->address != *((guint32 *) addr)) - || (plen && address->plen != *plen) - || ( peer_addr - && (((peer_addr_i ^ address->peer_address) & _nm_utils_ip4_prefix_to_netmask (address->plen)) != 0))) - continue; - } else { - const NMPlatformIP6Address *address = NMP_OBJECT_CAST_IP6_ADDRESS (o); - - g_assert (!peer_addr); - if ( address->ifindex != ifindex - || (addr && !IN6_ARE_ADDR_EQUAL (&address->address, addr)) - || (plen && address->plen != *plen)) - continue; - } - - if (nmp_cache_remove (nm_platform_get_cache (platform), - o, - TRUE, - FALSE, - &obj_old) != NMP_CACHE_OPS_REMOVED) - g_assert_not_reached (); - g_assert (obj_old); - g_ptr_array_add (objs, (gpointer) obj_old); - } - - for (i = 0; i < objs->len; i++) { - nm_platform_cache_update_emit_signal (platform, - NMP_CACHE_OPS_REMOVED, - objs->pdata[i], - NULL); - } - return TRUE; + gs_unref_ptrarray GPtrArray *objs = + g_ptr_array_new_with_free_func((GDestroyNotify) nmp_object_unref); + NMDedupMultiIter iter; + const NMPObject *o = NULL; + guint i; + guint32 peer_addr_i; + + g_assert(NM_IN_SET(addr_family, AF_INET, AF_INET6)); + + peer_addr_i = peer_addr ? *((guint32 *) peer_addr) : 0; + + nmp_cache_iter_for_each (&iter, + nm_platform_lookup_object(platform, + addr_family == AF_INET + ? NMP_OBJECT_TYPE_IP4_ADDRESS + : NMP_OBJECT_TYPE_IP6_ADDRESS, + 0), + &o) { + const NMPObject *obj_old = NULL; + + if (addr_family == AF_INET) { + const NMPlatformIP4Address *address = NMP_OBJECT_CAST_IP4_ADDRESS(o); + + if (address->ifindex != ifindex || (addr && address->address != *((guint32 *) addr)) + || (plen && address->plen != *plen) + || (peer_addr + && (((peer_addr_i ^ address->peer_address) + & _nm_utils_ip4_prefix_to_netmask(address->plen)) + != 0))) + continue; + } else { + const NMPlatformIP6Address *address = NMP_OBJECT_CAST_IP6_ADDRESS(o); + + g_assert(!peer_addr); + if (address->ifindex != ifindex + || (addr && !IN6_ARE_ADDR_EQUAL(&address->address, addr)) + || (plen && address->plen != *plen)) + continue; + } + + if (nmp_cache_remove(nm_platform_get_cache(platform), o, TRUE, FALSE, &obj_old) + != NMP_CACHE_OPS_REMOVED) + g_assert_not_reached(); + g_assert(obj_old); + g_ptr_array_add(objs, (gpointer) obj_old); + } + + for (i = 0; i < objs->len; i++) { + nm_platform_cache_update_emit_signal(platform, NMP_CACHE_OPS_REMOVED, objs->pdata[i], NULL); + } + return TRUE; } static gboolean -ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, guint8 plen, in_addr_t peer_address) +ip4_address_delete(NMPlatform *platform, + int ifindex, + in_addr_t addr, + guint8 plen, + in_addr_t peer_address) { - return ipx_address_delete (platform, AF_INET, ifindex, &addr, &plen, &peer_address); + return ipx_address_delete(platform, AF_INET, ifindex, &addr, &plen, &peer_address); } static gboolean -ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, guint8 plen) +ip6_address_delete(NMPlatform *platform, int ifindex, struct in6_addr addr, guint8 plen) { - return ipx_address_delete (platform, AF_INET6, ifindex, &addr, &plen, NULL); + return ipx_address_delete(platform, AF_INET6, ifindex, &addr, &plen, NULL); } /*****************************************************************************/ static gboolean -ipx_route_delete (NMPlatform *platform, - int addr_family, - int ifindex, - const NMPObject *obj) +ipx_route_delete(NMPlatform *platform, int addr_family, int ifindex, const NMPObject *obj) { - gs_unref_ptrarray GPtrArray *objs = g_ptr_array_new_with_free_func ((GDestroyNotify) nmp_object_unref); - NMDedupMultiIter iter; - const NMPObject *o = NULL; - guint i; - NMPObjectType obj_type; - - if (addr_family == AF_UNSPEC) { - g_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (obj), NMP_OBJECT_TYPE_IP4_ROUTE, - NMP_OBJECT_TYPE_IP6_ROUTE)); - g_assert (ifindex == -1); - ifindex = NMP_OBJECT_CAST_IP_ROUTE (obj)->ifindex; - obj_type = NMP_OBJECT_GET_TYPE (obj); - } else { - g_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6)); - g_assert (!obj); - g_assert (ifindex > 0); - obj_type = addr_family == AF_INET - ? NMP_OBJECT_TYPE_IP4_ROUTE - : NMP_OBJECT_TYPE_IP6_ROUTE; - } - - nmp_cache_iter_for_each (&iter, - nm_platform_lookup_object (platform, - obj_type, - ifindex), - &o) { - const NMPObject *obj_old = NULL; - - if (obj) { - if (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE) { - const NMPlatformIP4Route *route = NMP_OBJECT_CAST_IP4_ROUTE (o); - const NMPlatformIP4Route *r = NMP_OBJECT_CAST_IP4_ROUTE (obj); - - if ( route->network != r->network - || route->plen != r->plen - || route->metric != r->metric) - continue; - } else { - const NMPlatformIP6Route *route = NMP_OBJECT_CAST_IP6_ROUTE (o); - const NMPlatformIP6Route *r = NMP_OBJECT_CAST_IP6_ROUTE (obj); - - if ( !IN6_ARE_ADDR_EQUAL (&route->network, &r->network) - || route->plen != r->plen - || route->metric != r->metric) - continue; - } - } - - if (nmp_cache_remove (nm_platform_get_cache (platform), - o, - TRUE, - FALSE, - &obj_old) != NMP_CACHE_OPS_REMOVED) - g_assert_not_reached (); - g_assert (obj_old); - g_ptr_array_add (objs, (gpointer) obj_old); - } - - for (i = 0; i < objs->len; i++) { - nm_platform_cache_update_emit_signal (platform, - NMP_CACHE_OPS_REMOVED, - objs->pdata[i], - NULL); - } - return TRUE; + gs_unref_ptrarray GPtrArray *objs = + g_ptr_array_new_with_free_func((GDestroyNotify) nmp_object_unref); + NMDedupMultiIter iter; + const NMPObject *o = NULL; + guint i; + NMPObjectType obj_type; + + if (addr_family == AF_UNSPEC) { + g_assert(NM_IN_SET(NMP_OBJECT_GET_TYPE(obj), + NMP_OBJECT_TYPE_IP4_ROUTE, + NMP_OBJECT_TYPE_IP6_ROUTE)); + g_assert(ifindex == -1); + ifindex = NMP_OBJECT_CAST_IP_ROUTE(obj)->ifindex; + obj_type = NMP_OBJECT_GET_TYPE(obj); + } else { + g_assert(NM_IN_SET(addr_family, AF_INET, AF_INET6)); + g_assert(!obj); + g_assert(ifindex > 0); + obj_type = addr_family == AF_INET ? NMP_OBJECT_TYPE_IP4_ROUTE : NMP_OBJECT_TYPE_IP6_ROUTE; + } + + nmp_cache_iter_for_each (&iter, nm_platform_lookup_object(platform, obj_type, ifindex), &o) { + const NMPObject *obj_old = NULL; + + if (obj) { + if (obj_type == NMP_OBJECT_TYPE_IP4_ROUTE) { + const NMPlatformIP4Route *route = NMP_OBJECT_CAST_IP4_ROUTE(o); + const NMPlatformIP4Route *r = NMP_OBJECT_CAST_IP4_ROUTE(obj); + + if (route->network != r->network || route->plen != r->plen + || route->metric != r->metric) + continue; + } else { + const NMPlatformIP6Route *route = NMP_OBJECT_CAST_IP6_ROUTE(o); + const NMPlatformIP6Route *r = NMP_OBJECT_CAST_IP6_ROUTE(obj); + + if (!IN6_ARE_ADDR_EQUAL(&route->network, &r->network) || route->plen != r->plen + || route->metric != r->metric) + continue; + } + } + + if (nmp_cache_remove(nm_platform_get_cache(platform), o, TRUE, FALSE, &obj_old) + != NMP_CACHE_OPS_REMOVED) + g_assert_not_reached(); + g_assert(obj_old); + g_ptr_array_add(objs, (gpointer) obj_old); + } + + for (i = 0; i < objs->len; i++) { + nm_platform_cache_update_emit_signal(platform, NMP_CACHE_OPS_REMOVED, objs->pdata[i], NULL); + } + return TRUE; } static gboolean -object_delete (NMPlatform *platform, const NMPObject *obj) +object_delete(NMPlatform *platform, const NMPObject *obj) { - g_assert (NM_IS_FAKE_PLATFORM (platform)); - g_assert (NM_IN_SET (NMP_OBJECT_GET_TYPE (obj), NMP_OBJECT_TYPE_IP4_ROUTE, - NMP_OBJECT_TYPE_IP6_ROUTE)); + g_assert(NM_IS_FAKE_PLATFORM(platform)); + g_assert( + NM_IN_SET(NMP_OBJECT_GET_TYPE(obj), NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)); - return ipx_route_delete (platform, AF_UNSPEC, -1, obj); + return ipx_route_delete(platform, AF_UNSPEC, -1, obj); } static int -ip_route_add (NMPlatform *platform, - NMPNlmFlags flags, - int addr_family, - const NMPlatformIPRoute *route) +ip_route_add(NMPlatform * platform, + NMPNlmFlags flags, + int addr_family, + const NMPlatformIPRoute *route) { - NMDedupMultiIter iter; - nm_auto_nmpobj NMPObject *obj = NULL; - NMPCacheOpsType cache_op; - const NMPObject *o = NULL; - nm_auto_nmpobj const NMPObject *obj_old = NULL; - nm_auto_nmpobj const NMPObject *obj_new = NULL; - nm_auto_nmpobj const NMPObject *obj_replace = NULL; - NMPCache *cache = nm_platform_get_cache (platform); - gboolean has_gateway = FALSE; - NMPlatformIPRoute *r = NULL; - NMPlatformIP4Route *r4 = NULL; - NMPlatformIP6Route *r6 = NULL; - gboolean has_same_weak_id; - gboolean only_dirty; - guint16 nlmsgflags; - - g_assert (NM_IN_SET (addr_family, AF_INET, AF_INET6)); - - flags = NM_FLAGS_UNSET (flags, NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE); - - /* currently, only replace is implemented. */ - g_assert (flags == NMP_NLM_FLAG_REPLACE); - - obj = nmp_object_new (addr_family == AF_INET - ? NMP_OBJECT_TYPE_IP4_ROUTE - : NMP_OBJECT_TYPE_IP6_ROUTE, - (const NMPlatformObject *) route); - r = NMP_OBJECT_CAST_IP_ROUTE (obj); - nm_platform_ip_route_normalize (addr_family, r); - - switch (addr_family) { - case AF_INET: - r4 = NMP_OBJECT_CAST_IP4_ROUTE (obj); - if (r4->gateway) - has_gateway = TRUE; - break; - case AF_INET6: - r6 = NMP_OBJECT_CAST_IP6_ROUTE (obj); - if (!IN6_IS_ADDR_UNSPECIFIED (&r6->gateway)) - has_gateway = TRUE; - break; - default: - nm_assert_not_reached (); - } - - if (has_gateway) { - gboolean has_route_to_gw = FALSE; - - nmp_cache_iter_for_each (&iter, - nm_platform_lookup_object (platform, - NMP_OBJECT_GET_TYPE (obj), - 0), - &o) { - if (addr_family == AF_INET) { - const NMPlatformIP4Route *item = NMP_OBJECT_CAST_IP4_ROUTE (o); - guint32 n = nm_utils_ip4_address_clear_host_address (item->network, item->plen); - guint32 g = nm_utils_ip4_address_clear_host_address (r4->gateway, item->plen); - - if ( r->ifindex == item->ifindex - && n == g) { - has_route_to_gw = TRUE; - break; - } - } else { - const NMPlatformIP6Route *item = NMP_OBJECT_CAST_IP6_ROUTE (o); - - if ( r->ifindex == item->ifindex - && nm_utils_ip6_address_same_prefix (&r6->gateway, &item->network, item->plen)) { - has_route_to_gw = TRUE; - break; - } - } - } - if (!has_route_to_gw) { - char sbuf[NM_UTILS_INET_ADDRSTRLEN]; - - if (addr_family == AF_INET) { - nm_log_warn (LOGD_PLATFORM, "Fake platform: failure adding ip4-route '%d: %s/%d %d': Network Unreachable", - r->ifindex, _nm_utils_inet4_ntop (r4->network, sbuf), r->plen, r->metric); - } else { - nm_log_warn (LOGD_PLATFORM, "Fake platform: failure adding ip6-route '%d: %s/%d %d': Network Unreachable", - r->ifindex, _nm_utils_inet6_ntop (&r6->network, sbuf), r->plen, r->metric); - } - return -NME_UNSPEC; - } - } - - has_same_weak_id = FALSE; - nmp_cache_iter_for_each (&iter, - nm_platform_lookup_all (platform, - NMP_CACHE_ID_TYPE_ROUTES_BY_WEAK_ID, - obj), - &o) { - if (addr_family == AF_INET) { - if (nm_platform_ip4_route_cmp (NMP_OBJECT_CAST_IP4_ROUTE (o), r4, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) == 0) - continue; - } else { - if (nm_platform_ip6_route_cmp (NMP_OBJECT_CAST_IP6_ROUTE (o), r6, NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) == 0) - continue; - } - has_same_weak_id = TRUE; - } - - nlmsgflags = 0; - if (has_same_weak_id) { - switch (flags) { - case NMP_NLM_FLAG_REPLACE: - nlmsgflags = NLM_F_REPLACE; - break; - default: - g_assert_not_reached (); - break; - } - } - - /* we manipulate the cache the same was as NMLinuxPlatform does it. */ - cache_op = nmp_cache_update_netlink_route (cache, - obj, - FALSE, - nlmsgflags, - &obj_old, - &obj_new, - &obj_replace, - NULL); - only_dirty = FALSE; - if (cache_op != NMP_CACHE_OPS_UNCHANGED) { - if (obj_replace) { - const NMDedupMultiEntry *entry_replace; - - entry_replace = nmp_cache_lookup_entry (cache, obj_replace); - nm_assert (entry_replace && entry_replace->obj == obj_replace); - nm_dedup_multi_entry_set_dirty (entry_replace, TRUE); - only_dirty = TRUE; - } - nm_platform_cache_update_emit_signal (platform, cache_op, obj_old, obj_new); - } - - if (obj_replace) { - cache_op = nmp_cache_remove (cache, obj_replace, TRUE, only_dirty, NULL); - if (cache_op != NMP_CACHE_OPS_UNCHANGED) { - nm_assert (cache_op == NMP_CACHE_OPS_REMOVED); - nm_platform_cache_update_emit_signal (platform, cache_op, obj_replace, NULL); - } - } - - return 0; + NMDedupMultiIter iter; + nm_auto_nmpobj NMPObject *obj = NULL; + NMPCacheOpsType cache_op; + const NMPObject * o = NULL; + nm_auto_nmpobj const NMPObject *obj_old = NULL; + nm_auto_nmpobj const NMPObject *obj_new = NULL; + nm_auto_nmpobj const NMPObject *obj_replace = NULL; + NMPCache * cache = nm_platform_get_cache(platform); + gboolean has_gateway = FALSE; + NMPlatformIPRoute * r = NULL; + NMPlatformIP4Route * r4 = NULL; + NMPlatformIP6Route * r6 = NULL; + gboolean has_same_weak_id; + gboolean only_dirty; + guint16 nlmsgflags; + + g_assert(NM_IN_SET(addr_family, AF_INET, AF_INET6)); + + flags = NM_FLAGS_UNSET(flags, NMP_NLM_FLAG_SUPPRESS_NETLINK_FAILURE); + + /* currently, only replace is implemented. */ + g_assert(flags == NMP_NLM_FLAG_REPLACE); + + obj = nmp_object_new(addr_family == AF_INET ? NMP_OBJECT_TYPE_IP4_ROUTE + : NMP_OBJECT_TYPE_IP6_ROUTE, + (const NMPlatformObject *) route); + r = NMP_OBJECT_CAST_IP_ROUTE(obj); + nm_platform_ip_route_normalize(addr_family, r); + + switch (addr_family) { + case AF_INET: + r4 = NMP_OBJECT_CAST_IP4_ROUTE(obj); + if (r4->gateway) + has_gateway = TRUE; + break; + case AF_INET6: + r6 = NMP_OBJECT_CAST_IP6_ROUTE(obj); + if (!IN6_IS_ADDR_UNSPECIFIED(&r6->gateway)) + has_gateway = TRUE; + break; + default: + nm_assert_not_reached(); + } + + if (has_gateway) { + gboolean has_route_to_gw = FALSE; + + nmp_cache_iter_for_each (&iter, + nm_platform_lookup_object(platform, NMP_OBJECT_GET_TYPE(obj), 0), + &o) { + if (addr_family == AF_INET) { + const NMPlatformIP4Route *item = NMP_OBJECT_CAST_IP4_ROUTE(o); + guint32 n = nm_utils_ip4_address_clear_host_address(item->network, item->plen); + guint32 g = nm_utils_ip4_address_clear_host_address(r4->gateway, item->plen); + + if (r->ifindex == item->ifindex && n == g) { + has_route_to_gw = TRUE; + break; + } + } else { + const NMPlatformIP6Route *item = NMP_OBJECT_CAST_IP6_ROUTE(o); + + if (r->ifindex == item->ifindex + && nm_utils_ip6_address_same_prefix(&r6->gateway, &item->network, item->plen)) { + has_route_to_gw = TRUE; + break; + } + } + } + if (!has_route_to_gw) { + char sbuf[NM_UTILS_INET_ADDRSTRLEN]; + + if (addr_family == AF_INET) { + nm_log_warn( + LOGD_PLATFORM, + "Fake platform: failure adding ip4-route '%d: %s/%d %d': Network Unreachable", + r->ifindex, + _nm_utils_inet4_ntop(r4->network, sbuf), + r->plen, + r->metric); + } else { + nm_log_warn( + LOGD_PLATFORM, + "Fake platform: failure adding ip6-route '%d: %s/%d %d': Network Unreachable", + r->ifindex, + _nm_utils_inet6_ntop(&r6->network, sbuf), + r->plen, + r->metric); + } + return -NME_UNSPEC; + } + } + + has_same_weak_id = FALSE; + nmp_cache_iter_for_each ( + &iter, + nm_platform_lookup_all(platform, NMP_CACHE_ID_TYPE_ROUTES_BY_WEAK_ID, obj), + &o) { + if (addr_family == AF_INET) { + if (nm_platform_ip4_route_cmp(NMP_OBJECT_CAST_IP4_ROUTE(o), + r4, + NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) + == 0) + continue; + } else { + if (nm_platform_ip6_route_cmp(NMP_OBJECT_CAST_IP6_ROUTE(o), + r6, + NM_PLATFORM_IP_ROUTE_CMP_TYPE_ID) + == 0) + continue; + } + has_same_weak_id = TRUE; + } + + nlmsgflags = 0; + if (has_same_weak_id) { + switch (flags) { + case NMP_NLM_FLAG_REPLACE: + nlmsgflags = NLM_F_REPLACE; + break; + default: + g_assert_not_reached(); + break; + } + } + + /* we manipulate the cache the same was as NMLinuxPlatform does it. */ + cache_op = nmp_cache_update_netlink_route(cache, + obj, + FALSE, + nlmsgflags, + &obj_old, + &obj_new, + &obj_replace, + NULL); + only_dirty = FALSE; + if (cache_op != NMP_CACHE_OPS_UNCHANGED) { + if (obj_replace) { + const NMDedupMultiEntry *entry_replace; + + entry_replace = nmp_cache_lookup_entry(cache, obj_replace); + nm_assert(entry_replace && entry_replace->obj == obj_replace); + nm_dedup_multi_entry_set_dirty(entry_replace, TRUE); + only_dirty = TRUE; + } + nm_platform_cache_update_emit_signal(platform, cache_op, obj_old, obj_new); + } + + if (obj_replace) { + cache_op = nmp_cache_remove(cache, obj_replace, TRUE, only_dirty, NULL); + if (cache_op != NMP_CACHE_OPS_UNCHANGED) { + nm_assert(cache_op == NMP_CACHE_OPS_REMOVED); + nm_platform_cache_update_emit_signal(platform, cache_op, obj_replace, NULL); + } + } + + return 0; } /*****************************************************************************/ static void -nm_fake_platform_init (NMFakePlatform *fake_platform) +nm_fake_platform_init(NMFakePlatform *fake_platform) { - NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (fake_platform); + NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE(fake_platform); - priv->options = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free); - priv->links = g_array_new (TRUE, TRUE, sizeof (NMFakePlatformLink)); + priv->options = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, g_free); + priv->links = g_array_new(TRUE, TRUE, sizeof(NMFakePlatformLink)); } void -nm_fake_platform_setup (void) +nm_fake_platform_setup(void) { - NMPlatform *platform; + NMPlatform *platform; - platform = g_object_new (NM_TYPE_FAKE_PLATFORM, - NM_PLATFORM_LOG_WITH_PTR, FALSE, - NULL); + platform = g_object_new(NM_TYPE_FAKE_PLATFORM, NM_PLATFORM_LOG_WITH_PTR, FALSE, NULL); - nm_platform_setup (platform); + nm_platform_setup(platform); - link_add (platform, NM_LINK_TYPE_LOOPBACK, "lo", 0, NULL, 0, NULL, NULL); - link_add (platform, NM_LINK_TYPE_ETHERNET, "eth0", 0, NULL, 0, NULL, NULL); - link_add (platform, NM_LINK_TYPE_ETHERNET, "eth1", 0, NULL, 0, NULL, NULL); - link_add (platform, NM_LINK_TYPE_ETHERNET, "eth2", 0, NULL, 0, NULL, NULL); + link_add(platform, NM_LINK_TYPE_LOOPBACK, "lo", 0, NULL, 0, NULL, NULL); + link_add(platform, NM_LINK_TYPE_ETHERNET, "eth0", 0, NULL, 0, NULL, NULL); + link_add(platform, NM_LINK_TYPE_ETHERNET, "eth1", 0, NULL, 0, NULL, NULL); + link_add(platform, NM_LINK_TYPE_ETHERNET, "eth2", 0, NULL, 0, NULL, NULL); } static void -finalize (GObject *object) +finalize(GObject *object) { - NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (object); - int i; + NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE(object); + int i; - g_hash_table_unref (priv->options); - for (i = 0; i < priv->links->len; i++) { - NMFakePlatformLink *device = &g_array_index (priv->links, NMFakePlatformLink, i); + g_hash_table_unref(priv->options); + for (i = 0; i < priv->links->len; i++) { + NMFakePlatformLink *device = &g_array_index(priv->links, NMFakePlatformLink, i); - nm_clear_pointer (&device->obj, nmp_object_unref); - } - g_array_unref (priv->links); + nm_clear_pointer(&device->obj, nmp_object_unref); + } + g_array_unref(priv->links); - G_OBJECT_CLASS (nm_fake_platform_parent_class)->finalize (object); + G_OBJECT_CLASS(nm_fake_platform_parent_class)->finalize(object); } static void -nm_fake_platform_class_init (NMFakePlatformClass *klass) +nm_fake_platform_class_init(NMFakePlatformClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - NMPlatformClass *platform_class = NM_PLATFORM_CLASS (klass); - NMPlatformKernelSupportType kernel_support; + GObjectClass * object_class = G_OBJECT_CLASS(klass); + NMPlatformClass * platform_class = NM_PLATFORM_CLASS(klass); + NMPlatformKernelSupportType kernel_support; - for (kernel_support = 0; kernel_support < _NM_PLATFORM_KERNEL_SUPPORT_NUM; kernel_support++) - _nm_platform_kernel_support_init (kernel_support, -1); + for (kernel_support = 0; kernel_support < _NM_PLATFORM_KERNEL_SUPPORT_NUM; kernel_support++) + _nm_platform_kernel_support_init(kernel_support, -1); - object_class->finalize = finalize; + object_class->finalize = finalize; - platform_class->sysctl_set = sysctl_set; - platform_class->sysctl_get = sysctl_get; + platform_class->sysctl_set = sysctl_set; + platform_class->sysctl_get = sysctl_get; - platform_class->link_add = link_add; - platform_class->link_delete = link_delete; + platform_class->link_add = link_add; + platform_class->link_delete = link_delete; - platform_class->link_set_up = link_set_up; - platform_class->link_set_down = link_set_down; - platform_class->link_set_arp = link_set_arp; - platform_class->link_set_noarp = link_set_noarp; + platform_class->link_set_up = link_set_up; + platform_class->link_set_down = link_set_down; + platform_class->link_set_arp = link_set_arp; + platform_class->link_set_noarp = link_set_noarp; - platform_class->link_set_address = link_set_address; - platform_class->link_set_mtu = link_set_mtu; + platform_class->link_set_address = link_set_address; + platform_class->link_set_mtu = link_set_mtu; - platform_class->link_get_driver_info = link_get_driver_info; + platform_class->link_get_driver_info = link_get_driver_info; - platform_class->link_supports_carrier_detect = link_supports_carrier_detect; - platform_class->link_supports_vlans = link_supports_vlans; - platform_class->link_supports_sriov = link_supports_sriov; + platform_class->link_supports_carrier_detect = link_supports_carrier_detect; + platform_class->link_supports_vlans = link_supports_vlans; + platform_class->link_supports_sriov = link_supports_sriov; - platform_class->link_enslave = link_enslave; - platform_class->link_release = link_release; + platform_class->link_enslave = link_enslave; + platform_class->link_release = link_release; - platform_class->link_vlan_change = link_vlan_change; + platform_class->link_vlan_change = link_vlan_change; - platform_class->infiniband_partition_add = infiniband_partition_add; - platform_class->infiniband_partition_delete = infiniband_partition_delete; + platform_class->infiniband_partition_add = infiniband_partition_add; + platform_class->infiniband_partition_delete = infiniband_partition_delete; - platform_class->wifi_get_capabilities = wifi_get_capabilities; - platform_class->wifi_get_bssid = wifi_get_bssid; - platform_class->wifi_get_frequency = wifi_get_frequency; - platform_class->wifi_get_quality = wifi_get_quality; - platform_class->wifi_get_rate = wifi_get_rate; - platform_class->wifi_get_mode = wifi_get_mode; - platform_class->wifi_set_mode = wifi_set_mode; - platform_class->wifi_find_frequency = wifi_find_frequency; - platform_class->wifi_indicate_addressing_running = wifi_indicate_addressing_running; + platform_class->wifi_get_capabilities = wifi_get_capabilities; + platform_class->wifi_get_bssid = wifi_get_bssid; + platform_class->wifi_get_frequency = wifi_get_frequency; + platform_class->wifi_get_quality = wifi_get_quality; + platform_class->wifi_get_rate = wifi_get_rate; + platform_class->wifi_get_mode = wifi_get_mode; + platform_class->wifi_set_mode = wifi_set_mode; + platform_class->wifi_find_frequency = wifi_find_frequency; + platform_class->wifi_indicate_addressing_running = wifi_indicate_addressing_running; - platform_class->mesh_get_channel = mesh_get_channel; - platform_class->mesh_set_channel = mesh_set_channel; - platform_class->mesh_set_ssid = mesh_set_ssid; + platform_class->mesh_get_channel = mesh_get_channel; + platform_class->mesh_set_channel = mesh_set_channel; + platform_class->mesh_set_ssid = mesh_set_ssid; - platform_class->ip4_address_add = ip4_address_add; - platform_class->ip6_address_add = ip6_address_add; - platform_class->ip4_address_delete = ip4_address_delete; - platform_class->ip6_address_delete = ip6_address_delete; + platform_class->ip4_address_add = ip4_address_add; + platform_class->ip6_address_add = ip6_address_add; + platform_class->ip4_address_delete = ip4_address_delete; + platform_class->ip6_address_delete = ip6_address_delete; - platform_class->ip_route_add = ip_route_add; - platform_class->object_delete = object_delete; + platform_class->ip_route_add = ip_route_add; + platform_class->object_delete = object_delete; } |