summary refs log tree commit diff
path: root/src/platform/tests/test-common.h
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2020-10-05 22:27:18 +0200
committerMichael Biebl <biebl@debian.org>2020-10-05 22:27:18 +0200
commitaafc1dbe4712c86189bbc1d4d54ad8cb4c69be7e (patch)
treea2a9bb4d007339a0b1304540388230ccedac32bd /src/platform/tests/test-common.h
parente7b44ef4c80907346ec7492a09c45277459924fc (diff)
New upstream version 1.27.90 upstream/1.27.90
Diffstat (limited to 'src/platform/tests/test-common.h')
-rw-r--r--src/platform/tests/test-common.h803
1 files changed, 466 insertions, 337 deletions
diff --git a/src/platform/tests/test-common.h b/src/platform/tests/test-common.h
index 522c3756..1d996f46 100644
--- a/src/platform/tests/test-common.h
+++ b/src/platform/tests/test-common.h
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0+
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * Copyright (C) 2016 - 2017 Red Hat, Inc.
  */
@@ -22,359 +22,476 @@
 
 /*****************************************************************************/
 
-#define _NMLOG_PREFIX_NAME                "platform-test"
-#define _NMLOG_DOMAIN                     LOGD_PLATFORM
-#define _NMLOG(level, ...)                _LOG(level, _NMLOG_DOMAIN, __VA_ARGS__)
-
-#define _LOG(level, domain, ...) \
-    G_STMT_START { \
-        const NMLogLevel __level = (level); \
-        const NMLogDomain __domain = (domain); \
-        \
-        if (nm_logging_enabled (__level, __domain)) { \
-            gint64 _ts = nm_utils_get_monotonic_timestamp_nsec (); \
-            \
-            _nm_log (__level, __domain, 0, NULL, NULL, \
-                     "%s[%ld.%09ld]: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
-                     _NMLOG_PREFIX_NAME, \
-                     (long) (_ts / NM_UTILS_NSEC_PER_SEC), \
-                     (long) (_ts % NM_UTILS_NSEC_PER_SEC) \
-                     _NM_UTILS_MACRO_REST (__VA_ARGS__)); \
-        } \
-    } G_STMT_END
+#define _NMLOG_PREFIX_NAME "platform-test"
+#define _NMLOG_DOMAIN      LOGD_PLATFORM
+#define _NMLOG(level, ...) _LOG(level, _NMLOG_DOMAIN, __VA_ARGS__)
+
+#define _LOG(level, domain, ...)                                                             \
+    G_STMT_START                                                                             \
+    {                                                                                        \
+        const NMLogLevel  __level  = (level);                                                \
+        const NMLogDomain __domain = (domain);                                               \
+                                                                                             \
+        if (nm_logging_enabled(__level, __domain)) {                                         \
+            gint64 _ts = nm_utils_get_monotonic_timestamp_nsec();                            \
+                                                                                             \
+            _nm_log(__level,                                                                 \
+                    __domain,                                                                \
+                    0,                                                                       \
+                    NULL,                                                                    \
+                    NULL,                                                                    \
+                    "%s[%ld.%09ld]: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__),                    \
+                    _NMLOG_PREFIX_NAME,                                                      \
+                    (long) (_ts / NM_UTILS_NSEC_PER_SEC),                                    \
+                    (long) (_ts % NM_UTILS_NSEC_PER_SEC) _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
+        }                                                                                    \
+    }                                                                                        \
+    G_STMT_END
 
 /*****************************************************************************/
 
-gboolean nmtstp_is_root_test (void);
-gboolean nmtstp_is_sysfs_writable (void);
+gboolean nmtstp_is_root_test(void);
+gboolean nmtstp_is_sysfs_writable(void);
 
 /*****************************************************************************/
 
 typedef struct _NMTstpNamespaceHandle NMTstpNamespaceHandle;
 
-NMTstpNamespaceHandle *nmtstp_namespace_create (int flags, GError **error);
+NMTstpNamespaceHandle *nmtstp_namespace_create(int flags, GError **error);
 
-void nmtstp_namespace_handle_release (NMTstpNamespaceHandle *handle);
-pid_t nmtstp_namespace_handle_get_pid (NMTstpNamespaceHandle *handle);
+void  nmtstp_namespace_handle_release(NMTstpNamespaceHandle *handle);
+pid_t nmtstp_namespace_handle_get_pid(NMTstpNamespaceHandle *handle);
 
-int nmtstp_namespace_get_fd_for_process (pid_t pid, const char *ns_name);
+int nmtstp_namespace_get_fd_for_process(pid_t pid, const char *ns_name);
 
 /*****************************************************************************/
 
-void nmtstp_netns_select_random (NMPlatform **platforms, gsize n_platforms, NMPNetns **netns);
+void nmtstp_netns_select_random(NMPlatform **platforms, gsize n_platforms, NMPNetns **netns);
 
 /*****************************************************************************/
 
 typedef struct {
-	gulong handler_id;
-	const char *name;
-	NMPlatformSignalChangeType change_type;
-	int received_count;
-	GMainLoop *loop;
-	int ifindex;
-	const char *ifname;
+    gulong                     handler_id;
+    const char *               name;
+    NMPlatformSignalChangeType change_type;
+    int                        received_count;
+    GMainLoop *                loop;
+    int                        ifindex;
+    const char *               ifname;
 } SignalData;
 
-SignalData *add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCallback callback, int ifindex, const char *ifname);
-#define add_signal(name, change_type, callback) add_signal_full (name, change_type, (GCallback) callback, 0, NULL)
-#define add_signal_ifindex(name, change_type, callback, ifindex) add_signal_full (name, change_type, (GCallback) callback, ifindex, NULL)
-#define add_signal_ifname(name, change_type, callback, ifname) add_signal_full (name, change_type, (GCallback) callback, 0, ifname)
-void _accept_signal (const char *file, int line, const char *func, SignalData *data);
-void _accept_signals (const char *file, int line, const char *func, SignalData *data, int min, int max);
-void _wait_signal (const char *file, int line, const char *func, SignalData *data);
-void _accept_or_wait_signal (const char *file, int line, const char *func, SignalData *data);
-void _ensure_no_signal (const char *file, int line, const char *func, SignalData *data);
-void _free_signal (const char *file, int line, const char *func, SignalData *data);
+SignalData *add_signal_full(const char *               name,
+                            NMPlatformSignalChangeType change_type,
+                            GCallback                  callback,
+                            int                        ifindex,
+                            const char *               ifname);
+#define add_signal(name, change_type, callback) \
+    add_signal_full(name, change_type, (GCallback) callback, 0, NULL)
+#define add_signal_ifindex(name, change_type, callback, ifindex) \
+    add_signal_full(name, change_type, (GCallback) callback, ifindex, NULL)
+#define add_signal_ifname(name, change_type, callback, ifname) \
+    add_signal_full(name, change_type, (GCallback) callback, 0, ifname)
+void _accept_signal(const char *file, int line, const char *func, SignalData *data);
+void
+_accept_signals(const char *file, int line, const char *func, SignalData *data, int min, int max);
+void _wait_signal(const char *file, int line, const char *func, SignalData *data);
+void _accept_or_wait_signal(const char *file, int line, const char *func, SignalData *data);
+void _ensure_no_signal(const char *file, int line, const char *func, SignalData *data);
+void _free_signal(const char *file, int line, const char *func, SignalData *data);
 #define accept_signal(data) _accept_signal(__FILE__, __LINE__, G_STRFUNC, data)
-#define accept_signals(data, min, max) _accept_signals(__FILE__, __LINE__, G_STRFUNC, data, min, max)
-#define wait_signal(data) _wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
+#define accept_signals(data, min, max) \
+    _accept_signals(__FILE__, __LINE__, G_STRFUNC, data, min, max)
+#define wait_signal(data)           _wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
 #define accept_or_wait_signal(data) _accept_or_wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
-#define ensure_no_signal(data) _ensure_no_signal(__FILE__, __LINE__, G_STRFUNC, data)
-#define free_signal(data) _free_signal(__FILE__, __LINE__, G_STRFUNC, data)
+#define ensure_no_signal(data)      _ensure_no_signal(__FILE__, __LINE__, G_STRFUNC, data)
+#define free_signal(data)           _free_signal(__FILE__, __LINE__, G_STRFUNC, data)
 
-void link_callback (NMPlatform *platform, int obj_type_i, int ifindex, NMPlatformLink *received, int change_type_i, SignalData *data);
+void link_callback(NMPlatform *    platform,
+                   int             obj_type_i,
+                   int             ifindex,
+                   NMPlatformLink *received,
+                   int             change_type_i,
+                   SignalData *    data);
 
 /*****************************************************************************/
 
-int nmtstp_run_command (const char *format, ...) _nm_printf (1, 2);
-#define nmtstp_run_command_check(...) do { g_assert_cmpint (nmtstp_run_command (__VA_ARGS__), ==, 0); } while (0)
+int nmtstp_run_command(const char *format, ...) _nm_printf(1, 2);
+#define nmtstp_run_command_check(...)                            \
+    do {                                                         \
+        g_assert_cmpint(nmtstp_run_command(__VA_ARGS__), ==, 0); \
+    } while (0)
 
 /*****************************************************************************/
 
-guint nmtstp_wait_for_signal (NMPlatform *platform, gint64 timeout_msec);
-guint nmtstp_wait_for_signal_until (NMPlatform *platform, gint64 until_ms);
-const NMPlatformLink *nmtstp_wait_for_link (NMPlatform *platform, const char *ifname, NMLinkType expected_link_type, gint64 timeout_msec);
-const NMPlatformLink *nmtstp_wait_for_link_until (NMPlatform *platform, const char *ifname, NMLinkType expected_link_type, gint64 until_ms);
-
-#define nmtstp_assert_wait_for_signal(platform, timeout_msec) \
-	G_STMT_START { \
-		if (nmtstp_wait_for_signal (platform, timeout_msec) == 0) \
-			g_assert_not_reached (); \
-	} G_STMT_END
-
-#define nmtstp_assert_wait_for_signal_until(platform, until_ms) \
-	G_STMT_START { \
-		if (nmtstp_wait_for_signal_until (platform, until_ms) == 0) \
-			g_assert_not_reached (); \
-	} G_STMT_END
+guint                 nmtstp_wait_for_signal(NMPlatform *platform, gint64 timeout_msec);
+guint                 nmtstp_wait_for_signal_until(NMPlatform *platform, gint64 until_ms);
+const NMPlatformLink *nmtstp_wait_for_link(NMPlatform *platform,
+                                           const char *ifname,
+                                           NMLinkType  expected_link_type,
+                                           gint64      timeout_msec);
+const NMPlatformLink *nmtstp_wait_for_link_until(NMPlatform *platform,
+                                                 const char *ifname,
+                                                 NMLinkType  expected_link_type,
+                                                 gint64      until_ms);
+
+#define nmtstp_assert_wait_for_signal(platform, timeout_msec)    \
+    G_STMT_START                                                 \
+    {                                                            \
+        if (nmtstp_wait_for_signal(platform, timeout_msec) == 0) \
+            g_assert_not_reached();                              \
+    }                                                            \
+    G_STMT_END
+
+#define nmtstp_assert_wait_for_signal_until(platform, until_ms)    \
+    G_STMT_START                                                   \
+    {                                                              \
+        if (nmtstp_wait_for_signal_until(platform, until_ms) == 0) \
+            g_assert_not_reached();                                \
+    }                                                              \
+    G_STMT_END
 
 #define nmtstp_assert_wait_for_link(platform, ifname, expected_link_type, timeout_msec) \
-	nmtst_assert_nonnull (nmtstp_wait_for_link (platform, ifname, expected_link_type, timeout_msec))
+    nmtst_assert_nonnull(nmtstp_wait_for_link(platform, ifname, expected_link_type, timeout_msec))
 
 #define nmtstp_assert_wait_for_link_until(platform, ifname, expected_link_type, until_ms) \
-	nmtst_assert_nonnull (nmtstp_wait_for_link_until (platform, ifname, expected_link_type, until_ms))
+    nmtst_assert_nonnull(nmtstp_wait_for_link_until(platform, ifname, expected_link_type, until_ms))
 
 /*****************************************************************************/
 
-int nmtstp_run_command_check_external_global (void);
-gboolean nmtstp_run_command_check_external (int external_command);
+int      nmtstp_run_command_check_external_global(void);
+gboolean nmtstp_run_command_check_external(int external_command);
 
 /*****************************************************************************/
 
-const NMPlatformIP4Route *_nmtstp_assert_ip4_route_exists (const char *file,
-                                                           guint line,
-                                                           const char *func,
-                                                           NMPlatform *platform,
-                                                           int c_exists,
-                                                           const char *ifname,
-                                                           guint32 network,
-                                                           int plen,
-                                                           guint32 metric,
-                                                           guint8 tos);
-#define nmtstp_assert_ip4_route_exists(platform, c_exists, ifname, network, plen, metric, tos) _nmtstp_assert_ip4_route_exists (__FILE__, __LINE__, G_STRFUNC, platform, c_exists, ifname, network, plen, metric, tos)
-
-const NMPlatformIP4Route *nmtstp_ip4_route_get (NMPlatform *platform,
-                                                int ifindex,
-                                                guint32 network,
-                                                int plen,
-                                                guint32 metric,
-                                                guint8 tos);
-
-const NMPlatformIP6Route *_nmtstp_assert_ip6_route_exists (const char *file,
-                                                           guint line,
-                                                           const char *func,
-                                                           NMPlatform *platform,
-                                                           int c_exists,
-                                                           const char *ifname,
-                                                           const struct in6_addr *network,
-                                                           guint plen,
-                                                           guint32 metric,
-                                                           const struct in6_addr *src,
-                                                           guint8 src_plen);
-#define nmtstp_assert_ip6_route_exists(platform, c_exists, ifname, network, plen, metric, src, src_plen) _nmtstp_assert_ip6_route_exists (__FILE__, __LINE__, G_STRFUNC, platform, c_exists, ifname, network, plen, metric, src, src_plen)
-
-const NMPlatformIP6Route *nmtstp_ip6_route_get (NMPlatform *platform,
-                                                int ifindex,
-                                                const struct in6_addr *network,
-                                                guint plen,
-                                                guint32 metric,
-                                                const struct in6_addr *src,
-                                                guint8 src_plen);
+const NMPlatformIP4Route *_nmtstp_assert_ip4_route_exists(const char *file,
+                                                          guint       line,
+                                                          const char *func,
+                                                          NMPlatform *platform,
+                                                          int         c_exists,
+                                                          const char *ifname,
+                                                          guint32     network,
+                                                          int         plen,
+                                                          guint32     metric,
+                                                          guint8      tos);
+#define nmtstp_assert_ip4_route_exists(platform, c_exists, ifname, network, plen, metric, tos) \
+    _nmtstp_assert_ip4_route_exists(__FILE__,                                                  \
+                                    __LINE__,                                                  \
+                                    G_STRFUNC,                                                 \
+                                    platform,                                                  \
+                                    c_exists,                                                  \
+                                    ifname,                                                    \
+                                    network,                                                   \
+                                    plen,                                                      \
+                                    metric,                                                    \
+                                    tos)
+
+const NMPlatformIP4Route *nmtstp_ip4_route_get(NMPlatform *platform,
+                                               int         ifindex,
+                                               guint32     network,
+                                               int         plen,
+                                               guint32     metric,
+                                               guint8      tos);
+
+const NMPlatformIP6Route *_nmtstp_assert_ip6_route_exists(const char *           file,
+                                                          guint                  line,
+                                                          const char *           func,
+                                                          NMPlatform *           platform,
+                                                          int                    c_exists,
+                                                          const char *           ifname,
+                                                          const struct in6_addr *network,
+                                                          guint                  plen,
+                                                          guint32                metric,
+                                                          const struct in6_addr *src,
+                                                          guint8                 src_plen);
+#define nmtstp_assert_ip6_route_exists(platform, \
+                                       c_exists, \
+                                       ifname,   \
+                                       network,  \
+                                       plen,     \
+                                       metric,   \
+                                       src,      \
+                                       src_plen) \
+    _nmtstp_assert_ip6_route_exists(__FILE__,    \
+                                    __LINE__,    \
+                                    G_STRFUNC,   \
+                                    platform,    \
+                                    c_exists,    \
+                                    ifname,      \
+                                    network,     \
+                                    plen,        \
+                                    metric,      \
+                                    src,         \
+                                    src_plen)
+
+const NMPlatformIP6Route *nmtstp_ip6_route_get(NMPlatform *           platform,
+                                               int                    ifindex,
+                                               const struct in6_addr *network,
+                                               guint                  plen,
+                                               guint32                metric,
+                                               const struct in6_addr *src,
+                                               guint8                 src_plen);
 
 /*****************************************************************************/
 
-gboolean nmtstp_ip_address_check_lifetime (const NMPlatformIPAddress *addr,
-                                           gint64 now,
-                                           guint32 expected_lifetime,
-                                           guint32 expected_preferred);
-void nmtstp_ip_address_assert_lifetime (const NMPlatformIPAddress *addr,
-                                        gint64 now,
-                                        guint32 expected_lifetime,
-                                        guint32 expected_preferred);
-
-void nmtstp_ip4_address_add (NMPlatform *platform,
-                             gboolean external_command,
-                             int ifindex,
-                             in_addr_t address,
-                             int plen,
-                             in_addr_t peer_address,
-                             guint32 lifetime,
-                             guint32 preferred,
-                             guint32 flags,
-                             const char *label);
-void nmtstp_ip6_address_add (NMPlatform *platform,
-                             gboolean external_command,
-                             int ifindex,
-                             struct in6_addr address,
-                             int plen,
-                             struct in6_addr peer_address,
-                             guint32 lifetime,
-                             guint32 preferred,
-                             guint32 flags);
-void nmtstp_ip4_address_del (NMPlatform *platform,
-                             gboolean external_command,
-                             int ifindex,
-                             in_addr_t address,
-                             int plen,
-                             in_addr_t peer_address);
-void nmtstp_ip6_address_del (NMPlatform *platform,
-                             gboolean external_command,
-                             int ifindex,
-                             struct in6_addr address,
-                             int plen);
-
-void nmtstp_ip4_route_add (NMPlatform *platform,
-                           int ifindex,
-                           NMIPConfigSource source,
-                           in_addr_t network,
-                           guint8 plen,
-                           in_addr_t gateway,
-                           in_addr_t pref_src,
-                           guint32 metric,
-                           guint32 mss);
-
-void nmtstp_ip6_route_add (NMPlatform *platform,
-                           int ifindex,
-                           NMIPConfigSource source,
-                           struct in6_addr network,
-                           guint8 plen,
-                           struct in6_addr gateway,
-                           struct in6_addr pref_src,
-                           guint32 metric,
-                           guint32 mss);
+gboolean nmtstp_ip_address_check_lifetime(const NMPlatformIPAddress *addr,
+                                          gint64                     now,
+                                          guint32                    expected_lifetime,
+                                          guint32                    expected_preferred);
+void     nmtstp_ip_address_assert_lifetime(const NMPlatformIPAddress *addr,
+                                           gint64                     now,
+                                           guint32                    expected_lifetime,
+                                           guint32                    expected_preferred);
+
+void nmtstp_ip4_address_add(NMPlatform *platform,
+                            gboolean    external_command,
+                            int         ifindex,
+                            in_addr_t   address,
+                            int         plen,
+                            in_addr_t   peer_address,
+                            guint32     lifetime,
+                            guint32     preferred,
+                            guint32     flags,
+                            const char *label);
+void nmtstp_ip6_address_add(NMPlatform *    platform,
+                            gboolean        external_command,
+                            int             ifindex,
+                            struct in6_addr address,
+                            int             plen,
+                            struct in6_addr peer_address,
+                            guint32         lifetime,
+                            guint32         preferred,
+                            guint32         flags);
+void nmtstp_ip4_address_del(NMPlatform *platform,
+                            gboolean    external_command,
+                            int         ifindex,
+                            in_addr_t   address,
+                            int         plen,
+                            in_addr_t   peer_address);
+void nmtstp_ip6_address_del(NMPlatform *    platform,
+                            gboolean        external_command,
+                            int             ifindex,
+                            struct in6_addr address,
+                            int             plen);
+
+void nmtstp_ip4_route_add(NMPlatform *     platform,
+                          int              ifindex,
+                          NMIPConfigSource source,
+                          in_addr_t        network,
+                          guint8           plen,
+                          in_addr_t        gateway,
+                          in_addr_t        pref_src,
+                          guint32          metric,
+                          guint32          mss);
+
+void nmtstp_ip6_route_add(NMPlatform *     platform,
+                          int              ifindex,
+                          NMIPConfigSource source,
+                          struct in6_addr  network,
+                          guint8           plen,
+                          struct in6_addr  gateway,
+                          struct in6_addr  pref_src,
+                          guint32          metric,
+                          guint32          mss);
 
 static inline GPtrArray *
-nmtstp_ip4_route_get_all (NMPlatform *platform,
-                          int ifindex)
+nmtstp_ip4_route_get_all(NMPlatform *platform, int ifindex)
 {
-	return nm_platform_lookup_object_clone (platform,
-	                                        NMP_OBJECT_TYPE_IP4_ROUTE,
-	                                        ifindex,
-	                                        nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
-	                                        NULL);
+    return nm_platform_lookup_object_clone(
+        platform,
+        NMP_OBJECT_TYPE_IP4_ROUTE,
+        ifindex,
+        nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
+        NULL);
 }
 
 static inline GPtrArray *
-nmtstp_ip6_route_get_all (NMPlatform *platform,
-                          int ifindex)
+nmtstp_ip6_route_get_all(NMPlatform *platform, int ifindex)
 {
-	return nm_platform_lookup_object_clone (platform,
-	                                        NMP_OBJECT_TYPE_IP6_ROUTE,
-	                                        ifindex,
-	                                        nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
-	                                        NULL);
+    return nm_platform_lookup_object_clone(
+        platform,
+        NMP_OBJECT_TYPE_IP6_ROUTE,
+        ifindex,
+        nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
+        NULL);
 }
 
 /*****************************************************************************/
 
-GArray *nmtstp_platform_ip4_address_get_all (NMPlatform *self, int ifindex);
-GArray *nmtstp_platform_ip6_address_get_all (NMPlatform *self, int ifindex);
+GArray *nmtstp_platform_ip4_address_get_all(NMPlatform *self, int ifindex);
+GArray *nmtstp_platform_ip6_address_get_all(NMPlatform *self, int ifindex);
+
+/*****************************************************************************/
+
+const NMPlatformIPAddress *
+nmtstp_platform_ip_address_find(NMPlatform *self, int ifindex, int addr_family, gconstpointer addr);
+
+static inline const NMPlatformIP4Address *
+nmtstp_platform_ip4_address_find(NMPlatform *self, int ifindex, in_addr_t addr)
+{
+    return (const NMPlatformIP4Address *)
+        nmtstp_platform_ip_address_find(self, ifindex, AF_INET, &addr);
+}
+
+static inline const NMPlatformIP6Address *
+nmtstp_platform_ip6_address_find(NMPlatform *self, int ifindex, const struct in6_addr *addr)
+{
+    return (const NMPlatformIP6Address *)
+        nmtstp_platform_ip_address_find(self, ifindex, AF_INET6, addr);
+}
+
+void _nmtstp_platform_ip_addresses_assert(const char *       filename,
+                                          int                lineno,
+                                          NMPlatform *       self,
+                                          int                ifindex,
+                                          gboolean           force_exact_4,
+                                          gboolean           force_exact_6,
+                                          gboolean           ignore_ll6,
+                                          guint              addrs_len,
+                                          const char *const *addrs);
+
+#define nmtstp_platform_ip_addresses_assert(self,                                              \
+                                            ifindex,                                           \
+                                            force_exact_4,                                     \
+                                            force_exact_6,                                     \
+                                            ignore_ll6,                                        \
+                                            ...)                                               \
+    _nmtstp_platform_ip_addresses_assert(__FILE__,                                             \
+                                         __LINE__,                                             \
+                                         (self),                                               \
+                                         (ifindex),                                            \
+                                         (force_exact_4),                                      \
+                                         (force_exact_6),                                      \
+                                         (ignore_ll6),                                         \
+                                         NM_NARG(__VA_ARGS__),                                 \
+                                         ((const char *const[]){"dummy", ##__VA_ARGS__, NULL}) \
+                                             + 1)
 
 /*****************************************************************************/
 
 static inline gboolean
-_nmtstp_platform_routing_rules_get_all_predicate (const NMPObject *obj,
-                                                  gpointer user_data)
+_nmtstp_platform_routing_rules_get_all_predicate(const NMPObject *obj, gpointer user_data)
 {
-	int addr_family = GPOINTER_TO_INT (user_data);
+    int addr_family = GPOINTER_TO_INT(user_data);
 
-	g_assert (NMP_OBJECT_GET_TYPE (obj) == NMP_OBJECT_TYPE_ROUTING_RULE);
+    g_assert(NMP_OBJECT_GET_TYPE(obj) == NMP_OBJECT_TYPE_ROUTING_RULE);
 
-	return    addr_family == AF_UNSPEC
-	       || NMP_OBJECT_CAST_ROUTING_RULE (obj)->addr_family == addr_family;
+    return addr_family == AF_UNSPEC
+           || NMP_OBJECT_CAST_ROUTING_RULE(obj)->addr_family == addr_family;
 }
 
 static inline GPtrArray *
-nmtstp_platform_routing_rules_get_all (NMPlatform *platform, int addr_family)
+nmtstp_platform_routing_rules_get_all(NMPlatform *platform, int addr_family)
 {
-	NMPLookup lookup;
+    NMPLookup lookup;
 
-	g_assert (NM_IS_PLATFORM (platform));
-	g_assert (NM_IN_SET (addr_family, AF_UNSPEC, AF_INET, AF_INET6));
+    g_assert(NM_IS_PLATFORM(platform));
+    g_assert(NM_IN_SET(addr_family, AF_UNSPEC, AF_INET, AF_INET6));
 
-	nmp_lookup_init_obj_type (&lookup, NMP_OBJECT_TYPE_ROUTING_RULE);
-	return nm_platform_lookup_clone (platform,
-	                                 &lookup,
-	                                 _nmtstp_platform_routing_rules_get_all_predicate,
-	                                 GINT_TO_POINTER (addr_family));
+    nmp_lookup_init_obj_type(&lookup, NMP_OBJECT_TYPE_ROUTING_RULE);
+    return nm_platform_lookup_clone(platform,
+                                    &lookup,
+                                    _nmtstp_platform_routing_rules_get_all_predicate,
+                                    GINT_TO_POINTER(addr_family));
 }
 
 static inline guint
-nmtstp_platform_routing_rules_get_count (NMPlatform *platform, int addr_family)
+nmtstp_platform_routing_rules_get_count(NMPlatform *platform, int addr_family)
 {
-	const NMDedupMultiHeadEntry *head_entry;
-	NMDedupMultiIter iter;
-	const NMPObject *obj;
-	NMPLookup lookup;
-	guint n;
-
-	g_assert (NM_IS_PLATFORM (platform));
-	g_assert (NM_IN_SET (addr_family, AF_UNSPEC, AF_INET, AF_INET6));
-
-	nmp_lookup_init_obj_type (&lookup, NMP_OBJECT_TYPE_ROUTING_RULE);
-	head_entry = nm_platform_lookup (platform, &lookup);
-
-	n = 0;
-	nmp_cache_iter_for_each (&iter, head_entry, &obj) {
-		if (_nmtstp_platform_routing_rules_get_all_predicate (obj, GINT_TO_POINTER (addr_family)))
-			n++;
-	}
-	return n;
+    const NMDedupMultiHeadEntry *head_entry;
+    NMDedupMultiIter             iter;
+    const NMPObject *            obj;
+    NMPLookup                    lookup;
+    guint                        n;
+
+    g_assert(NM_IS_PLATFORM(platform));
+    g_assert(NM_IN_SET(addr_family, AF_UNSPEC, AF_INET, AF_INET6));
+
+    nmp_lookup_init_obj_type(&lookup, NMP_OBJECT_TYPE_ROUTING_RULE);
+    head_entry = nm_platform_lookup(platform, &lookup);
+
+    n = 0;
+    nmp_cache_iter_for_each (&iter, head_entry, &obj) {
+        if (_nmtstp_platform_routing_rules_get_all_predicate(obj, GINT_TO_POINTER(addr_family)))
+            n++;
+    }
+    return n;
 }
 
-gboolean nmtstp_platform_ip4_route_delete (NMPlatform *platform, int ifindex, in_addr_t network, guint8 plen, guint32 metric);
-gboolean nmtstp_platform_ip6_route_delete (NMPlatform *platform, int ifindex, struct in6_addr network, guint8 plen, guint32 metric);
-
-const NMPlatformLink *nmtstp_link_get_typed (NMPlatform *platform, int ifindex, const char *name, NMLinkType link_type);
-const NMPlatformLink *nmtstp_link_get (NMPlatform *platform, int ifindex, const char *name);
-
-void nmtstp_link_set_updown (NMPlatform *platform,
-                             gboolean external_command,
-                             int ifindex,
-                             gboolean up);
-
-const NMPlatformLink *nmtstp_link_veth_add (NMPlatform *platform,
-                                            gboolean external_command,
-                                            const char *name,
-                                            const char *peer);
-const NMPlatformLink *nmtstp_link_dummy_add (NMPlatform *platform,
-                                             gboolean external_command,
-                                             const char *name);
-const NMPlatformLink *nmtstp_link_gre_add (NMPlatform *platform,
-                                           gboolean external_command,
-                                           const char *name,
-                                           const NMPlatformLnkGre *lnk);
-const NMPlatformLink *nmtstp_link_ip6tnl_add (NMPlatform *platform,
-                                              gboolean external_command,
-                                              const char *name,
-                                              const NMPlatformLnkIp6Tnl *lnk);
-const NMPlatformLink *nmtstp_link_ip6gre_add (NMPlatform *platform,
-                                              gboolean external_command,
-                                              const char *name,
-                                              const NMPlatformLnkIp6Tnl *lnk);
-const NMPlatformLink *nmtstp_link_ipip_add (NMPlatform *platform,
-                                            gboolean external_command,
-                                            const char *name,
-                                            const NMPlatformLnkIpIp *lnk);
-const NMPlatformLink *nmtstp_link_macvlan_add (NMPlatform *platform,
-                                               gboolean external_command,
-                                               const char *name,
-                                               int parent,
-                                               const NMPlatformLnkMacvlan *lnk);
-const NMPlatformLink *nmtstp_link_sit_add (NMPlatform *platform,
-                                           gboolean external_command,
-                                           const char *name,
-                                           const NMPlatformLnkSit *lnk);
-const NMPlatformLink *nmtstp_link_tun_add (NMPlatform *platform,
-                                           gboolean external_command,
-                                           const char *name,
-                                           const NMPlatformLnkTun *lnk,
-                                           int *out_fd);
-const NMPlatformLink *nmtstp_link_vrf_add (NMPlatform *platform,
-                                           gboolean external_command,
+gboolean nmtstp_platform_ip4_route_delete(NMPlatform *platform,
+                                          int         ifindex,
+                                          in_addr_t   network,
+                                          guint8      plen,
+                                          guint32     metric);
+gboolean nmtstp_platform_ip6_route_delete(NMPlatform *    platform,
+                                          int             ifindex,
+                                          struct in6_addr network,
+                                          guint8          plen,
+                                          guint32         metric);
+
+const NMPlatformLink *
+nmtstp_link_get_typed(NMPlatform *platform, int ifindex, const char *name, NMLinkType link_type);
+const NMPlatformLink *nmtstp_link_get(NMPlatform *platform, int ifindex, const char *name);
+
+gboolean nmtstp_kernel_support_get(NMPlatformKernelSupportType type);
+
+void
+nmtstp_link_set_updown(NMPlatform *platform, gboolean external_command, int ifindex, gboolean up);
+
+const NMPlatformLink *nmtstp_link_bridge_add(NMPlatform *               platform,
+                                             gboolean                   external_command,
+                                             const char *               name,
+                                             const NMPlatformLnkBridge *lnk);
+const NMPlatformLink *nmtstp_link_veth_add(NMPlatform *platform,
+                                           gboolean    external_command,
                                            const char *name,
-                                           const NMPlatformLnkVrf *lnk,
-                                           gboolean *out_not_supported);
-const NMPlatformLink *nmtstp_link_vxlan_add (NMPlatform *platform,
-                                             gboolean external_command,
-                                             const char *name,
-                                             const NMPlatformLnkVxlan *lnk);
-
-void nmtstp_link_delete (NMPlatform *platform,
-                         gboolean external_command,
-                         int ifindex,
-                         const char *name,
-                         gboolean require_exist);
+                                           const char *peer);
+const NMPlatformLink *
+nmtstp_link_dummy_add(NMPlatform *platform, gboolean external_command, const char *name);
+const NMPlatformLink *nmtstp_link_gre_add(NMPlatform *            platform,
+                                          gboolean                external_command,
+                                          const char *            name,
+                                          const NMPlatformLnkGre *lnk);
+const NMPlatformLink *nmtstp_link_ip6tnl_add(NMPlatform *               platform,
+                                             gboolean                   external_command,
+                                             const char *               name,
+                                             const NMPlatformLnkIp6Tnl *lnk);
+const NMPlatformLink *nmtstp_link_ip6gre_add(NMPlatform *               platform,
+                                             gboolean                   external_command,
+                                             const char *               name,
+                                             const NMPlatformLnkIp6Tnl *lnk);
+const NMPlatformLink *nmtstp_link_ipip_add(NMPlatform *             platform,
+                                           gboolean                 external_command,
+                                           const char *             name,
+                                           const NMPlatformLnkIpIp *lnk);
+const NMPlatformLink *nmtstp_link_macvlan_add(NMPlatform *                platform,
+                                              gboolean                    external_command,
+                                              const char *                name,
+                                              int                         parent,
+                                              const NMPlatformLnkMacvlan *lnk);
+const NMPlatformLink *nmtstp_link_sit_add(NMPlatform *            platform,
+                                          gboolean                external_command,
+                                          const char *            name,
+                                          const NMPlatformLnkSit *lnk);
+const NMPlatformLink *nmtstp_link_tun_add(NMPlatform *            platform,
+                                          gboolean                external_command,
+                                          const char *            name,
+                                          const NMPlatformLnkTun *lnk,
+                                          int *                   out_fd);
+const NMPlatformLink *nmtstp_link_vrf_add(NMPlatform *            platform,
+                                          gboolean                external_command,
+                                          const char *            name,
+                                          const NMPlatformLnkVrf *lnk,
+                                          gboolean *              out_not_supported);
+const NMPlatformLink *nmtstp_link_vxlan_add(NMPlatform *              platform,
+                                            gboolean                  external_command,
+                                            const char *              name,
+                                            const NMPlatformLnkVxlan *lnk);
+
+void nmtstp_link_delete(NMPlatform *platform,
+                        gboolean    external_command,
+                        int         ifindex,
+                        const char *name,
+                        gboolean    require_exist);
 
 /*****************************************************************************/
 
@@ -382,100 +499,112 @@ extern int NMTSTP_ENV1_IFINDEX;
 extern int NMTSTP_ENV1_EX;
 
 static inline void
-_nmtstp_env1_wrapper_setup (const NmtstTestData *test_data)
+_nmtstp_env1_wrapper_setup(const NmtstTestData *test_data)
 {
-	int *p_ifindex;
-	gpointer p_ifup;
+    int *    p_ifindex;
+    gpointer p_ifup;
 
-	nmtst_test_data_unpack (test_data, &p_ifindex, NULL, NULL, NULL, &p_ifup);
+    nmtst_test_data_unpack(test_data, &p_ifindex, NULL, NULL, NULL, &p_ifup);
 
-	g_assert (p_ifindex && *p_ifindex == -1);
+    g_assert(p_ifindex && *p_ifindex == -1);
 
-	_LOGT ("TEST[%s]: setup", test_data->testpath);
+    _LOGT("TEST[%s]: setup", test_data->testpath);
 
-	nmtstp_link_delete (NM_PLATFORM_GET, -1, -1, DEVICE_NAME, FALSE);
+    nmtstp_link_delete(NM_PLATFORM_GET, -1, -1, DEVICE_NAME, FALSE);
 
-	g_assert (NMTST_NM_ERR_SUCCESS (nm_platform_link_dummy_add (NM_PLATFORM_GET, DEVICE_NAME, NULL)));
+    g_assert(NMTST_NM_ERR_SUCCESS(nm_platform_link_dummy_add(NM_PLATFORM_GET, DEVICE_NAME, NULL)));
 
-	*p_ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME);
-	g_assert_cmpint (*p_ifindex, >, 0);
-	g_assert_cmpint (NMTSTP_ENV1_IFINDEX, ==, -1);
+    *p_ifindex = nm_platform_link_get_ifindex(NM_PLATFORM_GET, DEVICE_NAME);
+    g_assert_cmpint(*p_ifindex, >, 0);
+    g_assert_cmpint(NMTSTP_ENV1_IFINDEX, ==, -1);
 
-	if (GPOINTER_TO_INT (p_ifup))
-		g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, *p_ifindex, NULL));
+    if (GPOINTER_TO_INT(p_ifup))
+        g_assert(nm_platform_link_set_up(NM_PLATFORM_GET, *p_ifindex, NULL));
 
-	nm_platform_process_events (NM_PLATFORM_GET);
+    nm_platform_process_events(NM_PLATFORM_GET);
 
-	NMTSTP_ENV1_IFINDEX = *p_ifindex;
-	NMTSTP_ENV1_EX = nmtstp_run_command_check_external_global ();
+    NMTSTP_ENV1_IFINDEX = *p_ifindex;
+    NMTSTP_ENV1_EX      = nmtstp_run_command_check_external_global();
 }
 
 static inline void
-_nmtstp_env1_wrapper_run (gconstpointer user_data)
+_nmtstp_env1_wrapper_run(gconstpointer user_data)
 {
-	const NmtstTestData *test_data = user_data;
-	GTestDataFunc test_func_data;
-	GTestFunc test_func;
-	gconstpointer d;
-
-	nmtst_test_data_unpack (test_data, NULL, &test_func, &test_func_data, &d, NULL);
-
-	_LOGT ("TEST[%s]: run", test_data->testpath);
-	if (test_func)
-		test_func ();
-	else
-		test_func_data (d);
+    const NmtstTestData *test_data = user_data;
+    GTestDataFunc        test_func_data;
+    GTestFunc            test_func;
+    gconstpointer        d;
+
+    nmtst_test_data_unpack(test_data, NULL, &test_func, &test_func_data, &d, NULL);
+
+    _LOGT("TEST[%s]: run", test_data->testpath);
+    if (test_func)
+        test_func();
+    else
+        test_func_data(d);
 }
 
 static inline void
-_nmtstp_env1_wrapper_teardown (const NmtstTestData *test_data)
+_nmtstp_env1_wrapper_teardown(const NmtstTestData *test_data)
 {
-	int *p_ifindex;
+    int *p_ifindex;
 
-	nmtst_test_data_unpack (test_data, &p_ifindex, NULL, NULL, NULL, NULL);
+    nmtst_test_data_unpack(test_data, &p_ifindex, NULL, NULL, NULL, NULL);
 
-	g_assert_cmpint (NMTSTP_ENV1_IFINDEX, ==, *p_ifindex);
-	NMTSTP_ENV1_IFINDEX = -1;
+    g_assert_cmpint(NMTSTP_ENV1_IFINDEX, ==, *p_ifindex);
+    NMTSTP_ENV1_IFINDEX = -1;
 
-	_LOGT ("TEST[%s]: teardown", test_data->testpath);
+    _LOGT("TEST[%s]: teardown", test_data->testpath);
 
-	g_assert_cmpint (*p_ifindex, ==, nm_platform_link_get_ifindex (NM_PLATFORM_GET, DEVICE_NAME));
-	g_assert (nm_platform_link_delete (NM_PLATFORM_GET, *p_ifindex));
+    g_assert_cmpint(*p_ifindex, ==, nm_platform_link_get_ifindex(NM_PLATFORM_GET, DEVICE_NAME));
+    g_assert(nm_platform_link_delete(NM_PLATFORM_GET, *p_ifindex));
 
-	nm_platform_process_events (NM_PLATFORM_GET);
+    nm_platform_process_events(NM_PLATFORM_GET);
 
-	_LOGT ("TEST[%s]: finished", test_data->testpath);
+    _LOGT("TEST[%s]: finished", test_data->testpath);
 
-	*p_ifindex = -1;
+    *p_ifindex = -1;
 }
 
 /* add test function, that set's up a particular environment, consisting
  * of a dummy device with ifindex NMTSTP_ENV1_IFINDEX. */
 #define _nmtstp_env1_add_test_func_full(testpath, test_func, test_data_func, arg, ifup) \
-	nmtst_add_test_func_full (testpath, \
-	                          _nmtstp_env1_wrapper_run, \
-	                          _nmtstp_env1_wrapper_setup, \
-	                          _nmtstp_env1_wrapper_teardown, \
-	                          ({ static int _ifindex = -1; &_ifindex; }), \
-	                          ({ GTestFunc _test_func = (test_func); _test_func; }), \
-	                          ({ GTestDataFunc _test_func = (test_data_func); _test_func; }), \
-	                          (arg), \
-	                          ({ gboolean _ifup = (ifup); GINT_TO_POINTER (_ifup);}))
+    nmtst_add_test_func_full(testpath,                                                  \
+                             _nmtstp_env1_wrapper_run,                                  \
+                             _nmtstp_env1_wrapper_setup,                                \
+                             _nmtstp_env1_wrapper_teardown,                             \
+                             ({                                                         \
+                                 static int _ifindex = -1;                              \
+                                 &_ifindex;                                             \
+                             }),                                                        \
+                             ({                                                         \
+                                 GTestFunc _test_func = (test_func);                    \
+                                 _test_func;                                            \
+                             }),                                                        \
+                             ({                                                         \
+                                 GTestDataFunc _test_func = (test_data_func);           \
+                                 _test_func;                                            \
+                             }),                                                        \
+                             (arg),                                                     \
+                             ({                                                         \
+                                 gboolean _ifup = (ifup);                               \
+                                 GINT_TO_POINTER(_ifup);                                \
+                             }))
 
 #define nmtstp_env1_add_test_func_data(testpath, test_func, arg, ifup) \
-	_nmtstp_env1_add_test_func_full(testpath, NULL, test_func, arg, ifup)
+    _nmtstp_env1_add_test_func_full(testpath, NULL, test_func, arg, ifup)
 
 #define nmtstp_env1_add_test_func(testpath, test_func, ifup) \
-	_nmtstp_env1_add_test_func_full(testpath, test_func, NULL, NULL, ifup)
+    _nmtstp_env1_add_test_func_full(testpath, test_func, NULL, NULL, ifup)
 
 /*****************************************************************************/
 
-typedef void (*NMTstpSetupFunc) (void);
+typedef void (*NMTstpSetupFunc)(void);
 extern NMTstpSetupFunc const _nmtstp_setup_platform_func;
 
-void nmtstp_setup_platform (void);
+void nmtstp_setup_platform(void);
 
 /*****************************************************************************/
 
-void _nmtstp_init_tests (int *argc, char ***argv);
-void _nmtstp_setup_tests (void);
+void _nmtstp_init_tests(int *argc, char ***argv);
+void _nmtstp_setup_tests(void);