diff options
author | Thomas Haller <thaller@redhat.com> | 2016-03-31 14:07:08 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-04-15 14:24:15 (GMT) |
commit | 207dc0352779af46121a83fb4758cdd3155d9001 (patch) | |
tree | 3c427ad9652a4f0bc96beb0d1a6007ec1570c4de | |
parent | 962afc32df4d5ced16128652b30f48d19fef3cfa (diff) | |
download | libnl-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.h | 12 | ||||
-rw-r--r-- | lib/route/link/sit.c | 144 | ||||
-rw-r--r-- | libnl-route-3.sym | 8 |
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; |