1 /* 2 * lib/genl/family.c Generic Netlink Family 3 * 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 7 * of the License. 8 * 9 * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> 10 */ 11 12 /** 13 * @ingroup genl 14 * @defgroup genl_family Generic Netlink Family 15 * @brief 16 * 17 * @{ 18 */ 19 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> 25 26 struct nl_object_ops genl_family_ops; 27 /** @endcond */ 28 29 static void family_constructor(struct nl_object *c) 30 { 31 struct genl_family *family = (struct genl_family *) c; 32 33 nl_init_list_head(&family->gf_ops); 34 nl_init_list_head(&family->gf_mc_grps); 35 } 36 37 static void family_free_data(struct nl_object *c) 38 { 39 struct genl_family *family = (struct genl_family *) c; 40 struct genl_family_op *ops, *tmp; 41 struct genl_family_grp *grp, *t_grp; 42 43 if (family == NULL) 44 return; 45 46 nl_list_for_each_entry_safe(ops, tmp, &family->gf_ops, o_list) { 47 nl_list_del(&ops->o_list); 48 free(ops); 49 } 50 51 nl_list_for_each_entry_safe(grp, t_grp, &family->gf_mc_grps, list) { 52 nl_list_del(&grp->list); 53 free(grp); 54 } 55 56 } 57 58 static int family_clone(struct nl_object *_dst, struct nl_object *_src) 59 { 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; 64 int err; 65 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); 68 if (err < 0) 69 return err; 70 } 71 72 nl_list_for_each_entry(grp, &src->gf_mc_grps, list) { 73 err = genl_family_add_grp(dst, grp->id, grp->name); 74 if (err < 0) 75 return err; 76 } 77 78 79 return 0; 80 } 81 82 static int family_compare(struct nl_object *_a, struct nl_object *_b, 83 uint32_t attrs, int flags) 84 { 85 struct genl_family *a = (struct genl_family *) _a; 86 struct genl_family *b = (struct genl_family *) _b; 87 int diff = 0; 88 89 #define FAM_DIFF(ATTR, EXPR) ATTR_DIFF(attrs, FAMILY_ATTR_##ATTR, a, b, EXPR) 90 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)); 96 97 #undef FAM_DIFF 98 99 return diff; 100 } 101 102 103 /** 104 * @name Family Object 105 * @{ 106 */ 107 108 struct genl_family *genl_family_alloc(void) 109 { 110 return (struct genl_family *) nl_object_alloc(&genl_family_ops); 111 } 112 113 void genl_family_put(struct genl_family *family) 114 { 115 nl_object_put((struct nl_object *) family); 116 } 117 118 /** @} */ 119 120 121 int genl_family_add_op(struct genl_family *family, int id, int flags) 122 { 123 struct genl_family_op *op; 124 125 op = calloc(1, sizeof(*op)); 126 if (op == NULL) 127 return -NLE_NOMEM; 128 129 op->o_id = id; 130 op->o_flags = flags; 131 132 nl_list_add_tail(&op->o_list, &family->gf_ops); 133 family->ce_mask |= FAMILY_ATTR_OPS; 134 135 return 0; 136 } 137 138 int genl_family_add_grp(struct genl_family *family, uint32_t id, 139 const char *name) 140 { 141 struct genl_family_grp *grp; 142 143 grp = calloc(1, sizeof(*grp)); 144 if (grp == NULL) 145 return -NLE_NOMEM; 146 147 grp->id = id; 148 strncpy(grp->name, name, GENL_NAMSIZ - 1); 149 grp->name[GENL_NAMSIZ - 1] = '\0'; 150 151 nl_list_add_tail(&grp->list, &family->gf_mc_grps); 152 153 return 0; 154 } 155 156 /** @} */ 157 158 /** @cond SKIP */ 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, 167 }; 168 /** @endcond */ 169 170 /** @} */ 171
This page was automatically generated by LXR 0.3.1. • OpenWrt