summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mnl.c14
-rw-r--r--tests/py/ip/flowtable.t5
-rw-r--r--tests/py/ip/flowtable.t.payload7
3 files changed, 21 insertions, 5 deletions
diff --git a/src/mnl.c b/src/mnl.c
index 137ecf0d..d107015c 100644
--- a/src/mnl.c
+++ b/src/mnl.c
@@ -825,19 +825,21 @@ int mnl_nft_setelem_add(struct mnl_socket *nf_sock, struct nftnl_set *nls,
char buf[NFT_NLMSG_MAXSIZE];
struct nlmsghdr *nlh;
struct nftnl_set_elems_iter *iter;
- int ret, err;
+ int ret, err = 0;
iter = nftnl_set_elems_iter_create(nls);
if (iter == NULL)
memory_allocation_error();
- do {
+ while (nftnl_set_elems_iter_cur(iter)) {
nlh = nftnl_set_elem_nlmsg_build_hdr(buf, NFT_MSG_NEWSETELEM,
nftnl_set_get_u32(nls, NFTNL_SET_FAMILY),
NLM_F_CREATE | NLM_F_ACK | flags, seq);
ret = nftnl_set_elems_nlmsg_build_payload_iter(nlh, iter);
err = nft_mnl_talk(nf_sock, nlh, nlh->nlmsg_len, NULL, NULL);
- } while (ret > 0 && err >= 0);
+ if (ret <= 0 || err < 0)
+ break;
+ }
nftnl_set_elems_iter_destroy(iter);
@@ -879,13 +881,15 @@ static int mnl_nft_setelem_batch(struct nftnl_set *nls,
if (iter == NULL)
memory_allocation_error();
- do {
+ while (nftnl_set_elems_iter_cur(iter)) {
nlh = nftnl_set_elem_nlmsg_build_hdr(nftnl_batch_buffer(batch),
cmd, nftnl_set_get_u32(nls, NFTNL_SET_FAMILY),
NLM_F_CREATE | flags, seqnum);
ret = nftnl_set_elems_nlmsg_build_payload_iter(nlh, iter);
mnl_nft_batch_continue();
- } while (ret > 0);
+ if (ret <= 0)
+ break;
+ }
nftnl_set_elems_iter_destroy(iter);
diff --git a/tests/py/ip/flowtable.t b/tests/py/ip/flowtable.t
new file mode 100644
index 00000000..aea57c32
--- /dev/null
+++ b/tests/py/ip/flowtable.t
@@ -0,0 +1,5 @@
+:input;type filter hook input priority 0
+
+*ip;test-ip;input
+
+flow table xyz { ip saddr timeout 30s counter packets 0 bytes 0};ok
diff --git a/tests/py/ip/flowtable.t.payload b/tests/py/ip/flowtable.t.payload
new file mode 100644
index 00000000..ffadfd25
--- /dev/null
+++ b/tests/py/ip/flowtable.t.payload
@@ -0,0 +1,7 @@
+# flow table xyz { ip saddr timeout 30s counter packets 0 bytes 0}
+xyz test-ip 31
+xyz test-ip 0
+ip test-ip input
+ [ payload load 4b @ network header + 12 => reg 1 ]
+ [ dynset update reg_key 1 set xyz timeout 30000ms expr [ counter pkts 0 bytes 0 ] ]
+