diff options
author | Dan Winship <danw@gnome.org> | 2009-08-24 10:10:46 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2009-08-26 14:37:17 -0400 |
commit | 67a5f31fc8232cf6f2b49373d3263db22a6383d5 (patch) | |
tree | 2f8baf106226dbcb8afadccc4cef6e60992b00a2 /m4 | |
parent | 58fcc8efe6a4724b9dc8e6718d4d2a20c7efd19f (diff) | |
download | NetworkManager-67a5f31fc8232cf6f2b49373d3263db22a6383d5.tar.gz |
Work around libnl address caching bug
rtnl_addr requires that all addresses have the "peer" attribute set in
order to be compared for equality, but this attribute is not normally
set. As a result, most addresses will not compare as equal even to
themselves, busting caching. We fix this for now by poking into the
guts of libnl if it is broken...
Diffstat (limited to 'm4')
-rw-r--r-- | m4/libnl-check.m4 | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/m4/libnl-check.m4 b/m4/libnl-check.m4 new file mode 100644 index 0000000000..f7d6d70715 --- /dev/null +++ b/m4/libnl-check.m4 @@ -0,0 +1,65 @@ +AC_DEFUN([NM_LIBNL_CHECK], [ + AC_MSG_CHECKING([for libnl address caching bug]) + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS $LIBNL_CFLAGS" + LDFLAGS="$LDFLAGS $LIBNL_LIBS" + AC_RUN_IFELSE([ +#include <stdio.h> +#include <netlink/route/addr.h> +#include <netlink/object-api.h> + +int +main (int argc, char **argv) +{ + struct nl_handle *nlh; + struct nl_cache *cache; + struct nl_object *obj; + + nlh = nl_handle_alloc (); + if (nl_connect (nlh, NETLINK_ROUTE) < 0) { + fprintf (stderr, "couldn't connect to netlink: %s", nl_geterror ()); + return 3; + } + + cache = rtnl_addr_alloc_cache (nlh); + if (!cache || nl_cache_nitems (cache) == 0) { + fprintf (stderr, "couldn't fill address cache: %s", nl_geterror ()); + return 3; + } + + obj = nl_cache_get_first (cache); + if (nl_object_identical (obj, obj)) + return 0; + + nl_cache_get_ops (cache)->co_obj_ops->oo_id_attrs &= ~0x80; + if (nl_object_identical (obj, obj)) + return 1; + else + return 2; +} +], libnl_bug=$?, libnl_bug=$?, libnl_bug=cross) + + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS" + + case $libnl_bug in + 0) AC_MSG_RESULT([no]) + ;; + + 1) AC_MSG_RESULT([yes, using workaround]) + AC_DEFINE(LIBNL_NEEDS_ADDR_CACHING_WORKAROUND, 1, [Define this to hack around buggy libnl rtnl_addr caching]) + ;; + + 2) AC_MSG_RESULT([yes, and workaround doesn't work]) + AC_MSG_ERROR([Installed libnl has broken address caching; please patch or upgrade]) + ;; + + cross) AC_MSG_RESULT([cross-compiling... assuming it works!]) + ;; + + *) AC_MSG_RESULT([?]) + AC_MSG_ERROR([libnl test program failed]) + ;; +esac +]) |