summary refs log tree commit diff
path: root/src/core/nm-l3-ipv4ll.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/nm-l3-ipv4ll.h')
-rw-r--r--src/core/nm-l3-ipv4ll.h118
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__ */