summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Šimerda <psimerda@redhat.com>2013-01-23 10:18:59 +0100
committerPavel Šimerda <psimerda@redhat.com>2013-01-24 19:47:53 +0100
commit663859c1808c2405fd7e4c780190fe938c775f21 (patch)
tree78cbacf93ea6d5d0446c73efc0e128340d78d480
parent418a42897559823164e448edc5f1aeaacc16a422 (diff)
downloadNetworkManager-663859c1808c2405fd7e4c780190fe938c775f21.tar.gz
build: drop libnl 1.x and 2.x support, require libnl >= 3.2.7
-rw-r--r--configure.ac43
-rw-r--r--m4/libnl-check.m462
-rw-r--r--src/nm-netlink-compat.c152
-rw-r--r--src/nm-netlink-compat.h231
-rw-r--r--src/nm-netlink-monitor.c2
-rw-r--r--src/nm-system.c7
-rw-r--r--src/wifi/wifi-utils-nl80211.c4
7 files changed, 11 insertions, 490 deletions
diff --git a/configure.ac b/configure.ac
index 51582917a6..5366f27b1e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -320,46 +320,11 @@ AM_CONDITIONAL(SUSPEND_RESUME_UPOWER, test "x$with_suspend_resume" = "xupower")
AM_CONDITIONAL(SUSPEND_RESUME_SYSTEMD, test "x$with_suspend_resume" = "xsystemd")
# libnl support for the linux platform
-AC_ARG_WITH(libnl, AS_HELP_STRING([--with-libnl=1|2|3], [Select libnl version (default: latest available)]))
-# default to "yes"
-AS_IF([test -z "$with_libnl"], with_libnl=yes)
-# test for various libnl versions
-if test "$with_libnl" = "yes" -o "$with_libnl" = "3"; then
- PKG_CHECK_MODULES(LIBNL3, libnl-3.0 libnl-route-3.0 libnl-genl-3.0,
- [with_libnl=3], [test "$with_libnl" = "3" && with_libnl=no])
- AS_IF([test "$with_libnl" = "no"],
- AC_MSG_ERROR([libnl 3.x could not be found]))
-fi
-if test "$with_libnl" = "yes" -o "$with_libnl" = "2"; then
- PKG_CHECK_MODULES(LIBNL2, libnl-2.0,
- [with_libnl=2], [test "$with_libnl" = "2" && with_libnl=no])
- AS_IF([test "$with_libnl" = "no"],
- AC_MSG_ERROR([libnl 2.x could not be found]))
-fi
-if test "$with_libnl" = "yes" -o "$with_libnl" = "1"; then
- PKG_CHECK_MODULES(LIBNL1, libnl-1 >= 1.0-pre8,
- [with_libnl=1], [test "$with_libnl" = "1" && with_libnl=no])
- AS_IF([test "$with_libnl" = "no"],
- AC_MSG_ERROR([libnl 1.x could not be found]))
-fi
-if test "$with_libnl" = "yes"; then
- AC_MSG_ERROR([libnl library could not be found])
- with_libnl=no
-fi
-if ! echo "$with_libnl" | grep -q "^[[1-3]]$"; then
- AC_MSG_ERROR([unsupported libnl version: $with_libnl])
-fi
-# add variables, conditionals and defines
-if test "$with_libnl" != "no"; then
- AC_DEFINE_UNQUOTED(HAVE_LIBNL, $with_libnl, [libnl version])
- AC_SUBST(LIBNL_CFLAGS, "$LIBNL3_CFLAGS$LIBNL2_CFLAGS$LIBNL1_CFLAGS")
- AC_SUBST(LIBNL_LIBS, "$LIBNL3_LIBS$LIBNL2_LIBS$LIBNL1_LIBS")
-fi
-# additional tests
-if test "with_libnl" = "1"; then
- NM_LIBNL_CHECK
-fi
+PKG_CHECK_MODULES(LIBNL, libnl-3.0 >= 3.2.7 libnl-route-3.0 libnl-genl-3.0)
+AC_SUBST(LIBNL_CFLAGS)
+AC_SUBST(LIBNL_LIBS)
+# uuid library
PKG_CHECK_MODULES(UUID, uuid)
AC_SUBST(UUID_CFLAGS)
AC_SUBST(UUID_LIBS)
diff --git a/m4/libnl-check.m4 b/m4/libnl-check.m4
deleted file mode 100644
index 8eef576f0e..0000000000
--- a/m4/libnl-check.m4
+++ /dev/null
@@ -1,62 +0,0 @@
-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([AC_LANG_PROGRAM([[
-#include <stdio.h>
-#include <netlink/route/addr.h>
-#include <netlink/object-api.h>
-]],
-[[
- 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
-])
diff --git a/src/nm-netlink-compat.c b/src/nm-netlink-compat.c
index 68ee12159f..eac3faf7f7 100644
--- a/src/nm-netlink-compat.c
+++ b/src/nm-netlink-compat.c
@@ -29,8 +29,7 @@
#include "nm-logging.h"
#include "nm-netlink-compat.h"
-#if HAVE_LIBNL != 1
-struct rtnl_nexthop *
+static struct rtnl_nexthop *
nm_netlink_get_nh (struct rtnl_route * route)
{
int hops;
@@ -91,152 +90,3 @@ rtnl_route_get_dst_len(struct rtnl_route * rtnlroute)
dst = rtnl_route_get_dst(rtnlroute);
return nl_addr_get_prefixlen(dst);
}
-#endif
-
-#if HAVE_LIBNL == 1
-int
-nl_compat_error (int err)
-{
- err = abs (err);
-
- if (err == EEXIST)
- err = NLE_EXIST;
- else if (err == ENOENT || err == ESRCH)
- err = NLE_OBJ_NOTFOUND;
- else if (err == ERANGE)
- err = NLE_RANGE;
-
- return -err;
-}
-
-int
-rtnl_link_vlan_get_id (struct rtnl_link *l)
-{
- int fd;
- struct vlan_ioctl_args if_request;
- char *if_name = NULL;
-
- memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
-
- if ((if_name = rtnl_link_get_name (l)) == NULL)
- return -1;
-
- g_strlcpy (if_request.device1, if_name, sizeof (if_request.device1));
-
- if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
- return -1;
- }
-
- if_request.cmd = GET_VLAN_VID_CMD;
- if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't get vlan id for %s.", if_name);
- goto err_out;
- }
-
- close(fd);
- return if_request.u.VID;
-err_out:
- close(fd);
- return -1;
-}
-
-int
-rtnl_link_vlan_set_flags (struct rtnl_link *l, unsigned int flags)
-{
- int fd;
- struct vlan_ioctl_args if_request;
- char *if_name = NULL;
-
-
- if ((if_name = rtnl_link_get_name (l)) == NULL)
- return -1;
-
- if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
- return -1;
- }
-
- memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
- g_strlcpy (if_request.device1, if_name, sizeof (if_request.device1));
- if_request.cmd = SET_VLAN_FLAG_CMD;
- if_request.u.flag = flags;
-
- if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't set flag in device %s.", if_name);
- goto err_out;
- }
-
- close(fd);
- return 0;
-err_out:
- close(fd);
- return -1;
-}
-
-int
-rtnl_link_vlan_set_ingress_map (struct rtnl_link *l, int from, uint32_t to)
-{
- int fd;
- struct vlan_ioctl_args if_request;
- char *if_name = NULL;
-
- if ((if_name = rtnl_link_get_name (l)) == NULL)
- return -1;
-
- if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
- return -1;
- }
-
- memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
- g_strlcpy (if_request.device1, if_name, sizeof (if_request.device1));
- if_request.cmd = SET_VLAN_INGRESS_PRIORITY_CMD;
- if_request.u.skb_priority = from;
- if_request.vlan_qos = to;
-
- if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't set ingress map on device %s.", if_name);
- goto err_out;
- }
-
- close(fd);
- return 0;
-err_out:
- close(fd);
- return -1;
-}
-
-int
-rtnl_link_vlan_set_egress_map (struct rtnl_link *l, int from, uint32_t to)
-{
- int fd;
- struct vlan_ioctl_args if_request;
- char *if_name = NULL;
-
- if ((if_name = rtnl_link_get_name (l)) == NULL)
- return -1;
-
- if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
- return -1;
- }
-
- memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
- g_strlcpy (if_request.device1, if_name, sizeof (if_request.device1));
- if_request.cmd = SET_VLAN_EGRESS_PRIORITY_CMD;
- if_request.u.skb_priority = from;
- if_request.vlan_qos = to;
-
- if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
- nm_log_err (LOGD_DEVICE, "couldn't set egress map on device %s.", if_name);
- goto err_out;
- }
-
- close(fd);
- return 0;
-err_out:
- close(fd);
- return -1;
-}
-#endif
diff --git a/src/nm-netlink-compat.h b/src/nm-netlink-compat.h
index 80df096730..57dffcd078 100644
--- a/src/nm-netlink-compat.h
+++ b/src/nm-netlink-compat.h
@@ -30,7 +30,6 @@
#include <netlink/route/route.h>
#include <netlink/route/addr.h>
-
#include <netlink/netlink.h>
#include <netlink/cache.h>
#include <netlink/utils.h>
@@ -42,240 +41,12 @@
#include <config.h>
-/* libnl-1 API compatibility for libnl-2/3*/
-#if HAVE_LIBNL != 1
+/* libnl-1 API compatibility for libnl-3 */
-struct rtnl_nexthop * nm_netlink_get_nh(struct rtnl_route *);
int rtnl_route_get_oif(struct rtnl_route *);
int rtnl_route_set_oif(struct rtnl_route *, int);
int rtnl_route_set_gateway(struct rtnl_route *, struct nl_addr *);
int rtnl_route_get_dst_len(struct rtnl_route *);
struct nl_addr * rtnl_route_get_gateway(struct rtnl_route *);
-#endif
-
-/* libnl-2 API compatibility for libnl-3 */
-#if HAVE_LIBNL == 3
-static inline int
-__rtnl_link_alloc_cache (struct nl_sock *h, struct nl_cache **cache)
-{
- return rtnl_link_alloc_cache (h, AF_UNSPEC, cache);
-}
-#define rtnl_link_alloc_cache __rtnl_link_alloc_cache
-#endif
-
-
-/* libnl-2.0 compat functions */
-#if HAVE_LIBNL == 2
-
-/* functions with similar prototypes */
-#define nlmsg_datalen nlmsg_len
-#endif
-
-
-/* libnl-1.0 compat functions */
-#if HAVE_LIBNL == 1
-
-#define nl_sock nl_handle
-
-/* libnl-1.0 functions with similar prototypes */
-#define nl_socket_alloc nl_handle_alloc
-#define nl_socket_alloc_cb nl_handle_alloc_cb
-#define nl_socket_free nl_handle_destroy
-#define nl_socket_set_passcred nl_set_passcred
-#define nl_socket_disable_seq_check nl_disable_sequence_check
-#define rtnl_route_set_priority rtnl_route_set_prio
-#define nlmsg_datalen nlmsg_len
-
-/* auxiliary functions */
-int nl_compat_error (int);
-
-/* libnl-1.0 functions with modified prototypes in libnl-2/3*/
-static inline const char *
-__nl_geterror (int err)
-{
- /* err is set, can be parsed */
- return nl_geterror ();
-}
-#define nl_geterror __nl_geterror
-
-static inline int
-__rtnl_addr_alloc_cache (struct nl_sock *h, struct nl_cache **cache)
-{
- g_return_val_if_fail (cache != NULL, -EINVAL);
-
- *cache = rtnl_addr_alloc_cache (h);
- return *cache ? 0 : -ENOMEM;
-}
-#define rtnl_addr_alloc_cache __rtnl_addr_alloc_cache
-
-static inline int
-__rtnl_route_alloc_cache (struct nl_sock *h, int family, int flags, struct nl_cache **cache)
-{
- g_return_val_if_fail (cache != NULL, -EINVAL);
-
- *cache = rtnl_route_alloc_cache (h);
- return *cache ? 0 : -ENOMEM;
-}
-#define rtnl_route_alloc_cache __rtnl_route_alloc_cache
-
-static inline int
-__rtnl_link_alloc_cache (struct nl_sock *h, struct nl_cache **cache)
-{
- g_return_val_if_fail (cache != NULL, -EINVAL);
-
- *cache = rtnl_link_alloc_cache (h);
- return *cache ? 0 : -ENOMEM;
-}
-#define rtnl_link_alloc_cache __rtnl_link_alloc_cache
-
-static inline int
-__rtnl_route_get_metric (struct rtnl_route *route, int metric, unsigned int *value)
-{
- g_return_val_if_fail (value != NULL, -EINVAL);
-
- *value = rtnl_route_get_metric (route, metric);
- return 0;
-}
-#define rtnl_route_get_metric __rtnl_route_get_metric
-
-static inline int
-__rtnl_addr_add (struct nl_sock *h, struct rtnl_addr *addr, int flags)
-{
- return nl_compat_error (rtnl_addr_add (h, addr, flags));
-}
-#define rtnl_addr_add __rtnl_addr_add
-
-static inline int
-__rtnl_route_add (struct nl_sock *sk, struct rtnl_route *route, int flags)
-{
- return nl_compat_error (rtnl_route_add (sk, route, flags));
-}
-#define rtnl_route_add __rtnl_route_add
-
-static inline int
-rtnl_route_delete (struct nl_sock *h, struct rtnl_route *route, int flags)
-{
- return nl_compat_error (rtnl_route_del (h, route, flags));
-}
-#define rtnl_route_del rtnl_route_delete
-
-static inline int
-__rtnl_link_change (struct nl_sock *h, struct rtnl_link *old, struct rtnl_link *tmpl, int flags)
-{
- return nl_compat_error (rtnl_link_change (h, old, tmpl,flags));
-}
-#define rtnl_link_change __rtnl_link_change
-
-static inline int
-__nl_cache_include (struct nl_cache *cache, struct nl_object *obj, change_func_t cb, void *data)
-{
- return nl_cache_include (cache, obj, cb);
-}
-#define nl_cache_include __nl_cache_include
-
-#define NLE_SUCCESS 0
-#define NLE_FAILURE 1
-#define NLE_INTR 2
-#define NLE_BAD_SOCK 3
-#define NLE_AGAIN 4
-#define NLE_NOMEM 5
-#define NLE_EXIST 6
-#define NLE_INVAL 7
-#define NLE_RANGE 8
-#define NLE_MSGSIZE 9
-#define NLE_OPNOTSUPP 10
-#define NLE_AF_NOSUPPORT 11
-#define NLE_OBJ_NOTFOUND 12
-#define NLE_NOATTR 13
-#define NLE_MISSING_ATTR 14
-#define NLE_AF_MISMATCH 15
-#define NLE_SEQ_MISMATCH 16
-#define NLE_MSG_OVERFLOW 17
-#define NLE_MSG_TRUNC 18
-#define NLE_NOADDR 19
-#define NLE_SRCRT_NOSUPPORT 20
-#define NLE_MSG_TOOSHORT 21
-#define NLE_MSGTYPE_NOSUPPORT 22
-#define NLE_OBJ_MISMATCH 23
-#define NLE_NOCACHE 24
-#define NLE_BUSY 25
-#define NLE_PROTO_MISMATCH 26
-#define NLE_NOACCESS 27
-#define NLE_PERM 28
-#define NLE_PKTLOC_FILE 29
-
-#endif
-
-/* Stuff that only libnl3 has */
-#if HAVE_LIBNL == 1 || HAVE_LIBNL == 2
-
-static inline int
-rtnl_link_bond_add (struct nl_sock *h, const char *name, void *data)
-{
- /* Bonding only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-static inline int
-rtnl_link_get_kernel (struct nl_sock *h, int f, const char *name, struct rtnl_link **out_link)
-{
- /* Bonding only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-static inline char *
-rtnl_link_get_type (struct rtnl_link *rtnl_link)
-{
- /* Bonding only in libnl3 */
- return NULL;
-}
-
-static inline int
-rtnl_link_bond_enslave_ifindex (struct nl_sock *h, int master_ifidx, int slave_ifidx)
-{
- /* Bonding only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-static inline int
-rtnl_link_bond_release_ifindex (struct nl_sock *h, int slave_ifidx)
-{
- /* Bonding only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-static inline int
-rtnl_link_vlan_set_id (struct rtnl_link *l, int id)
-{
- /* VLAN only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-int rtnl_link_vlan_get_id (struct rtnl_link *l);
-int rtnl_link_vlan_set_flags (struct rtnl_link *l, unsigned int flags);
-int rtnl_link_vlan_set_ingress_map (struct rtnl_link *l, int from, uint32_t to);
-int rtnl_link_vlan_set_egress_map (struct rtnl_link *l, int from, uint32_t to);
-
-static inline int
-rtnl_link_set_type (struct rtnl_link *l, const char *type)
-{
- /* Operation only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-static inline int
-rtnl_link_add (struct nl_sock *sk, struct rtnl_link *l, int flags)
-{
- /* Operation only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-
-static inline int
-rtnl_link_delete(struct nl_sock *sk, const struct rtnl_link *l)
-{
- /* Operation only in libnl3 */
- return -NLE_OPNOTSUPP;
-}
-#endif
#endif /* NM_NETLINK_COMPAT_H */
diff --git a/src/nm-netlink-monitor.c b/src/nm-netlink-monitor.c
index 84f9386638..5bbf5002c0 100644
--- a/src/nm-netlink-monitor.c
+++ b/src/nm-netlink-monitor.c
@@ -408,7 +408,7 @@ sync_connection_setup (NMNetlinkMonitor *self, GError **error)
nl_cache_free (addr_cache);
#endif
- err = rtnl_link_alloc_cache (priv->nlh_sync, &priv->link_cache);
+ err = rtnl_link_alloc_cache (priv->nlh_sync, AF_UNSPEC, &priv->link_cache);
if (err < 0) {
g_set_error (error, NM_NETLINK_MONITOR_ERROR,
NM_NETLINK_MONITOR_ERROR_NETLINK_ALLOC_LINK_CACHE,
diff --git a/src/nm-system.c b/src/nm-system.c
index 74cdf66fbb..7e2f8acf22 100644
--- a/src/nm-system.c
+++ b/src/nm-system.c
@@ -60,11 +60,8 @@
#include <netlink/netlink.h>
#include <netlink/utils.h>
#include <netlink/route/link.h>
-
-#if HAVE_LIBNL == 3
#include <netlink/route/link/bonding.h>
#include <netlink/route/link/vlan.h>
-#endif
#if !HAVE_VLAN_FLAG_LOOSE_BINDING
/* Older kernels don't have this flag */
@@ -1927,7 +1924,7 @@ nm_system_get_iface_vlan_info (int ifindex,
if (!nlh)
return FALSE;
- ret = rtnl_link_alloc_cache (nlh, &cache);
+ ret = rtnl_link_alloc_cache (nlh, AF_UNSPEC, &cache);
g_return_val_if_fail (ret == 0, FALSE);
g_return_val_if_fail (cache != NULL, FALSE);
@@ -2304,7 +2301,7 @@ nm_system_del_vlan_iface (const char *iface)
nlh = nm_netlink_get_default_handle ();
g_return_val_if_fail (nlh != NULL, FALSE);
- ret = rtnl_link_alloc_cache (nlh, &cache);
+ ret = rtnl_link_alloc_cache (nlh, AF_UNSPEC, &cache);
g_return_val_if_fail (ret == 0, FALSE);
g_return_val_if_fail (cache != NULL, FALSE);
diff --git a/src/wifi/wifi-utils-nl80211.c b/src/wifi/wifi-utils-nl80211.c
index 62ec6c2be5..5a7103ee3a 100644
--- a/src/wifi/wifi-utils-nl80211.c
+++ b/src/wifi/wifi-utils-nl80211.c
@@ -33,6 +33,7 @@
#include <netlink/genl/genl.h>
#include <netlink/genl/family.h>
#include <netlink/genl/ctrl.h>
+#include <netlink/route/link.h>
#include <linux/nl80211.h>
@@ -40,7 +41,6 @@
#include "wifi-utils-nl80211.h"
#include "nm-logging.h"
#include "nm-utils.h"
-#include "nm-netlink-compat.h"
typedef struct {
WifiData parent;
@@ -813,7 +813,7 @@ iface_to_index (struct nl_sock *nl_sock, const char *iface)
int err, ifindex;
/* name to index */
- err = rtnl_link_alloc_cache (nl_sock, &link_cache);
+ err = rtnl_link_alloc_cache (nl_sock, AF_UNSPEC, &link_cache);
if (err < 0) {
nm_log_warn (LOGD_HW, "failed to allocate link cache: (%d) %s",
err, nl_geterror (err));