libnl  1.1
Modules | Data Structures
Object

Modules

 Object API
 

Data Structures

struct  nl_derived_object
 

Object Creation/Deletion

struct nl_object * nl_object_alloc (struct nl_object_ops *ops)
 Allocate a new object of kind specified by the operations handle. More...
 
struct nl_object * nl_object_alloc_name (const char *kind)
 Allocate a new object of kind specified by the name. More...
 
struct nl_object * nl_object_clone (struct nl_object *obj)
 Allocate a new object and copy all data from an existing object. More...
 
void nl_object_free (struct nl_object *obj)
 Free a cacheable object. More...
 

Reference Management

void nl_object_get (struct nl_object *obj)
 Acquire a reference on a object. More...
 
void nl_object_put (struct nl_object *obj)
 Release a reference from an object. More...
 
int nl_object_shared (struct nl_object *obj)
 Check whether this object is used by multiple users. More...
 

Marks

void nl_object_mark (struct nl_object *obj)
 Add mark to object. More...
 
void nl_object_unmark (struct nl_object *obj)
 Remove mark from object. More...
 
int nl_object_is_marked (struct nl_object *obj)
 Return true if object is marked. More...
 

Utillities

void nl_object_dump (struct nl_object *obj, struct nl_dump_params *params)
 Dump this object according to the specified parameters. More...
 
int nl_object_identical (struct nl_object *a, struct nl_object *b)
 Check if the identifiers of two objects are identical. More...
 
uint32_t nl_object_diff (struct nl_object *a, struct nl_object *b)
 Compute bitmask representing difference in attribute values. More...
 
int nl_object_match_filter (struct nl_object *obj, struct nl_object *filter)
 Match a filter against an object. More...
 
char * nl_object_attrs2str (struct nl_object *obj, uint32_t attrs, char *buf, size_t len)
 Convert bitmask of attributes to a character string. More...
 
char * nl_object_attr_list (struct nl_object *obj, char *buf, size_t len)
 Return list of attributes present in an object. More...
 

Attributes

int nl_object_get_refcnt (struct nl_object *obj)
 
struct nl_cache * nl_object_get_cache (struct nl_object *obj)
 
void * nl_object_priv (struct nl_object *obj)
 

Detailed Description

Function Documentation

struct nl_object* nl_object_alloc ( struct nl_object_ops ops)
Parameters
opscache operations handle
Returns
The new object or NULL

Definition at line 42 of file object.c.

References nl_object_ops::oo_constructor, and nl_object_ops::oo_size.

Referenced by nl_object_alloc_name(), and nl_object_clone().

43 {
44  struct nl_object *new;
45 
46  if (ops->oo_size < sizeof(*new))
47  BUG();
48 
49  new = calloc(1, ops->oo_size);
50  if (!new) {
51  nl_errno(ENOMEM);
52  return NULL;
53  }
54 
55  new->ce_refcnt = 1;
56  nl_init_list_head(&new->ce_list);
57 
58  new->ce_ops = ops;
59  if (ops->oo_constructor)
60  ops->oo_constructor(new);
61 
62  NL_DBG(4, "Allocated new object %p\n", new);
63 
64  return new;
65 }
struct nl_object* nl_object_alloc_name ( const char *  kind)
Parameters
kindname of object type
Returns
The new object or nULL

Definition at line 72 of file object.c.

References nl_cache_ops_lookup(), and nl_object_alloc().

73 {
74  struct nl_cache_ops *ops;
75 
76  ops = nl_cache_ops_lookup(kind);
77  if (!ops) {
78  nl_error(ENOENT, "Unable to lookup cache kind \"%s\"", kind);
79  return NULL;
80  }
81 
82  return nl_object_alloc(ops->co_obj_ops);
83 }
struct nl_object* nl_object_clone ( struct nl_object *  obj)
Parameters
objobject to inherite data from
Returns
The new object or NULL.

Definition at line 95 of file object.c.

References nl_object_alloc(), nl_object_free(), nl_object_ops::oo_clone, nl_object_ops::oo_free_data, and nl_object_ops::oo_size.

Referenced by nl_cache_add().

96 {
97  struct nl_object *new;
98  struct nl_object_ops *ops = obj_ops(obj);
99  int doff = offsetof(struct nl_derived_object, data);
100  int size;
101 
102  new = nl_object_alloc(ops);
103  if (!new)
104  return NULL;
105 
106  size = ops->oo_size - doff;
107  if (size < 0)
108  BUG();
109 
110  new->ce_ops = obj->ce_ops;
111  new->ce_msgtype = obj->ce_msgtype;
112 
113  if (size)
114  memcpy((void *)new + doff, (void *)obj + doff, size);
115 
116  if (ops->oo_clone) {
117  if (ops->oo_clone(new, obj) < 0) {
118  nl_object_free(new);
119  return NULL;
120  }
121  } else if (size && ops->oo_free_data)
122  BUG();
123 
124  return new;
125 }
void nl_object_free ( struct nl_object *  obj)
Parameters
objobject to free
Returns
0 or a negative error code.

Definition at line 133 of file object.c.

References nl_cache_remove(), and nl_object_ops::oo_free_data.

Referenced by nl_object_clone(), and nl_object_put().

134 {
135  struct nl_object_ops *ops = obj_ops(obj);
136 
137  if (obj->ce_refcnt > 0)
138  NL_DBG(1, "Warning: Freeing object in use...\n");
139 
140  if (obj->ce_cache)
141  nl_cache_remove(obj);
142 
143  if (ops->oo_free_data)
144  ops->oo_free_data(obj);
145 
146  free(obj);
147 
148  NL_DBG(4, "Freed object %p\n", obj);
149 }
void nl_object_get ( struct nl_object *  obj)
Parameters
objobject to acquire reference from

Definition at line 162 of file object.c.

Referenced by genl_ctrl_search(), genl_ctrl_search_by_name(), nl_cache_add(), nl_cache_move(), nl_cache_search(), rtnl_link_get(), rtnl_link_get_by_name(), rtnl_neigh_get(), rtnl_neightbl_get(), rtnl_qdisc_get(), and rtnl_qdisc_get_by_parent().

163 {
164  obj->ce_refcnt++;
165  NL_DBG(4, "New reference to object %p, total %d\n",
166  obj, obj->ce_refcnt);
167 }
void nl_object_put ( struct nl_object *  obj)
Parameters
objobject to release reference from

Definition at line 173 of file object.c.

References nl_object_free().

Referenced by nl_cache_remove().

174 {
175  if (!obj)
176  return;
177 
178  obj->ce_refcnt--;
179  NL_DBG(4, "Returned object reference %p, %d remaining\n",
180  obj, obj->ce_refcnt);
181 
182  if (obj->ce_refcnt < 0)
183  BUG();
184 
185  if (obj->ce_refcnt <= 0)
186  nl_object_free(obj);
187 }
int nl_object_shared ( struct nl_object *  obj)
Parameters
objobject to check
Returns
true or false

Definition at line 194 of file object.c.

195 {
196  return obj->ce_refcnt > 1;
197 }
void nl_object_mark ( struct nl_object *  obj)
Parameters
objObject to mark

Definition at line 210 of file object.c.

Referenced by nl_cache_mark_all().

211 {
212  obj->ce_flags |= NL_OBJ_MARK;
213 }
void nl_object_unmark ( struct nl_object *  obj)
Parameters
objObject to unmark

Definition at line 219 of file object.c.

220 {
221  obj->ce_flags &= ~NL_OBJ_MARK;
222 }
int nl_object_is_marked ( struct nl_object *  obj)
Parameters
objObject to check
Returns
true if object is marked, otherwise false

Definition at line 229 of file object.c.

230 {
231  return (obj->ce_flags & NL_OBJ_MARK);
232 }
void nl_object_dump ( struct nl_object *  obj,
struct nl_dump_params params 
)
Parameters
objobject to dump
paramsdumping parameters

Definition at line 246 of file object.c.

247 {
248  dump_from_ops(obj, params);
249 }
int nl_object_identical ( struct nl_object *  a,
struct nl_object *  b 
)
Parameters
aan object
banother object of same type
Returns
true if both objects have equal identifiers, otherwise false.

Definition at line 258 of file object.c.

References nl_object_ops::oo_compare.

Referenced by nl_cache_search().

259 {
260  struct nl_object_ops *ops = obj_ops(a);
261  int req_attrs;
262 
263  /* Both objects must be of same type */
264  if (ops != obj_ops(b))
265  return 0;
266 
267  req_attrs = ops->oo_id_attrs;
268 
269  /* Both objects must provide all required attributes to uniquely
270  * identify an object */
271  if ((a->ce_mask & req_attrs) != req_attrs ||
272  (b->ce_mask & req_attrs) != req_attrs)
273  return 0;
274 
275  /* Can't judge unless we can compare */
276  if (ops->oo_compare == NULL)
277  return 0;
278 
279  return !(ops->oo_compare(a, b, req_attrs, 0));
280 }
uint32_t nl_object_diff ( struct nl_object *  a,
struct nl_object *  b 
)
Parameters
aan object
banother object of same type

The bitmask returned is specific to an object type, each bit set represents an attribute which mismatches in either of the two objects. Unavailability of an attribute in one object and presence in the other is regarded a mismatch as well.

Returns
Bitmask describing differences or 0 if they are completely identical.

Definition at line 294 of file object.c.

References nl_object_ops::oo_compare.

295 {
296  struct nl_object_ops *ops = obj_ops(a);
297 
298  if (ops != obj_ops(b) || ops->oo_compare == NULL)
299  return UINT_MAX;
300 
301  return ops->oo_compare(a, b, ~0, 0);
302 }
int nl_object_match_filter ( struct nl_object *  obj,
struct nl_object *  filter 
)
Parameters
objobject to check
filterobject of same type acting as filter
Returns
1 if the object matches the filter or 0 if no filter procedure is available or if the filter does not match.

Definition at line 313 of file object.c.

References nl_object_ops::oo_compare.

Referenced by nl_cache_dump_filter(), nl_cache_foreach_filter(), nl_cache_nitems_filter(), and nl_cache_subset().

314 {
315  struct nl_object_ops *ops = obj_ops(obj);
316 
317  if (ops != obj_ops(filter) || ops->oo_compare == NULL)
318  return 0;
319 
320  return !(ops->oo_compare(obj, filter, filter->ce_mask,
321  LOOSE_FLAG_COMPARISON));
322 }
char* nl_object_attrs2str ( struct nl_object *  obj,
uint32_t  attrs,
char *  buf,
size_t  len 
)
Parameters
objobject of same type as attribute bitmask
attrsbitmask of attribute types
bufdestination buffer
lenlength of destination buffer

Converts the bitmask of attribute types into a list of attribute names separated by comas.

Returns
destination buffer.

Definition at line 336 of file object.c.

Referenced by nl_object_attr_list().

338 {
339  struct nl_object_ops *ops = obj_ops(obj);
340 
341  if (ops->oo_attrs2str != NULL)
342  return ops->oo_attrs2str(attrs, buf, len);
343  else {
344  memset(buf, 0, len);
345  return buf;
346  }
347 }
char* nl_object_attr_list ( struct nl_object *  obj,
char *  buf,
size_t  len 
)
Parameters
objan object
bufdestination buffer
lenlength of destination buffer
Returns
destination buffer.

Definition at line 357 of file object.c.

References nl_object_attrs2str().

358 {
359  return nl_object_attrs2str(obj, obj->ce_mask, buf, len);
360 }