summaryrefslogtreecommitdiff
path: root/lib/route/addr.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/route/addr.c')
-rw-r--r--lib/route/addr.c102
1 files changed, 71 insertions, 31 deletions
diff --git a/lib/route/addr.c b/lib/route/addr.c
index 28734499..1f72c535 100644
--- a/lib/route/addr.c
+++ b/lib/route/addr.c
@@ -100,7 +100,8 @@
* @{
*/
-#include <netlink-private/netlink.h>
+#include "nl-default.h"
+
#include <netlink/netlink.h>
#include <netlink/route/rtnl.h>
#include <netlink/route/addr.h>
@@ -108,7 +109,47 @@
#include <netlink/route/link.h>
#include <netlink/utils.h>
+#include "nl-route.h"
+#include "nl-priv-dynamic-core/nl-core.h"
+#include "nl-priv-dynamic-core/cache-api.h"
+
/** @cond SKIP */
+struct rtnl_addr_cacheinfo {
+ /* Preferred lifetime in seconds, ticking from when the message gets constructed */
+ uint32_t aci_prefered;
+
+ /* Valid lifetime in seconds, ticking from when the message gets constructed */
+ uint32_t aci_valid;
+
+ /* Timestamp of creation in 1/100s since boottime, clock_gettime(CLOCK_MONOTONIC) */
+ uint32_t aci_cstamp;
+
+ /* Timestamp of last update in 1/100s since boottime, clock_gettime(CLOCK_MONOTONIC) */
+ uint32_t aci_tstamp;
+};
+
+struct rtnl_addr {
+ NLHDR_COMMON
+
+ uint8_t a_family;
+ uint8_t a_prefixlen;
+ uint8_t a_scope;
+ uint32_t a_flags;
+ uint32_t a_ifindex;
+
+ struct nl_addr *a_peer;
+ struct nl_addr *a_local;
+ struct nl_addr *a_bcast;
+ struct nl_addr *a_anycast;
+ struct nl_addr *a_multicast;
+
+ struct rtnl_addr_cacheinfo a_cacheinfo;
+
+ char a_label[IFNAMSIZ];
+ uint32_t a_flag_mask;
+ struct rtnl_link *a_link;
+};
+
#define ADDR_ATTR_FAMILY 0x0001
#define ADDR_ATTR_PREFIXLEN 0x0002
#define ADDR_ATTR_FLAGS 0x0004
@@ -493,41 +534,40 @@ static uint64_t addr_compare(struct nl_object *_a, struct nl_object *_b,
struct rtnl_addr *b = (struct rtnl_addr *) _b;
uint64_t diff = 0;
-#define ADDR_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ADDR_ATTR_##ATTR, a, b, EXPR)
-
- diff |= ADDR_DIFF(IFINDEX, a->a_ifindex != b->a_ifindex);
- diff |= ADDR_DIFF(FAMILY, a->a_family != b->a_family);
- diff |= ADDR_DIFF(SCOPE, a->a_scope != b->a_scope);
- diff |= ADDR_DIFF(LABEL, strcmp(a->a_label, b->a_label));
+#define _DIFF(ATTR, EXPR) ATTR_DIFF(attrs, ATTR, a, b, EXPR)
+ diff |= _DIFF(ADDR_ATTR_IFINDEX, a->a_ifindex != b->a_ifindex);
+ diff |= _DIFF(ADDR_ATTR_FAMILY, a->a_family != b->a_family);
+ diff |= _DIFF(ADDR_ATTR_SCOPE, a->a_scope != b->a_scope);
+ diff |= _DIFF(ADDR_ATTR_LABEL, strcmp(a->a_label, b->a_label));
if (attrs & ADDR_ATTR_PEER) {
- if ( (flags & ID_COMPARISON)
- && a->a_family == AF_INET
- && b->a_family == AF_INET
- && a->a_peer
- && b->a_peer
- && a->a_prefixlen == b->a_prefixlen) {
+ if ((flags & ID_COMPARISON) && a->a_family == AF_INET &&
+ b->a_family == AF_INET && a->a_peer && b->a_peer &&
+ a->a_prefixlen == b->a_prefixlen) {
/* when comparing two IPv4 addresses for id-equality, the network part
* of the PEER address shall be compared.
*/
- diff |= ADDR_DIFF(PEER, nl_addr_cmp_prefix(a->a_peer, b->a_peer));
+ diff |= _DIFF(ADDR_ATTR_PEER,
+ nl_addr_cmp_prefix(a->a_peer, b->a_peer));
} else
- diff |= ADDR_DIFF(PEER, nl_addr_cmp(a->a_peer, b->a_peer));
+ diff |= _DIFF(ADDR_ATTR_PEER,
+ nl_addr_cmp(a->a_peer, b->a_peer));
}
- diff |= ADDR_DIFF(LOCAL, nl_addr_cmp(a->a_local, b->a_local));
- diff |= ADDR_DIFF(MULTICAST, nl_addr_cmp(a->a_multicast,
- b->a_multicast));
- diff |= ADDR_DIFF(BROADCAST, nl_addr_cmp(a->a_bcast, b->a_bcast));
- diff |= ADDR_DIFF(ANYCAST, nl_addr_cmp(a->a_anycast, b->a_anycast));
- diff |= ADDR_DIFF(CACHEINFO, memcmp(&a->a_cacheinfo, &b->a_cacheinfo,
- sizeof (a->a_cacheinfo)));
+ diff |= _DIFF(ADDR_ATTR_LOCAL, nl_addr_cmp(a->a_local, b->a_local));
+ diff |= _DIFF(ADDR_ATTR_MULTICAST,
+ nl_addr_cmp(a->a_multicast, b->a_multicast));
+ diff |= _DIFF(ADDR_ATTR_BROADCAST, nl_addr_cmp(a->a_bcast, b->a_bcast));
+ diff |= _DIFF(ADDR_ATTR_ANYCAST,
+ nl_addr_cmp(a->a_anycast, b->a_anycast));
+ diff |= _DIFF(ADDR_ATTR_CACHEINFO,
+ memcmp(&a->a_cacheinfo, &b->a_cacheinfo,
+ sizeof(a->a_cacheinfo)));
if (flags & LOOSE_COMPARISON)
- diff |= ADDR_DIFF(FLAGS,
- (a->a_flags ^ b->a_flags) & b->a_flag_mask);
+ diff |= _DIFF(ADDR_ATTR_FLAGS,
+ (a->a_flags ^ b->a_flags) & b->a_flag_mask);
else
- diff |= ADDR_DIFF(FLAGS, a->a_flags != b->a_flags);
-
-#undef ADDR_DIFF
+ diff |= _DIFF(ADDR_ATTR_FLAGS, a->a_flags != b->a_flags);
+#undef _DIFF
return diff;
}
@@ -743,7 +783,7 @@ int rtnl_addr_build_add_request(struct rtnl_addr *addr, int flags,
*
* @see rtnl_addr_build_add_request()
*
- * @return 0 on sucess or a negative error if an error occured.
+ * @return 0 on success or a negative error if an error occured.
*/
int rtnl_addr_add(struct nl_sock *sk, struct rtnl_addr *addr, int flags)
{
@@ -815,7 +855,7 @@ int rtnl_addr_build_delete_request(struct rtnl_addr *addr, int flags,
*
* @see rtnl_addr_build_delete_request();
*
- * @return 0 on sucess or a negative error if an error occured.
+ * @return 0 on success or a negative error if an error occured.
*/
int rtnl_addr_delete(struct nl_sock *sk, struct rtnl_addr *addr, int flags)
{
@@ -1198,12 +1238,12 @@ static struct nl_cache_ops rtnl_addr_ops = {
.co_obj_ops = &addr_obj_ops,
};
-static void __init addr_init(void)
+static void _nl_init addr_init(void)
{
nl_cache_mngt_register(&rtnl_addr_ops);
}
-static void __exit addr_exit(void)
+static void _nl_exit addr_exit(void)
{
nl_cache_mngt_unregister(&rtnl_addr_ops);
}