20 #include <netlink-generic.h>
21 #include <netlink/netlink.h>
22 #include <netlink/genl/genl.h>
23 #include <netlink/genl/family.h>
24 #include <netlink/utils.h>
27 #define FAMILY_ATTR_ID 0x01
28 #define FAMILY_ATTR_NAME 0x02
29 #define FAMILY_ATTR_VERSION 0x04
30 #define FAMILY_ATTR_HDRSIZE 0x08
31 #define FAMILY_ATTR_MAXATTR 0x10
32 #define FAMILY_ATTR_OPS 0x20
37 static void family_constructor(
struct nl_object *c)
39 struct genl_family *family = (
struct genl_family *) c;
41 nl_init_list_head(&family->gf_ops);
44 static void family_free_data(
struct nl_object *c)
46 struct genl_family *family = (
struct genl_family *) c;
47 struct genl_family_op *ops, *tmp;
52 nl_list_for_each_entry_safe(ops, tmp, &family->gf_ops, o_list) {
53 nl_list_del(&ops->o_list);
58 static int family_clone(
struct nl_object *_dst,
struct nl_object *_src)
60 struct genl_family *dst = nl_object_priv(_dst);
61 struct genl_family *src = nl_object_priv(_src);
62 struct genl_family_op *ops;
65 nl_list_for_each_entry(ops, &src->gf_ops, o_list) {
66 err = genl_family_add_op(dst, ops->o_id, ops->o_flags);
74 static int family_dump_brief(
struct nl_object *obj,
struct nl_dump_params *p)
76 struct genl_family *family = (
struct genl_family *) obj;
78 dp_dump(p,
"0x%04x %s version %u\n",
79 family->gf_id, family->gf_name, family->gf_version);
84 static struct trans_tbl ops_flags[] = {
85 __ADD(GENL_ADMIN_PERM, admin-perm)
86 __ADD(GENL_CMD_CAP_DO, has-doit)
87 __ADD(GENL_CMD_CAP_DUMP, has-dump)
88 __ADD(GENL_CMD_CAP_HASPOL, has-policy)
91 static
char *ops_flags2str(
int flags,
char *buf,
size_t len)
93 return __flags2str(flags, buf, len, ops_flags, ARRAY_SIZE(ops_flags));
96 static int family_dump_full(
struct nl_object *obj,
struct nl_dump_params *p)
98 struct genl_family *family = (
struct genl_family *) obj;
101 line = family_dump_brief(obj, p);
102 dp_dump_line(p, line++,
" hdrsize %u maxattr %u\n",
103 family->gf_hdrsize, family->gf_maxattr);
105 if (family->ce_mask & FAMILY_ATTR_OPS) {
106 struct genl_family_op *op;
109 nl_list_for_each_entry(op, &family->gf_ops, o_list) {
110 ops_flags2str(op->o_flags, buf,
sizeof(buf));
112 genl_op2name(family->gf_id, op->o_id, buf,
sizeof(buf));
114 dp_dump_line(p, line++,
" op %s (0x%02x)",
119 ops_flags2str(op->o_flags, buf,
129 static int family_dump_stats(
struct nl_object *obj,
struct nl_dump_params *p)
131 return family_dump_full(obj, p);
134 static int family_compare(
struct nl_object *_a,
struct nl_object *_b,
135 uint32_t attrs,
int flags)
137 struct genl_family *a = (
struct genl_family *) _a;
138 struct genl_family *b = (
struct genl_family *) _b;
141 #define FAM_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, FAMILY_ATTR_##ATTR, a, b, EXPR)
143 diff |= FAM_DIFF(ID, a->gf_id != b->gf_id);
144 diff |= FAM_DIFF(VERSION, a->gf_version != b->gf_version);
145 diff |= FAM_DIFF(HDRSIZE, a->gf_hdrsize != b->gf_hdrsize);
146 diff |= FAM_DIFF(MAXATTR, a->gf_maxattr != b->gf_maxattr);
147 diff |= FAM_DIFF(NAME, strcmp(a->gf_name, b->gf_name));
160 struct genl_family *genl_family_alloc(
void)
165 void genl_family_put(
struct genl_family *family)
177 unsigned int genl_family_get_id(
struct genl_family *family)
179 if (family->ce_mask & FAMILY_ATTR_ID)
180 return family->gf_id;
182 return GENL_ID_GENERATE;
185 void genl_family_set_id(
struct genl_family *family,
unsigned int id)
188 family->ce_mask |= FAMILY_ATTR_ID;
191 char *genl_family_get_name(
struct genl_family *family)
193 if (family->ce_mask & FAMILY_ATTR_NAME)
194 return family->gf_name;
199 void genl_family_set_name(
struct genl_family *family,
const char *name)
201 strncpy(family->gf_name, name, GENL_NAMSIZ-1);
202 family->ce_mask |= FAMILY_ATTR_NAME;
205 uint8_t genl_family_get_version(
struct genl_family *family)
207 if (family->ce_mask & FAMILY_ATTR_VERSION)
208 return family->gf_version;
213 void genl_family_set_version(
struct genl_family *family, uint8_t version)
215 family->gf_version = version;
216 family->ce_mask |= FAMILY_ATTR_VERSION;
219 uint32_t genl_family_get_hdrsize(
struct genl_family *family)
221 if (family->ce_mask & FAMILY_ATTR_HDRSIZE)
222 return family->gf_hdrsize;
227 void genl_family_set_hdrsize(
struct genl_family *family, uint32_t hdrsize)
229 family->gf_hdrsize = hdrsize;
230 family->ce_mask |= FAMILY_ATTR_HDRSIZE;
233 uint32_t genl_family_get_maxattr(
struct genl_family *family)
235 if (family->ce_mask & FAMILY_ATTR_MAXATTR)
236 return family->gf_maxattr;
238 return family->gf_maxattr;
241 void genl_family_set_maxattr(
struct genl_family *family, uint32_t maxattr)
243 family->gf_maxattr = maxattr;
244 family->ce_mask |= FAMILY_ATTR_MAXATTR;
247 int genl_family_add_op(
struct genl_family *family,
int id,
int flags)
249 struct genl_family_op *op;
251 op = calloc(1,
sizeof(*op));
253 return nl_errno(ENOMEM);
258 nl_list_add_tail(&op->o_list, &family->gf_ops);
259 family->ce_mask |= FAMILY_ATTR_OPS;
269 .oo_size =
sizeof(
struct genl_family),
270 .oo_constructor = family_constructor,
271 .oo_free_data = family_free_data,
272 .oo_clone = family_clone,
280 .oo_compare = family_compare,
281 .oo_id_attrs = FAMILY_ATTR_ID,
Dump object in a brief one-liner.
struct nl_object * nl_object_alloc(struct nl_object_ops *ops)
Allocate a new object of kind specified by the operations handle.
Dump all attribtes in XML format.
void nl_object_put(struct nl_object *obj)
Release a reference from an object.
char * oo_name
Unique name of object type.
Dump all attributes but no statistics.
Dump all attributes including statistics.
Dump all attribtues as env variables.