Blame src/core/ndisc/nm-fake-ndisc.c

Packit Service 5ffa24
/* SPDX-License-Identifier: GPL-2.0-or-later */
Packit Service 5ffa24
/*
Packit Service 5ffa24
 * Copyright (C) 2013 Red Hat, Inc.
Packit Service 5ffa24
 */
Packit Service 5ffa24
Packit Service 2bceb2
#include "src/core/nm-default-daemon.h"
Packit Service 5ffa24
Packit Service 5ffa24
#include "nm-fake-ndisc.h"
Packit Service 5ffa24
Packit Service 5ffa24
#include <arpa/inet.h>
Packit Service 5ffa24
Packit Service 5ffa24
#include "nm-ndisc-private.h"
Packit Service 5ffa24
Packit Service 5ffa24
#define _NMLOG_PREFIX_NAME "ndisc-fake"
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct {
Packit Service 5ffa24
    guint id;
Packit Service 5ffa24
    guint when;
Packit Service 5ffa24
Packit Service 5ffa24
    NMNDiscDHCPLevel dhcp_level;
Packit Service 5ffa24
    GArray *         gateways;
Packit Service 5ffa24
    GArray *         prefixes;
Packit Service 5ffa24
    GArray *         dns_servers;
Packit Service 5ffa24
    GArray *         dns_domains;
Packit Service 5ffa24
    int              hop_limit;
Packit Service 5ffa24
    guint32          mtu;
Packit Service 5ffa24
} FakeRa;
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct {
Packit Service 5ffa24
    struct in6_addr    network;
Packit Service 5ffa24
    struct in6_addr    gateway;
Packit Service 5ffa24
    gint64             expiry_msec;
Packit Service 5ffa24
    gint64             expiry_preferred_msec;
Packit Service 5ffa24
    int                plen;
Packit Service 5ffa24
    NMIcmpv6RouterPref preference;
Packit Service 5ffa24
} FakePrefix;
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
enum {
Packit Service 5ffa24
    RS_SENT,
Packit Service 5ffa24
    LAST_SIGNAL,
Packit Service 5ffa24
};
Packit Service 5ffa24
static guint signals[LAST_SIGNAL] = {0};
Packit Service 5ffa24
Packit Service 5ffa24
typedef struct {
Packit Service 5ffa24
    guint   receive_ra_id;
Packit Service 5ffa24
    GSList *ras;
Packit Service 5ffa24
} NMFakeNDiscPrivate;
Packit Service 5ffa24
Packit Service 5ffa24
struct _NMFakeRNDisc {
Packit Service 5ffa24
    NMNDisc            parent;
Packit Service 5ffa24
    NMFakeNDiscPrivate _priv;
Packit Service 5ffa24
};
Packit Service 5ffa24
Packit Service 5ffa24
struct _NMFakeRNDiscClass {
Packit Service 5ffa24
    NMNDiscClass parent;
Packit Service 5ffa24
};
Packit Service 5ffa24
Packit Service 5ffa24
G_DEFINE_TYPE(NMFakeNDisc, nm_fake_ndisc, NM_TYPE_NDISC)
Packit Service 5ffa24
Packit Service 5ffa24
#define NM_FAKE_NDISC_GET_PRIVATE(self) \
Packit Service 5ffa24
    _NM_GET_PRIVATE(self, NMFakeNDisc, NM_IS_FAKE_NDISC, NMNDisc)
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
fake_ra_free(gpointer data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    FakeRa *ra = data;
Packit Service 5ffa24
Packit Service 5ffa24
    g_array_free(ra->gateways, TRUE);
Packit Service 5ffa24
    g_array_free(ra->prefixes, TRUE);
Packit Service 5ffa24
    g_array_free(ra->dns_servers, TRUE);
Packit Service 5ffa24
    g_array_free(ra->dns_domains, TRUE);
Packit Service 5ffa24
    g_free(ra);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
ra_dns_domain_free(gpointer data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    g_free(((NMNDiscDNSDomain *) (data))->domain);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static FakeRa *
Packit Service 5ffa24
find_ra(GSList *ras, guint id)
Packit Service 5ffa24
{
Packit Service 5ffa24
    GSList *iter;
Packit Service 5ffa24
Packit Service 5ffa24
    for (iter = ras; iter; iter = iter->next) {
Packit Service 5ffa24
        if (((FakeRa *) iter->data)->id == id)
Packit Service 5ffa24
            return iter->data;
Packit Service 5ffa24
    }
Packit Service 5ffa24
    return NULL;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
guint
Packit Service 5ffa24
nm_fake_ndisc_add_ra(NMFakeNDisc *    self,
Packit Service 5ffa24
                     guint            seconds_after_previous,
Packit Service 5ffa24
                     NMNDiscDHCPLevel dhcp_level,
Packit Service 5ffa24
                     int              hop_limit,
Packit Service 5ffa24
                     guint32          mtu)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv    = NM_FAKE_NDISC_GET_PRIVATE(self);
Packit Service 5ffa24
    static guint        counter = 1;
Packit Service 5ffa24
    FakeRa *            ra;
Packit Service 5ffa24
Packit Service 5ffa24
    ra              = g_malloc0(sizeof(*ra));
Packit Service 5ffa24
    ra->id          = counter++;
Packit Service 5ffa24
    ra->when        = seconds_after_previous;
Packit Service 5ffa24
    ra->dhcp_level  = dhcp_level;
Packit Service 5ffa24
    ra->hop_limit   = hop_limit;
Packit Service 5ffa24
    ra->mtu         = mtu;
Packit Service 5ffa24
    ra->gateways    = g_array_new(FALSE, FALSE, sizeof(NMNDiscGateway));
Packit Service 5ffa24
    ra->prefixes    = g_array_new(FALSE, FALSE, sizeof(FakePrefix));
Packit Service 5ffa24
    ra->dns_servers = g_array_new(FALSE, FALSE, sizeof(NMNDiscDNSServer));
Packit Service 5ffa24
    ra->dns_domains = g_array_new(FALSE, FALSE, sizeof(NMNDiscDNSDomain));
Packit Service 5ffa24
    g_array_set_clear_func(ra->dns_domains, ra_dns_domain_free);
Packit Service 5ffa24
Packit Service 5ffa24
    priv->ras = g_slist_append(priv->ras, ra);
Packit Service 5ffa24
    return ra->id;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
void
Packit Service 5ffa24
nm_fake_ndisc_add_gateway(NMFakeNDisc *      self,
Packit Service 5ffa24
                          guint              ra_id,
Packit Service 5ffa24
                          const char *       addr,
Packit Service 5ffa24
                          gint64             expiry_msec,
Packit Service 5ffa24
                          NMIcmpv6RouterPref preference)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(self);
Packit Service 5ffa24
    FakeRa *            ra   = find_ra(priv->ras, ra_id);
Packit Service 5ffa24
    NMNDiscGateway *    gw;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(ra);
Packit Service 5ffa24
Packit Service 5ffa24
    gw = nm_g_array_append_new(ra->gateways, NMNDiscGateway);
Packit Service 5ffa24
    if (inet_pton(AF_INET6, addr, &gw->address) != 1)
Packit Service 5ffa24
        g_assert_not_reached();
Packit Service 5ffa24
    gw->expiry_msec = expiry_msec;
Packit Service 5ffa24
    gw->preference  = preference;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
void
Packit Service 5ffa24
nm_fake_ndisc_add_prefix(NMFakeNDisc *      self,
Packit Service 5ffa24
                         guint              ra_id,
Packit Service 5ffa24
                         const char *       network,
Packit Service 5ffa24
                         guint              plen,
Packit Service 5ffa24
                         const char *       gateway,
Packit Service 5ffa24
                         gint64             expiry_msec,
Packit Service 5ffa24
                         gint64             expiry_preferred_msec,
Packit Service 5ffa24
                         NMIcmpv6RouterPref preference)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(self);
Packit Service 5ffa24
    FakeRa *            ra   = find_ra(priv->ras, ra_id);
Packit Service 5ffa24
    FakePrefix *        prefix;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(ra);
Packit Service 5ffa24
Packit Service 5ffa24
    prefix  = nm_g_array_append_new(ra->prefixes, FakePrefix);
Packit Service 5ffa24
    *prefix = (FakePrefix){
Packit Service 5ffa24
        .plen                  = plen,
Packit Service 5ffa24
        .expiry_msec           = expiry_msec,
Packit Service 5ffa24
        .expiry_preferred_msec = expiry_preferred_msec,
Packit Service 5ffa24
        .preference            = preference,
Packit Service 5ffa24
    };
Packit Service 5ffa24
    if (inet_pton(AF_INET6, network, &prefix->network) != 1)
Packit Service 5ffa24
        g_assert_not_reached();
Packit Service 5ffa24
    if (inet_pton(AF_INET6, gateway, &prefix->gateway) != 1)
Packit Service 5ffa24
        g_assert_not_reached();
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
void
Packit Service 5ffa24
nm_fake_ndisc_add_dns_server(NMFakeNDisc *self,
Packit Service 5ffa24
                             guint        ra_id,
Packit Service 5ffa24
                             const char * address,
Packit Service 5ffa24
                             gint64       expiry_msec)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(self);
Packit Service 5ffa24
    FakeRa *            ra   = find_ra(priv->ras, ra_id);
Packit Service 5ffa24
    NMNDiscDNSServer *  dns;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(ra);
Packit Service 5ffa24
Packit Service 5ffa24
    dns = nm_g_array_append_new(ra->dns_servers, NMNDiscDNSServer);
Packit Service 5ffa24
Packit Service 5ffa24
    dns->expiry_msec = expiry_msec;
Packit Service 5ffa24
    if (inet_pton(AF_INET6, address, &dns->address) != 1)
Packit Service 5ffa24
        g_assert_not_reached();
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
void
Packit Service 5ffa24
nm_fake_ndisc_add_dns_domain(NMFakeNDisc *self, guint ra_id, const char *domain, gint64 expiry_msec)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(self);
Packit Service 5ffa24
    FakeRa *            ra   = find_ra(priv->ras, ra_id);
Packit Service 5ffa24
    NMNDiscDNSDomain *  dns;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(ra);
Packit Service 5ffa24
Packit Service 5ffa24
    dns = nm_g_array_append_new(ra->dns_domains, NMNDiscDNSDomain);
Packit Service 5ffa24
Packit Service 5ffa24
    dns->domain      = g_strdup(domain);
Packit Service 5ffa24
    dns->expiry_msec = expiry_msec;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
gboolean
Packit Service 5ffa24
nm_fake_ndisc_done(NMFakeNDisc *self)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return !NM_FAKE_NDISC_GET_PRIVATE(self)->ras;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
static gboolean
Packit Service 5ffa24
send_rs(NMNDisc *ndisc, GError **error)
Packit Service 5ffa24
{
Packit Service 5ffa24
    _LOGT("send_rs()");
Packit Service 5ffa24
    g_signal_emit(ndisc, signals[RS_SENT], 0);
Packit Service 5ffa24
    return TRUE;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static gboolean
Packit Service 5ffa24
receive_ra(gpointer user_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDisc *        self     = user_data;
Packit Service 5ffa24
    NMFakeNDiscPrivate * priv     = NM_FAKE_NDISC_GET_PRIVATE(self);
Packit Service 5ffa24
    NMNDisc *            ndisc    = NM_NDISC(self);
Packit Service 5ffa24
    NMNDiscDataInternal *rdata    = ndisc->rdata;
Packit Service 5ffa24
    FakeRa *             ra       = priv->ras->data;
Packit Service 5ffa24
    NMNDiscConfigMap     changed  = 0;
Packit Service 5ffa24
    const gint64         now_msec = nm_utils_get_monotonic_timestamp_msec();
Packit Service 5ffa24
    guint                i;
Packit Service 5ffa24
    NMNDiscDHCPLevel     dhcp_level;
Packit Service 5ffa24
Packit Service 5ffa24
    priv->receive_ra_id = 0;
Packit Service 5ffa24
Packit Service 5ffa24
    /* preserve the "most managed" level  on updates. */
Packit Service 5ffa24
    dhcp_level = MAX(rdata->public.dhcp_level, ra->dhcp_level);
Packit Service 5ffa24
Packit Service 5ffa24
    if (rdata->public.dhcp_level != dhcp_level) {
Packit Service 5ffa24
        rdata->public.dhcp_level = dhcp_level;
Packit Service 5ffa24
        changed |= NM_NDISC_CONFIG_DHCP_LEVEL;
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    for (i = 0; i < ra->gateways->len; i++) {
Packit Service 5ffa24
        const NMNDiscGateway *item = &g_array_index(ra->gateways, NMNDiscGateway, i);
Packit Service 5ffa24
Packit Service 5ffa24
        if (nm_ndisc_add_gateway(ndisc, item, now_msec))
Packit Service 5ffa24
            changed |= NM_NDISC_CONFIG_GATEWAYS;
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    for (i = 0; i < ra->prefixes->len; i++) {
Packit Service 5ffa24
        FakePrefix *       item  = &g_array_index(ra->prefixes, FakePrefix, i);
Packit Service 5ffa24
        const NMNDiscRoute route = {
Packit Service 5ffa24
            .network     = item->network,
Packit Service 5ffa24
            .plen        = item->plen,
Packit Service 5ffa24
            .gateway     = item->gateway,
Packit Service 5ffa24
            .expiry_msec = item->expiry_msec,
Packit Service 5ffa24
            .preference  = item->preference,
Packit Service 5ffa24
        };
Packit Service 5ffa24
Packit Service 5ffa24
        g_assert(route.plen > 0 && route.plen <= 128);
Packit Service 5ffa24
Packit Service 5ffa24
        if (nm_ndisc_add_route(ndisc, &route, now_msec))
Packit Service 5ffa24
            changed |= NM_NDISC_CONFIG_ROUTES;
Packit Service 5ffa24
Packit Service 5ffa24
        if (item->plen == 64) {
Packit Service 5ffa24
            const NMNDiscAddress address = {
Packit Service 5ffa24
                .address               = item->network,
Packit Service 5ffa24
                .expiry_msec           = item->expiry_msec,
Packit Service 5ffa24
                .expiry_preferred_msec = item->expiry_preferred_msec,
Packit Service 5ffa24
                .dad_counter           = 0,
Packit Service 5ffa24
            };
Packit Service 5ffa24
Packit Service 5ffa24
            if (nm_ndisc_complete_and_add_address(ndisc, &address, now_msec))
Packit Service 5ffa24
                changed |= NM_NDISC_CONFIG_ADDRESSES;
Packit Service 5ffa24
        }
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    for (i = 0; i < ra->dns_servers->len; i++) {
Packit Service 5ffa24
        const NMNDiscDNSServer *item = &g_array_index(ra->dns_servers, NMNDiscDNSServer, i);
Packit Service 5ffa24
Packit Service 5ffa24
        if (nm_ndisc_add_dns_server(ndisc, item, now_msec))
Packit Service 5ffa24
            changed |= NM_NDISC_CONFIG_DNS_SERVERS;
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    for (i = 0; i < ra->dns_domains->len; i++) {
Packit Service 5ffa24
        const NMNDiscDNSDomain *item = &g_array_index(ra->dns_domains, NMNDiscDNSDomain, i);
Packit Service 5ffa24
Packit Service 5ffa24
        if (nm_ndisc_add_dns_domain(ndisc, item, now_msec))
Packit Service 5ffa24
            changed |= NM_NDISC_CONFIG_DNS_DOMAINS;
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    if (rdata->public.mtu != ra->mtu) {
Packit Service 5ffa24
        rdata->public.mtu = ra->mtu;
Packit Service 5ffa24
        changed |= NM_NDISC_CONFIG_MTU;
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    if (rdata->public.hop_limit != ra->hop_limit) {
Packit Service 5ffa24
        rdata->public.hop_limit = ra->hop_limit;
Packit Service 5ffa24
        changed |= NM_NDISC_CONFIG_HOP_LIMIT;
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    priv->ras = g_slist_remove(priv->ras, priv->ras->data);
Packit Service 5ffa24
    fake_ra_free(ra);
Packit Service 5ffa24
Packit Service 5ffa24
    nm_ndisc_ra_received(NM_NDISC(self), now_msec, changed);
Packit Service 5ffa24
Packit Service 5ffa24
    /* Schedule next RA */
Packit Service 5ffa24
    if (priv->ras) {
Packit Service 5ffa24
        ra                  = priv->ras->data;
Packit Service 5ffa24
        priv->receive_ra_id = g_timeout_add_seconds(ra->when, receive_ra, self);
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    return G_SOURCE_REMOVE;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
start(NMNDisc *ndisc)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(ndisc);
Packit Service 5ffa24
    FakeRa *            ra;
Packit Service 5ffa24
Packit Service 5ffa24
    /* Queue up the first fake RA */
Packit Service 5ffa24
    g_assert(priv->ras);
Packit Service 5ffa24
    ra = priv->ras->data;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(!priv->receive_ra_id);
Packit Service 5ffa24
    priv->receive_ra_id = g_timeout_add_seconds(ra->when, receive_ra, ndisc);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
stop(NMNDisc *ndisc)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(ndisc);
Packit Service 5ffa24
Packit Service 5ffa24
    nm_clear_g_source(&priv->receive_ra_id);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
void
Packit Service 5ffa24
nm_fake_ndisc_emit_new_ras(NMFakeNDisc *self)
Packit Service 5ffa24
{
Packit Service 5ffa24
    if (!NM_FAKE_NDISC_GET_PRIVATE(self)->receive_ra_id)
Packit Service 5ffa24
        start(NM_NDISC(self));
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
nm_fake_ndisc_init(NMFakeNDisc *fake_ndisc)
Packit Service 5ffa24
{}
Packit Service 5ffa24
Packit Service 5ffa24
NMNDisc *
Packit Service 5ffa24
nm_fake_ndisc_new(int ifindex, const char *ifname)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return g_object_new(NM_TYPE_FAKE_NDISC,
Packit Service 5ffa24
                        NM_NDISC_IFINDEX,
Packit Service 5ffa24
                        ifindex,
Packit Service 5ffa24
                        NM_NDISC_IFNAME,
Packit Service 5ffa24
                        ifname,
Packit Service 5ffa24
                        NM_NDISC_NODE_TYPE,
Packit Service 5ffa24
                        (int) NM_NDISC_NODE_TYPE_HOST,
Packit Service 5ffa24
                        NM_NDISC_STABLE_TYPE,
Packit Service 5ffa24
                        (int) NM_UTILS_STABLE_TYPE_UUID,
Packit Service 5ffa24
                        NM_NDISC_NETWORK_ID,
Packit Service 5ffa24
                        "fake",
Packit Service 5ffa24
                        NM_NDISC_MAX_ADDRESSES,
Packit Service 5ffa24
                        NM_NDISC_MAX_ADDRESSES_DEFAULT,
Packit Service 5ffa24
                        NM_NDISC_ROUTER_SOLICITATIONS,
Packit Service 5ffa24
                        NM_NDISC_ROUTER_SOLICITATIONS_DEFAULT,
Packit Service 5ffa24
                        NM_NDISC_ROUTER_SOLICITATION_INTERVAL,
Packit Service 5ffa24
                        NM_NDISC_RFC4861_RTR_SOLICITATION_INTERVAL,
Packit Service 5ffa24
                        NM_NDISC_RA_TIMEOUT,
Packit Service 5ffa24
                        30u,
Packit Service 5ffa24
                        NULL);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
dispose(GObject *object)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMFakeNDiscPrivate *priv = NM_FAKE_NDISC_GET_PRIVATE(object);
Packit Service 5ffa24
Packit Service 5ffa24
    nm_clear_g_source(&priv->receive_ra_id);
Packit Service 5ffa24
Packit Service 5ffa24
    g_slist_free_full(priv->ras, fake_ra_free);
Packit Service 5ffa24
    priv->ras = NULL;
Packit Service 5ffa24
Packit Service 5ffa24
    G_OBJECT_CLASS(nm_fake_ndisc_parent_class)->dispose(object);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static void
Packit Service 5ffa24
nm_fake_ndisc_class_init(NMFakeNDiscClass *klass)
Packit Service 5ffa24
{
Packit Service 5ffa24
    GObjectClass *object_class = G_OBJECT_CLASS(klass);
Packit Service 5ffa24
    NMNDiscClass *ndisc_class  = NM_NDISC_CLASS(klass);
Packit Service 5ffa24
Packit Service 5ffa24
    object_class->dispose = dispose;
Packit Service 5ffa24
Packit Service 5ffa24
    ndisc_class->start   = start;
Packit Service 5ffa24
    ndisc_class->stop    = stop;
Packit Service 5ffa24
    ndisc_class->send_rs = send_rs;
Packit Service 5ffa24
Packit Service 5ffa24
    signals[RS_SENT] = g_signal_new(NM_FAKE_NDISC_RS_SENT,
Packit Service 5ffa24
                                    G_OBJECT_CLASS_TYPE(klass),
Packit Service 5ffa24
                                    G_SIGNAL_RUN_FIRST,
Packit Service 5ffa24
                                    0,
Packit Service 5ffa24
                                    NULL,
Packit Service 5ffa24
                                    NULL,
Packit Service 5ffa24
                                    NULL,
Packit Service 5ffa24
                                    G_TYPE_NONE,
Packit Service 5ffa24
                                    0);
Packit Service 5ffa24
}