summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-09-01 12:38:22 (GMT)
committerThomas Haller <thaller@redhat.com>2019-09-01 12:38:59 (GMT)
commitff61de28d738df8135e59cc44123fbc71f99707e (patch)
tree843775300cf3ffa1d06e92a4170b016f2439c747
parentd147019c4bbb856be13042d89e95b859f01c808d (diff)
downloadlibnl-ff61de28d738df8135e59cc44123fbc71f99707e.zip
libnl-ff61de28d738df8135e59cc44123fbc71f99707e.tar.gz
libnl-ff61de28d738df8135e59cc44123fbc71f99707e.tar.bz2
xfrmi: return error code from getters for XFRM links
Returning the value directly as uint32_t does not leave room for an error code. E.g. we want to indicate to the caller whether the attribute is present or not (-NLE_NOATTR). Currenlty, the code is quite unforgiving and will just crash/assert against invalid arguments. In theory, we could also be more forgiving and return a error code if the link argument is invalid.
-rw-r--r--include/netlink/route/link/xfrmi.h4
-rw-r--r--lib/route/link/xfrmi.c33
2 files changed, 22 insertions, 15 deletions
diff --git a/include/netlink/route/link/xfrmi.h b/include/netlink/route/link/xfrmi.h
index f361229..6e4cda7 100644
--- a/include/netlink/route/link/xfrmi.h
+++ b/include/netlink/route/link/xfrmi.h
@@ -25,10 +25,10 @@ extern "C" {
extern int rtnl_link_is_xfrmi(struct rtnl_link *link);
extern int rtnl_link_xfrmi_set_link(struct rtnl_link *link, uint32_t index);
- extern uint32_t rtnl_link_xfrmi_get_link(struct rtnl_link *link);
+ extern int rtnl_link_xfrmi_get_link(struct rtnl_link *link, uint32_t *out_link);
extern int rtnl_link_xfrmi_set_if_id(struct rtnl_link *link, uint32_t if_id);
- extern uint32_t rtnl_link_xfrmi_get_if_id(struct rtnl_link *link);
+ extern int rtnl_link_xfrmi_get_if_id(struct rtnl_link *link, uint32_t *out_if_id);
#ifdef __cplusplus
}
diff --git a/lib/route/link/xfrmi.c b/lib/route/link/xfrmi.c
index 65533a6..5a4a563 100644
--- a/lib/route/link/xfrmi.c
+++ b/lib/route/link/xfrmi.c
@@ -67,7 +67,7 @@ static int xfrmi_alloc(struct rtnl_link *link)
}
static int xfrmi_parse(struct rtnl_link *link, struct nlattr *data,
- struct nlattr *xstats)
+ struct nlattr *xstats)
{
struct nlattr *tb[IFLA_XFRM_MAX + 1];
struct xfrmi_info *xfrmi;
@@ -77,11 +77,11 @@ static int xfrmi_parse(struct rtnl_link *link, struct nlattr *data,
err = nla_parse_nested(tb, IFLA_XFRM_MAX, data, xfrmi_policy);
if (err < 0)
- goto errout;
+ return err;
err = xfrmi_alloc(link);
if (err < 0)
- goto errout;
+ return err;
xfrmi = link->l_info;
@@ -95,10 +95,7 @@ static int xfrmi_parse(struct rtnl_link *link, struct nlattr *data,
xfrmi->xfrmi_mask |= XFRMI_ATTR_IF_ID;
}
- err = 0;
-
-errout:
- return err;
+ return 0;
}
static int xfrmi_put_attrs(struct nl_msg *msg, struct rtnl_link *link)
@@ -255,16 +252,21 @@ int rtnl_link_xfrmi_set_link(struct rtnl_link *link, uint32_t index)
/**
* Get XFRMI link interface index
* @arg link Link object
+ * @arg out_link The output value on success
*
- * @return interface index
+ * @return 0 on sucess or a negative error code
*/
-uint32_t rtnl_link_xfrmi_get_link(struct rtnl_link *link)
+int rtnl_link_xfrmi_get_link(struct rtnl_link *link, uint32_t *out_link)
{
struct xfrmi_info *xfrmi = link->l_info;
IS_XFRMI_LINK_ASSERT(link);
- return xfrmi->link;
+ if (!(xfrmi->xfrmi_mask & XFRMI_ATTR_LINK))
+ return -NLE_NOATTR;
+
+ *out_link = xfrmi->link;
+ return 0;
}
/**
@@ -289,16 +291,21 @@ int rtnl_link_xfrmi_set_if_id(struct rtnl_link *link, uint32_t if_id)
/**
* Get XFRMI if_id
* @arg link Link object
+ * @arg out_if_id The output value on success
*
- * @return if_id
+ * @return 0 on sucess or a negative error code
*/
-uint32_t rtnl_link_xfrmi_get_if_id(struct rtnl_link *link)
+int rtnl_link_xfrmi_get_if_id(struct rtnl_link *link, uint32_t *out_if_id)
{
struct xfrmi_info *xfrmi = link->l_info;
IS_XFRMI_LINK_ASSERT(link);
- return xfrmi->if_id;
+ if (!(xfrmi->xfrmi_mask & XFRMI_ATTR_IF_ID))
+ return -NLE_NOATTR;
+
+ *out_if_id = xfrmi->if_id;
+ return 0;
}
static void __init xfrmi_init(void)