[OpenWrt-Devel] [PATCH] libnl-tiny: move source code into separate Git repository

Petr Štetiar ynezz at true.cz
Mon Oct 7 10:28:33 EDT 2019


In order to make the source code usable and testable separately out of
buildroot.

Signed-off-by: Petr Štetiar <ynezz at true.cz>
---

tl;dr this is just a first step, having more in the pipeline[0]

I'm working on a proof-of-concept CI suite[1] based on GitLab (but it could be
used on anything which supports Docker) and which could be hopefully re-used
for CI testing of all OpenWrt C language based projects without much hassle,
currently it boils down to about 3-7 lines of YAML code in .gitlab-ci.yml
file[2].

So far I've added two CI compile tests[3], one of them is `ci-sdk-oot-build`
which is building the source code out of the tree[4] with the provided SDK for
a (randomly selected) list of platforms ath79, imx6, malta_be and
mvebu_cortexa53 in order to cover different CPUs, endianess, register widths
etc. This tests works fine with the source code in the buildroot.

The 2nd test is a "frankenstein" one[5] called `ci-native-checks`, which is
compile testing the source code natively on x86/64 with gcc-{7,8,9},clang-9
and then with scan-build and cppcheck static analyzers. This doesn't work
currently for me with odhcpd as it depends on libnl-tiny, and in order to
provide libnl-tiny one would need to check out complete OpenWrt tree in order
to get its source code and build it.

To be clear, getting the source code is a no brainer for me, I could solve it
somehow even with the buildroot (putting aside the waste of resources), but
running the CI test suite on libnl-tiny itself uncovers some issues[6] and I
think, that it would simply make sense to allow running of those test easily
for anyone (clone the repo on GitLab; push; profit) in the future as well.

0. https://gitlab.com/ynezz/openwrt-libnl-tiny/commits/wip
1. https://gitlab.com/ynezz/gitlab-evaluation/blob/wip/gitlab-ci/README.md
2. https://gitlab.com/ynezz/openwrt-libnl-tiny/blob/wip/.gitlab-ci.yml
3. https://gitlab.com/ynezz/gitlab-evaluation/blob/wip/gitlab-ci/gitlab-ci-pipeline.yml
4. https://gitlab.com/ynezz/gitlab-evaluation/blob/wip/gitlab-ci/sdk-build.mk#L45
5. https://gitlab.com/ynezz/gitlab-evaluation/blob/wip/gitlab-ci/native-build.mk
6. https://ynezz.gitlab.io/-/openwrt-libnl-tiny/-/jobs/313680815/artifacts/build/scan/2019-10-07-122715-143-1/index.html

 package/libs/libnl-tiny/Makefile              |  19 +-
 package/libs/libnl-tiny/files/libnl-tiny.pc   |  10 -
 package/libs/libnl-tiny/src/Makefile          |  17 -
 package/libs/libnl-tiny/src/attr.c            | 668 ----------------
 package/libs/libnl-tiny/src/cache.c           | 376 ---------
 package/libs/libnl-tiny/src/cache_mngt.c      | 131 ----
 package/libs/libnl-tiny/src/error.c           | 116 ---
 package/libs/libnl-tiny/src/genl.c            | 268 -------
 package/libs/libnl-tiny/src/genl_ctrl.c       | 380 ---------
 package/libs/libnl-tiny/src/genl_family.c     | 169 ----
 package/libs/libnl-tiny/src/genl_mngt.c       | 193 -----
 package/libs/libnl-tiny/src/handlers.c        | 162 ----
 .../libnl-tiny/src/include/netlink-generic.h  |  20 -
 .../libnl-tiny/src/include/netlink-local.h    | 160 ----
 .../libnl-tiny/src/include/netlink-types.h    |  88 ---
 .../libnl-tiny/src/include/netlink/addr.h     |  69 --
 .../libnl-tiny/src/include/netlink/attr.h     | 726 ------------------
 .../src/include/netlink/cache-api.h           | 199 -----
 .../libnl-tiny/src/include/netlink/cache.h    | 128 ---
 .../libnl-tiny/src/include/netlink/data.h     |  41 -
 .../libnl-tiny/src/include/netlink/errno.h    |  64 --
 .../src/include/netlink/genl/ctrl.h           |  40 -
 .../src/include/netlink/genl/family.h         | 134 ----
 .../src/include/netlink/genl/genl.h           |  47 --
 .../src/include/netlink/genl/mngt.h           |  87 ---
 .../libnl-tiny/src/include/netlink/handlers.h | 231 ------
 .../libnl-tiny/src/include/netlink/list.h     |  88 ---
 .../libs/libnl-tiny/src/include/netlink/msg.h | 308 --------
 .../src/include/netlink/netlink-compat.h      |  50 --
 .../src/include/netlink/netlink-kernel.h      | 196 -----
 .../libnl-tiny/src/include/netlink/netlink.h  |  82 --
 .../src/include/netlink/object-api.h          | 331 --------
 .../libnl-tiny/src/include/netlink/object.h   | 164 ----
 .../libnl-tiny/src/include/netlink/socket.h   | 231 ------
 .../libnl-tiny/src/include/netlink/types.h    | 121 ---
 .../libnl-tiny/src/include/netlink/utils.h    |  78 --
 .../libnl-tiny/src/include/netlink/version.h  |  18 -
 package/libs/libnl-tiny/src/include/unl.h     |  47 --
 package/libs/libnl-tiny/src/msg.c             | 561 --------------
 package/libs/libnl-tiny/src/nl.c              | 720 -----------------
 package/libs/libnl-tiny/src/object.c          | 147 ----
 package/libs/libnl-tiny/src/socket.c          | 406 ----------
 package/libs/libnl-tiny/src/unl.c             | 287 -------
 43 files changed, 12 insertions(+), 8366 deletions(-)
 delete mode 100644 package/libs/libnl-tiny/files/libnl-tiny.pc
 delete mode 100644 package/libs/libnl-tiny/src/Makefile
 delete mode 100644 package/libs/libnl-tiny/src/attr.c
 delete mode 100644 package/libs/libnl-tiny/src/cache.c
 delete mode 100644 package/libs/libnl-tiny/src/cache_mngt.c
 delete mode 100644 package/libs/libnl-tiny/src/error.c
 delete mode 100644 package/libs/libnl-tiny/src/genl.c
 delete mode 100644 package/libs/libnl-tiny/src/genl_ctrl.c
 delete mode 100644 package/libs/libnl-tiny/src/genl_family.c
 delete mode 100644 package/libs/libnl-tiny/src/genl_mngt.c
 delete mode 100644 package/libs/libnl-tiny/src/handlers.c
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink-generic.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink-local.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink-types.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/addr.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/attr.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/cache-api.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/cache.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/data.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/errno.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/genl/ctrl.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/genl/family.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/genl/genl.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/genl/mngt.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/handlers.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/list.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/msg.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/netlink-compat.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/netlink-kernel.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/netlink.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/object-api.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/object.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/socket.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/types.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/utils.h
 delete mode 100644 package/libs/libnl-tiny/src/include/netlink/version.h
 delete mode 100644 package/libs/libnl-tiny/src/include/unl.h
 delete mode 100644 package/libs/libnl-tiny/src/msg.c
 delete mode 100644 package/libs/libnl-tiny/src/nl.c
 delete mode 100644 package/libs/libnl-tiny/src/object.c
 delete mode 100644 package/libs/libnl-tiny/src/socket.c
 delete mode 100644 package/libs/libnl-tiny/src/unl.c

diff --git a/package/libs/libnl-tiny/Makefile b/package/libs/libnl-tiny/Makefile
index cabbb084218f..0536c6b73ec7 100644
--- a/package/libs/libnl-tiny/Makefile
+++ b/package/libs/libnl-tiny/Makefile
@@ -8,8 +8,13 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libnl-tiny
-PKG_VERSION:=0.1
-PKG_RELEASE:=5
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL=$(PROJECT_GIT)/project/libnl-tiny.git
+PKG_SOURCE_DATE:=2017-11-16
+PKG_SOURCE_VERSION:=8ee5f3a4023f822d1c916bb2b5e845d3597ac674
+PKG_MIRROR_HASH:=e3dd137d69848b8cf2dbc58d70452586dd4178b55977896ea3a9dedaf62c768c
 
 PKG_LICENSE:=LGPL-2.1
 PKG_MAINTAINER:=Felix Fietkau <nbd at nbd.name>
@@ -29,7 +34,7 @@ endef
 TARGET_CFLAGS += $(FPIC)
 
 define Build/Compile
-	$(MAKE) -C $(PKG_BUILD_DIR) \
+	$(MAKE) -C $(PKG_BUILD_DIR)/src \
 		$(TARGET_CONFIGURE_OPTS) \
 		CFLAGS="$(TARGET_CFLAGS)" \
 		all
@@ -37,14 +42,14 @@ endef
 
 define Build/InstallDev
 	$(INSTALL_DIR) $(1)/usr/lib/pkgconfig $(1)/usr/include/libnl-tiny
-	$(CP) $(PKG_BUILD_DIR)/include/* $(1)/usr/include/libnl-tiny
-	$(CP) $(PKG_BUILD_DIR)/libnl-tiny.so $(1)/usr/lib/
-	$(CP) ./files/libnl-tiny.pc $(1)/usr/lib/pkgconfig
+	$(CP) $(PKG_BUILD_DIR)/src/include/* $(1)/usr/include/libnl-tiny
+	$(CP) $(PKG_BUILD_DIR)/src/libnl-tiny.so $(1)/usr/lib/
+	$(CP) $(PKG_BUILD_DIR)/files/libnl-tiny.pc $(1)/usr/lib/pkgconfig
 endef
 
 define Package/libnl-tiny/install
 	$(INSTALL_DIR) $(1)/usr/lib
-	$(CP) $(PKG_BUILD_DIR)/libnl-tiny.so $(1)/usr/lib/
+	$(CP) $(PKG_BUILD_DIR)/src/libnl-tiny.so $(1)/usr/lib/
 endef
 
 $(eval $(call BuildPackage,libnl-tiny))
diff --git a/package/libs/libnl-tiny/files/libnl-tiny.pc b/package/libs/libnl-tiny/files/libnl-tiny.pc
deleted file mode 100644
index af79cd301e23..000000000000
--- a/package/libs/libnl-tiny/files/libnl-tiny.pc
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=/usr
-exec_prefix=/usr
-libdir=${exec_prefix}/lib
-includedir=${prefix}/include/libnl-tiny
-
-Name: libnl-tiny
-Description: Convenience library for netlink sockets
-Version: 2.0
-Libs: -L${libdir} -lnl-tiny
-Cflags: -I${includedir}
diff --git a/package/libs/libnl-tiny/src/Makefile b/package/libs/libnl-tiny/src/Makefile
deleted file mode 100644
index 6f37160a8c35..000000000000
--- a/package/libs/libnl-tiny/src/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-CC=gcc
-WFLAGS=-Wall
-CFLAGS=-O2
-INCLUDES=-Iinclude
-
-LIBNAME=libnl-tiny.so
-
-all: $(LIBNAME)
-
-%.o: %.c
-	$(CC) $(WFLAGS) -c -o $@ $(INCLUDES) $(CFLAGS) $<
-
-LIBNL_OBJ=nl.o handlers.o msg.o attr.o cache.o cache_mngt.o object.o socket.o error.o
-GENL_OBJ=genl.o genl_family.o genl_ctrl.o genl_mngt.o unl.o
-
-$(LIBNAME): $(LIBNL_OBJ) $(GENL_OBJ)
-	$(CC) $(CFLAGS) -Wl,-Bsymbolic-functions -shared -o $@ $^
diff --git a/package/libs/libnl-tiny/src/attr.c b/package/libs/libnl-tiny/src/attr.c
deleted file mode 100644
index e0f50611cff9..000000000000
--- a/package/libs/libnl-tiny/src/attr.c
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- * lib/attr.c		Netlink Attributes
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-#include <netlink/addr.h>
-#include <netlink/attr.h>
-#include <netlink/msg.h>
-#include <linux/socket.h>
-
-/**
- * @ingroup msg
- * @defgroup attr Attributes
- * Netlink Attributes Construction/Parsing Interface
- *
- * \section attr_sec Netlink Attributes
- * Netlink attributes allow for data chunks of arbitary length to be
- * attached to a netlink message. Each attribute is encoded with a
- * type and length field, both 16 bits, stored in the attribute header
- * preceding the attribute data. The main advantage of using attributes
- * over packing everything into the family header is that the interface
- * stays extendable as new attributes can supersede old attributes while
- * remaining backwards compatible. Also attributes can be defined optional
- * thus avoiding the transmission of unnecessary empty data blocks.
- * Special nested attributes allow for more complex data structures to
- * be transmitted, e.g. trees, lists, etc.
- *
- * While not required, netlink attributes typically follow the family
- * header of a netlink message and must be properly aligned to NLA_ALIGNTO:
- * @code
- *   +----------------+- - -+---------------+- - -+------------+- - -+
- *   | Netlink Header | Pad | Family Header | Pad | Attributes | Pad |
- *   +----------------+- - -+---------------+- - -+------------+- - -+
- * @endcode
- *
- * The actual attributes are chained together each separately aligned to
- * NLA_ALIGNTO. The position of an attribute is defined based on the
- * length field of the preceding attributes:
- * @code
- *   +-------------+- - -+-------------+- - -+------
- *   | Attribute 1 | Pad | Attribute 2 | Pad | ...
- *   +-------------+- - -+-------------+- - -+------
- *   nla_next(attr1)------^
- * @endcode
- *
- * The attribute itself consists of the attribute header followed by
- * the actual payload also aligned to NLA_ALIGNTO. The function nla_data()
- * returns a pointer to the start of the payload while nla_len() returns
- * the length of the payload in bytes.
- *
- * \b Note: Be aware, NLA_ALIGNTO equals to 4 bytes, therefore it is not
- * safe to dereference any 64 bit data types directly.
- *
- * @code
- *    <----------- nla_total_size(payload) ----------->
- *    <-------- nla_attr_size(payload) --------->
- *   +------------------+- - -+- - - - - - - - - +- - -+
- *   | Attribute Header | Pad |     Payload      | Pad |
- *   +------------------+- - -+- - - - - - - - - +- - -+
- *   nla_data(nla)-------------^
- *                             <- nla_len(nla) ->
- * @endcode
- *
- * @subsection attr_datatypes Attribute Data Types
- * A number of basic data types are supported to simplify access and
- * validation of netlink attributes. This data type information is
- * not encoded in the attribute, both the kernel and userspace part
- * are required to share this information on their own.
- *
- * One of the major advantages of these basic types is the automatic
- * validation of each attribute based on an attribute policy. The
- * validation covers most of the checks required to safely use
- * attributes and thus keeps the individual sanity check to a minimum.
- *
- * Never access attribute payload without ensuring basic validation
- * first, attributes may:
- * - not be present even though required
- * - contain less actual payload than expected
- * - fake a attribute length which exceeds the end of the message
- * - contain unterminated character strings
- *
- * Policies are defined as array of the struct nla_policy. The array is
- * indexed with the attribute type, therefore the array must be sized
- * accordingly.
- * @code
- * static struct nla_policy my_policy[ATTR_MAX+1] = {
- * 	[ATTR_FOO] = { .type = ..., .minlen = ..., .maxlen = ... },
- * };
- *
- * err = nla_validate(attrs, attrlen, ATTR_MAX, &my_policy);
- * @endcode
- *
- * Some basic validations are performed on every attribute, regardless of type.
- * - If the attribute type exceeds the maximum attribute type specified or
- *   the attribute type is lesser-or-equal than zero, the attribute will
- *   be silently ignored.
- * - If the payload length falls below the \a minlen value the attribute
- *   will be rejected.
- * - If \a maxlen is non-zero and the payload length exceeds the \a maxlen
- *   value the attribute will be rejected.
- *
- *
- * @par Unspecific Attribute (NLA_UNSPEC)
- * This is the standard type if no type is specified. It is used for
- * binary data of arbitary length. Typically this attribute carries
- * a binary structure or a stream of bytes.
- * @par
- * @code
- * // In this example, we will assume a binary structure requires to
- * // be transmitted. The definition of the structure will typically
- * // go into a header file available to both the kernel and userspace
- * // side.
- * //
- * // Note: Be careful when putting 64 bit data types into a structure.
- * // The attribute payload is only aligned to 4 bytes, dereferencing
- * // the member may fail.
- * struct my_struct {
- *     int a;
- *     int b;
- * };
- *
- * // The validation function will not enforce an exact length match to
- * // allow structures to grow as required. Note: While it is allowed
- * // to add members to the end of the structure, changing the order or
- * // inserting members in the middle of the structure will break your
- * // binary interface.
- * static struct nla_policy my_policy[ATTR_MAX+1] = {
- *     [ATTR_MY_STRICT] = { .type = NLA_UNSPEC,
- *                          .minlen = sizeof(struct my_struct) },
- *
- * // The binary structure is appened to the message using nla_put()
- * struct my_struct foo = { .a = 1, .b = 2 };
- * nla_put(msg, ATTR_MY_STRUCT, sizeof(foo), &foo);
- *
- * // On the receiving side, a pointer to the structure pointing inside
- * // the message payload is returned by nla_get().
- * if (attrs[ATTR_MY_STRUCT])
- *     struct my_struct *foo = nla_get(attrs[ATTR_MY_STRUCT]);
- * @endcode
- *
- * @par Integers (NLA_U8, NLA_U16, NLA_U32, NLA_U64)
- * Integers come in different sizes from 8 bit to 64 bit. However, since the
- * payload length is aligned to 4 bytes, integers smaller than 32 bit are
- * only useful to enforce the maximum range of values.
- * @par
- * \b Note: There is no difference made between signed and unsigned integers.
- * The validation only enforces the minimal payload length required to store
- * an integer of specified type.
- * @par
- * @code
- * // Even though possible, it does not make sense to specify .minlen or
- * // .maxlen for integer types. The data types implies the corresponding
- * // minimal payload length.
- * static struct nla_policy my_policy[ATTR_MAX+1] = {
- *     [ATTR_FOO] = { .type = NLA_U32 },
- *
- * // Numeric values can be appended directly using the respective
- * // nla_put_uxxx() function
- * nla_put_u32(msg, ATTR_FOO, 123);
- *
- * // Same for the receiving side.
- * if (attrs[ATTR_FOO])
- *     uint32_t foo = nla_get_u32(attrs[ATTR_FOO]);
- * @endcode
- *
- * @par Character string (NLA_STRING)
- * This data type represents a NUL terminated character string of variable
- * length. For binary data streams the type NLA_UNSPEC is recommended.
- * @par
- * @code
- * // Enforce a NUL terminated character string of at most 4 characters
- * // including the NUL termination.
- * static struct nla_policy my_policy[ATTR_MAX+1] = {
- *     [ATTR_BAR] = { .type = NLA_STRING, maxlen = 4 },
- *
- * // nla_put_string() creates a string attribute of the necessary length
- * // and appends it to the message including the NUL termination.
- * nla_put_string(msg, ATTR_BAR, "some text");
- *
- * // It is safe to use the returned character string directly if the
- * // attribute has been validated as the validation enforces the proper
- * // termination of the string.
- * if (attrs[ATTR_BAR])
- *     char *text = nla_get_string(attrs[ATTR_BAR]);
- * @endcode
- *
- * @par Flag (NLA_FLAG)
- * This attribute type may be used to indicate the presence of a flag. The
- * attribute is only valid if the payload length is zero. The presence of
- * the attribute header indicates the presence of the flag.
- * @par
- * @code
- * // This attribute type is special as .minlen and .maxlen have no effect.
- * static struct nla_policy my_policy[ATTR_MAX+1] = {
- *     [ATTR_FLAG] = { .type = NLA_FLAG },
- *
- * // nla_put_flag() appends a zero sized attribute to the message.
- * nla_put_flag(msg, ATTR_FLAG);
- *
- * // There is no need for a receival function, the presence is the value.
- * if (attrs[ATTR_FLAG])
- *     // flag is present
- * @endcode
- *
- * @par Micro Seconds (NLA_MSECS)
- *
- * @par Nested Attribute (NLA_NESTED)
- * Attributes can be nested and put into a container to create groups, lists
- * or to construct trees of attributes. Nested attributes are often used to
- * pass attributes to a subsystem where the top layer has no knowledge of the
- * configuration possibilities of each subsystem.
- * @par
- * \b Note: When validating the attributes using nlmsg_validate() or
- * nlmsg_parse() it will only affect the top level attributes. Each
- * level of nested attributes must be validated seperately using
- * nla_parse_nested() or nla_validate().
- * @par
- * @code
- * // The minimal length policy may be used to enforce the presence of at
- * // least one attribute.
- * static struct nla_policy my_policy[ATTR_MAX+1] = {
- *     [ATTR_OPTS] = { .type = NLA_NESTED, minlen = NLA_HDRLEN },
- *
- * // Nested attributes are constructed by enclosing the attributes
- * // to be nested with calls to nla_nest_start() respetively nla_nest_end().
- * struct nlattr *opts = nla_nest_start(msg, ATTR_OPTS);
- * nla_put_u32(msg, ATTR_FOO, 123);
- * nla_put_string(msg, ATTR_BAR, "some text");
- * nla_nest_end(msg, opts);
- *
- * // Various methods exist to parse nested attributes, the easiest being
- * // nla_parse_nested() which also allows validation in the same step.
- * if (attrs[ATTR_OPTS]) {
- *     struct nlattr *nested[ATTR_MAX+1];
- *
- *     nla_parse_nested(nested, ATTR_MAX, attrs[ATTR_OPTS], &policy);
- *
- *     if (nested[ATTR_FOO])
- *         uint32_t foo = nla_get_u32(nested[ATTR_FOO]);
- * }
- * @endcode
- *
- * @subsection attr_exceptions Exception Based Attribute Construction
- * Often a large number of attributes are added to a message in a single
- * function. In order to simplify error handling, a second set of
- * construction functions exist which jump to a error label when they
- * fail instead of returning an error code. This second set consists
- * of macros which are named after their error code based counterpart
- * except that the name is written all uppercase.
- *
- * All of the macros jump to the target \c nla_put_failure if they fail.
- * @code
- * void my_func(struct nl_msg *msg)
- * {
- *     NLA_PUT_U32(msg, ATTR_FOO, 10);
- *     NLA_PUT_STRING(msg, ATTR_BAR, "bar");
- *
- *     return 0;
- *
- * nla_put_failure:
- *     return -NLE_NOMEM;
- * }
- * @endcode
- *
- * @subsection attr_examples Examples
- * @par Example 1.1 Constructing a netlink message with attributes.
- * @code
- * struct nl_msg *build_msg(int ifindex, struct nl_addr *lladdr, int mtu)
- * {
- *     struct nl_msg *msg;
- *     struct nlattr *info, *vlan;
- *     struct ifinfomsg ifi = {
- *         .ifi_family = AF_INET,
- *         .ifi_index = ifindex,
- *     };
- *
- *     // Allocate a new netlink message, type=RTM_SETLINK, flags=NLM_F_ECHO
- *     if (!(msg = nlmsg_alloc_simple(RTM_SETLINK, NLM_F_ECHO)))
- *         return NULL;
- *
- *     // Append the family specific header (struct ifinfomsg)
- *     if (nlmsg_append(msg, &ifi, sizeof(ifi), NLMSG_ALIGNTO) < 0)
- *         goto nla_put_failure
- *
- *     // Append a 32 bit integer attribute to carry the MTU
- *     NLA_PUT_U32(msg, IFLA_MTU, mtu);
- *
- *     // Append a unspecific attribute to carry the link layer address
- *     NLA_PUT_ADDR(msg, IFLA_ADDRESS, lladdr);
- *
- *     // Append a container for nested attributes to carry link information
- *     if (!(info = nla_nest_start(msg, IFLA_LINKINFO)))
- *         goto nla_put_failure;
- *
- *     // Put a string attribute into the container
- *     NLA_PUT_STRING(msg, IFLA_INFO_KIND, "vlan");
- *
- *     // Append another container inside the open container to carry
- *     // vlan specific attributes
- *     if (!(vlan = nla_nest_start(msg, IFLA_INFO_DATA)))
- *         goto nla_put_failure;
- *
- *     // add vlan specific info attributes here...
- *
- *     // Finish nesting the vlan attributes and close the second container.
- *     nla_nest_end(msg, vlan);
- *
- *     // Finish nesting the link info attribute and close the first container.
- *     nla_nest_end(msg, info);
- *
- *     return msg;
- *
- * // If any of the construction macros fails, we end up here.
- * nla_put_failure:
- *     nlmsg_free(msg);
- *     return NULL;
- * }
- * @endcode
- *
- * @par Example 2.1 Parsing a netlink message with attributes.
- * @code
- * int parse_message(struct nl_msg *msg)
- * {
- *     // The policy defines two attributes: a 32 bit integer and a container
- *     // for nested attributes.
- *     struct nla_policy attr_policy[ATTR_MAX+1] = {
- *         [ATTR_FOO] = { .type = NLA_U32 },
- *         [ATTR_BAR] = { .type = NLA_NESTED },
- *     };
- *     struct nlattr *attrs[ATTR_MAX+1];
- *     int err;
- *
- *     // The nlmsg_parse() function will make sure that the message contains
- *     // enough payload to hold the header (struct my_hdr), validates any
- *     // attributes attached to the messages and stores a pointer to each
- *     // attribute in the attrs[] array accessable by attribute type.
- *     if ((err = nlmsg_parse(nlmsg_hdr(msg), sizeof(struct my_hdr), attrs,
- *                            ATTR_MAX, attr_policy)) < 0)
- *         goto errout;
- *
- *     if (attrs[ATTR_FOO]) {
- *         // It is safe to directly access the attribute payload without
- *         // any further checks since nlmsg_parse() enforced the policy.
- *         uint32_t foo = nla_get_u32(attrs[ATTR_FOO]);
- *     }
- *
- *     if (attrs[ATTR_BAR]) {
- *         struct nlattr *nested[NESTED_MAX+1];
- *
- *         // Attributes nested in a container can be parsed the same way
- *         // as top level attributes.
- *         if ((err = nla_parse_nested(nested, NESTED_MAX, attrs[ATTR_BAR],
- *                                     nested_policy)) < 0)
- *             goto errout;
- *
- *         // Process nested attributes here.
- *     }
- *
- *     err = 0;
- * errout:
- *     return err;
- * }
- * @endcode
- *
- * @{
- */
-
-/**
- * @name Attribute Size Calculation
- * @{
- */
-
-/** @} */
-
-/**
- * @name Parsing Attributes
- * @{
- */
-
-/**
- * Check if the attribute header and payload can be accessed safely.
- * @arg nla		Attribute of any kind.
- * @arg remaining	Number of bytes remaining in attribute stream.
- *
- * Verifies that the header and payload do not exceed the number of
- * bytes left in the attribute stream. This function must be called
- * before access the attribute header or payload when iterating over
- * the attribute stream using nla_next().
- *
- * @return True if the attribute can be accessed safely, false otherwise.
- */
-int nla_ok(const struct nlattr *nla, int remaining)
-{
-	return remaining >= sizeof(*nla) &&
-	       nla->nla_len >= sizeof(*nla) &&
-	       nla->nla_len <= remaining;
-}
-
-/**
- * Return next attribute in a stream of attributes.
- * @arg nla		Attribute of any kind.
- * @arg remaining	Variable to count remaining bytes in stream.
- *
- * Calculates the offset to the next attribute based on the attribute
- * given. The attribute provided is assumed to be accessible, the
- * caller is responsible to use nla_ok() beforehand. The offset (length
- * of specified attribute including padding) is then subtracted from
- * the remaining bytes variable and a pointer to the next attribute is
- * returned.
- *
- * nla_next() can be called as long as remainig is >0.
- *
- * @return Pointer to next attribute.
- */
-struct nlattr *nla_next(const struct nlattr *nla, int *remaining)
-{
-	int totlen = NLA_ALIGN(nla->nla_len);
-
-	*remaining -= totlen;
-	return (struct nlattr *) ((char *) nla + totlen);
-}
-
-static uint16_t nla_attr_minlen[NLA_TYPE_MAX+1] = {
-	[NLA_U8]	= sizeof(uint8_t),
-	[NLA_U16]	= sizeof(uint16_t),
-	[NLA_U32]	= sizeof(uint32_t),
-	[NLA_U64]	= sizeof(uint64_t),
-	[NLA_STRING]	= 1,
-};
-
-static int validate_nla(struct nlattr *nla, int maxtype,
-			struct nla_policy *policy)
-{
-	struct nla_policy *pt;
-	int minlen = 0, type = nla_type(nla);
-
-	if (type <= 0 || type > maxtype)
-		return 0;
-
-	pt = &policy[type];
-
-	if (pt->type > NLA_TYPE_MAX)
-		BUG();
-
-	if (pt->minlen)
-		minlen = pt->minlen;
-	else if (pt->type != NLA_UNSPEC)
-		minlen = nla_attr_minlen[pt->type];
-
-	if (pt->type == NLA_FLAG && nla_len(nla) > 0)
-		return -NLE_RANGE;
-
-	if (nla_len(nla) < minlen)
-		return -NLE_RANGE;
-
-	if (pt->maxlen && nla_len(nla) > pt->maxlen)
-		return -NLE_RANGE;
-
-	if (pt->type == NLA_STRING) {
-		char *data = nla_data(nla);
-		if (data[nla_len(nla) - 1] != '\0')
-			return -NLE_INVAL;
-	}
-
-	return 0;
-}
-
-
-/**
- * Create attribute index based on a stream of attributes.
- * @arg tb		Index array to be filled (maxtype+1 elements).
- * @arg maxtype		Maximum attribute type expected and accepted.
- * @arg head		Head of attribute stream.
- * @arg len		Length of attribute stream.
- * @arg policy		Attribute validation policy.
- *
- * Iterates over the stream of attributes and stores a pointer to each
- * attribute in the index array using the attribute type as index to
- * the array. Attribute with a type greater than the maximum type
- * specified will be silently ignored in order to maintain backwards
- * compatibility. If \a policy is not NULL, the attribute will be
- * validated using the specified policy.
- *
- * @see nla_validate
- * @return 0 on success or a negative error code.
- */
-int nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, int len,
-	      struct nla_policy *policy)
-{
-	struct nlattr *nla;
-	int rem, err;
-
-	memset(tb, 0, sizeof(struct nlattr *) * (maxtype + 1));
-
-	nla_for_each_attr(nla, head, len, rem) {
-		int type = nla_type(nla);
-
-		if (type == 0) {
-			fprintf(stderr, "Illegal nla->nla_type == 0\n");
-			continue;
-		}
-
-		if (type <= maxtype) {
-			if (policy) {
-				err = validate_nla(nla, maxtype, policy);
-				if (err < 0)
-					goto errout;
-			}
-
-			tb[type] = nla;
-		}
-	}
-
-	if (rem > 0)
-		fprintf(stderr, "netlink: %d bytes leftover after parsing "
-		       "attributes.\n", rem);
-
-	err = 0;
-errout:
-	return err;
-}
-
-/**
- * Validate a stream of attributes.
- * @arg head		Head of attributes stream.
- * @arg len		Length of attributes stream.
- * @arg maxtype		Maximum attribute type expected and accepted.
- * @arg policy		Validation policy.
- *
- * Iterates over the stream of attributes and validates each attribute
- * one by one using the specified policy. Attributes with a type greater
- * than the maximum type specified will be silently ignored in order to
- * maintain backwards compatibility.
- *
- * See \ref attr_datatypes for more details on what kind of validation
- * checks are performed on each attribute data type.
- *
- * @return 0 on success or a negative error code.
- */
-int nla_validate(struct nlattr *head, int len, int maxtype,
-		 struct nla_policy *policy)
-{
-	struct nlattr *nla;
-	int rem, err;
-
-	nla_for_each_attr(nla, head, len, rem) {
-		err = validate_nla(nla, maxtype, policy);
-		if (err < 0)
-			goto errout;
-	}
-
-	err = 0;
-errout:
-	return err;
-}
-
-/**
- * Find a single attribute in a stream of attributes.
- * @arg head		Head of attributes stream.
- * @arg len		Length of attributes stream.
- * @arg attrtype	Attribute type to look for.
- *
- * Iterates over the stream of attributes and compares each type with
- * the type specified. Returns the first attribute which matches the
- * type.
- *
- * @return Pointer to attribute found or NULL.
- */
-struct nlattr *nla_find(struct nlattr *head, int len, int attrtype)
-{
-	struct nlattr *nla;
-	int rem;
-
-	nla_for_each_attr(nla, head, len, rem)
-		if (nla_type(nla) == attrtype)
-			return nla;
-
-	return NULL;
-}
-
-/** @} */
-
-/**
- * @name Unspecific Attribute
- * @{
- */
-
-/**
- * Reserve space for a attribute.
- * @arg msg		Netlink Message.
- * @arg attrtype	Attribute Type.
- * @arg attrlen		Length of payload.
- *
- * Reserves room for a attribute in the specified netlink message and
- * fills in the attribute header (type, length). Returns NULL if there
- * is unsuficient space for the attribute.
- *
- * Any padding between payload and the start of the next attribute is
- * zeroed out.
- *
- * @return Pointer to start of attribute or NULL on failure.
- */
-struct nlattr *nla_reserve(struct nl_msg *msg, int attrtype, int attrlen)
-{
-	struct nlattr *nla;
-	int tlen;
-	
-	tlen = NLMSG_ALIGN(msg->nm_nlh->nlmsg_len) + nla_total_size(attrlen);
-
-	if ((tlen + msg->nm_nlh->nlmsg_len) > msg->nm_size)
-		return NULL;
-
-	nla = (struct nlattr *) nlmsg_tail(msg->nm_nlh);
-	nla->nla_type = attrtype;
-	nla->nla_len = nla_attr_size(attrlen);
-
-	memset((unsigned char *) nla + nla->nla_len, 0, nla_padlen(attrlen));
-	msg->nm_nlh->nlmsg_len = tlen;
-
-	NL_DBG(2, "msg %p: Reserved %d bytes at offset +%td for attr %d "
-		  "nlmsg_len=%d\n", msg, attrlen,
-		  (void *) nla - nlmsg_data(msg->nm_nlh),
-		  attrtype, msg->nm_nlh->nlmsg_len);
-
-	return nla;
-}
-
-/**
- * Add a unspecific attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg datalen		Length of data to be used as payload.
- * @arg data		Pointer to data to be used as attribute payload.
- *
- * Reserves room for a unspecific attribute and copies the provided data
- * into the message as payload of the attribute. Returns an error if there
- * is insufficient space for the attribute.
- *
- * @see nla_reserve
- * @return 0 on success or a negative error code.
- */
-int nla_put(struct nl_msg *msg, int attrtype, int datalen, const void *data)
-{
-	struct nlattr *nla;
-
-	nla = nla_reserve(msg, attrtype, datalen);
-	if (!nla)
-		return -NLE_NOMEM;
-
-	memcpy(nla_data(nla), data, datalen);
-	NL_DBG(2, "msg %p: Wrote %d bytes at offset +%td for attr %d\n",
-	       msg, datalen, (void *) nla - nlmsg_data(msg->nm_nlh), attrtype);
-
-	return 0;
-}
-
-
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/cache.c b/package/libs/libnl-tiny/src/cache.c
deleted file mode 100644
index 56a1280b53bb..000000000000
--- a/package/libs/libnl-tiny/src/cache.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * lib/cache.c		Caching Module
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup cache_mngt
- * @defgroup cache Cache
- *
- * @code
- *   Cache Management             |    | Type Specific Cache Operations
- *                                      
- *                                |    | +----------------+ +------------+
- *                                       | request update | | msg_parser |
- *                                |    | +----------------+ +------------+
- *                                     +- - - - -^- - - - - - - -^- -|- - - -
- *    nl_cache_update:            |              |               |   |
- *          1) --------- co_request_update ------+               |   |
- *                                |                              |   |
- *          2) destroy old cache     +----------- pp_cb ---------|---+
- *                                |  |                           |
- *          3) ---------- nl_recvmsgs ----------+   +- cb_valid -+
- *             +--------------+   |  |          |   |
- *             | nl_cache_add |<-----+   + - - -v- -|- - - - - - - - - - -
- *             +--------------+   |      | +-------------+
- *                                         | nl_recvmsgs |
- *                                |      | +-----|-^-----+
- *                                           +---v-|---+
- *                                |      |   | nl_recv |
- *                                           +---------+
- *                                |      |                 Core Netlink
- * @endcode
- * 
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/cache.h>
-#include <netlink/object.h>
-#include <netlink/utils.h>
-
-/**
- * @name Cache Creation/Deletion
- * @{
- */
-
-/**
- * Allocate an empty cache
- * @arg ops		cache operations to base the cache on
- * 
- * @return A newly allocated and initialized cache.
- */
-struct nl_cache *nl_cache_alloc(struct nl_cache_ops *ops)
-{
-	struct nl_cache *cache;
-
-	cache = calloc(1, sizeof(*cache));
-	if (!cache)
-		return NULL;
-
-	nl_init_list_head(&cache->c_items);
-	cache->c_ops = ops;
-
-	NL_DBG(2, "Allocated cache %p <%s>.\n", cache, nl_cache_name(cache));
-
-	return cache;
-}
-
-int nl_cache_alloc_and_fill(struct nl_cache_ops *ops, struct nl_sock *sock,
-			    struct nl_cache **result)
-{
-	struct nl_cache *cache;
-	int err;
-	
-	if (!(cache = nl_cache_alloc(ops)))
-		return -NLE_NOMEM;
-
-	if (sock && (err = nl_cache_refill(sock, cache)) < 0) {
-		nl_cache_free(cache);
-		return err;
-	}
-
-	*result = cache;
-	return 0;
-}
-
-/**
- * Clear a cache.
- * @arg cache		cache to clear
- *
- * Removes all elements of a cache.
- */
-void nl_cache_clear(struct nl_cache *cache)
-{
-	struct nl_object *obj, *tmp;
-
-	NL_DBG(1, "Clearing cache %p <%s>...\n", cache, nl_cache_name(cache));
-
-	nl_list_for_each_entry_safe(obj, tmp, &cache->c_items, ce_list)
-		nl_cache_remove(obj);
-}
-
-/**
- * Free a cache.
- * @arg cache		Cache to free.
- *
- * Removes all elements of a cache and frees all memory.
- *
- * @note Use this function if you are working with allocated caches.
- */
-void nl_cache_free(struct nl_cache *cache)
-{
-	if (!cache)
-		return;
-
-	nl_cache_clear(cache);
-	NL_DBG(1, "Freeing cache %p <%s>...\n", cache, nl_cache_name(cache));
-	free(cache);
-}
-
-/** @} */
-
-/**
- * @name Cache Modifications
- * @{
- */
-
-static int __cache_add(struct nl_cache *cache, struct nl_object *obj)
-{
-	obj->ce_cache = cache;
-
-	nl_list_add_tail(&obj->ce_list, &cache->c_items);
-	cache->c_nitems++;
-
-	NL_DBG(1, "Added %p to cache %p <%s>.\n",
-	       obj, cache, nl_cache_name(cache));
-
-	return 0;
-}
-
-/**
- * Add object to a cache.
- * @arg cache		Cache to add object to
- * @arg obj		Object to be added to the cache
- *
- * Adds the given object to the specified cache. The object is cloned
- * if it has been added to another cache already.
- *
- * @return 0 or a negative error code.
- */
-int nl_cache_add(struct nl_cache *cache, struct nl_object *obj)
-{
-	struct nl_object *new;
-
-	if (cache->c_ops->co_obj_ops != obj->ce_ops)
-		return -NLE_OBJ_MISMATCH;
-
-	if (!nl_list_empty(&obj->ce_list)) {
-		new = nl_object_clone(obj);
-		if (!new)
-			return -NLE_NOMEM;
-	} else {
-		nl_object_get(obj);
-		new = obj;
-	}
-
-	return __cache_add(cache, new);
-}
-
-/**
- * Removes an object from a cache.
- * @arg obj		Object to remove from its cache
- *
- * Removes the object \c obj from the cache it is assigned to, since
- * an object can only be assigned to one cache at a time, the cache
- * must ne be passed along with it.
- */
-void nl_cache_remove(struct nl_object *obj)
-{
-	struct nl_cache *cache = obj->ce_cache;
-
-	if (cache == NULL)
-		return;
-
-	nl_list_del(&obj->ce_list);
-	obj->ce_cache = NULL;
-	nl_object_put(obj);
-	cache->c_nitems--;
-
-	NL_DBG(1, "Deleted %p from cache %p <%s>.\n",
-	       obj, cache, nl_cache_name(cache));
-}
-
-/** @} */
-
-/**
- * @name Synchronization
- * @{
- */
-
-/**
- * Request a full dump from the kernel to fill a cache
- * @arg sk		Netlink socket.
- * @arg cache		Cache subjected to be filled.
- *
- * Send a dumping request to the kernel causing it to dump all objects
- * related to the specified cache to the netlink socket.
- *
- * Use nl_cache_pickup() to read the objects from the socket and fill them
- * into a cache.
- */
-int nl_cache_request_full_dump(struct nl_sock *sk, struct nl_cache *cache)
-{
-	NL_DBG(2, "Requesting dump from kernel for cache %p <%s>...\n",
-	          cache, nl_cache_name(cache));
-
-	if (cache->c_ops->co_request_update == NULL)
-		return -NLE_OPNOTSUPP;
-
-	return cache->c_ops->co_request_update(cache, sk);
-}
-
-/** @cond SKIP */
-struct update_xdata {
-	struct nl_cache_ops *ops;
-	struct nl_parser_param *params;
-};
-
-static int update_msg_parser(struct nl_msg *msg, void *arg)
-{
-	struct update_xdata *x = arg;
-	
-	return nl_cache_parse(x->ops, &msg->nm_src, msg->nm_nlh, x->params);
-}
-/** @endcond */
-
-int __cache_pickup(struct nl_sock *sk, struct nl_cache *cache,
-		   struct nl_parser_param *param)
-{
-	int err;
-	struct nl_cb *cb;
-	struct update_xdata x = {
-		.ops = cache->c_ops,
-		.params = param,
-	};
-
-	NL_DBG(1, "Picking up answer for cache %p <%s>...\n",
-		  cache, nl_cache_name(cache));
-
-	cb = nl_cb_clone(sk->s_cb);
-	if (cb == NULL)
-		return -NLE_NOMEM;
-
-	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, update_msg_parser, &x);
-
-	err = nl_recvmsgs(sk, cb);
-	if (err < 0)
-		NL_DBG(2, "While picking up for %p <%s>, recvmsgs() returned " \
-		       "%d: %s", cache, nl_cache_name(cache),
-		       err, nl_geterror(err));
-
-	nl_cb_put(cb);
-
-	return err;
-}
-
-static int pickup_cb(struct nl_object *c, struct nl_parser_param *p)
-{
-	return nl_cache_add((struct nl_cache *) p->pp_arg, c);
-}
-
-/**
- * Pickup a netlink dump response and put it into a cache.
- * @arg sk		Netlink socket.
- * @arg cache		Cache to put items into.
- *
- * Waits for netlink messages to arrive, parses them and puts them into
- * the specified cache.
- *
- * @return 0 on success or a negative error code.
- */
-int nl_cache_pickup(struct nl_sock *sk, struct nl_cache *cache)
-{
-	struct nl_parser_param p = {
-		.pp_cb = pickup_cb,
-		.pp_arg = cache,
-	};
-
-	return __cache_pickup(sk, cache, &p);
-}
-
-
-/** @} */
-
-/**
- * @name Parsing
- * @{
- */
-
-/** @cond SKIP */
-int nl_cache_parse(struct nl_cache_ops *ops, struct sockaddr_nl *who,
-		   struct nlmsghdr *nlh, struct nl_parser_param *params)
-{
-	int i, err;
-
-	if (!nlmsg_valid_hdr(nlh, ops->co_hdrsize))
-		return -NLE_MSG_TOOSHORT;
-
-	for (i = 0; ops->co_msgtypes[i].mt_id >= 0; i++) {
-		if (ops->co_msgtypes[i].mt_id == nlh->nlmsg_type) {
-			err = ops->co_msg_parser(ops, who, nlh, params);
-			if (err != -NLE_OPNOTSUPP)
-				goto errout;
-		}
-	}
-
-
-	err = -NLE_MSGTYPE_NOSUPPORT;
-errout:
-	return err;
-}
-/** @endcond */
-
-/**
- * Parse a netlink message and add it to the cache.
- * @arg cache		cache to add element to
- * @arg msg		netlink message
- *
- * Parses a netlink message by calling the cache specific message parser
- * and adds the new element to the cache.
- *
- * @return 0 or a negative error code.
- */
-int nl_cache_parse_and_add(struct nl_cache *cache, struct nl_msg *msg)
-{
-	struct nl_parser_param p = {
-		.pp_cb = pickup_cb,
-		.pp_arg = cache,
-	};
-
-	return nl_cache_parse(cache->c_ops, NULL, nlmsg_hdr(msg), &p);
-}
-
-/**
- * (Re)fill a cache with the contents in the kernel.
- * @arg sk		Netlink socket.
- * @arg cache		cache to update
- *
- * Clears the specified cache and fills it with the current state in
- * the kernel.
- *
- * @return 0 or a negative error code.
- */
-int nl_cache_refill(struct nl_sock *sk, struct nl_cache *cache)
-{
-	int err;
-
-	err = nl_cache_request_full_dump(sk, cache);
-	if (err < 0)
-		return err;
-
-	NL_DBG(2, "Upading cache %p <%s>, request sent, waiting for dump...\n",
-	       cache, nl_cache_name(cache));
-	nl_cache_clear(cache);
-
-	return nl_cache_pickup(sk, cache);
-}
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/cache_mngt.c b/package/libs/libnl-tiny/src/cache_mngt.c
deleted file mode 100644
index 8adbe51b0a11..000000000000
--- a/package/libs/libnl-tiny/src/cache_mngt.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * lib/cache_mngt.c	Cache Management
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup core
- * @defgroup cache_mngt Caching
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/cache.h>
-#include <netlink/utils.h>
-
-static struct nl_cache_ops *cache_ops;
-
-/**
- * @name Cache Operations Sets
- * @{
- */
-
-/**
- * Lookup the set cache operations of a certain cache type
- * @arg name		name of the cache type
- *
- * @return The cache operations or NULL if no operations
- *         have been registered under the specified name.
- */
-struct nl_cache_ops *nl_cache_ops_lookup(const char *name)
-{
-	struct nl_cache_ops *ops;
-
-	for (ops = cache_ops; ops; ops = ops->co_next)
-		if (!strcmp(ops->co_name, name))
-			return ops;
-
-	return NULL;
-}
-
-/**
- * Associate a message type to a set of cache operations
- * @arg protocol		netlink protocol
- * @arg msgtype			netlink message type
- *
- * Associates the specified netlink message type with
- * a registered set of cache operations.
- *
- * @return The cache operations or NULL if no association
- *         could be made.
- */
-struct nl_cache_ops *nl_cache_ops_associate(int protocol, int msgtype)
-{
-	int i;
-	struct nl_cache_ops *ops;
-
-	for (ops = cache_ops; ops; ops = ops->co_next) {
-		if (ops->co_protocol != protocol)
-			continue;
-
-		for (i = 0; ops->co_msgtypes[i].mt_id >= 0; i++)
-			if (ops->co_msgtypes[i].mt_id == msgtype)
-				return ops;
-	}
-
-	return NULL;
-}
-
-/**
- * Register a set of cache operations
- * @arg ops		cache operations
- *
- * Called by users of caches to announce the avaibility of
- * a certain cache type.
- *
- * @return 0 on success or a negative error code.
- */
-int nl_cache_mngt_register(struct nl_cache_ops *ops)
-{
-	if (!ops->co_name || !ops->co_obj_ops)
-		return -NLE_INVAL;
-
-	if (nl_cache_ops_lookup(ops->co_name))
-		return -NLE_EXIST;
-
-	ops->co_next = cache_ops;
-	cache_ops = ops;
-
-	NL_DBG(1, "Registered cache operations %s\n", ops->co_name);
-
-	return 0;
-}
-
-/**
- * Unregister a set of cache operations
- * @arg ops		cache operations
- *
- * Called by users of caches to announce a set of
- * cache operations is no longer available. The
- * specified cache operations must have been registered
- * previously using nl_cache_mngt_register()
- *
- * @return 0 on success or a negative error code
- */
-int nl_cache_mngt_unregister(struct nl_cache_ops *ops)
-{
-	struct nl_cache_ops *t, **tp;
-
-	for (tp = &cache_ops; (t=*tp) != NULL; tp = &t->co_next)
-		if (t == ops)
-			break;
-
-	if (!t)
-		return -NLE_NOCACHE;
-
-	NL_DBG(1, "Unregistered cache operations %s\n", ops->co_name);
-
-	*tp = t->co_next;
-	return 0;
-}
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/error.c b/package/libs/libnl-tiny/src/error.c
deleted file mode 100644
index e8ee47459ee7..000000000000
--- a/package/libs/libnl-tiny/src/error.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * lib/error.c		Error Handling
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-
-static const char *errmsg[NLE_MAX+1] = {
-[NLE_SUCCESS]		= "Success",
-[NLE_FAILURE]		= "Unspecific failure",
-[NLE_INTR]		= "Interrupted system call",
-[NLE_BAD_SOCK]		= "Bad socket",
-[NLE_AGAIN]		= "Try again",
-[NLE_NOMEM]		= "Out of memory",
-[NLE_EXIST]		= "Object exists",
-[NLE_INVAL]		= "Invalid input data or parameter",
-[NLE_RANGE]		= "Input data out of range",
-[NLE_MSGSIZE]		= "Message size not sufficient",
-[NLE_OPNOTSUPP]		= "Operation not supported",
-[NLE_AF_NOSUPPORT]	= "Address family not supported",
-[NLE_OBJ_NOTFOUND]	= "Object not found",
-[NLE_NOATTR]		= "Attribute not available",
-[NLE_MISSING_ATTR]	= "Missing attribute",
-[NLE_AF_MISMATCH]	= "Address family mismatch",
-[NLE_SEQ_MISMATCH]	= "Message sequence number mismatch",
-[NLE_MSG_OVERFLOW]	= "Kernel reported message overflow",
-[NLE_MSG_TRUNC]		= "Kernel reported truncated message",
-[NLE_NOADDR]		= "Invalid address for specified address family",
-[NLE_SRCRT_NOSUPPORT]	= "Source based routing not supported",
-[NLE_MSG_TOOSHORT]	= "Netlink message is too short",
-[NLE_MSGTYPE_NOSUPPORT]	= "Netlink message type is not supported",
-[NLE_OBJ_MISMATCH]	= "Object type does not match cache",
-[NLE_NOCACHE]		= "Unknown or invalid cache type",
-[NLE_BUSY]		= "Object busy",
-[NLE_PROTO_MISMATCH]	= "Protocol mismatch",
-[NLE_NOACCESS]		= "No Access",
-[NLE_PERM]		= "Operation not permitted",
-[NLE_PKTLOC_FILE]	= "Unable to open packet location file",
-[NLE_PARSE_ERR]		= "Unable to parse object",
-[NLE_NODEV]		= "No such device",
-[NLE_IMMUTABLE]		= "Immutable attribute",
-[NLE_DUMP_INTR]		= "Dump inconsistency detected, interrupted",
-};
-
-/**
- * Return error message for an error code
- * @return error message
- */
-const char *nl_geterror(int error)
-{
-	error = abs(error);
-
-	if (error > NLE_MAX)
-		error = NLE_FAILURE;
-
-	return errmsg[error];
-}
-
-/**
- * Print a libnl error message
- * @arg s		error message prefix
- *
- * Prints the error message of the call that failed last.
- *
- * If s is not NULL and *s is not a null byte the argument
- * string is printed, followed by a colon and a blank. Then
- * the error message and a new-line.
- */
-void nl_perror(int error, const char *s)
-{
-	if (s && *s)
-		fprintf(stderr, "%s: %s\n", s, nl_geterror(error));
-	else
-		fprintf(stderr, "%s\n", nl_geterror(error));
-}
-
-int nl_syserr2nlerr(int error)
-{
-	error = abs(error);
-
-	switch (error) {
-	case EBADF:		return NLE_BAD_SOCK;
-	case EADDRINUSE:	return NLE_EXIST;
-	case EEXIST:		return NLE_EXIST;
-	case EADDRNOTAVAIL:	return NLE_NOADDR;
-	case ESRCH:		/* fall through */
-	case ENOENT:		return NLE_OBJ_NOTFOUND;
-	case EINTR:		return NLE_INTR;
-	case EAGAIN:		return NLE_AGAIN;
-	case ENOTSOCK:		return NLE_BAD_SOCK;
-	case ENOPROTOOPT:	return NLE_INVAL;
-	case EFAULT:		return NLE_INVAL;
-	case EACCES:		return NLE_NOACCESS;
-	case EINVAL:		return NLE_INVAL;
-	case ENOBUFS:		return NLE_NOMEM;
-	case ENOMEM:		return NLE_NOMEM;
-	case EAFNOSUPPORT:	return NLE_AF_NOSUPPORT;
-	case EPROTONOSUPPORT:	return NLE_PROTO_MISMATCH;
-	case EOPNOTSUPP:	return NLE_OPNOTSUPP;
-	case EPERM:		return NLE_PERM;
-	case EBUSY:		return NLE_BUSY;
-	case ERANGE:		return NLE_RANGE;
-	case ENODEV:		return NLE_NODEV;
-	default:		return NLE_FAILURE;
-	}
-}
-
-/** @} */
-
diff --git a/package/libs/libnl-tiny/src/genl.c b/package/libs/libnl-tiny/src/genl.c
deleted file mode 100644
index 055be919e1d3..000000000000
--- a/package/libs/libnl-tiny/src/genl.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * lib/genl/genl.c		Generic Netlink
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @defgroup genl Generic Netlink
- *
- * @par Message Format
- * @code
- *  <------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) --->
- * +----------------------------+- - -+- - - - - - - - - - -+- - -+
- * |           Header           | Pad |       Payload       | Pad |
- * |      struct nlmsghdr       |     |                     |     |
- * +----------------------------+- - -+- - - - - - - - - - -+- - -+
- * @endcode
- * @code
- *  <-------- GENL_HDRLEN -------> <--- hdrlen -->
- *                                 <------- genlmsg_len(ghdr) ------>
- * +------------------------+- - -+---------------+- - -+------------+
- * | Generic Netlink Header | Pad | Family Header | Pad | Attributes |
- * |    struct genlmsghdr   |     |               |     |            |
- * +------------------------+- - -+---------------+- - -+------------+
- * genlmsg_data(ghdr)--------------^                     ^
- * genlmsg_attrdata(ghdr, hdrlen)-------------------------
- * @endcode
- *
- * @par Example
- * @code
- * #include <netlink/netlink.h>
- * #include <netlink/genl/genl.h>
- * #include <netlink/genl/ctrl.h>
- *
- * struct nl_sock *sock;
- * struct nl_msg *msg;
- * int family;
- *
- * // Allocate a new netlink socket
- * sock = nl_socket_alloc();
- *
- * // Connect to generic netlink socket on kernel side
- * genl_connect(sock);
- *
- * // Ask kernel to resolve family name to family id
- * family = genl_ctrl_resolve(sock, "generic_netlink_family_name");
- *
- * // Construct a generic netlink by allocating a new message, fill in
- * // the header and append a simple integer attribute.
- * msg = nlmsg_alloc();
- * genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, NLM_F_ECHO,
- *             CMD_FOO_GET, FOO_VERSION);
- * nla_put_u32(msg, ATTR_FOO, 123);
- *
- * // Send message over netlink socket
- * nl_send_auto_complete(sock, msg);
- *
- * // Free message
- * nlmsg_free(msg);
- *
- * // Prepare socket to receive the answer by specifying the callback
- * // function to be called for valid messages.
- * nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, NULL);
- *
- * // Wait for the answer and receive it
- * nl_recvmsgs_default(sock);
- *
- * static int parse_cb(struct nl_msg *msg, void *arg)
- * {
- *     struct nlmsghdr *nlh = nlmsg_hdr(msg);
- *     struct nlattr *attrs[ATTR_MAX+1];
- *
- *     // Validate message and parse attributes
- *     genlmsg_parse(nlh, 0, attrs, ATTR_MAX, policy);
- *
- *     if (attrs[ATTR_FOO]) {
- *         uint32_t value = nla_get_u32(attrs[ATTR_FOO]);
- *         ...
- *     }
- *
- *     return 0;
- * }
- * @endcode
- * @{
- */
-
-#include <netlink-generic.h>
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/utils.h>
-
-/**
- * @name Socket Creating
- * @{
- */
-
-int genl_connect(struct nl_sock *sk)
-{
-	return nl_connect(sk, NETLINK_GENERIC);
-}
-
-/** @} */
-
-/**
- * @name Sending
- * @{
- */
-
-/**
- * Send trivial generic netlink message
- * @arg sk		Netlink socket.
- * @arg family		Generic netlink family
- * @arg cmd		Command
- * @arg version		Version
- * @arg flags		Additional netlink message flags.
- *
- * Fills out a routing netlink request message and sends it out
- * using nl_send_simple().
- *
- * @return 0 on success or a negative error code.
- */
-int genl_send_simple(struct nl_sock *sk, int family, int cmd,
-		     int version, int flags)
-{
-	struct genlmsghdr hdr = {
-		.cmd = cmd,
-		.version = version,
-	};
-
-	return nl_send_simple(sk, family, flags, &hdr, sizeof(hdr));
-}
-
-/** @} */
-
-
-/**
- * @name Message Parsing
- * @{
- */
-
-int genlmsg_valid_hdr(struct nlmsghdr *nlh, int hdrlen)
-{
-	struct genlmsghdr *ghdr;
-
-	if (!nlmsg_valid_hdr(nlh, GENL_HDRLEN))
-		return 0;
-
-	ghdr = nlmsg_data(nlh);
-	if (genlmsg_len(ghdr) < NLMSG_ALIGN(hdrlen))
-		return 0;
-
-	return 1;
-}
-
-int genlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype,
-		   struct nla_policy *policy)
-{
-	struct genlmsghdr *ghdr;
-
-	if (!genlmsg_valid_hdr(nlh, hdrlen))
-		return -NLE_MSG_TOOSHORT;
-
-	ghdr = nlmsg_data(nlh);
-	return nla_validate(genlmsg_attrdata(ghdr, hdrlen),
-			    genlmsg_attrlen(ghdr, hdrlen), maxtype, policy);
-}
-
-int genlmsg_parse(struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[],
-		  int maxtype, struct nla_policy *policy)
-{
-	struct genlmsghdr *ghdr;
-
-	if (!genlmsg_valid_hdr(nlh, hdrlen))
-		return -NLE_MSG_TOOSHORT;
-
-	ghdr = nlmsg_data(nlh);
-	return nla_parse(tb, maxtype, genlmsg_attrdata(ghdr, hdrlen),
-			 genlmsg_attrlen(ghdr, hdrlen), policy);
-}
-
-/**
- * Get head of message payload
- * @arg gnlh	genetlink messsage header
- */
-void *genlmsg_data(const struct genlmsghdr *gnlh)
-{
-	return ((unsigned char *) gnlh + GENL_HDRLEN);
-}
-
-/**
- * Get lenght of message payload
- * @arg gnlh	genetlink message header
- */
-int genlmsg_len(const struct genlmsghdr *gnlh)
-{
-	struct nlmsghdr *nlh = (struct nlmsghdr *)((unsigned char *)gnlh -
-							NLMSG_HDRLEN);
-	return (nlh->nlmsg_len - GENL_HDRLEN - NLMSG_HDRLEN);
-}
-
-/**
- * Get head of attribute data
- * @arg gnlh	generic netlink message header
- * @arg hdrlen	length of family specific header
- */
-struct nlattr *genlmsg_attrdata(const struct genlmsghdr *gnlh, int hdrlen)
-{
-	return genlmsg_data(gnlh) + NLMSG_ALIGN(hdrlen);
-}
-
-/**
- * Get length of attribute data
- * @arg gnlh	generic netlink message header
- * @arg hdrlen	length of family specific header
- */
-int genlmsg_attrlen(const struct genlmsghdr *gnlh, int hdrlen)
-{
-	return genlmsg_len(gnlh) - NLMSG_ALIGN(hdrlen);
-}
-
-/** @} */
-
-/**
- * @name Message Building
- * @{
- */
-
-/**
- * Add generic netlink header to netlink message
- * @arg msg		netlink message
- * @arg pid		netlink process id or NL_AUTO_PID
- * @arg seq		sequence number of message or NL_AUTO_SEQ
- * @arg family		generic netlink family
- * @arg hdrlen		length of user specific header
- * @arg flags		message flags
- * @arg cmd		generic netlink command
- * @arg version		protocol version
- *
- * Returns pointer to user specific header.
- */
-void *genlmsg_put(struct nl_msg *msg, uint32_t pid, uint32_t seq, int family,
-		  int hdrlen, int flags, uint8_t cmd, uint8_t version)
-{
-	struct nlmsghdr *nlh;
-	struct genlmsghdr hdr = {
-		.cmd = cmd,
-		.version = version,
-	};
-
-	nlh = nlmsg_put(msg, pid, seq, family, GENL_HDRLEN + hdrlen, flags);
-	if (nlh == NULL)
-		return NULL;
-
-	memcpy(nlmsg_data(nlh), &hdr, sizeof(hdr));
-	NL_DBG(2, "msg %p: Added generic netlink header cmd=%d version=%d\n",
-	       msg, cmd, version);
-
-	return nlmsg_data(nlh) + GENL_HDRLEN;
-}
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/genl_ctrl.c b/package/libs/libnl-tiny/src/genl_ctrl.c
deleted file mode 100644
index 0045459b2f1a..000000000000
--- a/package/libs/libnl-tiny/src/genl_ctrl.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * lib/genl/ctrl.c		Generic Netlink Controller
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup genl_mngt
- * @defgroup ctrl Controller
- * @brief
- *
- * @{
- */
-
-#include <netlink-generic.h>
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/family.h>
-#include <netlink/genl/mngt.h>
-#include <netlink/genl/ctrl.h>
-#include <netlink/utils.h>
-
-/** @cond SKIP */
-#define CTRL_VERSION		0x0001
-
-static struct nl_cache_ops genl_ctrl_ops;
-/** @endcond */
-
-static int ctrl_request_update(struct nl_cache *c, struct nl_sock *h)
-{
-	return genl_send_simple(h, GENL_ID_CTRL, CTRL_CMD_GETFAMILY,
-				CTRL_VERSION, NLM_F_DUMP);
-}
-
-static struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] = {
-	[CTRL_ATTR_FAMILY_ID]	= { .type = NLA_U16 },
-	[CTRL_ATTR_FAMILY_NAME]	= { .type = NLA_STRING,
-				    .maxlen = GENL_NAMSIZ },
-	[CTRL_ATTR_VERSION]	= { .type = NLA_U32 },
-	[CTRL_ATTR_HDRSIZE]	= { .type = NLA_U32 },
-	[CTRL_ATTR_MAXATTR]	= { .type = NLA_U32 },
-	[CTRL_ATTR_OPS]		= { .type = NLA_NESTED },
-	[CTRL_ATTR_MCAST_GROUPS] = { .type = NLA_NESTED },
-};
-
-static struct nla_policy family_op_policy[CTRL_ATTR_OP_MAX+1] = {
-	[CTRL_ATTR_OP_ID]	= { .type = NLA_U32 },
-	[CTRL_ATTR_OP_FLAGS]	= { .type = NLA_U32 },
-};
-
-static struct nla_policy family_grp_policy[CTRL_ATTR_MCAST_GRP_MAX+1] = {
-	[CTRL_ATTR_MCAST_GRP_NAME] = { .type = NLA_STRING },
-	[CTRL_ATTR_MCAST_GRP_ID]   = { .type = NLA_U32 },
-};
-
-static int ctrl_msg_parser(struct nl_cache_ops *ops, struct genl_cmd *cmd,
-			   struct genl_info *info, void *arg)
-{
-	struct genl_family *family;
-	struct nl_parser_param *pp = arg;
-	int err;
-
-	family = genl_family_alloc();
-	if (family == NULL) {
-		err = -NLE_NOMEM;
-		goto errout;
-	}
-
-	if (info->attrs[CTRL_ATTR_FAMILY_NAME] == NULL) {
-		err = -NLE_MISSING_ATTR;
-		goto errout;
-	}
-
-	if (info->attrs[CTRL_ATTR_FAMILY_ID] == NULL) {
-		err = -NLE_MISSING_ATTR;
-		goto errout;
-	}
-
-	family->ce_msgtype = info->nlh->nlmsg_type;
-	genl_family_set_id(family,
-			   nla_get_u16(info->attrs[CTRL_ATTR_FAMILY_ID]));
-	genl_family_set_name(family,
-		     nla_get_string(info->attrs[CTRL_ATTR_FAMILY_NAME]));
-
-	if (info->attrs[CTRL_ATTR_VERSION]) {
-		uint32_t version = nla_get_u32(info->attrs[CTRL_ATTR_VERSION]);
-		genl_family_set_version(family, version);
-	}
-
-	if (info->attrs[CTRL_ATTR_HDRSIZE]) {
-		uint32_t hdrsize = nla_get_u32(info->attrs[CTRL_ATTR_HDRSIZE]);
-		genl_family_set_hdrsize(family, hdrsize);
-	}
-
-	if (info->attrs[CTRL_ATTR_MAXATTR]) {
-		uint32_t maxattr = nla_get_u32(info->attrs[CTRL_ATTR_MAXATTR]);
-		genl_family_set_maxattr(family, maxattr);
-	}
-
-	if (info->attrs[CTRL_ATTR_OPS]) {
-		struct nlattr *nla, *nla_ops;
-		int remaining;
-
-		nla_ops = info->attrs[CTRL_ATTR_OPS];
-		nla_for_each_nested(nla, nla_ops, remaining) {
-			struct nlattr *tb[CTRL_ATTR_OP_MAX+1];
-			int flags = 0, id;
-
-			err = nla_parse_nested(tb, CTRL_ATTR_OP_MAX, nla,
-					       family_op_policy);
-			if (err < 0)
-				goto errout;
-
-			if (tb[CTRL_ATTR_OP_ID] == NULL) {
-				err = -NLE_MISSING_ATTR;
-				goto errout;
-			}
-			
-			id = nla_get_u32(tb[CTRL_ATTR_OP_ID]);
-
-			if (tb[CTRL_ATTR_OP_FLAGS])
-				flags = nla_get_u32(tb[CTRL_ATTR_OP_FLAGS]);
-
-			err = genl_family_add_op(family, id, flags);
-			if (err < 0)
-				goto errout;
-
-		}
-	}
-
-	if (info->attrs[CTRL_ATTR_MCAST_GROUPS]) {
-		struct nlattr *nla, *nla_grps;
-		int remaining;
-
-		nla_grps = info->attrs[CTRL_ATTR_MCAST_GROUPS];
-		nla_for_each_nested(nla, nla_grps, remaining) {
-			struct nlattr *tb[CTRL_ATTR_MCAST_GRP_MAX+1];
-			int id;
-			const char * name;
-
-			err = nla_parse_nested(tb, CTRL_ATTR_MCAST_GRP_MAX, nla,
-					       family_grp_policy);
-			if (err < 0)
-				goto errout;
-
-			if (tb[CTRL_ATTR_MCAST_GRP_ID] == NULL) {
-				err = -NLE_MISSING_ATTR;
-				goto errout;
-			}
-			id = nla_get_u32(tb[CTRL_ATTR_MCAST_GRP_ID]);
-
-			if (tb[CTRL_ATTR_MCAST_GRP_NAME] == NULL) {
-				err = -NLE_MISSING_ATTR;
-				goto errout;
-			}
-			name = nla_get_string(tb[CTRL_ATTR_MCAST_GRP_NAME]);
-
-			err = genl_family_add_grp(family, id, name);
-			if (err < 0)
-				goto errout;
-		}
-
-	}
-
-	err = pp->pp_cb((struct nl_object *) family, pp);
-errout:
-	genl_family_put(family);
-	return err;
-}
-
-/**
- * @name Cache Management
- * @{
- */
-
-int genl_ctrl_alloc_cache(struct nl_sock *sock, struct nl_cache **result)
-{
-	return nl_cache_alloc_and_fill(&genl_ctrl_ops, sock, result);
-}
-
-/**
- * Look up generic netlink family by id in the provided cache.
- * @arg cache		Generic netlink family cache.
- * @arg id		Family identifier.
- *
- * Searches through the cache looking for a registered family
- * matching the specified identifier. The caller will own a
- * reference on the returned object which needs to be given
- * back after usage using genl_family_put().
- *
- * @return Generic netlink family object or NULL if no match was found.
- */
-struct genl_family *genl_ctrl_search(struct nl_cache *cache, int id)
-{
-	struct genl_family *fam;
-
-	if (cache->c_ops != &genl_ctrl_ops)
-		BUG();
-
-	nl_list_for_each_entry(fam, &cache->c_items, ce_list) {
-		if (fam->gf_id == id) {
-			nl_object_get((struct nl_object *) fam);
-			return fam;
-		}
-	}
-
-	return NULL;
-}
-
-/**
- * @name Resolver
- * @{
- */
-
-/**
- * Look up generic netlink family by family name in the provided cache.
- * @arg cache		Generic netlink family cache.
- * @arg name		Family name.
- *
- * Searches through the cache looking for a registered family
- * matching the specified name. The caller will own a reference
- * on the returned object which needs to be given back after
- * usage using genl_family_put().
- *
- * @return Generic netlink family object or NULL if no match was found.
- */
-struct genl_family *genl_ctrl_search_by_name(struct nl_cache *cache,
-					    const char *name)
-{
-	struct genl_family *fam;
-
-	if (cache->c_ops != &genl_ctrl_ops)
-		BUG();
-
-	nl_list_for_each_entry(fam, &cache->c_items, ce_list) {
-		if (!strcmp(name, fam->gf_name)) {
-			nl_object_get((struct nl_object *) fam);
-			return fam;
-		}
-	}
-
-	return NULL;
-}
-
-/** @} */
-
-/**
- * Resolve generic netlink family name to its identifier
- * @arg sk		Netlink socket.
- * @arg name		Name of generic netlink family
- *
- * Resolves the generic netlink family name to its identifer and returns
- * it.
- *
- * @return A positive identifier or a negative error code.
- */
-int genl_ctrl_resolve(struct nl_sock *sk, const char *name)
-{
-	struct nl_cache *cache;
-	struct genl_family *family;
-	int err;
-
-	if ((err = genl_ctrl_alloc_cache(sk, &cache)) < 0)
-		return err;
-
-	family = genl_ctrl_search_by_name(cache, name);
-	if (family == NULL) {
-		err = -NLE_OBJ_NOTFOUND;
-		goto errout;
-	}
-
-	err = genl_family_get_id(family);
-	genl_family_put(family);
-errout:
-	nl_cache_free(cache);
-
-	return err;
-}
-
-static int genl_ctrl_grp_by_name(const struct genl_family *family,
-				const char *grp_name)
-{
-	struct genl_family_grp *grp;
-
-	nl_list_for_each_entry(grp, &family->gf_mc_grps, list) {
-		if (!strcmp(grp->name, grp_name)) {
-			return grp->id;
-		}
-	}
-
-	return -NLE_OBJ_NOTFOUND;
-}
-
-int genl_ctrl_resolve_grp(struct nl_sock *sk, const char *family_name,
-	const char *grp_name)
-{
-	struct nl_cache *cache;
-	struct genl_family *family;
-	int err;
-
-	if ((err = genl_ctrl_alloc_cache(sk, &cache)) < 0)
-		return err;
-
-	family = genl_ctrl_search_by_name(cache, family_name);
-	if (family == NULL) {
-		err = -NLE_OBJ_NOTFOUND;
-		goto errout;
-	}
-
-	err = genl_ctrl_grp_by_name(family, grp_name);
-	genl_family_put(family);
-errout:
-	nl_cache_free(cache);
-
-	return err;
-}
-
-/** @} */
-
-static struct genl_cmd genl_cmds[] = {
-	{
-		.c_id		= CTRL_CMD_NEWFAMILY,
-		.c_name		= "NEWFAMILY" ,
-		.c_maxattr	= CTRL_ATTR_MAX,
-		.c_attr_policy	= ctrl_policy,
-		.c_msg_parser	= ctrl_msg_parser,
-	},
-	{
-		.c_id		= CTRL_CMD_DELFAMILY,
-		.c_name		= "DELFAMILY" ,
-	},
-	{
-		.c_id		= CTRL_CMD_GETFAMILY,
-		.c_name		= "GETFAMILY" ,
-	},
-	{
-		.c_id		= CTRL_CMD_NEWOPS,
-		.c_name		= "NEWOPS" ,
-	},
-	{
-		.c_id		= CTRL_CMD_DELOPS,
-		.c_name		= "DELOPS" ,
-	},
-};
-
-static struct genl_ops genl_ops = {
-	.o_cmds			= genl_cmds,
-	.o_ncmds		= ARRAY_SIZE(genl_cmds),
-};
-
-/** @cond SKIP */
-extern struct nl_object_ops genl_family_ops;
-/** @endcond */
-
-static struct nl_cache_ops genl_ctrl_ops = {
-	.co_name		= "genl/family",
-	.co_hdrsize		= GENL_HDRSIZE(0),
-	.co_msgtypes		= GENL_FAMILY(GENL_ID_CTRL, "nlctrl"),
-	.co_genl		= &genl_ops,
-	.co_protocol		= NETLINK_GENERIC,
-	.co_request_update      = ctrl_request_update,
-	.co_obj_ops		= &genl_family_ops,
-};
-
-static void __init ctrl_init(void)
-{
-	genl_register(&genl_ctrl_ops);
-}
-
-static void __exit ctrl_exit(void)
-{
-	genl_unregister(&genl_ctrl_ops);
-}
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/genl_family.c b/package/libs/libnl-tiny/src/genl_family.c
deleted file mode 100644
index 221acfa1a7ff..000000000000
--- a/package/libs/libnl-tiny/src/genl_family.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * lib/genl/family.c		Generic Netlink Family
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup genl
- * @defgroup genl_family Generic Netlink Family
- * @brief
- *
- * @{
- */
-
-#include <netlink-generic.h>
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/family.h>
-#include <netlink/utils.h>
-
-struct nl_object_ops genl_family_ops;
-/** @endcond */
-
-static void family_constructor(struct nl_object *c)
-{
-	struct genl_family *family = (struct genl_family *) c;
-
-	nl_init_list_head(&family->gf_ops);
-	nl_init_list_head(&family->gf_mc_grps);
-}
-
-static void family_free_data(struct nl_object *c)
-{
-	struct genl_family *family = (struct genl_family *) c;
-	struct genl_family_op *ops, *tmp;
-	struct genl_family_grp *grp, *t_grp;
-
-	if (family == NULL)
-		return;
-
-	nl_list_for_each_entry_safe(ops, tmp, &family->gf_ops, o_list) {
-		nl_list_del(&ops->o_list);
-		free(ops);
-	}
-
-	nl_list_for_each_entry_safe(grp, t_grp, &family->gf_mc_grps, list) {
-		nl_list_del(&grp->list);
-		free(grp);
-	}
-
-}
-
-static int family_clone(struct nl_object *_dst, struct nl_object *_src)
-{
-	struct genl_family *dst = nl_object_priv(_dst);
-	struct genl_family *src = nl_object_priv(_src);
-	struct genl_family_op *ops;
-	struct genl_family_grp *grp;
-	int err;
-
-	nl_list_for_each_entry(ops, &src->gf_ops, o_list) {
-		err = genl_family_add_op(dst, ops->o_id, ops->o_flags);
-		if (err < 0)
-			return err;
-	}
-
-	nl_list_for_each_entry(grp, &src->gf_mc_grps, list) {
-		err = genl_family_add_grp(dst, grp->id, grp->name);
-		if (err < 0)
-			return err;
-	}
-
-	
-	return 0;
-}
-
-static int family_compare(struct nl_object *_a, struct nl_object *_b,
-			  uint32_t attrs, int flags)
-{
-	struct genl_family *a = (struct genl_family *) _a;
-	struct genl_family *b = (struct genl_family *) _b;
-	int diff = 0;
-
-#define FAM_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, FAMILY_ATTR_##ATTR, a, b, EXPR)
-
-	diff |= FAM_DIFF(ID,		a->gf_id != b->gf_id);
-	diff |= FAM_DIFF(VERSION,	a->gf_version != b->gf_version);
-	diff |= FAM_DIFF(HDRSIZE,	a->gf_hdrsize != b->gf_hdrsize);
-	diff |= FAM_DIFF(MAXATTR,	a->gf_maxattr != b->gf_maxattr);
-	diff |= FAM_DIFF(NAME,		strcmp(a->gf_name, b->gf_name));
-
-#undef FAM_DIFF
-
-	return diff;
-}
-
-
-/**
- * @name Family Object
- * @{
- */
-
-struct genl_family *genl_family_alloc(void)
-{
-	return (struct genl_family *) nl_object_alloc(&genl_family_ops);
-}
-
-void genl_family_put(struct genl_family *family)
-{
-	nl_object_put((struct nl_object *) family);
-}
-
-/** @} */
-
-
-int genl_family_add_op(struct genl_family *family, int id, int flags)
-{
-	struct genl_family_op *op;
-
-	op = calloc(1, sizeof(*op));
-	if (op == NULL)
-		return -NLE_NOMEM;
-
-	op->o_id = id;
-	op->o_flags = flags;
-
-	nl_list_add_tail(&op->o_list, &family->gf_ops);
-	family->ce_mask |= FAMILY_ATTR_OPS;
-
-	return 0;
-}
-
-int genl_family_add_grp(struct genl_family *family, uint32_t id,
-			const char *name)
-{
-	struct genl_family_grp *grp;
-
-	grp = calloc(1, sizeof(*grp));
-	if (grp == NULL)
-		return -NLE_NOMEM;
-
-	grp->id = id;
-	strncpy(grp->name, name, GENL_NAMSIZ - 1);
-
-	nl_list_add_tail(&grp->list, &family->gf_mc_grps);
-
-	return 0;
-}
-
-/** @} */
-
-/** @cond SKIP */
-struct nl_object_ops genl_family_ops = {
-	.oo_name		= "genl/family",
-	.oo_size		= sizeof(struct genl_family),
-	.oo_constructor		= family_constructor,
-	.oo_free_data		= family_free_data,
-	.oo_clone		= family_clone,
-	.oo_compare		= family_compare,
-	.oo_id_attrs		= FAMILY_ATTR_ID,
-};
-/** @endcond */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/genl_mngt.c b/package/libs/libnl-tiny/src/genl_mngt.c
deleted file mode 100644
index 246521f696a2..000000000000
--- a/package/libs/libnl-tiny/src/genl_mngt.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * lib/genl/mngt.c		Generic Netlink Management
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup genl
- * @defgroup genl_mngt Management
- *
- * @par 1) Registering a generic netlink module
- * @code
- * #include <netlink/genl/mngt.h>
- *
- * // First step is to define all the commands being used in
- * // particular generic netlink family. The ID and name are
- * // mandatory to be filled out. A callback function and
- * // most the attribute policy that comes with it must be
- * // defined for commands expected to be issued towards
- * // userspace.
- * static struct genl_cmd foo_cmds[] = {
- * 	{
- * 		.c_id		= FOO_CMD_NEW,
- * 		.c_name		= "NEWFOO" ,
- * 		.c_maxattr	= FOO_ATTR_MAX,
- * 		.c_attr_policy	= foo_policy,
- * 		.c_msg_parser	= foo_msg_parser,
- * 	},
- * 	{
- * 		.c_id		= FOO_CMD_DEL,
- * 		.c_name		= "DELFOO" ,
- * 	},
- * };
- *
- * // The list of commands must then be integrated into a
- * // struct genl_ops serving as handle for this particular
- * // family.
- * static struct genl_ops my_genl_ops = {
- * 	.o_cmds			= foo_cmds,
- * 	.o_ncmds		= ARRAY_SIZE(foo_cmds),
- * };
- *
- * // Using the above struct genl_ops an arbitary number of
- * // cache handles can be associated to it.
- * //
- * // The macro GENL_HDRSIZE() must be used to specify the
- * // length of the header to automatically take headers on
- * // generic layers into account.
- * //
- * // The macro GENL_FAMILY() is used to represent the generic
- * // netlink family id.
- * static struct nl_cache_ops genl_foo_ops = {
- * 	.co_name		= "genl/foo",
- * 	.co_hdrsize		= GENL_HDRSIZE(sizeof(struct my_hdr)),
- * 	.co_msgtypes		= GENL_FAMILY(GENL_ID_GENERATE, "foo"),
- * 	.co_genl		= &my_genl_ops,
- * 	.co_protocol		= NETLINK_GENERIC,
- * 	.co_request_update      = foo_request_update,
- * 	.co_obj_ops		= &genl_foo_ops,
- * };
- *
- * // Finally each cache handle for a generic netlink family
- * // must be registered using genl_register().
- * static void __init foo_init(void)
- * {
- * 	genl_register(&genl_foo_ops);
- * }
- *
- * // ... respectively unregsted again.
- * static void __exit foo_exit(void)
- * {
- * 	genl_unregister(&genl_foo_ops);
- * }
- * @endcode
- * @{
- */
-
-#include <netlink-generic.h>
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/mngt.h>
-#include <netlink/genl/family.h>
-#include <netlink/genl/ctrl.h>
-#include <netlink/utils.h>
-
-static NL_LIST_HEAD(genl_ops_list);
-
-static int genl_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
-			   struct nlmsghdr *nlh, struct nl_parser_param *pp)
-{
-	int i, err;
-	struct genlmsghdr *ghdr;
-	struct genl_cmd *cmd;
-
-	ghdr = nlmsg_data(nlh);
-
-	if (ops->co_genl == NULL)
-		BUG();
-
-	for (i = 0; i < ops->co_genl->o_ncmds; i++) {
-		cmd = &ops->co_genl->o_cmds[i];
-		if (cmd->c_id == ghdr->cmd)
-			goto found;
-	}
-
-	err = -NLE_MSGTYPE_NOSUPPORT;
-	goto errout;
-
-found:
-	if (cmd->c_msg_parser == NULL)
-		err = -NLE_OPNOTSUPP;
-	else {
-		struct nlattr *tb[cmd->c_maxattr + 1];
-		struct genl_info info = {
-			.who = who,
-			.nlh = nlh,
-			.genlhdr = ghdr,
-			.userhdr = genlmsg_data(ghdr),
-			.attrs = tb,
-		};
-
-		err = nlmsg_parse(nlh, ops->co_hdrsize, tb, cmd->c_maxattr,
-				  cmd->c_attr_policy);
-		if (err < 0)
-			goto errout;
-
-		err = cmd->c_msg_parser(ops, cmd, &info, pp);
-	}
-errout:
-	return err;
-
-}
-
-/**
- * @name Register/Unregister
- * @{
- */
-
-/**
- * Register generic netlink operations
- * @arg ops		cache operations
- */
-int genl_register(struct nl_cache_ops *ops)
-{
-	int err;
-
-	if (ops->co_protocol != NETLINK_GENERIC) {
-		err = -NLE_PROTO_MISMATCH;
-		goto errout;
-	}
-
-	if (ops->co_hdrsize < GENL_HDRSIZE(0)) {
-		err = -NLE_INVAL;
-		goto errout;
-	}
-
-	if (ops->co_genl == NULL) {
-		err = -NLE_INVAL;
-		goto errout;
-	}
-
-	ops->co_genl->o_cache_ops = ops;
-	ops->co_genl->o_name = ops->co_msgtypes[0].mt_name;
-	ops->co_genl->o_family = ops->co_msgtypes[0].mt_id;
-	ops->co_msg_parser = genl_msg_parser;
-
-	/* FIXME: check for dup */
-
-	nl_list_add_tail(&ops->co_genl->o_list, &genl_ops_list);
-
-	err = nl_cache_mngt_register(ops);
-errout:
-	return err;
-}
-
-/**
- * Unregister generic netlink operations
- * @arg ops		cache operations
- */
-void genl_unregister(struct nl_cache_ops *ops)
-{
-	nl_cache_mngt_unregister(ops);
-	nl_list_del(&ops->co_genl->o_list);
-}
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/handlers.c b/package/libs/libnl-tiny/src/handlers.c
deleted file mode 100644
index 12ebda5207ee..000000000000
--- a/package/libs/libnl-tiny/src/handlers.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * lib/handlers.c	default netlink message handlers
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup core
- * @defgroup cb Callbacks/Customization
- *
- * @details
- * @par 1) Setting up a callback set
- * @code
- * // Allocate a callback set and initialize it to the verbose default set
- * struct nl_cb *cb = nl_cb_alloc(NL_CB_VERBOSE);
- *
- * // Modify the set to call my_func() for all valid messages
- * nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, my_func, NULL);
- *
- * // Set the error message handler to the verbose default implementation
- * // and direct it to print all errors to the given file descriptor.
- * FILE *file = fopen(...);
- * nl_cb_err(cb, NL_CB_VERBOSE, NULL, file);
- * @endcode
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-#include <netlink/msg.h>
-#include <netlink/handlers.h>
-
-/**
- * @name Callback Handle Management
- * @{
- */
-
-/**
- * Allocate a new callback handle
- * @arg kind		callback kind to be used for initialization
- * @return Newly allocated callback handle or NULL
- */
-struct nl_cb *nl_cb_alloc(enum nl_cb_kind kind)
-{
-	int i;
-	struct nl_cb *cb;
-
-	if (kind < 0 || kind > NL_CB_KIND_MAX)
-		return NULL;
-
-	cb = calloc(1, sizeof(*cb));
-	if (!cb)
-		return NULL;
-
-	cb->cb_refcnt = 1;
-
-	for (i = 0; i <= NL_CB_TYPE_MAX; i++)
-		nl_cb_set(cb, i, kind, NULL, NULL);
-
-	nl_cb_err(cb, kind, NULL, NULL);
-
-	return cb;
-}
-
-/**
- * Clone an existing callback handle
- * @arg orig		original callback handle
- * @return Newly allocated callback handle being a duplicate of
- *         orig or NULL
- */
-struct nl_cb *nl_cb_clone(struct nl_cb *orig)
-{
-	struct nl_cb *cb;
-	
-	cb = nl_cb_alloc(NL_CB_DEFAULT);
-	if (!cb)
-		return NULL;
-
-	memcpy(cb, orig, sizeof(*orig));
-	cb->cb_refcnt = 1;
-
-	return cb;
-}
-
-void nl_cb_put(struct nl_cb *cb)
-{
-	if (!cb)
-		return;
-
-	cb->cb_refcnt--;
-
-	if (cb->cb_refcnt < 0)
-		BUG();
-
-	if (cb->cb_refcnt <= 0)
-		free(cb);
-}
-
-/** @} */
-
-/**
- * @name Callback Setup
- * @{
- */
-
-/**
- * Set up a callback 
- * @arg cb		callback set
- * @arg type		callback to modify
- * @arg kind		kind of implementation
- * @arg func		callback function (NL_CB_CUSTOM)
- * @arg arg		argument passed to callback
- *
- * @return 0 on success or a negative error code
- */
-int nl_cb_set(struct nl_cb *cb, enum nl_cb_type type, enum nl_cb_kind kind,
-	      nl_recvmsg_msg_cb_t func, void *arg)
-{
-	if (type < 0 || type > NL_CB_TYPE_MAX)
-		return -NLE_RANGE;
-
-	if (kind < 0 || kind > NL_CB_KIND_MAX)
-		return -NLE_RANGE;
-
-	if (kind == NL_CB_CUSTOM) {
-		cb->cb_set[type] = func;
-		cb->cb_args[type] = arg;
-	}
-
-	return 0;
-}
-
-/**
- * Set up an error callback
- * @arg cb		callback set
- * @arg kind		kind of callback
- * @arg func		callback function
- * @arg arg		argument to be passed to callback function
- */
-int nl_cb_err(struct nl_cb *cb, enum nl_cb_kind kind,
-	      nl_recvmsg_err_cb_t func, void *arg)
-{
-	if (kind < 0 || kind > NL_CB_KIND_MAX)
-		return -NLE_RANGE;
-
-	if (kind == NL_CB_CUSTOM) {
-		cb->cb_err = func;
-		cb->cb_err_arg = arg;
-	}
-
-	return 0;
-}
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/include/netlink-generic.h b/package/libs/libnl-tiny/src/include/netlink-generic.h
deleted file mode 100644
index 10aa2f01bb1a..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink-generic.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * netlink-generic.h	Local Generic Netlink Interface
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_GENL_PRIV_H_
-#define NETLINK_GENL_PRIV_H_
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-
-#define GENL_HDRSIZE(hdrlen) (GENL_HDRLEN + (hdrlen))
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink-local.h b/package/libs/libnl-tiny/src/include/netlink-local.h
deleted file mode 100644
index 53da8ca97e40..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink-local.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * netlink-local.h		Local Netlink Interface
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_LOCAL_H_
-#define NETLINK_LOCAL_H_
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <math.h>
-#include <time.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <inttypes.h>
-#include <assert.h>
-#include <limits.h>
-
-#include <arpa/inet.h>
-#include <netdb.h>
-
-#ifndef SOL_NETLINK
-#define SOL_NETLINK 270
-#endif
-
-#include <linux/types.h>
-
-/* local header copies */
-#include <linux/if.h>
-#include <linux/if_arp.h>
-#include <linux/if_ether.h>
-#include <linux/pkt_sched.h>
-#include <linux/pkt_cls.h>
-#include <linux/gen_stats.h>
-
-#include <netlink/netlink.h>
-#include <netlink/handlers.h>
-#include <netlink/cache.h>
-#include <netlink/object-api.h>
-#include <netlink/cache-api.h>
-#include <netlink-types.h>
-
-struct trans_tbl {
-	int i;
-	const char *a;
-};
-
-#define __ADD(id, name) { .i = id, .a = #name },
-
-struct trans_list {
-	int i;
-	char *a;
-	struct nl_list_head list;
-};
-
-#define NL_DEBUG	1
-
-#define NL_DBG(LVL,FMT,ARG...) \
-	do {} while (0)
-
-#define BUG()                            \
-	do {                                 \
-		fprintf(stderr, "BUG: %s:%d\n",  \
-			__FILE__, __LINE__);         \
-		assert(0);	\
-	} while (0)
-
-extern int __nl_read_num_str_file(const char *path,
-				  int (*cb)(long, const char *));
-
-extern int __trans_list_add(int, const char *, struct nl_list_head *);
-extern void __trans_list_clear(struct nl_list_head *);
-
-extern char *__type2str(int, char *, size_t, struct trans_tbl *, size_t);
-extern int __str2type(const char *, struct trans_tbl *, size_t);
-
-extern char *__list_type2str(int, char *, size_t, struct nl_list_head *);
-extern int __list_str2type(const char *, struct nl_list_head *);
-
-extern char *__flags2str(int, char *, size_t, struct trans_tbl *, size_t);
-extern int __str2flags(const char *, struct trans_tbl *, size_t);
-
-extern void dump_from_ops(struct nl_object *, struct nl_dump_params *);
-
-#ifdef disabled
-static inline struct nl_cache *dp_cache(struct nl_object *obj)
-{
-	if (obj->ce_cache == NULL)
-		return nl_cache_mngt_require(obj->ce_ops->oo_name);
-
-	return obj->ce_cache;
-}
-#endif
-
-static inline int nl_cb_call(struct nl_cb *cb, int type, struct nl_msg *msg)
-{
-	return cb->cb_set[type](msg, cb->cb_args[type]);
-}
-
-#define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0]))
-#ifndef offsetof
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-#endif
-
-#define __init __attribute__ ((constructor))
-#define __exit __attribute__ ((destructor))
-#undef __deprecated
-#define __deprecated __attribute__ ((deprecated))
-
-#define min(x,y) ({ \
-	typeof(x) _x = (x);	\
-	typeof(y) _y = (y);	\
-	(void) (&_x == &_y);		\
-	_x < _y ? _x : _y; })
-
-#define max(x,y) ({ \
-	typeof(x) _x = (x);	\
-	typeof(y) _y = (y);	\
-	(void) (&_x == &_y);		\
-	_x > _y ? _x : _y; })
-
-extern int nl_cache_parse(struct nl_cache_ops *, struct sockaddr_nl *,
-			  struct nlmsghdr *, struct nl_parser_param *);
-
-
-static inline char *nl_cache_name(struct nl_cache *cache)
-{
-	return cache->c_ops ? cache->c_ops->co_name : "unknown";
-}
-
-#define GENL_FAMILY(id, name) \
-	{ \
-		{ id, NL_ACT_UNSPEC, name }, \
-		END_OF_MSGTYPES_LIST, \
-	}
-
-static inline int wait_for_ack(struct nl_sock *sk)
-{
-	if (sk->s_flags & NL_NO_AUTO_ACK)
-		return 0;
-	else
-		return nl_wait_for_ack(sk);
-}
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink-types.h b/package/libs/libnl-tiny/src/include/netlink-types.h
deleted file mode 100644
index 65f7f6c0b858..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink-types.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * netlink-types.h	Netlink Types (Private)
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_LOCAL_TYPES_H_
-#define NETLINK_LOCAL_TYPES_H_
-
-#include <netlink/list.h>
-
-struct nl_cache_ops;
-struct nl_sock;
-struct nl_object;
-
-struct nl_cache
-{
-	struct nl_list_head	c_items;
-	int			c_nitems;
-	int                     c_iarg1;
-	int                     c_iarg2;
-	struct nl_cache_ops *   c_ops;
-};
-
-struct nl_cache_assoc
-{
-	struct nl_cache *	ca_cache;
-	change_func_t		ca_change;
-};
-
-struct nl_cache_mngr
-{
-	int			cm_protocol;
-	int			cm_flags;
-	int			cm_nassocs;
-	struct nl_sock *	cm_handle;
-	struct nl_cache_assoc *	cm_assocs;
-};
-
-struct nl_parser_param;
-
-#define LOOSE_COMPARISON	1
-
-
-struct nl_data
-{
-	size_t			d_size;
-	void *			d_data;
-};
-
-struct nl_addr
-{
-	int			a_family;
-	unsigned int		a_maxsize;
-	unsigned int		a_len;
-	int			a_prefixlen;
-	int			a_refcnt;
-	char			a_addr[0];
-};
-
-#define IFQDISCSIZ	32
-
-#define GENL_OP_HAS_POLICY	1
-#define GENL_OP_HAS_DOIT	2
-#define GENL_OP_HAS_DUMPIT	4
-
-struct genl_family_grp {
-	struct genl_family	*family;	/* private */
-	struct nl_list_head	list;		/* private */
-	char			name[GENL_NAMSIZ];
-	u_int32_t		id;
-};
-
-struct genl_family_op
-{
-	uint32_t		o_id;
-	uint32_t		o_flags;
-
-	struct nl_list_head	o_list;
-};
-
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/addr.h b/package/libs/libnl-tiny/src/include/netlink/addr.h
deleted file mode 100644
index cc3d201f9781..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/addr.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * netlink/addr.h		Abstract Address
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_ADDR_H_
-#define NETLINK_ADDR_H_
-
-#include <netlink/netlink.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nl_addr;
-
-/* Creation */
-extern struct nl_addr *	nl_addr_alloc(size_t);
-extern struct nl_addr *	nl_addr_alloc_attr(struct nlattr *, int);
-extern struct nl_addr *	nl_addr_build(int, void *, size_t);
-extern int		nl_addr_parse(const char *, int, struct nl_addr **);
-extern struct nl_addr *	nl_addr_clone(struct nl_addr *);
-
-/* Destroyage */
-extern void		nl_addr_destroy(struct nl_addr *);
-
-/* Usage Management */
-extern struct nl_addr *	nl_addr_get(struct nl_addr *);
-extern void		nl_addr_put(struct nl_addr *);
-extern int		nl_addr_shared(struct nl_addr *);
-
-extern int		nl_addr_cmp(struct nl_addr *, struct nl_addr *);
-extern int		nl_addr_cmp_prefix(struct nl_addr *, struct nl_addr *);
-extern int		nl_addr_iszero(struct nl_addr *);
-extern int		nl_addr_valid(char *, int);
-extern int      	nl_addr_guess_family(struct nl_addr *);
-extern int		nl_addr_fill_sockaddr(struct nl_addr *,
-					      struct sockaddr *, socklen_t *);
-extern int		nl_addr_info(struct nl_addr *, struct addrinfo **);
-extern int		nl_addr_resolve(struct nl_addr *addr, char *host, size_t hostlen);
-
-/* Access Functions */
-extern void		nl_addr_set_family(struct nl_addr *, int);
-extern int		nl_addr_get_family(struct nl_addr *);
-extern int		nl_addr_set_binary_addr(struct nl_addr *, void *,
-						size_t);
-extern void *		nl_addr_get_binary_addr(struct nl_addr *);
-extern unsigned int	nl_addr_get_len(struct nl_addr *);
-extern void		nl_addr_set_prefixlen(struct nl_addr *, int);
-extern unsigned int	nl_addr_get_prefixlen(struct nl_addr *);
-
-/* Address Family Translations */
-extern char *		nl_af2str(int, char *, size_t);
-extern int		nl_str2af(const char *);
-
-/* Translations to Strings */
-extern char *		nl_addr2str(struct nl_addr *, char *, size_t);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/attr.h b/package/libs/libnl-tiny/src/include/netlink/attr.h
deleted file mode 100644
index 3b56a82dc66e..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/attr.h
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- * netlink/attr.h		Netlink Attributes
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_ATTR_H_
-#define NETLINK_ATTR_H_
-
-#include <netlink/netlink.h>
-#include <netlink/object.h>
-#include <netlink/addr.h>
-#include <netlink/data.h>
-#include <netlink/msg.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nl_msg;
-
-/**
- * @name Basic Attribute Data Types
- * @{
- */
-
- /**
-  * @ingroup attr
-  * Basic attribute data types
-  *
-  * See \ref attr_datatypes for more details.
-  */
-enum {
-	NLA_UNSPEC,	/**< Unspecified type, binary data chunk */
-	NLA_U8,		/**< 8 bit integer */
-	NLA_U16,	/**< 16 bit integer */
-	NLA_U32,	/**< 32 bit integer */
-	NLA_U64,	/**< 64 bit integer */
-	NLA_STRING,	/**< NUL terminated character string */
-	NLA_FLAG,	/**< Flag */
-	NLA_MSECS,	/**< Micro seconds (64bit) */
-	NLA_NESTED,	/**< Nested attributes */
-	__NLA_TYPE_MAX,
-};
-
-#define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1)
-
-/** @} */
-
-/**
- * @ingroup attr
- * Attribute validation policy.
- *
- * See \ref attr_datatypes for more details.
- */
-struct nla_policy {
-	/** Type of attribute or NLA_UNSPEC */
-	uint16_t	type;
-
-	/** Minimal length of payload required */
-	uint16_t	minlen;
-
-	/** Maximal length of payload allowed */
-	uint16_t	maxlen;
-};
-
-/* Attribute parsing */
-extern int		nla_ok(const struct nlattr *, int);
-extern struct nlattr *	nla_next(const struct nlattr *, int *);
-extern int		nla_parse(struct nlattr **, int, struct nlattr *,
-				  int, struct nla_policy *);
-extern int		nla_validate(struct nlattr *, int, int,
-				     struct nla_policy *);
-extern struct nlattr *	nla_find(struct nlattr *, int, int);
-
-/* Unspecific attribute */
-extern struct nlattr *	nla_reserve(struct nl_msg *, int, int);
-extern int		nla_put(struct nl_msg *, int, int, const void *);
-
-/**
- * nlmsg_find_attr - find a specific attribute in a netlink message
- * @arg nlh		netlink message header
- * @arg hdrlen		length of familiy specific header
- * @arg attrtype	type of attribute to look for
- *
- * Returns the first attribute which matches the specified type.
- */
-static inline struct nlattr *nlmsg_find_attr(struct nlmsghdr *nlh, int hdrlen, int attrtype)
-{
-	return nla_find(nlmsg_attrdata(nlh, hdrlen),
-			nlmsg_attrlen(nlh, hdrlen), attrtype);
-}
-
-
-/**
- * Return size of attribute whithout padding.
- * @arg payload		Payload length of attribute.
- *
- * @code
- *    <-------- nla_attr_size(payload) --------->
- *   +------------------+- - -+- - - - - - - - - +- - -+
- *   | Attribute Header | Pad |     Payload      | Pad |
- *   +------------------+- - -+- - - - - - - - - +- - -+
- * @endcode
- *
- * @return Size of attribute in bytes without padding.
- */
-static inline int nla_attr_size(int payload)
-{
-	return NLA_HDRLEN + payload;
-}
-
-/**
- * Return size of attribute including padding.
- * @arg payload		Payload length of attribute.
- *
- * @code
- *    <----------- nla_total_size(payload) ----------->
- *   +------------------+- - -+- - - - - - - - - +- - -+
- *   | Attribute Header | Pad |     Payload      | Pad |
- *   +------------------+- - -+- - - - - - - - - +- - -+
- * @endcode
- *
- * @return Size of attribute in bytes.
- */
-static inline int nla_total_size(int payload)
-{
-	return NLA_ALIGN(nla_attr_size(payload));
-}
-
-/**
- * Return length of padding at the tail of the attribute.
- * @arg payload		Payload length of attribute.
- *
- * @code
- *   +------------------+- - -+- - - - - - - - - +- - -+
- *   | Attribute Header | Pad |     Payload      | Pad |
- *   +------------------+- - -+- - - - - - - - - +- - -+
- *                                                <--->  
- * @endcode
- *
- * @return Length of padding in bytes.
- */
-static inline int nla_padlen(int payload)
-{
-	return nla_total_size(payload) - nla_attr_size(payload);
-}
-
-/**
- * Return type of the attribute.
- * @arg nla		Attribute.
- *
- * @return Type of attribute.
- */
-static inline int nla_type(const struct nlattr *nla)
-{
-	return nla->nla_type & NLA_TYPE_MASK;
-}
-
-/**
- * Return pointer to the payload section.
- * @arg nla		Attribute.
- *
- * @return Pointer to start of payload section.
- */
-static inline void *nla_data(const struct nlattr *nla)
-{
-	return (char *) nla + NLA_HDRLEN;
-}
-
-/**
- * Return length of the payload .
- * @arg nla		Attribute
- *
- * @return Length of payload in bytes.
- */
-static inline int nla_len(const struct nlattr *nla)
-{
-	return nla->nla_len - NLA_HDRLEN;
-}
-
-/**
- * Copy attribute payload to another memory area.
- * @arg dest		Pointer to destination memory area.
- * @arg src		Attribute
- * @arg count		Number of bytes to copy at most.
- *
- * Note: The number of bytes copied is limited by the length of
- *       the attribute payload.
- *
- * @return The number of bytes copied to dest.
- */
-static inline int nla_memcpy(void *dest, struct nlattr *src, int count)
-{
-	int minlen;
-
-	if (!src)
-		return 0;
-	
-	minlen = min_t(int, count, nla_len(src));
-	memcpy(dest, nla_data(src), minlen);
-
-	return minlen;
-}
-
-
-/**
- * Add abstract data as unspecific attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg data		Abstract data object.
- *
- * Equivalent to nla_put() except that the length of the payload is
- * derived from the abstract data object.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_data(struct nl_msg *msg, int attrtype, struct nl_data *data)
-{
-	return nla_put(msg, attrtype, nl_data_get_size(data),
-		       nl_data_get(data));
-}
-
-/**
- * Add abstract address as unspecific attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg addr		Abstract address object.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_addr(struct nl_msg *msg, int attrtype, struct nl_addr *addr)
-{
-	return nla_put(msg, attrtype, nl_addr_get_len(addr),
-		       nl_addr_get_binary_addr(addr));
-}
-
-/** @} */
-
-/**
- * @name Integer Attributes
- */
-
-/**
- * Add 8 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value to store as payload.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_u8(struct nl_msg *msg, int attrtype, uint8_t value)
-{
-	return nla_put(msg, attrtype, sizeof(uint8_t), &value);
-}
-
-/**
- * Return value of 8 bit integer attribute.
- * @arg nla		8 bit integer attribute
- *
- * @return Payload as 8 bit integer.
- */
-static inline uint8_t nla_get_u8(struct nlattr *nla)
-{
-	return *(uint8_t *) nla_data(nla);
-}
-
-/**
- * Add 16 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value to store as payload.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_u16(struct nl_msg *msg, int attrtype, uint16_t value)
-{
-	return nla_put(msg, attrtype, sizeof(uint16_t), &value);
-}
-
-/**
- * Return payload of 16 bit integer attribute.
- * @arg nla		16 bit integer attribute
- *
- * @return Payload as 16 bit integer.
- */
-static inline uint16_t nla_get_u16(struct nlattr *nla)
-{
-	return *(uint16_t *) nla_data(nla);
-}
-
-/**
- * Add 32 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value to store as payload.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_u32(struct nl_msg *msg, int attrtype, uint32_t value)
-{
-	return nla_put(msg, attrtype, sizeof(uint32_t), &value);
-}
-
-/**
- * Return payload of 32 bit integer attribute.
- * @arg nla		32 bit integer attribute.
- *
- * @return Payload as 32 bit integer.
- */
-static inline uint32_t nla_get_u32(struct nlattr *nla)
-{
-	return *(uint32_t *) nla_data(nla);
-}
-
-/**
- * Add 64 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value to store as payload.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_u64(struct nl_msg *msg, int attrtype, uint64_t value)
-{
-	return nla_put(msg, attrtype, sizeof(uint64_t), &value);
-}
-
-/**
- * Return payload of u64 attribute
- * @arg nla		u64 netlink attribute
- *
- * @return Payload as 64 bit integer.
- */
-static inline uint64_t nla_get_u64(struct nlattr *nla)
-{
-	uint64_t tmp;
-
-	nla_memcpy(&tmp, nla, sizeof(tmp));
-
-	return tmp;
-}
-
-/**
- * Add string attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg str		NUL terminated string.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_string(struct nl_msg *msg, int attrtype, const char *str)
-{
-	return nla_put(msg, attrtype, strlen(str) + 1, str);
-}
-
-/**
- * Return payload of string attribute.
- * @arg nla		String attribute.
- *
- * @return Pointer to attribute payload.
- */
-static inline char *nla_get_string(struct nlattr *nla)
-{
-	return (char *) nla_data(nla);
-}
-
-static inline char *nla_strdup(struct nlattr *nla)
-{
-	return strdup(nla_get_string(nla));
-}
-
-/** @} */
-
-/**
- * @name Flag Attribute
- */
-
-/**
- * Add flag netlink attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_flag(struct nl_msg *msg, int attrtype)
-{
-	return nla_put(msg, attrtype, 0, NULL);
-}
-
-/**
- * Return true if flag attribute is set.
- * @arg nla		Flag netlink attribute.
- *
- * @return True if flag is set, otherwise false.
- */
-static inline int nla_get_flag(struct nlattr *nla)
-{
-	return !!nla;
-}
-
-/** @} */
-
-/**
- * @name Microseconds Attribute
- */
-
-/**
- * Add a msecs netlink attribute to a netlink message
- * @arg n		netlink message
- * @arg attrtype	attribute type
- * @arg msecs 		number of msecs
- */
-static inline int nla_put_msecs(struct nl_msg *n, int attrtype, unsigned long msecs)
-{
-	return nla_put_u64(n, attrtype, msecs);
-}
-
-/**
- * Return payload of msecs attribute
- * @arg nla		msecs netlink attribute
- *
- * @return the number of milliseconds.
- */
-static inline unsigned long nla_get_msecs(struct nlattr *nla)
-{
-	return nla_get_u64(nla);
-}
-
-/**
- * Add nested attributes to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg nested		Message containing attributes to be nested.
- *
- * Takes the attributes found in the \a nested message and appends them
- * to the message \a msg nested in a container of the type \a attrtype.
- * The \a nested message may not have a family specific header.
- *
- * @see nla_put
- * @return 0 on success or a negative error code.
- */
-static inline int nla_put_nested(struct nl_msg *msg, int attrtype, struct nl_msg *nested)
-{
-	return nla_put(msg, attrtype, nlmsg_len(nested->nm_nlh),
-		       nlmsg_data(nested->nm_nlh));
-}
-
-/**
- * Start a new level of nested attributes.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type of container.
- *
- * @return Pointer to container attribute.
- */
-static inline struct nlattr *nla_nest_start(struct nl_msg *msg, int attrtype)
-{
-	struct nlattr *start = (struct nlattr *) nlmsg_tail(msg->nm_nlh);
-
-	if (nla_put(msg, attrtype, 0, NULL) < 0)
-		return NULL;
-
-	return start;
-}
-
-/**
- * Finalize nesting of attributes.
- * @arg msg		Netlink message.
- * @arg start		Container attribute as returned from nla_nest_start().
- *
- * Corrects the container attribute header to include the appeneded attributes.
- *
- * @return 0
- */
-static inline int nla_nest_end(struct nl_msg *msg, struct nlattr *start)
-{
-	start->nla_len = (unsigned char *) nlmsg_tail(msg->nm_nlh) -
-				(unsigned char *) start;
-	return 0;
-}
-
-/**
- * Create attribute index based on nested attribute
- * @arg tb		Index array to be filled (maxtype+1 elements).
- * @arg maxtype		Maximum attribute type expected and accepted.
- * @arg nla		Nested Attribute.
- * @arg policy		Attribute validation policy.
- *
- * Feeds the stream of attributes nested into the specified attribute
- * to nla_parse().
- *
- * @see nla_parse
- * @return 0 on success or a negative error code.
- */
-static inline int nla_parse_nested(struct nlattr *tb[], int maxtype, struct nlattr *nla,
-		     struct nla_policy *policy)
-{
-	return nla_parse(tb, maxtype, (struct nlattr *)nla_data(nla), nla_len(nla), policy);
-}
-
-/**
- * Compare attribute payload with memory area.
- * @arg nla		Attribute.
- * @arg data		Memory area to compare to.
- * @arg size		Number of bytes to compare.
- *
- * @see memcmp(3)
- * @return An integer less than, equal to, or greater than zero.
- */
-static inline int nla_memcmp(const struct nlattr *nla, const void *data, size_t size)
-{
-	int d = nla_len(nla) - size;
-
-	if (d == 0)
-		d = memcmp(nla_data(nla), data, size);
-
-	return d;
-}
-
-/**
- * Compare string attribute payload with string
- * @arg nla		Attribute of type NLA_STRING.
- * @arg str		NUL terminated string.
- *
- * @see strcmp(3)
- * @return An integer less than, equal to, or greater than zero.
- */
-static inline int nla_strcmp(const struct nlattr *nla, const char *str)
-{
-	int len = strlen(str) + 1;
-	int d = nla_len(nla) - len;
-
-	if (d == 0)
-		d = memcmp(nla_data(nla), str, len);
-
-	return d;
-}
-
-/**
- * Copy string attribute payload to a buffer.
- * @arg dst		Pointer to destination buffer.
- * @arg nla		Attribute of type NLA_STRING.
- * @arg dstsize		Size of destination buffer in bytes.
- *
- * Copies at most dstsize - 1 bytes to the destination buffer.
- * The result is always a valid NUL terminated string. Unlike
- * strlcpy the destination buffer is always padded out.
- *
- * @return The length of string attribute without the terminating NUL.
- */
-static inline size_t nla_strlcpy(char *dst, const struct nlattr *nla, size_t dstsize)
-{
-	size_t srclen = (size_t)nla_len(nla);
-	char *src = (char*)nla_data(nla);
-
-	if (srclen > 0 && src[srclen - 1] == '\0')
-		srclen--;
-
-	if (dstsize > 0) {
-		size_t len = (srclen >= dstsize) ? dstsize - 1 : srclen;
-
-		memset(dst, 0, dstsize);
-		memcpy(dst, src, len);
-	}
-
-	return srclen;
-}
-
-
-/**
- * @name Attribute Construction (Exception Based)
- * @{
- */
-
-/**
- * @ingroup attr
- * Add unspecific attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg attrlen		Length of attribute payload.
- * @arg data		Head of attribute payload.
- */
-#define NLA_PUT(msg, attrtype, attrlen, data) \
-	do { \
-		if (nla_put(msg, attrtype, attrlen, data) < 0) \
-			goto nla_put_failure; \
-	} while(0)
-
-/**
- * @ingroup attr
- * Add atomic type attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg type		Atomic type.
- * @arg attrtype	Attribute type.
- * @arg value		Head of attribute payload.
- */
-#define NLA_PUT_TYPE(msg, type, attrtype, value) \
-	do { \
-		type __tmp = value; \
-		NLA_PUT(msg, attrtype, sizeof(type), &__tmp); \
-	} while(0)
-
-/**
- * Add 8 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value.
- */
-#define NLA_PUT_U8(msg, attrtype, value) \
-	NLA_PUT_TYPE(msg, uint8_t, attrtype, value)
-
-/**
- * Add 16 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value.
- */
-#define NLA_PUT_U16(msg, attrtype, value) \
-	NLA_PUT_TYPE(msg, uint16_t, attrtype, value)
-
-/**
- * Add 32 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value.
- */
-#define NLA_PUT_U32(msg, attrtype, value) \
-	NLA_PUT_TYPE(msg, uint32_t, attrtype, value)
-
-/**
- * Add 64 bit integer attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		Numeric value.
- */
-#define NLA_PUT_U64(msg, attrtype, value) \
-	NLA_PUT_TYPE(msg, uint64_t, attrtype, value)
-
-/**
- * Add string attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg value		NUL terminated character string.
- */
-#define NLA_PUT_STRING(msg, attrtype, value) \
-	NLA_PUT(msg, attrtype, strlen(value) + 1, value)
-
-/**
- * Add flag attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- */
-#define NLA_PUT_FLAG(msg, attrtype) \
-	NLA_PUT(msg, attrtype, 0, NULL)
-
-/**
- * Add msecs attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg msecs		Numeric value in micro seconds.
- */
-#define NLA_PUT_MSECS(msg, attrtype, msecs) \
-	NLA_PUT_U64(msg, attrtype, msecs)
-
-/**
- * Add address attribute to netlink message.
- * @arg msg		Netlink message.
- * @arg attrtype	Attribute type.
- * @arg addr		Abstract address object.
- */
-#define NLA_PUT_ADDR(msg, attrtype, addr) \
-	NLA_PUT(msg, attrtype, nl_addr_get_len(addr), \
-		nl_addr_get_binary_addr(addr))
-
-/** @} */
-
-/**
- * @name Iterators
- * @{
- */
-
-/**
- * @ingroup attr
- * Iterate over a stream of attributes
- * @arg pos	loop counter, set to current attribute
- * @arg head	head of attribute stream
- * @arg len	length of attribute stream
- * @arg rem	initialized to len, holds bytes currently remaining in stream
- */
-#define nla_for_each_attr(pos, head, len, rem) \
-	for (pos = head, rem = len; \
-	     nla_ok(pos, rem); \
-	     pos = nla_next(pos, &(rem)))
-
-/**
- * @ingroup attr
- * Iterate over a stream of nested attributes
- * @arg pos	loop counter, set to current attribute
- * @arg nla	attribute containing the nested attributes
- * @arg rem	initialized to len, holds bytes currently remaining in stream
- */
-#define nla_for_each_nested(pos, nla, rem) \
-	for (pos = (struct nlattr *)nla_data(nla), rem = nla_len(nla); \
-	     nla_ok(pos, rem); \
-	     pos = nla_next(pos, &(rem)))
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/cache-api.h b/package/libs/libnl-tiny/src/include/netlink/cache-api.h
deleted file mode 100644
index 22fc449d1b91..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/cache-api.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * netlink/cache-api.h		Caching API
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_CACHE_API_H_
-#define NETLINK_CACHE_API_H_
-
-#include <netlink/netlink.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @ingroup cache
- * @defgroup cache_api Cache Implementation
- * @brief
- *
- * @par 1) Cache Definition
- * @code
- * struct nl_cache_ops my_cache_ops = {
- * 	.co_name		= "route/link",
- * 	.co_protocol		= NETLINK_ROUTE,
- * 	.co_hdrsize		= sizeof(struct ifinfomsg),
- * 	.co_obj_ops		= &my_obj_ops,
- * };
- * @endcode
- *
- * @par 2) 
- * @code
- * // The simplest way to fill a cache is by providing a request-update
- * // function which must trigger a complete dump on the kernel-side of
- * // whatever the cache covers.
- * static int my_request_update(struct nl_cache *cache,
- * 				struct nl_sock *socket)
- * {
- * 	// In this example, we request a full dump of the interface table
- * 	return nl_rtgen_request(socket, RTM_GETLINK, AF_UNSPEC, NLM_F_DUMP);
- * }
- *
- * // The resulting netlink messages sent back will be fed into a message
- * // parser one at a time. The message parser has to extract all relevant
- * // information from the message and create an object reflecting the
- * // contents of the message and pass it on to the parser callback function
- * // provide which will add the object to the cache.
- * static int my_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
- * 			    struct nlmsghdr *nlh, struct nl_parser_param *pp)
- * {
- * 	struct my_obj *obj;
- *
- * 	obj = my_obj_alloc();
- * 	obj->ce_msgtype = nlh->nlmsg_type;
- *
- * 	// Parse the netlink message and continue creating the object.
- *
- * 	err = pp->pp_cb((struct nl_object *) obj, pp);
- * 	if (err < 0)
- * 		goto errout;
- * }
- *
- * struct nl_cache_ops my_cache_ops = {
- * 	...
- * 	.co_request_update	= my_request_update,
- * 	.co_msg_parser		= my_msg_parser,
- * };
- * @endcode
- *
- * @par 3) Notification based Updates
- * @code
- * // Caches can be kept up-to-date based on notifications if the kernel
- * // sends out notifications whenever an object is added/removed/changed.
- * //
- * // It is trivial to support this, first a list of groups needs to be
- * // defined which are required to join in order to receive all necessary
- * // notifications. The groups are separated by address family to support
- * // the common situation where a separate group is used for each address
- * // family. If there is only one group, simply specify AF_UNSPEC.
- * static struct nl_af_group addr_groups[] = {
- * 	{ AF_INET,	RTNLGRP_IPV4_IFADDR },
- * 	{ AF_INET6,	RTNLGRP_IPV6_IFADDR },
- * 	{ END_OF_GROUP_LIST },
- * };
- *
- * // In order for the caching system to know the meaning of each message
- * // type it requires a table which maps each supported message type to
- * // a cache action, e.g. RTM_NEWADDR means address has been added or
- * // updated, RTM_DELADDR means address has been removed.
- * static struct nl_cache_ops rtnl_addr_ops = {
- * 	...
- * 	.co_msgtypes		= {
- * 					{ RTM_NEWADDR, NL_ACT_NEW, "new" },
- * 					{ RTM_DELADDR, NL_ACT_DEL, "del" },
- * 					{ RTM_GETADDR, NL_ACT_GET, "get" },
- * 					END_OF_MSGTYPES_LIST,
- * 				},
- * 	.co_groups		= addr_groups,
- * };
- *
- * // It is now possible to keep the cache up-to-date using the cache manager.
- * @endcode
- * @{
- */
-
-enum {
-	NL_ACT_UNSPEC,
-	NL_ACT_NEW,
-	NL_ACT_DEL,
-	NL_ACT_GET,
-	NL_ACT_SET,
-	NL_ACT_CHANGE,
-	__NL_ACT_MAX,
-};
-
-#define NL_ACT_MAX (__NL_ACT_MAX - 1)
-
-#define END_OF_MSGTYPES_LIST	{ -1, -1, NULL }
-
-/**
- * Message type to cache action association
- */
-struct nl_msgtype
-{
-	/** Netlink message type */
-	int			mt_id;
-
-	/** Cache action to take */
-	int			mt_act;
-
-	/** Name of operation for human-readable printing */
-	char *			mt_name;
-};
-
-/**
- * Address family to netlink group association
- */
-struct nl_af_group
-{
-	/** Address family */
-	int			ag_family;
-
-	/** Netlink group identifier */
-	int			ag_group;
-};
-
-#define END_OF_GROUP_LIST AF_UNSPEC, 0
-
-struct nl_parser_param
-{
-	int             (*pp_cb)(struct nl_object *, struct nl_parser_param *);
-	void *            pp_arg;
-};
-
-/**
- * Cache Operations
- */
-struct nl_cache_ops
-{
-	char  *			co_name;
-
-	int			co_hdrsize;
-	int			co_protocol;
-	struct nl_af_group *	co_groups;
-	
-	/**
-	 * Called whenever an update of the cache is required. Must send
-	 * a request message to the kernel requesting a complete dump.
-	 */
-	int   (*co_request_update)(struct nl_cache *, struct nl_sock *);
-
-	/**
-	 * Called whenever a message was received that needs to be parsed.
-	 * Must parse the message and call the paser callback function
-	 * (nl_parser_param) provided via the argument.
-	 */
-	int   (*co_msg_parser)(struct nl_cache_ops *, struct sockaddr_nl *,
-			       struct nlmsghdr *, struct nl_parser_param *);
-
-	struct nl_object_ops *	co_obj_ops;
-
-	struct nl_cache_ops *co_next;
-	struct nl_cache *co_major_cache;
-	struct genl_ops *	co_genl;
-	struct nl_msgtype	co_msgtypes[];
-};
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/cache.h b/package/libs/libnl-tiny/src/include/netlink/cache.h
deleted file mode 100644
index 09719f3a740e..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/cache.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * netlink/cache.h		Caching Module
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_CACHE_H_
-#define NETLINK_CACHE_H_
-
-#include <netlink/netlink.h>
-#include <netlink/msg.h>
-#include <netlink/utils.h>
-#include <netlink/object.h>
-#include <netlink/cache-api.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nl_cache;
-
-typedef void (*change_func_t)(struct nl_cache *, struct nl_object *, int);
-
-/* Access Functions */
-extern int			nl_cache_nitems(struct nl_cache *);
-extern int			nl_cache_nitems_filter(struct nl_cache *,
-						       struct nl_object *);
-extern struct nl_cache_ops *	nl_cache_get_ops(struct nl_cache *);
-extern struct nl_object *	nl_cache_get_first(struct nl_cache *);
-extern struct nl_object *	nl_cache_get_last(struct nl_cache *);
-extern struct nl_object *	nl_cache_get_next(struct nl_object *);
-extern struct nl_object *	nl_cache_get_prev(struct nl_object *);
-
-extern struct nl_cache *	nl_cache_alloc(struct nl_cache_ops *);
-extern int			nl_cache_alloc_and_fill(struct nl_cache_ops *,
-							struct nl_sock *,
-							struct nl_cache **);
-extern int			nl_cache_alloc_name(const char *,
-						    struct nl_cache **);
-extern struct nl_cache *	nl_cache_subset(struct nl_cache *,
-						struct nl_object *);
-extern void			nl_cache_clear(struct nl_cache *);
-extern void			nl_cache_free(struct nl_cache *);
-
-/* Cache modification */
-extern int			nl_cache_add(struct nl_cache *,
-					     struct nl_object *);
-extern int			nl_cache_parse_and_add(struct nl_cache *,
-						       struct nl_msg *);
-extern void			nl_cache_remove(struct nl_object *);
-extern int			nl_cache_refill(struct nl_sock *,
-						struct nl_cache *);
-extern int			nl_cache_pickup(struct nl_sock *,
-						struct nl_cache *);
-extern int			nl_cache_resync(struct nl_sock *,
-						struct nl_cache *,
-						change_func_t);
-extern int			nl_cache_include(struct nl_cache *,
-						 struct nl_object *,
-						 change_func_t);
-
-/* General */
-extern int			nl_cache_is_empty(struct nl_cache *);
-extern void			nl_cache_mark_all(struct nl_cache *);
-
-/* Dumping */
-extern void			nl_cache_dump(struct nl_cache *,
-					      struct nl_dump_params *);
-extern void			nl_cache_dump_filter(struct nl_cache *,
-						     struct nl_dump_params *,
-						     struct nl_object *);
-
-/* Iterators */
-#ifdef disabled
-extern void			nl_cache_foreach(struct nl_cache *,
-						 void (*cb)(struct nl_object *,
-							    void *),
-						 void *arg);
-extern void			nl_cache_foreach_filter(struct nl_cache *,
-							struct nl_object *,
-							void (*cb)(struct
-								   nl_object *,
-								   void *),
-							void *arg);
-#endif
-
-/* --- cache management --- */
-
-/* Cache type management */
-extern struct nl_cache_ops *	nl_cache_ops_lookup(const char *);
-extern struct nl_cache_ops *	nl_cache_ops_associate(int, int);
-extern struct nl_msgtype *	nl_msgtype_lookup(struct nl_cache_ops *, int);
-extern void			nl_cache_ops_foreach(void (*cb)(struct nl_cache_ops *, void *), void *);
-extern int			nl_cache_mngt_register(struct nl_cache_ops *);
-extern int			nl_cache_mngt_unregister(struct nl_cache_ops *);
-
-/* Global cache provisioning/requiring */
-extern void			nl_cache_mngt_provide(struct nl_cache *);
-extern void			nl_cache_mngt_unprovide(struct nl_cache *);
-extern struct nl_cache *	nl_cache_mngt_require(const char *);
-
-struct nl_cache_mngr;
-
-#define NL_AUTO_PROVIDE		1
-
-extern int			nl_cache_mngr_alloc(struct nl_sock *,
-						    int, int,
-						    struct nl_cache_mngr **);
-extern int			nl_cache_mngr_add(struct nl_cache_mngr *,
-						  const char *,
-						  change_func_t,
-						  struct nl_cache **);
-extern int			nl_cache_mngr_get_fd(struct nl_cache_mngr *);
-extern int			nl_cache_mngr_poll(struct nl_cache_mngr *,
-						   int);
-extern int			nl_cache_mngr_data_ready(struct nl_cache_mngr *);
-extern void			nl_cache_mngr_free(struct nl_cache_mngr *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/data.h b/package/libs/libnl-tiny/src/include/netlink/data.h
deleted file mode 100644
index 071159ee5b30..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/data.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * netlink/data.h	Abstract Data
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_DATA_H_
-#define NETLINK_DATA_H_
-
-#include <netlink/netlink.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nl_data;
-
-/* General */
-extern struct nl_data *	nl_data_alloc(void *, size_t);
-extern struct nl_data * nl_data_alloc_attr(struct nlattr *);
-extern struct nl_data *	nl_data_clone(struct nl_data *);
-extern int		nl_data_append(struct nl_data *, void *, size_t);
-extern void		nl_data_free(struct nl_data *);
-
-/* Access Functions */
-extern void *		nl_data_get(struct nl_data *);
-extern size_t		nl_data_get_size(struct nl_data *);
-
-/* Misc */
-extern int		nl_data_cmp(struct nl_data *, struct nl_data *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/errno.h b/package/libs/libnl-tiny/src/include/netlink/errno.h
deleted file mode 100644
index f8b5130c22e1..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/errno.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * netlink/errno.h		Error Numbers
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_ERRNO_H_
-#define NETLINK_ERRNO_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#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
-#define NLE_PARSE_ERR		30
-#define NLE_NODEV		31
-#define NLE_IMMUTABLE		32
-#define NLE_DUMP_INTR		33
-
-#define NLE_MAX			NLE_DUMP_INTR
-
-extern const char *	nl_geterror(int);
-extern void		nl_perror(int, const char *);
-extern int		nl_syserr2nlerr(int);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/genl/ctrl.h b/package/libs/libnl-tiny/src/include/netlink/genl/ctrl.h
deleted file mode 100644
index 26a0a9967b47..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/genl/ctrl.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * netlink/genl/ctrl.h		Generic Netlink Controller
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_GENL_CTRL_H_
-#define NETLINK_GENL_CTRL_H_
-
-#include <netlink/netlink.h>
-#include <netlink/cache.h>
-#include <netlink/addr.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct genl_family;
-
-extern int			genl_ctrl_alloc_cache(struct nl_sock *,
-						      struct nl_cache **);
-extern struct genl_family *	genl_ctrl_search(struct nl_cache *, int);
-extern struct genl_family *	genl_ctrl_search_by_name(struct nl_cache *,
-							 const char *);
-extern int			genl_ctrl_resolve(struct nl_sock *,
-						  const char *);
-extern int 			genl_ctrl_resolve_grp(struct nl_sock *sk,
-						      const char *family,
-						      const char *grp);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/genl/family.h b/package/libs/libnl-tiny/src/include/netlink/genl/family.h
deleted file mode 100644
index 8a1a38ba25d5..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/genl/family.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * netlink/genl/family.h	Generic Netlink Family
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_GENL_FAMILY_H_
-#define NETLINK_GENL_FAMILY_H_
-
-#include <netlink/netlink.h>
-#include <netlink/cache.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** @cond SKIP */
-#define FAMILY_ATTR_ID		0x01
-#define FAMILY_ATTR_NAME	0x02
-#define FAMILY_ATTR_VERSION	0x04
-#define FAMILY_ATTR_HDRSIZE	0x08
-#define FAMILY_ATTR_MAXATTR	0x10
-#define FAMILY_ATTR_OPS		0x20
-
-
-struct genl_family
-{
-	NLHDR_COMMON
-
-	uint16_t		gf_id;
-	char 			gf_name[GENL_NAMSIZ];
-	uint32_t		gf_version;
-	uint32_t		gf_hdrsize;
-	uint32_t		gf_maxattr;
-
-	struct nl_list_head	gf_ops;
-	struct nl_list_head	gf_mc_grps;
-};
-
-
-extern struct genl_family *	genl_family_alloc(void);
-extern void			genl_family_put(struct genl_family *);
-
-extern int			genl_family_add_op(struct genl_family *,
-						   int, int);
-extern int 			genl_family_add_grp(struct genl_family *,
-					uint32_t , const char *);
-
-
-/**
- * @name Attributes
- * @{
- */
-
-static inline unsigned int genl_family_get_id(struct genl_family *family)
-{
-	if (family->ce_mask & FAMILY_ATTR_ID)
-		return family->gf_id;
-	else
-		return 0;
-}
-
-static inline void genl_family_set_id(struct genl_family *family, unsigned int id)
-{
-	family->gf_id = id;
-	family->ce_mask |= FAMILY_ATTR_ID;
-}
-
-static inline char *genl_family_get_name(struct genl_family *family)
-{
-	if (family->ce_mask & FAMILY_ATTR_NAME)
-		return family->gf_name;
-	else
-		return NULL;
-}
-
-static inline void genl_family_set_name(struct genl_family *family, const char *name)
-{
-	strncpy(family->gf_name, name, GENL_NAMSIZ-1);
-	family->ce_mask |= FAMILY_ATTR_NAME;
-}
-
-static inline uint8_t genl_family_get_version(struct genl_family *family)
-{
-	if (family->ce_mask & FAMILY_ATTR_VERSION)
-		return family->gf_version;
-	else
-		return 0;
-}
-
-static inline void genl_family_set_version(struct genl_family *family, uint8_t version)
-{
-	family->gf_version = version;
-	family->ce_mask |= FAMILY_ATTR_VERSION;
-}
-
-static inline uint32_t genl_family_get_hdrsize(struct genl_family *family)
-{
-	if (family->ce_mask & FAMILY_ATTR_HDRSIZE)
-		return family->gf_hdrsize;
-	else
-		return 0;
-}
-
-static inline void genl_family_set_hdrsize(struct genl_family *family, uint32_t hdrsize)
-{
-	family->gf_hdrsize = hdrsize;
-	family->ce_mask |= FAMILY_ATTR_HDRSIZE;
-}
-
-static inline uint32_t genl_family_get_maxattr(struct genl_family *family)
-{
-	if (family->ce_mask & FAMILY_ATTR_MAXATTR)
-		return family->gf_maxattr;
-	else
-		return family->gf_maxattr;
-}
-
-static inline void genl_family_set_maxattr(struct genl_family *family, uint32_t maxattr)
-{
-	family->gf_maxattr = maxattr;
-	family->ce_mask |= FAMILY_ATTR_MAXATTR;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/genl/genl.h b/package/libs/libnl-tiny/src/include/netlink/genl/genl.h
deleted file mode 100644
index 3f3340cfdc7b..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/genl/genl.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * netlink/genl/genl.h		Generic Netlink
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_GENL_H_
-#define NETLINK_GENL_H_
-
-#include <netlink/netlink.h>
-#include <netlink/msg.h>
-#include <netlink/attr.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int		genl_connect(struct nl_sock *);
-
-extern int		genl_send_simple(struct nl_sock *, int, int,
-					 int, int);
-
-extern void *		genlmsg_put(struct nl_msg *, uint32_t, uint32_t,
-				    int, int, int, uint8_t, uint8_t);
-
-extern int		genlmsg_valid_hdr(struct nlmsghdr *, int);
-extern int		genlmsg_validate(struct nlmsghdr *, int, int,
-					 struct nla_policy *);
-extern int		genlmsg_parse(struct nlmsghdr *, int, struct nlattr **,
-				      int, struct nla_policy *);
-extern void *		genlmsg_data(const struct genlmsghdr *);
-extern int		genlmsg_len(const struct genlmsghdr *);
-extern struct nlattr *	genlmsg_attrdata(const struct genlmsghdr *, int);
-extern int		genlmsg_attrlen(const struct genlmsghdr *, int);
-
-extern char *		genl_op2name(int, int, char *, size_t);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/genl/mngt.h b/package/libs/libnl-tiny/src/include/netlink/genl/mngt.h
deleted file mode 100644
index 8b0244f2cca1..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/genl/mngt.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * netlink/genl/mngt.h		Generic Netlink Management
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_GENL_MNGT_H_
-#define NETLINK_GENL_MNGT_H_
-
-#include <netlink/netlink.h>
-#include <netlink/attr.h>
-#include <netlink/list.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nl_cache_ops;
-
-struct genl_info
-{
-	struct sockaddr_nl *    who;
-	struct nlmsghdr *       nlh;
-	struct genlmsghdr *     genlhdr;
-	void *                  userhdr;
-	struct nlattr **        attrs;
-};
-
-/**
- * @ingroup genl_mngt
- * Generic Netlink Command
- */
-struct genl_cmd
-{
-	/** Unique command identifier */
-	int			c_id;
-
-	/** Name/description of command */
-	char *			c_name;
-
-	/**
-	 * Maximum attribute identifier, must be provided if
-	 * a message parser is available.
-	 */
-	int			c_maxattr;
-
-	int		      (*c_msg_parser)(struct nl_cache_ops *,
-					      struct genl_cmd *,
-					      struct genl_info *, void *);
-
-	/**
-	 * Attribute validation policy (optional)
-	 */
-	struct nla_policy *	c_attr_policy;
-};
-
-/**
- * @ingroup genl_mngt
- * Generic Netlink Operations
- */
-struct genl_ops
-{
-	int			o_family;
-	int			o_id;
-	char *			o_name;
-	struct nl_cache_ops *	o_cache_ops;
-	struct genl_cmd	*	o_cmds;
-	int			o_ncmds;
-
-	/* linked list of all genl cache operations */
-	struct nl_list_head	o_list;
-};
-
-
-extern int		genl_register(struct nl_cache_ops *);
-extern void		genl_unregister(struct nl_cache_ops *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/handlers.h b/package/libs/libnl-tiny/src/include/netlink/handlers.h
deleted file mode 100644
index f5c933d0d713..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/handlers.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * netlink/handlers.c	default netlink message handlers
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_HANDLERS_H_
-#define NETLINK_HANDLERS_H_
-
-#include <stdio.h>
-#include <stdint.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netlink/netlink-compat.h>
-#include <netlink/netlink-kernel.h>
-#include <netlink/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nl_sock;
-struct nl_msg;
-struct nl_cb;
-/**
- * @name Callback Typedefs
- * @{
- */
-
-/**
- * nl_recvmsgs() callback for message processing customization
- * @ingroup cb
- * @arg msg		netlink message being processed
- * @arg arg		argument passwd on through caller
- */
-typedef int (*nl_recvmsg_msg_cb_t)(struct nl_msg *msg, void *arg);
-
-/**
- * nl_recvmsgs() callback for error message processing customization
- * @ingroup cb
- * @arg nla		netlink address of the peer
- * @arg nlerr		netlink error message being processed
- * @arg arg		argument passed on through caller
- */
-typedef int (*nl_recvmsg_err_cb_t)(struct sockaddr_nl *nla,
-				   struct nlmsgerr *nlerr, void *arg);
-
-/** @} */
-
-/**
- * Callback actions
- * @ingroup cb
- */
-enum nl_cb_action {
-	/** Proceed with wathever would come next */
-	NL_OK,
-	/** Skip this message */
-	NL_SKIP,
-	/** Stop parsing altogether and discard remaining messages */
-	NL_STOP,
-};
-
-/**
- * Callback kinds
- * @ingroup cb
- */
-enum nl_cb_kind {
-	/** Default handlers (quiet) */
-	NL_CB_DEFAULT,
-	/** Verbose default handlers (error messages printed) */
-	NL_CB_VERBOSE,
-	/** Debug handlers for debugging */
-	NL_CB_DEBUG,
-	/** Customized handler specified by the user */
-	NL_CB_CUSTOM,
-	__NL_CB_KIND_MAX,
-};
-
-#define NL_CB_KIND_MAX (__NL_CB_KIND_MAX - 1)
-
-/**
- * Callback types
- * @ingroup cb
- */
-enum nl_cb_type {
-	/** Message is valid */
-	NL_CB_VALID,
-	/** Last message in a series of multi part messages received */
-	NL_CB_FINISH,
-	/** Report received that data was lost */
-	NL_CB_OVERRUN,
-	/** Message wants to be skipped */
-	NL_CB_SKIPPED,
-	/** Message is an acknowledge */
-	NL_CB_ACK,
-	/** Called for every message received */
-	NL_CB_MSG_IN,
-	/** Called for every message sent out except for nl_sendto() */
-	NL_CB_MSG_OUT,
-	/** Message is malformed and invalid */
-	NL_CB_INVALID,
-	/** Called instead of internal sequence number checking */
-	NL_CB_SEQ_CHECK,
-	/** Sending of an acknowledge message has been requested */
-	NL_CB_SEND_ACK,
-	__NL_CB_TYPE_MAX,
-};
-
-#define NL_CB_TYPE_MAX (__NL_CB_TYPE_MAX - 1)
-
-struct nl_cb
-{
-	nl_recvmsg_msg_cb_t	cb_set[NL_CB_TYPE_MAX+1];
-	void *			cb_args[NL_CB_TYPE_MAX+1];
-	
-	nl_recvmsg_err_cb_t	cb_err;
-	void *			cb_err_arg;
-
-	/** May be used to replace nl_recvmsgs with your own implementation
-	 * in all internal calls to nl_recvmsgs. */
-	int			(*cb_recvmsgs_ow)(struct nl_sock *,
-						  struct nl_cb *);
-
-	/** Overwrite internal calls to nl_recv, must return the number of
-	 * octets read and allocate a buffer for the received data. */
-	int			(*cb_recv_ow)(struct nl_sock *,
-					      struct sockaddr_nl *,
-					      unsigned char **,
-					      struct ucred **);
-
-	/** Overwrites internal calls to nl_send, must send the netlink
-	 * message. */
-	int			(*cb_send_ow)(struct nl_sock *,
-					      struct nl_msg *);
-
-	int			cb_refcnt;
-};
-
-
-extern struct nl_cb *	nl_cb_alloc(enum nl_cb_kind);
-extern struct nl_cb *	nl_cb_clone(struct nl_cb *);
-extern void		nl_cb_put(struct nl_cb *);
-
-extern int  nl_cb_set(struct nl_cb *, enum nl_cb_type, enum nl_cb_kind,
-		      nl_recvmsg_msg_cb_t, void *);
-extern int  nl_cb_err(struct nl_cb *, enum nl_cb_kind, nl_recvmsg_err_cb_t,
-		      void *);
-
-static inline struct nl_cb *nl_cb_get(struct nl_cb *cb)
-{
-	cb->cb_refcnt++;
-
-	return cb;
-}
-
-/**
- * Set up a all callbacks
- * @arg cb		callback set
- * @arg kind		kind of callback
- * @arg func		callback function
- * @arg arg		argument to be passwd to callback function
- *
- * @return 0 on success or a negative error code
- */
-static inline int nl_cb_set_all(struct nl_cb *cb, enum nl_cb_kind kind,
-		  nl_recvmsg_msg_cb_t func, void *arg)
-{
-	int i, err;
-
-	for (i = 0; i <= NL_CB_TYPE_MAX; i++) {
-		err = nl_cb_set(cb,(enum nl_cb_type)i, kind, func, arg);
-		if (err < 0)
-			return err;
-	}
-
-	return 0;
-}
-
-
-/**
- * @name Overwriting
- * @{
- */
-
-/**
- * Overwrite internal calls to nl_recvmsgs()
- * @arg cb		callback set
- * @arg func		replacement callback for nl_recvmsgs()
- */
-static inline void nl_cb_overwrite_recvmsgs(struct nl_cb *cb,
-			      int (*func)(struct nl_sock *, struct nl_cb *))
-{
-	cb->cb_recvmsgs_ow = func;
-}
-
-/**
- * Overwrite internal calls to nl_recv()
- * @arg cb		callback set
- * @arg func		replacement callback for nl_recv()
- */
-static inline void nl_cb_overwrite_recv(struct nl_cb *cb,
-			  int (*func)(struct nl_sock *, struct sockaddr_nl *,
-				      unsigned char **, struct ucred **))
-{
-	cb->cb_recv_ow = func;
-}
-
-/**
- * Overwrite internal calls to nl_send()
- * @arg cb		callback set
- * @arg func		replacement callback for nl_send()
- */
-static inline void nl_cb_overwrite_send(struct nl_cb *cb,
-			  int (*func)(struct nl_sock *, struct nl_msg *))
-{
-	cb->cb_send_ow = func;
-}
-
-/** @} */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/list.h b/package/libs/libnl-tiny/src/include/netlink/list.h
deleted file mode 100644
index c6876a77f76c..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/list.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * netlink/list.h	Netlink List Utilities
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_LIST_H_
-#define NETLINK_LIST_H_
-
-struct nl_list_head
-{
-	struct nl_list_head *	next;
-	struct nl_list_head *	prev;
-};
-
-
-static inline void __nl_list_add(struct nl_list_head *obj,
-				 struct nl_list_head *prev,
-				 struct nl_list_head *next)
-{
-	prev->next = obj;
-	obj->prev = prev;
-	next->prev = obj;
-	obj->next = next;
-}
-
-static inline void nl_list_add_tail(struct nl_list_head *obj,
-				    struct nl_list_head *head)
-{
-	__nl_list_add(obj, head->prev, head);
-}
-
-static inline void nl_list_add_head(struct nl_list_head *obj,
-				    struct nl_list_head *head)
-{
-	__nl_list_add(obj, head, head->next);
-}
-
-static inline void nl_list_del(struct nl_list_head *obj)
-{
-	obj->next->prev = obj->prev;
-	obj->prev->next = obj->next;
-}
-
-static inline int nl_list_empty(struct nl_list_head *head)
-{
-	return head->next == head;
-}
-
-#define nl_container_of(ptr, type, member) ({			\
-        const typeof( ((type *)0)->member ) *__mptr = (ptr);	\
-        (type *)( (char *)__mptr - ((size_t) &((type *)0)->member));})
-
-#define nl_list_entry(ptr, type, member) \
-	nl_container_of(ptr, type, member)
-
-#define nl_list_at_tail(pos, head, member) \
-	((pos)->member.next == (head))
-
-#define nl_list_at_head(pos, head, member) \
-	((pos)->member.prev == (head))
-
-#define NL_LIST_HEAD(name) \
-	struct nl_list_head name = { &(name), &(name) }
-
-#define nl_list_first_entry(head, type, member)			\
-	nl_list_entry((head)->next, type, member)
-
-#define nl_list_for_each_entry(pos, head, member)				\
-	for (pos = nl_list_entry((head)->next, typeof(*pos), member);	\
-	     &(pos)->member != (head); 	\
-	     (pos) = nl_list_entry((pos)->member.next, typeof(*(pos)), member))
-
-#define nl_list_for_each_entry_safe(pos, n, head, member)			\
-	for (pos = nl_list_entry((head)->next, typeof(*pos), member),	\
-		n = nl_list_entry(pos->member.next, typeof(*pos), member);	\
-	     &(pos)->member != (head); 					\
-	     pos = n, n = nl_list_entry(n->member.next, typeof(*n), member))
-
-#define nl_init_list_head(head) \
-	do { (head)->next = (head); (head)->prev = (head); } while (0)
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/msg.h b/package/libs/libnl-tiny/src/include/netlink/msg.h
deleted file mode 100644
index b3e2b0b2b990..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/msg.h
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * netlink/msg.c		Netlink Messages Interface
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_MSG_H_
-#define NETLINK_MSG_H_
-
-#include <netlink/netlink.h>
-#include <netlink/object.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct nla_policy;
-
-#define NL_DONTPAD	0
-
-/**
- * @ingroup msg
- * @brief
- * Will cause the netlink pid to be set to the pid assigned to
- * the netlink handle (socket) just before sending the message off.
- * @note Requires the use of nl_send_auto_complete()!
- */
-#define NL_AUTO_PID	0
-
-/**
- * @ingroup msg
- * @brief
- * May be used to refer to a sequence number which should be
- * automatically set just before sending the message off.
- * @note Requires the use of nl_send_auto_complete()!
- */
-#define NL_AUTO_SEQ	0
-
-#define NL_MSG_CRED_PRESENT 1
-
-struct nl_msg
-{
-	int			nm_protocol;
-	int			nm_flags;
-	struct sockaddr_nl	nm_src;
-	struct sockaddr_nl	nm_dst;
-	struct ucred		nm_creds;
-	struct nlmsghdr *	nm_nlh;
-	size_t			nm_size;
-	int			nm_refcnt;
-};
-
-
-struct nl_msg;
-struct nl_tree;
-struct ucred;
-
-/* message parsing */
-extern int		  nlmsg_ok(const struct nlmsghdr *, int);
-extern struct nlmsghdr *  nlmsg_next(struct nlmsghdr *, int *);
-extern int		  nlmsg_parse(struct nlmsghdr *, int, struct nlattr **,
-				      int, struct nla_policy *);
-extern int		  nlmsg_validate(struct nlmsghdr *, int, int,
-					 struct nla_policy *);
-
-extern struct nl_msg *	  nlmsg_alloc(void);
-extern struct nl_msg *	  nlmsg_alloc_size(size_t);
-extern struct nl_msg *	  nlmsg_alloc_simple(int, int);
-extern void		  nlmsg_set_default_size(size_t);
-extern struct nl_msg *	  nlmsg_inherit(struct nlmsghdr *);
-extern struct nl_msg *	  nlmsg_convert(struct nlmsghdr *);
-extern void *		  nlmsg_reserve(struct nl_msg *, size_t, int);
-extern int		  nlmsg_append(struct nl_msg *, void *, size_t, int);
-
-extern struct nlmsghdr *  nlmsg_put(struct nl_msg *, uint32_t, uint32_t,
-				    int, int, int);
-extern void		  nlmsg_free(struct nl_msg *);
-
-extern int		  nl_msg_parse(struct nl_msg *,
-				       void (*cb)(struct nl_object *, void *),
-				       void *);
-
-extern void		nl_msg_dump(struct nl_msg *, FILE *);
-
-/**
- * length of netlink message not including padding
- * @arg payload		length of message payload
- */
-static inline int nlmsg_msg_size(int payload)
-{
-	return NLMSG_HDRLEN + payload;
-}
-
-/**
- * length of netlink message including padding
- * @arg payload		length of message payload
- */
-static inline int nlmsg_total_size(int payload)
-{
-	return NLMSG_ALIGN(nlmsg_msg_size(payload));
-}
-
-/**
- * length of padding at the message's tail
- * @arg payload		length of message payload
- */
-static inline int nlmsg_padlen(int payload)
-{
-	return nlmsg_total_size(payload) - nlmsg_msg_size(payload);
-}
-
-/**
- * head of message payload
- * @arg nlh		netlink messsage header
- */
-static inline void *nlmsg_data(const struct nlmsghdr *nlh)
-{
-	return (unsigned char *) nlh + NLMSG_HDRLEN;
-}
-
-static inline void *nlmsg_tail(const struct nlmsghdr *nlh)
-{
-	return (unsigned char *) nlh + NLMSG_ALIGN(nlh->nlmsg_len);
-}
-
-/**
- * length of message payload
- * @arg nlh		netlink message header
- */
-static inline int nlmsg_len(const struct nlmsghdr *nlh)
-{
-	return nlh->nlmsg_len - NLMSG_HDRLEN;
-}
-
-/**
- * head of attributes data
- * @arg nlh		netlink message header
- * @arg hdrlen		length of family specific header
- */
-static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh, int hdrlen)
-{
-	unsigned char *data = (unsigned char*)nlmsg_data(nlh);
-	return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen));
-}
-
-/**
- * length of attributes data
- * @arg nlh		netlink message header
- * @arg hdrlen		length of family specific header
- */
-static inline int nlmsg_attrlen(const struct nlmsghdr *nlh, int hdrlen)
-{
-	return nlmsg_len(nlh) - NLMSG_ALIGN(hdrlen);
-}
-
-static inline int nlmsg_valid_hdr(const struct nlmsghdr *nlh, int hdrlen)
-{
-	if (nlh->nlmsg_len < (uint)nlmsg_msg_size(hdrlen))
-		return 0;
-
-	return 1;
-}
-
-
-static inline void nlmsg_set_proto(struct nl_msg *msg, int protocol)
-{
-	msg->nm_protocol = protocol;
-}
-
-static inline int nlmsg_get_proto(struct nl_msg *msg)
-{
-	return msg->nm_protocol;
-}
-
-static inline size_t nlmsg_get_max_size(struct nl_msg *msg)
-{
-	return msg->nm_size;
-}
-
-static inline void nlmsg_set_src(struct nl_msg *msg, struct sockaddr_nl *addr)
-{
-	memcpy(&msg->nm_src, addr, sizeof(*addr));
-}
-
-static inline struct sockaddr_nl *nlmsg_get_src(struct nl_msg *msg)
-{
-	return &msg->nm_src;
-}
-
-static inline void nlmsg_set_dst(struct nl_msg *msg, struct sockaddr_nl *addr)
-{
-	memcpy(&msg->nm_dst, addr, sizeof(*addr));
-}
-
-static inline struct sockaddr_nl *nlmsg_get_dst(struct nl_msg *msg)
-{
-	return &msg->nm_dst;
-}
-
-static inline void nlmsg_set_creds(struct nl_msg *msg, struct ucred *creds)
-{
-	memcpy(&msg->nm_creds, creds, sizeof(*creds));
-	msg->nm_flags |= NL_MSG_CRED_PRESENT;
-}
-
-static inline struct ucred *nlmsg_get_creds(struct nl_msg *msg)
-{
-	if (msg->nm_flags & NL_MSG_CRED_PRESENT)
-		return &msg->nm_creds;
-	return NULL;
-}
-
-/**
- * Return actual netlink message
- * @arg n		netlink message
- * 
- * Returns the actual netlink message casted to the type of the netlink
- * message header.
- * 
- * @return A pointer to the netlink message.
- */
-static inline struct nlmsghdr *nlmsg_hdr(struct nl_msg *n)
-{
-	return n->nm_nlh;
-}
-
-/**
- * Acquire a reference on a netlink message
- * @arg msg		message to acquire reference from
- */
-static inline void nlmsg_get(struct nl_msg *msg)
-{
-	msg->nm_refcnt++;
-}
-
-/**
- * Expand maximum payload size of a netlink message
- * @arg n		Netlink message.
- * @arg newlen		New maximum payload size.
- *
- * Reallocates the payload section of a netlink message and increases
- * the maximum payload size of the message.
- *
- * @note Any pointers pointing to old payload block will be stale and
- *       need to be refetched. Therfore, do not expand while constructing
- *       nested attributes or while reserved data blocks are held.
- *
- * @return 0 on success or a negative error code.
- */
-static inline int nlmsg_expand(struct nl_msg *n, size_t newlen)
-{
-	void *tmp;
-
-	if (newlen <= n->nm_size)
-		return -NLE_INVAL;
-
-	tmp = realloc(n->nm_nlh, newlen);
-	if (tmp == NULL)
-		return -NLE_NOMEM;
-
-	n->nm_nlh = (struct nlmsghdr*)tmp;
-	n->nm_size = newlen;
-
-	return 0;
-}
-
-
-/**
- * @name Iterators
- * @{
- */
-
-/**
- * @ingroup msg
- * Iterate over a stream of attributes in a message
- * @arg pos	loop counter, set to current attribute
- * @arg nlh	netlink message header
- * @arg hdrlen	length of family header
- * @arg rem	initialized to len, holds bytes currently remaining in stream
- */
-#define nlmsg_for_each_attr(pos, nlh, hdrlen, rem) \
-	nla_for_each_attr(pos, nlmsg_attrdata(nlh, hdrlen), \
-			  nlmsg_attrlen(nlh, hdrlen), rem)
-
-/**
- * Iterate over a stream of messages
- * @arg pos	loop counter, set to current message
- * @arg head	head of message stream
- * @arg len	length of message stream
- * @arg rem	initialized to len, holds bytes currently remaining in stream
- */
-#define nlmsg_for_each_msg(pos, head, len, rem) \
-	for (pos = head, rem = len; \
-	     nlmsg_ok(pos, rem); \
-	     pos = nlmsg_next(pos, &(rem)))
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/netlink-compat.h b/package/libs/libnl-tiny/src/include/netlink/netlink-compat.h
deleted file mode 100644
index 17ec9fc8d1df..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/netlink-compat.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * netlink/netlink-compat.h	Netlink Compatability
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_COMPAT_H_
-#define NETLINK_COMPAT_H_
-
-#if !defined _LINUX_SOCKET_H && !defined _BITS_SOCKADDR_H
-typedef unsigned short  sa_family_t;
-#endif
-
-#ifndef IFNAMSIZ 
-/** Maximum length of a interface name */
-#define IFNAMSIZ 16
-#endif
-
-/* patch 2.4.x if_arp */
-#ifndef ARPHRD_INFINIBAND
-#define ARPHRD_INFINIBAND 32
-#endif
-
-/* patch 2.4.x eth header file */
-#ifndef ETH_P_MPLS_UC
-#define ETH_P_MPLS_UC  0x8847 
-#endif
-
-#ifndef ETH_P_MPLS_MC
-#define ETH_P_MPLS_MC   0x8848
-#endif
-
-#ifndef  ETH_P_EDP2
-#define ETH_P_EDP2      0x88A2
-#endif
-
-#ifndef ETH_P_HDLC
-#define ETH_P_HDLC      0x0019 
-#endif
-
-#ifndef AF_LLC
-#define AF_LLC		26
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/netlink-kernel.h b/package/libs/libnl-tiny/src/include/netlink/netlink-kernel.h
deleted file mode 100644
index a0f5535664fc..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/netlink-kernel.h
+++ /dev/null
@@ -1,196 +0,0 @@
-#ifndef __LINUX_NETLINK_H
-#define __LINUX_NETLINK_H
-
-/**
- * Netlink socket address
- * @ingroup nl
- */
-struct sockaddr_nl
-{
-	/** socket family (AF_NETLINK) */
-	sa_family_t     nl_family;
-
-	/** Padding (unused) */
-	unsigned short  nl_pad;
-
-	/** Unique process ID  */
-	uint32_t        nl_pid;
-
-	/** Multicast group subscriptions */
-	uint32_t        nl_groups;
-};
-
-/**
- * Netlink message header
- * @ingroup msg
- */
-struct nlmsghdr
-{
-	/**
-	 * Length of message including header.
-	 */
-	uint32_t	nlmsg_len;
-
-	/**
-	 * Message type (content type)
-	 */
-	uint16_t	nlmsg_type;
-
-	/**
-	 * Message flags
-	 */
-	uint16_t	nlmsg_flags;
-
-	/**
-	 * Sequence number
-	 */
-	uint32_t	nlmsg_seq;
-
-	/**
-	 * Netlink PID of the proccess sending the message.
-	 */
-	uint32_t	nlmsg_pid;
-};
-
-/**
- * @name Standard message flags
- * @{
- */
-
-/**
- * Must be set on all request messages (typically from user space to
- * kernel space).
- * @ingroup msg
- */
-#define NLM_F_REQUEST		1
-
-/**
- * Indicates the message is part of a multipart message terminated
- * by NLMSG_DONE.
- */
-#define NLM_F_MULTI		2
-
-/**
- * Request for an acknowledgment on success.
- */
-#define NLM_F_ACK		4
-
-/**
- * Echo this request
- */
-#define NLM_F_ECHO		8
-
-/** @} */
-
-/**
- * @name Additional message flags for GET requests
- * @{
- */
-
-/**
- * Return the complete table instead of a single entry.
- * @ingroup msg
- */
-#define NLM_F_ROOT	0x100
-
-/**
- * Return all entries matching criteria passed in message content.
- */
-#define NLM_F_MATCH	0x200
-
-/**
- * Return an atomic snapshot of the table being referenced. This
- * may require special privileges because it has the potential to
- * interrupt service in the FE for a longer time.
- */
-#define NLM_F_ATOMIC	0x400
-
-/**
- * Dump all entries
- */
-#define NLM_F_DUMP	(NLM_F_ROOT|NLM_F_MATCH)
-
-/** @} */
-
-/**
- * @name Additional messsage flags for NEW requests
- * @{
- */
-
-/**
- * Replace existing matching config object with this request.
- * @ingroup msg
- */
-#define NLM_F_REPLACE	0x100
-
-/**
- * Don't replace the config object if it already exists.
- */
-#define NLM_F_EXCL	0x200
-
-/**
- * Create config object if it doesn't already exist.
- */
-#define NLM_F_CREATE	0x400
-
-/**
- * Add to the end of the object list.
- */
-#define NLM_F_APPEND	0x800
-
-/** @} */
-
-/**
- * @name Standard Message types
- * @{
- */
-
-/**
- * No operation, message must be ignored
- * @ingroup msg
- */
-#define NLMSG_NOOP		0x1
-
-/**
- * The message signals an error and the payload contains a nlmsgerr
- * structure. This can be looked at as a NACK and typically it is
- * from FEC to CPC.
- */
-#define NLMSG_ERROR		0x2
-
-/**
- * Message terminates a multipart message.
- */
-#define NLMSG_DONE		0x3
-
-/**
- * The message signals that data got lost
- */
-#define NLMSG_OVERRUN		0x4
-
-/**
- * Lower limit of reserved message types
- */
-#define NLMSG_MIN_TYPE		0x10
-
-/** @} */
-
-/**
- * Netlink error message
- * @ingroup msg
- */
-struct nlmsgerr
-{
-	/** Error code (errno number) */
-	int		error;
-
-	/** Original netlink message causing the error */
-	struct nlmsghdr	msg;
-};
-
-struct nl_pktinfo
-{
-	__u32	group;
-};
-
-#endif	/* __LINUX_NETLINK_H */
diff --git a/package/libs/libnl-tiny/src/include/netlink/netlink.h b/package/libs/libnl-tiny/src/include/netlink/netlink.h
deleted file mode 100644
index c333c503dd81..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/netlink.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * netlink/netlink.h		Netlink Interface
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_NETLINK_H_
-#define NETLINK_NETLINK_H_
-
-#include <stdio.h>
-#include <stdint.h>
-#include <string.h>
-#include <stdlib.h>
-#include <poll.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <netdb.h>
-#include <netlink/netlink-compat.h>
-#include <linux/netlink.h>
-#include <linux/genetlink.h>
-#include <netlink/version.h>
-#include <netlink/errno.h>
-#include <netlink/types.h>
-#include <netlink/handlers.h>
-#include <netlink/socket.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern int nl_debug;
-extern struct nl_dump_params nl_debug_dp;
-
-/* Connection Management */
-extern int			nl_connect(struct nl_sock *, int);
-extern void			nl_close(struct nl_sock *);
-
-/* Send */
-extern int			nl_sendto(struct nl_sock *, void *, size_t);
-extern int			nl_sendmsg(struct nl_sock *, struct nl_msg *,
-					   struct msghdr *);
-extern int			nl_send(struct nl_sock *, struct nl_msg *);
-extern int			nl_send_auto_complete(struct nl_sock *,
-						      struct nl_msg *);
-extern int			nl_send_simple(struct nl_sock *, int, int,
-					       void *, size_t);
-
-/* Receive */
-extern int			nl_recv(struct nl_sock *,
-					struct sockaddr_nl *, unsigned char **,
-					struct ucred **);
-extern int			nl_recvmsgs(struct nl_sock *sk, struct nl_cb *cb);
-
-extern int			nl_wait_for_ack(struct nl_sock *);
-
-/* Netlink Family Translations */
-extern char *			nl_nlfamily2str(int, char *, size_t);
-extern int			nl_str2nlfamily(const char *);
-
-/**
- * Receive a set of message from a netlink socket using handlers in nl_sock.
- * @arg sk		Netlink socket.
- *
- * Calls nl_recvmsgs() with the handlers configured in the netlink socket.
- */
-static inline int nl_recvmsgs_default(struct nl_sock *sk)
-{
-	return nl_recvmsgs(sk, sk->s_cb);
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/object-api.h b/package/libs/libnl-tiny/src/include/netlink/object-api.h
deleted file mode 100644
index 8a44fe90129f..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/object-api.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * netlink/object-api.c		Object API
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2007 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_OBJECT_API_H_
-#define NETLINK_OBJECT_API_H_
-
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @ingroup object
- * @defgroup object_api Object API
- * @brief
- *
- * @par 1) Object Definition
- * @code
- * // Define your object starting with the common object header
- * struct my_obj {
- * 	NLHDR_COMMON
- * 	int		my_data;
- * };
- *
- * // Fill out the object operations structure
- * struct nl_object_ops my_ops = {
- * 	.oo_name	= "my_obj",
- * 	.oo_size	= sizeof(struct my_obj),
- * };
- *
- * // At this point the object can be allocated, you may want to provide a
- * // separate _alloc() function to ease allocting objects of this kind.
- * struct nl_object *obj = nl_object_alloc(&my_ops);
- *
- * // And release it again...
- * nl_object_put(obj);
- * @endcode
- *
- * @par 2) Allocating additional data
- * @code
- * // You may require to allocate additional data and store it inside
- * // object, f.e. assuming there is a field `ptr'.
- * struct my_obj {
- * 	NLHDR_COMMON
- * 	void *		ptr;
- * };
- *
- * // And at some point you may assign allocated data to this field:
- * my_obj->ptr = calloc(1, ...);
- *
- * // In order to not introduce any memory leaks you have to release
- * // this data again when the last reference is given back.
- * static void my_obj_free_data(struct nl_object *obj)
- * {
- * 	struct my_obj *my_obj = nl_object_priv(obj);
- *
- * 	free(my_obj->ptr);
- * }
- *
- * // Also when the object is cloned, you must ensure for your pointer
- * // stay valid even if one of the clones is freed by either making
- * // a clone as well or increase the reference count.
- * static int my_obj_clone(struct nl_object *src, struct nl_object *dst)
- * {
- * 	struct my_obj *my_src = nl_object_priv(src);
- * 	struct my_obj *my_dst = nl_object_priv(dst);
- *
- * 	if (src->ptr) {
- * 		dst->ptr = calloc(1, ...);
- * 		memcpy(dst->ptr, src->ptr, ...);
- * 	}
- * }
- *
- * struct nl_object_ops my_ops = {
- * 	...
- * 	.oo_free_data	= my_obj_free_data,
- * 	.oo_clone	= my_obj_clone,
- * };
- * @endcode
- *
- * @par 3) Object Dumping
- * @code
- * static int my_obj_dump_detailed(struct nl_object *obj,
- * 				   struct nl_dump_params *params)
- * {
- * 	struct my_obj *my_obj = nl_object_priv(obj);
- *
- * 	// It is absolutely essential to use nl_dump() when printing
- *	// any text to make sure the dumping parameters are respected.
- * 	nl_dump(params, "Obj Integer: %d\n", my_obj->my_int);
- *
- * 	// Before we can dump the next line, make sure to prefix
- *	// this line correctly.
- * 	nl_new_line(params);
- *
- * 	// You may also split a line into multiple nl_dump() calls.
- * 	nl_dump(params, "String: %s ", my_obj->my_string);
- * 	nl_dump(params, "String-2: %s\n", my_obj->another_string);
- * }
- *
- * struct nl_object_ops my_ops = {
- * 	...
- * 	.oo_dump[NL_DUMP_FULL]	= my_obj_dump_detailed,
- * };
- * @endcode
- *
- * @par 4) Object Attributes
- * @code
- * // The concept of object attributes is optional but can ease the typical
- * // case of objects that have optional attributes, e.g. a route may have a
- * // nexthop assigned but it is not required to.
- *
- * // The first step to define your object specific bitmask listing all
- * // attributes
- * #define MY_ATTR_FOO		(1<<0)
- * #define MY_ATTR_BAR		(1<<1)
- *
- * // When assigning an optional attribute to the object, make sure
- * // to mark its availability.
- * my_obj->foo = 123123;
- * my_obj->ce_mask |= MY_ATTR_FOO;
- *
- * // At any time you may use this mask to check for the availability
- * // of the attribute, e.g. while dumping
- * if (my_obj->ce_mask & MY_ATTR_FOO)
- * 	nl_dump(params, "foo %d ", my_obj->foo);
- *
- * // One of the big advantages of this concept is that it allows for
- * // standardized comparisons which make it trivial for caches to
- * // identify unique objects by use of unified comparison functions.
- * // In order for it to work, your object implementation must provide
- * // a comparison function and define a list of attributes which
- * // combined together make an object unique.
- *
- * static int my_obj_compare(struct nl_object *_a, struct nl_object *_b,
- * 			     uint32_t attrs, int flags)
- * {
- * 	struct my_obj *a = nl_object_priv(_a):
- * 	struct my_obj *b = nl_object_priv(_b):
- * 	int diff = 0;
- *
- * 	// We help ourselves in defining our own DIFF macro which will
- *	// call ATTR_DIFF() on both objects which will make sure to only
- *	// compare the attributes if required.
- * 	#define MY_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, MY_ATTR_##ATTR, a, b, EXPR)
- *
- * 	// Call our own diff macro for each attribute to build a bitmask
- *	// representing the attributes which mismatch.
- * 	diff |= MY_DIFF(FOO, a->foo != b->foo)
- * 	diff |= MY_DIFF(BAR, strcmp(a->bar, b->bar))
- *
- * 	return diff;
- * }
- *
- * // In order to identify identical objects with differing attributes
- * // you must specify the attributes required to uniquely identify
- * // your object. Make sure to not include too many attributes, this
- * // list is used when caches look for an old version of an object.
- * struct nl_object_ops my_ops = {
- * 	...
- * 	.oo_id_attrs		= MY_ATTR_FOO,
- * 	.oo_compare		= my_obj_compare,
- * };
- * @endcode
- * @{
- */
-
-/**
- * Common Object Header
- *
- * This macro must be included as first member in every object
- * definition to allow objects to be cached.
- */
-#define NLHDR_COMMON				\
-	int			ce_refcnt;	\
-	struct nl_object_ops *	ce_ops;		\
-	struct nl_cache *	ce_cache;	\
-	struct nl_list_head	ce_list;	\
-	int			ce_msgtype;	\
-	int			ce_flags;	\
-	uint32_t		ce_mask;
-
-/**
- * Return true if attribute is available in both objects
- * @arg A		an object
- * @arg B		another object
- * @arg ATTR		attribute bit
- *
- * @return True if the attribute is available, otherwise false is returned.
- */
-#define AVAILABLE(A, B, ATTR)	(((A)->ce_mask & (B)->ce_mask) & (ATTR))
-
-/**
- * Return true if attributes mismatch
- * @arg A		an object
- * @arg B		another object
- * @arg ATTR		attribute bit
- * @arg EXPR		Comparison expression
- *
- * This function will check if the attribute in question is available
- * in both objects, if not this will count as a mismatch.
- *
- * If available the function will execute the expression which must
- * return true if the attributes mismatch.
- *
- * @return True if the attribute mismatch, or false if they match.
- */
-#define ATTR_MISMATCH(A, B, ATTR, EXPR)	(!AVAILABLE(A, B, ATTR) || (EXPR))
-
-/**
- * Return attribute bit if attribute does not match
- * @arg LIST		list of attributes to be compared
- * @arg ATTR		attribute bit
- * @arg A		an object
- * @arg B		another object
- * @arg EXPR		Comparison expression
- *
- * This function will check if the attribute in question is available
- * in both objects, if not this will count as a mismatch.
- *
- * If available the function will execute the expression which must
- * return true if the attributes mismatch.
- *
- * In case the attributes mismatch, the attribute is returned, otherwise
- * 0 is returned.
- *
- * @code
- * diff |= ATTR_DIFF(attrs, MY_ATTR_FOO, a, b, a->foo != b->foo);
- * @endcode
- */
-#define ATTR_DIFF(LIST, ATTR, A, B, EXPR) \
-({	int diff = 0; \
-	if (((LIST) & (ATTR)) && ATTR_MISMATCH(A, B, ATTR, EXPR)) \
-		diff = ATTR; \
-	diff; })
-
-/**
- * Object Operations
- */
-struct nl_object;
-struct nl_object_ops
-{
-	/**
-	 * Unique name of object type
-	 *
-	 * Must be in the form family/name, e.g. "route/addr"
-	 */
-	char *		oo_name;
-
-	/** Size of object including its header */
-	size_t		oo_size;
-
-	/* List of attributes needed to uniquely identify the object */
-	uint32_t	oo_id_attrs;
-
-	/**
-	 * Constructor function
-	 *
-	 * Will be called when a new object of this type is allocated.
-	 * Can be used to initialize members such as lists etc.
-	 */
-	void  (*oo_constructor)(struct nl_object *);
-
-	/**
-	 * Destructor function
-	 *
-	 * Will be called when an object is freed. Must free all
-	 * resources which may have been allocated as part of this
-	 * object.
-	 */
-	void  (*oo_free_data)(struct nl_object *);
-
-	/**
-	 * Cloning function
-	 *
-	 * Will be called when an object needs to be cloned. Please
-	 * note that the generic object code will make an exact
-	 * copy of the object first, therefore you only need to take
-	 * care of members which require reference counting etc.
-	 *
-	 * May return a negative error code to abort cloning.
-	 */
-	int  (*oo_clone)(struct nl_object *, struct nl_object *);
-
-	/**
-	 * Dumping functions
-	 *
-	 * Will be called when an object is dumped. The implementations
-	 * have to use nl_dump(), nl_dump_line(), and nl_new_line() to
-	 * dump objects.
-	 *
-	 * The functions must return the number of lines printed.
-	 */
-	void (*oo_dump[NL_DUMP_MAX+1])(struct nl_object *,
-				       struct nl_dump_params *);
-
-	/**
-	 * Comparison function
-	 *
-	 * Will be called when two objects of the same type are
-	 * compared. It takes the two objects in question, an object
-	 * specific bitmask defining which attributes should be
-	 * compared and flags to control the behaviour.
-	 *
-	 * The function must return a bitmask with the relevant bit
-	 * set for each attribute that mismatches.
-	 */
-	int   (*oo_compare)(struct nl_object *, struct nl_object *,
-			    uint32_t, int);
-
-
-	char *(*oo_attrs2str)(int, char *, size_t);
-};
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/object.h b/package/libs/libnl-tiny/src/include/netlink/object.h
deleted file mode 100644
index 8aabe7bb12fd..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/object.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * netlink/object.c	Generic Cacheable Object
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_OBJECT_H_
-#define NETLINK_OBJECT_H_
-
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-#include <netlink/object-api.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define NL_OBJ_MARK		1
-
-struct nl_cache;
-struct nl_object;
-struct nl_object_ops;
-
-struct nl_object
-{
-	NLHDR_COMMON
-};
-
-#define OBJ_CAST(ptr)		((struct nl_object *) (ptr))
-
-/* General */
-extern struct nl_object *	nl_object_alloc(struct nl_object_ops *);
-extern void			nl_object_free(struct nl_object *);
-extern struct nl_object *	nl_object_clone(struct nl_object *obj);
-
-#ifdef disabled
-
-extern int			nl_object_alloc_name(const char *,
-						     struct nl_object **);
-extern void			nl_object_dump(struct nl_object *,
-					       struct nl_dump_params *);
-
-extern uint32_t			nl_object_diff(struct nl_object *,
-					       struct nl_object *);
-extern int			nl_object_match_filter(struct nl_object *,
-						       struct nl_object *);
-extern int			nl_object_identical(struct nl_object *,
-						    struct nl_object *);
-extern char *			nl_object_attrs2str(struct nl_object *,
-						    uint32_t attrs, char *buf,
-						    size_t);
-#endif
-/**
- * Check whether this object is used by multiple users
- * @arg obj		object to check
- * @return true or false
- */
-static inline int nl_object_shared(struct nl_object *obj)
-{
-	return obj->ce_refcnt > 1;
-}
-
-
-static inline void nl_object_get(struct nl_object *obj)
-{
-	obj->ce_refcnt++;
-}
-
-static inline void nl_object_put(struct nl_object *obj)
-{
-	if (!obj)
-		return;
-
-	obj->ce_refcnt--;
-
-	if (obj->ce_refcnt <= 0)
-		nl_object_free(obj);
-}
-
-
-/**
- * @name Marks
- * @{
- */
-
-/**
- * Add mark to object
- * @arg obj		Object to mark
- */
-static inline void nl_object_mark(struct nl_object *obj)
-{
-	obj->ce_flags |= NL_OBJ_MARK;
-}
-
-/**
- * Remove mark from object
- * @arg obj		Object to unmark
- */
-static inline void nl_object_unmark(struct nl_object *obj)
-{
-	obj->ce_flags &= ~NL_OBJ_MARK;
-}
-
-/**
- * Return true if object is marked
- * @arg obj		Object to check
- * @return true if object is marked, otherwise false
- */
-static inline int nl_object_is_marked(struct nl_object *obj)
-{
-	return (obj->ce_flags & NL_OBJ_MARK);
-}
-
-/** @} */
-
-#ifdef disabled
-/**
- * Return list of attributes present in an object
- * @arg obj		an object
- * @arg buf		destination buffer
- * @arg len		length of destination buffer
- *
- * @return destination buffer.
- */
-static inline char *nl_object_attr_list(struct nl_object *obj, char *buf, size_t len)
-{
-	return nl_object_attrs2str(obj, obj->ce_mask, buf, len);
-}
-#endif
-
-/**
- * @name Attributes
- * @{
- */
-
-static inline int nl_object_get_refcnt(struct nl_object *obj)
-{
-	return obj->ce_refcnt;
-}
-
-static inline struct nl_cache *nl_object_get_cache(struct nl_object *obj)
-{
-	return obj->ce_cache;
-}
-
-static inline void *		nl_object_priv(struct nl_object *obj)
-{
-	return obj;
-}
-
-
-/** @} */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/socket.h b/package/libs/libnl-tiny/src/include/netlink/socket.h
deleted file mode 100644
index bcb934c50b45..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/socket.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * netlink/socket.h		Netlink Socket
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_SOCKET_H_
-#define NETLINK_SOCKET_H_
-
-#include <netlink/types.h>
-#include <netlink/handlers.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define NL_SOCK_BUFSIZE_SET	(1<<0)
-#define NL_SOCK_PASSCRED	(1<<1)
-#define NL_OWN_PORT		(1<<2)
-#define NL_MSG_PEEK		(1<<3)
-#define NL_NO_AUTO_ACK		(1<<4)
-
-struct nl_cb;
-struct nl_sock
-{
-	struct sockaddr_nl	s_local;
-	struct sockaddr_nl	s_peer;
-	int			s_fd;
-	int			s_proto;
-	unsigned int		s_seq_next;
-	unsigned int		s_seq_expect;
-	int			s_flags;
-	struct nl_cb *		s_cb;
-};
-
-
-extern struct nl_sock *	nl_socket_alloc(void);
-extern struct nl_sock *	nl_socket_alloc_cb(struct nl_cb *);
-extern void		nl_socket_free(struct nl_sock *);
-
-extern void		nl_socket_set_local_port(struct nl_sock *, uint32_t);
-
-extern int		nl_socket_add_memberships(struct nl_sock *, int, ...);
-extern int		nl_socket_drop_memberships(struct nl_sock *, int, ...);
-
-extern int		nl_socket_set_buffer_size(struct nl_sock *, int, int);
-extern int		nl_socket_set_passcred(struct nl_sock *, int);
-extern int		nl_socket_recv_pktinfo(struct nl_sock *, int);
-
-extern void		nl_socket_disable_seq_check(struct nl_sock *);
-
-extern int		nl_socket_set_nonblocking(struct nl_sock *);
-
-/**
- * Use next sequence number
- * @arg sk		Netlink socket.
- *
- * Uses the next available sequence number and increases the counter
- * by one for subsequent calls.
- *
- * @return Unique serial sequence number
- */
-static inline unsigned int nl_socket_use_seq(struct nl_sock *sk)
-{
-	return sk->s_seq_next++;
-}
-
-/**
- * Disable automatic request for ACK
- * @arg sk		Netlink socket.
- *
- * The default behaviour of a socket is to request an ACK for
- * each message sent to allow for the caller to synchronize to
- * the completion of the netlink operation. This function
- * disables this behaviour and will result in requests being
- * sent which will not have the NLM_F_ACK flag set automatically.
- * However, it is still possible for the caller to set the
- * NLM_F_ACK flag explicitely.
- */
-static inline void nl_socket_disable_auto_ack(struct nl_sock *sk)
-{
-	sk->s_flags |= NL_NO_AUTO_ACK;
-}
-
-/**
- * Enable automatic request for ACK (default)
- * @arg sk		Netlink socket.
- * @see nl_socket_disable_auto_ack
- */
-static inline void nl_socket_enable_auto_ack(struct nl_sock *sk)
-{
-	sk->s_flags &= ~NL_NO_AUTO_ACK;
-}
-
-/**
- * @name Source Idenficiation
- * @{
- */
-
-static inline uint32_t nl_socket_get_local_port(struct nl_sock *sk)
-{
-	return sk->s_local.nl_pid;
-}
-
-/**
- * Join multicast groups (deprecated)
- * @arg sk		Netlink socket.
- * @arg groups		Bitmask of groups to join.
- *
- * This function defines the old way of joining multicast group which
- * has to be done prior to calling nl_connect(). It works on any kernel
- * version but is very limited as only 32 groups can be joined.
- */
-static inline void nl_join_groups(struct nl_sock *sk, int groups)
-{
-	sk->s_local.nl_groups |= groups;
-}
-
-/**
- * @name Peer Identfication
- * @{
- */
-
-static inline uint32_t nl_socket_get_peer_port(struct nl_sock *sk)
-{
-	return sk->s_peer.nl_pid;
-}
-
-static inline void nl_socket_set_peer_port(struct nl_sock *sk, uint32_t port)
-{
-	sk->s_peer.nl_pid = port;
-}
-
-/** @} */
-
-/**
- * @name File Descriptor
- * @{
- */
-
-static inline int nl_socket_get_fd(struct nl_sock *sk)
-{
-	return sk->s_fd;
-}
-
-/**
- * Enable use of MSG_PEEK when reading from socket
- * @arg sk		Netlink socket.
- */
-static inline void nl_socket_enable_msg_peek(struct nl_sock *sk)
-{
-	sk->s_flags |= NL_MSG_PEEK;
-}
-
-/**
- * Disable use of MSG_PEEK when reading from socket
- * @arg sk		Netlink socket.
- */
-static inline void nl_socket_disable_msg_peek(struct nl_sock *sk)
-{
-	sk->s_flags &= ~NL_MSG_PEEK;
-}
-
-static inline uint32_t nl_socket_get_peer_groups(struct nl_sock *sk)
-{
-	return sk->s_peer.nl_groups;
-}
-
-static inline void nl_socket_set_peer_groups(struct nl_sock *sk, uint32_t groups)
-{
-	sk->s_peer.nl_groups = groups;
-}
-
-/**
- * @name Callback Handler
- * @{
- */
-
-static inline struct nl_cb *nl_socket_get_cb(struct nl_sock *sk)
-{
-	return nl_cb_get(sk->s_cb);
-}
-
-static inline void nl_socket_set_cb(struct nl_sock *sk, struct nl_cb *cb)
-{
-	nl_cb_put(sk->s_cb);
-	sk->s_cb = nl_cb_get(cb);
-}
-
-/**
- * Modify the callback handler associated to the socket
- * @arg sk		Netlink socket.
- * @arg type		which type callback to set
- * @arg kind		kind of callback
- * @arg func		callback function
- * @arg arg		argument to be passwd to callback function
- *
- * @see nl_cb_set
- */
-static inline int nl_socket_modify_cb(struct nl_sock *sk, enum nl_cb_type type,
-			enum nl_cb_kind kind, nl_recvmsg_msg_cb_t func,
-			void *arg)
-{
-	return nl_cb_set(sk->s_cb, type, kind, func, arg);
-}
-
-/** @} */
-
-static inline int nl_socket_add_membership(struct nl_sock *sk, int group)
-{
-	return nl_socket_add_memberships(sk, group, 0);
-}
-
-
-static inline int nl_socket_drop_membership(struct nl_sock *sk, int group)
-{
-	return nl_socket_drop_memberships(sk, group, 0);
-}
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/types.h b/package/libs/libnl-tiny/src/include/netlink/types.h
deleted file mode 100644
index de81ace11e03..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/types.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * netlink/netlink-types.h	Netlink Types
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef __NETLINK_TYPES_H_
-#define __NETLINK_TYPES_H_
-
-#include <stdio.h>
-
-/**
- * Dumping types (dp_type)
- * @ingroup utils
- */
-enum nl_dump_type {
-	NL_DUMP_LINE,		/**< Dump object briefly on one line */
-	NL_DUMP_DETAILS,	/**< Dump all attributes but no statistics */
-	NL_DUMP_STATS,		/**< Dump all attributes including statistics */
-	NL_DUMP_ENV,		/**< Dump all attribtues as env variables */
-	__NL_DUMP_MAX,
-};
-#define NL_DUMP_MAX (__NL_DUMP_MAX - 1)
-
-/**
- * Dumping parameters
- * @ingroup utils
- */
-struct nl_dump_params
-{
-	/**
-	 * Specifies the type of dump that is requested.
-	 */
-	enum nl_dump_type	dp_type;
-
-	/**
-	 * Specifies the number of whitespaces to be put in front
-	 * of every new line (indentation).
-	 */
-	int			dp_prefix;
-
-	/**
-	 * Causes the cache index to be printed for each element.
-	 */
-	int			dp_print_index;
-
-	/**
-	 * Causes each element to be prefixed with the message type.
-	 */
-	int			dp_dump_msgtype;
-
-	/**
-	 * A callback invoked for output
-	 *
-	 * Passed arguments are:
-	 *  - dumping parameters
-	 *  - string to append to the output
-	 */
-	void			(*dp_cb)(struct nl_dump_params *, char *);
-
-	/**
-	 * A callback invoked for every new line, can be used to
-	 * customize the indentation.
-	 *
-	 * Passed arguments are:
-	 *  - dumping parameters
-	 *  - line number starting from 0
-	 */
-	void			(*dp_nl_cb)(struct nl_dump_params *, int);
-
-	/**
-	 * User data pointer, can be used to pass data to callbacks.
-	 */
-	void			*dp_data;
-
-	/**
-	 * File descriptor the dumping output should go to
-	 */
-	FILE *			dp_fd;
-
-	/**
-	 * Alternatively the output may be redirected into a buffer
-	 */
-	char *			dp_buf;
-
-	/**
-	 * Length of the buffer dp_buf
-	 */
-	size_t			dp_buflen;
-
-	/**
-	 * PRIVATE
-	 * Set if a dump was performed prior to the actual dump handler.
-	 */
-	int			dp_pre_dump;
-
-	/**
-	 * PRIVATE
-	 * Owned by the current caller
-	 */
-	int			dp_ivar;
-
-	unsigned int		dp_line;
-};
-
-#ifndef __GNUC__
-#define __extension__
-#endif
-
-#define min_t(type,x,y) \
-	__extension__({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-#define max_t(type,x,y) \
-	__extension__({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
-
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/utils.h b/package/libs/libnl-tiny/src/include/netlink/utils.h
deleted file mode 100644
index 480bab61869c..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/utils.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * netlink/utils.h		Utility Functions
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_UTILS_H_
-#define NETLINK_UTILS_H_
-
-#include <netlink/netlink.h>
-#include <netlink/list.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @name Probability Constants
- * @{
- */
-
-/**
- * Lower probability limit
- * @ingroup utils
- */
-#define NL_PROB_MIN 0x0
-
-/**
- * Upper probability limit
- * @ingroup utils
- */
-#define NL_PROB_MAX 0xffffffff
-
-/** @} */
-
-/* unit pretty-printing */
-extern double	nl_cancel_down_bytes(unsigned long long, char **);
-extern double	nl_cancel_down_bits(unsigned long long, char **);
-extern double	nl_cancel_down_us(uint32_t, char **);
-
-/* generic unit translations */
-extern long	nl_size2int(const char *);
-extern long	nl_prob2int(const char *);
-
-/* time translations */
-extern int	nl_get_hz(void);
-extern uint32_t	nl_us2ticks(uint32_t);
-extern uint32_t	nl_ticks2us(uint32_t);
-extern int	nl_str2msec(const char *, uint64_t *);
-extern char *	nl_msec2str(uint64_t, char *, size_t);
-
-/* link layer protocol translations */
-extern char *	nl_llproto2str(int, char *, size_t);
-extern int	nl_str2llproto(const char *);
-
-/* ethernet protocol translations */
-extern char *	nl_ether_proto2str(int, char *, size_t);
-extern int	nl_str2ether_proto(const char *);
-
-/* IP protocol translations */
-extern char *	nl_ip_proto2str(int, char *, size_t);
-extern int	nl_str2ip_proto(const char *);
-
-/* Dumping helpers */
-extern void	nl_new_line(struct nl_dump_params *);
-extern void	nl_dump(struct nl_dump_params *, const char *, ...);
-extern void	nl_dump_line(struct nl_dump_params *, const char *, ...);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/netlink/version.h b/package/libs/libnl-tiny/src/include/netlink/version.h
deleted file mode 100644
index 6a316d49336a..000000000000
--- a/package/libs/libnl-tiny/src/include/netlink/version.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * netlink/version.h	Compile Time Versioning Information
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2008 Thomas Graf <tgraf at suug.ch>
- */
-
-#ifndef NETLINK_VERSION_H_
-#define NETLINK_VERSION_H_
-
-#define LIBNL_STRING "libnl"
-#define LIBNL_VERSION "2.0"
-
-#endif
diff --git a/package/libs/libnl-tiny/src/include/unl.h b/package/libs/libnl-tiny/src/include/unl.h
deleted file mode 100644
index 4fe7dc745d1b..000000000000
--- a/package/libs/libnl-tiny/src/include/unl.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef __UNL_H
-#define __UNL_H
-
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/family.h>
-#include <stdbool.h>
-
-struct unl {
-	struct nl_sock *sock;
-	struct nl_cache *cache;
-	struct genl_family *family;
-	char *family_name;
-	int hdrlen;
-	bool loop_done;
-};
-
-int unl_genl_init(struct unl *unl, const char *family);
-void unl_free(struct unl *unl);
-
-typedef int (*unl_cb)(struct nl_msg *, void *);
-
-struct nl_msg *unl_genl_msg(struct unl *unl, int cmd, bool dump);
-int unl_genl_request(struct unl *unl, struct nl_msg *msg, unl_cb handler, void *arg);
-int unl_genl_request_single(struct unl *unl, struct nl_msg *msg, struct nl_msg **dest);
-void unl_genl_loop(struct unl *unl, unl_cb handler, void *arg);
-
-int unl_genl_multicast_id(struct unl *unl, const char *name);
-int unl_genl_subscribe(struct unl *unl, const char *name);
-int unl_genl_unsubscribe(struct unl *unl, const char *name);
-
-int unl_nl80211_phy_lookup(const char *name);
-int unl_nl80211_wdev_to_phy(struct unl *unl, int wdev);
-struct nl_msg *unl_nl80211_phy_msg(struct unl *unl, int phy, int cmd, bool dump);
-struct nl_msg *unl_nl80211_vif_msg(struct unl *unl, int dev, int cmd, bool dump);
-
-static inline void unl_loop_done(struct unl *unl)
-{
-	unl->loop_done = true;
-}
-
-static inline struct nlattr *unl_find_attr(struct unl *unl, struct nl_msg *msg, int attr)
-{
-	return nlmsg_find_attr(nlmsg_hdr(msg), unl->hdrlen, attr);
-}
-
-#endif
diff --git a/package/libs/libnl-tiny/src/msg.c b/package/libs/libnl-tiny/src/msg.c
deleted file mode 100644
index b502047c4c74..000000000000
--- a/package/libs/libnl-tiny/src/msg.c
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
- * lib/msg.c		Netlink Messages Interface
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup core
- * @defgroup msg Messages
- * Netlink Message Construction/Parsing Interface
- * 
- * The following information is partly extracted from RFC3549
- * (ftp://ftp.rfc-editor.org/in-notes/rfc3549.txt)
- *
- * @par Message Format
- * Netlink messages consist of a byte stream with one or multiple
- * Netlink headers and an associated payload.  If the payload is too big
- * to fit into a single message it, can be split over multiple Netlink
- * messages, collectively called a multipart message.  For multipart
- * messages, the first and all following headers have the \c NLM_F_MULTI
- * Netlink header flag set, except for the last header which has the
- * Netlink header type \c NLMSG_DONE.
- *
- * @par
- * The Netlink message header (\link nlmsghdr struct nlmsghdr\endlink) is shown below.
- * @code   
- * 0                   1                   2                   3
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                          Length                             |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |            Type              |           Flags              |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                      Sequence Number                        |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                      Process ID (PID)                       |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * @endcode
- *
- * @par
- * The netlink message header and payload must be aligned properly:
- * @code
- *  <------- NLMSG_ALIGN(hlen) ------> <---- NLMSG_ALIGN(len) --->
- * +----------------------------+- - -+- - - - - - - - - - -+- - -+
- * |           Header           | Pad |       Payload       | Pad |
- * |      struct nlmsghdr       |     |                     |     |
- * +----------------------------+- - -+- - - - - - - - - - -+- - -+
- * @endcode
- * @par
- * Message Format:
- * @code
- *    <--- nlmsg_total_size(payload)  --->
- *    <-- nlmsg_msg_size(payload) ->
- *   +----------+- - -+-------------+- - -+-------- - -
- *   | nlmsghdr | Pad |   Payload   | Pad | nlmsghdr
- *   +----------+- - -+-------------+- - -+-------- - -
- *   nlmsg_data(nlh)---^                   ^
- *   nlmsg_next(nlh)-----------------------+
- * @endcode
- * @par
- * The payload may consist of arbitary data but may have strict
- * alignment and formatting rules depening on the specific netlink
- * families.
- * @par
- * @code
- *    <---------------------- nlmsg_len(nlh) --------------------->
- *    <------ hdrlen ------>       <- nlmsg_attrlen(nlh, hdrlen) ->
- *   +----------------------+- - -+--------------------------------+
- *   |     Family Header    | Pad |           Attributes           |
- *   +----------------------+- - -+--------------------------------+
- *   nlmsg_attrdata(nlh, hdrlen)---^
- * @endcode
- * @par The ACK Netlink Message
- * This message is actually used to denote both an ACK and a NACK.
- * Typically, the direction is from FEC to CPC (in response to an ACK
- * request message).  However, the CPC should be able to send ACKs back
- * to FEC when requested.
- * @code
- *  0                   1                   2                   3
- *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                       Netlink message header                  |
- * |                       type = NLMSG_ERROR                      |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                          Error code                           |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                       OLD Netlink message header              |
- * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * @endcode
- *
- * @par Example
- * @code
- * // Various methods exist to create/allocate a new netlink
- * // message. 
- * //
- * // nlmsg_alloc() will allocate an empty netlink message with
- * // a maximum payload size which defaults to the page size of
- * // the system. This default size can be modified using the
- * // function nlmsg_set_default_size().
- * struct nl_msg *msg = nlmsg_alloc();
- *
- * // Very often, the message type and message flags are known
- * // at allocation time while the other fields are auto generated:
- * struct nl_msg *msg = nlmsg_alloc_simple(MY_TYPE, MY_FLAGS);
- *
- * // Alternatively an existing netlink message header can be used
- * // to inherit the header values:
- * struct nlmsghdr hdr = {
- * 	.nlmsg_type = MY_TYPE,
- * 	.nlmsg_flags = MY_FLAGS,
- * };
- * struct nl_msg *msg = nlmsg_inherit(&hdr);
- *
- * // Last but not least, netlink messages received from netlink sockets
- * // can be converted into nl_msg objects using nlmsg_convert(). This
- * // will create a message with a maximum payload size which equals the
- * // length of the existing netlink message, therefore no more data can
- * // be appened without calling nlmsg_expand() first.
- * struct nl_msg *msg = nlmsg_convert(nlh_from_nl_sock);
- *
- * // Payload may be added to the message via nlmsg_append(). The fourth
- * // parameter specifies the number of alignment bytes the data should
- * // be padding with at the end. Common values are 0 to disable it or
- * // NLMSG_ALIGNTO to ensure proper netlink message padding.
- * nlmsg_append(msg, &mydata, sizeof(mydata), 0);
- *
- * // Sometimes it may be necessary to reserve room for data but defer
- * // the actual copying to a later point, nlmsg_reserve() can be used
- * // for this purpose:
- * void *data = nlmsg_reserve(msg, sizeof(mydata), NLMSG_ALIGNTO);
- *
- * // Attributes may be added using the attributes interface.
- *
- * // After successful use of the message, the memory must be freed
- * // using nlmsg_free()
- * nlmsg_free(msg);
- * @endcode
- * 
- * @par 4) Parsing messages
- * @code
- * int n;
- * unsigned char *buf;
- * struct nlmsghdr *hdr;
- *
- * n = nl_recv(handle, NULL, &buf);
- * 
- * hdr = (struct nlmsghdr *) buf;
- * while (nlmsg_ok(hdr, n)) {
- * 	// Process message here...
- * 	hdr = nlmsg_next(hdr, &n);
- * }
- * @endcode
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-#include <netlink/cache.h>
-#include <netlink/attr.h>
-#include <netlink/msg.h>
-#include <linux/socket.h>
-
-static size_t default_msg_size = 4096;
-
-/**
- * @name Attribute Access
- * @{
- */
-
-//** @} */
-
-/**
- * @name Message Parsing
- * @{
- */
-
-/**
- * check if the netlink message fits into the remaining bytes
- * @arg nlh		netlink message header
- * @arg remaining	number of bytes remaining in message stream
- */
-int nlmsg_ok(const struct nlmsghdr *nlh, int remaining)
-{
-	return (remaining >= sizeof(struct nlmsghdr) &&
-		nlh->nlmsg_len >= sizeof(struct nlmsghdr) &&
-		nlh->nlmsg_len <= remaining);
-}
-
-/**
- * next netlink message in message stream
- * @arg nlh		netlink message header
- * @arg remaining	number of bytes remaining in message stream
- *
- * @returns the next netlink message in the message stream and
- * decrements remaining by the size of the current message.
- */
-struct nlmsghdr *nlmsg_next(struct nlmsghdr *nlh, int *remaining)
-{
-	int totlen = NLMSG_ALIGN(nlh->nlmsg_len);
-
-	*remaining -= totlen;
-
-	return (struct nlmsghdr *) ((unsigned char *) nlh + totlen);
-}
-
-/**
- * parse attributes of a netlink message
- * @arg nlh		netlink message header
- * @arg hdrlen		length of family specific header
- * @arg tb		destination array with maxtype+1 elements
- * @arg maxtype		maximum attribute type to be expected
- * @arg policy		validation policy
- *
- * See nla_parse()
- */
-int nlmsg_parse(struct nlmsghdr *nlh, int hdrlen, struct nlattr *tb[],
-		int maxtype, struct nla_policy *policy)
-{
-	if (!nlmsg_valid_hdr(nlh, hdrlen))
-		return -NLE_MSG_TOOSHORT;
-
-	return nla_parse(tb, maxtype, nlmsg_attrdata(nlh, hdrlen),
-			 nlmsg_attrlen(nlh, hdrlen), policy);
-}
-
-/**
- * nlmsg_validate - validate a netlink message including attributes
- * @arg nlh		netlinket message header
- * @arg hdrlen		length of familiy specific header
- * @arg maxtype		maximum attribute type to be expected
- * @arg policy		validation policy
- */
-int nlmsg_validate(struct nlmsghdr *nlh, int hdrlen, int maxtype,
-		   struct nla_policy *policy)
-{
-	if (!nlmsg_valid_hdr(nlh, hdrlen))
-		return -NLE_MSG_TOOSHORT;
-
-	return nla_validate(nlmsg_attrdata(nlh, hdrlen),
-			    nlmsg_attrlen(nlh, hdrlen), maxtype, policy);
-}
-
-/** @} */
-
-/**
- * @name Message Building/Access
- * @{
- */
-
-static struct nl_msg *__nlmsg_alloc(size_t len)
-{
-	struct nl_msg *nm;
-
-	nm = calloc(1, sizeof(*nm));
-	if (!nm)
-		goto errout;
-
-	nm->nm_refcnt = 1;
-
-	nm->nm_nlh = malloc(len);
-	if (!nm->nm_nlh)
-		goto errout;
-
-	memset(nm->nm_nlh, 0, sizeof(struct nlmsghdr));
-
-	nm->nm_protocol = -1;
-	nm->nm_size = len;
-	nm->nm_nlh->nlmsg_len = nlmsg_total_size(0);
-
-	NL_DBG(2, "msg %p: Allocated new message, maxlen=%zu\n", nm, len);
-
-	return nm;
-errout:
-	free(nm);
-	return NULL;
-}
-
-/**
- * Allocate a new netlink message with the default maximum payload size.
- *
- * Allocates a new netlink message without any further payload. The
- * maximum payload size defaults to PAGESIZE or as otherwise specified
- * with nlmsg_set_default_size().
- *
- * @return Newly allocated netlink message or NULL.
- */
-struct nl_msg *nlmsg_alloc(void)
-{
-	return __nlmsg_alloc(default_msg_size);
-}
-
-/**
- * Allocate a new netlink message with maximum payload size specified.
- */
-struct nl_msg *nlmsg_alloc_size(size_t max)
-{
-	return __nlmsg_alloc(max);
-}
-
-/**
- * Allocate a new netlink message and inherit netlink message header
- * @arg hdr		Netlink message header template
- *
- * Allocates a new netlink message and inherits the original message
- * header. If \a hdr is not NULL it will be used as a template for
- * the netlink message header, otherwise the header is left blank.
- * 
- * @return Newly allocated netlink message or NULL
- */
-struct nl_msg *nlmsg_inherit(struct nlmsghdr *hdr)
-{
-	struct nl_msg *nm;
-
-	nm = nlmsg_alloc();
-	if (nm && hdr) {
-		struct nlmsghdr *new = nm->nm_nlh;
-
-		new->nlmsg_type = hdr->nlmsg_type;
-		new->nlmsg_flags = hdr->nlmsg_flags;
-		new->nlmsg_seq = hdr->nlmsg_seq;
-		new->nlmsg_pid = hdr->nlmsg_pid;
-	}
-
-	return nm;
-}
-
-/**
- * Allocate a new netlink message
- * @arg nlmsgtype	Netlink message type
- * @arg flags		Message flags.
- *
- * @return Newly allocated netlink message or NULL.
- */
-struct nl_msg *nlmsg_alloc_simple(int nlmsgtype, int flags)
-{
-	struct nl_msg *msg;
-	struct nlmsghdr nlh = {
-		.nlmsg_type = nlmsgtype,
-		.nlmsg_flags = flags,
-	};
-
-	msg = nlmsg_inherit(&nlh);
-	if (msg)
-		NL_DBG(2, "msg %p: Allocated new simple message\n", msg);
-
-	return msg;
-}
-
-/**
- * Set the default maximum message payload size for allocated messages
- * @arg max		Size of payload in bytes.
- */
-void nlmsg_set_default_size(size_t max)
-{
-	if (max < nlmsg_total_size(0))
-		max = nlmsg_total_size(0);
-
-	default_msg_size = max;
-}
-
-/**
- * Convert a netlink message received from a netlink socket to a nl_msg
- * @arg hdr		Netlink message received from netlink socket.
- *
- * Allocates a new netlink message and copies all of the data pointed to
- * by \a hdr into the new message object.
- *
- * @return Newly allocated netlink message or NULL.
- */
-struct nl_msg *nlmsg_convert(struct nlmsghdr *hdr)
-{
-	struct nl_msg *nm;
-
-	nm = __nlmsg_alloc(NLMSG_ALIGN(hdr->nlmsg_len));
-	if (!nm)
-		goto errout;
-
-	memcpy(nm->nm_nlh, hdr, hdr->nlmsg_len);
-
-	return nm;
-errout:
-	nlmsg_free(nm);
-	return NULL;
-}
-
-/**
- * Reserve room for additional data in a netlink message
- * @arg n		netlink message
- * @arg len		length of additional data to reserve room for
- * @arg pad		number of bytes to align data to
- *
- * Reserves room for additional data at the tail of the an
- * existing netlink message. Eventual padding required will
- * be zeroed out.
- *
- * @return Pointer to start of additional data tailroom or NULL.
- */
-void *nlmsg_reserve(struct nl_msg *n, size_t len, int pad)
-{
-	void *buf = n->nm_nlh;
-	size_t nlmsg_len = n->nm_nlh->nlmsg_len;
-	size_t tlen;
-
-	tlen = pad ? ((len + (pad - 1)) & ~(pad - 1)) : len;
-
-	if ((tlen + nlmsg_len) > n->nm_size)
-		return NULL;
-
-	buf += nlmsg_len;
-	n->nm_nlh->nlmsg_len += tlen;
-
-	if (tlen > len)
-		memset(buf + len, 0, tlen - len);
-
-	NL_DBG(2, "msg %p: Reserved %zu bytes, pad=%d, nlmsg_len=%d\n",
-		  n, len, pad, n->nm_nlh->nlmsg_len);
-
-	return buf;
-}
-
-/**
- * Append data to tail of a netlink message
- * @arg n		netlink message
- * @arg data		data to add
- * @arg len		length of data
- * @arg pad		Number of bytes to align data to.
- *
- * Extends the netlink message as needed and appends the data of given
- * length to the message. 
- *
- * @return 0 on success or a negative error code
- */
-int nlmsg_append(struct nl_msg *n, void *data, size_t len, int pad)
-{
-	void *tmp;
-
-	tmp = nlmsg_reserve(n, len, pad);
-	if (tmp == NULL)
-		return -NLE_NOMEM;
-
-	memcpy(tmp, data, len);
-	NL_DBG(2, "msg %p: Appended %zu bytes with padding %d\n", n, len, pad);
-
-	return 0;
-}
-
-/**
- * Add a netlink message header to a netlink message
- * @arg n		netlink message
- * @arg pid		netlink process id or NL_AUTO_PID
- * @arg seq		sequence number of message or NL_AUTO_SEQ
- * @arg type		message type
- * @arg payload		length of message payload
- * @arg flags		message flags
- *
- * Adds or overwrites the netlink message header in an existing message
- * object. If \a payload is greater-than zero additional room will be
- * reserved, f.e. for family specific headers. It can be accesed via
- * nlmsg_data().
- *
- * @return A pointer to the netlink message header or NULL.
- */
-struct nlmsghdr *nlmsg_put(struct nl_msg *n, uint32_t pid, uint32_t seq,
-			   int type, int payload, int flags)
-{
-	struct nlmsghdr *nlh;
-
-	if (n->nm_nlh->nlmsg_len < NLMSG_HDRLEN)
-		BUG();
-
-	nlh = (struct nlmsghdr *) n->nm_nlh;
-	nlh->nlmsg_type = type;
-	nlh->nlmsg_flags = flags;
-	nlh->nlmsg_pid = pid;
-	nlh->nlmsg_seq = seq;
-
-	NL_DBG(2, "msg %p: Added netlink header type=%d, flags=%d, pid=%d, "
-		  "seq=%d\n", n, type, flags, pid, seq);
-
-	if (payload > 0 &&
-	    nlmsg_reserve(n, payload, NLMSG_ALIGNTO) == NULL)
-		return NULL;
-
-	return nlh;
-}
-
-/**
- * Release a reference from an netlink message
- * @arg msg		message to release reference from
- *
- * Frees memory after the last reference has been released.
- */
-void nlmsg_free(struct nl_msg *msg)
-{
-	if (!msg)
-		return;
-
-	msg->nm_refcnt--;
-	NL_DBG(4, "Returned message reference %p, %d remaining\n",
-	       msg, msg->nm_refcnt);
-
-	if (msg->nm_refcnt < 0)
-		BUG();
-
-	if (msg->nm_refcnt <= 0) {
-		free(msg->nm_nlh);
-		free(msg);
-		NL_DBG(2, "msg %p: Freed\n", msg);
-	}
-}
-
-/** @} */
-
-/**
- * @name Direct Parsing
- * @{
- */
-
-/** @cond SKIP */
-struct dp_xdata {
-	void (*cb)(struct nl_object *, void *);
-	void *arg;
-};
-/** @endcond */
-
-static int parse_cb(struct nl_object *obj, struct nl_parser_param *p)
-{
-	struct dp_xdata *x = p->pp_arg;
-
-	x->cb(obj, x->arg);
-	return 0;
-}
-
-int nl_msg_parse(struct nl_msg *msg, void (*cb)(struct nl_object *, void *),
-		 void *arg)
-{
-	struct nl_cache_ops *ops;
-	struct nl_parser_param p = {
-		.pp_cb = parse_cb
-	};
-	struct dp_xdata x = {
-		.cb = cb,
-		.arg = arg,
-	};
-
-	ops = nl_cache_ops_associate(nlmsg_get_proto(msg),
-				     nlmsg_hdr(msg)->nlmsg_type);
-	if (ops == NULL)
-		return -NLE_MSGTYPE_NOSUPPORT;
-	p.pp_arg = &x;
-
-	return nl_cache_parse(ops, NULL, nlmsg_hdr(msg), &p);
-}
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/nl.c b/package/libs/libnl-tiny/src/nl.c
deleted file mode 100644
index 2fb866eca903..000000000000
--- a/package/libs/libnl-tiny/src/nl.c
+++ /dev/null
@@ -1,720 +0,0 @@
-/*
- * lib/nl.c		Core Netlink Interface
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @defgroup core Core
- *
- * @details
- * @par 1) Connecting the socket
- * @code
- * // Bind and connect the socket to a protocol, NETLINK_ROUTE in this example.
- * nl_connect(sk, NETLINK_ROUTE);
- * @endcode
- *
- * @par 2) Sending data
- * @code
- * // The most rudimentary method is to use nl_sendto() simply pushing
- * // a piece of data to the other netlink peer. This method is not
- * // recommended.
- * const char buf[] = { 0x01, 0x02, 0x03, 0x04 };
- * nl_sendto(sk, buf, sizeof(buf));
- *
- * // A more comfortable interface is nl_send() taking a pointer to
- * // a netlink message.
- * struct nl_msg *msg = my_msg_builder();
- * nl_send(sk, nlmsg_hdr(msg));
- *
- * // nl_sendmsg() provides additional control over the sendmsg() message
- * // header in order to allow more specific addressing of multiple peers etc.
- * struct msghdr hdr = { ... };
- * nl_sendmsg(sk, nlmsg_hdr(msg), &hdr);
- *
- * // You're probably too lazy to fill out the netlink pid, sequence number
- * // and message flags all the time. nl_send_auto_complete() automatically
- * // extends your message header as needed with an appropriate sequence
- * // number, the netlink pid stored in the netlink socket and the message
- * // flags NLM_F_REQUEST and NLM_F_ACK (if not disabled in the socket)
- * nl_send_auto_complete(sk, nlmsg_hdr(msg));
- *
- * // Simple protocols don't require the complex message construction interface
- * // and may favour nl_send_simple() to easly send a bunch of payload
- * // encapsulated in a netlink message header.
- * nl_send_simple(sk, MY_MSG_TYPE, 0, buf, sizeof(buf));
- * @endcode
- *
- * @par 3) Receiving data
- * @code
- * // nl_recv() receives a single message allocating a buffer for the message
- * // content and gives back the pointer to you.
- * struct sockaddr_nl peer;
- * unsigned char *msg;
- * nl_recv(sk, &peer, &msg);
- *
- * // nl_recvmsgs() receives a bunch of messages until the callback system
- * // orders it to state, usually after receving a compolete multi part
- * // message series.
- * nl_recvmsgs(sk, my_callback_configuration);
- *
- * // nl_recvmsgs_default() acts just like nl_recvmsg() but uses the callback
- * // configuration stored in the socket.
- * nl_recvmsgs_default(sk);
- *
- * // In case you want to wait for the ACK to be recieved that you requested
- * // with your latest message, you can call nl_wait_for_ack()
- * nl_wait_for_ack(sk);
- * @endcode
- *
- * @par 4) Closing
- * @code
- * // Close the socket first to release kernel memory
- * nl_close(sk);
- * @endcode
- * 
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-#include <netlink/handlers.h>
-#include <netlink/msg.h>
-#include <netlink/attr.h>
-
-/**
- * @name Connection Management
- * @{
- */
-
-/**
- * Create and connect netlink socket.
- * @arg sk		Netlink socket.
- * @arg protocol	Netlink protocol to use.
- *
- * Creates a netlink socket using the specified protocol, binds the socket
- * and issues a connection attempt.
- *
- * @return 0 on success or a negative error code.
- */
-int nl_connect(struct nl_sock *sk, int protocol)
-{
-	int err;
-	socklen_t addrlen;
-
-	sk->s_fd = socket(AF_NETLINK, SOCK_RAW, protocol);
-	if (sk->s_fd < 0) {
-		err = -nl_syserr2nlerr(errno);
-		goto errout;
-	}
-
-	if (!(sk->s_flags & NL_SOCK_BUFSIZE_SET)) {
-		err = nl_socket_set_buffer_size(sk, 0, 0);
-		if (err < 0)
-			goto errout;
-	}
-
-	err = bind(sk->s_fd, (struct sockaddr*) &sk->s_local,
-		   sizeof(sk->s_local));
-	if (err < 0) {
-		err = -nl_syserr2nlerr(errno);
-		goto errout;
-	}
-
-	addrlen = sizeof(sk->s_local);
-	err = getsockname(sk->s_fd, (struct sockaddr *) &sk->s_local,
-			  &addrlen);
-	if (err < 0) {
-		err = -nl_syserr2nlerr(errno);
-		goto errout;
-	}
-
-	if (addrlen != sizeof(sk->s_local)) {
-		err = -NLE_NOADDR;
-		goto errout;
-	}
-
-	if (sk->s_local.nl_family != AF_NETLINK) {
-		err = -NLE_AF_NOSUPPORT;
-		goto errout;
-	}
-
-	sk->s_proto = protocol;
-
-	return 0;
-errout:
-	close(sk->s_fd);
-	sk->s_fd = -1;
-
-	return err;
-}
-
-/**
- * Close/Disconnect netlink socket.
- * @arg sk		Netlink socket.
- */
-void nl_close(struct nl_sock *sk)
-{
-	if (sk->s_fd >= 0) {
-		close(sk->s_fd);
-		sk->s_fd = -1;
-	}
-
-	sk->s_proto = 0;
-}
-
-/** @} */
-
-/**
- * @name Send
- * @{
- */
-
-/**
- * Send raw data over netlink socket.
- * @arg sk		Netlink socket.
- * @arg buf		Data buffer.
- * @arg size		Size of data buffer.
- * @return Number of characters written on success or a negative error code.
- */
-int nl_sendto(struct nl_sock *sk, void *buf, size_t size)
-{
-	int ret;
-
-	ret = sendto(sk->s_fd, buf, size, 0, (struct sockaddr *)
-		     &sk->s_peer, sizeof(sk->s_peer));
-	if (ret < 0)
-		return -nl_syserr2nlerr(errno);
-
-	return ret;
-}
-
-/**
- * Send netlink message with control over sendmsg() message header.
- * @arg sk		Netlink socket.
- * @arg msg		Netlink message to be sent.
- * @arg hdr		Sendmsg() message header.
- * @return Number of characters sent on sucess or a negative error code.
- */
-int nl_sendmsg(struct nl_sock *sk, struct nl_msg *msg, struct msghdr *hdr)
-{
-	struct nl_cb *cb;
-	int ret;
-
-	struct iovec iov = {
-		.iov_base = (void *) nlmsg_hdr(msg),
-		.iov_len = nlmsg_hdr(msg)->nlmsg_len,
-	};
-
-	hdr->msg_iov = &iov;
-	hdr->msg_iovlen = 1;
-
-	nlmsg_set_src(msg, &sk->s_local);
-
-	cb = sk->s_cb;
-	if (cb->cb_set[NL_CB_MSG_OUT])
-		if (nl_cb_call(cb, NL_CB_MSG_OUT, msg) != NL_OK)
-			return 0;
-
-	ret = sendmsg(sk->s_fd, hdr, 0);
-	if (ret < 0)
-		return -nl_syserr2nlerr(errno);
-
-	return ret;
-}
-
-
-/**
- * Send netlink message.
- * @arg sk		Netlink socket.
- * @arg msg		Netlink message to be sent.
- * @see nl_sendmsg()
- * @return Number of characters sent on success or a negative error code.
- */
-int nl_send(struct nl_sock *sk, struct nl_msg *msg)
-{
-	struct sockaddr_nl *dst;
-	struct ucred *creds;
-	
-	struct msghdr hdr = {
-		.msg_name = (void *) &sk->s_peer,
-		.msg_namelen = sizeof(struct sockaddr_nl),
-	};
-
-	/* Overwrite destination if specified in the message itself, defaults
-	 * to the peer address of the socket.
-	 */
-	dst = nlmsg_get_dst(msg);
-	if (dst->nl_family == AF_NETLINK)
-		hdr.msg_name = dst;
-
-	/* Add credentials if present. */
-	creds = nlmsg_get_creds(msg);
-	if (creds != NULL) {
-		char buf[CMSG_SPACE(sizeof(struct ucred))];
-		struct cmsghdr *cmsg;
-
-		hdr.msg_control = buf;
-		hdr.msg_controllen = sizeof(buf);
-
-		cmsg = CMSG_FIRSTHDR(&hdr);
-		cmsg->cmsg_level = SOL_SOCKET;
-		cmsg->cmsg_type = SCM_CREDENTIALS;
-		cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
-		memcpy(CMSG_DATA(cmsg), creds, sizeof(struct ucred));
-	}
-
-	return nl_sendmsg(sk, msg, &hdr);
-}
-
-/**
- * Send netlink message and check & extend header values as needed.
- * @arg sk		Netlink socket.
- * @arg msg		Netlink message to be sent.
- *
- * Checks the netlink message \c nlh for completness and extends it
- * as required before sending it out. Checked fields include pid,
- * sequence nr, and flags.
- *
- * @see nl_send()
- * @return Number of characters sent or a negative error code.
- */
-int nl_send_auto_complete(struct nl_sock *sk, struct nl_msg *msg)
-{
-	struct nlmsghdr *nlh;
-	struct nl_cb *cb = sk->s_cb;
-
-	nlh = nlmsg_hdr(msg);
-	if (nlh->nlmsg_pid == 0)
-		nlh->nlmsg_pid = sk->s_local.nl_pid;
-
-	if (nlh->nlmsg_seq == 0)
-		nlh->nlmsg_seq = sk->s_seq_next++;
-
-	if (msg->nm_protocol == -1)
-		msg->nm_protocol = sk->s_proto;
-	
-	nlh->nlmsg_flags |= NLM_F_REQUEST;
-
-	if (!(sk->s_flags & NL_NO_AUTO_ACK))
-		nlh->nlmsg_flags |= NLM_F_ACK;
-
-	if (cb->cb_send_ow)
-		return cb->cb_send_ow(sk, msg);
-	else
-		return nl_send(sk, msg);
-}
-
-/**
- * Send simple netlink message using nl_send_auto_complete()
- * @arg sk		Netlink socket.
- * @arg type		Netlink message type.
- * @arg flags		Netlink message flags.
- * @arg buf		Data buffer.
- * @arg size		Size of data buffer.
- *
- * Builds a netlink message with the specified type and flags and
- * appends the specified data as payload to the message.
- *
- * @see nl_send_auto_complete()
- * @return Number of characters sent on success or a negative error code.
- */
-int nl_send_simple(struct nl_sock *sk, int type, int flags, void *buf,
-		   size_t size)
-{
-	int err;
-	struct nl_msg *msg;
-
-	msg = nlmsg_alloc_simple(type, flags);
-	if (!msg)
-		return -NLE_NOMEM;
-
-	if (buf && size) {
-		err = nlmsg_append(msg, buf, size, NLMSG_ALIGNTO);
-		if (err < 0)
-			goto errout;
-	}
-	
-
-	err = nl_send_auto_complete(sk, msg);
-errout:
-	nlmsg_free(msg);
-
-	return err;
-}
-
-/** @} */
-
-/**
- * @name Receive
- * @{
- */
-
-/**
- * Receive data from netlink socket
- * @arg sk		Netlink socket.
- * @arg nla		Destination pointer for peer's netlink address.
- * @arg buf		Destination pointer for message content.
- * @arg creds		Destination pointer for credentials.
- *
- * Receives a netlink message, allocates a buffer in \c *buf and
- * stores the message content. The peer's netlink address is stored
- * in \c *nla. The caller is responsible for freeing the buffer allocated
- * in \c *buf if a positive value is returned.  Interrupted system calls
- * are handled by repeating the read. The input buffer size is determined
- * by peeking before the actual read is done.
- *
- * A non-blocking sockets causes the function to return immediately with
- * a return value of 0 if no data is available.
- *
- * @return Number of octets read, 0 on EOF or a negative error code.
- */
-int nl_recv(struct nl_sock *sk, struct sockaddr_nl *nla,
-	    unsigned char **buf, struct ucred **creds)
-{
-	int n;
-	int flags = 0;
-	static int page_size = 0;
-	struct iovec iov;
-	struct msghdr msg = {
-		.msg_name = (void *) nla,
-		.msg_namelen = sizeof(struct sockaddr_nl),
-		.msg_iov = &iov,
-		.msg_iovlen = 1,
-		.msg_control = NULL,
-		.msg_controllen = 0,
-		.msg_flags = 0,
-	};
-	struct cmsghdr *cmsg;
-
-	if (sk->s_flags & NL_MSG_PEEK)
-		flags |= MSG_PEEK;
-
-	if (page_size == 0)
-		page_size = getpagesize() * 4;
-
-	iov.iov_len = page_size;
-	iov.iov_base = *buf = malloc(iov.iov_len);
-
-	if (sk->s_flags & NL_SOCK_PASSCRED) {
-		msg.msg_controllen = CMSG_SPACE(sizeof(struct ucred));
-		msg.msg_control = calloc(1, msg.msg_controllen);
-	}
-retry:
-
-	n = recvmsg(sk->s_fd, &msg, flags);
-	if (!n)
-		goto abort;
-	else if (n < 0) {
-		if (errno == EINTR) {
-			NL_DBG(3, "recvmsg() returned EINTR, retrying\n");
-			goto retry;
-		} else if (errno == EAGAIN) {
-			NL_DBG(3, "recvmsg() returned EAGAIN, aborting\n");
-			goto abort;
-		} else {
-			free(msg.msg_control);
-			free(*buf);
-			return -nl_syserr2nlerr(errno);
-		}
-	}
-
-	if (iov.iov_len < n ||
-	    msg.msg_flags & MSG_TRUNC) {
-		/* Provided buffer is not long enough, enlarge it
-		 * and try again. */
-		iov.iov_len *= 2;
-		iov.iov_base = *buf = realloc(*buf, iov.iov_len);
-		goto retry;
-	} else if (msg.msg_flags & MSG_CTRUNC) {
-		msg.msg_controllen *= 2;
-		msg.msg_control = realloc(msg.msg_control, msg.msg_controllen);
-		goto retry;
-	} else if (flags != 0) {
-		/* Buffer is big enough, do the actual reading */
-		flags = 0;
-		goto retry;
-	}
-
-	if (msg.msg_namelen != sizeof(struct sockaddr_nl)) {
-		free(msg.msg_control);
-		free(*buf);
-		return -NLE_NOADDR;
-	}
-
-	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-		if (cmsg->cmsg_level == SOL_SOCKET &&
-		    cmsg->cmsg_type == SCM_CREDENTIALS) {
-			*creds = calloc(1, sizeof(struct ucred));
-			memcpy(*creds, CMSG_DATA(cmsg), sizeof(struct ucred));
-			break;
-		}
-	}
-
-	free(msg.msg_control);
-	return n;
-
-abort:
-	free(msg.msg_control);
-	free(*buf);
-	return 0;
-}
-
-#define NL_CB_CALL(cb, type, msg) \
-do { \
-	err = nl_cb_call(cb, type, msg); \
-	switch (err) { \
-	case NL_OK: \
-		err = 0; \
-		break; \
-	case NL_SKIP: \
-		goto skip; \
-	case NL_STOP: \
-		goto stop; \
-	default: \
-		goto out; \
-	} \
-} while (0)
-
-static int recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
-{
-	int n, err = 0, multipart = 0;
-	unsigned char *buf = NULL;
-	struct nlmsghdr *hdr;
-	struct sockaddr_nl nla = {0};
-	struct nl_msg *msg = NULL;
-	struct ucred *creds = NULL;
-
-continue_reading:
-	NL_DBG(3, "Attempting to read from %p\n", sk);
-	if (cb->cb_recv_ow)
-		n = cb->cb_recv_ow(sk, &nla, &buf, &creds);
-	else
-		n = nl_recv(sk, &nla, &buf, &creds);
-
-	if (n <= 0)
-		return n;
-
-	NL_DBG(3, "recvmsgs(%p): Read %d bytes\n", sk, n);
-
-	hdr = (struct nlmsghdr *) buf;
-	while (nlmsg_ok(hdr, n)) {
-		NL_DBG(3, "recgmsgs(%p): Processing valid message...\n", sk);
-
-		nlmsg_free(msg);
-		msg = nlmsg_convert(hdr);
-		if (!msg) {
-			err = -NLE_NOMEM;
-			goto out;
-		}
-
-		nlmsg_set_proto(msg, sk->s_proto);
-		nlmsg_set_src(msg, &nla);
-		if (creds)
-			nlmsg_set_creds(msg, creds);
-
-		/* Raw callback is the first, it gives the most control
-		 * to the user and he can do his very own parsing. */
-		if (cb->cb_set[NL_CB_MSG_IN])
-			NL_CB_CALL(cb, NL_CB_MSG_IN, msg);
-
-		/* Sequence number checking. The check may be done by
-		 * the user, otherwise a very simple check is applied
-		 * enforcing strict ordering */
-		if (cb->cb_set[NL_CB_SEQ_CHECK])
-			NL_CB_CALL(cb, NL_CB_SEQ_CHECK, msg);
-		else if (hdr->nlmsg_seq != sk->s_seq_expect) {
-			if (cb->cb_set[NL_CB_INVALID])
-				NL_CB_CALL(cb, NL_CB_INVALID, msg);
-			else {
-				err = -NLE_SEQ_MISMATCH;
-				goto out;
-			}
-		}
-
-		if (hdr->nlmsg_type == NLMSG_DONE ||
-		    hdr->nlmsg_type == NLMSG_ERROR ||
-		    hdr->nlmsg_type == NLMSG_NOOP ||
-		    hdr->nlmsg_type == NLMSG_OVERRUN) {
-			/* We can't check for !NLM_F_MULTI since some netlink
-			 * users in the kernel are broken. */
-			sk->s_seq_expect++;
-			NL_DBG(3, "recvmsgs(%p): Increased expected " \
-			       "sequence number to %d\n",
-			       sk, sk->s_seq_expect);
-		}
-
-		if (hdr->nlmsg_flags & NLM_F_MULTI)
-			multipart = 1;
-	
-		/* Other side wishes to see an ack for this message */
-		if (hdr->nlmsg_flags & NLM_F_ACK) {
-			if (cb->cb_set[NL_CB_SEND_ACK])
-				NL_CB_CALL(cb, NL_CB_SEND_ACK, msg);
-			else {
-				/* FIXME: implement */
-			}
-		}
-
-		/* messages terminates a multpart message, this is
-		 * usually the end of a message and therefore we slip
-		 * out of the loop by default. the user may overrule
-		 * this action by skipping this packet. */
-		if (hdr->nlmsg_type == NLMSG_DONE) {
-			multipart = 0;
-			if (cb->cb_set[NL_CB_FINISH])
-				NL_CB_CALL(cb, NL_CB_FINISH, msg);
-		}
-
-		/* Message to be ignored, the default action is to
-		 * skip this message if no callback is specified. The
-		 * user may overrule this action by returning
-		 * NL_PROCEED. */
-		else if (hdr->nlmsg_type == NLMSG_NOOP) {
-			if (cb->cb_set[NL_CB_SKIPPED])
-				NL_CB_CALL(cb, NL_CB_SKIPPED, msg);
-			else
-				goto skip;
-		}
-
-		/* Data got lost, report back to user. The default action is to
-		 * quit parsing. The user may overrule this action by retuning
-		 * NL_SKIP or NL_PROCEED (dangerous) */
-		else if (hdr->nlmsg_type == NLMSG_OVERRUN) {
-			if (cb->cb_set[NL_CB_OVERRUN])
-				NL_CB_CALL(cb, NL_CB_OVERRUN, msg);
-			else {
-				err = -NLE_MSG_OVERFLOW;
-				goto out;
-			}
-		}
-
-		/* Message carries a nlmsgerr */
-		else if (hdr->nlmsg_type == NLMSG_ERROR) {
-			struct nlmsgerr *e = nlmsg_data(hdr);
-
-			if (hdr->nlmsg_len < nlmsg_msg_size(sizeof(*e))) {
-				/* Truncated error message, the default action
-				 * is to stop parsing. The user may overrule
-				 * this action by returning NL_SKIP or
-				 * NL_PROCEED (dangerous) */
-				if (cb->cb_set[NL_CB_INVALID])
-					NL_CB_CALL(cb, NL_CB_INVALID, msg);
-				else {
-					err = -NLE_MSG_TRUNC;
-					goto out;
-				}
-			} else if (e->error) {
-				/* Error message reported back from kernel. */
-				if (cb->cb_err) {
-					err = cb->cb_err(&nla, e,
-							   cb->cb_err_arg);
-					if (err < 0)
-						goto out;
-					else if (err == NL_SKIP)
-						goto skip;
-					else if (err == NL_STOP) {
-						err = -nl_syserr2nlerr(e->error);
-						goto out;
-					}
-				} else {
-					err = -nl_syserr2nlerr(e->error);
-					goto out;
-				}
-			} else if (cb->cb_set[NL_CB_ACK])
-				NL_CB_CALL(cb, NL_CB_ACK, msg);
-		} else {
-			/* Valid message (not checking for MULTIPART bit to
-			 * get along with broken kernels. NL_SKIP has no
-			 * effect on this.  */
-			if (cb->cb_set[NL_CB_VALID])
-				NL_CB_CALL(cb, NL_CB_VALID, msg);
-		}
-skip:
-		err = 0;
-		hdr = nlmsg_next(hdr, &n);
-	}
-	
-	nlmsg_free(msg);
-	free(buf);
-	free(creds);
-	buf = NULL;
-	msg = NULL;
-	creds = NULL;
-
-	if (multipart) {
-		/* Multipart message not yet complete, continue reading */
-		goto continue_reading;
-	}
-stop:
-	err = 0;
-out:
-	nlmsg_free(msg);
-	free(buf);
-	free(creds);
-
-	return err;
-}
-
-/**
- * Receive a set of messages from a netlink socket.
- * @arg sk		Netlink socket.
- * @arg cb		set of callbacks to control behaviour.
- *
- * Repeatedly calls nl_recv() or the respective replacement if provided
- * by the application (see nl_cb_overwrite_recv()) and parses the
- * received data as netlink messages. Stops reading if one of the
- * callbacks returns NL_STOP or nl_recv returns either 0 or a negative error code.
- *
- * A non-blocking sockets causes the function to return immediately if
- * no data is available.
- *
- * @return 0 on success or a negative error code from nl_recv().
- */
-int nl_recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
-{
-	if (cb->cb_recvmsgs_ow)
-		return cb->cb_recvmsgs_ow(sk, cb);
-	else
-		return recvmsgs(sk, cb);
-}
-
-
-static int ack_wait_handler(struct nl_msg *msg, void *arg)
-{
-	return NL_STOP;
-}
-
-/**
- * Wait for ACK.
- * @arg sk		Netlink socket.
- * @pre The netlink socket must be in blocking state.
- *
- * Waits until an ACK is received for the latest not yet acknowledged
- * netlink message.
- */
-int nl_wait_for_ack(struct nl_sock *sk)
-{
-	int err;
-	struct nl_cb *cb;
-
-	cb = nl_cb_clone(sk->s_cb);
-	if (cb == NULL)
-		return -NLE_NOMEM;
-
-	nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_wait_handler, NULL);
-	err = nl_recvmsgs(sk, cb);
-	nl_cb_put(cb);
-
-	return err;
-}
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/object.c b/package/libs/libnl-tiny/src/object.c
deleted file mode 100644
index 384bacdc6cbc..000000000000
--- a/package/libs/libnl-tiny/src/object.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * lib/object.c		Generic Cacheable Object
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup cache
- * @defgroup object Object
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/cache.h>
-#include <netlink/object.h>
-#include <netlink/utils.h>
-
-static inline struct nl_object_ops *obj_ops(struct nl_object *obj)
-{
-	if (!obj->ce_ops)
-		BUG();
-
-	return obj->ce_ops;
-}
-
-/**
- * @name Object Creation/Deletion
- * @{
- */
-
-/**
- * Allocate a new object of kind specified by the operations handle
- * @arg ops		cache operations handle
- * @return The new object or NULL
- */
-struct nl_object *nl_object_alloc(struct nl_object_ops *ops)
-{
-	struct nl_object *new;
-
-	if (ops->oo_size < sizeof(*new))
-		BUG();
-
-	new = calloc(1, ops->oo_size);
-	if (!new)
-		return NULL;
-
-	new->ce_refcnt = 1;
-	nl_init_list_head(&new->ce_list);
-
-	new->ce_ops = ops;
-	if (ops->oo_constructor)
-		ops->oo_constructor(new);
-
-	NL_DBG(4, "Allocated new object %p\n", new);
-
-	return new;
-}
-
-struct nl_derived_object {
-	NLHDR_COMMON
-	char data;
-};
-
-/**
- * Allocate a new object and copy all data from an existing object
- * @arg obj		object to inherite data from
- * @return The new object or NULL.
- */
-struct nl_object *nl_object_clone(struct nl_object *obj)
-{
-	struct nl_object *new;
-	struct nl_object_ops *ops = obj_ops(obj);
-	int doff = offsetof(struct nl_derived_object, data);
-	int size;
-
-	new = nl_object_alloc(ops);
-	if (!new)
-		return NULL;
-
-	size = ops->oo_size - doff;
-	if (size < 0)
-		BUG();
-
-	new->ce_ops = obj->ce_ops;
-	new->ce_msgtype = obj->ce_msgtype;
-
-	if (size)
-		memcpy((void *)new + doff, (void *)obj + doff, size);
-
-	if (ops->oo_clone) {
-		if (ops->oo_clone(new, obj) < 0) {
-			nl_object_free(new);
-			return NULL;
-		}
-	} else if (size && ops->oo_free_data)
-		BUG();
-
-	return new;
-}
-
-/**
- * Free a cacheable object
- * @arg obj		object to free
- *
- * @return 0 or a negative error code.
- */
-void nl_object_free(struct nl_object *obj)
-{
-	struct nl_object_ops *ops = obj_ops(obj);
-
-	if (obj->ce_refcnt > 0)
-		NL_DBG(1, "Warning: Freeing object in use...\n");
-
-	if (obj->ce_cache)
-		nl_cache_remove(obj);
-
-	if (ops->oo_free_data)
-		ops->oo_free_data(obj);
-
-	free(obj);
-
-	NL_DBG(4, "Freed object %p\n", obj);
-}
-
-/** @} */
-
-/**
- * @name Reference Management
- * @{
- */
-
-/** @} */
-
-/**
- * @name Utillities
- * @{
- */
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/socket.c b/package/libs/libnl-tiny/src/socket.c
deleted file mode 100644
index 1429825e636e..000000000000
--- a/package/libs/libnl-tiny/src/socket.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * lib/socket.c		Netlink Socket
- *
- *	This library is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU Lesser General Public
- *	License as published by the Free Software Foundation version 2.1
- *	of the License.
- *
- * Copyright (c) 2003-2008 Thomas Graf <tgraf at suug.ch>
- */
-
-/**
- * @ingroup core
- * @defgroup socket Socket
- * @{
- */
-
-#include <netlink-local.h>
-#include <netlink/netlink.h>
-#include <netlink/utils.h>
-#include <netlink/handlers.h>
-#include <netlink/msg.h>
-#include <netlink/attr.h>
-
-static uint32_t used_ports_map[32];
-
-static uint32_t generate_local_port(void)
-{
-	int i, n;
-	uint32_t pid = getpid() & 0x3FFFFF;
-
-	for (i = 0; i < 32; i++) {
-		if (used_ports_map[i] == 0xFFFFFFFF)
-			continue;
-
-		for (n = 0; n < 32; n++) {
-			if (1UL & (used_ports_map[i] >> n))
-				continue;
-
-			used_ports_map[i] |= (1UL << n);
-			n += (i * 32);
-
-			/* PID_MAX_LIMIT is currently at 2^22, leaving 10 bit
-			 * to, i.e. 1024 unique ports per application. */
-			return pid + (n << 22);
-
-		}
-	}
-
-	/* Out of sockets in our own PID namespace, what to do? FIXME */
-	return UINT_MAX;
-}
-
-static void release_local_port(uint32_t port)
-{
-	int nr;
-
-	if (port == UINT_MAX)
-		return;
-	
-	nr = port >> 22;
-	used_ports_map[nr / 32] &= ~(1 << nr % 32);
-}
-
-/**
- * @name Allocation
- * @{
- */
-
-static struct nl_sock *__alloc_socket(struct nl_cb *cb)
-{
-	struct nl_sock *sk;
-
-	sk = calloc(1, sizeof(*sk));
-	if (!sk)
-		return NULL;
-
-	sk->s_fd = -1;
-	sk->s_cb = cb;
-	sk->s_local.nl_family = AF_NETLINK;
-	sk->s_peer.nl_family = AF_NETLINK;
-	sk->s_seq_expect = sk->s_seq_next = time(0);
-	sk->s_local.nl_pid = generate_local_port();
-	if (sk->s_local.nl_pid == UINT_MAX) {
-		nl_socket_free(sk);
-		return NULL;
-	}
-
-	return sk;
-}
-
-/**
- * Allocate new netlink socket
- *
- * @return Newly allocated netlink socket or NULL.
- */
-struct nl_sock *nl_socket_alloc(void)
-{
-	struct nl_cb *cb;
-	
-	cb = nl_cb_alloc(NL_CB_DEFAULT);
-	if (!cb)
-		return NULL;
-
-	return __alloc_socket(cb);
-}
-
-/**
- * Allocate new socket with custom callbacks
- * @arg cb		Callback handler
- *
- * The reference to the callback handler is taken into account
- * automatically, it is released again upon calling nl_socket_free().
- *
- *@return Newly allocted socket handle or NULL.
- */
-struct nl_sock *nl_socket_alloc_cb(struct nl_cb *cb)
-{
-	if (cb == NULL)
-		BUG();
-
-	return __alloc_socket(nl_cb_get(cb));
-}
-
-/**
- * Free a netlink socket.
- * @arg sk		Netlink socket.
- */
-void nl_socket_free(struct nl_sock *sk)
-{
-	if (!sk)
-		return;
-
-	if (sk->s_fd >= 0)
-		close(sk->s_fd);
-
-	if (!(sk->s_flags & NL_OWN_PORT))
-		release_local_port(sk->s_local.nl_pid);
-
-	nl_cb_put(sk->s_cb);
-	free(sk);
-}
-
-/** @} */
-
-/**
- * @name Sequence Numbers
- * @{
- */
-
-static int noop_seq_check(struct nl_msg *msg, void *arg)
-{
-	return NL_OK;
-}
-
-
-/**
- * Disable sequence number checking.
- * @arg sk		Netlink socket.
- *
- * Disables checking of sequence numbers on the netlink socket This is
- * required to allow messages to be processed which were not requested by
- * a preceding request message, e.g. netlink events.
- *
- * @note This function modifies the NL_CB_SEQ_CHECK configuration in
- * the callback handle associated with the socket.
- */
-void nl_socket_disable_seq_check(struct nl_sock *sk)
-{
-	nl_cb_set(sk->s_cb, NL_CB_SEQ_CHECK,
-		  NL_CB_CUSTOM, noop_seq_check, NULL);
-}
-
-/** @} */
-
-/**
- * Set local port of socket
- * @arg sk		Netlink socket.
- * @arg port		Local port identifier
- *
- * Assigns a local port identifier to the socket. If port is 0
- * a unique port identifier will be generated automatically.
- */
-void nl_socket_set_local_port(struct nl_sock *sk, uint32_t port)
-{
-	if (port == 0) {
-		port = generate_local_port(); 
-		sk->s_flags &= ~NL_OWN_PORT;
-	} else  {
-		if (!(sk->s_flags & NL_OWN_PORT))
-			release_local_port(sk->s_local.nl_pid);
-		sk->s_flags |= NL_OWN_PORT;
-	}
-
-	sk->s_local.nl_pid = port;
-}
-
-/** @} */
-
-/**
- * @name Group Subscriptions
- * @{
- */
-
-/**
- * Join groups
- * @arg sk		Netlink socket
- * @arg group		Group identifier
- *
- * Joins the specified groups using the modern socket option which
- * is available since kernel version 2.6.14. It allows joining an
- * almost arbitary number of groups without limitation.  The list
- * of groups has to be terminated by 0 (%NFNLGRP_NONE).
- *
- * Make sure to use the correct group definitions as the older
- * bitmask definitions for nl_join_groups() are likely to still
- * be present for backward compatibility reasons.
- *
- * @return 0 on sucess or a negative error code.
- */
-int nl_socket_add_memberships(struct nl_sock *sk, int group, ...)
-{
-	int err;
-	va_list ap;
-
-	if (sk->s_fd == -1)
-		return -NLE_BAD_SOCK;
-
-	va_start(ap, group);
-
-	while (group != 0) {
-		if (group < 0)
-			return -NLE_INVAL;
-
-		err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP,
-						 &group, sizeof(group));
-		if (err < 0)
-			return -nl_syserr2nlerr(errno);
-
-		group = va_arg(ap, int);
-	}
-
-	va_end(ap);
-
-	return 0;
-}
-
-/**
- * Leave groups
- * @arg sk		Netlink socket
- * @arg group		Group identifier
- *
- * Leaves the specified groups using the modern socket option
- * which is available since kernel version 2.6.14. The list of groups
- * has to terminated by 0 (%NFNLGRP_NONE).
- *
- * @see nl_socket_add_membership
- * @return 0 on success or a negative error code.
- */
-int nl_socket_drop_memberships(struct nl_sock *sk, int group, ...)
-{
-	int err;
-	va_list ap;
-
-	if (sk->s_fd == -1)
-		return -NLE_BAD_SOCK;
-
-	va_start(ap, group);
-
-	while (group != 0) {
-		if (group < 0)
-			return -NLE_INVAL;
-
-		err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP,
-						 &group, sizeof(group));
-		if (err < 0)
-			return -nl_syserr2nlerr(errno);
-
-		group = va_arg(ap, int);
-	}
-
-	va_end(ap);
-
-	return 0;
-}
-
-
-/** @} */
-
-/**
- * Set file descriptor of socket to non-blocking state
- * @arg sk		Netlink socket.
- *
- * @return 0 on success or a negative error code.
- */
-int nl_socket_set_nonblocking(struct nl_sock *sk)
-{
-	if (sk->s_fd == -1)
-		return -NLE_BAD_SOCK;
-
-	if (fcntl(sk->s_fd, F_SETFL, O_NONBLOCK) < 0)
-		return -nl_syserr2nlerr(errno);
-
-	return 0;
-}
-
-/** @} */
-
-/**
- * @name Utilities
- * @{
- */
-
-/**
- * Set socket buffer size of netlink socket.
- * @arg sk		Netlink socket.
- * @arg rxbuf		New receive socket buffer size in bytes.
- * @arg txbuf		New transmit socket buffer size in bytes.
- *
- * Sets the socket buffer size of a netlink socket to the specified
- * values \c rxbuf and \c txbuf. Providing a value of \c 0 assumes a
- * good default value.
- *
- * @note It is not required to call this function prior to nl_connect().
- * @return 0 on sucess or a negative error code.
- */
-int nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf)
-{
-	int err;
-
-	if (rxbuf <= 0)
-		rxbuf = 32768;
-
-	if (txbuf <= 0)
-		txbuf = 32768;
-
-	if (sk->s_fd == -1)
-		return -NLE_BAD_SOCK;
-	
-	err = setsockopt(sk->s_fd, SOL_SOCKET, SO_SNDBUF,
-			 &txbuf, sizeof(txbuf));
-	if (err < 0)
-		return -nl_syserr2nlerr(errno);
-
-	err = setsockopt(sk->s_fd, SOL_SOCKET, SO_RCVBUF,
-			 &rxbuf, sizeof(rxbuf));
-	if (err < 0)
-		return -nl_syserr2nlerr(errno);
-
-	sk->s_flags |= NL_SOCK_BUFSIZE_SET;
-
-	return 0;
-}
-
-/**
- * Enable/disable credential passing on netlink socket.
- * @arg sk		Netlink socket.
- * @arg state		New state (0 - disabled, 1 - enabled)
- *
- * @return 0 on success or a negative error code
- */
-int nl_socket_set_passcred(struct nl_sock *sk, int state)
-{
-	int err;
-
-	if (sk->s_fd == -1)
-		return -NLE_BAD_SOCK;
-
-	err = setsockopt(sk->s_fd, SOL_SOCKET, SO_PASSCRED,
-			 &state, sizeof(state));
-	if (err < 0)
-		return -nl_syserr2nlerr(errno);
-
-	if (state)
-		sk->s_flags |= NL_SOCK_PASSCRED;
-	else
-		sk->s_flags &= ~NL_SOCK_PASSCRED;
-
-	return 0;
-}
-
-/**
- * Enable/disable receival of additional packet information
- * @arg sk		Netlink socket.
- * @arg state		New state (0 - disabled, 1 - enabled)
- *
- * @return 0 on success or a negative error code
- */
-int nl_socket_recv_pktinfo(struct nl_sock *sk, int state)
-{
-	int err;
-
-	if (sk->s_fd == -1)
-		return -NLE_BAD_SOCK;
-
-	err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_PKTINFO,
-			 &state, sizeof(state));
-	if (err < 0)
-		return -nl_syserr2nlerr(errno);
-
-	return 0;
-}
-
-/** @} */
-
-/** @} */
diff --git a/package/libs/libnl-tiny/src/unl.c b/package/libs/libnl-tiny/src/unl.c
deleted file mode 100644
index 33c020ea13f8..000000000000
--- a/package/libs/libnl-tiny/src/unl.c
+++ /dev/null
@@ -1,287 +0,0 @@
-#define _GNU_SOURCE
-#include <netlink/netlink.h>
-#include <netlink/genl/genl.h>
-#include <netlink/genl/ctrl.h>
-#include <netlink/genl/family.h>
-#include <sys/types.h>
-#include <net/if.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <linux/nl80211.h>
-
-#include "unl.h"
-
-static int unl_init(struct unl *unl)
-{
-	unl->sock = nl_socket_alloc();
-	if (!unl->sock)
-		return -1;
-
-	return 0;
-}
-
-int unl_genl_init(struct unl *unl, const char *family)
-{
-	memset(unl, 0, sizeof(*unl));
-
-	if (unl_init(unl))
-		goto error_out;
-
-	unl->hdrlen = NLMSG_ALIGN(sizeof(struct genlmsghdr));
-	unl->family_name = strdup(family);
-	if (!unl->family_name)
-		goto error;
-
-	if (genl_connect(unl->sock))
-		goto error;
-
-	if (genl_ctrl_alloc_cache(unl->sock, &unl->cache))
-		goto error;
-
-	unl->family = genl_ctrl_search_by_name(unl->cache, family);
-	if (!unl->family)
-		goto error;
-
-	return 0;
-
-error:
-	unl_free(unl);
-error_out:
-	return -1;
-}
-
-void unl_free(struct unl *unl)
-{
-	if (unl->family_name)
-		free(unl->family_name);
-
-	if (unl->sock)
-		nl_socket_free(unl->sock);
-
-	if (unl->cache)
-		nl_cache_free(unl->cache);
-
-	memset(unl, 0, sizeof(*unl));
-}
-
-static int
-ack_handler(struct nl_msg *msg, void *arg)
-{
-	int *err = arg;
-	*err = 0;
-	return NL_STOP;
-}
-
-static int
-finish_handler(struct nl_msg *msg, void *arg)
-{
-	int *err = arg;
-	*err = 0;
-	return NL_SKIP;
-}
-
-static int
-error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
-{
-	int *ret = arg;
-	*ret = err->error;
-	return NL_SKIP;
-}
-
-struct nl_msg *unl_genl_msg(struct unl *unl, int cmd, bool dump)
-{
-	struct nl_msg *msg;
-	int flags = 0;
-
-	msg = nlmsg_alloc();
-	if (!msg)
-		goto out;
-
-	if (dump)
-		flags |= NLM_F_DUMP;
-
-	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ,
-		    genl_family_get_id(unl->family), 0, flags, cmd, 0);
-
-out:
-	return msg;
-}
-
-int unl_genl_request(struct unl *unl, struct nl_msg *msg, unl_cb handler, void *arg)
-{
-	struct nl_cb *cb;
-	int err;
-
-	cb = nl_cb_alloc(NL_CB_CUSTOM);
-	err = nl_send_auto_complete(unl->sock, msg);
-	if (err < 0)
-		goto out;
-
-	err = 1;
-	nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
-	nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
-	nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);
-	if (handler)
-		nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, handler, arg);
-
-	while (err > 0)
-		nl_recvmsgs(unl->sock, cb);
-
-out:
-	nlmsg_free(msg);
-	nl_cb_put(cb);
-	return err;
-}
-
-static int request_single_cb(struct nl_msg *msg, void *arg)
-{
-	struct nl_msg **dest = arg;
-
-	if (!*dest) {
-		nlmsg_get(msg);
-		*dest = msg;
-	}
-	return NL_SKIP;
-}
-
-int unl_genl_request_single(struct unl *unl, struct nl_msg *msg, struct nl_msg **dest)
-{
-	*dest = NULL;
-	return unl_genl_request(unl, msg, request_single_cb, dest);
-}
-
-static int no_seq_check(struct nl_msg *msg, void *arg)
-{
-	return NL_OK;
-}
-
-void unl_genl_loop(struct unl *unl, unl_cb handler, void *arg)
-{
-	struct nl_cb *cb;
-
-	cb = nl_cb_alloc(NL_CB_CUSTOM);
-	unl->loop_done = false;
-	nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
-	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, handler, arg);
-
-	while (!unl->loop_done)
-		nl_recvmsgs(unl->sock, cb);
-
-	nl_cb_put(cb);
-}
-
-int unl_genl_multicast_id(struct unl *unl, const char *name)
-{
-	struct nlattr *tb[CTRL_ATTR_MCAST_GRP_MAX + 1];
-	struct nlattr *groups, *group;
-	struct nl_msg *msg;
-	int ctrlid;
-	int ret = -1;
-	int rem;
-
-	msg = nlmsg_alloc();
-	if (!msg)
-		return -1;
-
-	ctrlid = genl_ctrl_resolve(unl->sock, "nlctrl");
-	genlmsg_put(msg, 0, 0, ctrlid, 0, 0, CTRL_CMD_GETFAMILY, 0);
-	NLA_PUT_STRING(msg, CTRL_ATTR_FAMILY_NAME, unl->family_name);
-	unl_genl_request_single(unl, msg, &msg);
-	if (!msg)
-		return -1;
-
-	groups = unl_find_attr(unl, msg, CTRL_ATTR_MCAST_GROUPS);
-	if (!groups)
-		goto nla_put_failure;
-
-	nla_for_each_nested(group, groups, rem) {
-		const char *gn;
-
-		nla_parse(tb, CTRL_ATTR_MCAST_GRP_MAX, nla_data(group),
-			  nla_len(group), NULL);
-
-		if (!tb[CTRL_ATTR_MCAST_GRP_NAME] ||
-		    !tb[CTRL_ATTR_MCAST_GRP_ID])
-			continue;
-
-		gn = nla_data(tb[CTRL_ATTR_MCAST_GRP_NAME]);
-		if (strcmp(gn, name) != 0)
-			continue;
-
-		ret = nla_get_u32(tb[CTRL_ATTR_MCAST_GRP_ID]);
-		break;
-	}
-
-nla_put_failure:
-	nlmsg_free(msg);
-	return ret;
-}
-
-int unl_genl_subscribe(struct unl *unl, const char *name)
-{
-	int mcid;
-
-	mcid = unl_genl_multicast_id(unl, name);
-	if (mcid < 0)
-		return mcid;
-
-	return nl_socket_add_membership(unl->sock, mcid);
-}
-
-int unl_genl_unsubscribe(struct unl *unl, const char *name)
-{
-	int mcid;
-
-	mcid = unl_genl_multicast_id(unl, name);
-	if (mcid < 0)
-		return mcid;
-
-	return nl_socket_drop_membership(unl->sock, mcid);
-}
-
-int unl_nl80211_phy_lookup(const char *name)
-{
-	char buf[32];
-	int fd, pos;
-
-	snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/index", name);
-
-	fd = open(buf, O_RDONLY);
-	if (fd < 0)
-		return -1;
-	pos = read(fd, buf, sizeof(buf) - 1);
-	if (pos < 0) {
-		close(fd);
-		return -1;
-	}
-	buf[pos] = '\0';
-	close(fd);
-	return atoi(buf);
-}
-
-int unl_nl80211_wdev_to_phy(struct unl *unl, int wdev)
-{
-	struct nl_msg *msg;
-	struct nlattr *attr;
-	int ret = -1;
-
-	msg = unl_genl_msg(unl, NL80211_CMD_GET_INTERFACE, false);
-	if (!msg)
-		return -1;
-
-	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, wdev);
-	if (unl_genl_request_single(unl, msg, &msg) < 0)
-		return -1;
-
-	attr = unl_find_attr(unl, msg, NL80211_ATTR_WIPHY);
-	if (!attr)
-		goto out;
-
-	ret = nla_get_u32(attr);
-out:
-nla_put_failure:
-	nlmsg_free(msg);
-	return ret;
-}
-
-

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list