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

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