summaryrefslogtreecommitdiffstats
path: root/tests/expr
diff options
context:
space:
mode:
Diffstat (limited to 'tests/expr')
-rw-r--r--tests/expr/bitwise/bool-16-data_err.t7
-rw-r--r--tests/expr/bitwise/bool-16-no-mask_err.t7
-rw-r--r--tests/expr/bitwise/bool-16-no-xor_err.t7
-rw-r--r--tests/expr/bitwise/bool-data_err.t7
-rw-r--r--tests/expr/bitwise/bool-max_ok.t7
-rw-r--r--tests/expr/bitwise/bool-max_plus_one_err.t7
-rw-r--r--tests/expr/bitwise/bool-mismatching-size_err.t7
-rw-r--r--tests/expr/bitwise/bool-no-mask_err.t7
-rw-r--r--tests/expr/bitwise/bool-no-size_err.t7
-rw-r--r--tests/expr/bitwise/bool-no-xor_err.t7
-rw-r--r--tests/expr/bitwise/bool-zero-size_err.t7
-rw-r--r--tests/expr/bitwise/bool_ok.t7
-rw-r--r--tests/expr/bitwise/shift-large_err.t7
-rw-r--r--tests/expr/bitwise/shift-mask_err.t7
-rw-r--r--tests/expr/bitwise/shift-max_ok.t7
-rw-r--r--tests/expr/bitwise/shift-max_plus_one_err.t7
-rw-r--r--tests/expr/bitwise/shift-xor_err.t7
-rw-r--r--tests/expr/bitwise/shift_ok.t7
-rw-r--r--tests/expr/byteorder/byteorder-0-len_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-2-len_ok.t7
-rw-r--r--tests/expr/byteorder/byteorder-4-len_ok.t7
-rw-r--r--tests/expr/byteorder/byteorder-8-len_ok.t7
-rw-r--r--tests/expr/byteorder/byteorder-bad-len_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-bad-op_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-bad-size_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-no-dreg_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-no-len_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-no-op_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-no-size_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-no-sreg_err.t7
-rw-r--r--tests/expr/byteorder/byteorder-too-large-len_err.t7
-rw-r--r--tests/expr/cmp/cmp-15-eq_ok.t6
-rw-r--r--tests/expr/cmp/cmp-16-eq-bad-reg_err.t6
-rw-r--r--tests/expr/cmp/cmp-16-eq_ok.t6
-rw-r--r--tests/expr/cmp/cmp-16-lt-bad-reg_err.t6
-rw-r--r--tests/expr/cmp/cmp-16-lt_ok.t6
-rw-r--r--tests/expr/cmp/cmp-4-eq_ok.t6
-rw-r--r--tests/expr/connlimit/connlimit-bad-flags_err.t5
-rw-r--r--tests/expr/connlimit/connlimit-flags_ok.t5
-rw-r--r--tests/expr/connlimit/connlimit-no-count_err.t5
-rw-r--r--tests/expr/connlimit/connlimit-zero_ok.t5
-rw-r--r--tests/expr/connlimit/connlimit_ok.t5
-rw-r--r--tests/expr/counter/counter-bytes-pkts_ok.t5
-rw-r--r--tests/expr/counter/counter-bytes_ok.t5
-rw-r--r--tests/expr/counter/counter-pkts_ok.t5
-rw-r--r--tests/expr/counter/counter_ok.t5
-rw-r--r--tests/expr/ct/00-state-dir_err.t6
-rw-r--r--tests/expr/ct/00-state_ok.t6
-rw-r--r--tests/expr/ct/01-dir-dir_err.t6
-rw-r--r--tests/expr/ct/01-dir_ok.t6
-rw-r--r--tests/expr/ct/02-status-dir_err.t6
-rw-r--r--tests/expr/ct/02-status_ok.t6
-rw-r--r--tests/expr/ct/03-mark_ok.t6
-rw-r--r--tests/expr/ct/04-secmark_ok.t6
-rw-r--r--tests/expr/ct/05-expiration_ok.t6
-rw-r--r--tests/expr/ct/06-helper_ok.t6
-rw-r--r--tests/expr/ct/07-l3protocol_ok.t6
-rw-r--r--tests/expr/ct/08-src-inet_ok.t6
-rw-r--r--tests/expr/ct/08-src-ip-no-dir_err.t6
-rw-r--r--tests/expr/ct/08-src-ip6_ok.t6
-rw-r--r--tests/expr/ct/08-src-ip_ok.t6
-rw-r--r--tests/expr/ct/10-protocol_ok.t6
-rw-r--r--tests/expr/ct/11-proto-src-no-dir_err.t6
-rw-r--r--tests/expr/ct/11-proto-src_ok.t6
-rw-r--r--tests/expr/ct/13-labels_ok.t6
-rw-r--r--tests/expr/ct/14-pkts-bad-dir_err.t6
-rw-r--r--tests/expr/ct/14-pkts-max-dir_ok.t6
-rw-r--r--tests/expr/ct/14-pkts_ok.t6
-rw-r--r--tests/expr/ct/17-zone-bad-dir_err.t6
-rw-r--r--tests/expr/ct/17-zone-max-dir_ok.t6
-rw-r--r--tests/expr/ct/17-zone_ok.t6
-rw-r--r--tests/expr/ct/18-eventmask_err.t6
-rw-r--r--tests/expr/ct/19-src-ip_ok.t6
-rw-r--r--tests/expr/ct/21-src-ip6_ok.t6
-rw-r--r--tests/expr/ct/23-id_ok.t6
-rw-r--r--tests/expr/ct/no-key_err.t6
-rw-r--r--tests/expr/ct/set-03-mark-dir_err.t6
-rw-r--r--tests/expr/ct/set-03-mark_ok.t6
-rw-r--r--tests/expr/ct/set-04-secmark_ok.t6
-rw-r--r--tests/expr/ct/set-13-labels-bad-reg_err.t6
-rw-r--r--tests/expr/ct/set-13-labels-dir_err.t6
-rw-r--r--tests/expr/ct/set-13-labels_ok.t6
-rw-r--r--tests/expr/ct/set-17-zone_ok.t6
-rw-r--r--tests/expr/ct/set-18-eventmask_ok.t6
-rw-r--r--tests/expr/ct/set-unsupp_err.t6
-rw-r--r--tests/expr/ct/sreg-dreg_err.t6
-rw-r--r--tests/expr/dynset/dynset-already-bound_err.t10
-rw-r--r--tests/expr/dynset/dynset-bad-flags_err.t7
-rw-r--r--tests/expr/dynset/dynset-bad-op_err.t7
-rw-r--r--tests/expr/dynset/dynset-constant_err.t7
-rw-r--r--tests/expr/dynset/dynset-no-name_err.t7
-rw-r--r--tests/expr/dynset/dynset-no-op_err.t7
-rw-r--r--tests/expr/dynset/dynset-no-sreg_err.t7
-rw-r--r--tests/expr/dynset/dynset-no-timeout-set-flag_err.t7
-rw-r--r--tests/expr/dynset/dynset-no-timeout-set_err.t7
-rw-r--r--tests/expr/dynset/dynset-no-verdict-map_err.t7
-rw-r--r--tests/expr/dynset/dynset-timeout-no-timeout-set-flag_err.t7
-rw-r--r--tests/expr/dynset/dynset-timeout_ok.t7
-rw-r--r--tests/expr/dynset/dynset-unknown-set_err.t7
-rw-r--r--tests/expr/dynset/dynset_ok.t7
-rw-r--r--tests/expr/exthdr/exthdr_dccp_missing_flag_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_dccp_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv4_bad_family_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv4_bad_flag_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv4_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv4_present_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv4_unsupp_type_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_no_dreg_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_no_len_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_no_offset_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_no_op_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_no_type_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_sreg_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_ipv6_zero_len_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_no_reg_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_sctp_dreg_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_sctp_sreg_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_sreg_dreg_err.t6
-rw-r--r--tests/expr/exthdr/exthdr_tcp_dreg_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_tcp_sreg_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_tcp_strip_ok.t6
-rw-r--r--tests/expr/exthdr/exthdr_unsupp_err.t6
-rw-r--r--tests/expr/hash/hash-no-type-jhash-fallback_ok.t6
-rw-r--r--tests/expr/hash/jhash-bad-len_err.t6
-rw-r--r--tests/expr/hash/jhash-no-dreg_err.t6
-rw-r--r--tests/expr/hash/jhash-no-len_err.t6
-rw-r--r--tests/expr/hash/jhash-no-modulus_err.t6
-rw-r--r--tests/expr/hash/jhash-no-offset_ok.t6
-rw-r--r--tests/expr/hash/jhash-no-seed_ok.t6
-rw-r--r--tests/expr/hash/jhash-no-sreg_err.t6
-rw-r--r--tests/expr/hash/jhash-overflow_err.t6
-rw-r--r--tests/expr/hash/jhash-zero-len_err.t6
-rw-r--r--tests/expr/hash/jhash_ok.t6
-rw-r--r--tests/expr/hash/symhash-no-dreg_err.t5
-rw-r--r--tests/expr/hash/symhash-no-modulus_err.t5
-rw-r--r--tests/expr/hash/symhash-no-offset_ok.t5
-rw-r--r--tests/expr/hash/symhash_ok.t5
-rw-r--r--tests/expr/hash/unsupp-hash_err.t6
-rw-r--r--tests/expr/immediate/bad-chain-verdict-data_err.t6
-rw-r--r--tests/expr/immediate/bad-chain_err.t5
-rw-r--r--tests/expr/immediate/bad-data_err.t5
-rw-r--r--tests/expr/immediate/bad-jump-other-table_err.t7
-rw-r--r--tests/expr/immediate/bad-reg_err.t5
-rw-r--r--tests/expr/immediate/chain_ok.t6
-rw-r--r--tests/expr/immediate/immediate-bad-verdict_err.t5
-rw-r--r--tests/expr/immediate/immediate_ok.t5
-rw-r--r--tests/expr/immediate/loop_err.t11
-rw-r--r--tests/expr/immediate/loop_self_err.t8
-rw-r--r--tests/expr/immediate/no-chain_err.t6
-rw-r--r--tests/expr/immediate/verdict-data_err.t6
-rw-r--r--tests/expr/inner/inner_bad_flags_err.t7
-rw-r--r--tests/expr/inner/inner_bad_hdrsize_err.t7
-rw-r--r--tests/expr/inner/inner_bad_num_err.t7
-rw-r--r--tests/expr/inner/inner_bad_type_err.t7
-rw-r--r--tests/expr/inner/inner_meta_ok.t7
-rw-r--r--tests/expr/inner/inner_meta_unsupp_err.t7
-rw-r--r--tests/expr/inner/inner_payload_ok.t7
-rw-r--r--tests/expr/inner/inner_socket_err.t7
-rw-r--r--tests/expr/inner/inner_zero_hdrsize_err.t7
-rw-r--r--tests/expr/last/last_ok.t5
-rw-r--r--tests/expr/last/last_set_ok.t5
-rw-r--r--tests/expr/limit/bad-flags_err.t5
-rw-r--r--tests/expr/limit/bad-rate_err.t5
-rw-r--r--tests/expr/limit/bad-type_err.t5
-rw-r--r--tests/expr/limit/bad-unit_err.t5
-rw-r--r--tests/expr/limit/bytes_ok.t5
-rw-r--r--tests/expr/limit/flags_ok.t5
-rw-r--r--tests/expr/limit/no-rate_err.t5
-rw-r--r--tests/expr/limit/no-type_ok.t5
-rw-r--r--tests/expr/limit/no-unit_err.t5
-rw-r--r--tests/expr/limit/overflow-burst_err.t5
-rw-r--r--tests/expr/limit/overflow_err.t5
-rw-r--r--tests/expr/limit/pkts_ok.t5
-rw-r--r--tests/expr/log/log_audit_ok.t5
-rw-r--r--tests/expr/log/log_bad_flags_err.t5
-rw-r--r--tests/expr/log/log_bad_level_err.t5
-rw-r--r--tests/expr/log/log_bad_level_group_err.t5
-rw-r--r--tests/expr/log/log_flags_ok.t5
-rw-r--r--tests/expr/log/log_group_ok.t5
-rw-r--r--tests/expr/log/log_group_snaplen_ok.t5
-rw-r--r--tests/expr/log/log_level_ok.t5
-rw-r--r--tests/expr/log/log_no_prefix_ok.t5
-rw-r--r--tests/expr/log/log_ok.t5
-rw-r--r--tests/expr/masq/masq_ok.t5
-rw-r--r--tests/expr/masq/masq_sreg_min_max_ok.t7
-rw-r--r--tests/expr/masq/masq_sreg_ok.t6
-rw-r--r--tests/expr/match/match-comment-bad-datasize_err.t6
-rw-r--r--tests/expr/match/match-comment_ok.t6
-rw-r--r--tests/expr/match/match-cpu-arp_ok.t6
-rw-r--r--tests/expr/match/match-cpu-inet_ok.t6
-rw-r--r--tests/expr/match/match-cpu_ok.t6
-rw-r--r--tests/expr/match/match-no-name_err.t6
-rw-r--r--tests/expr/match/match-tcp-bad-flags_err.t6
-rw-r--r--tests/expr/match/match-tcp-inet-ingress_err.t6
-rw-r--r--tests/expr/match/match-tcp-invflag_err.t6
-rw-r--r--tests/expr/match/match-tcp-no-data_err.t6
-rw-r--r--tests/expr/match/match-tcp-no-flags_err.t6
-rw-r--r--tests/expr/match/match-tcp-no-proto_err.t6
-rw-r--r--tests/expr/match/match-tcp-no-rev_err.t6
-rw-r--r--tests/expr/match/match-tcp-short-data_err.t6
-rw-r--r--tests/expr/match/match-tcp-unsupp_err.t6
-rw-r--r--tests/expr/match/match-tcp_ok.t6
-rw-r--r--tests/expr/meta/00-len_ok.t6
-rw-r--r--tests/expr/meta/01-protocol_ok.t6
-rw-r--r--tests/expr/meta/02-priority_ok.t6
-rw-r--r--tests/expr/meta/03-mark_ok.t6
-rw-r--r--tests/expr/meta/04-iif_ok.t6
-rw-r--r--tests/expr/meta/05-oif-bad-cmp_err.t6
-rw-r--r--tests/expr/meta/05-oif_ok.t6
-rw-r--r--tests/expr/meta/06-iifname-bad_reg_err.t6
-rw-r--r--tests/expr/meta/06-iifname_ok.t6
-rw-r--r--tests/expr/meta/07-oifname_ok.t6
-rw-r--r--tests/expr/meta/08-iftype_ok.t6
-rw-r--r--tests/expr/meta/09-oiftype_ok.t6
-rw-r--r--tests/expr/meta/10-cgroup_ok.t6
-rw-r--r--tests/expr/meta/10-skuid_ok.t6
-rw-r--r--tests/expr/meta/11-skgid_ok.t6
-rw-r--r--tests/expr/meta/12-nftrace_err.t5
-rw-r--r--tests/expr/meta/13-rtclassid_ok.t6
-rw-r--r--tests/expr/meta/14-secmark_ok.t6
-rw-r--r--tests/expr/meta/15-nfproto_ok.t6
-rw-r--r--tests/expr/meta/16-l4proto_ok.t6
-rw-r--r--tests/expr/meta/17-bri-iifname-bad-family_err.t6
-rw-r--r--tests/expr/meta/17-bri-iifname_ok.t6
-rw-r--r--tests/expr/meta/18-bri-oifname-bad-family_err.t6
-rw-r--r--tests/expr/meta/18-bri-oifname-bad-reg_err.t6
-rw-r--r--tests/expr/meta/18-bri-oifname_ok.t6
-rw-r--r--tests/expr/meta/19-pkt-type_ok.t6
-rw-r--r--tests/expr/meta/20-cpu_ok.t6
-rw-r--r--tests/expr/meta/21-iifgroup_ok.t6
-rw-r--r--tests/expr/meta/22-oifgroup_ok.t6
-rw-r--r--tests/expr/meta/23-cgroup_ok.t6
-rw-r--r--tests/expr/meta/24-prandom_ok.t6
-rw-r--r--tests/expr/meta/28-bri-iifpvid_ok.t6
-rw-r--r--tests/expr/meta/29-bri-iifvproto_ok.t6
-rw-r--r--tests/expr/meta/30-time-ns-bad-reg_err.t6
-rw-r--r--tests/expr/meta/30-time-ns_ok.t6
-rw-r--r--tests/expr/meta/31-time-day_ok.t6
-rw-r--r--tests/expr/meta/32-time-hour_ok.t6
-rw-r--r--tests/expr/meta/33-sd-if_ok.t6
-rw-r--r--tests/expr/meta/34-sd-ifname_ok.t6
-rw-r--r--tests/expr/meta/35-bri-broute_err.t6
-rw-r--r--tests/expr/meta/36-unsupp-key_err.t6
-rw-r--r--tests/expr/meta/no-key_err.t6
-rw-r--r--tests/expr/meta/set-02-priority_ok.t6
-rw-r--r--tests/expr/meta/set-03-mark_ok.t6
-rw-r--r--tests/expr/meta/set-12-nftrace_ok.t6
-rw-r--r--tests/expr/meta/set-14-secmark_ok.t6
-rw-r--r--tests/expr/meta/set-19-pkttype_ok.t6
-rw-r--r--tests/expr/meta/set-36-unsupp-key_err.t6
-rw-r--r--tests/expr/meta/sreg-dreg_err.t6
-rw-r--r--tests/expr/nat/dnat_ok.t6
-rw-r--r--tests/expr/nat/nat_bad_family_err.t6
-rw-r--r--tests/expr/nat/nat_bad_type_err.t6
-rw-r--r--tests/expr/nat/nat_inet_ipv4_ok.t6
-rw-r--r--tests/expr/nat/nat_inet_ok.t6
-rw-r--r--tests/expr/nat/nat_ok.t6
-rw-r--r--tests/expr/nat/nat_sreg_dreg_proto_ok.t9
-rw-r--r--tests/expr/nat/nat_sreg_proto_ok.t7
-rw-r--r--tests/expr/numgen/numgen-0-inc_ok.t7
-rw-r--r--tests/expr/numgen/numgen-1-random_ok.t7
-rw-r--r--tests/expr/numgen/numgen-2-invalid_err.t6
-rw-r--r--tests/expr/numgen/numgen-bad-modulus_err.t6
-rw-r--r--tests/expr/numgen/numgen-overflow-offset_err.t7
-rw-r--r--tests/expr/osf/osf_bad_flags_err.t6
-rw-r--r--tests/expr/osf/osf_bad_ttl_err.t6
-rw-r--r--tests/expr/osf/osf_flags_ok.t6
-rw-r--r--tests/expr/osf/osf_no_dreg_err.t6
-rw-r--r--tests/expr/osf/osf_ok.t6
-rw-r--r--tests/expr/osf/osf_ttl_ok.t6
-rw-r--r--tests/expr/payload/payload-bad-reg_err.t6
-rw-r--r--tests/expr/payload/payload-len-too-large-reg-4_err.t6
-rw-r--r--tests/expr/payload/payload-len-too-large-reg32-15_err.t6
-rw-r--r--tests/expr/payload/payload-len-too-large_err.t6
-rw-r--r--tests/expr/payload/payload-len-zero_err.t6
-rw-r--r--tests/expr/payload/payload-unknown-reg-5_err.t6
-rw-r--r--tests/expr/payload/payload-unknown-reg-6_err.t6
-rw-r--r--tests/expr/payload/payload-unknown-reg-7_err.t6
-rw-r--r--tests/expr/payload/payload-unknown-reg32-24_err.t6
-rw-r--r--tests/expr/payload/payload_ok.t6
-rw-r--r--tests/expr/queue/queue_bypass_ok.t5
-rw-r--r--tests/expr/queue/queue_fanout_ok.t5
-rw-r--r--tests/expr/queue/queue_no_num_sreg_err.t5
-rw-r--r--tests/expr/queue/queue_num_sreg_err.t5
-rw-r--r--tests/expr/queue/queue_ok.t5
-rw-r--r--tests/expr/queue/queue_sreg_fanout_err.t6
-rw-r--r--tests/expr/queue/queue_sreg_ok.t6
-rw-r--r--tests/expr/quota/quota_bad_flags_err.t5
-rw-r--r--tests/expr/quota/quota_consumed_too_high_err.t5
-rw-r--r--tests/expr/quota/quota_depleted_err.t5
-rw-r--r--tests/expr/quota/quota_flags_ok.t5
-rw-r--r--tests/expr/quota/quota_no_bytes_err.t5
-rw-r--r--tests/expr/quota/quota_no_consumed_ok.t5
-rw-r--r--tests/expr/quota/quota_ok.t5
-rw-r--r--tests/expr/range/range-0-eq_ok.t6
-rw-r--r--tests/expr/range/range-1-neq_ok.t6
-rw-r--r--tests/expr/range/range-2-invalid-op_err.t6
-rw-r--r--tests/expr/range/range-no-data-from_err.t6
-rw-r--r--tests/expr/range/range-no-data-to_err.t6
-rw-r--r--tests/expr/range/range-no-sreg_err.t6
-rw-r--r--tests/expr/range/range-too-large-data-from_err.t6
-rw-r--r--tests/expr/redir/redir_ok.t5
-rw-r--r--tests/expr/redir/redir_sreg_min_max_ok.t7
-rw-r--r--tests/expr/redir/redir_sreg_ok.t6
-rw-r--r--tests/expr/rt/00-classid_ok.t6
-rw-r--r--tests/expr/rt/01-nexthop-ipv4_ok.t6
-rw-r--r--tests/expr/rt/02-nexthop6-ipv6-bad-reg_err.t5
-rw-r--r--tests/expr/rt/02-nexthop6-ipv6_ok.t6
-rw-r--r--tests/expr/rt/03-tcpmss_ok.t6
-rw-r--r--tests/expr/rt/04-xfrm_ok.t6
-rw-r--r--tests/expr/rt/05-unsupport_err.t6
-rw-r--r--tests/expr/socket/00-transparent_ok.t6
-rw-r--r--tests/expr/socket/01-mark_bad_family_err.t6
-rw-r--r--tests/expr/socket/01-mark_ok.t6
-rw-r--r--tests/expr/socket/02-wildcard_ok.t6
-rw-r--r--tests/expr/socket/03-socket-cgroups-bad-reg_err.t6
-rw-r--r--tests/expr/socket/03-socket-cgroups-level-high_err.t6
-rw-r--r--tests/expr/socket/03-socket-cgroups-no-level_err.t6
-rw-r--r--tests/expr/socket/03-socket-cgroups_ok.t6
-rw-r--r--tests/expr/socket/socket_bad_key_err.t6
-rw-r--r--tests/expr/socket/socket_no_dreg_err.t6
-rw-r--r--tests/expr/socket/socket_no_key_err.t6
-rw-r--r--tests/expr/tproxy/tproxy-bridge_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-inet-bridge_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-inet-ingress_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-inet-ipv4_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-inet-ipv6_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-inet-unspec_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv4-addr-no-imm_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-ipv4-addr-port_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv4-addr_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv4-ipv6_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-ipv4-port_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv4_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv6-addr-port_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv6-addr_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-ipv6-addr_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv6-ipv4_err.t5
-rw-r--r--tests/expr/tproxy/tproxy-ipv6-port_ok.t6
-rw-r--r--tests/expr/tproxy/tproxy-ipv6_ok.t6
341 files changed, 2055 insertions, 0 deletions
diff --git a/tests/expr/bitwise/bool-16-data_err.t b/tests/expr/bitwise/bool-16-data_err.t
new file mode 100644
index 0000000..2eb22dd
--- /dev/null
+++ b/tests/expr/bitwise/bool-16-data_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "16", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "16", "fffffffffffffffffffffffffffffffe", "00000000000000000000000000000000", "bad00000000000000000000000000000");
+cmp("NFT_REG_1", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/bitwise/bool-16-no-mask_err.t b/tests/expr/bitwise/bool-16-no-mask_err.t
new file mode 100644
index 0000000..1069025
--- /dev/null
+++ b/tests/expr/bitwise/bool-16-no-mask_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "16", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "16", NULL, "00000000000000000000000000000000", NULL);
+cmp("NFT_REG_1", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/bitwise/bool-16-no-xor_err.t b/tests/expr/bitwise/bool-16-no-xor_err.t
new file mode 100644
index 0000000..63e32e7
--- /dev/null
+++ b/tests/expr/bitwise/bool-16-no-xor_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "16", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "16", "fffffffffffffffffffffffffffffffe", NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/bitwise/bool-data_err.t b/tests/expr/bitwise/bool-data_err.t
new file mode 100644
index 0000000..96e930a
--- /dev/null
+++ b/tests/expr/bitwise/bool-data_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "4", "fffffffe", "00000000", "bad00000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool-max_ok.t b/tests/expr/bitwise/bool-max_ok.t
new file mode 100644
index 0000000..e7234e4
--- /dev/null
+++ b/tests/expr/bitwise/bool-max_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "16", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "16", "fffffffe000000001122334411223344", "00000000000000000000000000000000", NULL);
+cmp("NFT_REG_1", "0", "010203040102030401020304");
+commit();
diff --git a/tests/expr/bitwise/bool-max_plus_one_err.t b/tests/expr/bitwise/bool-max_plus_one_err.t
new file mode 100644
index 0000000..f9e2747
--- /dev/null
+++ b/tests/expr/bitwise/bool-max_plus_one_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "17", "fffffffe000000001122334411223344ff", "0000000000000000000000000000000000", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool-mismatching-size_err.t b/tests/expr/bitwise/bool-mismatching-size_err.t
new file mode 100644
index 0000000..1625a85
--- /dev/null
+++ b/tests/expr/bitwise/bool-mismatching-size_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "5", "fffffffe", "00000000", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool-no-mask_err.t b/tests/expr/bitwise/bool-no-mask_err.t
new file mode 100644
index 0000000..135bece
--- /dev/null
+++ b/tests/expr/bitwise/bool-no-mask_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "4", NULL, "00000000", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool-no-size_err.t b/tests/expr/bitwise/bool-no-size_err.t
new file mode 100644
index 0000000..39b5f57
--- /dev/null
+++ b/tests/expr/bitwise/bool-no-size_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, NULL, "fffffffe", "00000000", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool-no-xor_err.t b/tests/expr/bitwise/bool-no-xor_err.t
new file mode 100644
index 0000000..dd62cee
--- /dev/null
+++ b/tests/expr/bitwise/bool-no-xor_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "4", "fffffffe", NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool-zero-size_err.t b/tests/expr/bitwise/bool-zero-size_err.t
new file mode 100644
index 0000000..47b01dc
--- /dev/null
+++ b/tests/expr/bitwise/bool-zero-size_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "0", "fffffffe", "00000000", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/bool_ok.t b/tests/expr/bitwise/bool_ok.t
new file mode 100644
index 0000000..7371752
--- /dev/null
+++ b/tests/expr/bitwise/bool_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", NULL, "4", "fffffffe", "00000000", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/shift-large_err.t b/tests/expr/bitwise/shift-large_err.t
new file mode 100644
index 0000000..4d4352b
--- /dev/null
+++ b/tests/expr/bitwise/shift-large_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", "1", "65", NULL, NULL, "01000000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/shift-mask_err.t b/tests/expr/bitwise/shift-mask_err.t
new file mode 100644
index 0000000..e64d7b1
--- /dev/null
+++ b/tests/expr/bitwise/shift-mask_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", "1", "4", NULL, "00000000", "01000000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/shift-max_ok.t b/tests/expr/bitwise/shift-max_ok.t
new file mode 100644
index 0000000..a724893
--- /dev/null
+++ b/tests/expr/bitwise/shift-max_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", "1", "4", NULL, NULL, "19000000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/shift-max_plus_one_err.t b/tests/expr/bitwise/shift-max_plus_one_err.t
new file mode 100644
index 0000000..72be513
--- /dev/null
+++ b/tests/expr/bitwise/shift-max_plus_one_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", "1", "4", NULL, NULL, "20000000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/shift-xor_err.t b/tests/expr/bitwise/shift-xor_err.t
new file mode 100644
index 0000000..4906398
--- /dev/null
+++ b/tests/expr/bitwise/shift-xor_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", "1", "4", "ffffffff", NULL, "01000000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/bitwise/shift_ok.t b/tests/expr/bitwise/shift_ok.t
new file mode 100644
index 0000000..7af80df
--- /dev/null
+++ b/tests/expr/bitwise/shift_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+bitwise("NFT_REG_1", "NFT_REG_1", "1", "4", NULL, NULL, "01000000");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-0-len_err.t b/tests/expr/byteorder/byteorder-0-len_err.t
new file mode 100644
index 0000000..e56e1aa
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-0-len_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "2", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "0", "2");
+cmp("NFT_REG32_15", "0", "0102");
+commit();
diff --git a/tests/expr/byteorder/byteorder-2-len_ok.t b/tests/expr/byteorder/byteorder-2-len_ok.t
new file mode 100644
index 0000000..65f20cb
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-2-len_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "2", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "2", "2");
+cmp("NFT_REG32_15", "0", "0102");
+commit();
diff --git a/tests/expr/byteorder/byteorder-4-len_ok.t b/tests/expr/byteorder/byteorder-4-len_ok.t
new file mode 100644
index 0000000..5176a4b
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-4-len_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-8-len_ok.t b/tests/expr/byteorder/byteorder-8-len_ok.t
new file mode 100644
index 0000000..3d391bc
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-8-len_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", NULL, NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_14", "1", "12", "8", NULL, NULL, NULL);
+byteorder("NFT_REG32_14", "NFT_REG32_14", "0", "8", "8");
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-bad-len_err.t b/tests/expr/byteorder/byteorder-bad-len_err.t
new file mode 100644
index 0000000..cdcf198
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-bad-len_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "8", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-bad-op_err.t b/tests/expr/byteorder/byteorder-bad-op_err.t
new file mode 100644
index 0000000..acb188b
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-bad-op_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "2", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-bad-size_err.t b/tests/expr/byteorder/byteorder-bad-size_err.t
new file mode 100644
index 0000000..dcdb425
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-bad-size_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "4", "1");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-no-dreg_err.t b/tests/expr/byteorder/byteorder-no-dreg_err.t
new file mode 100644
index 0000000..c79f25c
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-no-dreg_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", NULL, "0", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-no-len_err.t b/tests/expr/byteorder/byteorder-no-len_err.t
new file mode 100644
index 0000000..b3522c0
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-no-len_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", NULL, "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-no-op_err.t b/tests/expr/byteorder/byteorder-no-op_err.t
new file mode 100644
index 0000000..e2d90c3
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-no-op_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", NULL, NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", NULL, "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-no-size_err.t b/tests/expr/byteorder/byteorder-no-size_err.t
new file mode 100644
index 0000000..2df1bdb
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-no-size_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "4", NULL);
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-no-sreg_err.t b/tests/expr/byteorder/byteorder-no-sreg_err.t
new file mode 100644
index 0000000..19eb378
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-no-sreg_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+byteorder(NULL, "NFT_REG32_15", "0", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/byteorder/byteorder-too-large-len_err.t b/tests/expr/byteorder/byteorder-too-large-len_err.t
new file mode 100644
index 0000000..ea7d44c
--- /dev/null
+++ b/tests/expr/byteorder/byteorder-too-large-len_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_14", "1", "12", "8", NULL, NULL, NULL);
+byteorder("NFT_REG32_00", "NFT_REG32_00", "0", "65", "4");
+cmp("NFT_REG32_00", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/cmp/cmp-15-eq_ok.t b/tests/expr/cmp/cmp-15-eq_ok.t
new file mode 100644
index 0000000..6c8e538
--- /dev/null
+++ b/tests/expr/cmp/cmp-15-eq_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_12", "1", "8", "15", NULL, NULL, NULL);
+cmp("NFT_REG32_12", "0", "010203040102030401020304010203");
+commit();
diff --git a/tests/expr/cmp/cmp-16-eq-bad-reg_err.t b/tests/expr/cmp/cmp-16-eq-bad-reg_err.t
new file mode 100644
index 0000000..863b100
--- /dev/null
+++ b/tests/expr/cmp/cmp-16-eq-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_12", "1", "8", "16", NULL, NULL, NULL);
+cmp("NFT_REG32_13", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/cmp/cmp-16-eq_ok.t b/tests/expr/cmp/cmp-16-eq_ok.t
new file mode 100644
index 0000000..f5da722
--- /dev/null
+++ b/tests/expr/cmp/cmp-16-eq_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_12", "1", "8", "16", NULL, NULL, NULL);
+cmp("NFT_REG32_12", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/cmp/cmp-16-lt-bad-reg_err.t b/tests/expr/cmp/cmp-16-lt-bad-reg_err.t
new file mode 100644
index 0000000..a817974
--- /dev/null
+++ b/tests/expr/cmp/cmp-16-lt-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_12", "1", "8", "16", NULL, NULL, NULL);
+cmp("NFT_REG32_13", "2", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/cmp/cmp-16-lt_ok.t b/tests/expr/cmp/cmp-16-lt_ok.t
new file mode 100644
index 0000000..2f1b595
--- /dev/null
+++ b/tests/expr/cmp/cmp-16-lt_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_12", "1", "8", "16", NULL, NULL, NULL);
+cmp("NFT_REG32_12", "2", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/cmp/cmp-4-eq_ok.t b/tests/expr/cmp/cmp-4-eq_ok.t
new file mode 100644
index 0000000..413e84f
--- /dev/null
+++ b/tests/expr/cmp/cmp-4-eq_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/connlimit/connlimit-bad-flags_err.t b/tests/expr/connlimit/connlimit-bad-flags_err.t
new file mode 100644
index 0000000..c16fd69
--- /dev/null
+++ b/tests/expr/connlimit/connlimit-bad-flags_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+connlimit("10", "2");
+commit();
diff --git a/tests/expr/connlimit/connlimit-flags_ok.t b/tests/expr/connlimit/connlimit-flags_ok.t
new file mode 100644
index 0000000..fda4c88
--- /dev/null
+++ b/tests/expr/connlimit/connlimit-flags_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+connlimit("10", "1");
+commit();
diff --git a/tests/expr/connlimit/connlimit-no-count_err.t b/tests/expr/connlimit/connlimit-no-count_err.t
new file mode 100644
index 0000000..2e4b56b
--- /dev/null
+++ b/tests/expr/connlimit/connlimit-no-count_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+connlimit(NULL, NULL);
+commit();
diff --git a/tests/expr/connlimit/connlimit-zero_ok.t b/tests/expr/connlimit/connlimit-zero_ok.t
new file mode 100644
index 0000000..18bafb6
--- /dev/null
+++ b/tests/expr/connlimit/connlimit-zero_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+connlimit("0", NULL);
+commit();
diff --git a/tests/expr/connlimit/connlimit_ok.t b/tests/expr/connlimit/connlimit_ok.t
new file mode 100644
index 0000000..9a7501c
--- /dev/null
+++ b/tests/expr/connlimit/connlimit_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+connlimit("10", NULL);
+commit();
diff --git a/tests/expr/counter/counter-bytes-pkts_ok.t b/tests/expr/counter/counter-bytes-pkts_ok.t
new file mode 100644
index 0000000..779274b
--- /dev/null
+++ b/tests/expr/counter/counter-bytes-pkts_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+counter("10", "20");
+commit();
diff --git a/tests/expr/counter/counter-bytes_ok.t b/tests/expr/counter/counter-bytes_ok.t
new file mode 100644
index 0000000..9400741
--- /dev/null
+++ b/tests/expr/counter/counter-bytes_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+counter("10", NULL);
+commit();
diff --git a/tests/expr/counter/counter-pkts_ok.t b/tests/expr/counter/counter-pkts_ok.t
new file mode 100644
index 0000000..f10e94b
--- /dev/null
+++ b/tests/expr/counter/counter-pkts_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+counter(NULL, "20");
+commit();
diff --git a/tests/expr/counter/counter_ok.t b/tests/expr/counter/counter_ok.t
new file mode 100644
index 0000000..f496948
--- /dev/null
+++ b/tests/expr/counter/counter_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/ct/00-state-dir_err.t b/tests/expr/ct/00-state-dir_err.t
new file mode 100644
index 0000000..318ff8b
--- /dev/null
+++ b/tests/expr/ct/00-state-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "0", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/00-state_ok.t b/tests/expr/ct/00-state_ok.t
new file mode 100644
index 0000000..8afd4c2
--- /dev/null
+++ b/tests/expr/ct/00-state_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "0", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/01-dir-dir_err.t b/tests/expr/ct/01-dir-dir_err.t
new file mode 100644
index 0000000..cb4a207
--- /dev/null
+++ b/tests/expr/ct/01-dir-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "1", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/01-dir_ok.t b/tests/expr/ct/01-dir_ok.t
new file mode 100644
index 0000000..18977d2
--- /dev/null
+++ b/tests/expr/ct/01-dir_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "1", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/02-status-dir_err.t b/tests/expr/ct/02-status-dir_err.t
new file mode 100644
index 0000000..ebc9f51
--- /dev/null
+++ b/tests/expr/ct/02-status-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "2", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/02-status_ok.t b/tests/expr/ct/02-status_ok.t
new file mode 100644
index 0000000..7a30b51
--- /dev/null
+++ b/tests/expr/ct/02-status_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "2", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/03-mark_ok.t b/tests/expr/ct/03-mark_ok.t
new file mode 100644
index 0000000..96af54d
--- /dev/null
+++ b/tests/expr/ct/03-mark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "3", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/04-secmark_ok.t b/tests/expr/ct/04-secmark_ok.t
new file mode 100644
index 0000000..8d5f99b
--- /dev/null
+++ b/tests/expr/ct/04-secmark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "4", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/05-expiration_ok.t b/tests/expr/ct/05-expiration_ok.t
new file mode 100644
index 0000000..b16b82c
--- /dev/null
+++ b/tests/expr/ct/05-expiration_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "5", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/06-helper_ok.t b/tests/expr/ct/06-helper_ok.t
new file mode 100644
index 0000000..bfcf6c2
--- /dev/null
+++ b/tests/expr/ct/06-helper_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_12", "6", NULL);
+cmp("NFT_REG32_12", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/ct/07-l3protocol_ok.t b/tests/expr/ct/07-l3protocol_ok.t
new file mode 100644
index 0000000..0320bcf
--- /dev/null
+++ b/tests/expr/ct/07-l3protocol_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "7", NULL);
+cmp("NFT_REG32_15", "0", "ff");
+commit();
diff --git a/tests/expr/ct/08-src-inet_ok.t b/tests/expr/ct/08-src-inet_ok.t
new file mode 100644
index 0000000..e090d5b
--- /dev/null
+++ b/tests/expr/ct/08-src-inet_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "8", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/08-src-ip-no-dir_err.t b/tests/expr/ct/08-src-ip-no-dir_err.t
new file mode 100644
index 0000000..174f130
--- /dev/null
+++ b/tests/expr/ct/08-src-ip-no-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "8", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/08-src-ip6_ok.t b/tests/expr/ct/08-src-ip6_ok.t
new file mode 100644
index 0000000..4af6ca7
--- /dev/null
+++ b/tests/expr/ct/08-src-ip6_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_12", "8", "0");
+cmp("NFT_REG32_12", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/ct/08-src-ip_ok.t b/tests/expr/ct/08-src-ip_ok.t
new file mode 100644
index 0000000..53b18b6
--- /dev/null
+++ b/tests/expr/ct/08-src-ip_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", NULL, NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "8", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/10-protocol_ok.t b/tests/expr/ct/10-protocol_ok.t
new file mode 100644
index 0000000..97e32be
--- /dev/null
+++ b/tests/expr/ct/10-protocol_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "10", NULL);
+cmp("NFT_REG32_15", "0", "ff");
+commit();
diff --git a/tests/expr/ct/11-proto-src-no-dir_err.t b/tests/expr/ct/11-proto-src-no-dir_err.t
new file mode 100644
index 0000000..ed035a9
--- /dev/null
+++ b/tests/expr/ct/11-proto-src-no-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", NULL, NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "11", NULL);
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/ct/11-proto-src_ok.t b/tests/expr/ct/11-proto-src_ok.t
new file mode 100644
index 0000000..587b349
--- /dev/null
+++ b/tests/expr/ct/11-proto-src_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "11", "0");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/ct/13-labels_ok.t b/tests/expr/ct/13-labels_ok.t
new file mode 100644
index 0000000..6ffc3ba
--- /dev/null
+++ b/tests/expr/ct/13-labels_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_12", "13", NULL);
+cmp("NFT_REG32_12", "0", "01020304050607080910111213141516");
+commit();
diff --git a/tests/expr/ct/14-pkts-bad-dir_err.t b/tests/expr/ct/14-pkts-bad-dir_err.t
new file mode 100644
index 0000000..089e94a
--- /dev/null
+++ b/tests/expr/ct/14-pkts-bad-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_14", "14", "2");
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/ct/14-pkts-max-dir_ok.t b/tests/expr/ct/14-pkts-max-dir_ok.t
new file mode 100644
index 0000000..c9603e8
--- /dev/null
+++ b/tests/expr/ct/14-pkts-max-dir_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_14", "14", NULL);
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/ct/14-pkts_ok.t b/tests/expr/ct/14-pkts_ok.t
new file mode 100644
index 0000000..54d2caf
--- /dev/null
+++ b/tests/expr/ct/14-pkts_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_14", "14", "0");
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/ct/17-zone-bad-dir_err.t b/tests/expr/ct/17-zone-bad-dir_err.t
new file mode 100644
index 0000000..2d49ecc
--- /dev/null
+++ b/tests/expr/ct/17-zone-bad-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "17", "2");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/ct/17-zone-max-dir_ok.t b/tests/expr/ct/17-zone-max-dir_ok.t
new file mode 100644
index 0000000..81546c0
--- /dev/null
+++ b/tests/expr/ct/17-zone-max-dir_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "17", NULL);
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/ct/17-zone_ok.t b/tests/expr/ct/17-zone_ok.t
new file mode 100644
index 0000000..ee037be
--- /dev/null
+++ b/tests/expr/ct/17-zone_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "17", "0");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/ct/18-eventmask_err.t b/tests/expr/ct/18-eventmask_err.t
new file mode 100644
index 0000000..ee9cd91
--- /dev/null
+++ b/tests/expr/ct/18-eventmask_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "18", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/19-src-ip_ok.t b/tests/expr/ct/19-src-ip_ok.t
new file mode 100644
index 0000000..2181093
--- /dev/null
+++ b/tests/expr/ct/19-src-ip_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "19", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/21-src-ip6_ok.t b/tests/expr/ct/21-src-ip6_ok.t
new file mode 100644
index 0000000..cc573e4
--- /dev/null
+++ b/tests/expr/ct/21-src-ip6_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_12", "21", "0");
+cmp("NFT_REG32_12", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/ct/23-id_ok.t b/tests/expr/ct/23-id_ok.t
new file mode 100644
index 0000000..65ce33c
--- /dev/null
+++ b/tests/expr/ct/23-id_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", "23", NULL);
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/ct/no-key_err.t b/tests/expr/ct/no-key_err.t
new file mode 100644
index 0000000..59627b4
--- /dev/null
+++ b/tests/expr/ct/no-key_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+ct(NULL, "NFT_REG32_15", NULL, NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/ct/set-03-mark-dir_err.t b/tests/expr/ct/set-03-mark-dir_err.t
new file mode 100644
index 0000000..d9729ea
--- /dev/null
+++ b/tests/expr/ct/set-03-mark-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+ct("NFT_REG32_15", NULL, "3", "0");
+commit();
diff --git a/tests/expr/ct/set-03-mark_ok.t b/tests/expr/ct/set-03-mark_ok.t
new file mode 100644
index 0000000..b6a41b8
--- /dev/null
+++ b/tests/expr/ct/set-03-mark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+ct("NFT_REG32_15", NULL, "3", NULL);
+commit();
diff --git a/tests/expr/ct/set-04-secmark_ok.t b/tests/expr/ct/set-04-secmark_ok.t
new file mode 100644
index 0000000..564b20f
--- /dev/null
+++ b/tests/expr/ct/set-04-secmark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "01020304");
+ct("NFT_REG32_15", NULL, "4", NULL);
+commit();
diff --git a/tests/expr/ct/set-13-labels-bad-reg_err.t b/tests/expr/ct/set-13-labels-bad-reg_err.t
new file mode 100644
index 0000000..660fca4
--- /dev/null
+++ b/tests/expr/ct/set-13-labels-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_13", NULL, NULL, NULL, "010203040506070809101112131415");
+ct(NULL, "NFT_REG32_13", "13", NULL);
+commit();
diff --git a/tests/expr/ct/set-13-labels-dir_err.t b/tests/expr/ct/set-13-labels-dir_err.t
new file mode 100644
index 0000000..32f5f8e
--- /dev/null
+++ b/tests/expr/ct/set-13-labels-dir_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "010203040506070809101112131415");
+ct(NULL, "NFT_REG32_12", "13", "0");
+commit();
diff --git a/tests/expr/ct/set-13-labels_ok.t b/tests/expr/ct/set-13-labels_ok.t
new file mode 100644
index 0000000..4020304
--- /dev/null
+++ b/tests/expr/ct/set-13-labels_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "010203040506070809101112131415");
+ct(NULL, "NFT_REG32_12", "13", NULL);
+commit();
diff --git a/tests/expr/ct/set-17-zone_ok.t b/tests/expr/ct/set-17-zone_ok.t
new file mode 100644
index 0000000..9d03843
--- /dev/null
+++ b/tests/expr/ct/set-17-zone_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "0102");
+ct("NFT_REG32_15", NULL, "17", NULL);
+commit();
diff --git a/tests/expr/ct/set-18-eventmask_ok.t b/tests/expr/ct/set-18-eventmask_ok.t
new file mode 100644
index 0000000..5505f3b
--- /dev/null
+++ b/tests/expr/ct/set-18-eventmask_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "01020304");
+ct("NFT_REG32_15", NULL, "18", NULL);
+commit();
diff --git a/tests/expr/ct/set-unsupp_err.t b/tests/expr/ct/set-unsupp_err.t
new file mode 100644
index 0000000..36f97bb
--- /dev/null
+++ b/tests/expr/ct/set-unsupp_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+ct("NFT_REG32_15", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/ct/sreg-dreg_err.t b/tests/expr/ct/sreg-dreg_err.t
new file mode 100644
index 0000000..f633bcd
--- /dev/null
+++ b/tests/expr/ct/sreg-dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+ct("NFT_REG32_15", "NFT_REG32_15", "0", NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-already-bound_err.t b/tests/expr/dynset/dynset-already-bound_err.t
new file mode 100644
index 0000000..0749262
--- /dev/null
+++ b/tests/expr/dynset/dynset-already-bound_err.t
@@ -0,0 +1,10 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x21", "2", "13", NULL, NULL, NULL, NULL, NULL, "0x1", NULL, NULL, NULL, NULL, NULL);
+add_elem("0016", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+lookup("NFT_REG_1", NULL, "test", "0x1");
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-bad-flags_err.t b/tests/expr/dynset/dynset-bad-flags_err.t
new file mode 100644
index 0000000..025601c
--- /dev/null
+++ b/tests/expr/dynset/dynset-bad-flags_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, NULL, "0x4");
+commit();
diff --git a/tests/expr/dynset/dynset-bad-op_err.t b/tests/expr/dynset/dynset-bad-op_err.t
new file mode 100644
index 0000000..23ef8ab
--- /dev/null
+++ b/tests/expr/dynset/dynset-bad-op_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "10", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-constant_err.t b/tests/expr/dynset/dynset-constant_err.t
new file mode 100644
index 0000000..b7dd578
--- /dev/null
+++ b/tests/expr/dynset/dynset-constant_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x32", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-no-name_err.t b/tests/expr/dynset/dynset-no-name_err.t
new file mode 100644
index 0000000..1cc1a38
--- /dev/null
+++ b/tests/expr/dynset/dynset-no-name_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset(NULL, "0x1", "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-no-op_err.t b/tests/expr/dynset/dynset-no-op_err.t
new file mode 100644
index 0000000..7ecec97
--- /dev/null
+++ b/tests/expr/dynset/dynset-no-op_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", NULL, "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-no-sreg_err.t b/tests/expr/dynset/dynset-no-sreg_err.t
new file mode 100644
index 0000000..a328019
--- /dev/null
+++ b/tests/expr/dynset/dynset-no-sreg_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", NULL, NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-no-timeout-set-flag_err.t b/tests/expr/dynset/dynset-no-timeout-set-flag_err.t
new file mode 100644
index 0000000..0d2579c
--- /dev/null
+++ b/tests/expr/dynset/dynset-no-timeout-set-flag_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x20", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-no-timeout-set_err.t b/tests/expr/dynset/dynset-no-timeout-set_err.t
new file mode 100644
index 0000000..0d2579c
--- /dev/null
+++ b/tests/expr/dynset/dynset-no-timeout-set_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x20", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-no-verdict-map_err.t b/tests/expr/dynset/dynset-no-verdict-map_err.t
new file mode 100644
index 0000000..1151d54
--- /dev/null
+++ b/tests/expr/dynset/dynset-no-verdict-map_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x38", "2", "13", NULL, "NFT_DATA_VERDICT", NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", "NFT_REG_2", NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-timeout-no-timeout-set-flag_err.t b/tests/expr/dynset/dynset-timeout-no-timeout-set-flag_err.t
new file mode 100644
index 0000000..3dbfa9d
--- /dev/null
+++ b/tests/expr/dynset/dynset-timeout-no-timeout-set-flag_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x20", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, "10000", NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-timeout_ok.t b/tests/expr/dynset/dynset-timeout_ok.t
new file mode 100644
index 0000000..6c8e356
--- /dev/null
+++ b/tests/expr/dynset/dynset-timeout_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, "20000", NULL);
+commit();
diff --git a/tests/expr/dynset/dynset-unknown-set_err.t b/tests/expr/dynset/dynset-unknown-set_err.t
new file mode 100644
index 0000000..76894a1
--- /dev/null
+++ b/tests/expr/dynset/dynset-unknown-set_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test1234567error", NULL, "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/dynset/dynset_ok.t b/tests/expr/dynset/dynset_ok.t
new file mode 100644
index 0000000..3f45cb9
--- /dev/null
+++ b/tests/expr/dynset/dynset_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_set("test", "0x30", "2", "13", NULL, NULL, NULL, "100", NULL, "0x1", "10000", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "NFT_PAYLOAD_TRANSPORT_HEADER", "2", "2", NULL, NULL, NULL);
+dynset("test", "0x1", "1", "NFT_REG_1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/exthdr/exthdr_dccp_missing_flag_err.t b/tests/expr/exthdr/exthdr_dccp_missing_flag_err.t
new file mode 100644
index 0000000..5c9f808
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_dccp_missing_flag_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "1", "4", NULL);
+cmp("NFT_REG_1", "0", "00000001");
+commit();
diff --git a/tests/expr/exthdr/exthdr_dccp_ok.t b/tests/expr/exthdr/exthdr_dccp_ok.t
new file mode 100644
index 0000000..c566208
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_dccp_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "1", "4", "0x1");
+cmp("NFT_REG_1", "0", "00000001");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv4_bad_family_err.t b/tests/expr/exthdr/exthdr_ipv4_bad_family_err.t
new file mode 100644
index 0000000..b4e83ef
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv4_bad_family_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "137", "2", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv4_bad_flag_err.t b/tests/expr/exthdr/exthdr_ipv4_bad_flag_err.t
new file mode 100644
index 0000000..7805587
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv4_bad_flag_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "137", "2", "0x2");
+cmp("NFT_REG_1", "0", "00000001");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv4_ok.t b/tests/expr/exthdr/exthdr_ipv4_ok.t
new file mode 100644
index 0000000..df8af65
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv4_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "137", "2", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv4_present_ok.t b/tests/expr/exthdr/exthdr_ipv4_present_ok.t
new file mode 100644
index 0000000..f7935eb
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv4_present_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "137", "2", "0x1");
+cmp("NFT_REG_1", "0", "00000001");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv4_unsupp_type_err.t b/tests/expr/exthdr/exthdr_ipv4_unsupp_type_err.t
new file mode 100644
index 0000000..a27ce8b
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv4_unsupp_type_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "123", "2", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_no_dreg_err.t b/tests/expr/exthdr/exthdr_ipv6_no_dreg_err.t
new file mode 100644
index 0000000..8a0e269
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_no_dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr("NFT_REG_1", NULL, "0", "4", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_no_len_err.t b/tests/expr/exthdr/exthdr_ipv6_no_len_err.t
new file mode 100644
index 0000000..0e31c45
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_no_len_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", NULL, "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_no_offset_err.t b/tests/expr/exthdr/exthdr_ipv6_no_offset_err.t
new file mode 100644
index 0000000..b23bb9c
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_no_offset_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", NULL, "4", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_no_op_ok.t b/tests/expr/exthdr/exthdr_ipv6_no_op_ok.t
new file mode 100644
index 0000000..a671ffc
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_no_op_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "0", NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_no_type_err.t b/tests/expr/exthdr/exthdr_ipv6_no_type_err.t
new file mode 100644
index 0000000..caf7a03
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_no_type_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", NULL, "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_ok.t b/tests/expr/exthdr/exthdr_ipv6_ok.t
new file mode 100644
index 0000000..0ab2e6f
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_sreg_err.t b/tests/expr/exthdr/exthdr_ipv6_sreg_err.t
new file mode 100644
index 0000000..8a0e269
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_sreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr("NFT_REG_1", NULL, "0", "4", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_ipv6_zero_len_err.t b/tests/expr/exthdr/exthdr_ipv6_zero_len_err.t
new file mode 100644
index 0000000..b2611fa
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_ipv6_zero_len_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "0", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_no_reg_err.t b/tests/expr/exthdr/exthdr_no_reg_err.t
new file mode 100644
index 0000000..21f557c
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_no_reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, NULL, "0", "4", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_sctp_dreg_ok.t b/tests/expr/exthdr/exthdr_sctp_dreg_ok.t
new file mode 100644
index 0000000..ec60051
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_sctp_dreg_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", "3", "1", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_sctp_sreg_err.t b/tests/expr/exthdr/exthdr_sctp_sreg_err.t
new file mode 100644
index 0000000..e78805c
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_sctp_sreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_1", NULL, NULL, NULL, "01020304");
+exthdr("NFT_REG_1", NULL, "0", "4", "3", "1", NULL);
+commit();
diff --git a/tests/expr/exthdr/exthdr_sreg_dreg_err.t b/tests/expr/exthdr/exthdr_sreg_dreg_err.t
new file mode 100644
index 0000000..e4c0237
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_sreg_dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr("NFT_REG_1", "NFT_REG_1", "0", "4", "0", "0", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_tcp_dreg_ok.t b/tests/expr/exthdr/exthdr_tcp_dreg_ok.t
new file mode 100644
index 0000000..4a214de
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_tcp_dreg_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "2", "4", "0", "1", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/exthdr/exthdr_tcp_sreg_ok.t b/tests/expr/exthdr/exthdr_tcp_sreg_ok.t
new file mode 100644
index 0000000..d1d9dad
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_tcp_sreg_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_1", NULL, NULL, NULL, "01020304");
+exthdr("NFT_REG_1", NULL, "2", "4", "0", "1", NULL);
+commit();
diff --git a/tests/expr/exthdr/exthdr_tcp_strip_ok.t b/tests/expr/exthdr/exthdr_tcp_strip_ok.t
new file mode 100644
index 0000000..91c10ee
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_tcp_strip_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_1", NULL, NULL, NULL, "0102030401020304");
+exthdr(NULL, NULL, NULL, NULL, "0", "1", NULL);
+commit();
diff --git a/tests/expr/exthdr/exthdr_unsupp_err.t b/tests/expr/exthdr/exthdr_unsupp_err.t
new file mode 100644
index 0000000..3fe8ae3
--- /dev/null
+++ b/tests/expr/exthdr/exthdr_unsupp_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+exthdr(NULL, "NFT_REG_1", "0", "4", NULL, "10", NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/hash/hash-no-type-jhash-fallback_ok.t b/tests/expr/hash/hash-no-type-jhash-fallback_ok.t
new file mode 100644
index 0000000..5fb968b
--- /dev/null
+++ b/tests/expr/hash/hash-no-type-jhash-fallback_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash(NULL, "NFT_REG32_15", "NFT_REG32_15", "4", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash-bad-len_err.t b/tests/expr/hash/jhash-bad-len_err.t
new file mode 100644
index 0000000..5c83172
--- /dev/null
+++ b/tests/expr/hash/jhash-bad-len_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "5", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash-no-dreg_err.t b/tests/expr/hash/jhash-no-dreg_err.t
new file mode 100644
index 0000000..e0dfaff
--- /dev/null
+++ b/tests/expr/hash/jhash-no-dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", NULL, "4", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash-no-len_err.t b/tests/expr/hash/jhash-no-len_err.t
new file mode 100644
index 0000000..e0290e1
--- /dev/null
+++ b/tests/expr/hash/jhash-no-len_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", NULL, "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash-no-modulus_err.t b/tests/expr/hash/jhash-no-modulus_err.t
new file mode 100644
index 0000000..05228f0
--- /dev/null
+++ b/tests/expr/hash/jhash-no-modulus_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "4", NULL, "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash-no-offset_ok.t b/tests/expr/hash/jhash-no-offset_ok.t
new file mode 100644
index 0000000..b15ea1d
--- /dev/null
+++ b/tests/expr/hash/jhash-no-offset_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "4", "10", "0x5eed", NULL);
+commit();
diff --git a/tests/expr/hash/jhash-no-seed_ok.t b/tests/expr/hash/jhash-no-seed_ok.t
new file mode 100644
index 0000000..c5b4535
--- /dev/null
+++ b/tests/expr/hash/jhash-no-seed_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "4", "10", NULL, "0");
+commit();
diff --git a/tests/expr/hash/jhash-no-sreg_err.t b/tests/expr/hash/jhash-no-sreg_err.t
new file mode 100644
index 0000000..9dadf7b
--- /dev/null
+++ b/tests/expr/hash/jhash-no-sreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", NULL, "NFT_REG32_15", "4", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash-overflow_err.t b/tests/expr/hash/jhash-overflow_err.t
new file mode 100644
index 0000000..6571857
--- /dev/null
+++ b/tests/expr/hash/jhash-overflow_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "4", "10", "0x5eed", "0xffffffff");
+commit();
diff --git a/tests/expr/hash/jhash-zero-len_err.t b/tests/expr/hash/jhash-zero-len_err.t
new file mode 100644
index 0000000..3457f99
--- /dev/null
+++ b/tests/expr/hash/jhash-zero-len_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "0", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/jhash_ok.t b/tests/expr/hash/jhash_ok.t
new file mode 100644
index 0000000..b4d5fa1
--- /dev/null
+++ b/tests/expr/hash/jhash_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("0", "NFT_REG32_15", "NFT_REG32_15", "4", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/hash/symhash-no-dreg_err.t b/tests/expr/hash/symhash-no-dreg_err.t
new file mode 100644
index 0000000..f5cc8e5
--- /dev/null
+++ b/tests/expr/hash/symhash-no-dreg_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+hash("1", NULL, NULL, NULL, "10", NULL, "0");
+commit();
diff --git a/tests/expr/hash/symhash-no-modulus_err.t b/tests/expr/hash/symhash-no-modulus_err.t
new file mode 100644
index 0000000..9c32730
--- /dev/null
+++ b/tests/expr/hash/symhash-no-modulus_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+hash("1", NULL, "NFT_REG32_15", NULL, NULL, NULL, "0");
+commit();
diff --git a/tests/expr/hash/symhash-no-offset_ok.t b/tests/expr/hash/symhash-no-offset_ok.t
new file mode 100644
index 0000000..7d85cd1
--- /dev/null
+++ b/tests/expr/hash/symhash-no-offset_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+hash("1", NULL, "NFT_REG32_15", NULL, "10", NULL, NULL);
+commit();
diff --git a/tests/expr/hash/symhash_ok.t b/tests/expr/hash/symhash_ok.t
new file mode 100644
index 0000000..da217a4
--- /dev/null
+++ b/tests/expr/hash/symhash_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+hash("1", NULL, "NFT_REG32_15", NULL, "10", NULL, "0");
+commit();
diff --git a/tests/expr/hash/unsupp-hash_err.t b/tests/expr/hash/unsupp-hash_err.t
new file mode 100644
index 0000000..627e9f1
--- /dev/null
+++ b/tests/expr/hash/unsupp-hash_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+hash("2", "NFT_REG32_15", "NFT_REG32_15", "4", "10", "0x5eed", "0");
+commit();
diff --git a/tests/expr/immediate/bad-chain-verdict-data_err.t b/tests/expr/immediate/bad-chain-verdict-data_err.t
new file mode 100644
index 0000000..05ff55f
--- /dev/null
+++ b/tests/expr/immediate/bad-chain-verdict-data_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_chain("test2", "0x2", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "badchain", "01020304");
+commit();
diff --git a/tests/expr/immediate/bad-chain_err.t b/tests/expr/immediate/bad-chain_err.t
new file mode 100644
index 0000000..76a23c3
--- /dev/null
+++ b/tests/expr/immediate/bad-chain_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "badchain", NULL);
+commit();
diff --git a/tests/expr/immediate/bad-data_err.t b/tests/expr/immediate/bad-data_err.t
new file mode 100644
index 0000000..cc50872
--- /dev/null
+++ b/tests/expr/immediate/bad-data_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, NULL, "0bad");
+commit();
diff --git a/tests/expr/immediate/bad-jump-other-table_err.t b/tests/expr/immediate/bad-jump-other-table_err.t
new file mode 100644
index 0000000..67bef92
--- /dev/null
+++ b/tests/expr/immediate/bad-jump-other-table_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test2", NULL, NULL, NULL);
+add_chain("test2", "0x2", NULL, NULL, NULL);
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test1", "0x1", NULL, NULL, NULL);
+add_rule("test1", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", "0x2", "test2", NULL);
+commit();
diff --git a/tests/expr/immediate/bad-reg_err.t b/tests/expr/immediate/bad-reg_err.t
new file mode 100644
index 0000000..a005554
--- /dev/null
+++ b/tests/expr/immediate/bad-reg_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_1", "NF_ACCEPT", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/immediate/chain_ok.t b/tests/expr/immediate/chain_ok.t
new file mode 100644
index 0000000..b6897d3
--- /dev/null
+++ b/tests/expr/immediate/chain_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_chain("test2", "0x2", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "test2", NULL);
+commit();
diff --git a/tests/expr/immediate/immediate-bad-verdict_err.t b/tests/expr/immediate/immediate-bad-verdict_err.t
new file mode 100644
index 0000000..5f0b93b
--- /dev/null
+++ b/tests/expr/immediate/immediate-bad-verdict_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "0xffff0000", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/immediate/immediate_ok.t b/tests/expr/immediate/immediate_ok.t
new file mode 100644
index 0000000..6662a69
--- /dev/null
+++ b/tests/expr/immediate/immediate_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NF_ACCEPT", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/immediate/loop_err.t b/tests/expr/immediate/loop_err.t
new file mode 100644
index 0000000..23dd254
--- /dev/null
+++ b/tests/expr/immediate/loop_err.t
@@ -0,0 +1,11 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, "10", "20", NULL, NULL);
+add_chain("test1", "0x1", NULL, NULL, NULL);
+add_chain("test2", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "test1", NULL);
+add_rule("test1", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "test2", NULL);
+add_rule("test2", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "test1", NULL);
+commit();
diff --git a/tests/expr/immediate/loop_self_err.t b/tests/expr/immediate/loop_self_err.t
new file mode 100644
index 0000000..c984acf
--- /dev/null
+++ b/tests/expr/immediate/loop_self_err.t
@@ -0,0 +1,8 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, "10", "20", NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "test1", NULL);
+add_chain("test1", "0x1", NULL, NULL, NULL);
+add_rule("test1", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, "test1", NULL);
+commit();
diff --git a/tests/expr/immediate/no-chain_err.t b/tests/expr/immediate/no-chain_err.t
new file mode 100644
index 0000000..371dffe
--- /dev/null
+++ b/tests/expr/immediate/no-chain_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_chain("test2", "0x2", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/immediate/verdict-data_err.t b/tests/expr/immediate/verdict-data_err.t
new file mode 100644
index 0000000..197c304
--- /dev/null
+++ b/tests/expr/immediate/verdict-data_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_chain("test2", "0x2", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG_VERDICT", "NFT_JUMP", NULL, NULL, "01020304");
+commit();
diff --git a/tests/expr/inner/inner_bad_flags_err.t b/tests/expr/inner/inner_bad_flags_err.t
new file mode 100644
index 0000000..be6589e
--- /dev/null
+++ b/tests/expr/inner/inner_bad_flags_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xff", "8");
+meta(NULL, "NFT_REG32_15", "1");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/inner/inner_bad_hdrsize_err.t b/tests/expr/inner/inner_bad_hdrsize_err.t
new file mode 100644
index 0000000..1c1b7ad
--- /dev/null
+++ b/tests/expr/inner/inner_bad_hdrsize_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xf", "128");
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/inner/inner_bad_num_err.t b/tests/expr/inner/inner_bad_num_err.t
new file mode 100644
index 0000000..be463ef
--- /dev/null
+++ b/tests/expr/inner/inner_bad_num_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("1", "1", "0xf", "8");
+meta(NULL, "NFT_REG32_15", "1");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/inner/inner_bad_type_err.t b/tests/expr/inner/inner_bad_type_err.t
new file mode 100644
index 0000000..5fb3db0
--- /dev/null
+++ b/tests/expr/inner/inner_bad_type_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1024", "0xf", "8");
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/inner/inner_meta_ok.t b/tests/expr/inner/inner_meta_ok.t
new file mode 100644
index 0000000..1bc598e
--- /dev/null
+++ b/tests/expr/inner/inner_meta_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xf", "8");
+meta(NULL, "NFT_REG32_15", "1");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/inner/inner_meta_unsupp_err.t b/tests/expr/inner/inner_meta_unsupp_err.t
new file mode 100644
index 0000000..50a4ba0
--- /dev/null
+++ b/tests/expr/inner/inner_meta_unsupp_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xf", "8");
+meta(NULL, "NFT_REG32_15", "0");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/inner/inner_payload_ok.t b/tests/expr/inner/inner_payload_ok.t
new file mode 100644
index 0000000..2604376
--- /dev/null
+++ b/tests/expr/inner/inner_payload_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xf", "8");
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/inner/inner_socket_err.t b/tests/expr/inner/inner_socket_err.t
new file mode 100644
index 0000000..0490fb6
--- /dev/null
+++ b/tests/expr/inner/inner_socket_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xf", "8");
+socket("NFT_REG32_15", "1", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/inner/inner_zero_hdrsize_err.t b/tests/expr/inner/inner_zero_hdrsize_err.t
new file mode 100644
index 0000000..9e773ca
--- /dev/null
+++ b/tests/expr/inner/inner_zero_hdrsize_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+inner("0", "1", "0xf", "0");
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/last/last_ok.t b/tests/expr/last/last_ok.t
new file mode 100644
index 0000000..d3ade06
--- /dev/null
+++ b/tests/expr/last/last_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+last(NULL, NULL);
+commit();
diff --git a/tests/expr/last/last_set_ok.t b/tests/expr/last/last_set_ok.t
new file mode 100644
index 0000000..5188310
--- /dev/null
+++ b/tests/expr/last/last_set_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+last("1", "1234567812345678");
+commit();
diff --git a/tests/expr/limit/bad-flags_err.t b/tests/expr/limit/bad-flags_err.t
new file mode 100644
index 0000000..bb7cae5
--- /dev/null
+++ b/tests/expr/limit/bad-flags_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0x1000", "0x1", "0x5", "0", "0xbad");
+commit();
diff --git a/tests/expr/limit/bad-rate_err.t b/tests/expr/limit/bad-rate_err.t
new file mode 100644
index 0000000..d639c5e
--- /dev/null
+++ b/tests/expr/limit/bad-rate_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0x0", "0x1", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/limit/bad-type_err.t b/tests/expr/limit/bad-type_err.t
new file mode 100644
index 0000000..da78ef1
--- /dev/null
+++ b/tests/expr/limit/bad-type_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0xffffffffffffffff", "0x1", NULL, "2", NULL);
+commit();
diff --git a/tests/expr/limit/bad-unit_err.t b/tests/expr/limit/bad-unit_err.t
new file mode 100644
index 0000000..c033d49
--- /dev/null
+++ b/tests/expr/limit/bad-unit_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0xffffffffffffffff", "0x0", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/limit/bytes_ok.t b/tests/expr/limit/bytes_ok.t
new file mode 100644
index 0000000..bffe43a
--- /dev/null
+++ b/tests/expr/limit/bytes_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0x1000", "0x1", "0x5", "1", NULL);
+commit();
diff --git a/tests/expr/limit/flags_ok.t b/tests/expr/limit/flags_ok.t
new file mode 100644
index 0000000..b60c43a
--- /dev/null
+++ b/tests/expr/limit/flags_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0x1000", "0x1", "0x5", "0", "0x1");
+commit();
diff --git a/tests/expr/limit/no-rate_err.t b/tests/expr/limit/no-rate_err.t
new file mode 100644
index 0000000..d1fc1d9
--- /dev/null
+++ b/tests/expr/limit/no-rate_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit(NULL, "0x1", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/limit/no-type_ok.t b/tests/expr/limit/no-type_ok.t
new file mode 100644
index 0000000..1b5c0f2
--- /dev/null
+++ b/tests/expr/limit/no-type_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0x1", "0x1", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/limit/no-unit_err.t b/tests/expr/limit/no-unit_err.t
new file mode 100644
index 0000000..39d3e1c
--- /dev/null
+++ b/tests/expr/limit/no-unit_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0xffffffffffffffff", NULL, NULL, "0", NULL);
+commit();
diff --git a/tests/expr/limit/overflow-burst_err.t b/tests/expr/limit/overflow-burst_err.t
new file mode 100644
index 0000000..8815448
--- /dev/null
+++ b/tests/expr/limit/overflow-burst_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0xffffffffffffffff", "0x1", "0xffffffff", "0", NULL);
+commit();
diff --git a/tests/expr/limit/overflow_err.t b/tests/expr/limit/overflow_err.t
new file mode 100644
index 0000000..a78c472
--- /dev/null
+++ b/tests/expr/limit/overflow_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0xffffffffffffffff", "0x1", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/limit/pkts_ok.t b/tests/expr/limit/pkts_ok.t
new file mode 100644
index 0000000..9b0b17a
--- /dev/null
+++ b/tests/expr/limit/pkts_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+limit("0x1", "0x1", "0x1", "0", NULL);
+commit();
diff --git a/tests/expr/log/log_audit_ok.t b/tests/expr/log/log_audit_ok.t
new file mode 100644
index 0000000..7f7f6fa
--- /dev/null
+++ b/tests/expr/log/log_audit_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, "8", NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_bad_flags_err.t b/tests/expr/log/log_bad_flags_err.t
new file mode 100644
index 0000000..ef34ccb
--- /dev/null
+++ b/tests/expr/log/log_bad_flags_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, NULL, "0x3f", "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_bad_level_err.t b/tests/expr/log/log_bad_level_err.t
new file mode 100644
index 0000000..cf5289b
--- /dev/null
+++ b/tests/expr/log/log_bad_level_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, "9", NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_bad_level_group_err.t b/tests/expr/log/log_bad_level_group_err.t
new file mode 100644
index 0000000..1109bad
--- /dev/null
+++ b/tests/expr/log/log_bad_level_group_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, "1", NULL, "1", NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_flags_ok.t b/tests/expr/log/log_flags_ok.t
new file mode 100644
index 0000000..a74f107
--- /dev/null
+++ b/tests/expr/log/log_flags_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, NULL, "0x2f", "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_group_ok.t b/tests/expr/log/log_group_ok.t
new file mode 100644
index 0000000..426e4bb
--- /dev/null
+++ b/tests/expr/log/log_group_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, "1", NULL, NULL, NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_group_snaplen_ok.t b/tests/expr/log/log_group_snaplen_ok.t
new file mode 100644
index 0000000..b5aa185
--- /dev/null
+++ b/tests/expr/log/log_group_snaplen_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log("12345678", "1", NULL, NULL, NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_level_ok.t b/tests/expr/log/log_level_ok.t
new file mode 100644
index 0000000..bbcf202
--- /dev/null
+++ b/tests/expr/log/log_level_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, "1", NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/log/log_no_prefix_ok.t b/tests/expr/log/log_no_prefix_ok.t
new file mode 100644
index 0000000..6c19aae
--- /dev/null
+++ b/tests/expr/log/log_no_prefix_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/log/log_ok.t b/tests/expr/log/log_ok.t
new file mode 100644
index 0000000..29a205f
--- /dev/null
+++ b/tests/expr/log/log_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+log(NULL, NULL, NULL, NULL, NULL, "0x7465737400");
+commit();
diff --git a/tests/expr/masq/masq_ok.t b/tests/expr/masq/masq_ok.t
new file mode 100644
index 0000000..ed5b602
--- /dev/null
+++ b/tests/expr/masq/masq_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+masq(NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/masq/masq_sreg_min_max_ok.t b/tests/expr/masq/masq_sreg_min_max_ok.t
new file mode 100644
index 0000000..07fbb32
--- /dev/null
+++ b/tests/expr/masq/masq_sreg_min_max_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_14", NULL, NULL, NULL, "0001");
+immediate("NFT_REG32_15", NULL, NULL, NULL, "0010");
+masq(NULL, "NFT_REG32_14", "NFT_REG32_15");
+commit();
diff --git a/tests/expr/masq/masq_sreg_ok.t b/tests/expr/masq/masq_sreg_ok.t
new file mode 100644
index 0000000..98998a1
--- /dev/null
+++ b/tests/expr/masq/masq_sreg_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "0001");
+masq(NULL, "NFT_REG32_15", NULL);
+commit();
diff --git a/tests/expr/match/match-comment-bad-datasize_err.t b/tests/expr/match/match-comment-bad-datasize_err.t
new file mode 100644
index 0000000..2d56fab
--- /dev/null
+++ b/tests/expr/match/match-comment-bad-datasize_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "filter", NULL, NULL, NULL);
+add_chain("INPUT", "0x1", NULL, NULL, NULL);
+add_rule("INPUT", "0x1", NULL, NULL, NULL);
+match("comment", "0", "44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444ff", NULL, NULL);
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-comment_ok.t b/tests/expr/match/match-comment_ok.t
new file mode 100644
index 0000000..6ceefff
--- /dev/null
+++ b/tests/expr/match/match-comment_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "filter", NULL, NULL, NULL);
+add_chain("INPUT", "0x1", NULL, NULL, NULL);
+add_rule("INPUT", "0x1", NULL, NULL, NULL);
+match("comment", "0", "44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444", NULL, NULL);
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-cpu-arp_ok.t b/tests/expr/match/match-cpu-arp_ok.t
new file mode 100644
index 0000000..2781cd4
--- /dev/null
+++ b/tests/expr/match/match-cpu-arp_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_ARP, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("cpu", "0", "0102030400000000", NULL, NULL);
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-cpu-inet_ok.t b/tests/expr/match/match-cpu-inet_ok.t
new file mode 100644
index 0000000..0bfc3fa
--- /dev/null
+++ b/tests/expr/match/match-cpu-inet_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("cpu", "0", "0102030400000000", NULL, NULL);
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-cpu_ok.t b/tests/expr/match/match-cpu_ok.t
new file mode 100644
index 0000000..ce08ad5
--- /dev/null
+++ b/tests/expr/match/match-cpu_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("cpu", "0", "0102030400000000", NULL, NULL);
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-no-name_err.t b/tests/expr/match/match-no-name_err.t
new file mode 100644
index 0000000..e16f03c
--- /dev/null
+++ b/tests/expr/match/match-no-name_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match(NULL, "0", "010203040506070809101112", "6", "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-bad-flags_err.t b/tests/expr/match/match-tcp-bad-flags_err.t
new file mode 100644
index 0000000..d718fdb
--- /dev/null
+++ b/tests/expr/match/match-tcp-bad-flags_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101112", "6", "1");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-inet-ingress_err.t b/tests/expr/match/match-tcp-inet-ingress_err.t
new file mode 100644
index 0000000..5e30b5d
--- /dev/null
+++ b/tests/expr/match/match-tcp-inet-ingress_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "5", "0", "dummy0", NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101112", "6", "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-invflag_err.t b/tests/expr/match/match-tcp-invflag_err.t
new file mode 100644
index 0000000..1a6fee4
--- /dev/null
+++ b/tests/expr/match/match-tcp-invflag_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101100", "6", "2");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-no-data_err.t b/tests/expr/match/match-tcp-no-data_err.t
new file mode 100644
index 0000000..9235e16
--- /dev/null
+++ b/tests/expr/match/match-tcp-no-data_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", NULL, "6", "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-no-flags_err.t b/tests/expr/match/match-tcp-no-flags_err.t
new file mode 100644
index 0000000..f32c645
--- /dev/null
+++ b/tests/expr/match/match-tcp-no-flags_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101112", NULL, "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-no-proto_err.t b/tests/expr/match/match-tcp-no-proto_err.t
new file mode 100644
index 0000000..f32c645
--- /dev/null
+++ b/tests/expr/match/match-tcp-no-proto_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101112", NULL, "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-no-rev_err.t b/tests/expr/match/match-tcp-no-rev_err.t
new file mode 100644
index 0000000..04311ab
--- /dev/null
+++ b/tests/expr/match/match-tcp-no-rev_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", NULL, "010203040506070809101112", "6", "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-short-data_err.t b/tests/expr/match/match-tcp-short-data_err.t
new file mode 100644
index 0000000..0699e07
--- /dev/null
+++ b/tests/expr/match/match-tcp-short-data_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506", "6", "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp-unsupp_err.t b/tests/expr/match/match-tcp-unsupp_err.t
new file mode 100644
index 0000000..5919753
--- /dev/null
+++ b/tests/expr/match/match-tcp-unsupp_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101112", "6", "0xffffffff");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/match/match-tcp_ok.t b/tests/expr/match/match-tcp_ok.t
new file mode 100644
index 0000000..7a709b7
--- /dev/null
+++ b/tests/expr/match/match-tcp_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+match("tcp", "0", "010203040506070809101100", "6", "0");
+counter(NULL, NULL);
+commit();
diff --git a/tests/expr/meta/00-len_ok.t b/tests/expr/meta/00-len_ok.t
new file mode 100644
index 0000000..4b5676e
--- /dev/null
+++ b/tests/expr/meta/00-len_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/01-protocol_ok.t b/tests/expr/meta/01-protocol_ok.t
new file mode 100644
index 0000000..e077814
--- /dev/null
+++ b/tests/expr/meta/01-protocol_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "1");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/meta/02-priority_ok.t b/tests/expr/meta/02-priority_ok.t
new file mode 100644
index 0000000..2e7b666
--- /dev/null
+++ b/tests/expr/meta/02-priority_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "2");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/03-mark_ok.t b/tests/expr/meta/03-mark_ok.t
new file mode 100644
index 0000000..944b83e
--- /dev/null
+++ b/tests/expr/meta/03-mark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "3");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/04-iif_ok.t b/tests/expr/meta/04-iif_ok.t
new file mode 100644
index 0000000..49cc144
--- /dev/null
+++ b/tests/expr/meta/04-iif_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "4");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/05-oif-bad-cmp_err.t b/tests/expr/meta/05-oif-bad-cmp_err.t
new file mode 100644
index 0000000..940de35
--- /dev/null
+++ b/tests/expr/meta/05-oif-bad-cmp_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", NULL, NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "5");
+cmp("NFT_REG32_15", "0", "ffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/05-oif_ok.t b/tests/expr/meta/05-oif_ok.t
new file mode 100644
index 0000000..87270dd
--- /dev/null
+++ b/tests/expr/meta/05-oif_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "5");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/06-iifname-bad_reg_err.t b/tests/expr/meta/06-iifname-bad_reg_err.t
new file mode 100644
index 0000000..4b2626e
--- /dev/null
+++ b/tests/expr/meta/06-iifname-bad_reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", NULL, NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_13", "7");
+cmp("NFT_REG32_15", "0", "ffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/06-iifname_ok.t b/tests/expr/meta/06-iifname_ok.t
new file mode 100644
index 0000000..bd896d1
--- /dev/null
+++ b/tests/expr/meta/06-iifname_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_00", "7");
+cmp("NFT_REG32_00", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/07-oifname_ok.t b/tests/expr/meta/07-oifname_ok.t
new file mode 100644
index 0000000..2ed715b
--- /dev/null
+++ b/tests/expr/meta/07-oifname_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_00", "6");
+cmp("NFT_REG32_00", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/08-iftype_ok.t b/tests/expr/meta/08-iftype_ok.t
new file mode 100644
index 0000000..40129b7
--- /dev/null
+++ b/tests/expr/meta/08-iftype_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "8");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/09-oiftype_ok.t b/tests/expr/meta/09-oiftype_ok.t
new file mode 100644
index 0000000..d804978
--- /dev/null
+++ b/tests/expr/meta/09-oiftype_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "9");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/10-cgroup_ok.t b/tests/expr/meta/10-cgroup_ok.t
new file mode 100644
index 0000000..2f32a5b
--- /dev/null
+++ b/tests/expr/meta/10-cgroup_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_14", "23");
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/10-skuid_ok.t b/tests/expr/meta/10-skuid_ok.t
new file mode 100644
index 0000000..a80fc29
--- /dev/null
+++ b/tests/expr/meta/10-skuid_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "10");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/11-skgid_ok.t b/tests/expr/meta/11-skgid_ok.t
new file mode 100644
index 0000000..5b4f2c2
--- /dev/null
+++ b/tests/expr/meta/11-skgid_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "11");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/12-nftrace_err.t b/tests/expr/meta/12-nftrace_err.t
new file mode 100644
index 0000000..6cbfb58
--- /dev/null
+++ b/tests/expr/meta/12-nftrace_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "12");
+commit();
diff --git a/tests/expr/meta/13-rtclassid_ok.t b/tests/expr/meta/13-rtclassid_ok.t
new file mode 100644
index 0000000..34e5dc0
--- /dev/null
+++ b/tests/expr/meta/13-rtclassid_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "13");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/14-secmark_ok.t b/tests/expr/meta/14-secmark_ok.t
new file mode 100644
index 0000000..48bacff
--- /dev/null
+++ b/tests/expr/meta/14-secmark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "14");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/15-nfproto_ok.t b/tests/expr/meta/15-nfproto_ok.t
new file mode 100644
index 0000000..ee3491e
--- /dev/null
+++ b/tests/expr/meta/15-nfproto_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "15");
+cmp("NFT_REG32_15", "0", "ff000000");
+commit();
diff --git a/tests/expr/meta/16-l4proto_ok.t b/tests/expr/meta/16-l4proto_ok.t
new file mode 100644
index 0000000..061a44c
--- /dev/null
+++ b/tests/expr/meta/16-l4proto_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "16");
+cmp("NFT_REG32_15", "0", "ff000000");
+commit();
diff --git a/tests/expr/meta/17-bri-iifname-bad-family_err.t b/tests/expr/meta/17-bri-iifname-bad-family_err.t
new file mode 100644
index 0000000..894fbc4
--- /dev/null
+++ b/tests/expr/meta/17-bri-iifname-bad-family_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_00", "17");
+cmp("NFT_REG32_00", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/17-bri-iifname_ok.t b/tests/expr/meta/17-bri-iifname_ok.t
new file mode 100644
index 0000000..ef2fa9c
--- /dev/null
+++ b/tests/expr/meta/17-bri-iifname_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_00", "17");
+cmp("NFT_REG32_00", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/18-bri-oifname-bad-family_err.t b/tests/expr/meta/18-bri-oifname-bad-family_err.t
new file mode 100644
index 0000000..f798d5c
--- /dev/null
+++ b/tests/expr/meta/18-bri-oifname-bad-family_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_00", "18");
+cmp("NFT_REG32_00", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/18-bri-oifname-bad-reg_err.t b/tests/expr/meta/18-bri-oifname-bad-reg_err.t
new file mode 100644
index 0000000..822581b
--- /dev/null
+++ b/tests/expr/meta/18-bri-oifname-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_13", "18");
+cmp("NFT_REG32_12", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/18-bri-oifname_ok.t b/tests/expr/meta/18-bri-oifname_ok.t
new file mode 100644
index 0000000..e0f3c7b
--- /dev/null
+++ b/tests/expr/meta/18-bri-oifname_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_00", "18");
+cmp("NFT_REG32_00", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/19-pkt-type_ok.t b/tests/expr/meta/19-pkt-type_ok.t
new file mode 100644
index 0000000..ee13162
--- /dev/null
+++ b/tests/expr/meta/19-pkt-type_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "19");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/20-cpu_ok.t b/tests/expr/meta/20-cpu_ok.t
new file mode 100644
index 0000000..3b22e72
--- /dev/null
+++ b/tests/expr/meta/20-cpu_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "20");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/21-iifgroup_ok.t b/tests/expr/meta/21-iifgroup_ok.t
new file mode 100644
index 0000000..4b380c2
--- /dev/null
+++ b/tests/expr/meta/21-iifgroup_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "21");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/22-oifgroup_ok.t b/tests/expr/meta/22-oifgroup_ok.t
new file mode 100644
index 0000000..c5de784
--- /dev/null
+++ b/tests/expr/meta/22-oifgroup_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "22");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/23-cgroup_ok.t b/tests/expr/meta/23-cgroup_ok.t
new file mode 100644
index 0000000..18f671e
--- /dev/null
+++ b/tests/expr/meta/23-cgroup_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "23");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/24-prandom_ok.t b/tests/expr/meta/24-prandom_ok.t
new file mode 100644
index 0000000..5b4f2c2
--- /dev/null
+++ b/tests/expr/meta/24-prandom_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "11");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/28-bri-iifpvid_ok.t b/tests/expr/meta/28-bri-iifpvid_ok.t
new file mode 100644
index 0000000..018d556
--- /dev/null
+++ b/tests/expr/meta/28-bri-iifpvid_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "28");
+cmp("NFT_REG32_15", "0", "0102");
+commit();
diff --git a/tests/expr/meta/29-bri-iifvproto_ok.t b/tests/expr/meta/29-bri-iifvproto_ok.t
new file mode 100644
index 0000000..2052d87
--- /dev/null
+++ b/tests/expr/meta/29-bri-iifvproto_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "29");
+cmp("NFT_REG32_15", "0", "0102");
+commit();
diff --git a/tests/expr/meta/30-time-ns-bad-reg_err.t b/tests/expr/meta/30-time-ns-bad-reg_err.t
new file mode 100644
index 0000000..150265e
--- /dev/null
+++ b/tests/expr/meta/30-time-ns-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "30");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/30-time-ns_ok.t b/tests/expr/meta/30-time-ns_ok.t
new file mode 100644
index 0000000..46b3ba7
--- /dev/null
+++ b/tests/expr/meta/30-time-ns_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_14", "30");
+cmp("NFT_REG32_14", "0", "ffffffffffffffff");
+commit();
diff --git a/tests/expr/meta/31-time-day_ok.t b/tests/expr/meta/31-time-day_ok.t
new file mode 100644
index 0000000..26b7e17
--- /dev/null
+++ b/tests/expr/meta/31-time-day_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "31");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/32-time-hour_ok.t b/tests/expr/meta/32-time-hour_ok.t
new file mode 100644
index 0000000..16280d0
--- /dev/null
+++ b/tests/expr/meta/32-time-hour_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "32");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/33-sd-if_ok.t b/tests/expr/meta/33-sd-if_ok.t
new file mode 100644
index 0000000..f945bd7
--- /dev/null
+++ b/tests/expr/meta/33-sd-if_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "33");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/34-sd-ifname_ok.t b/tests/expr/meta/34-sd-ifname_ok.t
new file mode 100644
index 0000000..30d57c4
--- /dev/null
+++ b/tests/expr/meta/34-sd-ifname_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_12", "34");
+cmp("NFT_REG32_12", "0", "01020304010203040102030401020304");
+commit();
diff --git a/tests/expr/meta/35-bri-broute_err.t b/tests/expr/meta/35-bri-broute_err.t
new file mode 100644
index 0000000..46ae1ab
--- /dev/null
+++ b/tests/expr/meta/35-bri-broute_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "35");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/meta/36-unsupp-key_err.t b/tests/expr/meta/36-unsupp-key_err.t
new file mode 100644
index 0000000..dce3630
--- /dev/null
+++ b/tests/expr/meta/36-unsupp-key_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", "36");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/no-key_err.t b/tests/expr/meta/no-key_err.t
new file mode 100644
index 0000000..f3df709
--- /dev/null
+++ b/tests/expr/meta/no-key_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+meta(NULL, "NFT_REG32_15", NULL);
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/meta/set-02-priority_ok.t b/tests/expr/meta/set-02-priority_ok.t
new file mode 100644
index 0000000..03a6065
--- /dev/null
+++ b/tests/expr/meta/set-02-priority_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", NULL, "2");
+commit();
diff --git a/tests/expr/meta/set-03-mark_ok.t b/tests/expr/meta/set-03-mark_ok.t
new file mode 100644
index 0000000..13cde43
--- /dev/null
+++ b/tests/expr/meta/set-03-mark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", NULL, "3");
+commit();
diff --git a/tests/expr/meta/set-12-nftrace_ok.t b/tests/expr/meta/set-12-nftrace_ok.t
new file mode 100644
index 0000000..5282acf
--- /dev/null
+++ b/tests/expr/meta/set-12-nftrace_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", NULL, "12");
+commit();
diff --git a/tests/expr/meta/set-14-secmark_ok.t b/tests/expr/meta/set-14-secmark_ok.t
new file mode 100644
index 0000000..1c03eff
--- /dev/null
+++ b/tests/expr/meta/set-14-secmark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", NULL, "14");
+commit();
diff --git a/tests/expr/meta/set-19-pkttype_ok.t b/tests/expr/meta/set-19-pkttype_ok.t
new file mode 100644
index 0000000..a32a708
--- /dev/null
+++ b/tests/expr/meta/set-19-pkttype_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", NULL, "19");
+commit();
diff --git a/tests/expr/meta/set-36-unsupp-key_err.t b/tests/expr/meta/set-36-unsupp-key_err.t
new file mode 100644
index 0000000..7aab70f
--- /dev/null
+++ b/tests/expr/meta/set-36-unsupp-key_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", NULL, "36");
+commit();
diff --git a/tests/expr/meta/sreg-dreg_err.t b/tests/expr/meta/sreg-dreg_err.t
new file mode 100644
index 0000000..9bf69b7
--- /dev/null
+++ b/tests/expr/meta/sreg-dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+meta("NFT_REG32_15", "NFT_REG32_15", "2");
+commit();
diff --git a/tests/expr/nat/dnat_ok.t b/tests/expr/nat/dnat_ok.t
new file mode 100644
index 0000000..3106075
--- /dev/null
+++ b/tests/expr/nat/dnat_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+nat(NFPROTO_IPV4, "NFT_REG32_12", NULL, NULL, NULL, "1", NULL);
+commit();
diff --git a/tests/expr/nat/nat_bad_family_err.t b/tests/expr/nat/nat_bad_family_err.t
new file mode 100644
index 0000000..9d9c8ce
--- /dev/null
+++ b/tests/expr/nat/nat_bad_family_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+nat(NFPROTO_NETDEV, "NFT_REG32_12", NULL, NULL, NULL, "0", NULL);
+commit();
diff --git a/tests/expr/nat/nat_bad_type_err.t b/tests/expr/nat/nat_bad_type_err.t
new file mode 100644
index 0000000..5f397f3
--- /dev/null
+++ b/tests/expr/nat/nat_bad_type_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+nat(NFPROTO_IPV4, "NFT_REG32_12", NULL, NULL, NULL, "3", NULL);
+commit();
diff --git a/tests/expr/nat/nat_inet_ipv4_ok.t b/tests/expr/nat/nat_inet_ipv4_ok.t
new file mode 100644
index 0000000..8cdfbb4
--- /dev/null
+++ b/tests/expr/nat/nat_inet_ipv4_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+nat(NFPROTO_IPV4, "NFT_REG32_12", NULL, NULL, NULL, "0", NULL);
+commit();
diff --git a/tests/expr/nat/nat_inet_ok.t b/tests/expr/nat/nat_inet_ok.t
new file mode 100644
index 0000000..84368a2
--- /dev/null
+++ b/tests/expr/nat/nat_inet_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_14", NULL, NULL, NULL, "0102");
+nat(NFPROTO_INET, NULL, NULL, "NFT_REG32_14", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/nat/nat_ok.t b/tests/expr/nat/nat_ok.t
new file mode 100644
index 0000000..fbe2328
--- /dev/null
+++ b/tests/expr/nat/nat_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+nat(NFPROTO_IPV4, "NFT_REG32_12", NULL, NULL, NULL, "0", NULL);
+commit();
diff --git a/tests/expr/nat/nat_sreg_dreg_proto_ok.t b/tests/expr/nat/nat_sreg_dreg_proto_ok.t
new file mode 100644
index 0000000..41121eb
--- /dev/null
+++ b/tests/expr/nat/nat_sreg_dreg_proto_ok.t
@@ -0,0 +1,9 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+immediate("NFT_REG32_13", NULL, NULL, NULL, "02030405");
+immediate("NFT_REG32_14", NULL, NULL, NULL, "0506");
+immediate("NFT_REG32_15", NULL, NULL, NULL, "0708");
+nat(NFPROTO_IPV4, "NFT_REG32_12", "NFT_REG32_14", "NFT_REG32_14", "NFT_REG32_15", "0", NULL);
+commit();
diff --git a/tests/expr/nat/nat_sreg_proto_ok.t b/tests/expr/nat/nat_sreg_proto_ok.t
new file mode 100644
index 0000000..cd99b73
--- /dev/null
+++ b/tests/expr/nat/nat_sreg_proto_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "01020304");
+immediate("NFT_REG32_14", NULL, NULL, NULL, "0506");
+nat(NFPROTO_IPV4, "NFT_REG32_12", NULL, "NFT_REG32_14", NULL, "0", NULL);
+commit();
diff --git a/tests/expr/numgen/numgen-0-inc_ok.t b/tests/expr/numgen/numgen-0-inc_ok.t
new file mode 100644
index 0000000..73e6029
--- /dev/null
+++ b/tests/expr/numgen/numgen-0-inc_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+numgen("NFT_REG32_15", "10", "0", "0");
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/numgen/numgen-1-random_ok.t b/tests/expr/numgen/numgen-1-random_ok.t
new file mode 100644
index 0000000..a34ea43
--- /dev/null
+++ b/tests/expr/numgen/numgen-1-random_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+numgen("NFT_REG32_15", "10", "1", "0");
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/numgen/numgen-2-invalid_err.t b/tests/expr/numgen/numgen-2-invalid_err.t
new file mode 100644
index 0000000..3f49773
--- /dev/null
+++ b/tests/expr/numgen/numgen-2-invalid_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+numgen("NFT_REG_1", "10", "2", "0");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/numgen/numgen-bad-modulus_err.t b/tests/expr/numgen/numgen-bad-modulus_err.t
new file mode 100644
index 0000000..65388fd
--- /dev/null
+++ b/tests/expr/numgen/numgen-bad-modulus_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+numgen("NFT_REG_1", "0", "0", "0");
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/numgen/numgen-overflow-offset_err.t b/tests/expr/numgen/numgen-overflow-offset_err.t
new file mode 100644
index 0000000..adba353
--- /dev/null
+++ b/tests/expr/numgen/numgen-overflow-offset_err.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+numgen("NFT_REG32_15", "2", "0", "0xffffffff");
+byteorder("NFT_REG32_15", "NFT_REG32_15", "0", "4", "4");
+cmp("NFT_REG32_15", "0", "01020304");
+commit();
diff --git a/tests/expr/osf/osf_bad_flags_err.t b/tests/expr/osf/osf_bad_flags_err.t
new file mode 100644
index 0000000..5e5d303
--- /dev/null
+++ b/tests/expr/osf/osf_bad_flags_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+osf("NFT_REG_1", NULL, "0x2");
+cmp("NFT_REG_1", "0", "4c696e7578000000");
+commit();
diff --git a/tests/expr/osf/osf_bad_ttl_err.t b/tests/expr/osf/osf_bad_ttl_err.t
new file mode 100644
index 0000000..00f22c8
--- /dev/null
+++ b/tests/expr/osf/osf_bad_ttl_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+osf("NFT_REG_1", "3", NULL);
+cmp("NFT_REG_1", "0", "4c696e7578000000");
+commit();
diff --git a/tests/expr/osf/osf_flags_ok.t b/tests/expr/osf/osf_flags_ok.t
new file mode 100644
index 0000000..150dcc4
--- /dev/null
+++ b/tests/expr/osf/osf_flags_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+osf("NFT_REG_1", NULL, "0x1");
+cmp("NFT_REG_1", "0", "4c696e7578000000");
+commit();
diff --git a/tests/expr/osf/osf_no_dreg_err.t b/tests/expr/osf/osf_no_dreg_err.t
new file mode 100644
index 0000000..c20f0d0
--- /dev/null
+++ b/tests/expr/osf/osf_no_dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+osf(NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "4c696e7578000000");
+commit();
diff --git a/tests/expr/osf/osf_ok.t b/tests/expr/osf/osf_ok.t
new file mode 100644
index 0000000..9f8445b
--- /dev/null
+++ b/tests/expr/osf/osf_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+osf("NFT_REG_1", NULL, NULL);
+cmp("NFT_REG_1", "0", "4c696e7578000000");
+commit();
diff --git a/tests/expr/osf/osf_ttl_ok.t b/tests/expr/osf/osf_ttl_ok.t
new file mode 100644
index 0000000..6af9a48
--- /dev/null
+++ b/tests/expr/osf/osf_ttl_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+osf("NFT_REG_1", "0", NULL);
+cmp("NFT_REG_1", "0", "4c696e7578000000");
+commit();
diff --git a/tests/expr/payload/payload-bad-reg_err.t b/tests/expr/payload/payload-bad-reg_err.t
new file mode 100644
index 0000000..9627cb6
--- /dev/null
+++ b/tests/expr/payload/payload-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_VERDICT", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-len-too-large-reg-4_err.t b/tests/expr/payload/payload-len-too-large-reg-4_err.t
new file mode 100644
index 0000000..4f5ce31
--- /dev/null
+++ b/tests/expr/payload/payload-len-too-large-reg-4_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_4", "1", "12", "32", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-len-too-large-reg32-15_err.t b/tests/expr/payload/payload-len-too-large-reg32-15_err.t
new file mode 100644
index 0000000..9c8e5f3
--- /dev/null
+++ b/tests/expr/payload/payload-len-too-large-reg32-15_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG32_15", "1", "12", "8", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-len-too-large_err.t b/tests/expr/payload/payload-len-too-large_err.t
new file mode 100644
index 0000000..cd03314
--- /dev/null
+++ b/tests/expr/payload/payload-len-too-large_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "65", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-len-zero_err.t b/tests/expr/payload/payload-len-zero_err.t
new file mode 100644
index 0000000..94c9391
--- /dev/null
+++ b/tests/expr/payload/payload-len-zero_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "0", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-unknown-reg-5_err.t b/tests/expr/payload/payload-unknown-reg-5_err.t
new file mode 100644
index 0000000..f8b2d68
--- /dev/null
+++ b/tests/expr/payload/payload-unknown-reg-5_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "5", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-unknown-reg-6_err.t b/tests/expr/payload/payload-unknown-reg-6_err.t
new file mode 100644
index 0000000..25c3fed
--- /dev/null
+++ b/tests/expr/payload/payload-unknown-reg-6_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "6", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-unknown-reg-7_err.t b/tests/expr/payload/payload-unknown-reg-7_err.t
new file mode 100644
index 0000000..022f07b
--- /dev/null
+++ b/tests/expr/payload/payload-unknown-reg-7_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "7", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload-unknown-reg32-24_err.t b/tests/expr/payload/payload-unknown-reg32-24_err.t
new file mode 100644
index 0000000..90e280f
--- /dev/null
+++ b/tests/expr/payload/payload-unknown-reg32-24_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "24", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/payload/payload_ok.t b/tests/expr/payload/payload_ok.t
new file mode 100644
index 0000000..0dc1f05
--- /dev/null
+++ b/tests/expr/payload/payload_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+cmp("NFT_REG_1", "0", "01020304");
+commit();
diff --git a/tests/expr/queue/queue_bypass_ok.t b/tests/expr/queue/queue_bypass_ok.t
new file mode 100644
index 0000000..9db3072
--- /dev/null
+++ b/tests/expr/queue/queue_bypass_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+queue(NULL, "1", NULL, "0x1");
+commit();
diff --git a/tests/expr/queue/queue_fanout_ok.t b/tests/expr/queue/queue_fanout_ok.t
new file mode 100644
index 0000000..00d8525
--- /dev/null
+++ b/tests/expr/queue/queue_fanout_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+queue(NULL, "1", "2", "0x2");
+commit();
diff --git a/tests/expr/queue/queue_no_num_sreg_err.t b/tests/expr/queue/queue_no_num_sreg_err.t
new file mode 100644
index 0000000..670fde5
--- /dev/null
+++ b/tests/expr/queue/queue_no_num_sreg_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+queue(NULL, NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/queue/queue_num_sreg_err.t b/tests/expr/queue/queue_num_sreg_err.t
new file mode 100644
index 0000000..adfeeee
--- /dev/null
+++ b/tests/expr/queue/queue_num_sreg_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+queue("NFT_REG32_15", "1", NULL, NULL);
+commit();
diff --git a/tests/expr/queue/queue_ok.t b/tests/expr/queue/queue_ok.t
new file mode 100644
index 0000000..0f3bc30
--- /dev/null
+++ b/tests/expr/queue/queue_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+queue(NULL, "1", NULL, NULL);
+commit();
diff --git a/tests/expr/queue/queue_sreg_fanout_err.t b/tests/expr/queue/queue_sreg_fanout_err.t
new file mode 100644
index 0000000..b03b3f6
--- /dev/null
+++ b/tests/expr/queue/queue_sreg_fanout_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+queue("NFT_REG32_15", NULL, NULL, "0x2");
+commit();
diff --git a/tests/expr/queue/queue_sreg_ok.t b/tests/expr/queue/queue_sreg_ok.t
new file mode 100644
index 0000000..9bcf064
--- /dev/null
+++ b/tests/expr/queue/queue_sreg_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+queue("NFT_REG32_15", NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/quota/quota_bad_flags_err.t b/tests/expr/quota/quota_bad_flags_err.t
new file mode 100644
index 0000000..28e5753
--- /dev/null
+++ b/tests/expr/quota/quota_bad_flags_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota("1000", "0", "0x2");
+commit();
diff --git a/tests/expr/quota/quota_consumed_too_high_err.t b/tests/expr/quota/quota_consumed_too_high_err.t
new file mode 100644
index 0000000..cacbbea
--- /dev/null
+++ b/tests/expr/quota/quota_consumed_too_high_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota("1000", "2000", NULL);
+commit();
diff --git a/tests/expr/quota/quota_depleted_err.t b/tests/expr/quota/quota_depleted_err.t
new file mode 100644
index 0000000..28e5753
--- /dev/null
+++ b/tests/expr/quota/quota_depleted_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota("1000", "0", "0x2");
+commit();
diff --git a/tests/expr/quota/quota_flags_ok.t b/tests/expr/quota/quota_flags_ok.t
new file mode 100644
index 0000000..5ecddd3
--- /dev/null
+++ b/tests/expr/quota/quota_flags_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota("1000", "0", "0x1");
+commit();
diff --git a/tests/expr/quota/quota_no_bytes_err.t b/tests/expr/quota/quota_no_bytes_err.t
new file mode 100644
index 0000000..3650b82
--- /dev/null
+++ b/tests/expr/quota/quota_no_bytes_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota(NULL, "0", NULL);
+commit();
diff --git a/tests/expr/quota/quota_no_consumed_ok.t b/tests/expr/quota/quota_no_consumed_ok.t
new file mode 100644
index 0000000..8da29d3
--- /dev/null
+++ b/tests/expr/quota/quota_no_consumed_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota("1000", NULL, NULL);
+commit();
diff --git a/tests/expr/quota/quota_ok.t b/tests/expr/quota/quota_ok.t
new file mode 100644
index 0000000..920ab02
--- /dev/null
+++ b/tests/expr/quota/quota_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+quota("1000", "0", NULL);
+commit();
diff --git a/tests/expr/range/range-0-eq_ok.t b/tests/expr/range/range-0-eq_ok.t
new file mode 100644
index 0000000..1eb5463
--- /dev/null
+++ b/tests/expr/range/range-0-eq_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range("NFT_REG_1", "0", "01020304", "04050607");
+commit();
diff --git a/tests/expr/range/range-1-neq_ok.t b/tests/expr/range/range-1-neq_ok.t
new file mode 100644
index 0000000..0886d18
--- /dev/null
+++ b/tests/expr/range/range-1-neq_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range("NFT_REG_1", "1", "01020304", "04050607");
+commit();
diff --git a/tests/expr/range/range-2-invalid-op_err.t b/tests/expr/range/range-2-invalid-op_err.t
new file mode 100644
index 0000000..5052bf9
--- /dev/null
+++ b/tests/expr/range/range-2-invalid-op_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range("NFT_REG_1", "2", "01020304", "04050607");
+commit();
diff --git a/tests/expr/range/range-no-data-from_err.t b/tests/expr/range/range-no-data-from_err.t
new file mode 100644
index 0000000..17a9afc
--- /dev/null
+++ b/tests/expr/range/range-no-data-from_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range("NFT_REG_1", "0", "01020304", NULL);
+commit();
diff --git a/tests/expr/range/range-no-data-to_err.t b/tests/expr/range/range-no-data-to_err.t
new file mode 100644
index 0000000..490df52
--- /dev/null
+++ b/tests/expr/range/range-no-data-to_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range("NFT_REG_1", "0", "04050607", NULL);
+commit();
diff --git a/tests/expr/range/range-no-sreg_err.t b/tests/expr/range/range-no-sreg_err.t
new file mode 100644
index 0000000..3493d98
--- /dev/null
+++ b/tests/expr/range/range-no-sreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range(NULL, "0", "01020304", "04050607");
+commit();
diff --git a/tests/expr/range/range-too-large-data-from_err.t b/tests/expr/range/range-too-large-data-from_err.t
new file mode 100644
index 0000000..ff2752c
--- /dev/null
+++ b/tests/expr/range/range-too-large-data-from_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+payload(NULL, "NFT_REG_1", "1", "12", "4", NULL, NULL, NULL);
+range("NFT_REG32_15", "0", "0102030405060708", "0405060701020304");
+commit();
diff --git a/tests/expr/redir/redir_ok.t b/tests/expr/redir/redir_ok.t
new file mode 100644
index 0000000..85c3104
--- /dev/null
+++ b/tests/expr/redir/redir_ok.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+redir(NULL, NULL, NULL);
+commit();
diff --git a/tests/expr/redir/redir_sreg_min_max_ok.t b/tests/expr/redir/redir_sreg_min_max_ok.t
new file mode 100644
index 0000000..b0ecdb1
--- /dev/null
+++ b/tests/expr/redir/redir_sreg_min_max_ok.t
@@ -0,0 +1,7 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_14", NULL, NULL, NULL, "0001");
+immediate("NFT_REG32_15", NULL, NULL, NULL, "0010");
+redir(NULL, "NFT_REG32_14", "NFT_REG32_15");
+commit();
diff --git a/tests/expr/redir/redir_sreg_ok.t b/tests/expr/redir/redir_sreg_ok.t
new file mode 100644
index 0000000..62ec00a
--- /dev/null
+++ b/tests/expr/redir/redir_sreg_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", "0x1", NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "0001");
+redir(NULL, "NFT_REG32_15", NULL);
+commit();
diff --git a/tests/expr/rt/00-classid_ok.t b/tests/expr/rt/00-classid_ok.t
new file mode 100644
index 0000000..bb65a7f
--- /dev/null
+++ b/tests/expr/rt/00-classid_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_15", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/rt/01-nexthop-ipv4_ok.t b/tests/expr/rt/01-nexthop-ipv4_ok.t
new file mode 100644
index 0000000..5385c95
--- /dev/null
+++ b/tests/expr/rt/01-nexthop-ipv4_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_15", "1");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/rt/02-nexthop6-ipv6-bad-reg_err.t b/tests/expr/rt/02-nexthop6-ipv6-bad-reg_err.t
new file mode 100644
index 0000000..db3dcf9
--- /dev/null
+++ b/tests/expr/rt/02-nexthop6-ipv6-bad-reg_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_13", "2");
+commit();
diff --git a/tests/expr/rt/02-nexthop6-ipv6_ok.t b/tests/expr/rt/02-nexthop6-ipv6_ok.t
new file mode 100644
index 0000000..0d5aa41
--- /dev/null
+++ b/tests/expr/rt/02-nexthop6-ipv6_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_12", "2");
+cmp("NFT_REG32_12", "0", "ffffffffffffffffffffffffffffffff");
+commit();
diff --git a/tests/expr/rt/03-tcpmss_ok.t b/tests/expr/rt/03-tcpmss_ok.t
new file mode 100644
index 0000000..0388efa
--- /dev/null
+++ b/tests/expr/rt/03-tcpmss_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_15", "3");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/rt/04-xfrm_ok.t b/tests/expr/rt/04-xfrm_ok.t
new file mode 100644
index 0000000..6587776
--- /dev/null
+++ b/tests/expr/rt/04-xfrm_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_15", "4");
+cmp("NFT_REG32_15", "0", "ffff");
+commit();
diff --git a/tests/expr/rt/05-unsupport_err.t b/tests/expr/rt/05-unsupport_err.t
new file mode 100644
index 0000000..734d556
--- /dev/null
+++ b/tests/expr/rt/05-unsupport_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+rt("NFT_REG32_15", "5");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/socket/00-transparent_ok.t b/tests/expr/socket/00-transparent_ok.t
new file mode 100644
index 0000000..88028e5
--- /dev/null
+++ b/tests/expr/socket/00-transparent_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "0", NULL);
+cmp("NFT_REG32_14", "0", "00000001");
+commit();
diff --git a/tests/expr/socket/01-mark_bad_family_err.t b/tests/expr/socket/01-mark_bad_family_err.t
new file mode 100644
index 0000000..d5e1a53
--- /dev/null
+++ b/tests/expr/socket/01-mark_bad_family_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_NETDEV, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "1", NULL);
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/socket/01-mark_ok.t b/tests/expr/socket/01-mark_ok.t
new file mode 100644
index 0000000..7067a1e
--- /dev/null
+++ b/tests/expr/socket/01-mark_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "1", NULL);
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/socket/02-wildcard_ok.t b/tests/expr/socket/02-wildcard_ok.t
new file mode 100644
index 0000000..f747ffd
--- /dev/null
+++ b/tests/expr/socket/02-wildcard_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "2", NULL);
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/socket/03-socket-cgroups-bad-reg_err.t b/tests/expr/socket/03-socket-cgroups-bad-reg_err.t
new file mode 100644
index 0000000..63cd96a
--- /dev/null
+++ b/tests/expr/socket/03-socket-cgroups-bad-reg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_15", "3", "0");
+cmp("NFT_REG32_15", "0", "ffffffff");
+commit();
diff --git a/tests/expr/socket/03-socket-cgroups-level-high_err.t b/tests/expr/socket/03-socket-cgroups-level-high_err.t
new file mode 100644
index 0000000..75625aa
--- /dev/null
+++ b/tests/expr/socket/03-socket-cgroups-level-high_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "3", "512");
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/socket/03-socket-cgroups-no-level_err.t b/tests/expr/socket/03-socket-cgroups-no-level_err.t
new file mode 100644
index 0000000..4054d6b
--- /dev/null
+++ b/tests/expr/socket/03-socket-cgroups-no-level_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "3", NULL);
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/socket/03-socket-cgroups_ok.t b/tests/expr/socket/03-socket-cgroups_ok.t
new file mode 100644
index 0000000..d48bde8
--- /dev/null
+++ b/tests/expr/socket/03-socket-cgroups_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "3", "0");
+cmp("NFT_REG32_14", "0", "0102030401020304");
+commit();
diff --git a/tests/expr/socket/socket_bad_key_err.t b/tests/expr/socket/socket_bad_key_err.t
new file mode 100644
index 0000000..ddff798
--- /dev/null
+++ b/tests/expr/socket/socket_bad_key_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", "5", NULL);
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/socket/socket_no_dreg_err.t b/tests/expr/socket/socket_no_dreg_err.t
new file mode 100644
index 0000000..ebdd4f0
--- /dev/null
+++ b/tests/expr/socket/socket_no_dreg_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_NETDEV, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket(NULL, "1", NULL);
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/socket/socket_no_key_err.t b/tests/expr/socket/socket_no_key_err.t
new file mode 100644
index 0000000..73a5fbf
--- /dev/null
+++ b/tests/expr/socket/socket_no_key_err.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_NETDEV, "test", NULL, NULL, NULL);
+add_chain("test", NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+socket("NFT_REG32_14", NULL, NULL);
+cmp("NFT_REG32_14", "0", "01020304");
+commit();
diff --git a/tests/expr/tproxy/tproxy-bridge_err.t b/tests/expr/tproxy/tproxy-bridge_err.t
new file mode 100644
index 0000000..979e87f
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-bridge_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_BRIDGE, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_IPV4, NULL, NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-inet-bridge_err.t b/tests/expr/tproxy/tproxy-inet-bridge_err.t
new file mode 100644
index 0000000..2a5c882
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-inet-bridge_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_BRIDGE, NULL, NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-inet-ingress_err.t b/tests/expr/tproxy/tproxy-inet-ingress_err.t
new file mode 100644
index 0000000..89ef41a
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-inet-ingress_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "5", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_IPV4, NULL, NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-inet-ipv4_ok.t b/tests/expr/tproxy/tproxy-inet-ipv4_ok.t
new file mode 100644
index 0000000..2d1e1ab
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-inet-ipv4_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000010");
+tproxy(NFPROTO_IPV4, NULL, "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-inet-ipv6_ok.t b/tests/expr/tproxy/tproxy-inet-ipv6_ok.t
new file mode 100644
index 0000000..c077470
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-inet-ipv6_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000010");
+tproxy(NFPROTO_IPV6, NULL, "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-inet-unspec_ok.t b/tests/expr/tproxy/tproxy-inet-unspec_ok.t
new file mode 100644
index 0000000..dc13728
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-inet-unspec_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_INET, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000010");
+tproxy(NFPROTO_UNSPEC, NULL, "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv4-addr-no-imm_err.t b/tests/expr/tproxy/tproxy-ipv4-addr-no-imm_err.t
new file mode 100644
index 0000000..912ce4b
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv4-addr-no-imm_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_IPV4, "NFT_REG32_15", NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv4-addr-port_ok.t b/tests/expr/tproxy/tproxy-ipv4-addr-port_ok.t
new file mode 100644
index 0000000..cd52601
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv4-addr-port_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+tproxy(NFPROTO_IPV4, "NFT_REG32_15", "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv4-addr_ok.t b/tests/expr/tproxy/tproxy-ipv4-addr_ok.t
new file mode 100644
index 0000000..6c974b7
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv4-addr_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000001");
+tproxy(NFPROTO_IPV4, "NFT_REG32_15", NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv4-ipv6_err.t b/tests/expr/tproxy/tproxy-ipv4-ipv6_err.t
new file mode 100644
index 0000000..f767a5c
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv4-ipv6_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_IPV6, NULL, NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv4-port_ok.t b/tests/expr/tproxy/tproxy-ipv4-port_ok.t
new file mode 100644
index 0000000..23be683
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv4-port_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000101");
+tproxy(NFPROTO_IPV4, NULL, "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv4_ok.t b/tests/expr/tproxy/tproxy-ipv4_ok.t
new file mode 100644
index 0000000..4d035d1
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv4_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV4, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000010");
+tproxy(NFPROTO_IPV4, NULL, "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv6-addr-port_ok.t b/tests/expr/tproxy/tproxy-ipv6-addr-port_ok.t
new file mode 100644
index 0000000..f87c510
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv6-addr-port_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "00000001000000020000000300000004");
+tproxy(NFPROTO_IPV6, "NFT_REG32_12", "NFT_REG32_15");
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv6-addr_err.t b/tests/expr/tproxy/tproxy-ipv6-addr_err.t
new file mode 100644
index 0000000..1675c0b
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv6-addr_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_IPV6, "NFT_REG32_13", NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv6-addr_ok.t b/tests/expr/tproxy/tproxy-ipv6-addr_ok.t
new file mode 100644
index 0000000..7269035
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv6-addr_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "00000001000000020000000300000004");
+tproxy(NFPROTO_IPV6, "NFT_REG32_12", NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv6-ipv4_err.t b/tests/expr/tproxy/tproxy-ipv6-ipv4_err.t
new file mode 100644
index 0000000..005b55b
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv6-ipv4_err.t
@@ -0,0 +1,5 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+tproxy(NFPROTO_IPV4, NULL, NULL);
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv6-port_ok.t b/tests/expr/tproxy/tproxy-ipv6-port_ok.t
new file mode 100644
index 0000000..ae61b2d
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv6-port_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_12", NULL, NULL, NULL, "00000001000000020000000300000004");
+tproxy(NFPROTO_IPV6, NULL, "NFT_REG32_12");
+commit();
diff --git a/tests/expr/tproxy/tproxy-ipv6_ok.t b/tests/expr/tproxy/tproxy-ipv6_ok.t
new file mode 100644
index 0000000..e77e9e1
--- /dev/null
+++ b/tests/expr/tproxy/tproxy-ipv6_ok.t
@@ -0,0 +1,6 @@
+add_table(NFPROTO_IPV6, "test", NULL, NULL, NULL);
+add_basechain("test", "filter", "0", "0", NULL, NULL, "NF_ACCEPT", NULL, NULL, NULL, NULL, NULL, NULL);
+add_rule("test", "0x1", NULL, NULL, NULL);
+immediate("NFT_REG32_15", NULL, NULL, NULL, "00000010");
+tproxy(NFPROTO_IPV6, NULL, "NFT_REG32_15");
+commit();