diff mbox series

[ovs-dev] Remove oss-fuzz tests carried over from ovs

Message ID 20191018091308.16406-1-bshas3@gmail.com
State Accepted
Commit 45d4c279f9690f5f40883a7fa68595ac2f6105a9
Headers show
Series [ovs-dev] Remove oss-fuzz tests carried over from ovs | expand

Commit Message

Bhargava Shastry Oct. 18, 2019, 9:13 a.m. UTC
From: Bhargava Shastry <bshas3@gmail.com>

It appears that ossfuzz specific test harnesses and configuration files
were carried over to the ovn repo from the ovs repo without
justification. This patch removes them until there is a need to
continuously fuzz ovn code as the ovs code is currently fuzzed.

Signed-off-by: Bhargava Shastry <bshas3@gmail.com>
---
 tests/automake.mk                             |   2 -
 tests/oss-fuzz/automake.mk                    |  66 ---
 tests/oss-fuzz/config/expr.dict               | 120 -----
 .../oss-fuzz/config/expr_parse_target.options |   3 -
 .../config/flow_extract_target.options        |   3 -
 .../config/json_parser_target.options         |   2 -
 tests/oss-fuzz/config/miniflow_target.options |   3 -
 tests/oss-fuzz/config/odp.dict                | 170 -------
 tests/oss-fuzz/config/odp_target.options      |   3 -
 .../config/ofctl_parse_target.options         |   3 -
 tests/oss-fuzz/config/ofp-flow.dict           |  45 --
 .../oss-fuzz/config/ofp_print_target.options  |   3 -
 tests/oss-fuzz/config/ovs.dict                | 293 -----------
 tests/oss-fuzz/expr_parse_target.c            | 464 ------------------
 tests/oss-fuzz/flow_extract_target.c          | 100 ----
 tests/oss-fuzz/fuzzer.h                       |   9 -
 tests/oss-fuzz/json_parser_target.c           |  42 --
 tests/oss-fuzz/miniflow_target.c              | 365 --------------
 tests/oss-fuzz/odp_target.c                   | 149 ------
 tests/oss-fuzz/ofctl_parse_target.c           | 113 -----
 tests/oss-fuzz/ofp_print_target.c             |  47 --
 21 files changed, 2005 deletions(-)
 delete mode 100644 tests/oss-fuzz/automake.mk
 delete mode 100644 tests/oss-fuzz/config/expr.dict
 delete mode 100644 tests/oss-fuzz/config/expr_parse_target.options
 delete mode 100644 tests/oss-fuzz/config/flow_extract_target.options
 delete mode 100644 tests/oss-fuzz/config/json_parser_target.options
 delete mode 100644 tests/oss-fuzz/config/miniflow_target.options
 delete mode 100644 tests/oss-fuzz/config/odp.dict
 delete mode 100644 tests/oss-fuzz/config/odp_target.options
 delete mode 100644 tests/oss-fuzz/config/ofctl_parse_target.options
 delete mode 100644 tests/oss-fuzz/config/ofp-flow.dict
 delete mode 100644 tests/oss-fuzz/config/ofp_print_target.options
 delete mode 100644 tests/oss-fuzz/config/ovs.dict
 delete mode 100644 tests/oss-fuzz/expr_parse_target.c
 delete mode 100644 tests/oss-fuzz/flow_extract_target.c
 delete mode 100644 tests/oss-fuzz/fuzzer.h
 delete mode 100644 tests/oss-fuzz/json_parser_target.c
 delete mode 100644 tests/oss-fuzz/miniflow_target.c
 delete mode 100644 tests/oss-fuzz/odp_target.c
 delete mode 100644 tests/oss-fuzz/ofctl_parse_target.c
 delete mode 100644 tests/oss-fuzz/ofp_print_target.c

Comments

0-day Robot Oct. 18, 2019, 9:56 a.m. UTC | #1
Bleep bloop.  Greetings , I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


git-am:
fatal: sha1 information is lacking or useless (tests/automake.mk).
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Patch failed at 0001 Remove oss-fuzz tests carried over from ovs
The copy of the patch that failed is found in:
   /var/lib/jenkins/jobs/upstream_build_from_pw/workspace/.git/rebase-apply/patch
When you have resolved this problem, run "git am --resolved".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
Bhargava Shastry Oct. 18, 2019, 2:48 p.m. UTC | #2
Just want to add that the patch is to be applied to ovn source code, I
couldn't find the ovn mailing list so sent it here. Apologies.

On Fri, Oct 18, 2019 at 11:13 AM <bshas3@gmail.com> wrote:

> From: Bhargava Shastry <bshas3@gmail.com>
>
> It appears that ossfuzz specific test harnesses and configuration files
> were carried over to the ovn repo from the ovs repo without
> justification. This patch removes them until there is a need to
> continuously fuzz ovn code as the ovs code is currently fuzzed.
>
> Signed-off-by: Bhargava Shastry <bshas3@gmail.com>
> ---
>  tests/automake.mk                             |   2 -
>  tests/oss-fuzz/automake.mk                    |  66 ---
>  tests/oss-fuzz/config/expr.dict               | 120 -----
>  .../oss-fuzz/config/expr_parse_target.options |   3 -
>  .../config/flow_extract_target.options        |   3 -
>  .../config/json_parser_target.options         |   2 -
>  tests/oss-fuzz/config/miniflow_target.options |   3 -
>  tests/oss-fuzz/config/odp.dict                | 170 -------
>  tests/oss-fuzz/config/odp_target.options      |   3 -
>  .../config/ofctl_parse_target.options         |   3 -
>  tests/oss-fuzz/config/ofp-flow.dict           |  45 --
>  .../oss-fuzz/config/ofp_print_target.options  |   3 -
>  tests/oss-fuzz/config/ovs.dict                | 293 -----------
>  tests/oss-fuzz/expr_parse_target.c            | 464 ------------------
>  tests/oss-fuzz/flow_extract_target.c          | 100 ----
>  tests/oss-fuzz/fuzzer.h                       |   9 -
>  tests/oss-fuzz/json_parser_target.c           |  42 --
>  tests/oss-fuzz/miniflow_target.c              | 365 --------------
>  tests/oss-fuzz/odp_target.c                   | 149 ------
>  tests/oss-fuzz/ofctl_parse_target.c           | 113 -----
>  tests/oss-fuzz/ofp_print_target.c             |  47 --
>  21 files changed, 2005 deletions(-)
>  delete mode 100644 tests/oss-fuzz/automake.mk
>  delete mode 100644 tests/oss-fuzz/config/expr.dict
>  delete mode 100644 tests/oss-fuzz/config/expr_parse_target.options
>  delete mode 100644 tests/oss-fuzz/config/flow_extract_target.options
>  delete mode 100644 tests/oss-fuzz/config/json_parser_target.options
>  delete mode 100644 tests/oss-fuzz/config/miniflow_target.options
>  delete mode 100644 tests/oss-fuzz/config/odp.dict
>  delete mode 100644 tests/oss-fuzz/config/odp_target.options
>  delete mode 100644 tests/oss-fuzz/config/ofctl_parse_target.options
>  delete mode 100644 tests/oss-fuzz/config/ofp-flow.dict
>  delete mode 100644 tests/oss-fuzz/config/ofp_print_target.options
>  delete mode 100644 tests/oss-fuzz/config/ovs.dict
>  delete mode 100644 tests/oss-fuzz/expr_parse_target.c
>  delete mode 100644 tests/oss-fuzz/flow_extract_target.c
>  delete mode 100644 tests/oss-fuzz/fuzzer.h
>  delete mode 100644 tests/oss-fuzz/json_parser_target.c
>  delete mode 100644 tests/oss-fuzz/miniflow_target.c
>  delete mode 100644 tests/oss-fuzz/odp_target.c
>  delete mode 100644 tests/oss-fuzz/ofctl_parse_target.c
>  delete mode 100644 tests/oss-fuzz/ofp_print_target.c
>
> diff --git a/tests/automake.mk b/tests/automake.mk
> index 013e59280..e86a5273e 100644
> --- a/tests/automake.mk
> +++ b/tests/automake.mk
> @@ -246,5 +246,3 @@ clean-pki:
>         rm -f tests/pki/stamp
>         rm -rf tests/pki
>  endif
> -
> -include tests/oss-fuzz/automake.mk
> diff --git a/tests/oss-fuzz/automake.mk b/tests/oss-fuzz/automake.mk
> deleted file mode 100644
> index 5bf7d0d7c..000000000
> --- a/tests/oss-fuzz/automake.mk
> +++ /dev/null
> @@ -1,66 +0,0 @@
> -OSS_FUZZ_TARGETS = \
> -       tests/oss-fuzz/flow_extract_target \
> -       tests/oss-fuzz/json_parser_target \
> -       tests/oss-fuzz/ofp_print_target \
> -       tests/oss-fuzz/expr_parse_target \
> -       tests/oss-fuzz/odp_target \
> -       tests/oss-fuzz/miniflow_target \
> -       tests/oss-fuzz/ofctl_parse_target
> -EXTRA_PROGRAMS += $(OSS_FUZZ_TARGETS)
> -oss-fuzz-targets: $(OSS_FUZZ_TARGETS)
> -
> -tests_oss_fuzz_flow_extract_target_SOURCES = \
> -       tests/oss-fuzz/flow_extract_target.c \
> -       tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_flow_extract_target_LDADD = lib/libopenvswitch.la
> -tests_oss_fuzz_flow_extract_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -tests_oss_fuzz_json_parser_target_SOURCES = \
> -       tests/oss-fuzz/json_parser_target.c \
> -       tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_json_parser_target_LDADD = lib/libopenvswitch.la
> -tests_oss_fuzz_json_parser_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -tests_oss_fuzz_ofp_print_target_SOURCES = \
> -       tests/oss-fuzz/ofp_print_target.c \
> -       tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_ofp_print_target_LDADD = lib/libopenvswitch.la
> -tests_oss_fuzz_ofp_print_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -tests_oss_fuzz_expr_parse_target_SOURCES = \
> -        tests/oss-fuzz/expr_parse_target.c \
> -        tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_expr_parse_target_LDADD = lib/libopenvswitch.la \
> -                                         ovn/lib/libovn.la
> -tests_oss_fuzz_expr_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -tests_oss_fuzz_odp_target_SOURCES = \
> -        tests/oss-fuzz/odp_target.c \
> -        tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_odp_target_LDADD = lib/libopenvswitch.la
> -tests_oss_fuzz_odp_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -tests_oss_fuzz_miniflow_target_SOURCES = \
> -        tests/oss-fuzz/miniflow_target.c \
> -        tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_miniflow_target_LDADD = lib/libopenvswitch.la
> -tests_oss_fuzz_miniflow_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -tests_oss_fuzz_ofctl_parse_target_SOURCES = \
> -        tests/oss-fuzz/ofctl_parse_target.c \
> -        tests/oss-fuzz/fuzzer.h
> -tests_oss_fuzz_ofctl_parse_target_LDADD = lib/libopenvswitch.la
> -tests_oss_fuzz_ofctl_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> -
> -EXTRA_DIST += \
> -       tests/oss-fuzz/config/flow_extract_target.options \
> -       tests/oss-fuzz/config/json_parser_target.options \
> -       tests/oss-fuzz/config/ofp_print_target.options \
> -       tests/oss-fuzz/config/expr_parse_target.options \
> -       tests/oss-fuzz/config/odp_target.options \
> -       tests/oss-fuzz/config/miniflow_target.options \
> -        tests/oss-fuzz/config/ofctl_parse_target.options \
> -       tests/oss-fuzz/config/ovs.dict \
> -       tests/oss-fuzz/config/expr.dict \
> -       tests/oss-fuzz/config/odp.dict \
> -       tests/oss-fuzz/config/ofp-flow.dict
> diff --git a/tests/oss-fuzz/config/expr.dict
> b/tests/oss-fuzz/config/expr.dict
> deleted file mode 100644
> index 03741ad7d..000000000
> --- a/tests/oss-fuzz/config/expr.dict
> +++ /dev/null
> @@ -1,120 +0,0 @@
> -" = "
> -" = ("
> -" = dns_lookup();"
> -" { "
> -" };"
> -"!"
> -"!="
> -"$"
> -"&&"
> -"("
> -"()"
> -")"
> -"),commit,table=,zone=NXM_NX_REG)"
> -");"
> -", "
> -", meter=\"\""
> -","
> -",bucket=bucket_id=,weight:100,actions=ct(nat(dst="
> -"--"
> -".."
> -"/"
> -"/%"
> -"0"
> -":"
> -"<"
> -"<->"
> -"<="
> -"="
> -"=="
> -"=r"
> -">"
> -">="
> -"["
> -"\x00"
> -"\x28"
> -"]"
> -"]:"
> -"allow"
> -"arp"
> -"bool"
> -"bswap "
> -"bswap %0"
> -"cc"
> -"clone"
> -"ct_clear"
> -"ct_clear;"
> -"ct_commit"
> -"ct_commit("
> -"ct_dnat"
> -"ct_label"
> -"ct_label="
> -"ct_lb"
> -"ct_mark"
> -"ct_mark="
> -"ct_mark=%#x"
> -"ct_next"
> -"ct_next;"
> -"ct_snat"
> -"decimal"
> -"dhcpv6_stateful"
> -"dhcpv6_stateless"
> -"dns_lookup"
> -"drop"
> -"drop;"
> -"egress"
> -"error("
> -"get_arp"
> -"get_nd"
> -"hexadecimal"
> -"icmp4"
> -"icmp6"
> -"ingress"
> -"ip.ttl"
> -"ip.ttl--;"
> -"ipv4"
> -"ipv6"
> -"log"
> -"log("
> -"mac"
> -"meter"
> -"name"
> -"name=\"\", "
> -"nd_na"
> -"nd_na_router"
> -"nd_ns"
> -"next"
> -"next();"
> -"next(pipeline=, table=);"
> -"next;"
> -"output"
> -"output;"
> -"pipeline"
> -"put_arp"
> -"put_dhcp_opts"
> -"put_dhcpv6_opts"
> -"put_nd"
> -"put_nd_ra_opts"
> -"reject"
> -"set_meter"
> -"set_meter();"
> -"set_meter(, );"
> -"set_meter(,);"
> -"set_queue"
> -"set_queue();"
> -"severity"
> -"severity="
> -"slaac"
> -"static_routes"
> -"str"
> -"table"
> -"tcp_reset"
> -"type=select,selection_method=dp_hash"
> -"uint16"
> -"uint32"
> -"uint8"
> -"verdict"
> -"verdict=, "
> -"{"
> -"||"
> -"}"
> diff --git a/tests/oss-fuzz/config/expr_parse_target.options
> b/tests/oss-fuzz/config/expr_parse_target.options
> deleted file mode 100644
> index fc254e84f..000000000
> --- a/tests/oss-fuzz/config/expr_parse_target.options
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -[libfuzzer]
> -dict = expr.dict
> -close_fd_mask = 3
> diff --git a/tests/oss-fuzz/config/flow_extract_target.options
> b/tests/oss-fuzz/config/flow_extract_target.options
> deleted file mode 100644
> index 81ad7f18c..000000000
> --- a/tests/oss-fuzz/config/flow_extract_target.options
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -[libfuzzer]
> -dict = ovs.dict
> -close_fd_mask = 3
> diff --git a/tests/oss-fuzz/config/json_parser_target.options
> b/tests/oss-fuzz/config/json_parser_target.options
> deleted file mode 100644
> index 8d3739a53..000000000
> --- a/tests/oss-fuzz/config/json_parser_target.options
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -[libfuzzer]
> -dict = json.dict
> diff --git a/tests/oss-fuzz/config/miniflow_target.options
> b/tests/oss-fuzz/config/miniflow_target.options
> deleted file mode 100644
> index 4849f282d..000000000
> --- a/tests/oss-fuzz/config/miniflow_target.options
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -[libfuzzer]
> -dict = ovs.dict
> -close_fd_mask = 3
> \ No newline at end of file
> diff --git a/tests/oss-fuzz/config/odp.dict
> b/tests/oss-fuzz/config/odp.dict
> deleted file mode 100644
> index a9bdd3e99..000000000
> --- a/tests/oss-fuzz/config/odp.dict
> +++ /dev/null
> @@ -1,170 +0,0 @@
> -"("
> -")"
> -","
> -"/0x"
> -"0x"
> -": "
> -"="
> -"=r"
> -"action"
> -"arp"
> -"bfd"
> -"bos"
> -"c1"
> -"c2"
> -"c3"
> -"c4"
> -"cc"
> -"cfi"
> -"cfm"
> -"class"
> -"clone"
> -"code"
> -"commit,"
> -"crit,"
> -"csum"
> -"ct"
> -"ct(error)"
> -"ct_clear"
> -"ct_label"
> -"ct_mark"
> -"ct_state"
> -"ct_tuple4"
> -"ct_tuple6"
> -"ct_zone"
> -"dir"
> -"dl_type"
> -"dnat"
> -"dp_hash"
> -"drop"
> -"dst"
> -"dst_port"
> -"egress"
> -"encap"
> -"error"
> -"erspan"
> -"erspan(ver=1,sid=0x,dir=,idx=0x)"
> -"est"
> -"eth"
> -"eth_type"
> -"eth_type(0/)"
> -"first"
> -"flags"
> -"force_commit,"
> -"frag"
> -"gbp("
> -"geneve"
> -"gre((flags=0x,proto=0x)"
> -"hash,"
> -"helper"
> -"hlimit"
> -"hwid"
> -"icmp"
> -"icmpv6"
> -"id"
> -"idx="
> -"in_port"
> -"ingress"
> -"inv"
> -"ip6erspan"
> -"ipfix(output_port="
> -"ipv4"
> -"ipv6"
> -"ipv6_dst"
> -"ipv6_src"
> -"l4()"
> -"label"
> -"lacp"
> -"later"
> -"len"
> -"lldp"
> -"mark=/,"
> -"match"
> -"md2"
> -"mdtype"
> -"meter()"
> -"mpls"
> -"nat"
> -"nd"
> -"new"
> -"no"
> -"np"
> -"ns"
> -"nsh"
> -"oam,"
> -"op"
> -"options("
> -"out_port("
> -"packet_type"
> -"pcp="
> -"persistent,"
> -"pop_eth"
> -"pop_mpls(eth_type=0x)"
> -"pop_nsh()"
> -"pop_vlan"
> -"proto"
> -"push_eth(src=:::::,dst=:::::,type=)"
> -"push_mpls("
> -"push_nsh("
> -"push_vlan("
> -"push_vlan(tpid=,vid=,pcp=,cfi=)"
> -"random,"
> -"recirc()"
> -"recirc_id"
> -"rel"
> -"rpl"
> -"sFlow(vid=,pcp=,output=)"
> -"sample"
> -"sctp"
> -"seq=0x"
> -"set("
> -"set(nsh("
> -"sha"
> -"si"
> -"sip"
> -"skb_mark"
> -"skb_priority"
> -"sll"
> -"slow_path"
> -"snat"
> -"spi"
> -"src"
> -"src_port"
> -"stp"
> -"sym_l4()"
> -"target"
> -"tc="
> -"tclass"
> -"tcp"
> -"tcp_flags"
> -"tha"
> -"tip"
> -"tll"
> -"tnl_pop("
> -"tnl_push(tnl_port("
> -"too_little"
> -"too_much"
> -"tos"
> -"tp_dst"
> -"tp_src"
> -"tpid=0x"
> -"trk"
> -"trunc()"
> -"ttl"
> -"tun_id"
> -"tunnel"
> -"tunnel_out_port"
> -"type"
> -"udp"
> -"unspec"
> -"userdata"
> -"userspace("
> -"userspace(error)"
> -"userspace(pid"
> -"ver"
> -"vid"
> -"vlan"
> -"vxlan"
> -"vxlan(flags=0x,vni=0x)"
> -"vxlan(gbp("
> -"zone"
> diff --git a/tests/oss-fuzz/config/odp_target.options
> b/tests/oss-fuzz/config/odp_target.options
> deleted file mode 100644
> index 41821b8c1..000000000
> --- a/tests/oss-fuzz/config/odp_target.options
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -[libfuzzer]
> -close_fd_mask = 3
> -dict = odp.dict
> diff --git a/tests/oss-fuzz/config/ofctl_parse_target.options
> b/tests/oss-fuzz/config/ofctl_parse_target.options
> deleted file mode 100644
> index 6d67dd6ad..000000000
> --- a/tests/oss-fuzz/config/ofctl_parse_target.options
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -[libfuzzer]
> -close_fd_mask = 3
> -dict = ofp-flow.dict
> diff --git a/tests/oss-fuzz/config/ofp-flow.dict
> b/tests/oss-fuzz/config/ofp-flow.dict
> deleted file mode 100644
> index 01175e5eb..000000000
> --- a/tests/oss-fuzz/config/ofp-flow.dict
> +++ /dev/null
> @@ -1,45 +0,0 @@
> -")"
> -"("
> -"["
> -"]"
> -","
> -"-"
> -"0"
> -":"
> -"="
> -"ADD"
> -"DEL"
> -"DEL_STRICT"
> -"MOD"
> -"MOD_STRICT"
> -"\x00"
> -"\x20"
> -"\x3F"
> -"actions"
> -"add"
> -"allow_hidden_fields"
> -"cc"
> -"check_overlap"
> -"cookie"
> -"delete"
> -"delete_strict"
> -"duration"
> -"eth"
> -"hard_age"
> -"hard_timeout"
> -"idle_age"
> -"idle_timeout"
> -"importance"
> -"modify"
> -"modify_strict"
> -"n_bytes"
> -"n_packets"
> -"no_byte_counts"
> -"no_packet_counts"
> -"no_readonly_table"
> -"out_group"
> -"out_port"
> -"priority"
> -"reset_counts"
> -"send_flow_rem"
> -"table"
> diff --git a/tests/oss-fuzz/config/ofp_print_target.options
> b/tests/oss-fuzz/config/ofp_print_target.options
> deleted file mode 100644
> index 7f117292e..000000000
> --- a/tests/oss-fuzz/config/ofp_print_target.options
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -[libfuzzer]
> -close_fd_mask = 3
> -dict = ovs.dict
> diff --git a/tests/oss-fuzz/config/ovs.dict
> b/tests/oss-fuzz/config/ovs.dict
> deleted file mode 100644
> index 243b243ab..000000000
> --- a/tests/oss-fuzz/config/ovs.dict
> +++ /dev/null
> @@ -1,293 +0,0 @@
> -"0.2"
> -"ADD_SUBSCRIBE"
> -"-cbc"
> -"CLEARSUB"
> -"CLIENT"
> -"GIMME"
> -"GIMMEDEFS"
> -"GIMMESTATS"
> -"HM"
> -"-hmac96"
> -"HM_CTL"
> -"HM_STAT"
> -"HMST_CLIENT"
> -"LOGIN"
> -"\\MAILSLOT\\BROWSE"
> -"NET-ANNOUNCED"
> -"NET-VISIBLE"
> -"-nodefs"
> -"NONE"
> -"OPSTAFF"
> -"\\PIPE\\LANMAN"
> -"public"
> -"REALM"
> -"REALM-ANNOUNCED"
> -"REALM-VISIBLE"
> -"REQ_SUBSCRIBE"
> -"RLM_SUBSCRIBE"
> -"RLM_UNSUBSCRIBE"
> -"SENT"
> -" %ssub%s"
> -"SUBSCRIBE"
> -"SUBSCRIBE_NODEFS"
> -"un"
> -"UNSUBSCRIBE"
> -"USER_FLUSH"
> -"USER_HIDE"
> -"USER_LOCATE"
> -"USER_UNHIDE"
> -"WG_CTL"
> -"\x01\x00"
> -"\x01\x00\x00"
> -"\x01\x00\x01"
> -"\x01\x00\x02"
> -"\x01\x00\x03"
> -"\x01\x00\x05"
> -"\x01\x01"
> -"\x01\x02"
> -"\x01\x03"
> -"\x01\x04"
> -"\x01\x05"
> -"\x01\x07"
> -"\x01\x0B"
> -"\x01\x0C"
> -"\x01\x10"
> -"\x01\x11"
> -"\x01\x12"
> -"\x01\x13"
> -"\x01\x14"
> -"\x01\x15"
> -"\x01\x16"
> -"\x01\xE8\x48"
> -"\x01\xF4"
> -"\x01\xF5"
> -"\x01\xF6"
> -"\x01\xF7"
> -"\x01\xF8"
> -"\x01\xF9"
> -"\x01\xFA"
> -"\x01\xFB"
> -"\x01\xFC"
> -"\x01\xFD"
> -"\x01\xFE"
> -"\x01\xFF"
> -"\x02\x00"
> -"\x02\x00\x00"
> -"\x02\x01"
> -"\x02\x02"
> -"\x02\x03"
> -"\x02\x04"
> -"\x02\x05"
> -"\x02\x06"
> -"\x02\x07"
> -"\x02\x08"
> -"\x02\x09"
> -"\x02\x0C"
> -"\x02\x0E"
> -"\x02\x0F"
> -"\x02\x11"
> -"\x02\x12"
> -"\x02\x58"
> -"\x02\x81"
> -"\x02\x83"
> -"\x03\x00"
> -"\x03\x01"
> -"\x03\x02"
> -"\x03\x03"
> -"\x03\x06"
> -"\x03\xE8"
> -"\x03\xE9"
> -"\x03\xEA"
> -"\x03\xEB"
> -"\x03\xEC"
> -"\x03\xED"
> -"\x03\xEE"
> -"\x03\xEF"
> -"\x03\xF0"
> -"\x03\xF1"
> -"\x03\xF2"
> -"\x03\xF3"
> -"\x03\xF4"
> -"\x03\xFF\xFF\xFF"
> -"\x04\x00"
> -"\x04\x00\x00"
> -"\x04\x01"
> -"\x04\x02"
> -"\x04\x03"
> -"\x04\x04"
> -"\x04\x51"
> -"\x04\x52"
> -"\x04\x53"
> -"\x04\x55"
> -"\x04\x56"
> -"\x05\x00"
> -"\x05\x01"
> -"\x05\x02"
> -"\x05\x03"
> -"\x05\x53"
> -"\x05\xCC"
> -"\x05\xDC"
> -"\x06\x00"
> -"\x06\x01"
> -"\x06\xCF"
> -"\x07\x07"
> -"\x07\xC1"
> -"\x07\xFF"
> -"\x08\x00"
> -"\x08\x00\x00\x00"
> -"\x08\x00\x07"
> -"\x08\x01"
> -"\x08\x06"
> -"\x08\x38\x00\x00"
> -"\x0A\x00\xB1"
> -"\x0C\x01"
> -"\x0C\x02"
> -"\x0C\x03"
> -"\x0C\x04"
> -"\x0C\x05"
> -"\x0C\x06"
> -"\x0C\x08"
> -"\x0D\x80"
> -"\x0E\x00"
> -"\x0E\x10"
> -"\x0E\xC8"
> -"\x0E\xC9"
> -"\x0F\x42\x40"
> -"\x0F\xFF"
> -"\x10\x00"
> -"\x11\x11"
> -"\x11\xD7"
> -"\x12\x0F"
> -"\x12\xBB"
> -"\x1A\x30"
> -"\x1A\x31"
> -"\x1A\x32"
> -"\x1B\x21"
> -"\x1B\x58"
> -"\x1B\x59"
> -"\x1B\x5A"
> -"\x1B\x5B"
> -"\x1B\x5C"
> -"\x1B\x5D"
> -"\x1B\x5F"
> -"\x1B\x61"
> -"\x1F\x00"
> -"\x1F\x40"
> -"\x1F\xFF"
> -"\x1F\xFF\xFF"
> -"\x20\x00"
> -"\x20\x03"
> -"\x20\x04"
> -"\x27\x10"
> -"\x27\x13"
> -"\x2F\xBF"
> -"\x35\x00\x00"
> -"\x3C\x13"
> -"\x40\x00"
> -"\x40\x04"
> -"\x40\x80"
> -"\x47\x00\x06\x01"
> -"\x4E\x20"
> -"\x4E\x21"
> -"\x4E\x22"
> -"\x4E\x23"
> -"\x4E\x24"
> -"\x4E\x25"
> -"\x4E\x26"
> -"\x4E\x27"
> -"\x4E\x28"
> -"\x4E\x29"
> -"\x4E\x2A"
> -"\x4E\x2C"
> -"\x60\x00"
> -"\x60\x01"
> -"\x60\x02"
> -"\x60\x03"
> -"\x60\x04"
> -"\x60\x07"
> -"\x7F\xFF"
> -"\x7F\xFF\xFF"
> -"\x80\x00"
> -"\x80\x00\x00\x00"
> -"\x80\x01"
> -"\x80\x05"
> -"\x80\x0A"
> -"\x80\x21"
> -"\x80\x21\x10\x01"
> -"\x80\x21\x10\x02"
> -"\x80\x23"
> -"\x80\x35"
> -"\x80\x57"
> -"\x80\x9B"
> -"\x80\xC2"
> -"\x80\xF3"
> -"\x80\xFD"
> -"\x81\x00"
> -"\x81\x37"
> -"\x82\x81"
> -"\x83\xAA\x7E\x80"
> -"\x85\xBE"
> -"\x86\xDD"
> -"\x88\x08"
> -"\x88\x09"
> -"\x88\x0B"
> -"\x88\x47"
> -"\x88\x48"
> -"\x88\x63"
> -"\x88\x64"
> -"\x88\x6F"
> -"\x88\x70"
> -"\x88\x8E"
> -"\x88\x99"
> -"\x88\xA2"
> -"\x88\xA8"
> -"\x88\xCA"
> -"\x88\xCC"
> -"\x89\x02"
> -"\x89\x3A"
> -"\x89\x47"
> -"\x90\x00"
> -"\x91\x00"
> -"\xA0\x00"
> -"\xAB\xCD"
> -"\xB0\x00"
> -"\xC0\x00\x00\x00"
> -"\xC0\x21"
> -"\xC0\x23"
> -"\xC0\x25"
> -"\xC0\x27"
> -"\xC0\x2B"
> -"\xC0\x2D"
> -"\xC1\x23"
> -"\xC2\x23"
> -"\xC2\x27"
> -"\xDA\xDA"
> -"\xE0\x00"
> -"\xE0\x00\x00\x00"
> -"\xF0\x00\x00\x00"
> -"\xF1\x0A"
> -"\xF9\x89"
> -"\xFC\x00"
> -"\xFD\xE9"
> -"\xFE\xFE"
> -"\xFF\x00"
> -"\xFF\x00\x00"
> -"\xFF\x00\x00\x00"
> -"\xFF\xF0"
> -"\xFF\xF8"
> -"\xFF\xFD"
> -"\xFF\xFE"
> -"\xFF\xFF"
> -"\xFF\xFF\x00\x00"
> -"\xFF\xFF\xF0\x00"
> -"\xFF\xFF\xFF\x00"
> -"\xFF\xFF\xFF\x01"
> -"\xFF\xFF\xFF\x02"
> -"\xFF\xFF\xFF\x03"
> -"\xFF\xFF\xFF\xEF"
> -"\xFF\xFF\xFF\xFD"
> -"\xFF\xFF\xFF\xFE"
> -"\xFF\xFF\xFF\xFF"
> -"ZEPH"
> -"ZEPHYR_ADMIN"
> -"ZEPHYR_CTL"
> diff --git a/tests/oss-fuzz/expr_parse_target.c
> b/tests/oss-fuzz/expr_parse_target.c
> deleted file mode 100644
> index 1a3893858..000000000
> --- a/tests/oss-fuzz/expr_parse_target.c
> +++ /dev/null
> @@ -1,464 +0,0 @@
> -#include <config.h>
> -#include "fuzzer.h"
> -#include <errno.h>
> -#include <getopt.h>
> -#include <sys/wait.h>
> -
> -#include "command-line.h"
> -#include "dp-packet.h"
> -#include "fatal-signal.h"
> -#include "flow.h"
> -#include "openvswitch/dynamic-string.h"
> -#include "openvswitch/match.h"
> -#include "openvswitch/ofp-actions.h"
> -#include "openvswitch/ofpbuf.h"
> -#include "openvswitch/vlog.h"
> -#include "ovn/actions.h"
> -#include "ovn/expr.h"
> -#include "ovn/lex.h"
> -#include "ovn/lib/logical-fields.h"
> -#include "ovn/lib/ovn-l7.h"
> -#include "ovn/lib/extend-table.h"
> -#include "openvswitch/shash.h"
> -#include "simap.h"
> -#include "util.h"
> -
> -static void
> -compare_token(const struct lex_token *a, const struct lex_token *b)
> -{
> -    if (a->type != b->type) {
> -        fprintf(stderr, "type differs: %d -> %d\n", a->type, b->type);
> -        return;
> -    }
> -
> -    if (!((a->s && b->s && !strcmp(a->s, b->s))
> -          || (!a->s && !b->s))) {
> -        fprintf(stderr, "string differs: %s -> %s\n",
> -                a->s ? a->s : "(null)",
> -                b->s ? b->s : "(null)");
> -        return;
> -    }
> -
> -    if (a->type == LEX_T_INTEGER || a->type == LEX_T_MASKED_INTEGER) {
> -        if (memcmp(&a->value, &b->value, sizeof a->value)) {
> -            fprintf(stderr, "value differs\n");
> -            return;
> -        }
> -
> -        if (a->type == LEX_T_MASKED_INTEGER
> -            && memcmp(&a->mask, &b->mask, sizeof a->mask)) {
> -            fprintf(stderr, "mask differs\n");
> -            return;
> -        }
> -
> -        if (a->format != b->format
> -            && !(a->format == LEX_F_HEXADECIMAL
> -                 && b->format == LEX_F_DECIMAL
> -                 && a->value.integer == 0)) {
> -            fprintf(stderr, "format differs: %d -> %d\n",
> -                    a->format, b->format);
> -        }
> -    }
> -}
> -
> -static void
> -test_lex(const char *input)
> -{
> -    struct ds output;
> -
> -    ds_init(&output);
> -    struct lexer lexer;
> -
> -    lexer_init(&lexer, input);
> -    ds_clear(&output);
> -    while (lexer_get(&lexer) != LEX_T_END) {
> -        size_t len = output.length;
> -        lex_token_format(&lexer.token, &output);
> -
> -        /* Check that the formatted version can really be parsed back
> -         * losslessly. */
> -        if (lexer.token.type != LEX_T_ERROR) {
> -            const char *s = ds_cstr(&output) + len;
> -            struct lexer l2;
> -
> -            lexer_init(&l2, s);
> -            lexer_get(&l2);
> -            compare_token(&lexer.token, &l2.token);
> -            lexer_destroy(&l2);
> -        }
> -        ds_put_char(&output, ' ');
> -    }
> -    lexer_destroy(&lexer);
> -
> -    ds_chomp(&output, ' ');
> -    puts(ds_cstr(&output));
> -    ds_destroy(&output);
> -}
> -
> -static void
> -create_symtab(struct shash *symtab)
> -{
> -    ovn_init_symtab(symtab);
> -
> -    /* For negative testing. */
> -    expr_symtab_add_field(symtab, "bad_prereq", MFF_XREG0, "xyzzy",
> false);
> -    expr_symtab_add_field(symtab, "self_recurse", MFF_XREG0,
> -                          "self_recurse != 0", false);
> -    expr_symtab_add_field(symtab, "mutual_recurse_1", MFF_XREG0,
> -                          "mutual_recurse_2 != 0", false);
> -    expr_symtab_add_field(symtab, "mutual_recurse_2", MFF_XREG0,
> -                          "mutual_recurse_1 != 0", false);
> -    expr_symtab_add_string(symtab, "big_string", MFF_XREG0, NULL);
> -}
> -
> -static void
> -create_gen_opts(struct hmap *dhcp_opts, struct hmap *dhcpv6_opts,
> -                struct hmap *nd_ra_opts)
> -{
> -    hmap_init(dhcp_opts);
> -    dhcp_opt_add(dhcp_opts, "offerip", 0, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "netmask", 1, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "router",  3, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "dns_server", 6, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "log_server", 7, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "lpr_server",  9, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "domain", 15, "str");
> -    dhcp_opt_add(dhcp_opts, "swap_server", 16, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "policy_filter", 21, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "router_solicitation",  32, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "nis_server", 41, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "ntp_server", 42, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "server_id",  54, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "tftp_server", 66, "ipv4");
> -    dhcp_opt_add(dhcp_opts, "classless_static_route", 121,
> "static_routes");
> -    dhcp_opt_add(dhcp_opts, "ip_forward_enable",  19, "bool");
> -    dhcp_opt_add(dhcp_opts, "router_discovery", 31, "bool");
> -    dhcp_opt_add(dhcp_opts, "ethernet_encap", 36, "bool");
> -    dhcp_opt_add(dhcp_opts, "default_ttl",  23, "uint8");
> -    dhcp_opt_add(dhcp_opts, "tcp_ttl", 37, "uint8");
> -    dhcp_opt_add(dhcp_opts, "mtu", 26, "uint16");
> -    dhcp_opt_add(dhcp_opts, "lease_time",  51, "uint32");
> -    dhcp_opt_add(dhcp_opts, "wpad", 252, "str");
> -
> -    /* DHCPv6 options. */
> -    hmap_init(dhcpv6_opts);
> -    dhcp_opt_add(dhcpv6_opts, "server_id",  2, "mac");
> -    dhcp_opt_add(dhcpv6_opts, "ia_addr",  5, "ipv6");
> -    dhcp_opt_add(dhcpv6_opts, "dns_server",  23, "ipv6");
> -    dhcp_opt_add(dhcpv6_opts, "domain_search",  24, "str");
> -
> -    /* IPv6 ND RA options. */
> -    hmap_init(nd_ra_opts);
> -    nd_ra_opts_init(nd_ra_opts);
> -}
> -
> -static void
> -create_addr_sets(struct shash *addr_sets)
> -{
> -    shash_init(addr_sets);
> -
> -    static const char *const addrs1[] = {
> -        "10.0.0.1", "10.0.0.2", "10.0.0.3",
> -    };
> -    static const char *const addrs2[] = {
> -        "::1", "::2", "::3",
> -    };
> -    static const char *const addrs3[] = {
> -        "00:00:00:00:00:01", "00:00:00:00:00:02", "00:00:00:00:00:03",
> -    };
> -    static const char *const addrs4[] = { NULL };
> -
> -    expr_const_sets_add(addr_sets, "set1", addrs1, 3, true);
> -    expr_const_sets_add(addr_sets, "set2", addrs2, 3, true);
> -    expr_const_sets_add(addr_sets, "set3", addrs3, 3, true);
> -    expr_const_sets_add(addr_sets, "set4", addrs4, 0, true);
> -}
> -
> -static void
> -create_port_groups(struct shash *port_groups)
> -{
> -    shash_init(port_groups);
> -
> -    static const char *const pg1[] = {
> -        "lsp1", "lsp2", "lsp3",
> -    };
> -    static const char *const pg2[] = { NULL };
> -
> -    expr_const_sets_add(port_groups, "pg1", pg1, 3, false);
> -    expr_const_sets_add(port_groups, "pg_empty", pg2, 0, false);
> -}
> -
> -static bool
> -lookup_port_cb(const void *ports_, const char *port_name, unsigned int
> *portp)
> -{
> -    const struct simap *ports = ports_;
> -    const struct simap_node *node = simap_find(ports, port_name);
> -    if (!node) {
> -        return false;
> -    }
> -    *portp = node->data;
> -    return true;
> -}
> -
> -static bool
> -is_chassis_resident_cb(const void *ports_, const char *port_name)
> -{
> -    const struct simap *ports = ports_;
> -    const struct simap_node *node = simap_find(ports, port_name);
> -    if (node) {
> -        return true;
> -    }
> -    return false;
> -}
> -
> -static void
> -test_parse_actions(const char *input)
> -{
> -    struct shash symtab;
> -    struct hmap dhcp_opts;
> -    struct hmap dhcpv6_opts;
> -    struct hmap nd_ra_opts;
> -    struct simap ports;
> -
> -    create_symtab(&symtab);
> -    create_gen_opts(&dhcp_opts, &dhcpv6_opts, &nd_ra_opts);
> -
> -    /* Initialize group ids. */
> -    struct ovn_extend_table group_table;
> -    ovn_extend_table_init(&group_table);
> -
> -    /* Initialize meter ids for QoS. */
> -    struct ovn_extend_table meter_table;
> -    ovn_extend_table_init(&meter_table);
> -
> -    simap_init(&ports);
> -    simap_put(&ports, "eth0", 5);
> -    simap_put(&ports, "eth1", 6);
> -    simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL));
> -
> -    struct ofpbuf ovnacts;
> -    struct expr *prereqs;
> -    char *error;
> -
> -    puts(input);
> -
> -    ofpbuf_init(&ovnacts, 0);
> -
> -    const struct ovnact_parse_params pp = {
> -        .symtab = &symtab,
> -        .dhcp_opts = &dhcp_opts,
> -        .dhcpv6_opts = &dhcpv6_opts,
> -        .nd_ra_opts = &nd_ra_opts,
> -        .n_tables = 24,
> -        .cur_ltable = 10,
> -    };
> -    error = ovnacts_parse_string(input, &pp, &ovnacts, &prereqs);
> -    if (!error) {
> -        /* Convert the parsed representation back to a string and print
> it,
> -         * if it's different from the input. */
> -        struct ds ovnacts_s = DS_EMPTY_INITIALIZER;
> -        ovnacts_format(ovnacts.data, ovnacts.size, &ovnacts_s);
> -        if (strcmp(input, ds_cstr(&ovnacts_s))) {
> -            printf("    formats as %s\n", ds_cstr(&ovnacts_s));
> -        }
> -
> -        /* Encode the actions into OpenFlow and print. */
> -        const struct ovnact_encode_params ep = {
> -            .lookup_port = lookup_port_cb,
> -            .aux = &ports,
> -            .is_switch = true,
> -            .group_table = &group_table,
> -            .meter_table = &meter_table,
> -
> -            .pipeline = OVNACT_P_INGRESS,
> -            .ingress_ptable = 8,
> -            .egress_ptable = 40,
> -            .output_ptable = 64,
> -            .mac_bind_ptable = 65,
> -        };
> -        struct ofpbuf ofpacts;
> -        ofpbuf_init(&ofpacts, 0);
> -        ovnacts_encode(ovnacts.data, ovnacts.size, &ep, &ofpacts);
> -        struct ds ofpacts_s = DS_EMPTY_INITIALIZER;
> -        struct ofpact_format_params fp = { .s = &ofpacts_s };
> -        ofpacts_format(ofpacts.data, ofpacts.size, &fp);
> -        printf("    encodes as %s\n", ds_cstr(&ofpacts_s));
> -        ds_destroy(&ofpacts_s);
> -        ofpbuf_uninit(&ofpacts);
> -
> -        /* Print prerequisites if any. */
> -        if (prereqs) {
> -            struct ds prereqs_s = DS_EMPTY_INITIALIZER;
> -            expr_format(prereqs, &prereqs_s);
> -            printf("    has prereqs %s\n", ds_cstr(&prereqs_s));
> -            ds_destroy(&prereqs_s);
> -        }
> -
> -        /* Now re-parse and re-format the string to verify that it's
> -         * round-trippable. */
> -        struct ofpbuf ovnacts2;
> -        struct expr *prereqs2;
> -        ofpbuf_init(&ovnacts2, 0);
> -        error = ovnacts_parse_string(ds_cstr(&ovnacts_s), &pp, &ovnacts2,
> -                                     &prereqs2);
> -        if (!error) {
> -            struct ds ovnacts2_s = DS_EMPTY_INITIALIZER;
> -            ovnacts_format(ovnacts2.data, ovnacts2.size, &ovnacts2_s);
> -            if (strcmp(ds_cstr(&ovnacts_s), ds_cstr(&ovnacts2_s))) {
> -                printf("    bad reformat: %s\n", ds_cstr(&ovnacts2_s));
> -            }
> -            ds_destroy(&ovnacts2_s);
> -        } else {
> -            printf("    reparse error: %s\n", error);
> -            free(error);
> -        }
> -        expr_destroy(prereqs2);
> -
> -        ovnacts_free(ovnacts2.data, ovnacts2.size);
> -        ofpbuf_uninit(&ovnacts2);
> -        ds_destroy(&ovnacts_s);
> -    } else {
> -        printf("    %s\n", error);
> -        free(error);
> -    }
> -
> -    expr_destroy(prereqs);
> -    ovnacts_free(ovnacts.data, ovnacts.size);
> -    ofpbuf_uninit(&ovnacts);
> -
> -    simap_destroy(&ports);
> -    expr_symtab_destroy(&symtab);
> -    shash_destroy(&symtab);
> -    dhcp_opts_destroy(&dhcp_opts);
> -    dhcp_opts_destroy(&dhcpv6_opts);
> -    nd_ra_opts_destroy(&nd_ra_opts);
> -    ovn_extend_table_destroy(&group_table);
> -    ovn_extend_table_destroy(&meter_table);
> -}
> -
> -static void
> -test_parse_expr(const char *input)
> -{
> -    struct shash symtab;
> -    struct shash addr_sets;
> -    struct shash port_groups;
> -    struct simap ports;
> -    struct expr *expr;
> -    char *error;
> -
> -    create_symtab(&symtab);
> -    create_addr_sets(&addr_sets);
> -    create_port_groups(&port_groups);
> -
> -    simap_init(&ports);
> -    simap_put(&ports, "eth0", 5);
> -    simap_put(&ports, "eth1", 6);
> -    simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL));
> -    simap_put(&ports, "lsp1", 0x11);
> -    simap_put(&ports, "lsp2", 0x12);
> -    simap_put(&ports, "lsp3", 0x13);
> -
> -    expr = expr_parse_string(input, &symtab, &addr_sets,
> -                             &port_groups, &error);
> -    if (!error) {
> -        expr = expr_annotate(expr, &symtab, &error);
> -    }
> -    if (!error) {
> -        expr = expr_simplify(expr, is_chassis_resident_cb, &ports);
> -        expr = expr_normalize(expr);
> -        ovs_assert(expr_is_normalized(expr));
> -    }
> -    if (!error) {
> -        struct hmap matches;
> -
> -        expr_to_matches(expr, lookup_port_cb, &ports, &matches);
> -        expr_matches_print(&matches, stdout);
> -        expr_matches_destroy(&matches);
> -    } else {
> -        puts(error);
> -        free(error);
> -    }
> -    expr_destroy(expr);
> -    simap_destroy(&ports);
> -    expr_symtab_destroy(&symtab);
> -    shash_destroy(&symtab);
> -    expr_const_sets_destroy(&addr_sets);
> -    shash_destroy(&addr_sets);
> -    expr_const_sets_destroy(&port_groups);
> -    shash_destroy(&port_groups);
> -}
> -
> -static bool
> -lookup_atoi_cb(const void *aux OVS_UNUSED, const char *port_name,
> -               unsigned int *portp)
> -{
> -    *portp = atoi(port_name);
> -    return true;
> -}
> -
> -static void
> -test_expr_to_packets(const char *input)
> -{
> -    struct shash symtab;
> -    create_symtab(&symtab);
> -
> -    struct flow uflow;
> -    char *error = expr_parse_microflow(input, &symtab, NULL, NULL,
> -                                       lookup_atoi_cb, NULL, &uflow);
> -    if (error) {
> -        puts(error);
> -        free(error);
> -        expr_symtab_destroy(&symtab);
> -        shash_destroy(&symtab);
> -        return;
> -    }
> -
> -    uint64_t packet_stub[128 / 8];
> -    struct dp_packet packet;
> -    dp_packet_use_stub(&packet, packet_stub, sizeof packet_stub);
> -    flow_compose(&packet, &uflow, NULL, 64);
> -
> -    struct ds output = DS_EMPTY_INITIALIZER;
> -    const uint8_t *buf = dp_packet_data(&packet);
> -    for (int i = 0; i < dp_packet_size(&packet); i++) {
> -        uint8_t val = buf[i];
> -        ds_put_format(&output, "%02"PRIx8, val);
> -    }
> -    puts(ds_cstr(&output));
> -    ds_destroy(&output);
> -    dp_packet_uninit(&packet);
> -    expr_symtab_destroy(&symtab);
> -    shash_destroy(&symtab);
> -}
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *input_, size_t size)
> -{
> -    /* Bail out if we cannot construct at least a 1 char string. */
> -    const char *input = (const char *) input_;
> -    if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') ||
> -        strlen(input) != size - 1) {
> -        return 0;
> -    }
> -
> -    /* Disable logging to avoid write to disk. */
> -    static bool isInit = false;
> -    if (!isInit) {
> -        vlog_set_verbosity("off");
> -        isInit = true;
> -    }
> -
> -    /* Parse, annotate, simplify, normalize expr and convert to flows. */
> -    test_parse_expr(input);
> -
> -    /* Parse actions. */
> -    test_parse_actions(input);
> -
> -    /* Test OVN lexer. */
> -    test_lex(input);
> -
> -    /* Expr to packets. */
> -    test_expr_to_packets(input);
> -
> -    return 0;
> -}
> diff --git a/tests/oss-fuzz/flow_extract_target.c
> b/tests/oss-fuzz/flow_extract_target.c
> deleted file mode 100644
> index 4a7451411..000000000
> --- a/tests/oss-fuzz/flow_extract_target.c
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -#include <config.h>
> -#include "classifier.h"
> -#include <assert.h>
> -#include "fuzzer.h"
> -#include "dp-packet.h"
> -#include "flow.h"
> -#include "openvswitch/ofp-match.h"
> -#include "openvswitch/ofp-print.h"
> -#include "openvswitch/match.h"
> -#include "classifier-private.h"
> -
> -static void
> -test_flow_hash(const struct flow *flow)
> -{
> -    uint32_t hash = flow_hash_5tuple(flow, 0);
> -    hash = flow_hash_symmetric_l4(flow, 0);
> -    hash = flow_hash_symmetric_l2(flow, 0);
> -    hash = flow_hash_symmetric_l3l4(flow, 0, NULL);
> -    hash = flow_hash_symmetric_l3(flow, 0);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_ETH_SRC, hash);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L4, hash);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4, hash);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP,
> hash);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_SRC, hash);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_DST, hash);
> -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3, hash);
> -    ignore(hash);
> -}
> -
> -static void
> -test_flow_mask(const struct flow *flow)
> -{
> -    struct flow_wildcards catchall;
> -
> -    flow_wildcards_init_catchall(&catchall);
> -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_ETH_SRC);
> -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L4);
> -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4);
> -    flow_mask_hash_fields(flow, &catchall,
> NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP);
> -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_SRC);
> -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_DST);
> -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3);
> -}
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> -{
> -    struct dp_packet packet;
> -    struct flow flow;
> -    dp_packet_use_const(&packet, data, size);
> -    flow_extract(&packet, &flow);
> -
> -    /* Extract flowmap. */
> -    struct flowmap fmap;
> -    flow_wc_map(&flow, &fmap);
> -
> -    /* Parse TCP flags. */
> -    if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
> -        uint16_t tcp_flags = parse_tcp_flags(&packet);
> -        ignore(tcp_flags);
> -    }
> -
> -    /* Parse TCP flags. */
> -    if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
> -        uint16_t tcp_flags = parse_tcp_flags(&packet);
> -        ignore(tcp_flags);
> -    }
> -
> -    /* Count headers. */
> -    int count = flow_count_vlan_headers(&flow);
> -    ignore(count);
> -
> -    /* Extract metadata. */
> -    struct match flow_metadata;
> -    flow_get_metadata(&flow, &flow_metadata);
> -
> -    /* Hashing functions. */
> -    test_flow_hash(&flow);
> -
> -    /* Masking functions. */
> -    test_flow_mask(&flow);
> -
> -    /* Convert flow to match. */
> -    struct match match;
> -    match_wc_init(&match, &flow);
> -
> -    struct ofp10_match ext_match;
> -    ofputil_match_to_ofp10_match(&match, &ext_match);
> -
> -    /* Print match and packet. */
> -    ofp_print_packet(stdout, dp_packet_data(&packet),
> dp_packet_size(&packet),
> -                     htonl(PT_ETH));
> -    ovs_hex_dump(stdout, dp_packet_data(&packet),
> dp_packet_size(&packet), 0,
> -                 true);
> -    match_print(&match, NULL);
> -
> -    ovs_hex_dump(stdout, &ext_match, sizeof ext_match, 0, false);
> -
> -    return 0;
> -}
> diff --git a/tests/oss-fuzz/fuzzer.h b/tests/oss-fuzz/fuzzer.h
> deleted file mode 100644
> index f87ae59e9..000000000
> --- a/tests/oss-fuzz/fuzzer.h
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#ifndef FUZZER_H
> -#define FUZZER_H 1
> -
> -#include <stdint.h>
> -#include <stddef.h>
> -
> -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
> -
> -#endif  /* fuzzer.h */
> diff --git a/tests/oss-fuzz/json_parser_target.c
> b/tests/oss-fuzz/json_parser_target.c
> deleted file mode 100644
> index e39e04a0d..000000000
> --- a/tests/oss-fuzz/json_parser_target.c
> +++ /dev/null
> @@ -1,42 +0,0 @@
> -#include <config.h>
> -#include "fuzzer.h"
> -#include "jsonrpc.h"
> -#include "openvswitch/json.h"
> -#include "ovsdb-error.h"
> -#include "ovsdb/table.h"
> -#include <assert.h>
> -#include <string.h>
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> -{
> -    if (!size || data[size - 1]) {
> -        return 0;
> -    }
> -
> -    struct json *j1 = json_from_string((const char *)data);
> -    if (j1->type == JSON_STRING) {
> -        json_destroy(j1);
> -        return 0;
> -    }
> -
> -    free(json_to_string(j1, JSSF_SORT | JSSF_PRETTY));
> -
> -    struct jsonrpc_msg *msg;
> -    char *error = jsonrpc_msg_from_json(j1, &msg); /* Frees 'j1'. */
> -    if (error) {
> -        free(error);
> -        return 0;
> -    }
> -
> -    struct json *j2 = jsonrpc_msg_to_json(msg); /* Frees 'msg'. */
> -    if (j2->type == JSON_STRING) {
> -        json_destroy(j2);
> -        return 0;
> -    }
> -
> -    free(json_to_string(j2, JSSF_SORT | JSSF_PRETTY));
> -    json_destroy(j2);
> -
> -    return 0;
> -}
> diff --git a/tests/oss-fuzz/miniflow_target.c
> b/tests/oss-fuzz/miniflow_target.c
> deleted file mode 100644
> index 800375d63..000000000
> --- a/tests/oss-fuzz/miniflow_target.c
> +++ /dev/null
> @@ -1,365 +0,0 @@
> -#include <config.h>
> -#include "classifier.h"
> -#include "fuzzer.h"
> -#include "dp-packet.h"
> -#include "flow.h"
> -#include "openvswitch/ofp-match.h"
> -#include "openvswitch/ofp-print.h"
> -#include "openvswitch/match.h"
> -#include "classifier-private.h"
> -#include "util.h"
> -
> -static void
> -shuffle_u32s(uint32_t *p, size_t n)
> -{
> -    for (; n > 1; n--, p++) {
> -        uint32_t *q = &p[random_range(n)];
> -        uint32_t tmp = *p;
> -        *p = *q;
> -        *q = tmp;
> -    }
> -}
> -
> -/* Returns a copy of 'src'.  The caller must eventually free the returned
> - * miniflow with free(). */
> -static struct miniflow *
> -miniflow_clone__(const struct miniflow *src)
> -{
> -    struct miniflow *dst;
> -    size_t data_size;
> -
> -    data_size = miniflow_alloc(&dst, 1, src);
> -    miniflow_clone(dst, src, data_size / sizeof(uint64_t));
> -    return dst;
> -}
> -
> -/* Returns a hash value for 'flow', given 'basis'. */
> -static inline uint32_t
> -miniflow_hash__(const struct miniflow *flow, uint32_t basis)
> -{
> -    const uint64_t *p = miniflow_get_values(flow);
> -    size_t n_values = miniflow_n_values(flow);
> -    struct flowmap hash_map = FLOWMAP_EMPTY_INITIALIZER;
> -    uint32_t hash = basis;
> -    size_t idx;
> -
> -    FLOWMAP_FOR_EACH_INDEX (idx, flow->map) {
> -        uint64_t value = *p++;
> -
> -        if (value) {
> -            hash = hash_add64(hash, value);
> -            flowmap_set(&hash_map, idx, 1);
> -        }
> -    }
> -    map_t map;
> -    FLOWMAP_FOR_EACH_MAP (map, hash_map) {
> -        hash = hash_add64(hash, map);
> -    }
> -
> -    return hash_finish(hash, n_values);
> -}
> -
> -static uint32_t
> -random_value(void)
> -{
> -    static const uint32_t values_[] =
> -        { 0xffffffff, 0xaaaaaaaa, 0x55555555, 0x80000000,
> -          0x00000001, 0xface0000, 0x00d00d1e, 0xdeadbeef };
> -
> -    return values_[random_range(ARRAY_SIZE(values_))];
> -}
> -
> -static bool
> -choose(unsigned int n, unsigned int *idxp)
> -{
> -    if (*idxp < n) {
> -        return true;
> -    } else {
> -        *idxp -= n;
> -        return false;
> -    }
> -}
> -
> -#define FLOW_U32S (FLOW_U64S * 2)
> -
> -static bool
> -init_consecutive_values(int n_consecutive, struct flow *flow,
> -                        unsigned int *idxp)
> -{
> -    uint32_t *flow_u32 = (uint32_t *) flow;
> -
> -    if (choose(FLOW_U32S - n_consecutive + 1, idxp)) {
> -        int i;
> -
> -        for (i = 0; i < n_consecutive; i++) {
> -            flow_u32[i + *idxp] = random_value();
> -        }
> -        return true;
> -    } else {
> -        return false;
> -    }
> -}
> -
> -static bool
> -next_random_flow(struct flow *flow, unsigned int idx)
> -{
> -    uint32_t *flow_u32 = (uint32_t *) flow;
> -
> -    memset(flow, 0, sizeof *flow);
> -
> -    /* Empty flow. */
> -    if (choose(1, &idx)) {
> -        return true;
> -    }
> -
> -    /* All flows with a small number of consecutive nonzero values. */
> -    for (int i = 1; i <= 4; i++) {
> -        if (init_consecutive_values(i, flow, &idx)) {
> -            return true;
> -        }
> -    }
> -
> -    /* All flows with a large number of consecutive nonzero values. */
> -    for (int i = FLOW_U32S - 4; i <= FLOW_U32S; i++) {
> -        if (init_consecutive_values(i, flow, &idx)) {
> -            return true;
> -        }
> -    }
> -
> -    /* All flows with exactly two nonconsecutive nonzero values. */
> -    if (choose((FLOW_U32S - 1) * (FLOW_U32S - 2) / 2, &idx)) {
> -        int ofs1;
> -
> -        for (ofs1 = 0; ofs1 < FLOW_U32S - 2; ofs1++) {
> -            int ofs2;
> -
> -            for (ofs2 = ofs1 + 2; ofs2 < FLOW_U32S; ofs2++) {
> -                if (choose(1, &idx)) {
> -                    flow_u32[ofs1] = random_value();
> -                    flow_u32[ofs2] = random_value();
> -                    return true;
> -                }
> -            }
> -        }
> -        OVS_NOT_REACHED();
> -    }
> -
> -    /* 16 randomly chosen flows with N >= 3 nonzero values. */
> -    if (choose(16 * (FLOW_U32S - 4), &idx)) {
> -        int n = idx / 16 + 3;
> -
> -        for (int i = 0; i < n; i++) {
> -            flow_u32[i] = random_value();
> -        }
> -        shuffle_u32s(flow_u32, FLOW_U32S);
> -
> -        return true;
> -    }
> -
> -    return false;
> -}
> -
> -static void
> -any_random_flow(struct flow *flow)
> -{
> -    static unsigned int max;
> -    if (!max) {
> -        while (next_random_flow(flow, max)) {
> -            max++;
> -        }
> -    }
> -
> -    next_random_flow(flow, random_range(max));
> -}
> -
> -static void
> -toggle_masked_flow_bits(struct flow *flow, const struct flow_wildcards
> *mask)
> -{
> -    const uint32_t *mask_u32 = (const uint32_t *) &mask->masks;
> -    uint32_t *flow_u32 = (uint32_t *) flow;
> -    int i;
> -
> -    for (i = 0; i < FLOW_U32S; i++) {
> -        if (mask_u32[i] != 0) {
> -            uint32_t bit;
> -
> -            do {
> -                bit = 1u << random_range(32);
> -            } while (!(bit & mask_u32[i]));
> -            flow_u32[i] ^= bit;
> -        }
> -    }
> -}
> -
> -static void
> -wildcard_extra_bits(struct flow_wildcards *mask)
> -{
> -    uint32_t *mask_u32 = (uint32_t *) &mask->masks;
> -    int i;
> -
> -    for (i = 0; i < FLOW_U32S; i++) {
> -        if (mask_u32[i] != 0) {
> -            uint32_t bit;
> -
> -            do {
> -                bit = 1u << random_range(32);
> -            } while (!(bit & mask_u32[i]));
> -            mask_u32[i] &= ~bit;
> -        }
> -    }
> -}
> -
> -static void
> -test_miniflow(struct flow *flow)
> -{
> -    struct miniflow *miniflow, *miniflow2, *miniflow3;
> -    struct flow flow2, flow3;
> -    struct flow_wildcards mask;
> -    struct minimask *minimask;
> -    int i;
> -
> -    const uint64_t *flow_u64 = (const uint64_t *) flow;
> -
> -    /* Convert flow to miniflow. */
> -    miniflow = miniflow_create(flow);
> -
> -    /* Obtain miniflow hash. */
> -    uint32_t hash = miniflow_hash_5tuple(miniflow, 0);
> -    ignore(hash);
> -
> -    /* Check that the flow equals its miniflow. */
> -    for (i = 0; i < FLOW_MAX_VLAN_HEADERS; i++) {
> -        ovs_assert(miniflow_get_vid(miniflow, i) ==
> -               vlan_tci_to_vid(flow->vlans[i].tci));
> -    }
> -    for (i = 0; i < FLOW_U64S; i++) {
> -        ovs_assert(miniflow_get(miniflow, i) == flow_u64[i]);
> -    }
> -
> -    /* Check that the miniflow equals itself. */
> -    ovs_assert(miniflow_equal(miniflow, miniflow));
> -
> -    /* Convert miniflow back to flow and verify that it's the same. */
> -    miniflow_expand(miniflow, &flow2);
> -    ovs_assert(flow_equal(flow, &flow2));
> -    /* Check that copying a miniflow works properly. */
> -    miniflow2 = miniflow_clone__(miniflow);
> -    ovs_assert(miniflow_equal(miniflow, miniflow2));
> -    ovs_assert(miniflow_hash__(miniflow, 0) == miniflow_hash__(miniflow2,
> 0));
> -    miniflow_expand(miniflow2, &flow3);
> -    ovs_assert(flow_equal(flow, &flow3));
> -
> -    /* Check that masked matches work as expected for identical flows and
> -         * miniflows. */
> -    do {
> -            next_random_flow(&mask.masks, 1);
> -    } while (flow_wildcards_is_catchall(&mask));
> -    minimask = minimask_create(&mask);
> -    ovs_assert(minimask_is_catchall(minimask)
> -           == flow_wildcards_is_catchall(&mask));
> -    ovs_assert(miniflow_equal_in_minimask(miniflow, miniflow2, minimask));
> -    ovs_assert(miniflow_equal_flow_in_minimask(miniflow, &flow2,
> minimask));
> -    ovs_assert(miniflow_hash_in_minimask(miniflow, minimask, 0x12345678)
> ==
> -           flow_hash_in_minimask(flow, minimask, 0x12345678));
> -    ovs_assert(minimask_hash(minimask, 0) ==
> -           miniflow_hash__(&minimask->masks, 0));
> -
> -    /* Check that masked matches work as expected for differing flows and
> -     * miniflows. */
> -    toggle_masked_flow_bits(&flow2, &mask);
> -    ovs_assert(!miniflow_equal_flow_in_minimask(miniflow, &flow2,
> minimask));
> -    miniflow3 = miniflow_create(&flow2);
> -    ovs_assert(!miniflow_equal_in_minimask(miniflow, miniflow3,
> minimask));
> -
> -    free(miniflow);
> -    free(miniflow2);
> -    free(miniflow3);
> -    free(minimask);
> -}
> -
> -static void
> -test_minimask_has_extra(struct flow *flow)
> -{
> -    struct flow_wildcards catchall;
> -    struct minimask *minicatchall;
> -
> -    flow_wildcards_init_catchall(&catchall);
> -    minicatchall = minimask_create(&catchall);
> -    ovs_assert(minimask_is_catchall(minicatchall));
> -
> -    struct flow_wildcards mask;
> -    struct minimask *minimask;
> -
> -    mask.masks = *flow;
> -    minimask = minimask_create(&mask);
> -    ovs_assert(!minimask_has_extra(minimask, minimask));
> -    ovs_assert(minimask_has_extra(minicatchall, minimask)
> -           == !minimask_is_catchall(minimask));
> -    if (!minimask_is_catchall(minimask)) {
> -        struct minimask *minimask2;
> -
> -        wildcard_extra_bits(&mask);
> -        minimask2 = minimask_create(&mask);
> -        ovs_assert(minimask_has_extra(minimask2, minimask));
> -        ovs_assert(!minimask_has_extra(minimask, minimask2));
> -        free(minimask2);
> -    }
> -
> -    free(minimask);
> -    free(minicatchall);
> -}
> -
> -static void
> -test_minimask_combine(struct flow *flow)
> -{
> -    struct flow_wildcards catchall;
> -    struct minimask *minicatchall;
> -
> -    flow_wildcards_init_catchall(&catchall);
> -    minicatchall = minimask_create(&catchall);
> -    ovs_assert(minimask_is_catchall(minicatchall));
> -
> -    struct minimask *minimask, *minimask2;
> -    struct flow_wildcards mask, mask2, combined, combined2;
> -    struct {
> -        struct minimask minicombined;
> -        uint64_t storage[FLOW_U64S];
> -    } m;
> -    struct flow flow2;
> -
> -    mask.masks = *flow;
> -    minimask = minimask_create(&mask);
> -
> -    minimask_combine(&m.minicombined, minimask, minicatchall, m.storage);
> -    ovs_assert(minimask_is_catchall(&m.minicombined));
> -
> -    any_random_flow(&flow2);
> -    mask2.masks = flow2;
> -    minimask2 = minimask_create(&mask2);
> -
> -    minimask_combine(&m.minicombined, minimask, minimask2, m.storage);
> -    flow_wildcards_and(&combined, &mask, &mask2);
> -    minimask_expand(&m.minicombined, &combined2);
> -    ovs_assert(flow_wildcards_equal(&combined, &combined2));
> -
> -    free(minimask);
> -    free(minimask2);
> -
> -    free(minicatchall);
> -}
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> -{
> -    struct dp_packet packet;
> -    struct flow flow;
> -    dp_packet_use_const(&packet, data, size);
> -    flow_extract(&packet, &flow);
> -
> -    /* Do miniflow tests. */
> -    test_miniflow(&flow);
> -    test_minimask_has_extra(&flow);
> -    test_minimask_combine(&flow);
> -
> -    return 0;
> -}
> diff --git a/tests/oss-fuzz/odp_target.c b/tests/oss-fuzz/odp_target.c
> deleted file mode 100644
> index ae61cdca3..000000000
> --- a/tests/oss-fuzz/odp_target.c
> +++ /dev/null
> @@ -1,149 +0,0 @@
> -#include <config.h>
> -#include "fuzzer.h"
> -#undef NDEBUG
> -#include "odp-util.h"
> -#include <stdio.h>
> -#include "openvswitch/dynamic-string.h"
> -#include "flow.h"
> -#include "openvswitch/match.h"
> -#include "openvswitch/ofpbuf.h"
> -#include "util.h"
> -#include "openvswitch/ofp-flow.h"
> -#include "openvswitch/vlog.h"
> -
> -static int
> -parse_keys(bool wc_keys, const char *in)
> -{
> -    int exit_code = 0;
> -
> -    enum odp_key_fitness fitness;
> -    struct ofpbuf odp_key;
> -    struct ofpbuf odp_mask;
> -    struct flow flow;
> -    struct ds out;
> -    int error;
> -
> -    /* Convert string to OVS DP key. */
> -    ofpbuf_init(&odp_key, 0);
> -    ofpbuf_init(&odp_mask, 0);
> -    error = odp_flow_from_string(in, NULL,
> -                                 &odp_key, &odp_mask, NULL);
> -    if (error) {
> -        printf("odp_flow_from_string: error\n");
> -        goto next;
> -    }
> -
> -    if (!wc_keys) {
> -        struct odp_flow_key_parms odp_parms = {
> -            .flow = &flow,
> -            .support = {
> -                .recirc = true,
> -                .ct_state = true,
> -                .ct_zone = true,
> -                .ct_mark = true,
> -                .ct_label = true,
> -                .max_vlan_headers = SIZE_MAX,
> -            },
> -        };
> -
> -        /* Convert odp_key to flow. */
> -        fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size,
> -                                       &flow, NULL);
> -        switch (fitness) {
> -            case ODP_FIT_PERFECT:
> -                break;
> -
> -            case ODP_FIT_TOO_LITTLE:
> -                printf("ODP_FIT_TOO_LITTLE: ");
> -                break;
> -
> -            case ODP_FIT_TOO_MUCH:
> -                printf("ODP_FIT_TOO_MUCH: ");
> -                break;
> -
> -            case ODP_FIT_ERROR:
> -                printf("odp_flow_key_to_flow: error\n");
> -                goto next;
> -        }
> -        /* Convert cls_rule back to odp_key. */
> -        ofpbuf_uninit(&odp_key);
> -        ofpbuf_init(&odp_key, 0);
> -        odp_flow_key_from_flow(&odp_parms, &odp_key);
> -
> -        if (odp_key.size > ODPUTIL_FLOW_KEY_BYTES) {
> -            printf ("too long: %"PRIu32" > %d\n",
> -                    odp_key.size, ODPUTIL_FLOW_KEY_BYTES);
> -            exit_code = 1;
> -        }
> -    }
> -
> -    /* Convert odp_key to string. */
> -    ds_init(&out);
> -    if (wc_keys) {
> -        odp_flow_format(odp_key.data, odp_key.size,
> -                        odp_mask.data, odp_mask.size, NULL, &out, false);
> -    } else {
> -        odp_flow_key_format(odp_key.data, odp_key.size, &out);
> -    }
> -    puts(ds_cstr(&out));
> -    ds_destroy(&out);
> -
> -next:
> -    ofpbuf_uninit(&odp_key);
> -    ofpbuf_uninit(&odp_mask);
> -
> -    return exit_code;
> -}
> -
> -static int
> -parse_actions(const char *in)
> -{
> -    struct ofpbuf odp_actions;
> -    struct ds out;
> -    int error;
> -
> -    /* Convert string to OVS DP actions. */
> -    ofpbuf_init(&odp_actions, 0);
> -    error = odp_actions_from_string(in, NULL, &odp_actions);
> -    if (error) {
> -        printf("odp_actions_from_string: error\n");
> -        goto next;
> -    }
> -
> -    /* Convert odp_actions back to string. */
> -    ds_init(&out);
> -    format_odp_actions(&out, odp_actions.data, odp_actions.size, NULL);
> -    puts(ds_cstr(&out));
> -    ds_destroy(&out);
> -
> -next:
> -    ofpbuf_uninit(&odp_actions);
> -    return 0;
> -}
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> -{
> -    /* Bail out if we cannot construct at least a 1 char string. */
> -    const char *input = (const char *) data;
> -    if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') ||
> -        strlen(input) != size - 1) {
> -        return 0;
> -    }
> -
> -    /* Disable logging to avoid write to disk. */
> -    static bool isInit = false;
> -    if (!isInit) {
> -        vlog_set_verbosity("off");
> -        isInit = true;
> -    }
> -
> -    /* Parse keys and wc keys. */
> -    parse_keys(false, input);
> -    parse_keys(true, input);
> -
> -    /* Parse actions. */
> -    parse_actions(input);
> -
> -    return 0;
> -}
> diff --git a/tests/oss-fuzz/ofctl_parse_target.c
> b/tests/oss-fuzz/ofctl_parse_target.c
> deleted file mode 100644
> index b4db52f7e..000000000
> --- a/tests/oss-fuzz/ofctl_parse_target.c
> +++ /dev/null
> @@ -1,113 +0,0 @@
> -#include <config.h>
> -#include "fuzzer.h"
> -#include "openvswitch/ofp-flow.h"
> -#include "ofp-version-opt.h"
> -#include "ofproto/ofproto.h"
> -#include "openflow/openflow.h"
> -#include "openvswitch/ofpbuf.h"
> -#include "openvswitch/vlog.h"
> -#include "util.h"
> -
> -static void
> -ofctl_parse_flows__(struct ofputil_flow_mod *fms, size_t n_fms,
> -                    enum ofputil_protocol usable_protocols)
> -{
> -    enum ofputil_protocol protocol = 0;
> -    char *usable_s;
> -    size_t i;
> -
> -    usable_s = ofputil_protocols_to_string(usable_protocols);
> -    printf("usable protocols: %s\n", usable_s);
> -    free(usable_s);
> -
> -    if (!(usable_protocols & OFPUTIL_P_ANY)) {
> -        printf("no usable protocol\n");
> -        goto free;
> -    }
> -    for (i = 0; i < sizeof(enum ofputil_protocol) * CHAR_BIT; i++) {
> -        protocol = 1u << i;
> -        if (protocol & usable_protocols & OFPUTIL_P_ANY) {
> -            break;
> -        }
> -    }
> -    ovs_assert(is_pow2(protocol));
> -
> -    printf("chosen protocol: %s\n", ofputil_protocol_to_string(protocol));
> -
> -    for (i = 0; i < n_fms; i++) {
> -        struct ofputil_flow_mod *fm = &fms[i];
> -        struct ofpbuf *msg;
> -
> -        msg = ofputil_encode_flow_mod(fm, protocol);
> -        ofpbuf_delete(msg);
> -    }
> -
> -free:
> -    for (i = 0; i < n_fms; i++) {
> -        struct ofputil_flow_mod *fm = &fms[i];
> -        free(CONST_CAST(struct ofpact *, fm->ofpacts));
> -        minimatch_destroy(&fm->match);
> -    }
> -}
> -
> -/* "parse-flow FLOW": parses the argument as a flow (like add-flow) and
> prints
> - * it back to stdout.  */
> -static void
> -ofctl_parse_flow(const char *input, int command)
> -{
> -    enum ofputil_protocol usable_protocols;
> -    struct ofputil_flow_mod fm;
> -    char *error;
> -
> -    error = parse_ofp_flow_mod_str(&fm, input, NULL, NULL,
> -                                   command, &usable_protocols);
> -    if (error) {
> -        printf("Error encountered: %s\n", error);
> -        free(error);
> -    } else {
> -        ofctl_parse_flows__(&fm, 1, usable_protocols);
> -    }
> -}
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> -{
> -    /* Bail out if we cannot construct at least a 1 char string.
> -     * Reserve 1 byte to decide flow mod command.
> -     *
> -     * Here's the structure of data we expect
> -     * |--Byte 1--|--Byte 2--|...|--Byte (size-1)--|
> -     *
> -     * where,
> -     *
> -     * Byte 1: Used to decide which ofp flow mod command to test
> -     * Bytes 2--(size-1): The C string that is actually passed to
> -     *                    ofctl_parse_flow() test API.
> -     *
> -     * This means that the fuzzed input is actually a C string of
> -     * length = (size -2) with the terminal byte being the NUL
> -     * character. Moreover, this string is expected to not contain
> -     * a new-line character.
> -     */
> -    const char *stream = (const char *) data;
> -    if (size < 3 || stream[size - 1] != '\0' || strchr(&stream[1], '\n')
> ||
> -        strlen(&stream[1]) != size - 2) {
> -        return 0;
> -    }
> -
> -    /* Disable logging to avoid write to disk. */
> -    static bool isInit = false;
> -    if (!isInit) {
> -        vlog_set_verbosity("off");
> -        isInit = true;
> -    }
> -
> -    /* Decide test parameters using first byte of fuzzed input. */
> -    int command = (stream[0] % OFPFC_DELETE_STRICT) + 1;
> -
> -    /* Fuzz extended match parsing. */
> -    const char *input = &stream[1];
> -    ofctl_parse_flow(input, command);
> -
> -    return 0;
> -}
> diff --git a/tests/oss-fuzz/ofp_print_target.c
> b/tests/oss-fuzz/ofp_print_target.c
> deleted file mode 100644
> index 126f2623f..000000000
> --- a/tests/oss-fuzz/ofp_print_target.c
> +++ /dev/null
> @@ -1,47 +0,0 @@
> -#include <config.h>
> -#include "fuzzer.h"
> -#include "dp-packet.h"
> -#include "openvswitch/ofp-print.h"
> -#include "openvswitch/ofpbuf.h"
> -#include "openvswitch/vlog.h"
> -
> -int
> -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> -{
> -    if (size < sizeof(struct ofp_header)) {
> -        return 0;
> -    }
> -
> -    static bool isInit = false;
> -    if (!isInit) {
> -        vlog_set_verbosity("off");
> -        isInit = true;
> -    }
> -
> -    struct ofpbuf b;
> -    ofpbuf_use_const(&b, data, size);
> -    for (;;) {
> -        /* Check if ofpbuf contains ofp header. */
> -        struct ofp_header *oh = ofpbuf_at(&b, 0, sizeof *oh);
> -        if (!oh) {
> -            break;
> -        }
> -
> -        /* Check if length is geq than lower bound. */
> -        size_t length = ntohs(oh->length);
> -        if (length < sizeof *oh) {
> -            break;
> -        }
> -
> -        /* Check if ofpbuf contains payload. */
> -        size_t tail_len = length - sizeof *oh;
> -        void *tail = ofpbuf_at(&b, sizeof *oh, tail_len);
> -        if (!tail) {
> -            break;
> -        }
> -
> -        ofp_print(stdout, ofpbuf_pull(&b, length), length, NULL, NULL, 2);
> -    }
> -    ofpbuf_uninit(&b);
> -    return 0;
> -}
> --
> 2.17.1
>
>
Ben Pfaff Oct. 18, 2019, 6:07 p.m. UTC | #3
On Fri, Oct 18, 2019 at 11:13:08AM +0200, bshas3@gmail.com wrote:
> From: Bhargava Shastry <bshas3@gmail.com>
> 
> It appears that ossfuzz specific test harnesses and configuration files
> were carried over to the ovn repo from the ovs repo without
> justification. This patch removes them until there is a need to
> continuously fuzz ovn code as the ovs code is currently fuzzed.
> 
> Signed-off-by: Bhargava Shastry <bshas3@gmail.com>

Thanks a lot!  I applied this to ovn master.
Ben Pfaff Oct. 18, 2019, 6:08 p.m. UTC | #4
This is the right mailing list for now.  The convention is to write
[PATCH ovn] in subject headings (but I figured it out ;-)

On Fri, Oct 18, 2019 at 04:48:40PM +0200, Bhargava Shastry wrote:
> Just want to add that the patch is to be applied to ovn source code, I
> couldn't find the ovn mailing list so sent it here. Apologies.
> 
> On Fri, Oct 18, 2019 at 11:13 AM <bshas3@gmail.com> wrote:
> 
> > From: Bhargava Shastry <bshas3@gmail.com>
> >
> > It appears that ossfuzz specific test harnesses and configuration files
> > were carried over to the ovn repo from the ovs repo without
> > justification. This patch removes them until there is a need to
> > continuously fuzz ovn code as the ovs code is currently fuzzed.
> >
> > Signed-off-by: Bhargava Shastry <bshas3@gmail.com>
> > ---
> >  tests/automake.mk                             |   2 -
> >  tests/oss-fuzz/automake.mk                    |  66 ---
> >  tests/oss-fuzz/config/expr.dict               | 120 -----
> >  .../oss-fuzz/config/expr_parse_target.options |   3 -
> >  .../config/flow_extract_target.options        |   3 -
> >  .../config/json_parser_target.options         |   2 -
> >  tests/oss-fuzz/config/miniflow_target.options |   3 -
> >  tests/oss-fuzz/config/odp.dict                | 170 -------
> >  tests/oss-fuzz/config/odp_target.options      |   3 -
> >  .../config/ofctl_parse_target.options         |   3 -
> >  tests/oss-fuzz/config/ofp-flow.dict           |  45 --
> >  .../oss-fuzz/config/ofp_print_target.options  |   3 -
> >  tests/oss-fuzz/config/ovs.dict                | 293 -----------
> >  tests/oss-fuzz/expr_parse_target.c            | 464 ------------------
> >  tests/oss-fuzz/flow_extract_target.c          | 100 ----
> >  tests/oss-fuzz/fuzzer.h                       |   9 -
> >  tests/oss-fuzz/json_parser_target.c           |  42 --
> >  tests/oss-fuzz/miniflow_target.c              | 365 --------------
> >  tests/oss-fuzz/odp_target.c                   | 149 ------
> >  tests/oss-fuzz/ofctl_parse_target.c           | 113 -----
> >  tests/oss-fuzz/ofp_print_target.c             |  47 --
> >  21 files changed, 2005 deletions(-)
> >  delete mode 100644 tests/oss-fuzz/automake.mk
> >  delete mode 100644 tests/oss-fuzz/config/expr.dict
> >  delete mode 100644 tests/oss-fuzz/config/expr_parse_target.options
> >  delete mode 100644 tests/oss-fuzz/config/flow_extract_target.options
> >  delete mode 100644 tests/oss-fuzz/config/json_parser_target.options
> >  delete mode 100644 tests/oss-fuzz/config/miniflow_target.options
> >  delete mode 100644 tests/oss-fuzz/config/odp.dict
> >  delete mode 100644 tests/oss-fuzz/config/odp_target.options
> >  delete mode 100644 tests/oss-fuzz/config/ofctl_parse_target.options
> >  delete mode 100644 tests/oss-fuzz/config/ofp-flow.dict
> >  delete mode 100644 tests/oss-fuzz/config/ofp_print_target.options
> >  delete mode 100644 tests/oss-fuzz/config/ovs.dict
> >  delete mode 100644 tests/oss-fuzz/expr_parse_target.c
> >  delete mode 100644 tests/oss-fuzz/flow_extract_target.c
> >  delete mode 100644 tests/oss-fuzz/fuzzer.h
> >  delete mode 100644 tests/oss-fuzz/json_parser_target.c
> >  delete mode 100644 tests/oss-fuzz/miniflow_target.c
> >  delete mode 100644 tests/oss-fuzz/odp_target.c
> >  delete mode 100644 tests/oss-fuzz/ofctl_parse_target.c
> >  delete mode 100644 tests/oss-fuzz/ofp_print_target.c
> >
> > diff --git a/tests/automake.mk b/tests/automake.mk
> > index 013e59280..e86a5273e 100644
> > --- a/tests/automake.mk
> > +++ b/tests/automake.mk
> > @@ -246,5 +246,3 @@ clean-pki:
> >         rm -f tests/pki/stamp
> >         rm -rf tests/pki
> >  endif
> > -
> > -include tests/oss-fuzz/automake.mk
> > diff --git a/tests/oss-fuzz/automake.mk b/tests/oss-fuzz/automake.mk
> > deleted file mode 100644
> > index 5bf7d0d7c..000000000
> > --- a/tests/oss-fuzz/automake.mk
> > +++ /dev/null
> > @@ -1,66 +0,0 @@
> > -OSS_FUZZ_TARGETS = \
> > -       tests/oss-fuzz/flow_extract_target \
> > -       tests/oss-fuzz/json_parser_target \
> > -       tests/oss-fuzz/ofp_print_target \
> > -       tests/oss-fuzz/expr_parse_target \
> > -       tests/oss-fuzz/odp_target \
> > -       tests/oss-fuzz/miniflow_target \
> > -       tests/oss-fuzz/ofctl_parse_target
> > -EXTRA_PROGRAMS += $(OSS_FUZZ_TARGETS)
> > -oss-fuzz-targets: $(OSS_FUZZ_TARGETS)
> > -
> > -tests_oss_fuzz_flow_extract_target_SOURCES = \
> > -       tests/oss-fuzz/flow_extract_target.c \
> > -       tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_flow_extract_target_LDADD = lib/libopenvswitch.la
> > -tests_oss_fuzz_flow_extract_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -tests_oss_fuzz_json_parser_target_SOURCES = \
> > -       tests/oss-fuzz/json_parser_target.c \
> > -       tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_json_parser_target_LDADD = lib/libopenvswitch.la
> > -tests_oss_fuzz_json_parser_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -tests_oss_fuzz_ofp_print_target_SOURCES = \
> > -       tests/oss-fuzz/ofp_print_target.c \
> > -       tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_ofp_print_target_LDADD = lib/libopenvswitch.la
> > -tests_oss_fuzz_ofp_print_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -tests_oss_fuzz_expr_parse_target_SOURCES = \
> > -        tests/oss-fuzz/expr_parse_target.c \
> > -        tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_expr_parse_target_LDADD = lib/libopenvswitch.la \
> > -                                         ovn/lib/libovn.la
> > -tests_oss_fuzz_expr_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -tests_oss_fuzz_odp_target_SOURCES = \
> > -        tests/oss-fuzz/odp_target.c \
> > -        tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_odp_target_LDADD = lib/libopenvswitch.la
> > -tests_oss_fuzz_odp_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -tests_oss_fuzz_miniflow_target_SOURCES = \
> > -        tests/oss-fuzz/miniflow_target.c \
> > -        tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_miniflow_target_LDADD = lib/libopenvswitch.la
> > -tests_oss_fuzz_miniflow_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -tests_oss_fuzz_ofctl_parse_target_SOURCES = \
> > -        tests/oss-fuzz/ofctl_parse_target.c \
> > -        tests/oss-fuzz/fuzzer.h
> > -tests_oss_fuzz_ofctl_parse_target_LDADD = lib/libopenvswitch.la
> > -tests_oss_fuzz_ofctl_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
> > -
> > -EXTRA_DIST += \
> > -       tests/oss-fuzz/config/flow_extract_target.options \
> > -       tests/oss-fuzz/config/json_parser_target.options \
> > -       tests/oss-fuzz/config/ofp_print_target.options \
> > -       tests/oss-fuzz/config/expr_parse_target.options \
> > -       tests/oss-fuzz/config/odp_target.options \
> > -       tests/oss-fuzz/config/miniflow_target.options \
> > -        tests/oss-fuzz/config/ofctl_parse_target.options \
> > -       tests/oss-fuzz/config/ovs.dict \
> > -       tests/oss-fuzz/config/expr.dict \
> > -       tests/oss-fuzz/config/odp.dict \
> > -       tests/oss-fuzz/config/ofp-flow.dict
> > diff --git a/tests/oss-fuzz/config/expr.dict
> > b/tests/oss-fuzz/config/expr.dict
> > deleted file mode 100644
> > index 03741ad7d..000000000
> > --- a/tests/oss-fuzz/config/expr.dict
> > +++ /dev/null
> > @@ -1,120 +0,0 @@
> > -" = "
> > -" = ("
> > -" = dns_lookup();"
> > -" { "
> > -" };"
> > -"!"
> > -"!="
> > -"$"
> > -"&&"
> > -"("
> > -"()"
> > -")"
> > -"),commit,table=,zone=NXM_NX_REG)"
> > -");"
> > -", "
> > -", meter=\"\""
> > -","
> > -",bucket=bucket_id=,weight:100,actions=ct(nat(dst="
> > -"--"
> > -".."
> > -"/"
> > -"/%"
> > -"0"
> > -":"
> > -"<"
> > -"<->"
> > -"<="
> > -"="
> > -"=="
> > -"=r"
> > -">"
> > -">="
> > -"["
> > -"\x00"
> > -"\x28"
> > -"]"
> > -"]:"
> > -"allow"
> > -"arp"
> > -"bool"
> > -"bswap "
> > -"bswap %0"
> > -"cc"
> > -"clone"
> > -"ct_clear"
> > -"ct_clear;"
> > -"ct_commit"
> > -"ct_commit("
> > -"ct_dnat"
> > -"ct_label"
> > -"ct_label="
> > -"ct_lb"
> > -"ct_mark"
> > -"ct_mark="
> > -"ct_mark=%#x"
> > -"ct_next"
> > -"ct_next;"
> > -"ct_snat"
> > -"decimal"
> > -"dhcpv6_stateful"
> > -"dhcpv6_stateless"
> > -"dns_lookup"
> > -"drop"
> > -"drop;"
> > -"egress"
> > -"error("
> > -"get_arp"
> > -"get_nd"
> > -"hexadecimal"
> > -"icmp4"
> > -"icmp6"
> > -"ingress"
> > -"ip.ttl"
> > -"ip.ttl--;"
> > -"ipv4"
> > -"ipv6"
> > -"log"
> > -"log("
> > -"mac"
> > -"meter"
> > -"name"
> > -"name=\"\", "
> > -"nd_na"
> > -"nd_na_router"
> > -"nd_ns"
> > -"next"
> > -"next();"
> > -"next(pipeline=, table=);"
> > -"next;"
> > -"output"
> > -"output;"
> > -"pipeline"
> > -"put_arp"
> > -"put_dhcp_opts"
> > -"put_dhcpv6_opts"
> > -"put_nd"
> > -"put_nd_ra_opts"
> > -"reject"
> > -"set_meter"
> > -"set_meter();"
> > -"set_meter(, );"
> > -"set_meter(,);"
> > -"set_queue"
> > -"set_queue();"
> > -"severity"
> > -"severity="
> > -"slaac"
> > -"static_routes"
> > -"str"
> > -"table"
> > -"tcp_reset"
> > -"type=select,selection_method=dp_hash"
> > -"uint16"
> > -"uint32"
> > -"uint8"
> > -"verdict"
> > -"verdict=, "
> > -"{"
> > -"||"
> > -"}"
> > diff --git a/tests/oss-fuzz/config/expr_parse_target.options
> > b/tests/oss-fuzz/config/expr_parse_target.options
> > deleted file mode 100644
> > index fc254e84f..000000000
> > --- a/tests/oss-fuzz/config/expr_parse_target.options
> > +++ /dev/null
> > @@ -1,3 +0,0 @@
> > -[libfuzzer]
> > -dict = expr.dict
> > -close_fd_mask = 3
> > diff --git a/tests/oss-fuzz/config/flow_extract_target.options
> > b/tests/oss-fuzz/config/flow_extract_target.options
> > deleted file mode 100644
> > index 81ad7f18c..000000000
> > --- a/tests/oss-fuzz/config/flow_extract_target.options
> > +++ /dev/null
> > @@ -1,3 +0,0 @@
> > -[libfuzzer]
> > -dict = ovs.dict
> > -close_fd_mask = 3
> > diff --git a/tests/oss-fuzz/config/json_parser_target.options
> > b/tests/oss-fuzz/config/json_parser_target.options
> > deleted file mode 100644
> > index 8d3739a53..000000000
> > --- a/tests/oss-fuzz/config/json_parser_target.options
> > +++ /dev/null
> > @@ -1,2 +0,0 @@
> > -[libfuzzer]
> > -dict = json.dict
> > diff --git a/tests/oss-fuzz/config/miniflow_target.options
> > b/tests/oss-fuzz/config/miniflow_target.options
> > deleted file mode 100644
> > index 4849f282d..000000000
> > --- a/tests/oss-fuzz/config/miniflow_target.options
> > +++ /dev/null
> > @@ -1,3 +0,0 @@
> > -[libfuzzer]
> > -dict = ovs.dict
> > -close_fd_mask = 3
> > \ No newline at end of file
> > diff --git a/tests/oss-fuzz/config/odp.dict
> > b/tests/oss-fuzz/config/odp.dict
> > deleted file mode 100644
> > index a9bdd3e99..000000000
> > --- a/tests/oss-fuzz/config/odp.dict
> > +++ /dev/null
> > @@ -1,170 +0,0 @@
> > -"("
> > -")"
> > -","
> > -"/0x"
> > -"0x"
> > -": "
> > -"="
> > -"=r"
> > -"action"
> > -"arp"
> > -"bfd"
> > -"bos"
> > -"c1"
> > -"c2"
> > -"c3"
> > -"c4"
> > -"cc"
> > -"cfi"
> > -"cfm"
> > -"class"
> > -"clone"
> > -"code"
> > -"commit,"
> > -"crit,"
> > -"csum"
> > -"ct"
> > -"ct(error)"
> > -"ct_clear"
> > -"ct_label"
> > -"ct_mark"
> > -"ct_state"
> > -"ct_tuple4"
> > -"ct_tuple6"
> > -"ct_zone"
> > -"dir"
> > -"dl_type"
> > -"dnat"
> > -"dp_hash"
> > -"drop"
> > -"dst"
> > -"dst_port"
> > -"egress"
> > -"encap"
> > -"error"
> > -"erspan"
> > -"erspan(ver=1,sid=0x,dir=,idx=0x)"
> > -"est"
> > -"eth"
> > -"eth_type"
> > -"eth_type(0/)"
> > -"first"
> > -"flags"
> > -"force_commit,"
> > -"frag"
> > -"gbp("
> > -"geneve"
> > -"gre((flags=0x,proto=0x)"
> > -"hash,"
> > -"helper"
> > -"hlimit"
> > -"hwid"
> > -"icmp"
> > -"icmpv6"
> > -"id"
> > -"idx="
> > -"in_port"
> > -"ingress"
> > -"inv"
> > -"ip6erspan"
> > -"ipfix(output_port="
> > -"ipv4"
> > -"ipv6"
> > -"ipv6_dst"
> > -"ipv6_src"
> > -"l4()"
> > -"label"
> > -"lacp"
> > -"later"
> > -"len"
> > -"lldp"
> > -"mark=/,"
> > -"match"
> > -"md2"
> > -"mdtype"
> > -"meter()"
> > -"mpls"
> > -"nat"
> > -"nd"
> > -"new"
> > -"no"
> > -"np"
> > -"ns"
> > -"nsh"
> > -"oam,"
> > -"op"
> > -"options("
> > -"out_port("
> > -"packet_type"
> > -"pcp="
> > -"persistent,"
> > -"pop_eth"
> > -"pop_mpls(eth_type=0x)"
> > -"pop_nsh()"
> > -"pop_vlan"
> > -"proto"
> > -"push_eth(src=:::::,dst=:::::,type=)"
> > -"push_mpls("
> > -"push_nsh("
> > -"push_vlan("
> > -"push_vlan(tpid=,vid=,pcp=,cfi=)"
> > -"random,"
> > -"recirc()"
> > -"recirc_id"
> > -"rel"
> > -"rpl"
> > -"sFlow(vid=,pcp=,output=)"
> > -"sample"
> > -"sctp"
> > -"seq=0x"
> > -"set("
> > -"set(nsh("
> > -"sha"
> > -"si"
> > -"sip"
> > -"skb_mark"
> > -"skb_priority"
> > -"sll"
> > -"slow_path"
> > -"snat"
> > -"spi"
> > -"src"
> > -"src_port"
> > -"stp"
> > -"sym_l4()"
> > -"target"
> > -"tc="
> > -"tclass"
> > -"tcp"
> > -"tcp_flags"
> > -"tha"
> > -"tip"
> > -"tll"
> > -"tnl_pop("
> > -"tnl_push(tnl_port("
> > -"too_little"
> > -"too_much"
> > -"tos"
> > -"tp_dst"
> > -"tp_src"
> > -"tpid=0x"
> > -"trk"
> > -"trunc()"
> > -"ttl"
> > -"tun_id"
> > -"tunnel"
> > -"tunnel_out_port"
> > -"type"
> > -"udp"
> > -"unspec"
> > -"userdata"
> > -"userspace("
> > -"userspace(error)"
> > -"userspace(pid"
> > -"ver"
> > -"vid"
> > -"vlan"
> > -"vxlan"
> > -"vxlan(flags=0x,vni=0x)"
> > -"vxlan(gbp("
> > -"zone"
> > diff --git a/tests/oss-fuzz/config/odp_target.options
> > b/tests/oss-fuzz/config/odp_target.options
> > deleted file mode 100644
> > index 41821b8c1..000000000
> > --- a/tests/oss-fuzz/config/odp_target.options
> > +++ /dev/null
> > @@ -1,3 +0,0 @@
> > -[libfuzzer]
> > -close_fd_mask = 3
> > -dict = odp.dict
> > diff --git a/tests/oss-fuzz/config/ofctl_parse_target.options
> > b/tests/oss-fuzz/config/ofctl_parse_target.options
> > deleted file mode 100644
> > index 6d67dd6ad..000000000
> > --- a/tests/oss-fuzz/config/ofctl_parse_target.options
> > +++ /dev/null
> > @@ -1,3 +0,0 @@
> > -[libfuzzer]
> > -close_fd_mask = 3
> > -dict = ofp-flow.dict
> > diff --git a/tests/oss-fuzz/config/ofp-flow.dict
> > b/tests/oss-fuzz/config/ofp-flow.dict
> > deleted file mode 100644
> > index 01175e5eb..000000000
> > --- a/tests/oss-fuzz/config/ofp-flow.dict
> > +++ /dev/null
> > @@ -1,45 +0,0 @@
> > -")"
> > -"("
> > -"["
> > -"]"
> > -","
> > -"-"
> > -"0"
> > -":"
> > -"="
> > -"ADD"
> > -"DEL"
> > -"DEL_STRICT"
> > -"MOD"
> > -"MOD_STRICT"
> > -"\x00"
> > -"\x20"
> > -"\x3F"
> > -"actions"
> > -"add"
> > -"allow_hidden_fields"
> > -"cc"
> > -"check_overlap"
> > -"cookie"
> > -"delete"
> > -"delete_strict"
> > -"duration"
> > -"eth"
> > -"hard_age"
> > -"hard_timeout"
> > -"idle_age"
> > -"idle_timeout"
> > -"importance"
> > -"modify"
> > -"modify_strict"
> > -"n_bytes"
> > -"n_packets"
> > -"no_byte_counts"
> > -"no_packet_counts"
> > -"no_readonly_table"
> > -"out_group"
> > -"out_port"
> > -"priority"
> > -"reset_counts"
> > -"send_flow_rem"
> > -"table"
> > diff --git a/tests/oss-fuzz/config/ofp_print_target.options
> > b/tests/oss-fuzz/config/ofp_print_target.options
> > deleted file mode 100644
> > index 7f117292e..000000000
> > --- a/tests/oss-fuzz/config/ofp_print_target.options
> > +++ /dev/null
> > @@ -1,3 +0,0 @@
> > -[libfuzzer]
> > -close_fd_mask = 3
> > -dict = ovs.dict
> > diff --git a/tests/oss-fuzz/config/ovs.dict
> > b/tests/oss-fuzz/config/ovs.dict
> > deleted file mode 100644
> > index 243b243ab..000000000
> > --- a/tests/oss-fuzz/config/ovs.dict
> > +++ /dev/null
> > @@ -1,293 +0,0 @@
> > -"0.2"
> > -"ADD_SUBSCRIBE"
> > -"-cbc"
> > -"CLEARSUB"
> > -"CLIENT"
> > -"GIMME"
> > -"GIMMEDEFS"
> > -"GIMMESTATS"
> > -"HM"
> > -"-hmac96"
> > -"HM_CTL"
> > -"HM_STAT"
> > -"HMST_CLIENT"
> > -"LOGIN"
> > -"\\MAILSLOT\\BROWSE"
> > -"NET-ANNOUNCED"
> > -"NET-VISIBLE"
> > -"-nodefs"
> > -"NONE"
> > -"OPSTAFF"
> > -"\\PIPE\\LANMAN"
> > -"public"
> > -"REALM"
> > -"REALM-ANNOUNCED"
> > -"REALM-VISIBLE"
> > -"REQ_SUBSCRIBE"
> > -"RLM_SUBSCRIBE"
> > -"RLM_UNSUBSCRIBE"
> > -"SENT"
> > -" %ssub%s"
> > -"SUBSCRIBE"
> > -"SUBSCRIBE_NODEFS"
> > -"un"
> > -"UNSUBSCRIBE"
> > -"USER_FLUSH"
> > -"USER_HIDE"
> > -"USER_LOCATE"
> > -"USER_UNHIDE"
> > -"WG_CTL"
> > -"\x01\x00"
> > -"\x01\x00\x00"
> > -"\x01\x00\x01"
> > -"\x01\x00\x02"
> > -"\x01\x00\x03"
> > -"\x01\x00\x05"
> > -"\x01\x01"
> > -"\x01\x02"
> > -"\x01\x03"
> > -"\x01\x04"
> > -"\x01\x05"
> > -"\x01\x07"
> > -"\x01\x0B"
> > -"\x01\x0C"
> > -"\x01\x10"
> > -"\x01\x11"
> > -"\x01\x12"
> > -"\x01\x13"
> > -"\x01\x14"
> > -"\x01\x15"
> > -"\x01\x16"
> > -"\x01\xE8\x48"
> > -"\x01\xF4"
> > -"\x01\xF5"
> > -"\x01\xF6"
> > -"\x01\xF7"
> > -"\x01\xF8"
> > -"\x01\xF9"
> > -"\x01\xFA"
> > -"\x01\xFB"
> > -"\x01\xFC"
> > -"\x01\xFD"
> > -"\x01\xFE"
> > -"\x01\xFF"
> > -"\x02\x00"
> > -"\x02\x00\x00"
> > -"\x02\x01"
> > -"\x02\x02"
> > -"\x02\x03"
> > -"\x02\x04"
> > -"\x02\x05"
> > -"\x02\x06"
> > -"\x02\x07"
> > -"\x02\x08"
> > -"\x02\x09"
> > -"\x02\x0C"
> > -"\x02\x0E"
> > -"\x02\x0F"
> > -"\x02\x11"
> > -"\x02\x12"
> > -"\x02\x58"
> > -"\x02\x81"
> > -"\x02\x83"
> > -"\x03\x00"
> > -"\x03\x01"
> > -"\x03\x02"
> > -"\x03\x03"
> > -"\x03\x06"
> > -"\x03\xE8"
> > -"\x03\xE9"
> > -"\x03\xEA"
> > -"\x03\xEB"
> > -"\x03\xEC"
> > -"\x03\xED"
> > -"\x03\xEE"
> > -"\x03\xEF"
> > -"\x03\xF0"
> > -"\x03\xF1"
> > -"\x03\xF2"
> > -"\x03\xF3"
> > -"\x03\xF4"
> > -"\x03\xFF\xFF\xFF"
> > -"\x04\x00"
> > -"\x04\x00\x00"
> > -"\x04\x01"
> > -"\x04\x02"
> > -"\x04\x03"
> > -"\x04\x04"
> > -"\x04\x51"
> > -"\x04\x52"
> > -"\x04\x53"
> > -"\x04\x55"
> > -"\x04\x56"
> > -"\x05\x00"
> > -"\x05\x01"
> > -"\x05\x02"
> > -"\x05\x03"
> > -"\x05\x53"
> > -"\x05\xCC"
> > -"\x05\xDC"
> > -"\x06\x00"
> > -"\x06\x01"
> > -"\x06\xCF"
> > -"\x07\x07"
> > -"\x07\xC1"
> > -"\x07\xFF"
> > -"\x08\x00"
> > -"\x08\x00\x00\x00"
> > -"\x08\x00\x07"
> > -"\x08\x01"
> > -"\x08\x06"
> > -"\x08\x38\x00\x00"
> > -"\x0A\x00\xB1"
> > -"\x0C\x01"
> > -"\x0C\x02"
> > -"\x0C\x03"
> > -"\x0C\x04"
> > -"\x0C\x05"
> > -"\x0C\x06"
> > -"\x0C\x08"
> > -"\x0D\x80"
> > -"\x0E\x00"
> > -"\x0E\x10"
> > -"\x0E\xC8"
> > -"\x0E\xC9"
> > -"\x0F\x42\x40"
> > -"\x0F\xFF"
> > -"\x10\x00"
> > -"\x11\x11"
> > -"\x11\xD7"
> > -"\x12\x0F"
> > -"\x12\xBB"
> > -"\x1A\x30"
> > -"\x1A\x31"
> > -"\x1A\x32"
> > -"\x1B\x21"
> > -"\x1B\x58"
> > -"\x1B\x59"
> > -"\x1B\x5A"
> > -"\x1B\x5B"
> > -"\x1B\x5C"
> > -"\x1B\x5D"
> > -"\x1B\x5F"
> > -"\x1B\x61"
> > -"\x1F\x00"
> > -"\x1F\x40"
> > -"\x1F\xFF"
> > -"\x1F\xFF\xFF"
> > -"\x20\x00"
> > -"\x20\x03"
> > -"\x20\x04"
> > -"\x27\x10"
> > -"\x27\x13"
> > -"\x2F\xBF"
> > -"\x35\x00\x00"
> > -"\x3C\x13"
> > -"\x40\x00"
> > -"\x40\x04"
> > -"\x40\x80"
> > -"\x47\x00\x06\x01"
> > -"\x4E\x20"
> > -"\x4E\x21"
> > -"\x4E\x22"
> > -"\x4E\x23"
> > -"\x4E\x24"
> > -"\x4E\x25"
> > -"\x4E\x26"
> > -"\x4E\x27"
> > -"\x4E\x28"
> > -"\x4E\x29"
> > -"\x4E\x2A"
> > -"\x4E\x2C"
> > -"\x60\x00"
> > -"\x60\x01"
> > -"\x60\x02"
> > -"\x60\x03"
> > -"\x60\x04"
> > -"\x60\x07"
> > -"\x7F\xFF"
> > -"\x7F\xFF\xFF"
> > -"\x80\x00"
> > -"\x80\x00\x00\x00"
> > -"\x80\x01"
> > -"\x80\x05"
> > -"\x80\x0A"
> > -"\x80\x21"
> > -"\x80\x21\x10\x01"
> > -"\x80\x21\x10\x02"
> > -"\x80\x23"
> > -"\x80\x35"
> > -"\x80\x57"
> > -"\x80\x9B"
> > -"\x80\xC2"
> > -"\x80\xF3"
> > -"\x80\xFD"
> > -"\x81\x00"
> > -"\x81\x37"
> > -"\x82\x81"
> > -"\x83\xAA\x7E\x80"
> > -"\x85\xBE"
> > -"\x86\xDD"
> > -"\x88\x08"
> > -"\x88\x09"
> > -"\x88\x0B"
> > -"\x88\x47"
> > -"\x88\x48"
> > -"\x88\x63"
> > -"\x88\x64"
> > -"\x88\x6F"
> > -"\x88\x70"
> > -"\x88\x8E"
> > -"\x88\x99"
> > -"\x88\xA2"
> > -"\x88\xA8"
> > -"\x88\xCA"
> > -"\x88\xCC"
> > -"\x89\x02"
> > -"\x89\x3A"
> > -"\x89\x47"
> > -"\x90\x00"
> > -"\x91\x00"
> > -"\xA0\x00"
> > -"\xAB\xCD"
> > -"\xB0\x00"
> > -"\xC0\x00\x00\x00"
> > -"\xC0\x21"
> > -"\xC0\x23"
> > -"\xC0\x25"
> > -"\xC0\x27"
> > -"\xC0\x2B"
> > -"\xC0\x2D"
> > -"\xC1\x23"
> > -"\xC2\x23"
> > -"\xC2\x27"
> > -"\xDA\xDA"
> > -"\xE0\x00"
> > -"\xE0\x00\x00\x00"
> > -"\xF0\x00\x00\x00"
> > -"\xF1\x0A"
> > -"\xF9\x89"
> > -"\xFC\x00"
> > -"\xFD\xE9"
> > -"\xFE\xFE"
> > -"\xFF\x00"
> > -"\xFF\x00\x00"
> > -"\xFF\x00\x00\x00"
> > -"\xFF\xF0"
> > -"\xFF\xF8"
> > -"\xFF\xFD"
> > -"\xFF\xFE"
> > -"\xFF\xFF"
> > -"\xFF\xFF\x00\x00"
> > -"\xFF\xFF\xF0\x00"
> > -"\xFF\xFF\xFF\x00"
> > -"\xFF\xFF\xFF\x01"
> > -"\xFF\xFF\xFF\x02"
> > -"\xFF\xFF\xFF\x03"
> > -"\xFF\xFF\xFF\xEF"
> > -"\xFF\xFF\xFF\xFD"
> > -"\xFF\xFF\xFF\xFE"
> > -"\xFF\xFF\xFF\xFF"
> > -"ZEPH"
> > -"ZEPHYR_ADMIN"
> > -"ZEPHYR_CTL"
> > diff --git a/tests/oss-fuzz/expr_parse_target.c
> > b/tests/oss-fuzz/expr_parse_target.c
> > deleted file mode 100644
> > index 1a3893858..000000000
> > --- a/tests/oss-fuzz/expr_parse_target.c
> > +++ /dev/null
> > @@ -1,464 +0,0 @@
> > -#include <config.h>
> > -#include "fuzzer.h"
> > -#include <errno.h>
> > -#include <getopt.h>
> > -#include <sys/wait.h>
> > -
> > -#include "command-line.h"
> > -#include "dp-packet.h"
> > -#include "fatal-signal.h"
> > -#include "flow.h"
> > -#include "openvswitch/dynamic-string.h"
> > -#include "openvswitch/match.h"
> > -#include "openvswitch/ofp-actions.h"
> > -#include "openvswitch/ofpbuf.h"
> > -#include "openvswitch/vlog.h"
> > -#include "ovn/actions.h"
> > -#include "ovn/expr.h"
> > -#include "ovn/lex.h"
> > -#include "ovn/lib/logical-fields.h"
> > -#include "ovn/lib/ovn-l7.h"
> > -#include "ovn/lib/extend-table.h"
> > -#include "openvswitch/shash.h"
> > -#include "simap.h"
> > -#include "util.h"
> > -
> > -static void
> > -compare_token(const struct lex_token *a, const struct lex_token *b)
> > -{
> > -    if (a->type != b->type) {
> > -        fprintf(stderr, "type differs: %d -> %d\n", a->type, b->type);
> > -        return;
> > -    }
> > -
> > -    if (!((a->s && b->s && !strcmp(a->s, b->s))
> > -          || (!a->s && !b->s))) {
> > -        fprintf(stderr, "string differs: %s -> %s\n",
> > -                a->s ? a->s : "(null)",
> > -                b->s ? b->s : "(null)");
> > -        return;
> > -    }
> > -
> > -    if (a->type == LEX_T_INTEGER || a->type == LEX_T_MASKED_INTEGER) {
> > -        if (memcmp(&a->value, &b->value, sizeof a->value)) {
> > -            fprintf(stderr, "value differs\n");
> > -            return;
> > -        }
> > -
> > -        if (a->type == LEX_T_MASKED_INTEGER
> > -            && memcmp(&a->mask, &b->mask, sizeof a->mask)) {
> > -            fprintf(stderr, "mask differs\n");
> > -            return;
> > -        }
> > -
> > -        if (a->format != b->format
> > -            && !(a->format == LEX_F_HEXADECIMAL
> > -                 && b->format == LEX_F_DECIMAL
> > -                 && a->value.integer == 0)) {
> > -            fprintf(stderr, "format differs: %d -> %d\n",
> > -                    a->format, b->format);
> > -        }
> > -    }
> > -}
> > -
> > -static void
> > -test_lex(const char *input)
> > -{
> > -    struct ds output;
> > -
> > -    ds_init(&output);
> > -    struct lexer lexer;
> > -
> > -    lexer_init(&lexer, input);
> > -    ds_clear(&output);
> > -    while (lexer_get(&lexer) != LEX_T_END) {
> > -        size_t len = output.length;
> > -        lex_token_format(&lexer.token, &output);
> > -
> > -        /* Check that the formatted version can really be parsed back
> > -         * losslessly. */
> > -        if (lexer.token.type != LEX_T_ERROR) {
> > -            const char *s = ds_cstr(&output) + len;
> > -            struct lexer l2;
> > -
> > -            lexer_init(&l2, s);
> > -            lexer_get(&l2);
> > -            compare_token(&lexer.token, &l2.token);
> > -            lexer_destroy(&l2);
> > -        }
> > -        ds_put_char(&output, ' ');
> > -    }
> > -    lexer_destroy(&lexer);
> > -
> > -    ds_chomp(&output, ' ');
> > -    puts(ds_cstr(&output));
> > -    ds_destroy(&output);
> > -}
> > -
> > -static void
> > -create_symtab(struct shash *symtab)
> > -{
> > -    ovn_init_symtab(symtab);
> > -
> > -    /* For negative testing. */
> > -    expr_symtab_add_field(symtab, "bad_prereq", MFF_XREG0, "xyzzy",
> > false);
> > -    expr_symtab_add_field(symtab, "self_recurse", MFF_XREG0,
> > -                          "self_recurse != 0", false);
> > -    expr_symtab_add_field(symtab, "mutual_recurse_1", MFF_XREG0,
> > -                          "mutual_recurse_2 != 0", false);
> > -    expr_symtab_add_field(symtab, "mutual_recurse_2", MFF_XREG0,
> > -                          "mutual_recurse_1 != 0", false);
> > -    expr_symtab_add_string(symtab, "big_string", MFF_XREG0, NULL);
> > -}
> > -
> > -static void
> > -create_gen_opts(struct hmap *dhcp_opts, struct hmap *dhcpv6_opts,
> > -                struct hmap *nd_ra_opts)
> > -{
> > -    hmap_init(dhcp_opts);
> > -    dhcp_opt_add(dhcp_opts, "offerip", 0, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "netmask", 1, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "router",  3, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "dns_server", 6, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "log_server", 7, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "lpr_server",  9, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "domain", 15, "str");
> > -    dhcp_opt_add(dhcp_opts, "swap_server", 16, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "policy_filter", 21, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "router_solicitation",  32, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "nis_server", 41, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "ntp_server", 42, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "server_id",  54, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "tftp_server", 66, "ipv4");
> > -    dhcp_opt_add(dhcp_opts, "classless_static_route", 121,
> > "static_routes");
> > -    dhcp_opt_add(dhcp_opts, "ip_forward_enable",  19, "bool");
> > -    dhcp_opt_add(dhcp_opts, "router_discovery", 31, "bool");
> > -    dhcp_opt_add(dhcp_opts, "ethernet_encap", 36, "bool");
> > -    dhcp_opt_add(dhcp_opts, "default_ttl",  23, "uint8");
> > -    dhcp_opt_add(dhcp_opts, "tcp_ttl", 37, "uint8");
> > -    dhcp_opt_add(dhcp_opts, "mtu", 26, "uint16");
> > -    dhcp_opt_add(dhcp_opts, "lease_time",  51, "uint32");
> > -    dhcp_opt_add(dhcp_opts, "wpad", 252, "str");
> > -
> > -    /* DHCPv6 options. */
> > -    hmap_init(dhcpv6_opts);
> > -    dhcp_opt_add(dhcpv6_opts, "server_id",  2, "mac");
> > -    dhcp_opt_add(dhcpv6_opts, "ia_addr",  5, "ipv6");
> > -    dhcp_opt_add(dhcpv6_opts, "dns_server",  23, "ipv6");
> > -    dhcp_opt_add(dhcpv6_opts, "domain_search",  24, "str");
> > -
> > -    /* IPv6 ND RA options. */
> > -    hmap_init(nd_ra_opts);
> > -    nd_ra_opts_init(nd_ra_opts);
> > -}
> > -
> > -static void
> > -create_addr_sets(struct shash *addr_sets)
> > -{
> > -    shash_init(addr_sets);
> > -
> > -    static const char *const addrs1[] = {
> > -        "10.0.0.1", "10.0.0.2", "10.0.0.3",
> > -    };
> > -    static const char *const addrs2[] = {
> > -        "::1", "::2", "::3",
> > -    };
> > -    static const char *const addrs3[] = {
> > -        "00:00:00:00:00:01", "00:00:00:00:00:02", "00:00:00:00:00:03",
> > -    };
> > -    static const char *const addrs4[] = { NULL };
> > -
> > -    expr_const_sets_add(addr_sets, "set1", addrs1, 3, true);
> > -    expr_const_sets_add(addr_sets, "set2", addrs2, 3, true);
> > -    expr_const_sets_add(addr_sets, "set3", addrs3, 3, true);
> > -    expr_const_sets_add(addr_sets, "set4", addrs4, 0, true);
> > -}
> > -
> > -static void
> > -create_port_groups(struct shash *port_groups)
> > -{
> > -    shash_init(port_groups);
> > -
> > -    static const char *const pg1[] = {
> > -        "lsp1", "lsp2", "lsp3",
> > -    };
> > -    static const char *const pg2[] = { NULL };
> > -
> > -    expr_const_sets_add(port_groups, "pg1", pg1, 3, false);
> > -    expr_const_sets_add(port_groups, "pg_empty", pg2, 0, false);
> > -}
> > -
> > -static bool
> > -lookup_port_cb(const void *ports_, const char *port_name, unsigned int
> > *portp)
> > -{
> > -    const struct simap *ports = ports_;
> > -    const struct simap_node *node = simap_find(ports, port_name);
> > -    if (!node) {
> > -        return false;
> > -    }
> > -    *portp = node->data;
> > -    return true;
> > -}
> > -
> > -static bool
> > -is_chassis_resident_cb(const void *ports_, const char *port_name)
> > -{
> > -    const struct simap *ports = ports_;
> > -    const struct simap_node *node = simap_find(ports, port_name);
> > -    if (node) {
> > -        return true;
> > -    }
> > -    return false;
> > -}
> > -
> > -static void
> > -test_parse_actions(const char *input)
> > -{
> > -    struct shash symtab;
> > -    struct hmap dhcp_opts;
> > -    struct hmap dhcpv6_opts;
> > -    struct hmap nd_ra_opts;
> > -    struct simap ports;
> > -
> > -    create_symtab(&symtab);
> > -    create_gen_opts(&dhcp_opts, &dhcpv6_opts, &nd_ra_opts);
> > -
> > -    /* Initialize group ids. */
> > -    struct ovn_extend_table group_table;
> > -    ovn_extend_table_init(&group_table);
> > -
> > -    /* Initialize meter ids for QoS. */
> > -    struct ovn_extend_table meter_table;
> > -    ovn_extend_table_init(&meter_table);
> > -
> > -    simap_init(&ports);
> > -    simap_put(&ports, "eth0", 5);
> > -    simap_put(&ports, "eth1", 6);
> > -    simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL));
> > -
> > -    struct ofpbuf ovnacts;
> > -    struct expr *prereqs;
> > -    char *error;
> > -
> > -    puts(input);
> > -
> > -    ofpbuf_init(&ovnacts, 0);
> > -
> > -    const struct ovnact_parse_params pp = {
> > -        .symtab = &symtab,
> > -        .dhcp_opts = &dhcp_opts,
> > -        .dhcpv6_opts = &dhcpv6_opts,
> > -        .nd_ra_opts = &nd_ra_opts,
> > -        .n_tables = 24,
> > -        .cur_ltable = 10,
> > -    };
> > -    error = ovnacts_parse_string(input, &pp, &ovnacts, &prereqs);
> > -    if (!error) {
> > -        /* Convert the parsed representation back to a string and print
> > it,
> > -         * if it's different from the input. */
> > -        struct ds ovnacts_s = DS_EMPTY_INITIALIZER;
> > -        ovnacts_format(ovnacts.data, ovnacts.size, &ovnacts_s);
> > -        if (strcmp(input, ds_cstr(&ovnacts_s))) {
> > -            printf("    formats as %s\n", ds_cstr(&ovnacts_s));
> > -        }
> > -
> > -        /* Encode the actions into OpenFlow and print. */
> > -        const struct ovnact_encode_params ep = {
> > -            .lookup_port = lookup_port_cb,
> > -            .aux = &ports,
> > -            .is_switch = true,
> > -            .group_table = &group_table,
> > -            .meter_table = &meter_table,
> > -
> > -            .pipeline = OVNACT_P_INGRESS,
> > -            .ingress_ptable = 8,
> > -            .egress_ptable = 40,
> > -            .output_ptable = 64,
> > -            .mac_bind_ptable = 65,
> > -        };
> > -        struct ofpbuf ofpacts;
> > -        ofpbuf_init(&ofpacts, 0);
> > -        ovnacts_encode(ovnacts.data, ovnacts.size, &ep, &ofpacts);
> > -        struct ds ofpacts_s = DS_EMPTY_INITIALIZER;
> > -        struct ofpact_format_params fp = { .s = &ofpacts_s };
> > -        ofpacts_format(ofpacts.data, ofpacts.size, &fp);
> > -        printf("    encodes as %s\n", ds_cstr(&ofpacts_s));
> > -        ds_destroy(&ofpacts_s);
> > -        ofpbuf_uninit(&ofpacts);
> > -
> > -        /* Print prerequisites if any. */
> > -        if (prereqs) {
> > -            struct ds prereqs_s = DS_EMPTY_INITIALIZER;
> > -            expr_format(prereqs, &prereqs_s);
> > -            printf("    has prereqs %s\n", ds_cstr(&prereqs_s));
> > -            ds_destroy(&prereqs_s);
> > -        }
> > -
> > -        /* Now re-parse and re-format the string to verify that it's
> > -         * round-trippable. */
> > -        struct ofpbuf ovnacts2;
> > -        struct expr *prereqs2;
> > -        ofpbuf_init(&ovnacts2, 0);
> > -        error = ovnacts_parse_string(ds_cstr(&ovnacts_s), &pp, &ovnacts2,
> > -                                     &prereqs2);
> > -        if (!error) {
> > -            struct ds ovnacts2_s = DS_EMPTY_INITIALIZER;
> > -            ovnacts_format(ovnacts2.data, ovnacts2.size, &ovnacts2_s);
> > -            if (strcmp(ds_cstr(&ovnacts_s), ds_cstr(&ovnacts2_s))) {
> > -                printf("    bad reformat: %s\n", ds_cstr(&ovnacts2_s));
> > -            }
> > -            ds_destroy(&ovnacts2_s);
> > -        } else {
> > -            printf("    reparse error: %s\n", error);
> > -            free(error);
> > -        }
> > -        expr_destroy(prereqs2);
> > -
> > -        ovnacts_free(ovnacts2.data, ovnacts2.size);
> > -        ofpbuf_uninit(&ovnacts2);
> > -        ds_destroy(&ovnacts_s);
> > -    } else {
> > -        printf("    %s\n", error);
> > -        free(error);
> > -    }
> > -
> > -    expr_destroy(prereqs);
> > -    ovnacts_free(ovnacts.data, ovnacts.size);
> > -    ofpbuf_uninit(&ovnacts);
> > -
> > -    simap_destroy(&ports);
> > -    expr_symtab_destroy(&symtab);
> > -    shash_destroy(&symtab);
> > -    dhcp_opts_destroy(&dhcp_opts);
> > -    dhcp_opts_destroy(&dhcpv6_opts);
> > -    nd_ra_opts_destroy(&nd_ra_opts);
> > -    ovn_extend_table_destroy(&group_table);
> > -    ovn_extend_table_destroy(&meter_table);
> > -}
> > -
> > -static void
> > -test_parse_expr(const char *input)
> > -{
> > -    struct shash symtab;
> > -    struct shash addr_sets;
> > -    struct shash port_groups;
> > -    struct simap ports;
> > -    struct expr *expr;
> > -    char *error;
> > -
> > -    create_symtab(&symtab);
> > -    create_addr_sets(&addr_sets);
> > -    create_port_groups(&port_groups);
> > -
> > -    simap_init(&ports);
> > -    simap_put(&ports, "eth0", 5);
> > -    simap_put(&ports, "eth1", 6);
> > -    simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL));
> > -    simap_put(&ports, "lsp1", 0x11);
> > -    simap_put(&ports, "lsp2", 0x12);
> > -    simap_put(&ports, "lsp3", 0x13);
> > -
> > -    expr = expr_parse_string(input, &symtab, &addr_sets,
> > -                             &port_groups, &error);
> > -    if (!error) {
> > -        expr = expr_annotate(expr, &symtab, &error);
> > -    }
> > -    if (!error) {
> > -        expr = expr_simplify(expr, is_chassis_resident_cb, &ports);
> > -        expr = expr_normalize(expr);
> > -        ovs_assert(expr_is_normalized(expr));
> > -    }
> > -    if (!error) {
> > -        struct hmap matches;
> > -
> > -        expr_to_matches(expr, lookup_port_cb, &ports, &matches);
> > -        expr_matches_print(&matches, stdout);
> > -        expr_matches_destroy(&matches);
> > -    } else {
> > -        puts(error);
> > -        free(error);
> > -    }
> > -    expr_destroy(expr);
> > -    simap_destroy(&ports);
> > -    expr_symtab_destroy(&symtab);
> > -    shash_destroy(&symtab);
> > -    expr_const_sets_destroy(&addr_sets);
> > -    shash_destroy(&addr_sets);
> > -    expr_const_sets_destroy(&port_groups);
> > -    shash_destroy(&port_groups);
> > -}
> > -
> > -static bool
> > -lookup_atoi_cb(const void *aux OVS_UNUSED, const char *port_name,
> > -               unsigned int *portp)
> > -{
> > -    *portp = atoi(port_name);
> > -    return true;
> > -}
> > -
> > -static void
> > -test_expr_to_packets(const char *input)
> > -{
> > -    struct shash symtab;
> > -    create_symtab(&symtab);
> > -
> > -    struct flow uflow;
> > -    char *error = expr_parse_microflow(input, &symtab, NULL, NULL,
> > -                                       lookup_atoi_cb, NULL, &uflow);
> > -    if (error) {
> > -        puts(error);
> > -        free(error);
> > -        expr_symtab_destroy(&symtab);
> > -        shash_destroy(&symtab);
> > -        return;
> > -    }
> > -
> > -    uint64_t packet_stub[128 / 8];
> > -    struct dp_packet packet;
> > -    dp_packet_use_stub(&packet, packet_stub, sizeof packet_stub);
> > -    flow_compose(&packet, &uflow, NULL, 64);
> > -
> > -    struct ds output = DS_EMPTY_INITIALIZER;
> > -    const uint8_t *buf = dp_packet_data(&packet);
> > -    for (int i = 0; i < dp_packet_size(&packet); i++) {
> > -        uint8_t val = buf[i];
> > -        ds_put_format(&output, "%02"PRIx8, val);
> > -    }
> > -    puts(ds_cstr(&output));
> > -    ds_destroy(&output);
> > -    dp_packet_uninit(&packet);
> > -    expr_symtab_destroy(&symtab);
> > -    shash_destroy(&symtab);
> > -}
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *input_, size_t size)
> > -{
> > -    /* Bail out if we cannot construct at least a 1 char string. */
> > -    const char *input = (const char *) input_;
> > -    if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') ||
> > -        strlen(input) != size - 1) {
> > -        return 0;
> > -    }
> > -
> > -    /* Disable logging to avoid write to disk. */
> > -    static bool isInit = false;
> > -    if (!isInit) {
> > -        vlog_set_verbosity("off");
> > -        isInit = true;
> > -    }
> > -
> > -    /* Parse, annotate, simplify, normalize expr and convert to flows. */
> > -    test_parse_expr(input);
> > -
> > -    /* Parse actions. */
> > -    test_parse_actions(input);
> > -
> > -    /* Test OVN lexer. */
> > -    test_lex(input);
> > -
> > -    /* Expr to packets. */
> > -    test_expr_to_packets(input);
> > -
> > -    return 0;
> > -}
> > diff --git a/tests/oss-fuzz/flow_extract_target.c
> > b/tests/oss-fuzz/flow_extract_target.c
> > deleted file mode 100644
> > index 4a7451411..000000000
> > --- a/tests/oss-fuzz/flow_extract_target.c
> > +++ /dev/null
> > @@ -1,100 +0,0 @@
> > -#include <config.h>
> > -#include "classifier.h"
> > -#include <assert.h>
> > -#include "fuzzer.h"
> > -#include "dp-packet.h"
> > -#include "flow.h"
> > -#include "openvswitch/ofp-match.h"
> > -#include "openvswitch/ofp-print.h"
> > -#include "openvswitch/match.h"
> > -#include "classifier-private.h"
> > -
> > -static void
> > -test_flow_hash(const struct flow *flow)
> > -{
> > -    uint32_t hash = flow_hash_5tuple(flow, 0);
> > -    hash = flow_hash_symmetric_l4(flow, 0);
> > -    hash = flow_hash_symmetric_l2(flow, 0);
> > -    hash = flow_hash_symmetric_l3l4(flow, 0, NULL);
> > -    hash = flow_hash_symmetric_l3(flow, 0);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_ETH_SRC, hash);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L4, hash);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4, hash);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP,
> > hash);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_SRC, hash);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_DST, hash);
> > -    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3, hash);
> > -    ignore(hash);
> > -}
> > -
> > -static void
> > -test_flow_mask(const struct flow *flow)
> > -{
> > -    struct flow_wildcards catchall;
> > -
> > -    flow_wildcards_init_catchall(&catchall);
> > -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_ETH_SRC);
> > -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L4);
> > -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4);
> > -    flow_mask_hash_fields(flow, &catchall,
> > NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP);
> > -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_SRC);
> > -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_DST);
> > -    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3);
> > -}
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> > -{
> > -    struct dp_packet packet;
> > -    struct flow flow;
> > -    dp_packet_use_const(&packet, data, size);
> > -    flow_extract(&packet, &flow);
> > -
> > -    /* Extract flowmap. */
> > -    struct flowmap fmap;
> > -    flow_wc_map(&flow, &fmap);
> > -
> > -    /* Parse TCP flags. */
> > -    if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
> > -        uint16_t tcp_flags = parse_tcp_flags(&packet);
> > -        ignore(tcp_flags);
> > -    }
> > -
> > -    /* Parse TCP flags. */
> > -    if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
> > -        uint16_t tcp_flags = parse_tcp_flags(&packet);
> > -        ignore(tcp_flags);
> > -    }
> > -
> > -    /* Count headers. */
> > -    int count = flow_count_vlan_headers(&flow);
> > -    ignore(count);
> > -
> > -    /* Extract metadata. */
> > -    struct match flow_metadata;
> > -    flow_get_metadata(&flow, &flow_metadata);
> > -
> > -    /* Hashing functions. */
> > -    test_flow_hash(&flow);
> > -
> > -    /* Masking functions. */
> > -    test_flow_mask(&flow);
> > -
> > -    /* Convert flow to match. */
> > -    struct match match;
> > -    match_wc_init(&match, &flow);
> > -
> > -    struct ofp10_match ext_match;
> > -    ofputil_match_to_ofp10_match(&match, &ext_match);
> > -
> > -    /* Print match and packet. */
> > -    ofp_print_packet(stdout, dp_packet_data(&packet),
> > dp_packet_size(&packet),
> > -                     htonl(PT_ETH));
> > -    ovs_hex_dump(stdout, dp_packet_data(&packet),
> > dp_packet_size(&packet), 0,
> > -                 true);
> > -    match_print(&match, NULL);
> > -
> > -    ovs_hex_dump(stdout, &ext_match, sizeof ext_match, 0, false);
> > -
> > -    return 0;
> > -}
> > diff --git a/tests/oss-fuzz/fuzzer.h b/tests/oss-fuzz/fuzzer.h
> > deleted file mode 100644
> > index f87ae59e9..000000000
> > --- a/tests/oss-fuzz/fuzzer.h
> > +++ /dev/null
> > @@ -1,9 +0,0 @@
> > -#ifndef FUZZER_H
> > -#define FUZZER_H 1
> > -
> > -#include <stdint.h>
> > -#include <stddef.h>
> > -
> > -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
> > -
> > -#endif  /* fuzzer.h */
> > diff --git a/tests/oss-fuzz/json_parser_target.c
> > b/tests/oss-fuzz/json_parser_target.c
> > deleted file mode 100644
> > index e39e04a0d..000000000
> > --- a/tests/oss-fuzz/json_parser_target.c
> > +++ /dev/null
> > @@ -1,42 +0,0 @@
> > -#include <config.h>
> > -#include "fuzzer.h"
> > -#include "jsonrpc.h"
> > -#include "openvswitch/json.h"
> > -#include "ovsdb-error.h"
> > -#include "ovsdb/table.h"
> > -#include <assert.h>
> > -#include <string.h>
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> > -{
> > -    if (!size || data[size - 1]) {
> > -        return 0;
> > -    }
> > -
> > -    struct json *j1 = json_from_string((const char *)data);
> > -    if (j1->type == JSON_STRING) {
> > -        json_destroy(j1);
> > -        return 0;
> > -    }
> > -
> > -    free(json_to_string(j1, JSSF_SORT | JSSF_PRETTY));
> > -
> > -    struct jsonrpc_msg *msg;
> > -    char *error = jsonrpc_msg_from_json(j1, &msg); /* Frees 'j1'. */
> > -    if (error) {
> > -        free(error);
> > -        return 0;
> > -    }
> > -
> > -    struct json *j2 = jsonrpc_msg_to_json(msg); /* Frees 'msg'. */
> > -    if (j2->type == JSON_STRING) {
> > -        json_destroy(j2);
> > -        return 0;
> > -    }
> > -
> > -    free(json_to_string(j2, JSSF_SORT | JSSF_PRETTY));
> > -    json_destroy(j2);
> > -
> > -    return 0;
> > -}
> > diff --git a/tests/oss-fuzz/miniflow_target.c
> > b/tests/oss-fuzz/miniflow_target.c
> > deleted file mode 100644
> > index 800375d63..000000000
> > --- a/tests/oss-fuzz/miniflow_target.c
> > +++ /dev/null
> > @@ -1,365 +0,0 @@
> > -#include <config.h>
> > -#include "classifier.h"
> > -#include "fuzzer.h"
> > -#include "dp-packet.h"
> > -#include "flow.h"
> > -#include "openvswitch/ofp-match.h"
> > -#include "openvswitch/ofp-print.h"
> > -#include "openvswitch/match.h"
> > -#include "classifier-private.h"
> > -#include "util.h"
> > -
> > -static void
> > -shuffle_u32s(uint32_t *p, size_t n)
> > -{
> > -    for (; n > 1; n--, p++) {
> > -        uint32_t *q = &p[random_range(n)];
> > -        uint32_t tmp = *p;
> > -        *p = *q;
> > -        *q = tmp;
> > -    }
> > -}
> > -
> > -/* Returns a copy of 'src'.  The caller must eventually free the returned
> > - * miniflow with free(). */
> > -static struct miniflow *
> > -miniflow_clone__(const struct miniflow *src)
> > -{
> > -    struct miniflow *dst;
> > -    size_t data_size;
> > -
> > -    data_size = miniflow_alloc(&dst, 1, src);
> > -    miniflow_clone(dst, src, data_size / sizeof(uint64_t));
> > -    return dst;
> > -}
> > -
> > -/* Returns a hash value for 'flow', given 'basis'. */
> > -static inline uint32_t
> > -miniflow_hash__(const struct miniflow *flow, uint32_t basis)
> > -{
> > -    const uint64_t *p = miniflow_get_values(flow);
> > -    size_t n_values = miniflow_n_values(flow);
> > -    struct flowmap hash_map = FLOWMAP_EMPTY_INITIALIZER;
> > -    uint32_t hash = basis;
> > -    size_t idx;
> > -
> > -    FLOWMAP_FOR_EACH_INDEX (idx, flow->map) {
> > -        uint64_t value = *p++;
> > -
> > -        if (value) {
> > -            hash = hash_add64(hash, value);
> > -            flowmap_set(&hash_map, idx, 1);
> > -        }
> > -    }
> > -    map_t map;
> > -    FLOWMAP_FOR_EACH_MAP (map, hash_map) {
> > -        hash = hash_add64(hash, map);
> > -    }
> > -
> > -    return hash_finish(hash, n_values);
> > -}
> > -
> > -static uint32_t
> > -random_value(void)
> > -{
> > -    static const uint32_t values_[] =
> > -        { 0xffffffff, 0xaaaaaaaa, 0x55555555, 0x80000000,
> > -          0x00000001, 0xface0000, 0x00d00d1e, 0xdeadbeef };
> > -
> > -    return values_[random_range(ARRAY_SIZE(values_))];
> > -}
> > -
> > -static bool
> > -choose(unsigned int n, unsigned int *idxp)
> > -{
> > -    if (*idxp < n) {
> > -        return true;
> > -    } else {
> > -        *idxp -= n;
> > -        return false;
> > -    }
> > -}
> > -
> > -#define FLOW_U32S (FLOW_U64S * 2)
> > -
> > -static bool
> > -init_consecutive_values(int n_consecutive, struct flow *flow,
> > -                        unsigned int *idxp)
> > -{
> > -    uint32_t *flow_u32 = (uint32_t *) flow;
> > -
> > -    if (choose(FLOW_U32S - n_consecutive + 1, idxp)) {
> > -        int i;
> > -
> > -        for (i = 0; i < n_consecutive; i++) {
> > -            flow_u32[i + *idxp] = random_value();
> > -        }
> > -        return true;
> > -    } else {
> > -        return false;
> > -    }
> > -}
> > -
> > -static bool
> > -next_random_flow(struct flow *flow, unsigned int idx)
> > -{
> > -    uint32_t *flow_u32 = (uint32_t *) flow;
> > -
> > -    memset(flow, 0, sizeof *flow);
> > -
> > -    /* Empty flow. */
> > -    if (choose(1, &idx)) {
> > -        return true;
> > -    }
> > -
> > -    /* All flows with a small number of consecutive nonzero values. */
> > -    for (int i = 1; i <= 4; i++) {
> > -        if (init_consecutive_values(i, flow, &idx)) {
> > -            return true;
> > -        }
> > -    }
> > -
> > -    /* All flows with a large number of consecutive nonzero values. */
> > -    for (int i = FLOW_U32S - 4; i <= FLOW_U32S; i++) {
> > -        if (init_consecutive_values(i, flow, &idx)) {
> > -            return true;
> > -        }
> > -    }
> > -
> > -    /* All flows with exactly two nonconsecutive nonzero values. */
> > -    if (choose((FLOW_U32S - 1) * (FLOW_U32S - 2) / 2, &idx)) {
> > -        int ofs1;
> > -
> > -        for (ofs1 = 0; ofs1 < FLOW_U32S - 2; ofs1++) {
> > -            int ofs2;
> > -
> > -            for (ofs2 = ofs1 + 2; ofs2 < FLOW_U32S; ofs2++) {
> > -                if (choose(1, &idx)) {
> > -                    flow_u32[ofs1] = random_value();
> > -                    flow_u32[ofs2] = random_value();
> > -                    return true;
> > -                }
> > -            }
> > -        }
> > -        OVS_NOT_REACHED();
> > -    }
> > -
> > -    /* 16 randomly chosen flows with N >= 3 nonzero values. */
> > -    if (choose(16 * (FLOW_U32S - 4), &idx)) {
> > -        int n = idx / 16 + 3;
> > -
> > -        for (int i = 0; i < n; i++) {
> > -            flow_u32[i] = random_value();
> > -        }
> > -        shuffle_u32s(flow_u32, FLOW_U32S);
> > -
> > -        return true;
> > -    }
> > -
> > -    return false;
> > -}
> > -
> > -static void
> > -any_random_flow(struct flow *flow)
> > -{
> > -    static unsigned int max;
> > -    if (!max) {
> > -        while (next_random_flow(flow, max)) {
> > -            max++;
> > -        }
> > -    }
> > -
> > -    next_random_flow(flow, random_range(max));
> > -}
> > -
> > -static void
> > -toggle_masked_flow_bits(struct flow *flow, const struct flow_wildcards
> > *mask)
> > -{
> > -    const uint32_t *mask_u32 = (const uint32_t *) &mask->masks;
> > -    uint32_t *flow_u32 = (uint32_t *) flow;
> > -    int i;
> > -
> > -    for (i = 0; i < FLOW_U32S; i++) {
> > -        if (mask_u32[i] != 0) {
> > -            uint32_t bit;
> > -
> > -            do {
> > -                bit = 1u << random_range(32);
> > -            } while (!(bit & mask_u32[i]));
> > -            flow_u32[i] ^= bit;
> > -        }
> > -    }
> > -}
> > -
> > -static void
> > -wildcard_extra_bits(struct flow_wildcards *mask)
> > -{
> > -    uint32_t *mask_u32 = (uint32_t *) &mask->masks;
> > -    int i;
> > -
> > -    for (i = 0; i < FLOW_U32S; i++) {
> > -        if (mask_u32[i] != 0) {
> > -            uint32_t bit;
> > -
> > -            do {
> > -                bit = 1u << random_range(32);
> > -            } while (!(bit & mask_u32[i]));
> > -            mask_u32[i] &= ~bit;
> > -        }
> > -    }
> > -}
> > -
> > -static void
> > -test_miniflow(struct flow *flow)
> > -{
> > -    struct miniflow *miniflow, *miniflow2, *miniflow3;
> > -    struct flow flow2, flow3;
> > -    struct flow_wildcards mask;
> > -    struct minimask *minimask;
> > -    int i;
> > -
> > -    const uint64_t *flow_u64 = (const uint64_t *) flow;
> > -
> > -    /* Convert flow to miniflow. */
> > -    miniflow = miniflow_create(flow);
> > -
> > -    /* Obtain miniflow hash. */
> > -    uint32_t hash = miniflow_hash_5tuple(miniflow, 0);
> > -    ignore(hash);
> > -
> > -    /* Check that the flow equals its miniflow. */
> > -    for (i = 0; i < FLOW_MAX_VLAN_HEADERS; i++) {
> > -        ovs_assert(miniflow_get_vid(miniflow, i) ==
> > -               vlan_tci_to_vid(flow->vlans[i].tci));
> > -    }
> > -    for (i = 0; i < FLOW_U64S; i++) {
> > -        ovs_assert(miniflow_get(miniflow, i) == flow_u64[i]);
> > -    }
> > -
> > -    /* Check that the miniflow equals itself. */
> > -    ovs_assert(miniflow_equal(miniflow, miniflow));
> > -
> > -    /* Convert miniflow back to flow and verify that it's the same. */
> > -    miniflow_expand(miniflow, &flow2);
> > -    ovs_assert(flow_equal(flow, &flow2));
> > -    /* Check that copying a miniflow works properly. */
> > -    miniflow2 = miniflow_clone__(miniflow);
> > -    ovs_assert(miniflow_equal(miniflow, miniflow2));
> > -    ovs_assert(miniflow_hash__(miniflow, 0) == miniflow_hash__(miniflow2,
> > 0));
> > -    miniflow_expand(miniflow2, &flow3);
> > -    ovs_assert(flow_equal(flow, &flow3));
> > -
> > -    /* Check that masked matches work as expected for identical flows and
> > -         * miniflows. */
> > -    do {
> > -            next_random_flow(&mask.masks, 1);
> > -    } while (flow_wildcards_is_catchall(&mask));
> > -    minimask = minimask_create(&mask);
> > -    ovs_assert(minimask_is_catchall(minimask)
> > -           == flow_wildcards_is_catchall(&mask));
> > -    ovs_assert(miniflow_equal_in_minimask(miniflow, miniflow2, minimask));
> > -    ovs_assert(miniflow_equal_flow_in_minimask(miniflow, &flow2,
> > minimask));
> > -    ovs_assert(miniflow_hash_in_minimask(miniflow, minimask, 0x12345678)
> > ==
> > -           flow_hash_in_minimask(flow, minimask, 0x12345678));
> > -    ovs_assert(minimask_hash(minimask, 0) ==
> > -           miniflow_hash__(&minimask->masks, 0));
> > -
> > -    /* Check that masked matches work as expected for differing flows and
> > -     * miniflows. */
> > -    toggle_masked_flow_bits(&flow2, &mask);
> > -    ovs_assert(!miniflow_equal_flow_in_minimask(miniflow, &flow2,
> > minimask));
> > -    miniflow3 = miniflow_create(&flow2);
> > -    ovs_assert(!miniflow_equal_in_minimask(miniflow, miniflow3,
> > minimask));
> > -
> > -    free(miniflow);
> > -    free(miniflow2);
> > -    free(miniflow3);
> > -    free(minimask);
> > -}
> > -
> > -static void
> > -test_minimask_has_extra(struct flow *flow)
> > -{
> > -    struct flow_wildcards catchall;
> > -    struct minimask *minicatchall;
> > -
> > -    flow_wildcards_init_catchall(&catchall);
> > -    minicatchall = minimask_create(&catchall);
> > -    ovs_assert(minimask_is_catchall(minicatchall));
> > -
> > -    struct flow_wildcards mask;
> > -    struct minimask *minimask;
> > -
> > -    mask.masks = *flow;
> > -    minimask = minimask_create(&mask);
> > -    ovs_assert(!minimask_has_extra(minimask, minimask));
> > -    ovs_assert(minimask_has_extra(minicatchall, minimask)
> > -           == !minimask_is_catchall(minimask));
> > -    if (!minimask_is_catchall(minimask)) {
> > -        struct minimask *minimask2;
> > -
> > -        wildcard_extra_bits(&mask);
> > -        minimask2 = minimask_create(&mask);
> > -        ovs_assert(minimask_has_extra(minimask2, minimask));
> > -        ovs_assert(!minimask_has_extra(minimask, minimask2));
> > -        free(minimask2);
> > -    }
> > -
> > -    free(minimask);
> > -    free(minicatchall);
> > -}
> > -
> > -static void
> > -test_minimask_combine(struct flow *flow)
> > -{
> > -    struct flow_wildcards catchall;
> > -    struct minimask *minicatchall;
> > -
> > -    flow_wildcards_init_catchall(&catchall);
> > -    minicatchall = minimask_create(&catchall);
> > -    ovs_assert(minimask_is_catchall(minicatchall));
> > -
> > -    struct minimask *minimask, *minimask2;
> > -    struct flow_wildcards mask, mask2, combined, combined2;
> > -    struct {
> > -        struct minimask minicombined;
> > -        uint64_t storage[FLOW_U64S];
> > -    } m;
> > -    struct flow flow2;
> > -
> > -    mask.masks = *flow;
> > -    minimask = minimask_create(&mask);
> > -
> > -    minimask_combine(&m.minicombined, minimask, minicatchall, m.storage);
> > -    ovs_assert(minimask_is_catchall(&m.minicombined));
> > -
> > -    any_random_flow(&flow2);
> > -    mask2.masks = flow2;
> > -    minimask2 = minimask_create(&mask2);
> > -
> > -    minimask_combine(&m.minicombined, minimask, minimask2, m.storage);
> > -    flow_wildcards_and(&combined, &mask, &mask2);
> > -    minimask_expand(&m.minicombined, &combined2);
> > -    ovs_assert(flow_wildcards_equal(&combined, &combined2));
> > -
> > -    free(minimask);
> > -    free(minimask2);
> > -
> > -    free(minicatchall);
> > -}
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> > -{
> > -    struct dp_packet packet;
> > -    struct flow flow;
> > -    dp_packet_use_const(&packet, data, size);
> > -    flow_extract(&packet, &flow);
> > -
> > -    /* Do miniflow tests. */
> > -    test_miniflow(&flow);
> > -    test_minimask_has_extra(&flow);
> > -    test_minimask_combine(&flow);
> > -
> > -    return 0;
> > -}
> > diff --git a/tests/oss-fuzz/odp_target.c b/tests/oss-fuzz/odp_target.c
> > deleted file mode 100644
> > index ae61cdca3..000000000
> > --- a/tests/oss-fuzz/odp_target.c
> > +++ /dev/null
> > @@ -1,149 +0,0 @@
> > -#include <config.h>
> > -#include "fuzzer.h"
> > -#undef NDEBUG
> > -#include "odp-util.h"
> > -#include <stdio.h>
> > -#include "openvswitch/dynamic-string.h"
> > -#include "flow.h"
> > -#include "openvswitch/match.h"
> > -#include "openvswitch/ofpbuf.h"
> > -#include "util.h"
> > -#include "openvswitch/ofp-flow.h"
> > -#include "openvswitch/vlog.h"
> > -
> > -static int
> > -parse_keys(bool wc_keys, const char *in)
> > -{
> > -    int exit_code = 0;
> > -
> > -    enum odp_key_fitness fitness;
> > -    struct ofpbuf odp_key;
> > -    struct ofpbuf odp_mask;
> > -    struct flow flow;
> > -    struct ds out;
> > -    int error;
> > -
> > -    /* Convert string to OVS DP key. */
> > -    ofpbuf_init(&odp_key, 0);
> > -    ofpbuf_init(&odp_mask, 0);
> > -    error = odp_flow_from_string(in, NULL,
> > -                                 &odp_key, &odp_mask, NULL);
> > -    if (error) {
> > -        printf("odp_flow_from_string: error\n");
> > -        goto next;
> > -    }
> > -
> > -    if (!wc_keys) {
> > -        struct odp_flow_key_parms odp_parms = {
> > -            .flow = &flow,
> > -            .support = {
> > -                .recirc = true,
> > -                .ct_state = true,
> > -                .ct_zone = true,
> > -                .ct_mark = true,
> > -                .ct_label = true,
> > -                .max_vlan_headers = SIZE_MAX,
> > -            },
> > -        };
> > -
> > -        /* Convert odp_key to flow. */
> > -        fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size,
> > -                                       &flow, NULL);
> > -        switch (fitness) {
> > -            case ODP_FIT_PERFECT:
> > -                break;
> > -
> > -            case ODP_FIT_TOO_LITTLE:
> > -                printf("ODP_FIT_TOO_LITTLE: ");
> > -                break;
> > -
> > -            case ODP_FIT_TOO_MUCH:
> > -                printf("ODP_FIT_TOO_MUCH: ");
> > -                break;
> > -
> > -            case ODP_FIT_ERROR:
> > -                printf("odp_flow_key_to_flow: error\n");
> > -                goto next;
> > -        }
> > -        /* Convert cls_rule back to odp_key. */
> > -        ofpbuf_uninit(&odp_key);
> > -        ofpbuf_init(&odp_key, 0);
> > -        odp_flow_key_from_flow(&odp_parms, &odp_key);
> > -
> > -        if (odp_key.size > ODPUTIL_FLOW_KEY_BYTES) {
> > -            printf ("too long: %"PRIu32" > %d\n",
> > -                    odp_key.size, ODPUTIL_FLOW_KEY_BYTES);
> > -            exit_code = 1;
> > -        }
> > -    }
> > -
> > -    /* Convert odp_key to string. */
> > -    ds_init(&out);
> > -    if (wc_keys) {
> > -        odp_flow_format(odp_key.data, odp_key.size,
> > -                        odp_mask.data, odp_mask.size, NULL, &out, false);
> > -    } else {
> > -        odp_flow_key_format(odp_key.data, odp_key.size, &out);
> > -    }
> > -    puts(ds_cstr(&out));
> > -    ds_destroy(&out);
> > -
> > -next:
> > -    ofpbuf_uninit(&odp_key);
> > -    ofpbuf_uninit(&odp_mask);
> > -
> > -    return exit_code;
> > -}
> > -
> > -static int
> > -parse_actions(const char *in)
> > -{
> > -    struct ofpbuf odp_actions;
> > -    struct ds out;
> > -    int error;
> > -
> > -    /* Convert string to OVS DP actions. */
> > -    ofpbuf_init(&odp_actions, 0);
> > -    error = odp_actions_from_string(in, NULL, &odp_actions);
> > -    if (error) {
> > -        printf("odp_actions_from_string: error\n");
> > -        goto next;
> > -    }
> > -
> > -    /* Convert odp_actions back to string. */
> > -    ds_init(&out);
> > -    format_odp_actions(&out, odp_actions.data, odp_actions.size, NULL);
> > -    puts(ds_cstr(&out));
> > -    ds_destroy(&out);
> > -
> > -next:
> > -    ofpbuf_uninit(&odp_actions);
> > -    return 0;
> > -}
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> > -{
> > -    /* Bail out if we cannot construct at least a 1 char string. */
> > -    const char *input = (const char *) data;
> > -    if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') ||
> > -        strlen(input) != size - 1) {
> > -        return 0;
> > -    }
> > -
> > -    /* Disable logging to avoid write to disk. */
> > -    static bool isInit = false;
> > -    if (!isInit) {
> > -        vlog_set_verbosity("off");
> > -        isInit = true;
> > -    }
> > -
> > -    /* Parse keys and wc keys. */
> > -    parse_keys(false, input);
> > -    parse_keys(true, input);
> > -
> > -    /* Parse actions. */
> > -    parse_actions(input);
> > -
> > -    return 0;
> > -}
> > diff --git a/tests/oss-fuzz/ofctl_parse_target.c
> > b/tests/oss-fuzz/ofctl_parse_target.c
> > deleted file mode 100644
> > index b4db52f7e..000000000
> > --- a/tests/oss-fuzz/ofctl_parse_target.c
> > +++ /dev/null
> > @@ -1,113 +0,0 @@
> > -#include <config.h>
> > -#include "fuzzer.h"
> > -#include "openvswitch/ofp-flow.h"
> > -#include "ofp-version-opt.h"
> > -#include "ofproto/ofproto.h"
> > -#include "openflow/openflow.h"
> > -#include "openvswitch/ofpbuf.h"
> > -#include "openvswitch/vlog.h"
> > -#include "util.h"
> > -
> > -static void
> > -ofctl_parse_flows__(struct ofputil_flow_mod *fms, size_t n_fms,
> > -                    enum ofputil_protocol usable_protocols)
> > -{
> > -    enum ofputil_protocol protocol = 0;
> > -    char *usable_s;
> > -    size_t i;
> > -
> > -    usable_s = ofputil_protocols_to_string(usable_protocols);
> > -    printf("usable protocols: %s\n", usable_s);
> > -    free(usable_s);
> > -
> > -    if (!(usable_protocols & OFPUTIL_P_ANY)) {
> > -        printf("no usable protocol\n");
> > -        goto free;
> > -    }
> > -    for (i = 0; i < sizeof(enum ofputil_protocol) * CHAR_BIT; i++) {
> > -        protocol = 1u << i;
> > -        if (protocol & usable_protocols & OFPUTIL_P_ANY) {
> > -            break;
> > -        }
> > -    }
> > -    ovs_assert(is_pow2(protocol));
> > -
> > -    printf("chosen protocol: %s\n", ofputil_protocol_to_string(protocol));
> > -
> > -    for (i = 0; i < n_fms; i++) {
> > -        struct ofputil_flow_mod *fm = &fms[i];
> > -        struct ofpbuf *msg;
> > -
> > -        msg = ofputil_encode_flow_mod(fm, protocol);
> > -        ofpbuf_delete(msg);
> > -    }
> > -
> > -free:
> > -    for (i = 0; i < n_fms; i++) {
> > -        struct ofputil_flow_mod *fm = &fms[i];
> > -        free(CONST_CAST(struct ofpact *, fm->ofpacts));
> > -        minimatch_destroy(&fm->match);
> > -    }
> > -}
> > -
> > -/* "parse-flow FLOW": parses the argument as a flow (like add-flow) and
> > prints
> > - * it back to stdout.  */
> > -static void
> > -ofctl_parse_flow(const char *input, int command)
> > -{
> > -    enum ofputil_protocol usable_protocols;
> > -    struct ofputil_flow_mod fm;
> > -    char *error;
> > -
> > -    error = parse_ofp_flow_mod_str(&fm, input, NULL, NULL,
> > -                                   command, &usable_protocols);
> > -    if (error) {
> > -        printf("Error encountered: %s\n", error);
> > -        free(error);
> > -    } else {
> > -        ofctl_parse_flows__(&fm, 1, usable_protocols);
> > -    }
> > -}
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> > -{
> > -    /* Bail out if we cannot construct at least a 1 char string.
> > -     * Reserve 1 byte to decide flow mod command.
> > -     *
> > -     * Here's the structure of data we expect
> > -     * |--Byte 1--|--Byte 2--|...|--Byte (size-1)--|
> > -     *
> > -     * where,
> > -     *
> > -     * Byte 1: Used to decide which ofp flow mod command to test
> > -     * Bytes 2--(size-1): The C string that is actually passed to
> > -     *                    ofctl_parse_flow() test API.
> > -     *
> > -     * This means that the fuzzed input is actually a C string of
> > -     * length = (size -2) with the terminal byte being the NUL
> > -     * character. Moreover, this string is expected to not contain
> > -     * a new-line character.
> > -     */
> > -    const char *stream = (const char *) data;
> > -    if (size < 3 || stream[size - 1] != '\0' || strchr(&stream[1], '\n')
> > ||
> > -        strlen(&stream[1]) != size - 2) {
> > -        return 0;
> > -    }
> > -
> > -    /* Disable logging to avoid write to disk. */
> > -    static bool isInit = false;
> > -    if (!isInit) {
> > -        vlog_set_verbosity("off");
> > -        isInit = true;
> > -    }
> > -
> > -    /* Decide test parameters using first byte of fuzzed input. */
> > -    int command = (stream[0] % OFPFC_DELETE_STRICT) + 1;
> > -
> > -    /* Fuzz extended match parsing. */
> > -    const char *input = &stream[1];
> > -    ofctl_parse_flow(input, command);
> > -
> > -    return 0;
> > -}
> > diff --git a/tests/oss-fuzz/ofp_print_target.c
> > b/tests/oss-fuzz/ofp_print_target.c
> > deleted file mode 100644
> > index 126f2623f..000000000
> > --- a/tests/oss-fuzz/ofp_print_target.c
> > +++ /dev/null
> > @@ -1,47 +0,0 @@
> > -#include <config.h>
> > -#include "fuzzer.h"
> > -#include "dp-packet.h"
> > -#include "openvswitch/ofp-print.h"
> > -#include "openvswitch/ofpbuf.h"
> > -#include "openvswitch/vlog.h"
> > -
> > -int
> > -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
> > -{
> > -    if (size < sizeof(struct ofp_header)) {
> > -        return 0;
> > -    }
> > -
> > -    static bool isInit = false;
> > -    if (!isInit) {
> > -        vlog_set_verbosity("off");
> > -        isInit = true;
> > -    }
> > -
> > -    struct ofpbuf b;
> > -    ofpbuf_use_const(&b, data, size);
> > -    for (;;) {
> > -        /* Check if ofpbuf contains ofp header. */
> > -        struct ofp_header *oh = ofpbuf_at(&b, 0, sizeof *oh);
> > -        if (!oh) {
> > -            break;
> > -        }
> > -
> > -        /* Check if length is geq than lower bound. */
> > -        size_t length = ntohs(oh->length);
> > -        if (length < sizeof *oh) {
> > -            break;
> > -        }
> > -
> > -        /* Check if ofpbuf contains payload. */
> > -        size_t tail_len = length - sizeof *oh;
> > -        void *tail = ofpbuf_at(&b, sizeof *oh, tail_len);
> > -        if (!tail) {
> > -            break;
> > -        }
> > -
> > -        ofp_print(stdout, ofpbuf_pull(&b, length), length, NULL, NULL, 2);
> > -    }
> > -    ofpbuf_uninit(&b);
> > -    return 0;
> > -}
> > --
> > 2.17.1
> >
> >
> 
> -- 
> Bhargava Shastry
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff mbox series

Patch

diff --git a/tests/automake.mk b/tests/automake.mk
index 013e59280..e86a5273e 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -246,5 +246,3 @@  clean-pki:
 	rm -f tests/pki/stamp
 	rm -rf tests/pki
 endif
-
-include tests/oss-fuzz/automake.mk
diff --git a/tests/oss-fuzz/automake.mk b/tests/oss-fuzz/automake.mk
deleted file mode 100644
index 5bf7d0d7c..000000000
--- a/tests/oss-fuzz/automake.mk
+++ /dev/null
@@ -1,66 +0,0 @@ 
-OSS_FUZZ_TARGETS = \
-	tests/oss-fuzz/flow_extract_target \
-	tests/oss-fuzz/json_parser_target \
-	tests/oss-fuzz/ofp_print_target \
-	tests/oss-fuzz/expr_parse_target \
-	tests/oss-fuzz/odp_target \
-	tests/oss-fuzz/miniflow_target \
-	tests/oss-fuzz/ofctl_parse_target
-EXTRA_PROGRAMS += $(OSS_FUZZ_TARGETS)
-oss-fuzz-targets: $(OSS_FUZZ_TARGETS)
-
-tests_oss_fuzz_flow_extract_target_SOURCES = \
-	tests/oss-fuzz/flow_extract_target.c \
-	tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_flow_extract_target_LDADD = lib/libopenvswitch.la
-tests_oss_fuzz_flow_extract_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-tests_oss_fuzz_json_parser_target_SOURCES = \
-	tests/oss-fuzz/json_parser_target.c \
-	tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_json_parser_target_LDADD = lib/libopenvswitch.la
-tests_oss_fuzz_json_parser_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-tests_oss_fuzz_ofp_print_target_SOURCES = \
-	tests/oss-fuzz/ofp_print_target.c \
-	tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_ofp_print_target_LDADD = lib/libopenvswitch.la
-tests_oss_fuzz_ofp_print_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-tests_oss_fuzz_expr_parse_target_SOURCES = \
-        tests/oss-fuzz/expr_parse_target.c \
-        tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_expr_parse_target_LDADD = lib/libopenvswitch.la \
-                                         ovn/lib/libovn.la
-tests_oss_fuzz_expr_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-tests_oss_fuzz_odp_target_SOURCES = \
-        tests/oss-fuzz/odp_target.c \
-        tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_odp_target_LDADD = lib/libopenvswitch.la
-tests_oss_fuzz_odp_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-tests_oss_fuzz_miniflow_target_SOURCES = \
-        tests/oss-fuzz/miniflow_target.c \
-        tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_miniflow_target_LDADD = lib/libopenvswitch.la
-tests_oss_fuzz_miniflow_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-tests_oss_fuzz_ofctl_parse_target_SOURCES = \
-        tests/oss-fuzz/ofctl_parse_target.c \
-        tests/oss-fuzz/fuzzer.h
-tests_oss_fuzz_ofctl_parse_target_LDADD = lib/libopenvswitch.la
-tests_oss_fuzz_ofctl_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++
-
-EXTRA_DIST += \
-	tests/oss-fuzz/config/flow_extract_target.options \
-	tests/oss-fuzz/config/json_parser_target.options \
-	tests/oss-fuzz/config/ofp_print_target.options \
-	tests/oss-fuzz/config/expr_parse_target.options \
-	tests/oss-fuzz/config/odp_target.options \
-	tests/oss-fuzz/config/miniflow_target.options \
-        tests/oss-fuzz/config/ofctl_parse_target.options \
-	tests/oss-fuzz/config/ovs.dict \
-	tests/oss-fuzz/config/expr.dict \
-	tests/oss-fuzz/config/odp.dict \
-	tests/oss-fuzz/config/ofp-flow.dict
diff --git a/tests/oss-fuzz/config/expr.dict b/tests/oss-fuzz/config/expr.dict
deleted file mode 100644
index 03741ad7d..000000000
--- a/tests/oss-fuzz/config/expr.dict
+++ /dev/null
@@ -1,120 +0,0 @@ 
-" = "
-" = ("
-" = dns_lookup();"
-" { "
-" };"
-"!"
-"!="
-"$"
-"&&"
-"("
-"()"
-")"
-"),commit,table=,zone=NXM_NX_REG)"
-");"
-", "
-", meter=\"\""
-","
-",bucket=bucket_id=,weight:100,actions=ct(nat(dst="
-"--"
-".."
-"/"
-"/%"
-"0"
-":"
-"<"
-"<->"
-"<="
-"="
-"=="
-"=r"
-">"
-">="
-"["
-"\x00"
-"\x28"
-"]"
-"]:"
-"allow"
-"arp"
-"bool"
-"bswap "
-"bswap %0"
-"cc"
-"clone"
-"ct_clear"
-"ct_clear;"
-"ct_commit"
-"ct_commit("
-"ct_dnat"
-"ct_label"
-"ct_label="
-"ct_lb"
-"ct_mark"
-"ct_mark="
-"ct_mark=%#x"
-"ct_next"
-"ct_next;"
-"ct_snat"
-"decimal"
-"dhcpv6_stateful"
-"dhcpv6_stateless"
-"dns_lookup"
-"drop"
-"drop;"
-"egress"
-"error("
-"get_arp"
-"get_nd"
-"hexadecimal"
-"icmp4"
-"icmp6"
-"ingress"
-"ip.ttl"
-"ip.ttl--;"
-"ipv4"
-"ipv6"
-"log"
-"log("
-"mac"
-"meter"
-"name"
-"name=\"\", "
-"nd_na"
-"nd_na_router"
-"nd_ns"
-"next"
-"next();"
-"next(pipeline=, table=);"
-"next;"
-"output"
-"output;"
-"pipeline"
-"put_arp"
-"put_dhcp_opts"
-"put_dhcpv6_opts"
-"put_nd"
-"put_nd_ra_opts"
-"reject"
-"set_meter"
-"set_meter();"
-"set_meter(, );"
-"set_meter(,);"
-"set_queue"
-"set_queue();"
-"severity"
-"severity="
-"slaac"
-"static_routes"
-"str"
-"table"
-"tcp_reset"
-"type=select,selection_method=dp_hash"
-"uint16"
-"uint32"
-"uint8"
-"verdict"
-"verdict=, "
-"{"
-"||"
-"}"
diff --git a/tests/oss-fuzz/config/expr_parse_target.options b/tests/oss-fuzz/config/expr_parse_target.options
deleted file mode 100644
index fc254e84f..000000000
--- a/tests/oss-fuzz/config/expr_parse_target.options
+++ /dev/null
@@ -1,3 +0,0 @@ 
-[libfuzzer]
-dict = expr.dict
-close_fd_mask = 3
diff --git a/tests/oss-fuzz/config/flow_extract_target.options b/tests/oss-fuzz/config/flow_extract_target.options
deleted file mode 100644
index 81ad7f18c..000000000
--- a/tests/oss-fuzz/config/flow_extract_target.options
+++ /dev/null
@@ -1,3 +0,0 @@ 
-[libfuzzer]
-dict = ovs.dict
-close_fd_mask = 3
diff --git a/tests/oss-fuzz/config/json_parser_target.options b/tests/oss-fuzz/config/json_parser_target.options
deleted file mode 100644
index 8d3739a53..000000000
--- a/tests/oss-fuzz/config/json_parser_target.options
+++ /dev/null
@@ -1,2 +0,0 @@ 
-[libfuzzer]
-dict = json.dict
diff --git a/tests/oss-fuzz/config/miniflow_target.options b/tests/oss-fuzz/config/miniflow_target.options
deleted file mode 100644
index 4849f282d..000000000
--- a/tests/oss-fuzz/config/miniflow_target.options
+++ /dev/null
@@ -1,3 +0,0 @@ 
-[libfuzzer]
-dict = ovs.dict
-close_fd_mask = 3
\ No newline at end of file
diff --git a/tests/oss-fuzz/config/odp.dict b/tests/oss-fuzz/config/odp.dict
deleted file mode 100644
index a9bdd3e99..000000000
--- a/tests/oss-fuzz/config/odp.dict
+++ /dev/null
@@ -1,170 +0,0 @@ 
-"("
-")"
-","
-"/0x"
-"0x"
-": "
-"="
-"=r"
-"action"
-"arp"
-"bfd"
-"bos"
-"c1"
-"c2"
-"c3"
-"c4"
-"cc"
-"cfi"
-"cfm"
-"class"
-"clone"
-"code"
-"commit,"
-"crit,"
-"csum"
-"ct"
-"ct(error)"
-"ct_clear"
-"ct_label"
-"ct_mark"
-"ct_state"
-"ct_tuple4"
-"ct_tuple6"
-"ct_zone"
-"dir"
-"dl_type"
-"dnat"
-"dp_hash"
-"drop"
-"dst"
-"dst_port"
-"egress"
-"encap"
-"error"
-"erspan"
-"erspan(ver=1,sid=0x,dir=,idx=0x)"
-"est"
-"eth"
-"eth_type"
-"eth_type(0/)"
-"first"
-"flags"
-"force_commit,"
-"frag"
-"gbp("
-"geneve"
-"gre((flags=0x,proto=0x)"
-"hash,"
-"helper"
-"hlimit"
-"hwid"
-"icmp"
-"icmpv6"
-"id"
-"idx="
-"in_port"
-"ingress"
-"inv"
-"ip6erspan"
-"ipfix(output_port="
-"ipv4"
-"ipv6"
-"ipv6_dst"
-"ipv6_src"
-"l4()"
-"label"
-"lacp"
-"later"
-"len"
-"lldp"
-"mark=/,"
-"match"
-"md2"
-"mdtype"
-"meter()"
-"mpls"
-"nat"
-"nd"
-"new"
-"no"
-"np"
-"ns"
-"nsh"
-"oam,"
-"op"
-"options("
-"out_port("
-"packet_type"
-"pcp="
-"persistent,"
-"pop_eth"
-"pop_mpls(eth_type=0x)"
-"pop_nsh()"
-"pop_vlan"
-"proto"
-"push_eth(src=:::::,dst=:::::,type=)"
-"push_mpls("
-"push_nsh("
-"push_vlan("
-"push_vlan(tpid=,vid=,pcp=,cfi=)"
-"random,"
-"recirc()"
-"recirc_id"
-"rel"
-"rpl"
-"sFlow(vid=,pcp=,output=)"
-"sample"
-"sctp"
-"seq=0x"
-"set("
-"set(nsh("
-"sha"
-"si"
-"sip"
-"skb_mark"
-"skb_priority"
-"sll"
-"slow_path"
-"snat"
-"spi"
-"src"
-"src_port"
-"stp"
-"sym_l4()"
-"target"
-"tc="
-"tclass"
-"tcp"
-"tcp_flags"
-"tha"
-"tip"
-"tll"
-"tnl_pop("
-"tnl_push(tnl_port("
-"too_little"
-"too_much"
-"tos"
-"tp_dst"
-"tp_src"
-"tpid=0x"
-"trk"
-"trunc()"
-"ttl"
-"tun_id"
-"tunnel"
-"tunnel_out_port"
-"type"
-"udp"
-"unspec"
-"userdata"
-"userspace("
-"userspace(error)"
-"userspace(pid"
-"ver"
-"vid"
-"vlan"
-"vxlan"
-"vxlan(flags=0x,vni=0x)"
-"vxlan(gbp("
-"zone"
diff --git a/tests/oss-fuzz/config/odp_target.options b/tests/oss-fuzz/config/odp_target.options
deleted file mode 100644
index 41821b8c1..000000000
--- a/tests/oss-fuzz/config/odp_target.options
+++ /dev/null
@@ -1,3 +0,0 @@ 
-[libfuzzer]
-close_fd_mask = 3
-dict = odp.dict
diff --git a/tests/oss-fuzz/config/ofctl_parse_target.options b/tests/oss-fuzz/config/ofctl_parse_target.options
deleted file mode 100644
index 6d67dd6ad..000000000
--- a/tests/oss-fuzz/config/ofctl_parse_target.options
+++ /dev/null
@@ -1,3 +0,0 @@ 
-[libfuzzer]
-close_fd_mask = 3
-dict = ofp-flow.dict
diff --git a/tests/oss-fuzz/config/ofp-flow.dict b/tests/oss-fuzz/config/ofp-flow.dict
deleted file mode 100644
index 01175e5eb..000000000
--- a/tests/oss-fuzz/config/ofp-flow.dict
+++ /dev/null
@@ -1,45 +0,0 @@ 
-")"
-"("
-"["
-"]"
-","
-"-"
-"0"
-":"
-"="
-"ADD"
-"DEL"
-"DEL_STRICT"
-"MOD"
-"MOD_STRICT"
-"\x00"
-"\x20"
-"\x3F"
-"actions"
-"add"
-"allow_hidden_fields"
-"cc"
-"check_overlap"
-"cookie"
-"delete"
-"delete_strict"
-"duration"
-"eth"
-"hard_age"
-"hard_timeout"
-"idle_age"
-"idle_timeout"
-"importance"
-"modify"
-"modify_strict"
-"n_bytes"
-"n_packets"
-"no_byte_counts"
-"no_packet_counts"
-"no_readonly_table"
-"out_group"
-"out_port"
-"priority"
-"reset_counts"
-"send_flow_rem"
-"table"
diff --git a/tests/oss-fuzz/config/ofp_print_target.options b/tests/oss-fuzz/config/ofp_print_target.options
deleted file mode 100644
index 7f117292e..000000000
--- a/tests/oss-fuzz/config/ofp_print_target.options
+++ /dev/null
@@ -1,3 +0,0 @@ 
-[libfuzzer]
-close_fd_mask = 3
-dict = ovs.dict
diff --git a/tests/oss-fuzz/config/ovs.dict b/tests/oss-fuzz/config/ovs.dict
deleted file mode 100644
index 243b243ab..000000000
--- a/tests/oss-fuzz/config/ovs.dict
+++ /dev/null
@@ -1,293 +0,0 @@ 
-"0.2"
-"ADD_SUBSCRIBE"
-"-cbc"
-"CLEARSUB"
-"CLIENT"
-"GIMME"
-"GIMMEDEFS"
-"GIMMESTATS"
-"HM"
-"-hmac96"
-"HM_CTL"
-"HM_STAT"
-"HMST_CLIENT"
-"LOGIN"
-"\\MAILSLOT\\BROWSE"
-"NET-ANNOUNCED"
-"NET-VISIBLE"
-"-nodefs"
-"NONE"
-"OPSTAFF"
-"\\PIPE\\LANMAN"
-"public"
-"REALM"
-"REALM-ANNOUNCED"
-"REALM-VISIBLE"
-"REQ_SUBSCRIBE"
-"RLM_SUBSCRIBE"
-"RLM_UNSUBSCRIBE"
-"SENT"
-" %ssub%s"
-"SUBSCRIBE"
-"SUBSCRIBE_NODEFS"
-"un"
-"UNSUBSCRIBE"
-"USER_FLUSH"
-"USER_HIDE"
-"USER_LOCATE"
-"USER_UNHIDE"
-"WG_CTL"
-"\x01\x00"
-"\x01\x00\x00"
-"\x01\x00\x01"
-"\x01\x00\x02"
-"\x01\x00\x03"
-"\x01\x00\x05"
-"\x01\x01"
-"\x01\x02"
-"\x01\x03"
-"\x01\x04"
-"\x01\x05"
-"\x01\x07"
-"\x01\x0B"
-"\x01\x0C"
-"\x01\x10"
-"\x01\x11"
-"\x01\x12"
-"\x01\x13"
-"\x01\x14"
-"\x01\x15"
-"\x01\x16"
-"\x01\xE8\x48"
-"\x01\xF4"
-"\x01\xF5"
-"\x01\xF6"
-"\x01\xF7"
-"\x01\xF8"
-"\x01\xF9"
-"\x01\xFA"
-"\x01\xFB"
-"\x01\xFC"
-"\x01\xFD"
-"\x01\xFE"
-"\x01\xFF"
-"\x02\x00"
-"\x02\x00\x00"
-"\x02\x01"
-"\x02\x02"
-"\x02\x03"
-"\x02\x04"
-"\x02\x05"
-"\x02\x06"
-"\x02\x07"
-"\x02\x08"
-"\x02\x09"
-"\x02\x0C"
-"\x02\x0E"
-"\x02\x0F"
-"\x02\x11"
-"\x02\x12"
-"\x02\x58"
-"\x02\x81"
-"\x02\x83"
-"\x03\x00"
-"\x03\x01"
-"\x03\x02"
-"\x03\x03"
-"\x03\x06"
-"\x03\xE8"
-"\x03\xE9"
-"\x03\xEA"
-"\x03\xEB"
-"\x03\xEC"
-"\x03\xED"
-"\x03\xEE"
-"\x03\xEF"
-"\x03\xF0"
-"\x03\xF1"
-"\x03\xF2"
-"\x03\xF3"
-"\x03\xF4"
-"\x03\xFF\xFF\xFF"
-"\x04\x00"
-"\x04\x00\x00"
-"\x04\x01"
-"\x04\x02"
-"\x04\x03"
-"\x04\x04"
-"\x04\x51"
-"\x04\x52"
-"\x04\x53"
-"\x04\x55"
-"\x04\x56"
-"\x05\x00"
-"\x05\x01"
-"\x05\x02"
-"\x05\x03"
-"\x05\x53"
-"\x05\xCC"
-"\x05\xDC"
-"\x06\x00"
-"\x06\x01"
-"\x06\xCF"
-"\x07\x07"
-"\x07\xC1"
-"\x07\xFF"
-"\x08\x00"
-"\x08\x00\x00\x00"
-"\x08\x00\x07"
-"\x08\x01"
-"\x08\x06"
-"\x08\x38\x00\x00"
-"\x0A\x00\xB1"
-"\x0C\x01"
-"\x0C\x02"
-"\x0C\x03"
-"\x0C\x04"
-"\x0C\x05"
-"\x0C\x06"
-"\x0C\x08"
-"\x0D\x80"
-"\x0E\x00"
-"\x0E\x10"
-"\x0E\xC8"
-"\x0E\xC9"
-"\x0F\x42\x40"
-"\x0F\xFF"
-"\x10\x00"
-"\x11\x11"
-"\x11\xD7"
-"\x12\x0F"
-"\x12\xBB"
-"\x1A\x30"
-"\x1A\x31"
-"\x1A\x32"
-"\x1B\x21"
-"\x1B\x58"
-"\x1B\x59"
-"\x1B\x5A"
-"\x1B\x5B"
-"\x1B\x5C"
-"\x1B\x5D"
-"\x1B\x5F"
-"\x1B\x61"
-"\x1F\x00"
-"\x1F\x40"
-"\x1F\xFF"
-"\x1F\xFF\xFF"
-"\x20\x00"
-"\x20\x03"
-"\x20\x04"
-"\x27\x10"
-"\x27\x13"
-"\x2F\xBF"
-"\x35\x00\x00"
-"\x3C\x13"
-"\x40\x00"
-"\x40\x04"
-"\x40\x80"
-"\x47\x00\x06\x01"
-"\x4E\x20"
-"\x4E\x21"
-"\x4E\x22"
-"\x4E\x23"
-"\x4E\x24"
-"\x4E\x25"
-"\x4E\x26"
-"\x4E\x27"
-"\x4E\x28"
-"\x4E\x29"
-"\x4E\x2A"
-"\x4E\x2C"
-"\x60\x00"
-"\x60\x01"
-"\x60\x02"
-"\x60\x03"
-"\x60\x04"
-"\x60\x07"
-"\x7F\xFF"
-"\x7F\xFF\xFF"
-"\x80\x00"
-"\x80\x00\x00\x00"
-"\x80\x01"
-"\x80\x05"
-"\x80\x0A"
-"\x80\x21"
-"\x80\x21\x10\x01"
-"\x80\x21\x10\x02"
-"\x80\x23"
-"\x80\x35"
-"\x80\x57"
-"\x80\x9B"
-"\x80\xC2"
-"\x80\xF3"
-"\x80\xFD"
-"\x81\x00"
-"\x81\x37"
-"\x82\x81"
-"\x83\xAA\x7E\x80"
-"\x85\xBE"
-"\x86\xDD"
-"\x88\x08"
-"\x88\x09"
-"\x88\x0B"
-"\x88\x47"
-"\x88\x48"
-"\x88\x63"
-"\x88\x64"
-"\x88\x6F"
-"\x88\x70"
-"\x88\x8E"
-"\x88\x99"
-"\x88\xA2"
-"\x88\xA8"
-"\x88\xCA"
-"\x88\xCC"
-"\x89\x02"
-"\x89\x3A"
-"\x89\x47"
-"\x90\x00"
-"\x91\x00"
-"\xA0\x00"
-"\xAB\xCD"
-"\xB0\x00"
-"\xC0\x00\x00\x00"
-"\xC0\x21"
-"\xC0\x23"
-"\xC0\x25"
-"\xC0\x27"
-"\xC0\x2B"
-"\xC0\x2D"
-"\xC1\x23"
-"\xC2\x23"
-"\xC2\x27"
-"\xDA\xDA"
-"\xE0\x00"
-"\xE0\x00\x00\x00"
-"\xF0\x00\x00\x00"
-"\xF1\x0A"
-"\xF9\x89"
-"\xFC\x00"
-"\xFD\xE9"
-"\xFE\xFE"
-"\xFF\x00"
-"\xFF\x00\x00"
-"\xFF\x00\x00\x00"
-"\xFF\xF0"
-"\xFF\xF8"
-"\xFF\xFD"
-"\xFF\xFE"
-"\xFF\xFF"
-"\xFF\xFF\x00\x00"
-"\xFF\xFF\xF0\x00"
-"\xFF\xFF\xFF\x00"
-"\xFF\xFF\xFF\x01"
-"\xFF\xFF\xFF\x02"
-"\xFF\xFF\xFF\x03"
-"\xFF\xFF\xFF\xEF"
-"\xFF\xFF\xFF\xFD"
-"\xFF\xFF\xFF\xFE"
-"\xFF\xFF\xFF\xFF"
-"ZEPH"
-"ZEPHYR_ADMIN"
-"ZEPHYR_CTL"
diff --git a/tests/oss-fuzz/expr_parse_target.c b/tests/oss-fuzz/expr_parse_target.c
deleted file mode 100644
index 1a3893858..000000000
--- a/tests/oss-fuzz/expr_parse_target.c
+++ /dev/null
@@ -1,464 +0,0 @@ 
-#include <config.h>
-#include "fuzzer.h"
-#include <errno.h>
-#include <getopt.h>
-#include <sys/wait.h>
-
-#include "command-line.h"
-#include "dp-packet.h"
-#include "fatal-signal.h"
-#include "flow.h"
-#include "openvswitch/dynamic-string.h"
-#include "openvswitch/match.h"
-#include "openvswitch/ofp-actions.h"
-#include "openvswitch/ofpbuf.h"
-#include "openvswitch/vlog.h"
-#include "ovn/actions.h"
-#include "ovn/expr.h"
-#include "ovn/lex.h"
-#include "ovn/lib/logical-fields.h"
-#include "ovn/lib/ovn-l7.h"
-#include "ovn/lib/extend-table.h"
-#include "openvswitch/shash.h"
-#include "simap.h"
-#include "util.h"
-
-static void
-compare_token(const struct lex_token *a, const struct lex_token *b)
-{
-    if (a->type != b->type) {
-        fprintf(stderr, "type differs: %d -> %d\n", a->type, b->type);
-        return;
-    }
-
-    if (!((a->s && b->s && !strcmp(a->s, b->s))
-          || (!a->s && !b->s))) {
-        fprintf(stderr, "string differs: %s -> %s\n",
-                a->s ? a->s : "(null)",
-                b->s ? b->s : "(null)");
-        return;
-    }
-
-    if (a->type == LEX_T_INTEGER || a->type == LEX_T_MASKED_INTEGER) {
-        if (memcmp(&a->value, &b->value, sizeof a->value)) {
-            fprintf(stderr, "value differs\n");
-            return;
-        }
-
-        if (a->type == LEX_T_MASKED_INTEGER
-            && memcmp(&a->mask, &b->mask, sizeof a->mask)) {
-            fprintf(stderr, "mask differs\n");
-            return;
-        }
-
-        if (a->format != b->format
-            && !(a->format == LEX_F_HEXADECIMAL
-                 && b->format == LEX_F_DECIMAL
-                 && a->value.integer == 0)) {
-            fprintf(stderr, "format differs: %d -> %d\n",
-                    a->format, b->format);
-        }
-    }
-}
-
-static void
-test_lex(const char *input)
-{
-    struct ds output;
-
-    ds_init(&output);
-    struct lexer lexer;
-
-    lexer_init(&lexer, input);
-    ds_clear(&output);
-    while (lexer_get(&lexer) != LEX_T_END) {
-        size_t len = output.length;
-        lex_token_format(&lexer.token, &output);
-
-        /* Check that the formatted version can really be parsed back
-         * losslessly. */
-        if (lexer.token.type != LEX_T_ERROR) {
-            const char *s = ds_cstr(&output) + len;
-            struct lexer l2;
-
-            lexer_init(&l2, s);
-            lexer_get(&l2);
-            compare_token(&lexer.token, &l2.token);
-            lexer_destroy(&l2);
-        }
-        ds_put_char(&output, ' ');
-    }
-    lexer_destroy(&lexer);
-
-    ds_chomp(&output, ' ');
-    puts(ds_cstr(&output));
-    ds_destroy(&output);
-}
-
-static void
-create_symtab(struct shash *symtab)
-{
-    ovn_init_symtab(symtab);
-
-    /* For negative testing. */
-    expr_symtab_add_field(symtab, "bad_prereq", MFF_XREG0, "xyzzy", false);
-    expr_symtab_add_field(symtab, "self_recurse", MFF_XREG0,
-                          "self_recurse != 0", false);
-    expr_symtab_add_field(symtab, "mutual_recurse_1", MFF_XREG0,
-                          "mutual_recurse_2 != 0", false);
-    expr_symtab_add_field(symtab, "mutual_recurse_2", MFF_XREG0,
-                          "mutual_recurse_1 != 0", false);
-    expr_symtab_add_string(symtab, "big_string", MFF_XREG0, NULL);
-}
-
-static void
-create_gen_opts(struct hmap *dhcp_opts, struct hmap *dhcpv6_opts,
-                struct hmap *nd_ra_opts)
-{
-    hmap_init(dhcp_opts);
-    dhcp_opt_add(dhcp_opts, "offerip", 0, "ipv4");
-    dhcp_opt_add(dhcp_opts, "netmask", 1, "ipv4");
-    dhcp_opt_add(dhcp_opts, "router",  3, "ipv4");
-    dhcp_opt_add(dhcp_opts, "dns_server", 6, "ipv4");
-    dhcp_opt_add(dhcp_opts, "log_server", 7, "ipv4");
-    dhcp_opt_add(dhcp_opts, "lpr_server",  9, "ipv4");
-    dhcp_opt_add(dhcp_opts, "domain", 15, "str");
-    dhcp_opt_add(dhcp_opts, "swap_server", 16, "ipv4");
-    dhcp_opt_add(dhcp_opts, "policy_filter", 21, "ipv4");
-    dhcp_opt_add(dhcp_opts, "router_solicitation",  32, "ipv4");
-    dhcp_opt_add(dhcp_opts, "nis_server", 41, "ipv4");
-    dhcp_opt_add(dhcp_opts, "ntp_server", 42, "ipv4");
-    dhcp_opt_add(dhcp_opts, "server_id",  54, "ipv4");
-    dhcp_opt_add(dhcp_opts, "tftp_server", 66, "ipv4");
-    dhcp_opt_add(dhcp_opts, "classless_static_route", 121, "static_routes");
-    dhcp_opt_add(dhcp_opts, "ip_forward_enable",  19, "bool");
-    dhcp_opt_add(dhcp_opts, "router_discovery", 31, "bool");
-    dhcp_opt_add(dhcp_opts, "ethernet_encap", 36, "bool");
-    dhcp_opt_add(dhcp_opts, "default_ttl",  23, "uint8");
-    dhcp_opt_add(dhcp_opts, "tcp_ttl", 37, "uint8");
-    dhcp_opt_add(dhcp_opts, "mtu", 26, "uint16");
-    dhcp_opt_add(dhcp_opts, "lease_time",  51, "uint32");
-    dhcp_opt_add(dhcp_opts, "wpad", 252, "str");
-
-    /* DHCPv6 options. */
-    hmap_init(dhcpv6_opts);
-    dhcp_opt_add(dhcpv6_opts, "server_id",  2, "mac");
-    dhcp_opt_add(dhcpv6_opts, "ia_addr",  5, "ipv6");
-    dhcp_opt_add(dhcpv6_opts, "dns_server",  23, "ipv6");
-    dhcp_opt_add(dhcpv6_opts, "domain_search",  24, "str");
-
-    /* IPv6 ND RA options. */
-    hmap_init(nd_ra_opts);
-    nd_ra_opts_init(nd_ra_opts);
-}
-
-static void
-create_addr_sets(struct shash *addr_sets)
-{
-    shash_init(addr_sets);
-
-    static const char *const addrs1[] = {
-        "10.0.0.1", "10.0.0.2", "10.0.0.3",
-    };
-    static const char *const addrs2[] = {
-        "::1", "::2", "::3",
-    };
-    static const char *const addrs3[] = {
-        "00:00:00:00:00:01", "00:00:00:00:00:02", "00:00:00:00:00:03",
-    };
-    static const char *const addrs4[] = { NULL };
-
-    expr_const_sets_add(addr_sets, "set1", addrs1, 3, true);
-    expr_const_sets_add(addr_sets, "set2", addrs2, 3, true);
-    expr_const_sets_add(addr_sets, "set3", addrs3, 3, true);
-    expr_const_sets_add(addr_sets, "set4", addrs4, 0, true);
-}
-
-static void
-create_port_groups(struct shash *port_groups)
-{
-    shash_init(port_groups);
-
-    static const char *const pg1[] = {
-        "lsp1", "lsp2", "lsp3",
-    };
-    static const char *const pg2[] = { NULL };
-
-    expr_const_sets_add(port_groups, "pg1", pg1, 3, false);
-    expr_const_sets_add(port_groups, "pg_empty", pg2, 0, false);
-}
-
-static bool
-lookup_port_cb(const void *ports_, const char *port_name, unsigned int *portp)
-{
-    const struct simap *ports = ports_;
-    const struct simap_node *node = simap_find(ports, port_name);
-    if (!node) {
-        return false;
-    }
-    *portp = node->data;
-    return true;
-}
-
-static bool
-is_chassis_resident_cb(const void *ports_, const char *port_name)
-{
-    const struct simap *ports = ports_;
-    const struct simap_node *node = simap_find(ports, port_name);
-    if (node) {
-        return true;
-    }
-    return false;
-}
-
-static void
-test_parse_actions(const char *input)
-{
-    struct shash symtab;
-    struct hmap dhcp_opts;
-    struct hmap dhcpv6_opts;
-    struct hmap nd_ra_opts;
-    struct simap ports;
-
-    create_symtab(&symtab);
-    create_gen_opts(&dhcp_opts, &dhcpv6_opts, &nd_ra_opts);
-
-    /* Initialize group ids. */
-    struct ovn_extend_table group_table;
-    ovn_extend_table_init(&group_table);
-
-    /* Initialize meter ids for QoS. */
-    struct ovn_extend_table meter_table;
-    ovn_extend_table_init(&meter_table);
-
-    simap_init(&ports);
-    simap_put(&ports, "eth0", 5);
-    simap_put(&ports, "eth1", 6);
-    simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL));
-
-    struct ofpbuf ovnacts;
-    struct expr *prereqs;
-    char *error;
-
-    puts(input);
-
-    ofpbuf_init(&ovnacts, 0);
-
-    const struct ovnact_parse_params pp = {
-        .symtab = &symtab,
-        .dhcp_opts = &dhcp_opts,
-        .dhcpv6_opts = &dhcpv6_opts,
-        .nd_ra_opts = &nd_ra_opts,
-        .n_tables = 24,
-        .cur_ltable = 10,
-    };
-    error = ovnacts_parse_string(input, &pp, &ovnacts, &prereqs);
-    if (!error) {
-        /* Convert the parsed representation back to a string and print it,
-         * if it's different from the input. */
-        struct ds ovnacts_s = DS_EMPTY_INITIALIZER;
-        ovnacts_format(ovnacts.data, ovnacts.size, &ovnacts_s);
-        if (strcmp(input, ds_cstr(&ovnacts_s))) {
-            printf("    formats as %s\n", ds_cstr(&ovnacts_s));
-        }
-
-        /* Encode the actions into OpenFlow and print. */
-        const struct ovnact_encode_params ep = {
-            .lookup_port = lookup_port_cb,
-            .aux = &ports,
-            .is_switch = true,
-            .group_table = &group_table,
-            .meter_table = &meter_table,
-
-            .pipeline = OVNACT_P_INGRESS,
-            .ingress_ptable = 8,
-            .egress_ptable = 40,
-            .output_ptable = 64,
-            .mac_bind_ptable = 65,
-        };
-        struct ofpbuf ofpacts;
-        ofpbuf_init(&ofpacts, 0);
-        ovnacts_encode(ovnacts.data, ovnacts.size, &ep, &ofpacts);
-        struct ds ofpacts_s = DS_EMPTY_INITIALIZER;
-        struct ofpact_format_params fp = { .s = &ofpacts_s };
-        ofpacts_format(ofpacts.data, ofpacts.size, &fp);
-        printf("    encodes as %s\n", ds_cstr(&ofpacts_s));
-        ds_destroy(&ofpacts_s);
-        ofpbuf_uninit(&ofpacts);
-
-        /* Print prerequisites if any. */
-        if (prereqs) {
-            struct ds prereqs_s = DS_EMPTY_INITIALIZER;
-            expr_format(prereqs, &prereqs_s);
-            printf("    has prereqs %s\n", ds_cstr(&prereqs_s));
-            ds_destroy(&prereqs_s);
-        }
-
-        /* Now re-parse and re-format the string to verify that it's
-         * round-trippable. */
-        struct ofpbuf ovnacts2;
-        struct expr *prereqs2;
-        ofpbuf_init(&ovnacts2, 0);
-        error = ovnacts_parse_string(ds_cstr(&ovnacts_s), &pp, &ovnacts2,
-                                     &prereqs2);
-        if (!error) {
-            struct ds ovnacts2_s = DS_EMPTY_INITIALIZER;
-            ovnacts_format(ovnacts2.data, ovnacts2.size, &ovnacts2_s);
-            if (strcmp(ds_cstr(&ovnacts_s), ds_cstr(&ovnacts2_s))) {
-                printf("    bad reformat: %s\n", ds_cstr(&ovnacts2_s));
-            }
-            ds_destroy(&ovnacts2_s);
-        } else {
-            printf("    reparse error: %s\n", error);
-            free(error);
-        }
-        expr_destroy(prereqs2);
-
-        ovnacts_free(ovnacts2.data, ovnacts2.size);
-        ofpbuf_uninit(&ovnacts2);
-        ds_destroy(&ovnacts_s);
-    } else {
-        printf("    %s\n", error);
-        free(error);
-    }
-
-    expr_destroy(prereqs);
-    ovnacts_free(ovnacts.data, ovnacts.size);
-    ofpbuf_uninit(&ovnacts);
-
-    simap_destroy(&ports);
-    expr_symtab_destroy(&symtab);
-    shash_destroy(&symtab);
-    dhcp_opts_destroy(&dhcp_opts);
-    dhcp_opts_destroy(&dhcpv6_opts);
-    nd_ra_opts_destroy(&nd_ra_opts);
-    ovn_extend_table_destroy(&group_table);
-    ovn_extend_table_destroy(&meter_table);
-}
-
-static void
-test_parse_expr(const char *input)
-{
-    struct shash symtab;
-    struct shash addr_sets;
-    struct shash port_groups;
-    struct simap ports;
-    struct expr *expr;
-    char *error;
-
-    create_symtab(&symtab);
-    create_addr_sets(&addr_sets);
-    create_port_groups(&port_groups);
-
-    simap_init(&ports);
-    simap_put(&ports, "eth0", 5);
-    simap_put(&ports, "eth1", 6);
-    simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL));
-    simap_put(&ports, "lsp1", 0x11);
-    simap_put(&ports, "lsp2", 0x12);
-    simap_put(&ports, "lsp3", 0x13);
-
-    expr = expr_parse_string(input, &symtab, &addr_sets,
-                             &port_groups, &error);
-    if (!error) {
-        expr = expr_annotate(expr, &symtab, &error);
-    }
-    if (!error) {
-        expr = expr_simplify(expr, is_chassis_resident_cb, &ports);
-        expr = expr_normalize(expr);
-        ovs_assert(expr_is_normalized(expr));
-    }
-    if (!error) {
-        struct hmap matches;
-
-        expr_to_matches(expr, lookup_port_cb, &ports, &matches);
-        expr_matches_print(&matches, stdout);
-        expr_matches_destroy(&matches);
-    } else {
-        puts(error);
-        free(error);
-    }
-    expr_destroy(expr);
-    simap_destroy(&ports);
-    expr_symtab_destroy(&symtab);
-    shash_destroy(&symtab);
-    expr_const_sets_destroy(&addr_sets);
-    shash_destroy(&addr_sets);
-    expr_const_sets_destroy(&port_groups);
-    shash_destroy(&port_groups);
-}
-
-static bool
-lookup_atoi_cb(const void *aux OVS_UNUSED, const char *port_name,
-               unsigned int *portp)
-{
-    *portp = atoi(port_name);
-    return true;
-}
-
-static void
-test_expr_to_packets(const char *input)
-{
-    struct shash symtab;
-    create_symtab(&symtab);
-
-    struct flow uflow;
-    char *error = expr_parse_microflow(input, &symtab, NULL, NULL,
-                                       lookup_atoi_cb, NULL, &uflow);
-    if (error) {
-        puts(error);
-        free(error);
-        expr_symtab_destroy(&symtab);
-        shash_destroy(&symtab);
-        return;
-    }
-
-    uint64_t packet_stub[128 / 8];
-    struct dp_packet packet;
-    dp_packet_use_stub(&packet, packet_stub, sizeof packet_stub);
-    flow_compose(&packet, &uflow, NULL, 64);
-
-    struct ds output = DS_EMPTY_INITIALIZER;
-    const uint8_t *buf = dp_packet_data(&packet);
-    for (int i = 0; i < dp_packet_size(&packet); i++) {
-        uint8_t val = buf[i];
-        ds_put_format(&output, "%02"PRIx8, val);
-    }
-    puts(ds_cstr(&output));
-    ds_destroy(&output);
-    dp_packet_uninit(&packet);
-    expr_symtab_destroy(&symtab);
-    shash_destroy(&symtab);
-}
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *input_, size_t size)
-{
-    /* Bail out if we cannot construct at least a 1 char string. */
-    const char *input = (const char *) input_;
-    if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') ||
-        strlen(input) != size - 1) {
-        return 0;
-    }
-
-    /* Disable logging to avoid write to disk. */
-    static bool isInit = false;
-    if (!isInit) {
-        vlog_set_verbosity("off");
-        isInit = true;
-    }
-
-    /* Parse, annotate, simplify, normalize expr and convert to flows. */
-    test_parse_expr(input);
-
-    /* Parse actions. */
-    test_parse_actions(input);
-
-    /* Test OVN lexer. */
-    test_lex(input);
-
-    /* Expr to packets. */
-    test_expr_to_packets(input);
-
-    return 0;
-}
diff --git a/tests/oss-fuzz/flow_extract_target.c b/tests/oss-fuzz/flow_extract_target.c
deleted file mode 100644
index 4a7451411..000000000
--- a/tests/oss-fuzz/flow_extract_target.c
+++ /dev/null
@@ -1,100 +0,0 @@ 
-#include <config.h>
-#include "classifier.h"
-#include <assert.h>
-#include "fuzzer.h"
-#include "dp-packet.h"
-#include "flow.h"
-#include "openvswitch/ofp-match.h"
-#include "openvswitch/ofp-print.h"
-#include "openvswitch/match.h"
-#include "classifier-private.h"
-
-static void
-test_flow_hash(const struct flow *flow)
-{
-    uint32_t hash = flow_hash_5tuple(flow, 0);
-    hash = flow_hash_symmetric_l4(flow, 0);
-    hash = flow_hash_symmetric_l2(flow, 0);
-    hash = flow_hash_symmetric_l3l4(flow, 0, NULL);
-    hash = flow_hash_symmetric_l3(flow, 0);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_ETH_SRC, hash);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L4, hash);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4, hash);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP, hash);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_SRC, hash);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_DST, hash);
-    hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3, hash);
-    ignore(hash);
-}
-
-static void
-test_flow_mask(const struct flow *flow)
-{
-    struct flow_wildcards catchall;
-
-    flow_wildcards_init_catchall(&catchall);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_ETH_SRC);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L4);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_SRC);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_DST);
-    flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3);
-}
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-    struct dp_packet packet;
-    struct flow flow;
-    dp_packet_use_const(&packet, data, size);
-    flow_extract(&packet, &flow);
-
-    /* Extract flowmap. */
-    struct flowmap fmap;
-    flow_wc_map(&flow, &fmap);
-
-    /* Parse TCP flags. */
-    if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
-        uint16_t tcp_flags = parse_tcp_flags(&packet);
-        ignore(tcp_flags);
-    }
-
-    /* Parse TCP flags. */
-    if (dp_packet_size(&packet) >= ETH_HEADER_LEN) {
-        uint16_t tcp_flags = parse_tcp_flags(&packet);
-        ignore(tcp_flags);
-    }
-
-    /* Count headers. */
-    int count = flow_count_vlan_headers(&flow);
-    ignore(count);
-
-    /* Extract metadata. */
-    struct match flow_metadata;
-    flow_get_metadata(&flow, &flow_metadata);
-
-    /* Hashing functions. */
-    test_flow_hash(&flow);
-
-    /* Masking functions. */
-    test_flow_mask(&flow);
-
-    /* Convert flow to match. */
-    struct match match;
-    match_wc_init(&match, &flow);
-
-    struct ofp10_match ext_match;
-    ofputil_match_to_ofp10_match(&match, &ext_match);
-
-    /* Print match and packet. */
-    ofp_print_packet(stdout, dp_packet_data(&packet), dp_packet_size(&packet),
-                     htonl(PT_ETH));
-    ovs_hex_dump(stdout, dp_packet_data(&packet), dp_packet_size(&packet), 0,
-                 true);
-    match_print(&match, NULL);
-
-    ovs_hex_dump(stdout, &ext_match, sizeof ext_match, 0, false);
-
-    return 0;
-}
diff --git a/tests/oss-fuzz/fuzzer.h b/tests/oss-fuzz/fuzzer.h
deleted file mode 100644
index f87ae59e9..000000000
--- a/tests/oss-fuzz/fuzzer.h
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#ifndef FUZZER_H
-#define FUZZER_H 1
-
-#include <stdint.h>
-#include <stddef.h>
-
-int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
-
-#endif  /* fuzzer.h */
diff --git a/tests/oss-fuzz/json_parser_target.c b/tests/oss-fuzz/json_parser_target.c
deleted file mode 100644
index e39e04a0d..000000000
--- a/tests/oss-fuzz/json_parser_target.c
+++ /dev/null
@@ -1,42 +0,0 @@ 
-#include <config.h>
-#include "fuzzer.h"
-#include "jsonrpc.h"
-#include "openvswitch/json.h"
-#include "ovsdb-error.h"
-#include "ovsdb/table.h"
-#include <assert.h>
-#include <string.h>
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-    if (!size || data[size - 1]) {
-        return 0;
-    }
-
-    struct json *j1 = json_from_string((const char *)data);
-    if (j1->type == JSON_STRING) {
-        json_destroy(j1);
-        return 0;
-    }
-
-    free(json_to_string(j1, JSSF_SORT | JSSF_PRETTY));
-
-    struct jsonrpc_msg *msg;
-    char *error = jsonrpc_msg_from_json(j1, &msg); /* Frees 'j1'. */
-    if (error) {
-        free(error);
-        return 0;
-    }
-
-    struct json *j2 = jsonrpc_msg_to_json(msg); /* Frees 'msg'. */
-    if (j2->type == JSON_STRING) {
-        json_destroy(j2);
-        return 0;
-    }
-
-    free(json_to_string(j2, JSSF_SORT | JSSF_PRETTY));
-    json_destroy(j2);
-
-    return 0;
-}
diff --git a/tests/oss-fuzz/miniflow_target.c b/tests/oss-fuzz/miniflow_target.c
deleted file mode 100644
index 800375d63..000000000
--- a/tests/oss-fuzz/miniflow_target.c
+++ /dev/null
@@ -1,365 +0,0 @@ 
-#include <config.h>
-#include "classifier.h"
-#include "fuzzer.h"
-#include "dp-packet.h"
-#include "flow.h"
-#include "openvswitch/ofp-match.h"
-#include "openvswitch/ofp-print.h"
-#include "openvswitch/match.h"
-#include "classifier-private.h"
-#include "util.h"
-
-static void
-shuffle_u32s(uint32_t *p, size_t n)
-{
-    for (; n > 1; n--, p++) {
-        uint32_t *q = &p[random_range(n)];
-        uint32_t tmp = *p;
-        *p = *q;
-        *q = tmp;
-    }
-}
-
-/* Returns a copy of 'src'.  The caller must eventually free the returned
- * miniflow with free(). */
-static struct miniflow *
-miniflow_clone__(const struct miniflow *src)
-{
-    struct miniflow *dst;
-    size_t data_size;
-
-    data_size = miniflow_alloc(&dst, 1, src);
-    miniflow_clone(dst, src, data_size / sizeof(uint64_t));
-    return dst;
-}
-
-/* Returns a hash value for 'flow', given 'basis'. */
-static inline uint32_t
-miniflow_hash__(const struct miniflow *flow, uint32_t basis)
-{
-    const uint64_t *p = miniflow_get_values(flow);
-    size_t n_values = miniflow_n_values(flow);
-    struct flowmap hash_map = FLOWMAP_EMPTY_INITIALIZER;
-    uint32_t hash = basis;
-    size_t idx;
-
-    FLOWMAP_FOR_EACH_INDEX (idx, flow->map) {
-        uint64_t value = *p++;
-
-        if (value) {
-            hash = hash_add64(hash, value);
-            flowmap_set(&hash_map, idx, 1);
-        }
-    }
-    map_t map;
-    FLOWMAP_FOR_EACH_MAP (map, hash_map) {
-        hash = hash_add64(hash, map);
-    }
-
-    return hash_finish(hash, n_values);
-}
-
-static uint32_t
-random_value(void)
-{
-    static const uint32_t values_[] =
-        { 0xffffffff, 0xaaaaaaaa, 0x55555555, 0x80000000,
-          0x00000001, 0xface0000, 0x00d00d1e, 0xdeadbeef };
-
-    return values_[random_range(ARRAY_SIZE(values_))];
-}
-
-static bool
-choose(unsigned int n, unsigned int *idxp)
-{
-    if (*idxp < n) {
-        return true;
-    } else {
-        *idxp -= n;
-        return false;
-    }
-}
-
-#define FLOW_U32S (FLOW_U64S * 2)
-
-static bool
-init_consecutive_values(int n_consecutive, struct flow *flow,
-                        unsigned int *idxp)
-{
-    uint32_t *flow_u32 = (uint32_t *) flow;
-
-    if (choose(FLOW_U32S - n_consecutive + 1, idxp)) {
-        int i;
-
-        for (i = 0; i < n_consecutive; i++) {
-            flow_u32[i + *idxp] = random_value();
-        }
-        return true;
-    } else {
-        return false;
-    }
-}
-
-static bool
-next_random_flow(struct flow *flow, unsigned int idx)
-{
-    uint32_t *flow_u32 = (uint32_t *) flow;
-
-    memset(flow, 0, sizeof *flow);
-
-    /* Empty flow. */
-    if (choose(1, &idx)) {
-        return true;
-    }
-
-    /* All flows with a small number of consecutive nonzero values. */
-    for (int i = 1; i <= 4; i++) {
-        if (init_consecutive_values(i, flow, &idx)) {
-            return true;
-        }
-    }
-
-    /* All flows with a large number of consecutive nonzero values. */
-    for (int i = FLOW_U32S - 4; i <= FLOW_U32S; i++) {
-        if (init_consecutive_values(i, flow, &idx)) {
-            return true;
-        }
-    }
-
-    /* All flows with exactly two nonconsecutive nonzero values. */
-    if (choose((FLOW_U32S - 1) * (FLOW_U32S - 2) / 2, &idx)) {
-        int ofs1;
-
-        for (ofs1 = 0; ofs1 < FLOW_U32S - 2; ofs1++) {
-            int ofs2;
-
-            for (ofs2 = ofs1 + 2; ofs2 < FLOW_U32S; ofs2++) {
-                if (choose(1, &idx)) {
-                    flow_u32[ofs1] = random_value();
-                    flow_u32[ofs2] = random_value();
-                    return true;
-                }
-            }
-        }
-        OVS_NOT_REACHED();
-    }
-
-    /* 16 randomly chosen flows with N >= 3 nonzero values. */
-    if (choose(16 * (FLOW_U32S - 4), &idx)) {
-        int n = idx / 16 + 3;
-
-        for (int i = 0; i < n; i++) {
-            flow_u32[i] = random_value();
-        }
-        shuffle_u32s(flow_u32, FLOW_U32S);
-
-        return true;
-    }
-
-    return false;
-}
-
-static void
-any_random_flow(struct flow *flow)
-{
-    static unsigned int max;
-    if (!max) {
-        while (next_random_flow(flow, max)) {
-            max++;
-        }
-    }
-
-    next_random_flow(flow, random_range(max));
-}
-
-static void
-toggle_masked_flow_bits(struct flow *flow, const struct flow_wildcards *mask)
-{
-    const uint32_t *mask_u32 = (const uint32_t *) &mask->masks;
-    uint32_t *flow_u32 = (uint32_t *) flow;
-    int i;
-
-    for (i = 0; i < FLOW_U32S; i++) {
-        if (mask_u32[i] != 0) {
-            uint32_t bit;
-
-            do {
-                bit = 1u << random_range(32);
-            } while (!(bit & mask_u32[i]));
-            flow_u32[i] ^= bit;
-        }
-    }
-}
-
-static void
-wildcard_extra_bits(struct flow_wildcards *mask)
-{
-    uint32_t *mask_u32 = (uint32_t *) &mask->masks;
-    int i;
-
-    for (i = 0; i < FLOW_U32S; i++) {
-        if (mask_u32[i] != 0) {
-            uint32_t bit;
-
-            do {
-                bit = 1u << random_range(32);
-            } while (!(bit & mask_u32[i]));
-            mask_u32[i] &= ~bit;
-        }
-    }
-}
-
-static void
-test_miniflow(struct flow *flow)
-{
-    struct miniflow *miniflow, *miniflow2, *miniflow3;
-    struct flow flow2, flow3;
-    struct flow_wildcards mask;
-    struct minimask *minimask;
-    int i;
-
-    const uint64_t *flow_u64 = (const uint64_t *) flow;
-
-    /* Convert flow to miniflow. */
-    miniflow = miniflow_create(flow);
-
-    /* Obtain miniflow hash. */
-    uint32_t hash = miniflow_hash_5tuple(miniflow, 0);
-    ignore(hash);
-
-    /* Check that the flow equals its miniflow. */
-    for (i = 0; i < FLOW_MAX_VLAN_HEADERS; i++) {
-        ovs_assert(miniflow_get_vid(miniflow, i) ==
-               vlan_tci_to_vid(flow->vlans[i].tci));
-    }
-    for (i = 0; i < FLOW_U64S; i++) {
-        ovs_assert(miniflow_get(miniflow, i) == flow_u64[i]);
-    }
-
-    /* Check that the miniflow equals itself. */
-    ovs_assert(miniflow_equal(miniflow, miniflow));
-
-    /* Convert miniflow back to flow and verify that it's the same. */
-    miniflow_expand(miniflow, &flow2);
-    ovs_assert(flow_equal(flow, &flow2));
-    /* Check that copying a miniflow works properly. */
-    miniflow2 = miniflow_clone__(miniflow);
-    ovs_assert(miniflow_equal(miniflow, miniflow2));
-    ovs_assert(miniflow_hash__(miniflow, 0) == miniflow_hash__(miniflow2, 0));
-    miniflow_expand(miniflow2, &flow3);
-    ovs_assert(flow_equal(flow, &flow3));
-
-    /* Check that masked matches work as expected for identical flows and
-         * miniflows. */
-    do {
-            next_random_flow(&mask.masks, 1);
-    } while (flow_wildcards_is_catchall(&mask));
-    minimask = minimask_create(&mask);
-    ovs_assert(minimask_is_catchall(minimask)
-           == flow_wildcards_is_catchall(&mask));
-    ovs_assert(miniflow_equal_in_minimask(miniflow, miniflow2, minimask));
-    ovs_assert(miniflow_equal_flow_in_minimask(miniflow, &flow2, minimask));
-    ovs_assert(miniflow_hash_in_minimask(miniflow, minimask, 0x12345678) ==
-           flow_hash_in_minimask(flow, minimask, 0x12345678));
-    ovs_assert(minimask_hash(minimask, 0) ==
-           miniflow_hash__(&minimask->masks, 0));
-
-    /* Check that masked matches work as expected for differing flows and
-     * miniflows. */
-    toggle_masked_flow_bits(&flow2, &mask);
-    ovs_assert(!miniflow_equal_flow_in_minimask(miniflow, &flow2, minimask));
-    miniflow3 = miniflow_create(&flow2);
-    ovs_assert(!miniflow_equal_in_minimask(miniflow, miniflow3, minimask));
-
-    free(miniflow);
-    free(miniflow2);
-    free(miniflow3);
-    free(minimask);
-}
-
-static void
-test_minimask_has_extra(struct flow *flow)
-{
-    struct flow_wildcards catchall;
-    struct minimask *minicatchall;
-
-    flow_wildcards_init_catchall(&catchall);
-    minicatchall = minimask_create(&catchall);
-    ovs_assert(minimask_is_catchall(minicatchall));
-
-    struct flow_wildcards mask;
-    struct minimask *minimask;
-
-    mask.masks = *flow;
-    minimask = minimask_create(&mask);
-    ovs_assert(!minimask_has_extra(minimask, minimask));
-    ovs_assert(minimask_has_extra(minicatchall, minimask)
-           == !minimask_is_catchall(minimask));
-    if (!minimask_is_catchall(minimask)) {
-        struct minimask *minimask2;
-
-        wildcard_extra_bits(&mask);
-        minimask2 = minimask_create(&mask);
-        ovs_assert(minimask_has_extra(minimask2, minimask));
-        ovs_assert(!minimask_has_extra(minimask, minimask2));
-        free(minimask2);
-    }
-
-    free(minimask);
-    free(minicatchall);
-}
-
-static void
-test_minimask_combine(struct flow *flow)
-{
-    struct flow_wildcards catchall;
-    struct minimask *minicatchall;
-
-    flow_wildcards_init_catchall(&catchall);
-    minicatchall = minimask_create(&catchall);
-    ovs_assert(minimask_is_catchall(minicatchall));
-
-    struct minimask *minimask, *minimask2;
-    struct flow_wildcards mask, mask2, combined, combined2;
-    struct {
-        struct minimask minicombined;
-        uint64_t storage[FLOW_U64S];
-    } m;
-    struct flow flow2;
-
-    mask.masks = *flow;
-    minimask = minimask_create(&mask);
-
-    minimask_combine(&m.minicombined, minimask, minicatchall, m.storage);
-    ovs_assert(minimask_is_catchall(&m.minicombined));
-
-    any_random_flow(&flow2);
-    mask2.masks = flow2;
-    minimask2 = minimask_create(&mask2);
-
-    minimask_combine(&m.minicombined, minimask, minimask2, m.storage);
-    flow_wildcards_and(&combined, &mask, &mask2);
-    minimask_expand(&m.minicombined, &combined2);
-    ovs_assert(flow_wildcards_equal(&combined, &combined2));
-
-    free(minimask);
-    free(minimask2);
-
-    free(minicatchall);
-}
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-    struct dp_packet packet;
-    struct flow flow;
-    dp_packet_use_const(&packet, data, size);
-    flow_extract(&packet, &flow);
-
-    /* Do miniflow tests. */
-    test_miniflow(&flow);
-    test_minimask_has_extra(&flow);
-    test_minimask_combine(&flow);
-
-    return 0;
-}
diff --git a/tests/oss-fuzz/odp_target.c b/tests/oss-fuzz/odp_target.c
deleted file mode 100644
index ae61cdca3..000000000
--- a/tests/oss-fuzz/odp_target.c
+++ /dev/null
@@ -1,149 +0,0 @@ 
-#include <config.h>
-#include "fuzzer.h"
-#undef NDEBUG
-#include "odp-util.h"
-#include <stdio.h>
-#include "openvswitch/dynamic-string.h"
-#include "flow.h"
-#include "openvswitch/match.h"
-#include "openvswitch/ofpbuf.h"
-#include "util.h"
-#include "openvswitch/ofp-flow.h"
-#include "openvswitch/vlog.h"
-
-static int
-parse_keys(bool wc_keys, const char *in)
-{
-    int exit_code = 0;
-
-    enum odp_key_fitness fitness;
-    struct ofpbuf odp_key;
-    struct ofpbuf odp_mask;
-    struct flow flow;
-    struct ds out;
-    int error;
-
-    /* Convert string to OVS DP key. */
-    ofpbuf_init(&odp_key, 0);
-    ofpbuf_init(&odp_mask, 0);
-    error = odp_flow_from_string(in, NULL,
-                                 &odp_key, &odp_mask, NULL);
-    if (error) {
-        printf("odp_flow_from_string: error\n");
-        goto next;
-    }
-
-    if (!wc_keys) {
-        struct odp_flow_key_parms odp_parms = {
-            .flow = &flow,
-            .support = {
-                .recirc = true,
-                .ct_state = true,
-                .ct_zone = true,
-                .ct_mark = true,
-                .ct_label = true,
-                .max_vlan_headers = SIZE_MAX,
-            },
-        };
-
-        /* Convert odp_key to flow. */
-        fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size,
-                                       &flow, NULL);
-        switch (fitness) {
-            case ODP_FIT_PERFECT:
-                break;
-
-            case ODP_FIT_TOO_LITTLE:
-                printf("ODP_FIT_TOO_LITTLE: ");
-                break;
-
-            case ODP_FIT_TOO_MUCH:
-                printf("ODP_FIT_TOO_MUCH: ");
-                break;
-
-            case ODP_FIT_ERROR:
-                printf("odp_flow_key_to_flow: error\n");
-                goto next;
-        }
-        /* Convert cls_rule back to odp_key. */
-        ofpbuf_uninit(&odp_key);
-        ofpbuf_init(&odp_key, 0);
-        odp_flow_key_from_flow(&odp_parms, &odp_key);
-
-        if (odp_key.size > ODPUTIL_FLOW_KEY_BYTES) {
-            printf ("too long: %"PRIu32" > %d\n",
-                    odp_key.size, ODPUTIL_FLOW_KEY_BYTES);
-            exit_code = 1;
-        }
-    }
-
-    /* Convert odp_key to string. */
-    ds_init(&out);
-    if (wc_keys) {
-        odp_flow_format(odp_key.data, odp_key.size,
-                        odp_mask.data, odp_mask.size, NULL, &out, false);
-    } else {
-        odp_flow_key_format(odp_key.data, odp_key.size, &out);
-    }
-    puts(ds_cstr(&out));
-    ds_destroy(&out);
-
-next:
-    ofpbuf_uninit(&odp_key);
-    ofpbuf_uninit(&odp_mask);
-
-    return exit_code;
-}
-
-static int
-parse_actions(const char *in)
-{
-    struct ofpbuf odp_actions;
-    struct ds out;
-    int error;
-
-    /* Convert string to OVS DP actions. */
-    ofpbuf_init(&odp_actions, 0);
-    error = odp_actions_from_string(in, NULL, &odp_actions);
-    if (error) {
-        printf("odp_actions_from_string: error\n");
-        goto next;
-    }
-
-    /* Convert odp_actions back to string. */
-    ds_init(&out);
-    format_odp_actions(&out, odp_actions.data, odp_actions.size, NULL);
-    puts(ds_cstr(&out));
-    ds_destroy(&out);
-
-next:
-    ofpbuf_uninit(&odp_actions);
-    return 0;
-}
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-    /* Bail out if we cannot construct at least a 1 char string. */
-    const char *input = (const char *) data;
-    if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') ||
-        strlen(input) != size - 1) {
-        return 0;
-    }
-
-    /* Disable logging to avoid write to disk. */
-    static bool isInit = false;
-    if (!isInit) {
-        vlog_set_verbosity("off");
-        isInit = true;
-    }
-
-    /* Parse keys and wc keys. */
-    parse_keys(false, input);
-    parse_keys(true, input);
-
-    /* Parse actions. */
-    parse_actions(input);
-
-    return 0;
-}
diff --git a/tests/oss-fuzz/ofctl_parse_target.c b/tests/oss-fuzz/ofctl_parse_target.c
deleted file mode 100644
index b4db52f7e..000000000
--- a/tests/oss-fuzz/ofctl_parse_target.c
+++ /dev/null
@@ -1,113 +0,0 @@ 
-#include <config.h>
-#include "fuzzer.h"
-#include "openvswitch/ofp-flow.h"
-#include "ofp-version-opt.h"
-#include "ofproto/ofproto.h"
-#include "openflow/openflow.h"
-#include "openvswitch/ofpbuf.h"
-#include "openvswitch/vlog.h"
-#include "util.h"
-
-static void
-ofctl_parse_flows__(struct ofputil_flow_mod *fms, size_t n_fms,
-                    enum ofputil_protocol usable_protocols)
-{
-    enum ofputil_protocol protocol = 0;
-    char *usable_s;
-    size_t i;
-
-    usable_s = ofputil_protocols_to_string(usable_protocols);
-    printf("usable protocols: %s\n", usable_s);
-    free(usable_s);
-
-    if (!(usable_protocols & OFPUTIL_P_ANY)) {
-        printf("no usable protocol\n");
-        goto free;
-    }
-    for (i = 0; i < sizeof(enum ofputil_protocol) * CHAR_BIT; i++) {
-        protocol = 1u << i;
-        if (protocol & usable_protocols & OFPUTIL_P_ANY) {
-            break;
-        }
-    }
-    ovs_assert(is_pow2(protocol));
-
-    printf("chosen protocol: %s\n", ofputil_protocol_to_string(protocol));
-
-    for (i = 0; i < n_fms; i++) {
-        struct ofputil_flow_mod *fm = &fms[i];
-        struct ofpbuf *msg;
-
-        msg = ofputil_encode_flow_mod(fm, protocol);
-        ofpbuf_delete(msg);
-    }
-
-free:
-    for (i = 0; i < n_fms; i++) {
-        struct ofputil_flow_mod *fm = &fms[i];
-        free(CONST_CAST(struct ofpact *, fm->ofpacts));
-        minimatch_destroy(&fm->match);
-    }
-}
-
-/* "parse-flow FLOW": parses the argument as a flow (like add-flow) and prints
- * it back to stdout.  */
-static void
-ofctl_parse_flow(const char *input, int command)
-{
-    enum ofputil_protocol usable_protocols;
-    struct ofputil_flow_mod fm;
-    char *error;
-
-    error = parse_ofp_flow_mod_str(&fm, input, NULL, NULL,
-                                   command, &usable_protocols);
-    if (error) {
-        printf("Error encountered: %s\n", error);
-        free(error);
-    } else {
-        ofctl_parse_flows__(&fm, 1, usable_protocols);
-    }
-}
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-    /* Bail out if we cannot construct at least a 1 char string.
-     * Reserve 1 byte to decide flow mod command.
-     *
-     * Here's the structure of data we expect
-     * |--Byte 1--|--Byte 2--|...|--Byte (size-1)--|
-     *
-     * where,
-     *
-     * Byte 1: Used to decide which ofp flow mod command to test
-     * Bytes 2--(size-1): The C string that is actually passed to
-     *                    ofctl_parse_flow() test API.
-     *
-     * This means that the fuzzed input is actually a C string of
-     * length = (size -2) with the terminal byte being the NUL
-     * character. Moreover, this string is expected to not contain
-     * a new-line character.
-     */
-    const char *stream = (const char *) data;
-    if (size < 3 || stream[size - 1] != '\0' || strchr(&stream[1], '\n') ||
-        strlen(&stream[1]) != size - 2) {
-        return 0;
-    }
-
-    /* Disable logging to avoid write to disk. */
-    static bool isInit = false;
-    if (!isInit) {
-        vlog_set_verbosity("off");
-        isInit = true;
-    }
-
-    /* Decide test parameters using first byte of fuzzed input. */
-    int command = (stream[0] % OFPFC_DELETE_STRICT) + 1;
-
-    /* Fuzz extended match parsing. */
-    const char *input = &stream[1];
-    ofctl_parse_flow(input, command);
-
-    return 0;
-}
diff --git a/tests/oss-fuzz/ofp_print_target.c b/tests/oss-fuzz/ofp_print_target.c
deleted file mode 100644
index 126f2623f..000000000
--- a/tests/oss-fuzz/ofp_print_target.c
+++ /dev/null
@@ -1,47 +0,0 @@ 
-#include <config.h>
-#include "fuzzer.h"
-#include "dp-packet.h"
-#include "openvswitch/ofp-print.h"
-#include "openvswitch/ofpbuf.h"
-#include "openvswitch/vlog.h"
-
-int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
-{
-    if (size < sizeof(struct ofp_header)) {
-        return 0;
-    }
-
-    static bool isInit = false;
-    if (!isInit) {
-        vlog_set_verbosity("off");
-        isInit = true;
-    }
-
-    struct ofpbuf b;
-    ofpbuf_use_const(&b, data, size);
-    for (;;) {
-        /* Check if ofpbuf contains ofp header. */
-        struct ofp_header *oh = ofpbuf_at(&b, 0, sizeof *oh);
-        if (!oh) {
-            break;
-        }
-
-        /* Check if length is geq than lower bound. */
-        size_t length = ntohs(oh->length);
-        if (length < sizeof *oh) {
-            break;
-        }
-
-        /* Check if ofpbuf contains payload. */
-        size_t tail_len = length - sizeof *oh;
-        void *tail = ofpbuf_at(&b, sizeof *oh, tail_len);
-        if (!tail) {
-            break;
-        }
-
-        ofp_print(stdout, ofpbuf_pull(&b, length), length, NULL, NULL, 2);
-    }
-    ofpbuf_uninit(&b);
-    return 0;
-}