11 #include <libmnl/libmnl.h>
12 #include <libnftnl/batch.h>
18 uint32_t page_overrun_size;
19 struct list_head page_list;
23 struct list_head head;
24 struct mnl_nlmsg_batch *batch;
36 buf = malloc(batch->page_size + batch->page_overrun_size);
40 page->batch = mnl_nlmsg_batch_start(buf, batch->page_size);
41 if (page->batch == NULL)
55 batch->current_page = page;
57 list_add_tail(&page->head, &batch->page_list);
60 struct nftnl_batch *nftnl_batch_alloc(uint32_t pg_size, uint32_t pg_overrun_size)
69 batch->page_size = pg_size;
70 batch->page_overrun_size = pg_overrun_size;
71 INIT_LIST_HEAD(&batch->page_list);
73 page = nftnl_batch_page_alloc(batch);
77 nftnl_batch_add_page(page, batch);
83 EXPORT_SYMBOL_ALIAS(nftnl_batch_alloc, nft_batch_alloc);
89 list_for_each_entry_safe(page, next, &batch->page_list, head) {
90 free(mnl_nlmsg_batch_head(page->batch));
91 mnl_nlmsg_batch_stop(page->batch);
97 EXPORT_SYMBOL_ALIAS(nftnl_batch_free, nft_batch_free);
102 struct nlmsghdr *last_nlh;
104 if (mnl_nlmsg_batch_next(batch->current_page->batch))
107 last_nlh = nftnl_batch_buffer(batch);
109 page = nftnl_batch_page_alloc(batch);
113 nftnl_batch_add_page(page, batch);
115 memcpy(nftnl_batch_buffer(batch), last_nlh, last_nlh->nlmsg_len);
116 mnl_nlmsg_batch_next(batch->current_page->batch);
122 EXPORT_SYMBOL_ALIAS(nftnl_batch_update, nft_batch_update);
124 void *nftnl_batch_buffer(
struct nftnl_batch *batch)
126 return mnl_nlmsg_batch_current(batch->current_page->batch);
128 EXPORT_SYMBOL_ALIAS(nftnl_batch_buffer, nft_batch_buffer);
130 uint32_t nftnl_batch_buffer_len(
struct nftnl_batch *batch)
132 return mnl_nlmsg_batch_size(batch->current_page->batch);
134 EXPORT_SYMBOL_ALIAS(nftnl_batch_buffer_len, nft_batch_buffer_len);
136 int nftnl_batch_iovec_len(
struct nftnl_batch *batch)
138 int num_pages = batch->num_pages;
141 if (mnl_nlmsg_batch_is_empty(batch->current_page->batch))
146 EXPORT_SYMBOL_ALIAS(nftnl_batch_iovec_len, nft_batch_iovec_len);
148 void nftnl_batch_iovec(
struct nftnl_batch *batch,
struct iovec *iov,
154 list_for_each_entry(page, &batch->page_list, head) {
158 iov[i].iov_base = mnl_nlmsg_batch_head(page->batch);
159 iov[i].iov_len = mnl_nlmsg_batch_size(page->batch);
163 EXPORT_SYMBOL_ALIAS(nftnl_batch_iovec, nft_batch_iovec);