|
Packit |
5756e2 |
#pragma once
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/*
|
|
Packit |
5756e2 |
* IPv4 Address Conflict Detection
|
|
Packit |
5756e2 |
*
|
|
Packit |
5756e2 |
* This is the public header of the n-acd library, implementing IPv4 Address
|
|
Packit |
5756e2 |
* Conflict Detection as described in RFC-5227. This header defines the public
|
|
Packit |
5756e2 |
* API and all entry points of n-acd.
|
|
Packit |
5756e2 |
*/
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#ifdef __cplusplus
|
|
Packit |
5756e2 |
extern "C" {
|
|
Packit |
5756e2 |
#endif
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#include <netinet/in.h>
|
|
Packit |
5756e2 |
#include <inttypes.h>
|
|
Packit |
5756e2 |
#include <stdbool.h>
|
|
Packit |
5756e2 |
#include <stdlib.h>
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
typedef struct NAcd NAcd;
|
|
Packit |
5756e2 |
typedef struct NAcdConfig NAcdConfig;
|
|
Packit |
5756e2 |
typedef struct NAcdEvent NAcdEvent;
|
|
Packit |
5756e2 |
typedef struct NAcdProbe NAcdProbe;
|
|
Packit |
5756e2 |
typedef struct NAcdProbeConfig NAcdProbeConfig;
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#define N_ACD_TIMEOUT_RFC5227 (UINT64_C(9000))
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
enum {
|
|
Packit |
5756e2 |
_N_ACD_E_SUCCESS,
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
N_ACD_E_PREEMPTED,
|
|
Packit |
5756e2 |
N_ACD_E_INVALID_ARGUMENT,
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
_N_ACD_E_N,
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
enum {
|
|
Packit |
5756e2 |
N_ACD_TRANSPORT_ETHERNET,
|
|
Packit |
5756e2 |
_N_ACD_TRANSPORT_N,
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
enum {
|
|
Packit |
5756e2 |
N_ACD_EVENT_READY,
|
|
Packit |
5756e2 |
N_ACD_EVENT_USED,
|
|
Packit |
5756e2 |
N_ACD_EVENT_DEFENDED,
|
|
Packit |
5756e2 |
N_ACD_EVENT_CONFLICT,
|
|
Packit |
5756e2 |
N_ACD_EVENT_DOWN,
|
|
Packit |
5756e2 |
_N_ACD_EVENT_N,
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
enum {
|
|
Packit |
5756e2 |
N_ACD_DEFEND_NEVER,
|
|
Packit |
5756e2 |
N_ACD_DEFEND_ONCE,
|
|
Packit |
5756e2 |
N_ACD_DEFEND_ALWAYS,
|
|
Packit |
5756e2 |
_N_ACD_DEFEND_N,
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
struct NAcdEvent {
|
|
Packit |
5756e2 |
unsigned int event;
|
|
Packit |
5756e2 |
union {
|
|
Packit |
5756e2 |
struct {
|
|
Packit |
5756e2 |
NAcdProbe *probe;
|
|
Packit |
5756e2 |
} ready;
|
|
Packit |
5756e2 |
struct {
|
|
Packit |
5756e2 |
} down;
|
|
Packit |
5756e2 |
struct {
|
|
Packit |
5756e2 |
NAcdProbe *probe;
|
|
Packit |
5756e2 |
uint8_t *sender;
|
|
Packit |
5756e2 |
size_t n_sender;
|
|
Packit |
5756e2 |
} used, defended, conflict;
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
};
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/* configs */
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
int n_acd_config_new(NAcdConfig **configp);
|
|
Packit |
5756e2 |
NAcdConfig *n_acd_config_free(NAcdConfig *config);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
void n_acd_config_set_ifindex(NAcdConfig *config, int ifindex);
|
|
Packit |
5756e2 |
void n_acd_config_set_transport(NAcdConfig *config, unsigned int transport);
|
|
Packit |
5756e2 |
void n_acd_config_set_mac(NAcdConfig *config, const uint8_t *mac, size_t n_mac);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
int n_acd_probe_config_new(NAcdProbeConfig **configp);
|
|
Packit |
5756e2 |
NAcdProbeConfig *n_acd_probe_config_free(NAcdProbeConfig *config);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
void n_acd_probe_config_set_ip(NAcdProbeConfig *config, struct in_addr ip);
|
|
Packit |
5756e2 |
void n_acd_probe_config_set_timeout(NAcdProbeConfig *config, uint64_t msecs);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/* contexts */
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
int n_acd_new(NAcd **acdp, NAcdConfig *config);
|
|
Packit |
5756e2 |
NAcd *n_acd_ref(NAcd *acd);
|
|
Packit |
5756e2 |
NAcd *n_acd_unref(NAcd *acd);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
void n_acd_get_fd(NAcd *acd, int *fdp);
|
|
Packit |
5756e2 |
int n_acd_dispatch(NAcd *acd);
|
|
Packit |
5756e2 |
int n_acd_pop_event(NAcd *acd, NAcdEvent **eventp);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
int n_acd_probe(NAcd *acd, NAcdProbe **probep, NAcdProbeConfig *config);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/* probes */
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
NAcdProbe *n_acd_probe_free(NAcdProbe *probe);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
void n_acd_probe_set_userdata(NAcdProbe *probe, void *userdata);
|
|
Packit |
5756e2 |
void n_acd_probe_get_userdata(NAcdProbe *probe, void **userdatap);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
int n_acd_probe_announce(NAcdProbe *probe, unsigned int defend);
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
/* inline helpers */
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_config_freep(NAcdConfig **config) {
|
|
Packit |
5756e2 |
if (*config)
|
|
Packit |
5756e2 |
n_acd_config_free(*config);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_config_freev(NAcdConfig *config) {
|
|
Packit |
5756e2 |
n_acd_config_free(config);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_probe_config_freep(NAcdProbeConfig **config) {
|
|
Packit |
5756e2 |
if (*config)
|
|
Packit |
5756e2 |
n_acd_probe_config_free(*config);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_probe_config_freev(NAcdProbeConfig *config) {
|
|
Packit |
5756e2 |
n_acd_probe_config_free(config);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_unrefp(NAcd **acd) {
|
|
Packit |
5756e2 |
if (*acd)
|
|
Packit |
5756e2 |
n_acd_unref(*acd);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_unrefv(NAcd *acd) {
|
|
Packit |
5756e2 |
n_acd_unref(acd);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_probe_freep(NAcdProbe **probe) {
|
|
Packit |
5756e2 |
if (*probe)
|
|
Packit |
5756e2 |
n_acd_probe_free(*probe);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
static inline void n_acd_probe_freev(NAcdProbe *probe) {
|
|
Packit |
5756e2 |
n_acd_probe_free(probe);
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
|
|
Packit |
5756e2 |
#ifdef __cplusplus
|
|
Packit |
5756e2 |
}
|
|
Packit |
5756e2 |
#endif
|