diff options
author | Thomas Winter <Thomas.Winter@alliedtelesis.co.nz> | 2018-06-11 21:04:46 (GMT) |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2022-03-11 23:07:47 (GMT) |
commit | ebc7df3b50ed09a04f07a0ef1ee70f7b25b02b6f (patch) | |
tree | c2882d976cd15ff8a6a860cb32ea39ab821f5d80 | |
parent | 8e1da8ec9d45bb6a3a09b8e263943ac7d7cac2eb (diff) | |
download | libnl-ebc7df3b50ed09a04f07a0ef1ee70f7b25b02b6f.zip libnl-ebc7df3b50ed09a04f07a0ef1ee70f7b25b02b6f.tar.gz libnl-ebc7df3b50ed09a04f07a0ef1ee70f7b25b02b6f.tar.bz2 |
sit: Add fwmark API
This is a new option that was added in Linux v4.12.
Signed-off-by: Thomas Winter <Thomas.Winter@alliedtelesis.co.nz>
-rw-r--r-- | doc/route.txt | 3 | ||||
-rw-r--r-- | include/netlink/route/link/sit.h | 3 | ||||
-rw-r--r-- | lib/route/link/sit.c | 52 | ||||
-rw-r--r-- | libnl-route-3.sym | 2 |
4 files changed, 60 insertions, 0 deletions
diff --git a/doc/route.txt b/doc/route.txt index 72e1300..44e0434 100644 --- a/doc/route.txt +++ b/doc/route.txt @@ -1103,6 +1103,9 @@ extern uint8_t rtnl_link_sit_get_tos(struct rtnl_link *link); extern int rtnl_link_sit_set_pmtudisc(struct rtnl_link *link, uint8_t pmtudisc); extern uint8_t rtnl_link_sit_get_pmtudisc(struct rtnl_link *link); +extern int rtnl_link_sit_set_fwmark(struct rtnl_link *link, uint32_t fwmark); +extern int rtnl_link_sit_get_fwmark(struct rtnl_link *link, uint32_t *fwmark); + ----- .Example: Add a sit tunnel device diff --git a/include/netlink/route/link/sit.h b/include/netlink/route/link/sit.h index 07bb3f1..f41e101 100644 --- a/include/netlink/route/link/sit.h +++ b/include/netlink/route/link/sit.h @@ -54,6 +54,9 @@ extern "C" { 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); + extern int rtnl_link_sit_set_fwmark(struct rtnl_link *link, uint32_t fwmark); + extern int rtnl_link_sit_get_fwmark(struct rtnl_link *link, uint32_t *fwmark); + #ifdef __cplusplus } #endif diff --git a/lib/route/link/sit.c b/lib/route/link/sit.c index 721c90e..fabb811 100644 --- a/lib/route/link/sit.c +++ b/lib/route/link/sit.c @@ -38,6 +38,7 @@ #define SIT_ATTR_6RD_RELAY_PREFIX (1 << 9) #define SIT_ATTR_6RD_PREFIXLEN (1 << 10) #define SIT_ATTR_6RD_RELAY_PREFIXLEN (1 << 11) +#define SIT_ATTR_FWMARK (1 << 12) struct sit_info { @@ -53,6 +54,7 @@ struct sit_info uint32_t ip6rd_relay_prefix; uint16_t ip6rd_prefixlen; uint16_t ip6rd_relay_prefixlen; + uint32_t fwmark; uint32_t sit_mask; }; @@ -69,6 +71,7 @@ static struct nla_policy sit_policy[IFLA_IPTUN_MAX + 1] = { [IFLA_IPTUN_6RD_RELAY_PREFIX] = { .type = NLA_U32 }, [IFLA_IPTUN_6RD_PREFIXLEN] = { .type = NLA_U16 }, [IFLA_IPTUN_6RD_RELAY_PREFIXLEN] = { .type = NLA_U16 }, + [IFLA_IPTUN_FWMARK] = { .type = NLA_U32 }, }; static int sit_alloc(struct rtnl_link *link) @@ -168,6 +171,11 @@ static int sit_parse(struct rtnl_link *link, struct nlattr *data, sit->sit_mask |= SIT_ATTR_6RD_RELAY_PREFIXLEN; } + if (tb[IFLA_IPTUN_FWMARK]) { + sit->fwmark = nla_get_u32(tb[IFLA_IPTUN_FWMARK]); + sit->sit_mask |= SIT_ATTR_FWMARK; + } + err = 0; errout: @@ -219,6 +227,9 @@ static int sit_put_attrs(struct nl_msg *msg, struct rtnl_link *link) if (sit->sit_mask & SIT_ATTR_6RD_RELAY_PREFIXLEN) NLA_PUT_U16(msg, IFLA_IPTUN_6RD_RELAY_PREFIXLEN, sit->ip6rd_relay_prefixlen); + if (sit->sit_mask & SIT_ATTR_FWMARK) + NLA_PUT_U32(msg, IFLA_IPTUN_FWMARK, sit->fwmark); + nla_nest_end(msg, data); nla_put_failure: @@ -320,6 +331,11 @@ static void sit_dump_details(struct rtnl_link *link, struct nl_dump_params *p) nl_dump(p, " 6rd_relay_prefixlen "); nl_dump_line(p, "%d\n", sit->ip6rd_relay_prefixlen); } + + if (sit->sit_mask & SIT_ATTR_FWMARK) { + nl_dump(p, " fwmark "); + nl_dump_line(p, "%x\n", sit->fwmark); + } } static int sit_clone(struct rtnl_link *dst, struct rtnl_link *src) @@ -806,6 +822,42 @@ int rtnl_link_sit_get_ip6rd_relay_prefixlen(struct rtnl_link *link, uint16_t *pr return 0; } +/** + * Set SIT tunnel fwmark + * @arg link Link object + * @arg fwmark fwmark + * + * @return 0 on success or a negative error code + */ +int rtnl_link_sit_set_fwmark(struct rtnl_link *link, uint32_t fwmark) +{ + IS_SIT_LINK_ASSERT(link, sit); + + sit->fwmark = fwmark; + sit->sit_mask |= SIT_ATTR_FWMARK; + + return 0; +} + +/** + * Get SIT tunnel fwmark + * @arg link Link object + * @arg fwmark addr to fill in with the fwmark + * + * @return 0 on success or a negative error code + */ +int rtnl_link_sit_get_fwmark(struct rtnl_link *link, uint32_t *fwmark) +{ + IS_SIT_LINK_ASSERT(link, sit); + + if (!(sit->sit_mask & SIT_ATTR_FWMARK)) + return -NLE_NOATTR; + + *fwmark = sit->fwmark; + + 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 f6f4a51..f3c6714 100644 --- a/libnl-route-3.sym +++ b/libnl-route-3.sym @@ -1201,6 +1201,8 @@ global: rtnl_link_is_ip6vti; rtnl_link_macsec_get_offload; rtnl_link_macsec_set_offload; + rtnl_link_sit_get_fwmark; + rtnl_link_sit_set_fwmark; rtnl_link_team_add; rtnl_link_team_alloc; rtnl_netconf_alloc_cache; |