summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/netlink/route/link/inet6.h10
-rw-r--r--lib/route/link/inet6.c51
-rw-r--r--libnl-route-3.sym7
3 files changed, 66 insertions, 2 deletions
diff --git a/include/netlink/route/link/inet6.h b/include/netlink/route/link/inet6.h
index 7e819679..666a9b83 100644
--- a/include/netlink/route/link/inet6.h
+++ b/include/netlink/route/link/inet6.h
@@ -36,6 +36,16 @@ extern int rtnl_link_inet6_get_addr_gen_mode(struct rtnl_link *,
extern int rtnl_link_inet6_set_addr_gen_mode(struct rtnl_link *,
uint8_t);
+extern int rtnl_link_inet6_get_flags(struct rtnl_link *,
+ uint32_t *);
+
+extern int rtnl_link_inet6_set_flags(struct rtnl_link *,
+ uint32_t);
+
+/* Link Flags Translations */
+extern char * rtnl_link_inet6_flags2str(int, char *, size_t);
+extern int rtnl_link_inet6_str2flags(const char *);
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/route/link/inet6.c b/lib/route/link/inet6.c
index 3d2668cb..e638d066 100644
--- a/lib/route/link/inet6.c
+++ b/lib/route/link/inet6.c
@@ -248,12 +248,17 @@ static const struct trans_tbl inet6_flags[] = {
__ADD(IF_READY, ready),
};
-static char *inet6_flags2str(int flags, char *buf, size_t len)
+char *rtnl_link_inet6_flags2str(int flags, char *buf, size_t len)
{
return __flags2str(flags, buf, len, inet6_flags,
ARRAY_SIZE(inet6_flags));
}
+int rtnl_link_inet6_str2flags(const char *name)
+{
+ return __str2flags(name, inet6_flags, ARRAY_SIZE(inet6_flags));
+}
+
static const struct trans_tbl inet6_devconf[] = {
__ADD(DEVCONF_FORWARDING, forwarding),
__ADD(DEVCONF_HOPLIMIT, hoplimit),
@@ -322,7 +327,7 @@ static void inet6_dump_details(struct rtnl_link *link,
nl_size2str(i6->i6_cacheinfo.max_reasm_len, buf, sizeof(buf)));
nl_dump(p, " <%s>\n",
- inet6_flags2str(i6->i6_flags, buf, sizeof(buf)));
+ rtnl_link_inet6_flags2str(i6->i6_flags, buf, sizeof(buf)));
nl_dump_line(p, " create-stamp %.2fs reachable-time %s",
@@ -535,6 +540,48 @@ static struct rtnl_link_af_ops inet6_ops = {
};
/**
+ * Return IPv6 specific flags
+ * @arg link Link object
+ * @arg out_flags Flags on success
+ *
+ * Returns the link's IPv6 flags.
+ *
+ * @return 0 on success
+ * @return -NLE_NOATTR configuration setting not available
+ */
+int rtnl_link_inet6_get_flags(struct rtnl_link *link, uint32_t* out_flags)
+{
+ struct inet6_data *id = NULL;
+
+ if (!(id = rtnl_link_af_data(link, &inet6_ops)))
+ return -NLE_NOATTR;
+
+ *out_flags = id->i6_flags;
+ return 0;
+}
+
+/**
+ * Set IPv6 specific flags
+ * @arg link Link object
+ * @arg flags Flags to set
+ *
+ * Sets the link's IPv6 specific flags. Overwrites currently set flags.
+ *
+ * @return 0 on success
+ * @return -NLE_NOMEM could not allocate inet6 data
+ */
+int rtnl_link_inet6_set_flags(struct rtnl_link *link, uint32_t flags)
+{
+ struct inet6_data *id;
+
+ if (!(id = rtnl_link_af_alloc(link, &inet6_ops)))
+ return -NLE_NOMEM;
+
+ id->i6_flags = flags;
+ return 0;
+}
+
+/**
* Get IPv6 tokenized interface identifier
* @arg link Link object
* @arg token Tokenized interface identifier on success
diff --git a/libnl-route-3.sym b/libnl-route-3.sym
index af1ed2dd..21441857 100644
--- a/libnl-route-3.sym
+++ b/libnl-route-3.sym
@@ -1032,3 +1032,10 @@ global:
rtnl_u32_set_selector;
} libnl_3_2_28;
+libnl_3_4 {
+global:
+ rtnl_link_inet6_flags2str;
+ rtnl_link_inet6_str2flags;
+ rtnl_link_inet6_get_flags;
+ rtnl_link_inet6_set_flags;
+} libnl_3_2_29;