From f5f49c224835c555df9e2c1f79ac5adf4640f4a8 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Wed, 7 Apr 2010 19:19:14 +0200 Subject: [PATCH] addr: restore anycast functions Seems it got lost during some cleanups. Signed-off-by: Patrick McHardy --- include/netlink/route/addr.h | 3 +++ lib/route/addr.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/netlink/route/addr.h b/include/netlink/route/addr.h index 826deae..1381486 100644 --- a/include/netlink/route/addr.h +++ b/include/netlink/route/addr.h @@ -74,6 +74,9 @@ extern struct nl_addr *rtnl_addr_get_broadcast(struct rtnl_addr *); extern int rtnl_addr_set_multicast(struct rtnl_addr *, struct nl_addr *); extern struct nl_addr *rtnl_addr_get_multicast(struct rtnl_addr *); +extern int rtnl_addr_set_anycast(struct rtnl_addr *, struct nl_addr *); +extern struct nl_addr *rtnl_addr_get_anycast(struct rtnl_addr *); + extern uint32_t rtnl_addr_get_valid_lifetime(struct rtnl_addr *); extern void rtnl_addr_set_valid_lifetime(struct rtnl_addr *, uint32_t); extern uint32_t rtnl_addr_get_preferred_lifetime(struct rtnl_addr *); diff --git a/lib/route/addr.c b/lib/route/addr.c index d14c481..b170a50 100644 --- a/lib/route/addr.c +++ b/lib/route/addr.c @@ -126,6 +126,7 @@ #define ADDR_ATTR_LOCAL 0x0100 #define ADDR_ATTR_BROADCAST 0x0200 #define ADDR_ATTR_MULTICAST 0x0400 +#define ADDR_ATTR_ANYCAST 0x0800 static struct nl_cache_ops rtnl_addr_ops; static struct nl_object_ops addr_obj_ops; @@ -149,6 +150,7 @@ static void addr_free_data(struct nl_object *obj) nl_addr_put(addr->a_local); nl_addr_put(addr->a_bcast); nl_addr_put(addr->a_multicast); + nl_addr_put(addr->a_anycast); } static int addr_clone(struct nl_object *_dst, struct nl_object *_src) @@ -172,6 +174,10 @@ static int addr_clone(struct nl_object *_dst, struct nl_object *_src) if (!(dst->a_multicast = nl_addr_clone(src->a_multicast))) return -NLE_NOMEM; + if (src->a_anycast) + if (!(dst->a_anycast = nl_addr_clone(src->a_anycast))) + return -NLE_NOMEM; + return 0; } @@ -273,6 +279,15 @@ static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who, addr->ce_mask |= ADDR_ATTR_MULTICAST; } + if (tb[IFA_ANYCAST]) { + addr->a_anycast = nl_addr_alloc_attr(tb[IFA_ANYCAST], + family); + if (!addr->a_anycast) + goto errout_nomem; + + addr->ce_mask |= ADDR_ATTR_ANYCAST; + } + err = pp->pp_cb((struct nl_object *) addr, pp); errout: rtnl_addr_put(addr); @@ -349,6 +364,11 @@ static void addr_dump_details(struct nl_object *obj, struct nl_dump_params *p) nl_addr2str(addr->a_multicast, buf, sizeof(buf))); + if (addr->ce_mask & ADDR_ATTR_ANYCAST) + nl_dump(p, " anycast %s", + nl_addr2str(addr->a_anycast, buf, + sizeof(buf))); + nl_dump(p, "\n"); } @@ -398,6 +418,7 @@ static int addr_compare(struct nl_object *_a, struct nl_object *_b, 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)); if (flags & LOOSE_COMPARISON) diff |= ADDR_DIFF(FLAGS, @@ -825,6 +846,17 @@ struct nl_addr *rtnl_addr_get_multicast(struct rtnl_addr *addr) return addr->a_multicast; } +int rtnl_addr_set_anycast(struct rtnl_addr *addr, struct nl_addr *anycast) +{ + return __assign_addr(addr, &addr->a_anycast, anycast, + ADDR_ATTR_ANYCAST); +} + +struct nl_addr *rtnl_addr_get_anycast(struct rtnl_addr *addr) +{ + return addr->a_anycast; +} + uint32_t rtnl_addr_get_valid_lifetime(struct rtnl_addr *addr) { if (addr->ce_mask & ADDR_ATTR_CACHEINFO)