summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorVolodymyr Bendiuga <volodymyr.bendiuga@westermo.se>2018-05-03 08:51:35 +0200
committerThomas Haller <thaller@redhat.com>2018-10-10 11:00:21 +0200
commitc9b28170e7199b3ba63a73c7dad7c2eacab46e72 (patch)
treeffdf37caf7f2dc19f4855884748165cafb802b7b /lib
parent1bffe3cc6739d95c1a42f12b417e98f9d6ee5e80 (diff)
downloadplatform_external_libnl-c9b28170e7199b3ba63a73c7dad7c2eacab46e72.tar.gz
platform_external_libnl-c9b28170e7199b3ba63a73c7dad7c2eacab46e72.tar.bz2
platform_external_libnl-c9b28170e7199b3ba63a73c7dad7c2eacab46e72.zip
route:tc: allow to set chain index for tc objects
This is useful when one wants to chain filters. Signed-off-by: Volodymyr Bendiuga <volodymyr.bendiuga@westermo.se>
Diffstat (limited to 'lib')
-rw-r--r--lib/route/tc.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/route/tc.c b/lib/route/tc.c
index 694c48e..4b185ed 100644
--- a/lib/route/tc.c
+++ b/lib/route/tc.c
@@ -32,6 +32,7 @@ static struct rtnl_tc_type_ops *tc_type_ops[__RTNL_TC_TYPE_MAX];
static struct nla_policy tc_policy[TCA_MAX+1] = {
[TCA_KIND] = { .type = NLA_STRING,
.maxlen = TCKINDSIZ },
+ [TCA_CHAIN] = { .type = NLA_U32 },
[TCA_STATS] = { .minlen = sizeof(struct tc_stats) },
[TCA_STATS2] = { .type = NLA_NESTED },
};
@@ -79,6 +80,9 @@ int rtnl_tc_msg_parse(struct nlmsghdr *n, struct rtnl_tc *tc)
nla_strlcpy(kind, tb[TCA_KIND], sizeof(kind));
rtnl_tc_set_kind(tc, kind);
+ if (tb[TCA_CHAIN])
+ rtnl_tc_set_chain(tc, nla_get_u32(tb[TCA_CHAIN]));
+
tm = nlmsg_data(n);
tc->tc_family = tm->tcm_family;
tc->tc_ifindex = tm->tcm_ifindex;
@@ -216,6 +220,9 @@ int rtnl_tc_msg_build(struct rtnl_tc *tc, int type, int flags,
if (tc->ce_mask & TCA_ATTR_KIND)
NLA_PUT_STRING(msg, TCA_KIND, tc->tc_kind);
+ if (tc->ce_mask & TCA_ATTR_CHAIN)
+ NLA_PUT_U32(msg, TCA_CHAIN, tc->tc_chain);
+
ops = rtnl_tc_get_ops(tc);
if (ops && (ops->to_msg_fill || ops->to_msg_fill_raw)) {
struct nlattr *opts;
@@ -560,6 +567,32 @@ uint64_t rtnl_tc_get_stat(struct rtnl_tc *tc, enum rtnl_tc_stat id)
return tc->tc_stats[id];
}
+/**
+ * Set the chain index of a traffic control object
+ * @arg tc traffic control object
+ * @arg chain chain index of traffic control object
+ *
+ */
+void rtnl_tc_set_chain(struct rtnl_tc *tc, uint32_t chain)
+{
+ tc->tc_chain = chain;
+ tc->ce_mask |= TCA_ATTR_CHAIN;
+}
+
+/**
+ * Return chain index of traffic control object
+ * @arg tc traffic control object
+ *
+ * @return chain index of traffic control object or 0 if not set.
+ */
+uint32_t rtnl_tc_get_chain(struct rtnl_tc *tc)
+{
+ if (tc->ce_mask & TCA_ATTR_CHAIN)
+ return tc->tc_chain;
+ else
+ return 0;
+}
+
/** @} */
/**