diff options
author | Thomas Haller <thaller@redhat.com> | 2014-10-22 18:19:54 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-04-09 17:31:11 +0200 |
commit | 850af91f22a2419fecd3ff277406f790525d7ce5 (patch) | |
tree | 39dcb45e21b2f7419bd62147a8fc29b6708b607e | |
parent | ee64b8585b45fd91a8c16bac702f3797106f9b44 (diff) | |
download | NetworkManager-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.c | 181 |
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) { |