12#include <libmnl/libmnl.h>
13#include <libnftnl/batch.h>
19 uint32_t page_overrun_size;
20 struct list_head page_list;
24 struct list_head head;
25 struct mnl_nlmsg_batch *batch;
37 buf = malloc(batch->page_size + batch->page_overrun_size);
41 page->batch = mnl_nlmsg_batch_start(buf, batch->page_size);
42 if (page->batch == NULL)
56 batch->current_page = page;
58 list_add_tail(&page->head, &batch->page_list);
61EXPORT_SYMBOL(nftnl_batch_alloc);
62struct nftnl_batch *nftnl_batch_alloc(uint32_t pg_size, uint32_t pg_overrun_size)
71 batch->page_size = pg_size;
72 batch->page_overrun_size = pg_overrun_size;
73 INIT_LIST_HEAD(&batch->page_list);
75 page = nftnl_batch_page_alloc(batch);
79 nftnl_batch_add_page(page, batch);
86EXPORT_SYMBOL(nftnl_batch_free);
91 list_for_each_entry_safe(page, next, &batch->page_list, head) {
92 free(mnl_nlmsg_batch_head(page->batch));
93 mnl_nlmsg_batch_stop(page->batch);
100EXPORT_SYMBOL(nftnl_batch_update);
104 struct nlmsghdr *last_nlh;
106 if (mnl_nlmsg_batch_next(batch->current_page->batch))
109 last_nlh = nftnl_batch_buffer(batch);
111 page = nftnl_batch_page_alloc(batch);
115 nftnl_batch_add_page(page, batch);
117 memcpy(nftnl_batch_buffer(batch), last_nlh, last_nlh->nlmsg_len);
118 mnl_nlmsg_batch_next(batch->current_page->batch);
125EXPORT_SYMBOL(nftnl_batch_buffer);
128 return mnl_nlmsg_batch_current(batch->current_page->batch);
131EXPORT_SYMBOL(nftnl_batch_buffer_len);
132uint32_t nftnl_batch_buffer_len(
struct nftnl_batch *batch)
134 return mnl_nlmsg_batch_size(batch->current_page->batch);
137EXPORT_SYMBOL(nftnl_batch_iovec_len);
138int nftnl_batch_iovec_len(
struct nftnl_batch *batch)
140 int num_pages = batch->num_pages;
143 if (mnl_nlmsg_batch_is_empty(batch->current_page->batch))
149EXPORT_SYMBOL(nftnl_batch_iovec);
150void nftnl_batch_iovec(
struct nftnl_batch *batch,
struct iovec *iov,
156 list_for_each_entry(page, &batch->page_list, head) {
160 iov[i].iov_base = mnl_nlmsg_batch_head(page->batch);
161 iov[i].iov_len = mnl_nlmsg_batch_size(page->batch);