2 * lib/genl/family.c Generic Netlink Family
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation version 2.1
9 * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
14 * @defgroup genl_family Generic Netlink Family
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>
26 struct nl_object_ops genl_family_ops
;
29 static void family_constructor(struct nl_object
*c
)
31 struct genl_family
*family
= (struct genl_family
*) c
;
33 nl_init_list_head(&family
->gf_ops
);
34 nl_init_list_head(&family
->gf_mc_grps
);
37 static void family_free_data(struct nl_object
*c
)
39 struct genl_family
*family
= (struct genl_family
*) c
;
40 struct genl_family_op
*ops
, *tmp
;
41 struct genl_family_grp
*grp
, *t_grp
;
46 nl_list_for_each_entry_safe(ops
, tmp
, &family
->gf_ops
, o_list
) {
47 nl_list_del(&ops
->o_list
);
51 nl_list_for_each_entry_safe(grp
, t_grp
, &family
->gf_mc_grps
, list
) {
52 nl_list_del(&grp
->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
;
63 struct genl_family_grp
*grp
;
66 nl_list_for_each_entry(ops
, &src
->gf_ops
, o_list
) {
67 err
= genl_family_add_op(dst
, ops
->o_id
, ops
->o_flags
);
72 nl_list_for_each_entry(grp
, &src
->gf_mc_grps
, list
) {
73 err
= genl_family_add_grp(dst
, grp
->id
, grp
->name
);
82 static int family_compare(struct nl_object
*_a
, struct nl_object
*_b
,
83 uint32_t attrs
, int flags
)
85 struct genl_family
*a
= (struct genl_family
*) _a
;
86 struct genl_family
*b
= (struct genl_family
*) _b
;
89 #define FAM_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, FAMILY_ATTR_##ATTR, a, b, EXPR)
91 diff
|= FAM_DIFF(ID
, a
->gf_id
!= b
->gf_id
);
92 diff
|= FAM_DIFF(VERSION
, a
->gf_version
!= b
->gf_version
);
93 diff
|= FAM_DIFF(HDRSIZE
, a
->gf_hdrsize
!= b
->gf_hdrsize
);
94 diff
|= FAM_DIFF(MAXATTR
, a
->gf_maxattr
!= b
->gf_maxattr
);
95 diff
|= FAM_DIFF(NAME
, strcmp(a
->gf_name
, b
->gf_name
));
104 * @name Family Object
108 struct genl_family
*genl_family_alloc(void)
110 return (struct genl_family
*) nl_object_alloc(&genl_family_ops
);
113 void genl_family_put(struct genl_family
*family
)
115 nl_object_put((struct nl_object
*) family
);
121 int genl_family_add_op(struct genl_family
*family
, int id
, int flags
)
123 struct genl_family_op
*op
;
125 op
= calloc(1, sizeof(*op
));
132 nl_list_add_tail(&op
->o_list
, &family
->gf_ops
);
133 family
->ce_mask
|= FAMILY_ATTR_OPS
;
138 int genl_family_add_grp(struct genl_family
*family
, uint32_t id
,
141 struct genl_family_grp
*grp
;
143 grp
= calloc(1, sizeof(*grp
));
148 strncpy(grp
->name
, name
, GENL_NAMSIZ
- 1);
149 grp
->name
[GENL_NAMSIZ
- 1] = '\0';
151 nl_list_add_tail(&grp
->list
, &family
->gf_mc_grps
);
159 struct nl_object_ops genl_family_ops
= {
160 .oo_name
= "genl/family",
161 .oo_size
= sizeof(struct genl_family
),
162 .oo_constructor
= family_constructor
,
163 .oo_free_data
= family_free_data
,
164 .oo_clone
= family_clone
,
165 .oo_compare
= family_compare
,
166 .oo_id_attrs
= FAMILY_ATTR_ID
,