summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Winter <Thomas.Winter@alliedtelesis.co.nz>2018-06-11 21:04:46 (GMT)
committerThomas Haller <thaller@redhat.com>2022-03-11 23:07:47 (GMT)
commitebc7df3b50ed09a04f07a0ef1ee70f7b25b02b6f (patch)
treec2882d976cd15ff8a6a860cb32ea39ab821f5d80
parent8e1da8ec9d45bb6a3a09b8e263943ac7d7cac2eb (diff)
downloadlibnl-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.txt3
-rw-r--r--include/netlink/route/link/sit.h3
-rw-r--r--lib/route/link/sit.c52
-rw-r--r--libnl-route-3.sym2
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;