Blame src/platform/tests/test-address.c

Packit Service 87a54e
/* SPDX-License-Identifier: GPL-2.0-or-later */
Packit 5756e2
/*
Packit 5756e2
 * Copyright (C) 2015 Red Hat, Inc.
Packit 5756e2
 */
Packit 5756e2
Packit 5756e2
#include "nm-default.h"
Packit 5756e2
Packit 5756e2
#include "test-common.h"
Packit 5756e2
Packit Service a1bd4f
#define IP4_ADDRESS       "192.0.2.1"
Packit Service a1bd4f
#define IP4_ADDRESS_PEER  "192.0.2.2"
Packit 5756e2
#define IP4_ADDRESS_PEER2 "192.0.3.1"
Packit Service a1bd4f
#define IP4_PLEN          24
Packit Service a1bd4f
#define IP6_ADDRESS       "2001:db8:a:b:1:2:3:4"
Packit Service a1bd4f
#define IP6_PLEN          64
Packit 5756e2
Packit 5756e2
#define DEVICE_IFINDEX NMTSTP_ENV1_IFINDEX
Packit 5756e2
#define EX             NMTSTP_ENV1_EX
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
ip4_address_callback(NMPlatform *               platform,
Packit Service a1bd4f
                     NMPObjectType              obj_type,
Packit Service a1bd4f
                     int                        ifindex,
Packit Service a1bd4f
                     NMPlatformIP4Address *     received,
Packit Service a1bd4f
                     NMPlatformSignalChangeType change_type,
Packit Service a1bd4f
                     SignalData *               data)
Packit 5756e2
{
Packit Service a1bd4f
    g_assert(received);
Packit Service a1bd4f
    g_assert_cmpint(received->ifindex, ==, ifindex);
Packit Service a1bd4f
    g_assert(data && data->name);
Packit Service a1bd4f
    g_assert_cmpstr(data->name, ==, NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED);
Packit 5756e2
Packit Service a1bd4f
    if (data->ifindex && data->ifindex != received->ifindex)
Packit Service a1bd4f
        return;
Packit Service a1bd4f
    if (data->change_type != change_type)
Packit Service a1bd4f
        return;
Packit 5756e2
Packit Service a1bd4f
    if (data->loop)
Packit Service a1bd4f
        g_main_loop_quit(data->loop);
Packit 5756e2
Packit Service a1bd4f
    data->received_count++;
Packit Service a1bd4f
    _LOGD("Received signal '%s' %dth time.", data->name, data->received_count);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
ip6_address_callback(NMPlatform *               platform,
Packit Service a1bd4f
                     NMPObjectType              obj_type,
Packit Service a1bd4f
                     int                        ifindex,
Packit Service a1bd4f
                     NMPlatformIP6Address *     received,
Packit Service a1bd4f
                     NMPlatformSignalChangeType change_type,
Packit Service a1bd4f
                     SignalData *               data)
Packit 5756e2
{
Packit Service a1bd4f
    g_assert(received);
Packit Service a1bd4f
    g_assert_cmpint(received->ifindex, ==, ifindex);
Packit Service a1bd4f
    g_assert(data && data->name);
Packit Service a1bd4f
    g_assert_cmpstr(data->name, ==, NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED);
Packit 5756e2
Packit Service a1bd4f
    if (data->ifindex && data->ifindex != received->ifindex)
Packit Service a1bd4f
        return;
Packit Service a1bd4f
    if (data->change_type != change_type)
Packit Service a1bd4f
        return;
Packit 5756e2
Packit Service a1bd4f
    if (data->loop)
Packit Service a1bd4f
        g_main_loop_quit(data->loop);
Packit 5756e2
Packit Service a1bd4f
    data->received_count++;
Packit Service a1bd4f
    _LOGD("Received signal '%s' %dth time.", data->name, data->received_count);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_ip4_address_general(void)
Packit 5756e2
{
Packit Service a1bd4f
    const int   ifindex         = DEVICE_IFINDEX;
Packit Service a1bd4f
    SignalData *address_added   = add_signal_ifindex(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                                   NM_PLATFORM_SIGNAL_ADDED,
Packit Service a1bd4f
                                                   ip4_address_callback,
Packit Service a1bd4f
                                                   ifindex);
Packit Service a1bd4f
    SignalData *address_changed = add_signal_ifindex(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                                     NM_PLATFORM_SIGNAL_CHANGED,
Packit Service a1bd4f
                                                     ip4_address_callback,
Packit Service a1bd4f
                                                     ifindex);
Packit Service a1bd4f
    SignalData *address_removed = add_signal_ifindex(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                                     NM_PLATFORM_SIGNAL_REMOVED,
Packit Service a1bd4f
                                                     ip4_address_callback,
Packit Service a1bd4f
                                                     ifindex);
Packit Service a1bd4f
    GArray *    addresses;
Packit Service a1bd4f
    NMPlatformIP4Address *address;
Packit Service a1bd4f
    in_addr_t             addr;
Packit Service a1bd4f
    guint32               lifetime  = 2000;
Packit Service a1bd4f
    guint32               preferred = 1000;
Packit Service a1bd4f
Packit Service a1bd4f
    inet_pton(AF_INET, IP4_ADDRESS, &addr);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add address */
Packit Service a1bd4f
    g_assert(!nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr));
Packit Service a1bd4f
    nmtstp_ip4_address_add(NULL, EX, ifindex, addr, IP4_PLEN, addr, lifetime, preferred, 0, NULL);
Packit Service a1bd4f
    g_assert(nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr));
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add address again (aka update) */
Packit Service a1bd4f
    nmtstp_ip4_address_add(NULL,
Packit Service a1bd4f
                           EX,
Packit Service a1bd4f
                           ifindex,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           IP4_PLEN,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           lifetime + 100,
Packit Service a1bd4f
                           preferred + 50,
Packit Service a1bd4f
                           0,
Packit Service a1bd4f
                           NULL);
Packit Service a1bd4f
    accept_signals(address_changed, 0, 1);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Test address listing */
Packit Service a1bd4f
    addresses = nmtstp_platform_ip4_address_get_all(NM_PLATFORM_GET, ifindex);
Packit Service a1bd4f
    g_assert(addresses);
Packit Service a1bd4f
    g_assert_cmpint(addresses->len, ==, 1);
Packit Service a1bd4f
    address = &g_array_index(addresses, NMPlatformIP4Address, 0);
Packit Service a1bd4f
    g_assert_cmpint(address->ifindex, ==, ifindex);
Packit Service a1bd4f
    g_assert_cmphex(address->address, ==, addr);
Packit Service a1bd4f
    g_assert_cmphex(address->peer_address, ==, addr);
Packit Service a1bd4f
    g_assert_cmpint(address->plen, ==, IP4_PLEN);
Packit Service a1bd4f
    g_array_unref(addresses);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Remove address */
Packit Service a1bd4f
    nmtstp_ip4_address_del(NULL, EX, ifindex, addr, IP4_PLEN, addr);
Packit Service a1bd4f
    g_assert(!nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr));
Packit Service a1bd4f
    accept_signal(address_removed);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Remove address again */
Packit Service a1bd4f
    nmtstp_ip4_address_del(NULL, EX, ifindex, addr, IP4_PLEN, addr);
Packit Service a1bd4f
Packit Service a1bd4f
    free_signal(address_added);
Packit Service a1bd4f
    free_signal(address_changed);
Packit Service a1bd4f
    free_signal(address_removed);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_ip6_address_general(void)
Packit 5756e2
{
Packit Service a1bd4f
    const int   ifindex         = DEVICE_IFINDEX;
Packit Service a1bd4f
    SignalData *address_added   = add_signal_ifindex(NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
Packit Service a1bd4f
                                                   NM_PLATFORM_SIGNAL_ADDED,
Packit Service a1bd4f
                                                   ip6_address_callback,
Packit Service a1bd4f
                                                   ifindex);
Packit Service a1bd4f
    SignalData *address_changed = add_signal_ifindex(NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
Packit Service a1bd4f
                                                     NM_PLATFORM_SIGNAL_CHANGED,
Packit Service a1bd4f
                                                     ip6_address_callback,
Packit Service a1bd4f
                                                     ifindex);
Packit Service a1bd4f
    SignalData *address_removed = add_signal_ifindex(NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
Packit Service a1bd4f
                                                     NM_PLATFORM_SIGNAL_REMOVED,
Packit Service a1bd4f
                                                     ip6_address_callback,
Packit Service a1bd4f
                                                     ifindex);
Packit Service a1bd4f
    GArray *    addresses;
Packit Service a1bd4f
    NMPlatformIP6Address *address;
Packit Service a1bd4f
    struct in6_addr       addr;
Packit Service a1bd4f
    guint32               lifetime  = 2000;
Packit Service a1bd4f
    guint32               preferred = 1000;
Packit Service a1bd4f
    guint                 flags     = 0;
Packit Service a1bd4f
Packit Service a1bd4f
    inet_pton(AF_INET6, IP6_ADDRESS, &addr);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add address */
Packit Service a1bd4f
    g_assert(!nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
    nmtstp_ip6_address_add(NULL,
Packit Service a1bd4f
                           EX,
Packit Service a1bd4f
                           ifindex,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           IP6_PLEN,
Packit Service a1bd4f
                           in6addr_any,
Packit Service a1bd4f
                           lifetime,
Packit Service a1bd4f
                           preferred,
Packit Service a1bd4f
                           flags);
Packit Service a1bd4f
    g_assert(nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add address again (aka update) */
Packit Service a1bd4f
    nmtstp_ip6_address_add(NULL,
Packit Service a1bd4f
                           EX,
Packit Service a1bd4f
                           ifindex,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           IP6_PLEN,
Packit Service a1bd4f
                           in6addr_any,
Packit Service a1bd4f
                           lifetime,
Packit Service a1bd4f
                           preferred,
Packit Service a1bd4f
                           flags);
Packit Service a1bd4f
    accept_signals(address_changed, 0, 2);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Test address listing */
Packit Service a1bd4f
    addresses = nmtstp_platform_ip6_address_get_all(NM_PLATFORM_GET, ifindex);
Packit Service a1bd4f
    g_assert(addresses);
Packit Service a1bd4f
    g_assert_cmpint(addresses->len, ==, 1);
Packit Service a1bd4f
    address = &g_array_index(addresses, NMPlatformIP6Address, 0);
Packit Service a1bd4f
    g_assert_cmpint(address->ifindex, ==, ifindex);
Packit Service a1bd4f
    g_assert(!memcmp(&address->address, &addr, sizeof(addr)));
Packit Service a1bd4f
    g_assert_cmpint(address->plen, ==, IP6_PLEN);
Packit Service a1bd4f
    g_array_unref(addresses);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Remove address */
Packit Service a1bd4f
    nmtstp_ip6_address_del(NULL, EX, ifindex, addr, IP6_PLEN);
Packit Service a1bd4f
    g_assert(!nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
    accept_signal(address_removed);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Remove address again */
Packit Service a1bd4f
    nmtstp_ip6_address_del(NULL, EX, ifindex, addr, IP6_PLEN);
Packit Service a1bd4f
Packit Service a1bd4f
    /* ensure not pending signal. */
Packit Service a1bd4f
    accept_signals(address_changed, 0, 1);
Packit Service a1bd4f
Packit Service a1bd4f
    free_signal(address_added);
Packit Service a1bd4f
    free_signal(address_changed);
Packit Service a1bd4f
    free_signal(address_removed);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_ip4_address_general_2(void)
Packit 5756e2
{
Packit Service a1bd4f
    const int   ifindex         = DEVICE_IFINDEX;
Packit Service a1bd4f
    SignalData *address_added   = add_signal(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                           NM_PLATFORM_SIGNAL_ADDED,
Packit Service a1bd4f
                                           ip4_address_callback);
Packit Service a1bd4f
    SignalData *address_removed = add_signal(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                             NM_PLATFORM_SIGNAL_REMOVED,
Packit Service a1bd4f
                                             ip4_address_callback);
Packit Service a1bd4f
    in_addr_t   addr;
Packit Service a1bd4f
    guint32     lifetime  = 2000;
Packit Service a1bd4f
    guint32     preferred = 1000;
Packit Service a1bd4f
Packit Service a1bd4f
    inet_pton(AF_INET, IP4_ADDRESS, &addr);
Packit Service a1bd4f
    g_assert(ifindex > 0);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Looks like addresses are not announced by kernel when the interface
Packit Service a1bd4f
     * is down. Link-local IPv6 address is automatically added.
Packit Service a1bd4f
     */
Packit Service a1bd4f
    g_assert(nm_platform_link_set_up(NM_PLATFORM_GET, DEVICE_IFINDEX, NULL));
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add/delete notification */
Packit Service a1bd4f
    nmtstp_ip4_address_add(NULL, EX, ifindex, addr, IP4_PLEN, addr, lifetime, preferred, 0, NULL);
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
    g_assert(nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr));
Packit Service a1bd4f
    nmtstp_ip4_address_del(NULL, EX, ifindex, addr, IP4_PLEN, addr);
Packit Service a1bd4f
    accept_signal(address_removed);
Packit Service a1bd4f
    g_assert(!nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr));
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add/delete conflict */
Packit Service a1bd4f
    nmtstp_ip4_address_add(NULL, EX, ifindex, addr, IP4_PLEN, addr, lifetime, preferred, 0, NULL);
Packit Service a1bd4f
    g_assert(nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr));
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
Packit Service a1bd4f
    free_signal(address_added);
Packit Service a1bd4f
    free_signal(address_removed);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_ip6_address_general_2(void)
Packit 5756e2
{
Packit Service a1bd4f
    const int       ifindex         = DEVICE_IFINDEX;
Packit Service a1bd4f
    SignalData *    address_added   = add_signal(NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
Packit Service a1bd4f
                                           NM_PLATFORM_SIGNAL_ADDED,
Packit Service a1bd4f
                                           ip6_address_callback);
Packit Service a1bd4f
    SignalData *    address_removed = add_signal(NM_PLATFORM_SIGNAL_IP6_ADDRESS_CHANGED,
Packit Service a1bd4f
                                             NM_PLATFORM_SIGNAL_REMOVED,
Packit Service a1bd4f
                                             ip6_address_callback);
Packit Service a1bd4f
    struct in6_addr addr;
Packit Service a1bd4f
    guint32         lifetime  = 2000;
Packit Service a1bd4f
    guint32         preferred = 1000;
Packit Service a1bd4f
    guint           flags     = 0;
Packit Service a1bd4f
Packit Service a1bd4f
    inet_pton(AF_INET6, IP6_ADDRESS, &addr);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add/delete notification */
Packit Service a1bd4f
    nmtstp_ip6_address_add(NULL, EX, ifindex, addr, IP6_PLEN, in6addr_any, lifetime, preferred, 0);
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
    g_assert(nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
Packit Service a1bd4f
    nmtstp_ip6_address_del(NULL, EX, ifindex, addr, IP6_PLEN);
Packit Service a1bd4f
    accept_signal(address_removed);
Packit Service a1bd4f
    g_assert(!nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add/delete conflict */
Packit Service a1bd4f
    nmtstp_ip6_address_add(NULL, EX, ifindex, addr, IP6_PLEN, in6addr_any, lifetime, preferred, 0);
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
    g_assert(nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
Packit Service a1bd4f
    nmtstp_ip6_address_add(NULL,
Packit Service a1bd4f
                           EX,
Packit Service a1bd4f
                           ifindex,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           IP6_PLEN,
Packit Service a1bd4f
                           in6addr_any,
Packit Service a1bd4f
                           lifetime,
Packit Service a1bd4f
                           preferred,
Packit Service a1bd4f
                           flags);
Packit Service a1bd4f
    ensure_no_signal(address_added);
Packit Service a1bd4f
    g_assert(nm_platform_ip6_address_get(NM_PLATFORM_GET, ifindex, &addr));
Packit Service a1bd4f
Packit Service a1bd4f
    free_signal(address_added);
Packit Service a1bd4f
    free_signal(address_removed);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_ip4_address_peer(void)
Packit 5756e2
{
Packit Service a1bd4f
    const int                   ifindex         = DEVICE_IFINDEX;
Packit Service a1bd4f
    SignalData *                address_added   = add_signal(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                           NM_PLATFORM_SIGNAL_ADDED,
Packit Service a1bd4f
                                           ip4_address_callback);
Packit Service a1bd4f
    SignalData *                address_removed = add_signal(NM_PLATFORM_SIGNAL_IP4_ADDRESS_CHANGED,
Packit Service a1bd4f
                                             NM_PLATFORM_SIGNAL_REMOVED,
Packit Service a1bd4f
                                             ip4_address_callback);
Packit Service a1bd4f
    in_addr_t                   addr, addr_peer, addr_peer2;
Packit Service a1bd4f
    guint32                     lifetime  = 2000;
Packit Service a1bd4f
    guint32                     preferred = 1000;
Packit Service a1bd4f
    const NMPlatformIP4Address *a;
Packit Service a1bd4f
Packit Service a1bd4f
    inet_pton(AF_INET, IP4_ADDRESS, &addr);
Packit Service a1bd4f
    inet_pton(AF_INET, IP4_ADDRESS_PEER, &addr_peer);
Packit Service a1bd4f
    inet_pton(AF_INET, IP4_ADDRESS_PEER2, &addr_peer2);
Packit Service a1bd4f
    g_assert(ifindex > 0);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(addr != addr_peer);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(nm_platform_link_set_up(NM_PLATFORM_GET, ifindex, NULL));
Packit Service a1bd4f
    accept_signals(address_removed, 0, G_MAXINT);
Packit Service a1bd4f
    accept_signals(address_added, 0, G_MAXINT);
Packit Service a1bd4f
Packit Service a1bd4f
    /* Add/delete notification */
Packit Service a1bd4f
    nmtstp_ip4_address_add(NULL,
Packit Service a1bd4f
                           EX,
Packit Service a1bd4f
                           ifindex,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           IP4_PLEN,
Packit Service a1bd4f
                           addr_peer,
Packit Service a1bd4f
                           lifetime,
Packit Service a1bd4f
                           preferred,
Packit Service a1bd4f
                           0,
Packit Service a1bd4f
                           NULL);
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
    a = nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer);
Packit Service a1bd4f
    g_assert(a);
Packit Service a1bd4f
    g_assert(!nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer2));
Packit Service a1bd4f
Packit Service a1bd4f
    nmtstp_ip_address_assert_lifetime((NMPlatformIPAddress *) a, -1, lifetime, preferred);
Packit Service a1bd4f
Packit Service a1bd4f
    nmtstp_ip4_address_add(NULL,
Packit Service a1bd4f
                           EX,
Packit Service a1bd4f
                           ifindex,
Packit Service a1bd4f
                           addr,
Packit Service a1bd4f
                           IP4_PLEN,
Packit Service a1bd4f
                           addr_peer2,
Packit Service a1bd4f
                           lifetime,
Packit Service a1bd4f
                           preferred,
Packit Service a1bd4f
                           0,
Packit Service a1bd4f
                           NULL);
Packit Service a1bd4f
    accept_signal(address_added);
Packit Service a1bd4f
    g_assert(nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer));
Packit Service a1bd4f
    a = nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer2);
Packit Service a1bd4f
    g_assert(a);
Packit Service a1bd4f
Packit Service a1bd4f
    nmtstp_ip_address_assert_lifetime((NMPlatformIPAddress *) a, -1, lifetime, preferred);
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(addr != addr_peer);
Packit Service a1bd4f
    nmtstp_ip4_address_del(NULL, EX, ifindex, addr, IP4_PLEN, addr_peer);
Packit Service a1bd4f
    accept_signal(address_removed);
Packit Service a1bd4f
    g_assert(!nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer));
Packit Service a1bd4f
    g_assert(nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, IP4_PLEN, addr_peer2));
Packit Service a1bd4f
Packit Service a1bd4f
    free_signal(address_added);
Packit Service a1bd4f
    free_signal(address_removed);
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
static void
Packit Service a1bd4f
test_ip4_address_peer_zero(void)
Packit 5756e2
{
Packit Service a1bd4f
    const int   ifindex = DEVICE_IFINDEX;
Packit Service a1bd4f
    in_addr_t   addr, addr_peer;
Packit Service a1bd4f
    guint32     lifetime  = 2000;
Packit Service a1bd4f
    guint32     preferred = 1000;
Packit Service a1bd4f
    const gint8 plen      = 24;
Packit Service a1bd4f
    const char *label     = NULL;
Packit Service a1bd4f
    in_addr_t   peers[3], r_peers[3];
Packit Service a1bd4f
    int         i;
Packit Service a1bd4f
    GArray *    addrs;
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(ifindex > 0);
Packit Service a1bd4f
Packit Service a1bd4f
    inet_pton(AF_INET, "192.168.5.2", &addr);
Packit Service a1bd4f
    inet_pton(AF_INET, "192.168.6.2", &addr_peer);
Packit Service a1bd4f
    peers[0] = addr;
Packit Service a1bd4f
    peers[1] = addr_peer;
Packit Service a1bd4f
    peers[2] = 0;
Packit Service a1bd4f
Packit Service a1bd4f
    g_assert(nm_platform_link_set_up(NM_PLATFORM_GET, ifindex, NULL));
Packit Service a1bd4f
Packit Service a1bd4f
    nmtst_rand_perm(NULL, r_peers, peers, sizeof(peers[0]), G_N_ELEMENTS(peers));
Packit Service a1bd4f
    for (i = 0; i < G_N_ELEMENTS(peers); i++) {
Packit Service a1bd4f
        g_assert(!nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, plen, r_peers[i]));
Packit Service a1bd4f
Packit Service a1bd4f
        nmtstp_ip4_address_add(NULL,
Packit Service a1bd4f
                               EX,
Packit Service a1bd4f
                               ifindex,
Packit Service a1bd4f
                               addr,
Packit Service a1bd4f
                               plen,
Packit Service a1bd4f
                               r_peers[i],
Packit Service a1bd4f
                               lifetime,
Packit Service a1bd4f
                               preferred,
Packit Service a1bd4f
                               0,
Packit Service a1bd4f
                               label);
Packit Service a1bd4f
Packit Service a1bd4f
        addrs = nmtstp_platform_ip4_address_get_all(NM_PLATFORM_GET, ifindex);
Packit Service a1bd4f
        g_assert(addrs);
Packit Service a1bd4f
        g_assert_cmpint(addrs->len, ==, i + 1);
Packit Service a1bd4f
        g_array_unref(addrs);
Packit Service a1bd4f
    }
Packit Service a1bd4f
Packit Service a1bd4f
    if (nmtst_is_debug() && nmtstp_is_root_test())
Packit Service a1bd4f
        nmtstp_run_command_check("ip address show dev %s", DEVICE_NAME);
Packit Service a1bd4f
Packit Service a1bd4f
    nmtst_rand_perm(NULL, r_peers, peers, sizeof(peers[0]), G_N_ELEMENTS(peers));
Packit Service a1bd4f
    for (i = 0; i < G_N_ELEMENTS(peers); i++) {
Packit Service a1bd4f
        g_assert(nm_platform_ip4_address_get(NM_PLATFORM_GET, ifindex, addr, plen, r_peers[i]));
Packit Service a1bd4f
Packit Service a1bd4f
        nmtstp_ip4_address_del(NULL, EX, ifindex, addr, plen, r_peers[i]);
Packit Service a1bd4f
Packit Service a1bd4f
        addrs = nmtstp_platform_ip4_address_get_all(NM_PLATFORM_GET, ifindex);
Packit Service a1bd4f
        g_assert(addrs);
Packit Service a1bd4f
        g_assert_cmpint(addrs->len, ==, G_N_ELEMENTS(peers) - i - 1);
Packit Service a1bd4f
        g_array_unref(addrs);
Packit Service a1bd4f
    }
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************/
Packit 5756e2
Packit 5756e2
NMTstpSetupFunc const _nmtstp_setup_platform_func = SETUP;
Packit 5756e2
Packit 5756e2
void
Packit Service a1bd4f
_nmtstp_init_tests(int *argc, char ***argv)
Packit 5756e2
{
Packit Service a1bd4f
    nmtst_init_with_logging(argc, argv, NULL, "ALL");
Packit 5756e2
}
Packit 5756e2
Packit 5756e2
/*****************************************************************************
Packit 5756e2
 * SETUP TESTS
Packit 5756e2
 *****************************************************************************/
Packit 5756e2
Packit 5756e2
void
Packit Service a1bd4f
_nmtstp_setup_tests(void)
Packit 5756e2
{
Packit 5756e2
#define add_test_func(testpath, test_func) nmtstp_env1_add_test_func(testpath, test_func, FALSE)
Packit Service a1bd4f
    add_test_func("/address/ipv4/general", test_ip4_address_general);
Packit Service a1bd4f
    add_test_func("/address/ipv6/general", test_ip6_address_general);
Packit 5756e2
Packit Service a1bd4f
    add_test_func("/address/ipv4/general-2", test_ip4_address_general_2);
Packit Service a1bd4f
    add_test_func("/address/ipv6/general-2", test_ip6_address_general_2);
Packit 5756e2
Packit Service a1bd4f
    add_test_func("/address/ipv4/peer", test_ip4_address_peer);
Packit Service a1bd4f
    add_test_func("/address/ipv4/peer/zero", test_ip4_address_peer_zero);
Packit 5756e2
}