summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2012-11-11 16:36:29 +0100
committerThomas Graf <tgraf@suug.ch>2012-11-11 16:36:29 +0100
commit5a0476032e19f6abd65daa488b3091e8600b5f9e (patch)
treed7c5ebe112ff4a53efa44679336b02a676c3144f
parent7e075c600de9619530ab32d13ee931e7393362ea (diff)
downloadlibnl-5a0476032e19f6abd65daa488b3091e8600b5f9e.tar.gz
addr: Return -NLE_AF_NOSUPPORT when trying to set unsupported attributes
- multicast and anycast address only supported with IPv6 - brodcast address only supported with IPv4 Signed-off-by: Thomas Graf <tgraf@suug.ch>
-rw-r--r--lib/route/addr.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/route/addr.c b/lib/route/addr.c
index 8ae16ef..430fb54 100644
--- a/lib/route/addr.c
+++ b/lib/route/addr.c
@@ -6,7 +6,7 @@
* License as published by the Free Software Foundation version 2.1
* of the License.
*
- * Copyright (c) 2003-2011 Thomas Graf <tgraf@suug.ch>
+ * Copyright (c) 2003-2012 Thomas Graf <tgraf@suug.ch>
* Copyright (c) 2003-2006 Baruch Even <baruch@ev-en.org>,
* Mediatrix Telecom, inc. <ericb@mediatrix.com>
*/
@@ -227,6 +227,7 @@ static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
addr->ce_mask |= ADDR_ATTR_LABEL;
}
+ /* IPv6 only */
if (tb[IFA_CACHEINFO]) {
struct ifa_cacheinfo *ca;
@@ -269,6 +270,7 @@ static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
nl_addr_set_prefixlen(peer_prefix ? addr->a_peer : addr->a_local,
addr->a_prefixlen);
+ /* IPv4 only */
if (tb[IFA_BROADCAST]) {
addr->a_bcast = nl_addr_alloc_attr(tb[IFA_BROADCAST], family);
if (!addr->a_bcast)
@@ -277,6 +279,7 @@ static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
addr->ce_mask |= ADDR_ATTR_BROADCAST;
}
+ /* IPv6 only */
if (tb[IFA_MULTICAST]) {
addr->a_multicast = nl_addr_alloc_attr(tb[IFA_MULTICAST],
family);
@@ -286,6 +289,7 @@ static int addr_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
addr->ce_mask |= ADDR_ATTR_MULTICAST;
}
+ /* IPv6 only */
if (tb[IFA_ANYCAST]) {
addr->a_anycast = nl_addr_alloc_attr(tb[IFA_ANYCAST],
family);
@@ -899,6 +903,9 @@ struct nl_addr *rtnl_addr_get_peer(struct rtnl_addr *addr)
int rtnl_addr_set_broadcast(struct rtnl_addr *addr, struct nl_addr *bcast)
{
+ if (bcast->a_family != AF_INET)
+ return -NLE_AF_NOSUPPORT;
+
return __assign_addr(addr, &addr->a_bcast, bcast, ADDR_ATTR_BROADCAST);
}
@@ -909,6 +916,9 @@ struct nl_addr *rtnl_addr_get_broadcast(struct rtnl_addr *addr)
int rtnl_addr_set_multicast(struct rtnl_addr *addr, struct nl_addr *multicast)
{
+ if (multicast->a_family != AF_INET6)
+ return -NLE_AF_NOSUPPORT;
+
return __assign_addr(addr, &addr->a_multicast, multicast,
ADDR_ATTR_MULTICAST);
}
@@ -920,6 +930,9 @@ struct nl_addr *rtnl_addr_get_multicast(struct rtnl_addr *addr)
int rtnl_addr_set_anycast(struct rtnl_addr *addr, struct nl_addr *anycast)
{
+ if (anycast->a_family != AF_INET6)
+ return -NLE_AF_NOSUPPORT;
+
return __assign_addr(addr, &addr->a_anycast, anycast,
ADDR_ATTR_ANYCAST);
}