diff options
Diffstat (limited to 'src/core/nm-l3-ipv4ll.h')
| -rw-r--r-- | src/core/nm-l3-ipv4ll.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/core/nm-l3-ipv4ll.h b/src/core/nm-l3-ipv4ll.h new file mode 100644 index 00000000..b39762a8 --- /dev/null +++ b/src/core/nm-l3-ipv4ll.h @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#ifndef __NM_L3_IPV4LL_H__ +#define __NM_L3_IPV4LL_H__ + +#include "nm-l3cfg.h" + +/*****************************************************************************/ + +typedef enum _nm_packed { + NM_L3_IPV4LL_STATE_UNKNOWN, + NM_L3_IPV4LL_STATE_DISABLED, + NM_L3_IPV4LL_STATE_WAIT_FOR_LINK, + NM_L3_IPV4LL_STATE_EXTERNAL, + NM_L3_IPV4LL_STATE_PROBING, + NM_L3_IPV4LL_STATE_READY, + NM_L3_IPV4LL_STATE_DEFENDING, +} NML3IPv4LLState; + +const char *nm_l3_ipv4ll_state_to_string(NML3IPv4LLState val, char *buf, gsize len); + +static inline gboolean +nm_l3_ipv4ll_state_is_good(NML3IPv4LLState state) +{ + switch (state) { + case NM_L3_IPV4LL_STATE_UNKNOWN: + case NM_L3_IPV4LL_STATE_DISABLED: + case NM_L3_IPV4LL_STATE_WAIT_FOR_LINK: + case NM_L3_IPV4LL_STATE_PROBING: + return FALSE; + case NM_L3_IPV4LL_STATE_EXTERNAL: + case NM_L3_IPV4LL_STATE_READY: + case NM_L3_IPV4LL_STATE_DEFENDING: + return TRUE; + } + return nm_assert_unreachable_val(FALSE); +} + +/*****************************************************************************/ + +typedef struct _NML3IPv4LL NML3IPv4LL; + +static inline gboolean +NM_IS_L3_IPV4LL(const NML3IPv4LL *self) +{ + nm_assert(!self + || (NM_IS_L3CFG(*((NML3Cfg **) self)) + && (*((int *) (((char *) self) + sizeof(gpointer)))) > 0)); + return !!self; +} + +NML3IPv4LL *nm_l3_ipv4ll_new(NML3Cfg *self); + +NML3IPv4LL *nm_l3_ipv4ll_ref(NML3IPv4LL *self); +void nm_l3_ipv4ll_unref(NML3IPv4LL *self); + +NM_AUTO_DEFINE_FCN0(NML3IPv4LL *, _nm_auto_unref_l3ipv4ll, nm_l3_ipv4ll_unref); +#define nm_auto_unref_l3ipv4ll nm_auto(_nm_auto_unref_l3ipv4ll) + +/*****************************************************************************/ + +NML3Cfg *nm_l3_ipv4ll_get_l3cfg(NML3IPv4LL *self); + +int nm_l3_ipv4ll_get_ifindex(NML3IPv4LL *self); + +NMPlatform *nm_l3_ipv4ll_get_platform(NML3IPv4LL *self); + +/*****************************************************************************/ + +/* By default, NML3IPv4LL is disabled. You also need to register (enable) it. + * The intent of this API is that multiple users can enable/register their own + * settings, and NML3IPv4LL will mediate the different requests. + * + * Also, by setting timeout_msec to zero, NML3IPv4LL is disabled again (zero + * wins over all timeouts). This is useful if you do DHCP and IPv4LL on the + * same interface. You possibly want to disable IPv4LL if you have a valid + * DHCP lease. By registering a timeout_msec to zero, you can disable IPv4LL. + * + * Also, a registration keeps the NML3IPv4LL instance alive (it also takes + * a reference). */ + +typedef struct _NML3IPv4LLRegistration NML3IPv4LLRegistration; + +NML3IPv4LLRegistration *nm_l3_ipv4ll_register_new(NML3IPv4LL *self, guint timeout_msec); + +NML3IPv4LLRegistration *nm_l3_ipv4ll_register_update(NML3IPv4LLRegistration *reg, + guint timeout_msec); + +NML3IPv4LLRegistration *nm_l3_ipv4ll_register_remove(NML3IPv4LLRegistration *reg); + +NM_AUTO_DEFINE_FCN0(NML3IPv4LLRegistration *, + _nm_auto_remove_l3ipv4ll_registration, + nm_l3_ipv4ll_register_remove); +#define nm_auto_remove_l3ipv4ll_registration nm_auto(_nm_auto_remove_l3ipv4ll_registration) + +static inline NML3IPv4LL * +nm_l3_ipv4ll_register_get_instance(NML3IPv4LLRegistration *reg) +{ + NML3IPv4LL *ipv4ll; + + if (!reg) + return NULL; + ipv4ll = *((NML3IPv4LL **) reg); + nm_assert(NM_IS_L3_IPV4LL(ipv4ll)); + return ipv4ll; +} + +/*****************************************************************************/ + +NML3IPv4LLState nm_l3_ipv4ll_get_state(NML3IPv4LL *self); + +gboolean nm_l3_ipv4ll_is_timed_out(NML3IPv4LL *self); + +in_addr_t nm_l3_ipv4ll_get_addr(NML3IPv4LL *self); + +const NML3ConfigData *nm_l3_ipv4ll_get_l3cd(NML3IPv4LL *self); + +#endif /* __NM_L3_IPV4LL_H__ */ |