19 #include <netlink-private/netlink.h>
20 #include <netlink-private/tc.h>
21 #include <netlink/netlink.h>
22 #include <netlink/attr.h>
23 #include <netlink/utils.h>
24 #include <netlink-private/route/tc-api.h>
25 #include <netlink/route/classifier.h>
26 #include <netlink/route/cls/cgroup.h>
27 #include <netlink/route/cls/ematch.h>
30 #define CGROUP_ATTR_EMATCH 0x001
33 static struct nla_policy cgroup_policy[TCA_CGROUP_MAX+1] = {
37 static int cgroup_clone(
void *dst,
void *src)
39 return -NLE_OPNOTSUPP;
42 static void cgroup_free_data(
struct rtnl_tc *tc,
void *data)
44 struct rtnl_cgroup *c = data;
52 static int cgroup_msg_parser(
struct rtnl_tc *tc,
void *data)
54 struct nlattr *tb[TCA_CGROUP_MAX + 1];
55 struct rtnl_cgroup *c = data;
58 err = tca_parse(tb, TCA_CGROUP_MAX, tc, cgroup_policy);
62 if (tb[TCA_CGROUP_EMATCHES]) {
66 c->cg_mask |= CGROUP_ATTR_EMATCH;
78 static void cgroup_dump_line(
struct rtnl_tc *tc,
void *data,
81 struct rtnl_cgroup *c = data;
86 if (c->cg_mask & CGROUP_ATTR_EMATCH)
92 static void cgroup_dump_details(
struct rtnl_tc *tc,
void *data,
95 struct rtnl_cgroup *c = data;
100 if (c->cg_mask & CGROUP_ATTR_EMATCH) {
101 nl_dump_line(p,
" ematch ");
104 rtnl_ematch_tree_dump(c->cg_ematch, p);
111 static int cgroup_fill_msg(
struct rtnl_tc *tc,
void *data,
114 struct rtnl_cgroup *c = data;
119 if (!(tc->ce_mask & TCA_ATTR_HANDLE))
120 return -NLE_MISSING_ATTR;
122 if (c->cg_mask & CGROUP_ATTR_EMATCH)
123 return rtnl_ematch_fill_attr(msg, TCA_CGROUP_EMATCHES,
135 void rtnl_cgroup_set_ematch(
struct rtnl_cls *cls,
struct rtnl_ematch_tree *tree)
137 struct rtnl_cgroup *c;
144 c->cg_mask &= ~CGROUP_ATTR_EMATCH;
150 c->cg_mask |= CGROUP_ATTR_EMATCH;
153 struct rtnl_ematch_tree *rtnl_cgroup_get_ematch(
struct rtnl_cls *cls)
155 struct rtnl_cgroup *c;
165 static struct rtnl_tc_ops cgroup_ops = {
167 .to_type = RTNL_TC_TYPE_CLS,
168 .to_size =
sizeof(
struct rtnl_cgroup),
169 .to_clone = cgroup_clone,
170 .to_msg_parser = cgroup_msg_parser,
171 .to_free_data = cgroup_free_data,
172 .to_msg_fill = cgroup_fill_msg,
179 static void __init cgroup_init(
void)
184 static void __exit cgroup_exit(
void)