summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-03-31 14:07:08 (GMT)
committerThomas Haller <thaller@redhat.com>2016-04-15 14:24:15 (GMT)
commit207dc0352779af46121a83fb4758cdd3155d9001 (patch)
tree3c427ad9652a4f0bc96beb0d1a6007ec1570c4de
parent962afc32df4d5ced16128652b30f48d19fef3cfa (diff)
downloadlibnl-207dc0352779af46121a83fb4758cdd3155d9001.zip
libnl-207dc0352779af46121a83fb4758cdd3155d9001.tar.gz
libnl-207dc0352779af46121a83fb4758cdd3155d9001.tar.bz2
sit: add public API for sit 6RD support
Signed-off-by: Thomas Haller <thaller@redhat.com>
-rw-r--r--include/netlink/route/link/sit.h12
-rw-r--r--lib/route/link/sit.c144
-rw-r--r--libnl-route-3.sym8
3 files changed, 164 insertions, 0 deletions
diff --git a/include/netlink/route/link/sit.h b/include/netlink/route/link/sit.h
index 37408ca..8f58d0a 100644
--- a/include/netlink/route/link/sit.h
+++ b/include/netlink/route/link/sit.h
@@ -46,6 +46,18 @@ extern "C" {
int rtnl_link_sit_set_proto(struct rtnl_link *link, uint8_t proto);
uint8_t rtnl_link_sit_get_proto(struct rtnl_link *link);
+ int rtnl_link_sit_set_ip6rd_prefix(struct rtnl_link *link, const struct in6_addr *prefix);
+ int rtnl_link_sit_get_ip6rd_prefix(const struct rtnl_link *link, struct in6_addr *prefix);
+
+ int rtnl_link_sit_set_ip6rd_prefixlen(struct rtnl_link *link, uint16_t prefixlen);
+ int rtnl_link_sit_get_ip6rd_prefixlen(struct rtnl_link *link, uint16_t *prefixlen);
+
+ int rtnl_link_sit_set_ip6rd_relay_prefix(struct rtnl_link *link, uint32_t prefix);
+ int rtnl_link_sit_get_ip6rd_relay_prefix(const struct rtnl_link *link, uint32_t *prefix);
+
+ int rtnl_link_sit_set_ip6rd_relay_prefixlen(struct rtnl_link *link, uint16_t prefix);
+ int rtnl_link_sit_get_ip6rd_relay_prefixlen(struct rtnl_link *link, uint16_t *prefix);
+
#ifdef _cplusplus
}
#endif
diff --git a/lib/route/link/sit.c b/lib/route/link/sit.c
index 3306f53..c64cbf5 100644
--- a/lib/route/link/sit.c
+++ b/lib/route/link/sit.c
@@ -668,6 +668,150 @@ uint8_t rtnl_link_sit_get_proto(struct rtnl_link *link)
return sit->proto;
}
+/**
+ * Set ip6rd prefix
+ * @arg link Link object
+ * @arg prefix The IPv6 prefix
+ *
+ * @return 0 on success or an error code.
+ */
+int rtnl_link_sit_set_ip6rd_prefix(struct rtnl_link *link, const struct in6_addr *prefix)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ sit->ip6rd_prefix = *prefix;
+ sit->sit_mask |= SIT_ATTR_6RD_PREFIX;
+ return 0;
+}
+
+/**
+ * Get ip6rd prefix
+ * @arg link Link object
+ * @arg prefix The output IPv6 prefix
+ *
+ * @return 0 on success or an error code. If the property is unset,
+ * this call fails too.
+ */
+int rtnl_link_sit_get_ip6rd_prefix(const struct rtnl_link *link, struct in6_addr *prefix)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ if (!(sit->sit_mask & SIT_ATTR_6RD_PREFIX))
+ return -NLE_NOATTR;
+
+ if (prefix)
+ *prefix = sit->ip6rd_prefix;
+ return 0;
+}
+
+/**
+ * Set ip6rd prefix length
+ * @arg link Link object
+ * @arg prefixlen The IPv6 prefix length
+ *
+ * @return 0 on success or an error code.
+ */
+int rtnl_link_sit_set_ip6rd_prefixlen(struct rtnl_link *link, uint16_t prefixlen)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ sit->sit_mask |= SIT_ATTR_6RD_PREFIXLEN;
+ sit->ip6rd_prefixlen = prefixlen;
+ return 0;
+}
+
+/**
+ * Get ip6rd prefix length
+ * @arg link Link object
+ * @arg prefixlen Output pointer for the prefix length
+ *
+ * @return 0 on success or an error code. If the property is unset,
+ * this call fails.
+ */
+int rtnl_link_sit_get_ip6rd_prefixlen(struct rtnl_link *link, uint16_t *prefixlen)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ if (!(sit->sit_mask & SIT_ATTR_6RD_PREFIXLEN))
+ return -NLE_NOATTR;
+
+ if (prefixlen)
+ *prefixlen = sit->ip6rd_prefixlen;
+ return 0;
+}
+
+/**
+ * Set ip6rd relay prefix
+ * @arg link Link object
+ * @arg prefix The IPv6 prefix length
+ *
+ * @return 0 on success or an error code.
+ */
+int rtnl_link_sit_set_ip6rd_relay_prefix(struct rtnl_link *link, uint32_t prefix)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ sit->sit_mask |= SIT_ATTR_6RD_RELAY_PREFIX;
+ sit->ip6rd_relay_prefix = prefix;
+ return 0;
+}
+
+/**
+ * Get ip6rd prefix length
+ * @arg link Link object
+ * @arg prefixlen Output pointer for the prefix length
+ *
+ * @return 0 on success or an error code. If the property is unset,
+ * this call fails.
+ */
+int rtnl_link_sit_get_ip6rd_relay_prefix(const struct rtnl_link *link, uint32_t *prefix)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ if (!(sit->sit_mask & SIT_ATTR_6RD_RELAY_PREFIX))
+ return -NLE_NOATTR;
+
+ if (prefix)
+ *prefix = sit->ip6rd_relay_prefix;
+ return 0;
+}
+
+/**
+ * Set ip6rd relay prefix length
+ * @arg link Link object
+ * @arg prefixlen The IPv6 prefix length
+ *
+ * @return 0 on success or an error code.
+ */
+int rtnl_link_sit_set_ip6rd_relay_prefixlen(struct rtnl_link *link, uint16_t prefixlen)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ sit->sit_mask |= SIT_ATTR_6RD_RELAY_PREFIXLEN;
+ sit->ip6rd_relay_prefixlen = prefixlen;
+ return 0;
+}
+
+/**
+ * Get ip6rd relay prefix length
+ * @arg link Link object
+ * @arg prefixlen Output pointer for the prefix length
+ *
+ * @return 0 on success or an error code. If the property is unset,
+ * this call fails.
+ */
+int rtnl_link_sit_get_ip6rd_relay_prefixlen(struct rtnl_link *link, uint16_t *prefixlen)
+{
+ IS_SIT_LINK_ASSERT(link, sit);
+
+ if (!(sit->sit_mask & SIT_ATTR_6RD_RELAY_PREFIX))
+ return -NLE_NOATTR;
+
+ if (prefixlen)
+ *prefixlen = sit->ip6rd_relay_prefixlen;
+ return 0;
+}
+
static void __init sit_init(void)
{
rtnl_link_register_info(&sit_info_ops);
diff --git a/libnl-route-3.sym b/libnl-route-3.sym
index cd2b824..2c72498 100644
--- a/libnl-route-3.sym
+++ b/libnl-route-3.sym
@@ -905,6 +905,14 @@ global:
rtnl_link_macvtap_str2flags;
rtnl_link_macvtap_str2mode;
rtnl_link_macvtap_unset_flags;
+ rtnl_link_sit_get_ip6rd_prefix;
+ rtnl_link_sit_get_ip6rd_prefixlen;
+ rtnl_link_sit_get_ip6rd_relay_prefix;
+ rtnl_link_sit_get_ip6rd_relay_prefixlen;
+ rtnl_link_sit_set_ip6rd_prefix;
+ rtnl_link_sit_set_ip6rd_prefixlen;
+ rtnl_link_sit_set_ip6rd_relay_prefix;
+ rtnl_link_sit_set_ip6rd_relay_prefixlen;
rtnl_link_vrf_alloc;
rtnl_link_vrf_get_tableid;
rtnl_link_vrf_set_tableid;