summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-10-22 18:19:54 +0200
committerThomas Haller <thaller@redhat.com>2015-04-09 17:31:11 +0200
commit850af91f22a2419fecd3ff277406f790525d7ce5 (patch)
tree39dcb45e21b2f7419bd62147a8fc29b6708b607e
parentee64b8585b45fd91a8c16bac702f3797106f9b44 (diff)
downloadNetworkManager-850af91f22a2419fecd3ff277406f790525d7ce5.tar.gz
platform/trivial: move code around so that libnl related stuff is together
Reorder some functions in nm-platform, so that we first have independent libnl wrappers/utils, then NMPlatform type definition, and then the rest.
-rw-r--r--src/platform/nm-linux-platform.c181
1 files changed, 91 insertions, 90 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 6d1ecf21f7..e29c31fd06 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -72,6 +72,10 @@
#define error(...) nm_log_err (LOGD_PLATFORM, __VA_ARGS__)
+/******************************************************************
+ * libnl unility functions and wrappers
+ ******************************************************************/
+
struct libnl_vtable
{
void *handle;
@@ -79,41 +83,6 @@ struct libnl_vtable
int (*f_nl_has_capability) (int capability);
};
-
-typedef struct {
- struct nl_sock *nlh;
- struct nl_sock *nlh_event;
- struct nl_cache *link_cache;
- struct nl_cache *address_cache;
- struct nl_cache *route_cache;
- GIOChannel *event_channel;
- guint event_id;
-
- GUdevClient *udev_client;
- GHashTable *udev_devices;
-
- GHashTable *wifi_data;
-
- int support_kernel_extended_ifa_flags;
- int support_user_ipv6ll;
-} NMLinuxPlatformPrivate;
-
-#define NM_LINUX_PLATFORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_LINUX_PLATFORM, NMLinuxPlatformPrivate))
-
-G_DEFINE_TYPE (NMLinuxPlatform, nm_linux_platform, NM_TYPE_PLATFORM)
-
-static const char *to_string_object (NMPlatform *platform, struct nl_object *obj);
-static gboolean _address_match (struct rtnl_addr *addr, int family, int ifindex);
-static gboolean _route_match (struct rtnl_route *rtnlroute, int family, int ifindex, gboolean include_proto_kernel);
-
-void
-nm_linux_platform_setup (void)
-{
- nm_platform_setup (NM_TYPE_LINUX_PLATFORM);
-}
-
-/******************************************************************/
-
static int
_nl_f_nl_has_capability (int capability)
{
@@ -149,57 +118,6 @@ _nl_has_capability (int capability)
return (_nl_get_vtable ()->f_nl_has_capability) (capability);
}
-/******************************************************************/
-
-static guint32
-_get_expiry (guint32 now_s, guint32 lifetime_s)
-{
- gint64 t = ((gint64) now_s) + ((gint64) lifetime_s);
-
- return MIN (t, NM_PLATFORM_LIFETIME_PERMANENT - 1);
-}
-
-/* The rtnl_addr object contains relative lifetimes @valid and @preferred
- * that count in seconds, starting from the moment when the kernel constructed
- * the netlink message.
- *
- * There is also a field rtnl_addr_last_update_time(), which is the absolute
- * time in 1/100th of a second of clock_gettime (CLOCK_MONOTONIC) when the address
- * was modified (wrapping every 497 days).
- * Immediately at the time when the address was last modified, #NOW and @last_update_time
- * are the same, so (only) in that case @valid and @preferred are anchored at @last_update_time.
- * However, this is not true in general. As time goes by, whenever kernel sends a new address
- * via netlink, the lifetimes keep counting down.
- *
- * As we cache the rtnl_addr object we must know the absolute expiries.
- * As a hack, modify the relative timestamps valid and preferred into absolute
- * timestamps of scale nm_utils_get_monotonic_timestamp_s().
- **/
-static void
-_rtnl_addr_hack_lifetimes_rel_to_abs (struct rtnl_addr *rtnladdr)
-{
- guint32 a_valid = rtnl_addr_get_valid_lifetime (rtnladdr);
- guint32 a_preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
- guint32 now;
-
- if (a_valid == NM_PLATFORM_LIFETIME_PERMANENT &&
- a_preferred == NM_PLATFORM_LIFETIME_PERMANENT)
- return;
-
- now = (guint32) nm_utils_get_monotonic_timestamp_s ();
-
- if (a_preferred > a_valid)
- a_preferred = a_valid;
-
- if (a_valid != NM_PLATFORM_LIFETIME_PERMANENT)
- rtnl_addr_set_valid_lifetime (rtnladdr, _get_expiry (now, a_valid));
- rtnl_addr_set_preferred_lifetime (rtnladdr, _get_expiry (now, a_preferred));
-}
-
-/******************************************************************/
-
-/* libnl library workarounds and additions */
-
/* Automatic deallocation of local variables */
#define auto_nl_cache __attribute__((cleanup(put_nl_cache)))
static void
@@ -237,8 +155,6 @@ put_nl_addr (void *ptr)
}
}
-/*******************************************************************/
-
/* wrap the libnl alloc functions and abort on out-of-memory*/
static struct nl_addr *
@@ -303,8 +219,6 @@ _nm_rtnl_route_nh_alloc (void)
return nexthop;
}
-/*******************************************************************/
-
/* rtnl_addr_set_prefixlen fails to update the nl_addr prefixlen */
static void
nm_rtnl_addr_set_prefixlen (struct rtnl_addr *rtnladdr, int plen)
@@ -319,6 +233,57 @@ nm_rtnl_addr_set_prefixlen (struct rtnl_addr *rtnladdr, int plen)
}
#define rtnl_addr_set_prefixlen nm_rtnl_addr_set_prefixlen
+/******************************************************************/
+
+static guint32
+_get_expiry (guint32 now_s, guint32 lifetime_s)
+{
+ gint64 t = ((gint64) now_s) + ((gint64) lifetime_s);
+
+ return MIN (t, NM_PLATFORM_LIFETIME_PERMANENT - 1);
+}
+
+/* The rtnl_addr object contains relative lifetimes @valid and @preferred
+ * that count in seconds, starting from the moment when the kernel constructed
+ * the netlink message.
+ *
+ * There is also a field rtnl_addr_last_update_time(), which is the absolute
+ * time in 1/100th of a second of clock_gettime (CLOCK_MONOTONIC) when the address
+ * was modified (wrapping every 497 days).
+ * Immediately at the time when the address was last modified, #NOW and @last_update_time
+ * are the same, so (only) in that case @valid and @preferred are anchored at @last_update_time.
+ * However, this is not true in general. As time goes by, whenever kernel sends a new address
+ * via netlink, the lifetimes keep counting down.
+ *
+ * As we cache the rtnl_addr object we must know the absolute expiries.
+ * As a hack, modify the relative timestamps valid and preferred into absolute
+ * timestamps of scale nm_utils_get_monotonic_timestamp_s().
+ **/
+static void
+_rtnl_addr_hack_lifetimes_rel_to_abs (struct rtnl_addr *rtnladdr)
+{
+ guint32 a_valid = rtnl_addr_get_valid_lifetime (rtnladdr);
+ guint32 a_preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
+ guint32 now;
+
+ if (a_valid == NM_PLATFORM_LIFETIME_PERMANENT &&
+ a_preferred == NM_PLATFORM_LIFETIME_PERMANENT)
+ return;
+
+ now = (guint32) nm_utils_get_monotonic_timestamp_s ();
+
+ if (a_preferred > a_valid)
+ a_preferred = a_valid;
+
+ if (a_valid != NM_PLATFORM_LIFETIME_PERMANENT)
+ rtnl_addr_set_valid_lifetime (rtnladdr, _get_expiry (now, a_valid));
+ rtnl_addr_set_preferred_lifetime (rtnladdr, _get_expiry (now, a_preferred));
+}
+
+/******************************************************************
+ * NMPlatform types and functions
+ ******************************************************************/
+
typedef enum {
OBJECT_TYPE_UNKNOWN,
OBJECT_TYPE_LINK,
@@ -330,6 +295,42 @@ typedef enum {
OBJECT_TYPE_MAX = __OBJECT_TYPE_LAST - 1,
} ObjectType;
+/******************************************************************/
+
+typedef struct {
+ struct nl_sock *nlh;
+ struct nl_sock *nlh_event;
+ struct nl_cache *link_cache;
+ struct nl_cache *address_cache;
+ struct nl_cache *route_cache;
+ GIOChannel *event_channel;
+ guint event_id;
+
+ GUdevClient *udev_client;
+ GHashTable *udev_devices;
+
+ GHashTable *wifi_data;
+
+ int support_kernel_extended_ifa_flags;
+ int support_user_ipv6ll;
+} NMLinuxPlatformPrivate;
+
+#define NM_LINUX_PLATFORM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_LINUX_PLATFORM, NMLinuxPlatformPrivate))
+
+G_DEFINE_TYPE (NMLinuxPlatform, nm_linux_platform, NM_TYPE_PLATFORM)
+
+static const char *to_string_object (NMPlatform *platform, struct nl_object *obj);
+static gboolean _address_match (struct rtnl_addr *addr, int family, int ifindex);
+static gboolean _route_match (struct rtnl_route *rtnlroute, int family, int ifindex, gboolean include_proto_kernel);
+
+void
+nm_linux_platform_setup (void)
+{
+ nm_platform_setup (NM_TYPE_LINUX_PLATFORM);
+}
+
+/******************************************************************/
+
static ObjectType
object_type_from_nl_object (const struct nl_object *object)
{