diff options
-rw-r--r-- | include/netlink/route/link/inet6.h | 10 | ||||
-rw-r--r-- | lib/route/link/inet6.c | 51 | ||||
-rw-r--r-- | libnl-route-3.sym | 7 |
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; |