Blame src/core/platform/tests/test-common.h

Packit Service 5ffa24
/* SPDX-License-Identifier: GPL-2.0-or-later */
Packit Service 5ffa24
/*
Packit Service 5ffa24
 * Copyright (C) 2016 - 2017 Red Hat, Inc.
Packit Service 5ffa24
 */
Packit Service 5ffa24
Packit Service 5ffa24
#include <stdlib.h>
Packit Service 5ffa24
#include <unistd.h>
Packit Service 5ffa24
#include <syslog.h>
Packit Service 5ffa24
#include <arpa/inet.h>
Packit Service 5ffa24
#include <linux/if.h>
Packit Service 5ffa24
#include <linux/if_link.h>
Packit Service 5ffa24
#include <linux/ip6_tunnel.h>
Packit Service 5ffa24
Packit Service dff8e4
#include "libnm-platform/nm-platform.h"
Packit Service dff8e4
#include "libnm-platform/nmp-object.h"
Packit Service 5ffa24
#include "platform/nm-fake-platform.h"
Packit Service dff8e4
#include "libnm-platform/nm-linux-platform.h"
Packit Service 5ffa24
Packit Service 5ffa24
#include "nm-test-utils-core.h"
Packit Service 5ffa24
Packit Service 5ffa24
#define DEVICE_NAME "nm-test-device"
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Bot c44df3
#define nmtstp_normalize_jiffies_time(requested_value, kernel_value)                             \
Packit Bot c44df3
    ({                                                                                           \
Packit Bot c44df3
        typeof(kernel_value) _kernel_value     = (kernel_value);                                 \
Packit Bot c44df3
        typeof(_kernel_value) _requested_value = (requested_value);                              \
Packit Bot c44df3
                                                                                                 \
Packit Bot c44df3
        /* kernel stores some values (like bridge's forward_delay) in jiffies. When converting
Packit Bot c44df3
         * back and forth (clock_t_to_jiffies()/jiffies_to_clock_t()), the value reported back
Packit Bot c44df3
         * to user space may have rounding errors (of +/- 1), depending on CONFIG_HZ setting.
Packit Bot c44df3
         *
Packit Bot c44df3
         * Normalize the requested_value to the kernel_value, if it look as if a rounding
Packit Bot c44df3
         * error happens. If the difference is larger than +/- 1, no normalization happens! */   \
Packit Bot c44df3
                                                                                                 \
Packit Bot c44df3
        ((_requested_value >= (NM_MAX(_kernel_value, 1) - 1))                                    \
Packit Bot c44df3
         && (_requested_value <= (NM_MIN(_kernel_value, ~((typeof(_kernel_value)) 0) - 1) + 1))) \
Packit Bot c44df3
            ? _kernel_value                                                                      \
Packit Bot c44df3
            : _requested_value;                                                                  \
Packit Bot c44df3
    })
Packit Bot c44df3
Packit Service 5ffa24
#define _NMLOG_PREFIX_NAME "platform-test"
Packit Service 5ffa24
#define _NMLOG_DOMAIN      LOGD_PLATFORM
Packit Service 5ffa24
#define _NMLOG(level, ...) _LOG(level, _NMLOG_DOMAIN, __VA_ARGS__)
Packit Service 5ffa24
Packit Service 5ffa24
#define _LOG(level, domain, ...)                                                             \
Packit Service 5ffa24
    G_STMT_START                                                                             \
Packit Service 5ffa24
    {                                                                                        \
Packit Service 5ffa24
        const NMLogLevel  __level  = (level);                                                \
Packit Service 5ffa24
        const NMLogDomain __domain = (domain);                                               \
Packit Service 5ffa24
                                                                                             \
Packit Service 5ffa24
        if (nm_logging_enabled(__level, __domain)) {                                         \
Packit Service 5ffa24
            gint64 _ts = nm_utils_get_monotonic_timestamp_nsec();                            \
Packit Service 5ffa24
                                                                                             \
Packit Service 5ffa24
            _nm_log(__level,                                                                 \
Packit Service 5ffa24
                    __domain,                                                                \
Packit Service 5ffa24
                    0,                                                                       \
Packit Service 5ffa24
                    NULL,                                                                    \
Packit Service 5ffa24
                    NULL,                                                                    \
Packit Service 5ffa24
                    "%s[%ld.%09ld]: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__),                    \
Packit Service 5ffa24
                    _NMLOG_PREFIX_NAME,                                                      \
Packit Service 5ffa24
                    (long) (_ts / NM_UTILS_NSEC_PER_SEC),                                    \
Packit Service 5ffa24
                    (long) (_ts % NM_UTILS_NSEC_PER_SEC) _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
Packit Service 5ffa24
        }                                                                                    \
Packit Service 5ffa24
    }                                                                                        \
Packit Service 5ffa24
    G_STMT_END
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
gboolean nmtstp_is_root_test(void);
Packit Service 5ffa24
gboolean nmtstp_is_sysfs_writable(void);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct _NMTstpNamespaceHandle NMTstpNamespaceHandle;
Packit Service 5ffa24
Packit Service 5ffa24
NMTstpNamespaceHandle *nmtstp_namespace_create(int flags, GError **error);
Packit Service 5ffa24
Packit Service 5ffa24
void  nmtstp_namespace_handle_release(NMTstpNamespaceHandle *handle);
Packit Service 5ffa24
pid_t nmtstp_namespace_handle_get_pid(NMTstpNamespaceHandle *handle);
Packit Service 5ffa24
Packit Service 5ffa24
int nmtstp_namespace_get_fd_for_process(pid_t pid, const char *ns_name);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_netns_select_random(NMPlatform **platforms, gsize n_platforms, NMPNetns **netns);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct {
Packit Service 5ffa24
    gulong                     handler_id;
Packit Service 5ffa24
    const char *               name;
Packit Service 5ffa24
    NMPlatformSignalChangeType change_type;
Packit Service 5ffa24
    int                        received_count;
Packit Service 5ffa24
    GMainLoop *                loop;
Packit Service 5ffa24
    int                        ifindex;
Packit Service 5ffa24
    const char *               ifname;
Packit Service 5ffa24
} SignalData;
Packit Service 5ffa24
Packit Service 5ffa24
SignalData *add_signal_full(const char *               name,
Packit Service 5ffa24
                            NMPlatformSignalChangeType change_type,
Packit Service 5ffa24
                            GCallback                  callback,
Packit Service 5ffa24
                            int                        ifindex,
Packit Service 5ffa24
                            const char *               ifname);
Packit Service 5ffa24
#define add_signal(name, change_type, callback) \
Packit Service 5ffa24
    add_signal_full(name, change_type, (GCallback) callback, 0, NULL)
Packit Service 5ffa24
#define add_signal_ifindex(name, change_type, callback, ifindex) \
Packit Service 5ffa24
    add_signal_full(name, change_type, (GCallback) callback, ifindex, NULL)
Packit Service 5ffa24
#define add_signal_ifname(name, change_type, callback, ifname) \
Packit Service 5ffa24
    add_signal_full(name, change_type, (GCallback) callback, 0, ifname)
Packit Service 5ffa24
void _accept_signal(const char *file, int line, const char *func, SignalData *data);
Packit Service 5ffa24
void
Packit Service 5ffa24
_accept_signals(const char *file, int line, const char *func, SignalData *data, int min, int max);
Packit Service 5ffa24
void _wait_signal(const char *file, int line, const char *func, SignalData *data);
Packit Service 5ffa24
void _accept_or_wait_signal(const char *file, int line, const char *func, SignalData *data);
Packit Service 5ffa24
void _ensure_no_signal(const char *file, int line, const char *func, SignalData *data);
Packit Service 5ffa24
void _free_signal(const char *file, int line, const char *func, SignalData *data);
Packit Service 5ffa24
#define accept_signal(data) _accept_signal(__FILE__, __LINE__, G_STRFUNC, data)
Packit Service 5ffa24
#define accept_signals(data, min, max) \
Packit Service 5ffa24
    _accept_signals(__FILE__, __LINE__, G_STRFUNC, data, min, max)
Packit Service 5ffa24
#define wait_signal(data)           _wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
Packit Service 5ffa24
#define accept_or_wait_signal(data) _accept_or_wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
Packit Service 5ffa24
#define ensure_no_signal(data)      _ensure_no_signal(__FILE__, __LINE__, G_STRFUNC, data)
Packit Service 5ffa24
#define free_signal(data)           _free_signal(__FILE__, __LINE__, G_STRFUNC, data)
Packit Service 5ffa24
Packit Service 5ffa24
void link_callback(NMPlatform *    platform,
Packit Service 5ffa24
                   int             obj_type_i,
Packit Service 5ffa24
                   int             ifindex,
Packit Service 5ffa24
                   NMPlatformLink *received,
Packit Service 5ffa24
                   int             change_type_i,
Packit Service 5ffa24
                   SignalData *    data);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
int nmtstp_run_command(const char *format, ...) _nm_printf(1, 2);
Packit Service 5ffa24
#define nmtstp_run_command_check(...)                            \
Packit Service 5ffa24
    do {                                                         \
Packit Service 5ffa24
        g_assert_cmpint(nmtstp_run_command(__VA_ARGS__), ==, 0); \
Packit Service 5ffa24
    } while (0)
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
guint                 nmtstp_wait_for_signal(NMPlatform *platform, gint64 timeout_msec);
Packit Service 5ffa24
guint                 nmtstp_wait_for_signal_until(NMPlatform *platform, gint64 until_ms);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_wait_for_link(NMPlatform *platform,
Packit Service 5ffa24
                                           const char *ifname,
Packit Service 5ffa24
                                           NMLinkType  expected_link_type,
Packit Service 5ffa24
                                           gint64      timeout_msec);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_wait_for_link_until(NMPlatform *platform,
Packit Service 5ffa24
                                                 const char *ifname,
Packit Service 5ffa24
                                                 NMLinkType  expected_link_type,
Packit Service 5ffa24
                                                 gint64      until_ms);
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_assert_wait_for_signal(platform, timeout_msec)    \
Packit Service 5ffa24
    G_STMT_START                                                 \
Packit Service 5ffa24
    {                                                            \
Packit Service 5ffa24
        if (nmtstp_wait_for_signal(platform, timeout_msec) == 0) \
Packit Service 5ffa24
            g_assert_not_reached();                              \
Packit Service 5ffa24
    }                                                            \
Packit Service 5ffa24
    G_STMT_END
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_assert_wait_for_signal_until(platform, until_ms)    \
Packit Service 5ffa24
    G_STMT_START                                                   \
Packit Service 5ffa24
    {                                                              \
Packit Service 5ffa24
        if (nmtstp_wait_for_signal_until(platform, until_ms) == 0) \
Packit Service 5ffa24
            g_assert_not_reached();                                \
Packit Service 5ffa24
    }                                                              \
Packit Service 5ffa24
    G_STMT_END
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_assert_wait_for_link(platform, ifname, expected_link_type, timeout_msec) \
Packit Service 5ffa24
    nmtst_assert_nonnull(nmtstp_wait_for_link(platform, ifname, expected_link_type, timeout_msec))
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_assert_wait_for_link_until(platform, ifname, expected_link_type, until_ms) \
Packit Service 5ffa24
    nmtst_assert_nonnull(nmtstp_wait_for_link_until(platform, ifname, expected_link_type, until_ms))
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
int      nmtstp_run_command_check_external_global(void);
Packit Service 5ffa24
gboolean nmtstp_run_command_check_external(int external_command);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
const NMPlatformIP4Route *_nmtstp_assert_ip4_route_exists(const char *file,
Packit Service 5ffa24
                                                          guint       line,
Packit Service 5ffa24
                                                          const char *func,
Packit Service 5ffa24
                                                          NMPlatform *platform,
Packit Service 5ffa24
                                                          int         c_exists,
Packit Service 5ffa24
                                                          const char *ifname,
Packit Service 5ffa24
                                                          guint32     network,
Packit Service 5ffa24
                                                          int         plen,
Packit Service 5ffa24
                                                          guint32     metric,
Packit Service 5ffa24
                                                          guint8      tos);
Packit Service 5ffa24
#define nmtstp_assert_ip4_route_exists(platform, c_exists, ifname, network, plen, metric, tos) \
Packit Service 5ffa24
    _nmtstp_assert_ip4_route_exists(__FILE__,                                                  \
Packit Service 5ffa24
                                    __LINE__,                                                  \
Packit Service 5ffa24
                                    G_STRFUNC,                                                 \
Packit Service 5ffa24
                                    platform,                                                  \
Packit Service 5ffa24
                                    c_exists,                                                  \
Packit Service 5ffa24
                                    ifname,                                                    \
Packit Service 5ffa24
                                    network,                                                   \
Packit Service 5ffa24
                                    plen,                                                      \
Packit Service 5ffa24
                                    metric,                                                    \
Packit Service 5ffa24
                                    tos)
Packit Service 5ffa24
Packit Service 5ffa24
const NMPlatformIP4Route *nmtstp_ip4_route_get(NMPlatform *platform,
Packit Service 5ffa24
                                               int         ifindex,
Packit Service 5ffa24
                                               guint32     network,
Packit Service 5ffa24
                                               int         plen,
Packit Service 5ffa24
                                               guint32     metric,
Packit Service 5ffa24
                                               guint8      tos);
Packit Service 5ffa24
Packit Service 5ffa24
const NMPlatformIP6Route *_nmtstp_assert_ip6_route_exists(const char *           file,
Packit Service 5ffa24
                                                          guint                  line,
Packit Service 5ffa24
                                                          const char *           func,
Packit Service 5ffa24
                                                          NMPlatform *           platform,
Packit Service 5ffa24
                                                          int                    c_exists,
Packit Service 5ffa24
                                                          const char *           ifname,
Packit Service 5ffa24
                                                          const struct in6_addr *network,
Packit Service 5ffa24
                                                          guint                  plen,
Packit Service 5ffa24
                                                          guint32                metric,
Packit Service 5ffa24
                                                          const struct in6_addr *src,
Packit Service 5ffa24
                                                          guint8                 src_plen);
Packit Service 5ffa24
#define nmtstp_assert_ip6_route_exists(platform, \
Packit Service 5ffa24
                                       c_exists, \
Packit Service 5ffa24
                                       ifname,   \
Packit Service 5ffa24
                                       network,  \
Packit Service 5ffa24
                                       plen,     \
Packit Service 5ffa24
                                       metric,   \
Packit Service 5ffa24
                                       src,      \
Packit Service 5ffa24
                                       src_plen) \
Packit Service 5ffa24
    _nmtstp_assert_ip6_route_exists(__FILE__,    \
Packit Service 5ffa24
                                    __LINE__,    \
Packit Service 5ffa24
                                    G_STRFUNC,   \
Packit Service 5ffa24
                                    platform,    \
Packit Service 5ffa24
                                    c_exists,    \
Packit Service 5ffa24
                                    ifname,      \
Packit Service 5ffa24
                                    network,     \
Packit Service 5ffa24
                                    plen,        \
Packit Service 5ffa24
                                    metric,      \
Packit Service 5ffa24
                                    src,         \
Packit Service 5ffa24
                                    src_plen)
Packit Service 5ffa24
Packit Service 5ffa24
const NMPlatformIP6Route *nmtstp_ip6_route_get(NMPlatform *           platform,
Packit Service 5ffa24
                                               int                    ifindex,
Packit Service 5ffa24
                                               const struct in6_addr *network,
Packit Service 5ffa24
                                               guint                  plen,
Packit Service 5ffa24
                                               guint32                metric,
Packit Service 5ffa24
                                               const struct in6_addr *src,
Packit Service 5ffa24
                                               guint8                 src_plen);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
gboolean nmtstp_ip_address_check_lifetime(const NMPlatformIPAddress *addr,
Packit Service 5ffa24
                                          gint64                     now,
Packit Service 5ffa24
                                          guint32                    expected_lifetime,
Packit Service 5ffa24
                                          guint32                    expected_preferred);
Packit Service 5ffa24
void     nmtstp_ip_address_assert_lifetime(const NMPlatformIPAddress *addr,
Packit Service 5ffa24
                                           gint64                     now,
Packit Service 5ffa24
                                           guint32                    expected_lifetime,
Packit Service 5ffa24
                                           guint32                    expected_preferred);
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_ip4_address_add(NMPlatform *platform,
Packit Service 5ffa24
                            gboolean    external_command,
Packit Service 5ffa24
                            int         ifindex,
Packit Service 5ffa24
                            in_addr_t   address,
Packit Service 5ffa24
                            int         plen,
Packit Service 5ffa24
                            in_addr_t   peer_address,
Packit Service 5ffa24
                            guint32     lifetime,
Packit Service 5ffa24
                            guint32     preferred,
Packit Service 5ffa24
                            guint32     flags,
Packit Service 5ffa24
                            const char *label);
Packit Service 5ffa24
void nmtstp_ip6_address_add(NMPlatform *    platform,
Packit Service 5ffa24
                            gboolean        external_command,
Packit Service 5ffa24
                            int             ifindex,
Packit Service 5ffa24
                            struct in6_addr address,
Packit Service 5ffa24
                            int             plen,
Packit Service 5ffa24
                            struct in6_addr peer_address,
Packit Service 5ffa24
                            guint32         lifetime,
Packit Service 5ffa24
                            guint32         preferred,
Packit Service 5ffa24
                            guint32         flags);
Packit Service 5ffa24
void nmtstp_ip4_address_del(NMPlatform *platform,
Packit Service 5ffa24
                            gboolean    external_command,
Packit Service 5ffa24
                            int         ifindex,
Packit Service 5ffa24
                            in_addr_t   address,
Packit Service 5ffa24
                            int         plen,
Packit Service 5ffa24
                            in_addr_t   peer_address);
Packit Service 5ffa24
void nmtstp_ip6_address_del(NMPlatform *    platform,
Packit Service 5ffa24
                            gboolean        external_command,
Packit Service 5ffa24
                            int             ifindex,
Packit Service 5ffa24
                            struct in6_addr address,
Packit Service 5ffa24
                            int             plen);
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_ip4_route_add(NMPlatform *     platform,
Packit Service 5ffa24
                          int              ifindex,
Packit Service 5ffa24
                          NMIPConfigSource source,
Packit Service 5ffa24
                          in_addr_t        network,
Packit Service 5ffa24
                          guint8           plen,
Packit Service 5ffa24
                          in_addr_t        gateway,
Packit Service 5ffa24
                          in_addr_t        pref_src,
Packit Service 5ffa24
                          guint32          metric,
Packit Service 5ffa24
                          guint32          mss);
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_ip6_route_add(NMPlatform *     platform,
Packit Service 5ffa24
                          int              ifindex,
Packit Service 5ffa24
                          NMIPConfigSource source,
Packit Service 5ffa24
                          struct in6_addr  network,
Packit Service 5ffa24
                          guint8           plen,
Packit Service 5ffa24
                          struct in6_addr  gateway,
Packit Service 5ffa24
                          struct in6_addr  pref_src,
Packit Service 5ffa24
                          guint32          metric,
Packit Service 5ffa24
                          guint32          mss);
Packit Service 5ffa24
Packit Service 5ffa24
static inline GPtrArray *
Packit Service 5ffa24
nmtstp_ip4_route_get_all(NMPlatform *platform, int ifindex)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return nm_platform_lookup_object_clone(
Packit Service 5ffa24
        platform,
Packit Service 5ffa24
        NMP_OBJECT_TYPE_IP4_ROUTE,
Packit Service 5ffa24
        ifindex,
Packit Service 5ffa24
        nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
Packit Service 5ffa24
        NULL);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline GPtrArray *
Packit Service 5ffa24
nmtstp_ip6_route_get_all(NMPlatform *platform, int ifindex)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return nm_platform_lookup_object_clone(
Packit Service 5ffa24
        platform,
Packit Service 5ffa24
        NMP_OBJECT_TYPE_IP6_ROUTE,
Packit Service 5ffa24
        ifindex,
Packit Service 5ffa24
        nm_platform_lookup_predicate_routes_main_skip_rtprot_kernel,
Packit Service 5ffa24
        NULL);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
GArray *nmtstp_platform_ip4_address_get_all(NMPlatform *self, int ifindex);
Packit Service 5ffa24
GArray *nmtstp_platform_ip6_address_get_all(NMPlatform *self, int ifindex);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
const NMPlatformIPAddress *
Packit Service 5ffa24
nmtstp_platform_ip_address_find(NMPlatform *self, int ifindex, int addr_family, gconstpointer addr);
Packit Service 5ffa24
Packit Service 5ffa24
static inline const NMPlatformIP4Address *
Packit Service 5ffa24
nmtstp_platform_ip4_address_find(NMPlatform *self, int ifindex, in_addr_t addr)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return (const NMPlatformIP4Address *)
Packit Service 5ffa24
        nmtstp_platform_ip_address_find(self, ifindex, AF_INET, &addr);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline const NMPlatformIP6Address *
Packit Service 5ffa24
nmtstp_platform_ip6_address_find(NMPlatform *self, int ifindex, const struct in6_addr *addr)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return (const NMPlatformIP6Address *)
Packit Service 5ffa24
        nmtstp_platform_ip_address_find(self, ifindex, AF_INET6, addr);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
void _nmtstp_platform_ip_addresses_assert(const char *       filename,
Packit Service 5ffa24
                                          int                lineno,
Packit Service 5ffa24
                                          NMPlatform *       self,
Packit Service 5ffa24
                                          int                ifindex,
Packit Service 5ffa24
                                          gboolean           force_exact_4,
Packit Service 5ffa24
                                          gboolean           force_exact_6,
Packit Service 5ffa24
                                          gboolean           ignore_ll6,
Packit Service 5ffa24
                                          guint              addrs_len,
Packit Service 5ffa24
                                          const char *const *addrs);
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_platform_ip_addresses_assert(self,                                              \
Packit Service 5ffa24
                                            ifindex,                                           \
Packit Service 5ffa24
                                            force_exact_4,                                     \
Packit Service 5ffa24
                                            force_exact_6,                                     \
Packit Service 5ffa24
                                            ignore_ll6,                                        \
Packit Service 5ffa24
                                            ...)                                               \
Packit Service 5ffa24
    _nmtstp_platform_ip_addresses_assert(__FILE__,                                             \
Packit Service 5ffa24
                                         __LINE__,                                             \
Packit Service 5ffa24
                                         (self),                                               \
Packit Service 5ffa24
                                         (ifindex),                                            \
Packit Service 5ffa24
                                         (force_exact_4),                                      \
Packit Service 5ffa24
                                         (force_exact_6),                                      \
Packit Service 5ffa24
                                         (ignore_ll6),                                         \
Packit Service 5ffa24
                                         NM_NARG(__VA_ARGS__),                                 \
Packit Service 5ffa24
                                         ((const char *const[]){"dummy", ##__VA_ARGS__, NULL}) \
Packit Service 5ffa24
                                             + 1)
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
static inline gboolean
Packit Service 5ffa24
_nmtstp_platform_routing_rules_get_all_predicate(const NMPObject *obj, gpointer user_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    int addr_family = GPOINTER_TO_INT(user_data);
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(NMP_OBJECT_GET_TYPE(obj) == NMP_OBJECT_TYPE_ROUTING_RULE);
Packit Service 5ffa24
Packit Service 5ffa24
    return addr_family == AF_UNSPEC
Packit Service 5ffa24
           || NMP_OBJECT_CAST_ROUTING_RULE(obj)->addr_family == addr_family;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline GPtrArray *
Packit Service 5ffa24
nmtstp_platform_routing_rules_get_all(NMPlatform *platform, int addr_family)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMPLookup lookup;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(NM_IS_PLATFORM(platform));
Packit Service 5ffa24
    g_assert(NM_IN_SET(addr_family, AF_UNSPEC, AF_INET, AF_INET6));
Packit Service 5ffa24
Packit Service 5ffa24
    nmp_lookup_init_obj_type(&lookup, NMP_OBJECT_TYPE_ROUTING_RULE);
Packit Service 5ffa24
    return nm_platform_lookup_clone(platform,
Packit Service 5ffa24
                                    &lookup,
Packit Service 5ffa24
                                    _nmtstp_platform_routing_rules_get_all_predicate,
Packit Service 5ffa24
                                    GINT_TO_POINTER(addr_family));
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline guint
Packit Service 5ffa24
nmtstp_platform_routing_rules_get_count(NMPlatform *platform, int addr_family)
Packit Service 5ffa24
{
Packit Service 5ffa24
    const NMDedupMultiHeadEntry *head_entry;
Packit Service 5ffa24
    NMDedupMultiIter             iter;
Packit Service 5ffa24
    const NMPObject *            obj;
Packit Service 5ffa24
    NMPLookup                    lookup;
Packit Service 5ffa24
    guint                        n;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(NM_IS_PLATFORM(platform));
Packit Service 5ffa24
    g_assert(NM_IN_SET(addr_family, AF_UNSPEC, AF_INET, AF_INET6));
Packit Service 5ffa24
Packit Service 5ffa24
    nmp_lookup_init_obj_type(&lookup, NMP_OBJECT_TYPE_ROUTING_RULE);
Packit Service 5ffa24
    head_entry = nm_platform_lookup(platform, &lookup);
Packit Service 5ffa24
Packit Service 5ffa24
    n = 0;
Packit Service 5ffa24
    nmp_cache_iter_for_each (&iter, head_entry, &obj) {
Packit Service 5ffa24
        if (_nmtstp_platform_routing_rules_get_all_predicate(obj, GINT_TO_POINTER(addr_family)))
Packit Service 5ffa24
            n++;
Packit Service 5ffa24
    }
Packit Service 5ffa24
    return n;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
gboolean nmtstp_platform_ip4_route_delete(NMPlatform *platform,
Packit Service 5ffa24
                                          int         ifindex,
Packit Service 5ffa24
                                          in_addr_t   network,
Packit Service 5ffa24
                                          guint8      plen,
Packit Service 5ffa24
                                          guint32     metric);
Packit Service 5ffa24
gboolean nmtstp_platform_ip6_route_delete(NMPlatform *    platform,
Packit Service 5ffa24
                                          int             ifindex,
Packit Service 5ffa24
                                          struct in6_addr network,
Packit Service 5ffa24
                                          guint8          plen,
Packit Service 5ffa24
                                          guint32         metric);
Packit Service 5ffa24
Packit Service 5ffa24
const NMPlatformLink *
Packit Service 5ffa24
nmtstp_link_get_typed(NMPlatform *platform, int ifindex, const char *name, NMLinkType link_type);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_get(NMPlatform *platform, int ifindex, const char *name);
Packit Service 5ffa24
Packit Service 5ffa24
gboolean nmtstp_kernel_support_get(NMPlatformKernelSupportType type);
Packit Service 5ffa24
Packit Service 5ffa24
void
Packit Service 5ffa24
nmtstp_link_set_updown(NMPlatform *platform, gboolean external_command, int ifindex, gboolean up);
Packit Service 5ffa24
Packit Bot c44df3
const NMPlatformLnkBridge *
Packit Bot c44df3
nmtstp_link_bridge_normalize_jiffies_time(const NMPlatformLnkBridge *requested,
Packit Bot c44df3
                                          const NMPlatformLnkBridge *kernel,
Packit Bot c44df3
                                          NMPlatformLnkBridge *      dst);
Packit Bot c44df3
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_bridge_add(NMPlatform *               platform,
Packit Service 5ffa24
                                             gboolean                   external_command,
Packit Service 5ffa24
                                             const char *               name,
Packit Service 5ffa24
                                             const NMPlatformLnkBridge *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_veth_add(NMPlatform *platform,
Packit Service 5ffa24
                                           gboolean    external_command,
Packit Service 5ffa24
                                           const char *name,
Packit Service 5ffa24
                                           const char *peer);
Packit Service 5ffa24
const NMPlatformLink *
Packit Service 5ffa24
nmtstp_link_dummy_add(NMPlatform *platform, gboolean external_command, const char *name);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_gre_add(NMPlatform *            platform,
Packit Service 5ffa24
                                          gboolean                external_command,
Packit Service 5ffa24
                                          const char *            name,
Packit Service 5ffa24
                                          const NMPlatformLnkGre *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_ip6tnl_add(NMPlatform *               platform,
Packit Service 5ffa24
                                             gboolean                   external_command,
Packit Service 5ffa24
                                             const char *               name,
Packit Service 5ffa24
                                             const NMPlatformLnkIp6Tnl *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_ip6gre_add(NMPlatform *               platform,
Packit Service 5ffa24
                                             gboolean                   external_command,
Packit Service 5ffa24
                                             const char *               name,
Packit Service 5ffa24
                                             const NMPlatformLnkIp6Tnl *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_ipip_add(NMPlatform *             platform,
Packit Service 5ffa24
                                           gboolean                 external_command,
Packit Service 5ffa24
                                           const char *             name,
Packit Service 5ffa24
                                           const NMPlatformLnkIpIp *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_macvlan_add(NMPlatform *                platform,
Packit Service 5ffa24
                                              gboolean                    external_command,
Packit Service 5ffa24
                                              const char *                name,
Packit Service 5ffa24
                                              int                         parent,
Packit Service 5ffa24
                                              const NMPlatformLnkMacvlan *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_sit_add(NMPlatform *            platform,
Packit Service 5ffa24
                                          gboolean                external_command,
Packit Service 5ffa24
                                          const char *            name,
Packit Service 5ffa24
                                          const NMPlatformLnkSit *lnk);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_tun_add(NMPlatform *            platform,
Packit Service 5ffa24
                                          gboolean                external_command,
Packit Service 5ffa24
                                          const char *            name,
Packit Service 5ffa24
                                          const NMPlatformLnkTun *lnk,
Packit Service 5ffa24
                                          int *                   out_fd);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_vrf_add(NMPlatform *            platform,
Packit Service 5ffa24
                                          gboolean                external_command,
Packit Service 5ffa24
                                          const char *            name,
Packit Service 5ffa24
                                          const NMPlatformLnkVrf *lnk,
Packit Service 5ffa24
                                          gboolean *              out_not_supported);
Packit Service 5ffa24
const NMPlatformLink *nmtstp_link_vxlan_add(NMPlatform *              platform,
Packit Service 5ffa24
                                            gboolean                  external_command,
Packit Service 5ffa24
                                            const char *              name,
Packit Service 5ffa24
                                            const NMPlatformLnkVxlan *lnk);
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_link_delete(NMPlatform *platform,
Packit Service 5ffa24
                        gboolean    external_command,
Packit Service 5ffa24
                        int         ifindex,
Packit Service 5ffa24
                        const char *name,
Packit Service 5ffa24
                        gboolean    require_exist);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
extern int NMTSTP_ENV1_IFINDEX;
Packit Service 5ffa24
extern int NMTSTP_ENV1_EX;
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
_nmtstp_env1_wrapper_setup(const NmtstTestData *test_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    int *    p_ifindex;
Packit Service 5ffa24
    gpointer p_ifup;
Packit Service 5ffa24
Packit Service 5ffa24
    nmtst_test_data_unpack(test_data, &p_ifindex, NULL, NULL, NULL, &p_ifup);
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(p_ifindex && *p_ifindex == -1);
Packit Service 5ffa24
Packit Service 5ffa24
    _LOGT("TEST[%s]: setup", test_data->testpath);
Packit Service 5ffa24
Packit Service 5ffa24
    nmtstp_link_delete(NM_PLATFORM_GET, -1, -1, DEVICE_NAME, FALSE);
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(NMTST_NM_ERR_SUCCESS(nm_platform_link_dummy_add(NM_PLATFORM_GET, DEVICE_NAME, NULL)));
Packit Service 5ffa24
Packit Service 5ffa24
    *p_ifindex = nm_platform_link_get_ifindex(NM_PLATFORM_GET, DEVICE_NAME);
Packit Service 5ffa24
    g_assert_cmpint(*p_ifindex, >, 0);
Packit Service 5ffa24
    g_assert_cmpint(NMTSTP_ENV1_IFINDEX, ==, -1);
Packit Service 5ffa24
Packit Service 5ffa24
    if (GPOINTER_TO_INT(p_ifup))
Packit Bot c44df3
        g_assert(nm_platform_link_change_flags(NM_PLATFORM_GET, *p_ifindex, IFF_UP, TRUE) >= 0);
Packit Service 5ffa24
Packit Service 5ffa24
    nm_platform_process_events(NM_PLATFORM_GET);
Packit Service 5ffa24
Packit Service 5ffa24
    NMTSTP_ENV1_IFINDEX = *p_ifindex;
Packit Service 5ffa24
    NMTSTP_ENV1_EX      = nmtstp_run_command_check_external_global();
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
_nmtstp_env1_wrapper_run(gconstpointer user_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    const NmtstTestData *test_data = user_data;
Packit Service 5ffa24
    GTestDataFunc        test_func_data;
Packit Service 5ffa24
    GTestFunc            test_func;
Packit Service 5ffa24
    gconstpointer        d;
Packit Service 5ffa24
Packit Service 5ffa24
    nmtst_test_data_unpack(test_data, NULL, &test_func, &test_func_data, &d, NULL);
Packit Service 5ffa24
Packit Service 5ffa24
    _LOGT("TEST[%s]: run", test_data->testpath);
Packit Service 5ffa24
    if (test_func)
Packit Service 5ffa24
        test_func();
Packit Service 5ffa24
    else
Packit Service 5ffa24
        test_func_data(d);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
_nmtstp_env1_wrapper_teardown(const NmtstTestData *test_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    int *p_ifindex;
Packit Service 5ffa24
Packit Service 5ffa24
    nmtst_test_data_unpack(test_data, &p_ifindex, NULL, NULL, NULL, NULL);
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert_cmpint(NMTSTP_ENV1_IFINDEX, ==, *p_ifindex);
Packit Service 5ffa24
    NMTSTP_ENV1_IFINDEX = -1;
Packit Service 5ffa24
Packit Service 5ffa24
    _LOGT("TEST[%s]: teardown", test_data->testpath);
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert_cmpint(*p_ifindex, ==, nm_platform_link_get_ifindex(NM_PLATFORM_GET, DEVICE_NAME));
Packit Service 5ffa24
    g_assert(nm_platform_link_delete(NM_PLATFORM_GET, *p_ifindex));
Packit Service 5ffa24
Packit Service 5ffa24
    nm_platform_process_events(NM_PLATFORM_GET);
Packit Service 5ffa24
Packit Service 5ffa24
    _LOGT("TEST[%s]: finished", test_data->testpath);
Packit Service 5ffa24
Packit Service 5ffa24
    *p_ifindex = -1;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/* add test function, that set's up a particular environment, consisting
Packit Service 5ffa24
 * of a dummy device with ifindex NMTSTP_ENV1_IFINDEX. */
Packit Service 5ffa24
#define _nmtstp_env1_add_test_func_full(testpath, test_func, test_data_func, arg, ifup) \
Packit Service 5ffa24
    nmtst_add_test_func_full(testpath,                                                  \
Packit Service 5ffa24
                             _nmtstp_env1_wrapper_run,                                  \
Packit Service 5ffa24
                             _nmtstp_env1_wrapper_setup,                                \
Packit Service 5ffa24
                             _nmtstp_env1_wrapper_teardown,                             \
Packit Service 5ffa24
                             ({                                                         \
Packit Service 5ffa24
                                 static int _ifindex = -1;                              \
Packit Service 5ffa24
                                 &_ifindex;                                             \
Packit Service 5ffa24
                             }),                                                        \
Packit Service 5ffa24
                             ({                                                         \
Packit Service 5ffa24
                                 GTestFunc _test_func = (test_func);                    \
Packit Service 5ffa24
                                 _test_func;                                            \
Packit Service 5ffa24
                             }),                                                        \
Packit Service 5ffa24
                             ({                                                         \
Packit Service 5ffa24
                                 GTestDataFunc _test_func = (test_data_func);           \
Packit Service 5ffa24
                                 _test_func;                                            \
Packit Service 5ffa24
                             }),                                                        \
Packit Service 5ffa24
                             (arg),                                                     \
Packit Service 5ffa24
                             ({                                                         \
Packit Service 5ffa24
                                 gboolean _ifup = (ifup);                               \
Packit Service 5ffa24
                                 GINT_TO_POINTER(_ifup);                                \
Packit Service 5ffa24
                             }))
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_env1_add_test_func_data(testpath, test_func, arg, ifup) \
Packit Service 5ffa24
    _nmtstp_env1_add_test_func_full(testpath, NULL, test_func, arg, ifup)
Packit Service 5ffa24
Packit Service 5ffa24
#define nmtstp_env1_add_test_func(testpath, test_func, ifup) \
Packit Service 5ffa24
    _nmtstp_env1_add_test_func_full(testpath, test_func, NULL, NULL, ifup)
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
typedef void (*NMTstpSetupFunc)(void);
Packit Service 5ffa24
extern NMTstpSetupFunc const _nmtstp_setup_platform_func;
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_setup_platform(void);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct _NMTstpAcdDefender NMTstpAcdDefender;
Packit Service 5ffa24
Packit Service 5ffa24
NMTstpAcdDefender *
Packit Service 5ffa24
nmtstp_acd_defender_new(int ifindex, in_addr_t ip_addr, const NMEtherAddr *mac_addr);
Packit Service 5ffa24
Packit Service 5ffa24
void nmtstp_acd_defender_destroy(NMTstpAcdDefender *defender);
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
void _nmtstp_init_tests(int *argc, char ***argv);
Packit Service 5ffa24
void _nmtstp_setup_tests(void);