list_del(&elem->head);
nftnl_set_elem_free(elem);
}
+
+ xfree(s->type);
xfree(s);
}
case NFTNL_SET_DESC_CONCAT:
case NFTNL_SET_TIMEOUT:
case NFTNL_SET_GC_INTERVAL:
+ case NFTNL_SET_COUNT:
break;
case NFTNL_SET_USERDATA:
xfree(s->user.data);
[NFTNL_SET_DESC_SIZE] = sizeof(uint32_t),
[NFTNL_SET_TIMEOUT] = sizeof(uint64_t),
[NFTNL_SET_GC_INTERVAL] = sizeof(uint32_t),
+ [NFTNL_SET_COUNT] = sizeof(uint32_t),
};
EXPORT_SYMBOL(nftnl_set_set_data);
case NFTNL_SET_GC_INTERVAL:
memcpy(&s->gc_interval, data, sizeof(s->gc_interval));
break;
+ case NFTNL_SET_COUNT:
+ memcpy(&s->elemcount, data, sizeof(s->elemcount));
+ break;
case NFTNL_SET_USERDATA:
if (s->flags & (1 << NFTNL_SET_USERDATA))
xfree(s->user.data);
case NFTNL_SET_GC_INTERVAL:
*data_len = sizeof(uint32_t);
return &s->gc_interval;
+ case NFTNL_SET_COUNT:
+ *data_len = sizeof(uint32_t);
+ return &s->elemcount;
case NFTNL_SET_USERDATA:
*data_len = s->user.len;
return s->user.data;
list_add_tail(&newelem->head, &newset->element_list);
}
+ newset->type = NULL;
+
return newset;
err:
nftnl_set_free(newset);
switch(type) {
case NFTA_SET_TABLE:
case NFTA_SET_NAME:
+ case NFTA_SET_TYPE:
if (mnl_attr_validate(attr, MNL_TYPE_STRING) < 0)
abi_breakage();
break;
case NFTA_SET_ID:
case NFTA_SET_POLICY:
case NFTA_SET_GC_INTERVAL:
+ case NFTA_SET_COUNT:
if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0)
abi_breakage();
break;
s->flags |= (1 << NFTNL_SET_EXPRESSIONS);
}
+ if (tb[NFTA_SET_TYPE]) {
+ xfree(s->type);
+ s->type = strdup(mnl_attr_get_str(tb[NFTA_SET_TYPE]));
+ }
+
+ if (tb[NFTA_SET_COUNT]) {
+ s->elemcount = ntohl(mnl_attr_get_u32(tb[NFTA_SET_COUNT]));
+ s->flags |= (1 << NFTNL_SET_COUNT);
+ }
+
s->family = nfg->nfgen_family;
s->flags |= (1 << NFTNL_SET_FAMILY);
SNPRINTF_BUFFER_SIZE(ret, remain, offset);
}
+ if (s->type) {
+ ret = snprintf(buf + offset, remain, " backend %s", s->type);
+ SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+ }
+
+ if (s->elemcount) {
+ ret = snprintf(buf + offset, remain, " count %u", s->elemcount);
+ SNPRINTF_BUFFER_SIZE(ret, remain, offset);
+ }
+
/* Empty set? Skip printinf of elements */
if (list_empty(&s->element_list))
return offset;