diff options
author | Thomas Graf <tgraf@suug.ch> | 2012-11-11 16:36:29 +0100 |
---|---|---|
committer | Thomas Graf <tgraf@suug.ch> | 2012-11-11 16:36:29 +0100 |
commit | 5a0476032e19f6abd65daa488b3091e8600b5f9e (patch) | |
tree | d7c5ebe112ff4a53efa44679336b02a676c3144f | |
parent | 7e075c600de9619530ab32d13ee931e7393362ea (diff) | |
download | libnl-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.c | 15 |
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); } |