8 #include <libmnl/libmnl.h>
9 #include <libnftnl/batch.h>
15 uint32_t page_overrun_size;
16 struct list_head page_list;
20 struct list_head head;
21 struct mnl_nlmsg_batch *batch;
33 buf = malloc(batch->page_size + batch->page_overrun_size);
37 page->batch = mnl_nlmsg_batch_start(buf, batch->page_size);
38 if (page->batch == NULL)
52 batch->current_page = page;
54 list_add_tail(&page->head, &batch->page_list);
57 EXPORT_SYMBOL(nftnl_batch_alloc);
58 struct nftnl_batch *nftnl_batch_alloc(uint32_t pg_size, uint32_t pg_overrun_size)
67 batch->page_size = pg_size;
68 batch->page_overrun_size = pg_overrun_size;
69 INIT_LIST_HEAD(&batch->page_list);
71 page = nftnl_batch_page_alloc(batch);
75 nftnl_batch_add_page(page, batch);
82 EXPORT_SYMBOL(nftnl_batch_free);
87 list_for_each_entry_safe(page, next, &batch->page_list, head) {
88 free(mnl_nlmsg_batch_head(page->batch));
89 mnl_nlmsg_batch_stop(page->batch);
96 EXPORT_SYMBOL(nftnl_batch_update);
100 struct nlmsghdr *last_nlh;
102 if (mnl_nlmsg_batch_next(batch->current_page->batch))
105 last_nlh = nftnl_batch_buffer(batch);
107 page = nftnl_batch_page_alloc(batch);
111 nftnl_batch_add_page(page, batch);
113 memcpy(nftnl_batch_buffer(batch), last_nlh, last_nlh->nlmsg_len);
114 mnl_nlmsg_batch_next(batch->current_page->batch);
121 EXPORT_SYMBOL(nftnl_batch_buffer);
122 void *nftnl_batch_buffer(
struct nftnl_batch *batch)
124 return mnl_nlmsg_batch_current(batch->current_page->batch);
127 EXPORT_SYMBOL(nftnl_batch_buffer_len);
128 uint32_t nftnl_batch_buffer_len(
struct nftnl_batch *batch)
130 return mnl_nlmsg_batch_size(batch->current_page->batch);
133 EXPORT_SYMBOL(nftnl_batch_iovec_len);
134 int nftnl_batch_iovec_len(
struct nftnl_batch *batch)
136 int num_pages = batch->num_pages;
139 if (mnl_nlmsg_batch_is_empty(batch->current_page->batch))
145 EXPORT_SYMBOL(nftnl_batch_iovec);
146 void nftnl_batch_iovec(
struct nftnl_batch *batch,
struct iovec *iov,
152 list_for_each_entry(page, &batch->page_list, head) {
156 iov[i].iov_base = mnl_nlmsg_batch_head(page->batch);
157 iov[i].iov_len = mnl_nlmsg_batch_size(page->batch);