From: Ophir Munk <ophirmu@mellanox.com>
To: Pascal Mazon <pascal.mazon@6wind.com>, "dev@dpdk.org" <dev@dpdk.org>
Cc: Thomas Monjalon <thomas@monjalon.net>, Olga Shern <olgas@mellanox.com>
Subject: Re: [dpdk-dev] [PATCH v3 1/2] net/tap: add eBPF instructions to TAP device
Date: Wed, 10 Jan 2018 10:12:52 +0000 [thread overview]
Message-ID: <AM0PR0502MB3875303DDEA1997F8BA5AE2DD1110@AM0PR0502MB3875.eurprd05.prod.outlook.com> (raw)
In-Reply-To: <f44e4868-f26a-a105-94d3-bc0f69826b73@6wind.com>
Hi Pascal,
Please see inline
> -----Original Message-----
> From: Pascal Mazon [mailto:pascal.mazon@6wind.com]
> Sent: Wednesday, January 10, 2018 11:35 AM
> To: Ophir Munk <ophirmu@mellanox.com>; dev@dpdk.org
> Cc: Thomas Monjalon <thomas@monjalon.net>; Olga Shern
> <olgas@mellanox.com>
> Subject: Re: [PATCH v3 1/2] net/tap: add eBPF instructions to TAP device
>
> Hi Ophir,
>
> I have a few remarks.
>
> - Why do you define ARRAY_SIZE in tap_flow.h while it's used only in
> tap_bpf_insns.c?
>
ARRAY_SIZE is not defined only in tap_bpf_insns.c.
Please note ARRAY_SIZE is used several times in tap_flow.c as well.
> - I really dislike having the BPF bytecode hardcoded in tap_bpf_insns.c.
> You don't provide the commands used to generate that bytecode.
> And you don't provide the way to translate bytecode into these insns[]
> arrays.
> So we're just supposed to trust that these instructions are indeed
> what they pretend to be.
> The process is not repeatable nor verifiable.
>
Please note that file tap_bpf_program.c is the C source code for the bytecode.
The plan for next release (18.05) is:
1. Ask the user to install clang version 3.7 in order to compile the C source into BPF assembly object file
2. Supply a tool that will generate the bytecode from the object file
3. Advanced option: use the generated bytecode to transparently compile TAP PMD
If a user is reluctant to install clang 3.7 he has the option to compile TAP PMD without external tool dependency.
For this release please confirm the bytecode alone without the tool (expected in next release)
>
> On 10/01/2018 08:06, Ophir Munk wrote:
> > TAP PMD is required to support RSS queue mapping based on rte_flow API.
> An
> > example usage for this requirement is failsafe transparent switching from a
> > PCI device to TAP device while keep redirecting packets to the same RSS
> > queues on both devices.
> >
> > TAP RSS implementation is based on eBPF programs sent to Linux kernel
> > through BPF system calls and using netlink messages to reference the
> > programs as part of traffic control commands.
> >
> > An eBPF program acts as a traffic control classifier or action. Each
> > program is written in C code under a different ELF section name. Clang 3.7
> > is used to compile the C code into eBPF-formatted object file. The ELF file
> > is parsed and its sections (programs) can be downloaded to the kernel using
> > BPF system call. The BPF system call parameters contain the array of eBPF
> > instructions. This commit includes BPF classifier and action programs
> > (tap_bpf_program.c) as reference and their corresponding arrays of eBPF
> > instructions (tap_bpf_insns.c). The reference file does not take part in
> > dpdk compilation. The details on how to generate new eBPF code will be
> > presented in another commit.
> >
> > In a follow up commit TAP PMD will use the eBPF programs to implement
> RSS
> > flow rules.
> >
> > TAP eBPF requires Linux version 4.9 configured with BPF. TAP PMD will
> > successfully compile on systems with old or non-BPF configured kernels but
> > RSS rules creation on TAP devices will not be supported.
> >
> > Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
> > ---
> > drivers/net/tap/Makefile | 11 +
> > drivers/net/tap/tap_bpf.h | 96 ++
> > drivers/net/tap/tap_bpf_insns.c | 1845
> +++++++++++++++++++++++++++++++++++++
> > drivers/net/tap/tap_bpf_program.c | 221 +++++
> > drivers/net/tap/tap_flow.h | 5 +
> > 5 files changed, 2178 insertions(+)
> > create mode 100644 drivers/net/tap/tap_bpf.h
> > create mode 100644 drivers/net/tap/tap_bpf_insns.c
> > create mode 100644 drivers/net/tap/tap_bpf_program.c
> >
> > diff --git a/drivers/net/tap/Makefile b/drivers/net/tap/Makefile
> > index fd4195f..feaa5b7 100644
> > --- a/drivers/net/tap/Makefile
> > +++ b/drivers/net/tap/Makefile
> > @@ -12,6 +12,9 @@ EXPORT_MAP := rte_pmd_tap_version.map
> >
> > LIBABIVER := 1
> >
> > +# TAP_MAX_QUEUES must be a power of 2 as it will be used for masking
> */
> > +TAP_MAX_QUEUES = 16
> > +
> > CFLAGS += -O3
> > CFLAGS += -I$(SRCDIR)
> > CFLAGS += -I.
> > @@ -20,6 +23,8 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -
> lrte_ring
> > LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash
> > LDLIBS += -lrte_bus_vdev
> >
> > +CFLAGS += -DTAP_MAX_QUEUES=$(TAP_MAX_QUEUES)
> > +
> > #
> > # all source are stored in SRCS-y
> > #
> > @@ -27,6 +32,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) +=
> rte_eth_tap.c
> > SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c
> > SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c
> > SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c
> > +SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_bpf_insns.c
> >
> > include $(RTE_SDK)/mk/rte.lib.mk
> >
> > @@ -53,6 +59,11 @@ tap_autoconf.h.new: $(RTE_SDK)/buildtools/auto-
> config-h.sh
> > linux/pkt_cls.h \
> > enum TCA_FLOWER_KEY_VLAN_PRIO \
> > $(AUTOCONF_OUTPUT)
> > + $Q sh -- '$<' '$@' \
> > + HAVE_BPF_PROG_LOAD \
> > + linux/bpf.h \
> > + enum BPF_PROG_LOAD \
> > + $(AUTOCONF_OUTPUT)
> >
> > # Create tap_autoconf.h or update it in case it differs from the new one.
> >
> > diff --git a/drivers/net/tap/tap_bpf.h b/drivers/net/tap/tap_bpf.h
> > new file mode 100644
> > index 0000000..82775b7
> > --- /dev/null
> > +++ b/drivers/net/tap/tap_bpf.h
> > @@ -0,0 +1,96 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright 2017 Mellanox Technologies, Ltd.
> > + */
> > +
> > +#ifndef __TAP_BPF_H__
> > +#define __TAP_BPF_H__
> > +
> > +#include <tap_autoconf.h>
> > +
> > +#ifdef HAVE_BPF_PROG_LOAD
> > +#include <linux/bpf.h>
> > +#else
> > +/* BPF_MAP_UPDATE_ELEM command flags */
> > +#define BPF_ANY 0 /* create a new element or update an
> existing */
> > +
> > +/* BPF architecture instruction struct */
> > +struct bpf_insn {
> > + __u8 code;
> > + __u8 dst_reg:4;
> > + __u8 src_reg:4;
> > + __s16 off;
> > + __s32 imm; /* immediate value */
> > +};
> > +
> > +/* BPF program types */
> > +enum bpf_prog_type {
> > + BPF_PROG_TYPE_UNSPEC,
> > + BPF_PROG_TYPE_SOCKET_FILTER,
> > + BPF_PROG_TYPE_KPROBE,
> > + BPF_PROG_TYPE_SCHED_CLS,
> > + BPF_PROG_TYPE_SCHED_ACT,
> > +};
> > +
> > +/* BPF commands types */
> > +enum bpf_cmd {
> > + BPF_MAP_CREATE,
> > + BPF_MAP_LOOKUP_ELEM,
> > + BPF_MAP_UPDATE_ELEM,
> > + BPF_MAP_DELETE_ELEM,
> > + BPF_MAP_GET_NEXT_KEY,
> > + BPF_PROG_LOAD,
> > +};
> > +
> > +/* BPF maps types */
> > +enum bpf_map_type {
> > + BPF_MAP_TYPE_UNSPEC,
> > + BPF_MAP_TYPE_HASH,
> > +};
> > +
> > +/* union of anonymous structs used with TAP BPF commands */
> > +union bpf_attr {
> > + /* BPF_MAP_CREATE command */
> > + struct {
> > + __u32 map_type;
> > + __u32 key_size;
> > + __u32 value_size;
> > + __u32 max_entries;
> > + __u32 map_flags;
> > + __u32 inner_map_fd;
> > + };
> > +
> > + /* BPF_MAP_UPDATE_ELEM, BPF_MAP_DELETE_ELEM commands
> */
> > + struct {
> > + __u32 map_fd;
> > + __aligned_u64 key;
> > + union {
> > + __aligned_u64 value;
> > + __aligned_u64 next_key;
> > + };
> > + __u64 flags;
> > + };
> > +
> > + /* BPF_PROG_LOAD command */
> > + struct {
> > + __u32 prog_type;
> > + __u32 insn_cnt;
> > + __aligned_u64 insns;
> > + __aligned_u64 license;
> > + __u32 log_level;
> > + __u32 log_size;
> > + __aligned_u64 log_buf;
> > + __u32 kern_version;
> > + __u32 prog_flags;
> > + };
> > +} __attribute__((aligned(8)));
> > +#endif
> > +
> > +enum {
> > + BPF_MAP_ID_KEY,
> > + BPF_MAP_ID_SIMPLE,
> > +};
> > +
> > +static int bpf_load(enum bpf_prog_type type, const struct bpf_insn *insns,
> > + size_t insns_cnt, const char *license);
> > +
> > +#endif /* __TAP_BPF_H__ */
> > diff --git a/drivers/net/tap/tap_bpf_insns.c
> b/drivers/net/tap/tap_bpf_insns.c
> > new file mode 100644
> > index 0000000..25aa82c
> > --- /dev/null
> > +++ b/drivers/net/tap/tap_bpf_insns.c
> > @@ -0,0 +1,1845 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright 2017 Mellanox Technologies, Ltd.
> > + */
> > +
> > +#include <errno.h>
> > +#include <string.h>
> > +#include <unistd.h>
> > +#include <sys/queue.h>
> > +#include <sys/mount.h>
> > +
> > +#include <rte_byteorder.h>
> > +#include <rte_jhash.h>
> > +#include <rte_malloc.h>
> > +#include <rte_eth_tap.h>
> > +#include <tap_flow.h>
> > +#include <tap_autoconf.h>
> > +#include <tap_tcmsgs.h>
> > +#include <tap_bpf.h>
> > +
> > +#define ERROR 0
> > +
> > +/*
> > + * The queue number is offset by 1, to distinguish packets that have
> > + * gone through this rule (skb->cb[1] != 0) from others.
> > + */
> > +#define QUEUE_OFFSET 1
> > +
> > +/* bpf_insn array matching cls_q section. See tap_bpf_program.c file */
> > +static struct bpf_insn cls_q_insns[] = {
> > + {0x61, 1, 1, 52, 0x00000000},
> > + {0x18, 2, 0, 0, 0xdeadbeef},
> > + {0x00, 0, 0, 0, 0x00000000},
> > + {0x63, 10, 2, -4, 0x00000000},
> > + {0x61, 2, 10, -4, 0x00000000},
> > + {0x07, 2, 0, 0, 0x00000001},
> > + {0x67, 2, 0, 0, 0x00000020},
> > + {0x77, 2, 0, 0, 0x00000020},
> > + {0xb7, 0, 0, 0, 0xffffffff},
> > + {0x1d, 1, 2, 1, 0x00000000},
> > + {0xb7, 0, 0, 0, 0x00000000},
> > + {0x95, 0, 0, 0, 0x00000000},
> > +};
> > +
> > +/**
> > + * Load BPF program (section cls_q) into the kernel and return a bpf fd
> > + *
> > + * @param queue_idx
> > + * Queue index matching packet cb
> > + *
> > + * @return
> > + * -1 if the BPF program couldn't be loaded. An fd (int) otherwise.
> > + */
> > +int tap_flow_bpf_cls_q(__u32 queue_idx)
> > +{
> > + cls_q_insns[1].imm = queue_idx;
> > +
> > + return bpf_load(BPF_PROG_TYPE_SCHED_CLS,
> > + (struct bpf_insn *)cls_q_insns,
> > + ARRAY_SIZE(cls_q_insns),
> > + "Dual BSD/GPL");
> > +}
> > +
> > +/* bpf_insn array matching l3_l4 section. see tap_bpf_program.c file */
> > +static struct bpf_insn l3_l4_hash_insns[] = {
> > + {0xbf, 7, 1, 0, 0x00000000},
> > + {0x61, 8, 7, 16, 0x00000000},
> > + {0x61, 6, 7, 76, 0x00000000},
> > + {0x61, 9, 7, 80, 0x00000000},
> > + {0x18, 1, 0, 0, 0xdeadbeef},
> > + {0x00, 0, 0, 0, 0x00000000},
> > + {0x63, 10, 1, -4, 0x00000000},
> > + {0xbf, 2, 10, 0, 0x00000000},
> > + {0x07, 2, 0, 0, 0xfffffffc},
> > + {0x18, 1, 1, 0, 0x0000cafe},
> > + {0x00, 0, 0, 0, 0x00000000},
> > + {0x85, 0, 0, 0, 0x00000001},
> > + {0x55, 0, 0, 21, 0x00000000},
> > + {0xb7, 1, 0, 0, 0x00000a64},
> > + {0x6b, 10, 1, -16, 0x00000000},
> > + {0x18, 1, 0, 0, 0x69666e6f},
> > + {0x00, 0, 0, 0, 0x65727567},
> > + {0x7b, 10, 1, -24, 0x00000000},
> > + {0x18, 1, 0, 0, 0x6e207369},
> > + {0x00, 0, 0, 0, 0x6320746f},
> > + {0x7b, 10, 1, -32, 0x00000000},
> > + {0x18, 1, 0, 0, 0x20737372},
> > + {0x00, 0, 0, 0, 0x2079656b},
> > + {0x7b, 10, 1, -40, 0x00000000},
> > + {0x18, 1, 0, 0, 0x68736168},
> > + {0x00, 0, 0, 0, 0x203a2928},
> > + {0x7b, 10, 1, -48, 0x00000000},
> > + {0xb7, 7, 0, 0, 0x00000000},
> > + {0x73, 10, 7, -14, 0x00000000},
> > + {0xbf, 1, 10, 0, 0x00000000},
> > + {0x07, 1, 0, 0, 0xffffffd0},
> > + {0xb7, 2, 0, 0, 0x00000023},
> > + {0x85, 0, 0, 0, 0x00000006},
> > + {0x05, 0, 0, 1632, 0x00000000},
> > + {0xb7, 1, 0, 0, 0x0000000e},
> > + {0x61, 2, 7, 20, 0x00000000},
> > + {0x15, 2, 0, 10, 0x00000000},
> > + {0x61, 2, 7, 28, 0x00000000},
> > + {0x55, 2, 0, 8, 0x0000a888},
> > + {0xbf, 2, 7, 0, 0x00000000},
> > + {0xb7, 7, 0, 0, 0x00000000},
> > + {0xbf, 1, 6, 0, 0x00000000},
> > + {0x07, 1, 0, 0, 0x00000012},
> > + {0x2d, 1, 9, 1622, 0x00000000},
> > + {0xb7, 1, 0, 0, 0x00000012},
> > + {0x69, 8, 6, 16, 0x00000000},
> > + {0xbf, 7, 2, 0, 0x00000000},
> > + {0x7b, 10, 7, -56, 0x00000000},
> > + {0x57, 8, 0, 0, 0x0000ffff},
> > + {0x15, 8, 0, 409, 0x0000dd86},
> > + {0xb7, 7, 0, 0, 0x00000003},
> > + {0x55, 8, 0, 1614, 0x00000008},
> > + {0x0f, 6, 1, 0, 0x00000000},
> > + {0xb7, 7, 0, 0, 0x00000000},
> > + {0xbf, 1, 6, 0, 0x00000000},
> > + {0x07, 1, 0, 0, 0x00000018},
> > + {0x2d, 1, 9, 1609, 0x00000000},
> > + {0x71, 3, 6, 12, 0x00000000},
> > + {0xbf, 1, 3, 0, 0x00000000},
> > + {0x67, 1, 0, 0, 0x00000038},
> > + {0xc7, 1, 0, 0, 0x00000020},
> > + {0x77, 1, 0, 0, 0x0000001f},
> > + {0x57, 1, 0, 0, 0x2cc681d1},
> > + {0x67, 3, 0, 0, 0x00000018},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x40000000},
> > + {0xb7, 2, 0, 0, 0x00000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x598d03a2},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x20000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb31a0745},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x10000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x66340e8a},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x08000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xcc681d15},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x04000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x98d03a2b},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x02000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x31a07456},
> > + {0x57, 3, 0, 0, 0x01000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6340e8ad},
> > + {0x71, 3, 6, 13, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000010},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00800000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc681d15b},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00400000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8d03a2b7},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00200000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1a07456f},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00100000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x340e8ade},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00080000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x681d15bd},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00040000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd03a2b7b},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00020000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa07456f6},
> > + {0x57, 3, 0, 0, 0x00010000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x40e8aded},
> > + {0x71, 3, 6, 14, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000008},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00008000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x81d15bdb},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00004000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x03a2b7b7},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00002000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x07456f6f},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00001000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0e8adedf},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000800},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1d15bdbf},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000400},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3a2b7b7e},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000200},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7456f6fd},
> > + {0x57, 3, 0, 0, 0x00000100},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe8adedfa},
> > + {0x71, 3, 6, 15, 0x00000000},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000080},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd15bdbf4},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000040},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa2b7b7e9},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000020},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x456f6fd3},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000010},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8adedfa7},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000008},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x15bdbf4f},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000004},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2b7b7e9e},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000002},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x56f6fd3d},
> > + {0x57, 3, 0, 0, 0x00000001},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xadedfa7b},
> > + {0x71, 4, 6, 16, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000038},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0xb7, 3, 0, 0, 0xffffffff},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x5bdbf4f7},
> > + {0x67, 4, 0, 0, 0x00000018},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb7b7e9ef},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6f6fd3df},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdedfa7bf},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbdbf4f7f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7b7e9eff},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf6fd3dff},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xedfa7bfe},
> > + {0x71, 4, 6, 17, 0x00000000},
> > + {0x67, 4, 0, 0, 0x00000010},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdbf4f7fc},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb7e9eff9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6fd3dff2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdfa7bfe5},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbf4f7fca},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7e9eff94},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfd3dff28},
> > + {0x57, 4, 0, 0, 0x00010000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfa7bfe51},
> > + {0x71, 4, 6, 18, 0x00000000},
> > + {0x67, 4, 0, 0, 0x00000008},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf4f7fca2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe9eff945},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd3dff28a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa7bfe514},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4f7fca28},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9eff9450},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3dff28a0},
> > + {0x57, 4, 0, 0, 0x00000100},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7bfe5141},
> > + {0x71, 4, 6, 19, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf7fca283},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xeff94506},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdff28a0c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbfe51418},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7fca2831},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xff945063},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xff28a0c6},
> > + {0x57, 4, 0, 0, 0x00000001},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfe51418c},
> > + {0x71, 4, 6, 20, 0x00000000},
> > + {0x67, 4, 0, 0, 0x00000008},
> > + {0x71, 5, 6, 21, 0x00000000},
> > + {0x4f, 4, 5, 0, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000030},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfca28319},
> > + {0x67, 4, 0, 0, 0x00000010},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x40000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf9450633},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x20000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf28a0c67},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x10000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe51418ce},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x08000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xca28319d},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x04000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9450633b},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x02000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x28a0c676},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x01000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x51418ced},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00800000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa28319db},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00400000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x450633b6},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00200000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8a0c676c},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00100000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1418ced8},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00080000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x28319db1},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00040000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x50633b63},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00020000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa0c676c6},
> > + {0x57, 4, 0, 0, 0x00010000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x418ced8d},
> > + {0x71, 3, 6, 22, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000008},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00008000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8319db1a},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00004000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0633b634},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00002000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0c676c68},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00001000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x18ced8d1},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000800},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x319db1a3},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000400},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x633b6347},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000200},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc676c68f},
> > + {0x57, 3, 0, 0, 0x00000100},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8ced8d1f},
> > + {0x71, 3, 6, 23, 0x00000000},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000080},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x19db1a3e},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000040},
> > + {0x79, 5, 10, -56, 0x00000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x33b6347d},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000020},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x676c68fa},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000010},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xced8d1f4},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000008},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9db1a3e9},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000004},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3b6347d2},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000002},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x76c68fa5},
> > + {0x57, 3, 0, 0, 0x00000001},
> > + {0x1d, 3, 2, 1177, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xed8d1f4a},
> > + {0x05, 0, 0, 1175, 0x00000000},
> > + {0x0f, 6, 1, 0, 0x00000000},
> > + {0xb7, 7, 0, 0, 0x00000000},
> > + {0xbf, 1, 6, 0, 0x00000000},
> > + {0x07, 1, 0, 0, 0x0000002c},
> > + {0x2d, 1, 9, 1202, 0x00000000},
> > + {0x61, 4, 6, 8, 0x00000000},
> > + {0xbf, 1, 4, 0, 0x00000000},
> > + {0x67, 1, 0, 0, 0x00000038},
> > + {0xc7, 1, 0, 0, 0x00000020},
> > + {0x77, 1, 0, 0, 0x0000001f},
> > + {0x57, 1, 0, 0, 0x2cc681d1},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000040},
> > + {0xb7, 2, 0, 0, 0x00000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x598d03a2},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000020},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb31a0745},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000010},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x66340e8a},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000008},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xcc681d15},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000004},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x98d03a2b},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000002},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x31a07456},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000001},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6340e8ad},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00008000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc681d15b},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00004000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8d03a2b7},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00002000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1a07456f},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00001000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x340e8ade},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000800},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x681d15bd},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000400},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd03a2b7b},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000200},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa07456f6},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00000100},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x40e8aded},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00800000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x81d15bdb},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00400000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x03a2b7b7},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00200000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x07456f6f},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00100000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0e8adedf},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00080000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1d15bdbf},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00040000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3a2b7b7e},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00020000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7456f6fd},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00010000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe8adedfa},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0xb7, 3, 0, 0, 0xffffffff},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd15bdbf4},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa2b7b7e9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x456f6fd3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8adedfa7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x15bdbf4f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2b7b7e9e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x56f6fd3d},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xadedfa7b},
> > + {0x61, 4, 6, 12, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x5bdbf4f7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb7b7e9ef},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6f6fd3df},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdedfa7bf},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbdbf4f7f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7b7e9eff},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf6fd3dff},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xedfa7bfe},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdbf4f7fc},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb7e9eff9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6fd3dff2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdfa7bfe5},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbf4f7fca},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7e9eff94},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfd3dff28},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfa7bfe51},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf4f7fca2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe9eff945},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd3dff28a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa7bfe514},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4f7fca28},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9eff9450},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3dff28a0},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7bfe5141},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf7fca283},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xeff94506},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdff28a0c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbfe51418},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7fca2831},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xff945063},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xff28a0c6},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfe51418c},
> > + {0x61, 4, 6, 16, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfca28319},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf9450633},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf28a0c67},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe51418ce},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xca28319d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9450633b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x28a0c676},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x51418ced},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa28319db},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x450633b6},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8a0c676c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1418ced8},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x28319db1},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x50633b63},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa0c676c6},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x418ced8d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8319db1a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0633b634},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0c676c68},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x18ced8d1},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x319db1a3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x633b6347},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc676c68f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8ced8d1f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x19db1a3e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x33b6347d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x676c68fa},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xced8d1f4},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9db1a3e9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3b6347d2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x76c68fa5},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xed8d1f4a},
> > + {0x61, 4, 6, 20, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xdb1a3e94},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb6347d28},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6c68fa51},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd8d1f4a3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb1a3e946},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6347d28d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc68fa51a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8d1f4a35},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1a3e946b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x347d28d7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x68fa51ae},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd1f4a35c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa3e946b9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x47d28d73},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8fa51ae7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1f4a35cf},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3e946b9e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7d28d73c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfa51ae78},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf4a35cf1},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe946b9e3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd28d73c7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa51ae78e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4a35cf1c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x946b9e38},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x28d73c71},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x51ae78e3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa35cf1c6},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x46b9e38d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8d73c71b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1ae78e36},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x35cf1c6c},
> > + {0x61, 4, 6, 24, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6b9e38d9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd73c71b2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xae78e364},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x5cf1c6c9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb9e38d92},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x73c71b25},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe78e364b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xcf1c6c96},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9e38d92c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3c71b259},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x78e364b2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf1c6c964},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe38d92c9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc71b2593},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8e364b27},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1c6c964e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x38d92c9c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x71b25938},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe364b270},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc6c964e0},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8d92c9c0},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1b259380},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x364b2700},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6c964e01},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd92c9c03},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb2593807},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x64b2700f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc964e01e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x92c9c03d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2593807a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4b2700f4},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x964e01e8},
> > + {0x61, 4, 6, 28, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2c9c03d1},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x593807a3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb2700f46},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x64e01e8d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc9c03d1a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x93807a35},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2700f46b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4e01e8d6},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9c03d1ad},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3807a35b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x700f46b6},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe01e8d6c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc03d1ad9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x807a35b3},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x00f46b66},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x01e8d6cc},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x03d1ad99},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x07a35b32},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0f46b665},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1e8d6cca},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3d1ad994},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7a35b328},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf46b6651},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe8d6cca2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd1ad9944},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa35b3289},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x46b66512},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8d6cca25},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1ad9944a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x35b32894},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6b665129},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd6cca253},
> > + {0x61, 4, 6, 32, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xad9944a7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x5b32894f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb665129f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6cca253e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd9944a7d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb32894fb},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x665129f6},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xcca253ec},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9944a7d9},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x32894fb2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x65129f65},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xca253eca},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x944a7d95},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2894fb2a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x5129f655},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa253ecab},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x44a7d956},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x894fb2ac},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x129f6558},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x253ecab1},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4a7d9563},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x94fb2ac7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x29f6558f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x53ecab1e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xa7d9563d},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4fb2ac7a},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9f6558f5},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3ecab1ea},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7d9563d5},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfb2ac7ab},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf6558f56},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xecab1eac},
> > + {0x61, 4, 6, 36, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000080},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd9563d59},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000040},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb2ac7ab2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000020},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6558f564},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000010},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xcab1eac8},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000008},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9563d590},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000004},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2ac7ab20},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000002},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x558f5641},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000001},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xab1eac83},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00008000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x563d5906},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00004000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xac7ab20c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00002000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x58f56418},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00001000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb1eac831},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000800},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x63d59063},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000400},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc7ab20c7},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000200},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8f56418f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00000100},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1eac831e},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00800000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3d59063c},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00400000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7ab20c78},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00200000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf56418f0},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00100000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xeac831e1},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00080000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xd59063c2},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00040000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xab20c784},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00020000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x56418f09},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x00010000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xac831e12},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000020},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x59063c25},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x40000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xb20c784b},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x20000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x6418f097},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x10000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc831e12f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x08000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9063c25f},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x04000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x20c784be},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x57, 5, 0, 0, 0x02000000},
> > + {0x1d, 5, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x418f097c},
> > + {0x57, 4, 0, 0, 0x01000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x831e12f9},
> > + {0x71, 4, 6, 40, 0x00000000},
> > + {0x67, 4, 0, 0, 0x00000008},
> > + {0x71, 5, 6, 41, 0x00000000},
> > + {0x4f, 4, 5, 0, 0x00000000},
> > + {0xbf, 5, 4, 0, 0x00000000},
> > + {0x67, 5, 0, 0, 0x00000030},
> > + {0xc7, 5, 0, 0, 0x00000020},
> > + {0x6d, 5, 3, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x063c25f3},
> > + {0x67, 4, 0, 0, 0x00000010},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x40000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x0c784be7},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x20000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x18f097cf},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x10000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x31e12f9f},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x08000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x63c25f3f},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x04000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc784be7f},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x02000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x8f097cff},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x01000000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x1e12f9fe},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00800000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3c25f3fc},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00400000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x784be7f8},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00200000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf097cff0},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00100000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe12f9fe0},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00080000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xc25f3fc1},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00040000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x84be7f83},
> > + {0xbf, 3, 4, 0, 0x00000000},
> > + {0x57, 3, 0, 0, 0x00020000},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x097cff07},
> > + {0x57, 4, 0, 0, 0x00010000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x12f9fe0f},
> > + {0x71, 3, 6, 42, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000008},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00008000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x25f3fc1f},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00004000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x4be7f83f},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00002000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x97cff07f},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00001000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x2f9fe0fe},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000800},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x5f3fc1fd},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000400},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xbe7f83fb},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000200},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7cff07f7},
> > + {0x57, 3, 0, 0, 0x00000100},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf9fe0fee},
> > + {0x71, 3, 6, 43, 0x00000000},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000080},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xf3fc1fdc},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000040},
> > + {0x79, 5, 10, -56, 0x00000000},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xe7f83fb8},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000020},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xcff07f70},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000010},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x9fe0fee1},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000008},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x3fc1fdc2},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000004},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0x7f83fb85},
> > + {0xbf, 4, 3, 0, 0x00000000},
> > + {0x57, 4, 0, 0, 0x00000002},
> > + {0x1d, 4, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xff07f70a},
> > + {0x57, 3, 0, 0, 0x00000001},
> > + {0x1d, 3, 2, 1, 0x00000000},
> > + {0xa7, 1, 0, 0, 0xfe0fee15},
> > + {0x71, 2, 0, 201, 0x00000000},
> > + {0x67, 2, 0, 0, 0x00000008},
> > + {0x71, 3, 0, 200, 0x00000000},
> > + {0x4f, 2, 3, 0, 0x00000000},
> > + {0x71, 3, 0, 203, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000008},
> > + {0x71, 4, 0, 202, 0x00000000},
> > + {0x4f, 3, 4, 0, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000010},
> > + {0x4f, 3, 2, 0, 0x00000000},
> > + {0x67, 1, 0, 0, 0x00000020},
> > + {0x77, 1, 0, 0, 0x00000020},
> > + {0xbf, 2, 1, 0, 0x00000000},
> > + {0x3f, 2, 3, 0, 0x00000000},
> > + {0x2f, 2, 3, 0, 0x00000000},
> > + {0x1f, 1, 2, 0, 0x00000000},
> > + {0x57, 1, 0, 0, 0x0000000f},
> > + {0x67, 1, 0, 0, 0x00000002},
> > + {0x0f, 0, 1, 0, 0x00000000},
> > + {0x71, 1, 0, 137, 0x00000000},
> > + {0x67, 1, 0, 0, 0x00000008},
> > + {0x71, 2, 0, 136, 0x00000000},
> > + {0x4f, 1, 2, 0, 0x00000000},
> > + {0x71, 2, 0, 138, 0x00000000},
> > + {0x71, 3, 0, 139, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000008},
> > + {0x4f, 3, 2, 0, 0x00000000},
> > + {0x67, 3, 0, 0, 0x00000010},
> > + {0x4f, 3, 1, 0, 0x00000000},
> > + {0x07, 3, 0, 0, 0x00000001},
> > + {0x63, 5, 3, 52, 0x00000000},
> > + {0xb7, 7, 0, 0, 0x00000001},
> > + {0xbf, 0, 7, 0, 0x00000000},
> > + {0x95, 0, 0, 0, 0x00000000},
> > +};
> > +
> > +/**
> > + * Load BPF program (section l3_l4) into the kernel and return a bpf fd.
> > + *
> > + * @param[in] key_idx
> > + * RSS MAP key index
> > + *
> > + * @param[in] map_fd
> > + * BPF RSS map file descriptor
> > + *
> > + * @return
> > + * -1 if the BPF program couldn't be loaded. An fd (int) otherwise.
> > + */
> > +int tap_flow_bpf_calc_l3_l4_hash(__u32 key_idx, int map_fd)
> > +{
> > + l3_l4_hash_insns[4].imm = key_idx;
> > + l3_l4_hash_insns[9].imm = map_fd;
> > +
> > + return bpf_load(BPF_PROG_TYPE_SCHED_ACT,
> > + (struct bpf_insn *)l3_l4_hash_insns,
> > + ARRAY_SIZE(l3_l4_hash_insns),
> > + "Dual BSD/GPL");
> > +}
> > +
> > +
> > +#ifndef __NR_bpf
> > +# if defined(__i386__)
> > +# define __NR_bpf 357
> > +# elif defined(__x86_64__)
> > +# define __NR_bpf 321
> > +# elif defined(__aarch64__)
> > +# define __NR_bpf 280
> > +# elif defined(__sparc__)
> > +# define __NR_bpf 349
> > +# elif defined(__s390__)
> > +# define __NR_bpf 351
> > +# else
> > +# error __NR_bpf not defined. libbpf does not support your arch.
> > +# endif
> > +#endif
> > +
> > +/**
> > + * Helper function to convert a pointer to unsigned 64 bits
> > + *
> > + * @param[in] ptr
> > + * pointer to address
> > + *
> > + * @return
> > + * 64 bit unsigned long type of pointer address
> > + */
> > +static inline __u64 ptr_to_u64(const void *ptr)
> > +{
> > + return (__u64)(unsigned long)ptr;
> > +}
> > +
> > +/**
> > + * Call BPF system call
> > + *
> > + * @param[in] cmd
> > + * BPF command for program loading, map creation, map entry update,
> etc
> > + *
> > + * @param[in] attr
> > + * System call attributes relevant to system call command
> > + *
> > + * @param[in] size
> > + * size of attr parameter
> > + *
> > + * @return
> > + * -1 if BPF system call failed, 0 otherwise
> > + */
> > +static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr,
> > + unsigned int size)
> > +{
> > + return syscall(__NR_bpf, cmd, attr, size);
> > +}
> > +
> > +/**
> > + * Load BPF instructions to kernel
> > + *
> > + * @param[in] type
> > + * BPF program type: classifieir or action
> > + *
> > + * @param[in] insns
> > + * Array of BPF instructions (equivalent to BPF instructions)
> > + *
> > + * @param[in] insns_cnt
> > + * Number of BPF instructions (size of array)
> > + *
> > + * @param[in] lincense
> > + * License string that must be acknowledged by the kernel
> > + *
> > + * @return
> > + * -1 if the BPF program couldn't be loaded, fd (file descriptor) otherwise
> > + */
> > +static int bpf_load(enum bpf_prog_type type,
> > + const struct bpf_insn *insns,
> > + size_t insns_cnt,
> > + const char *license)
> > +{
> > + union bpf_attr attr;
> > +
> > + bzero(&attr, sizeof(attr));
> > + attr.prog_type = type;
> > + attr.insn_cnt = (__u32)insns_cnt;
> > + attr.insns = ptr_to_u64(insns);
> > + attr.license = ptr_to_u64(license);
> > + attr.log_buf = ptr_to_u64(NULL);
> > + attr.log_level = 0;
> > + attr.kern_version = 0;
> > +
> > + return sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr));
> > +}
> > diff --git a/drivers/net/tap/tap_bpf_program.c
> b/drivers/net/tap/tap_bpf_program.c
> > new file mode 100644
> > index 0000000..08bc881
> > --- /dev/null
> > +++ b/drivers/net/tap/tap_bpf_program.c
> > @@ -0,0 +1,221 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright 2017 Mellanox Technologies, Ltd.
> > + */
> > +
> > +#include <stdint.h>
> > +#include <stdbool.h>
> > +#include <sys/types.h>
> > +#include <sys/socket.h>
> > +#include <asm/types.h>
> > +#include <linux/in.h>
> > +#include <linux/if.h>
> > +#include <linux/if_ether.h>
> > +#include <linux/ip.h>
> > +#include <linux/ipv6.h>
> > +#include <linux/if_tunnel.h>
> > +#include <linux/filter.h>
> > +#include <linux/bpf.h>
> > +
> > +#include "tap_rss.h"
> > +
> > +/** Create IPv4 address */
> > +#define IPv4(a, b, c, d) ((__u32)(((a) & 0xff) << 24) | \
> > + (((b) & 0xff) << 16) | \
> > + (((c) & 0xff) << 8) | \
> > + ((d) & 0xff))
> > +
> > +#define PORT(a, b) ((__u16)(((a) & 0xff) << 8) | \
> > + ((b) & 0xff))
> > +
> > +/*
> > + * The queue number is offset by 1, to distinguish packets that have
> > + * gone through this rule (skb->cb[1] != 0) from others.
> > + */
> > +#define QUEUE_OFFSET 1
> > +#define PIN_GLOBAL_NS 2
> > +
> > +#define KEY_IDX 0
> > +#define BPF_MAP_ID_KEY 1
> > +
> > +struct vlan_hdr {
> > + __be16 proto;
> > + __be16 tci;
> > +};
> > +
> > +struct bpf_elf_map __attribute__((section("maps"), used))
> > +map_keys = {
> > + .type = BPF_MAP_TYPE_HASH,
> > + .id = BPF_MAP_ID_KEY,
> > + .size_key = sizeof(__u32),
> > + .size_value = sizeof(struct rss_key),
> > + .max_elem = 256,
> > + .pinning = PIN_GLOBAL_NS,
> > +};
> > +
> > +__section("cls_q") int
> > +match_q(struct __sk_buff *skb)
> > +{
> > + __u32 queue = skb->cb[1];
> > + volatile __u32 q = 0xdeadbeef;
> > + __u32 match_queue = QUEUE_OFFSET + q;
> > +
> > + /* printt("match_q$i() queue = %d\n", queue); */
> > +
> > + if (queue != match_queue)
> > + return TC_ACT_OK;
> > + return TC_ACT_UNSPEC;
> > +}
> > +
> > +
> > +struct ipv4_l3_l4_tuple {
> > + __u32 src_addr;
> > + __u32 dst_addr;
> > + __u16 dport;
> > + __u16 sport;
> > +} __attribute__((packed));
> > +
> > +struct ipv6_l3_l4_tuple {
> > + __u8 src_addr[16];
> > + __u8 dst_addr[16];
> > + __u16 dport;
> > + __u16 sport;
> > +} __attribute__((packed));
> > +
> > +static const __u8 def_rss_key[] = {
> > + 0xd1, 0x81, 0xc6, 0x2c,
> > + 0xf7, 0xf4, 0xdb, 0x5b,
> > + 0x19, 0x83, 0xa2, 0xfc,
> > + 0x94, 0x3e, 0x1a, 0xdb,
> > + 0xd9, 0x38, 0x9e, 0x6b,
> > + 0xd1, 0x03, 0x9c, 0x2c,
> > + 0xa7, 0x44, 0x99, 0xad,
> > + 0x59, 0x3d, 0x56, 0xd9,
> > + 0xf3, 0x25, 0x3c, 0x06,
> > + 0x2a, 0xdc, 0x1f, 0xfc,
> > +};
> > +
> > +static __u32 __attribute__((always_inline))
> > +rte_softrss_be(const __u32 *input_tuple, const uint8_t *rss_key,
> > + __u8 input_len)
> > +{
> > + __u32 i, j, hash = 0;
> > +#pragma unroll
> > + for (j = 0; j < input_len; j++) {
> > +#pragma unroll
> > + for (i = 0; i < 32; i++) {
> > + if (input_tuple[j] & (1 << (31 - i))) {
> > + hash ^= ((const __u32 *)def_rss_key)[j] << i |
> > + (__u32)((uint64_t)
> > + (((const __u32 *)def_rss_key)[j + 1])
> > + >> (32 - i));
> > + }
> > + }
> > + }
> > + return hash;
> > +}
> > +
> > +static int __attribute__((always_inline))
> > +rss_l3_l4(struct __sk_buff *skb)
> > +{
> > + void *data_end = (void *)(long)skb->data_end;
> > + void *data = (void *)(long)skb->data;
> > + __u16 proto = (__u16)skb->protocol;
> > + __u32 key_idx = 0xdeadbeef;
> > + __u32 hash;
> > + struct rss_key *rsskey;
> > + __u64 off = ETH_HLEN;
> > + int j;
> > + __u8 *key = 0;
> > + __u32 len;
> > + __u32 queue = 0;
> > +
> > + rsskey = map_lookup_elem(&map_keys, &key_idx);
> > + if (!rsskey) {
> > + printt("hash(): rss key is not configured\n");
> > + return TC_ACT_OK;
> > + }
> > + key = (__u8 *)rsskey->key;
> > +
> > + /* Get correct proto for 802.1ad */
> > + if (skb->vlan_present && skb->vlan_proto == htons(ETH_P_8021AD))
> {
> > + if (data + ETH_ALEN * 2 + sizeof(struct vlan_hdr) +
> > + sizeof(proto) > data_end)
> > + return TC_ACT_OK;
> > + proto = *(__u16 *)(data + ETH_ALEN * 2 +
> > + sizeof(struct vlan_hdr));
> > + off += sizeof(struct vlan_hdr);
> > + }
> > +
> > + if (proto == htons(ETH_P_IP)) {
> > + if (data + off + sizeof(struct iphdr) + sizeof(__u32)
> > + > data_end)
> > + return TC_ACT_OK;
> > +
> > + __u8 *src_dst_addr = data + off + offsetof(struct iphdr,
> saddr);
> > + __u8 *src_dst_port = data + off + sizeof(struct iphdr);
> > + struct ipv4_l3_l4_tuple v4_tuple = {
> > + .src_addr = IPv4(*(src_dst_addr + 0),
> > + *(src_dst_addr + 1),
> > + *(src_dst_addr + 2),
> > + *(src_dst_addr + 3)),
> > + .dst_addr = IPv4(*(src_dst_addr + 4),
> > + *(src_dst_addr + 5),
> > + *(src_dst_addr + 6),
> > + *(src_dst_addr + 7)),
> > + .sport = PORT(*(src_dst_port + 0),
> > + *(src_dst_port + 1)),
> > + .dport = PORT(*(src_dst_port + 2),
> > + *(src_dst_port + 3)),
> > + };
> > + __u8 input_len = sizeof(v4_tuple) / sizeof(__u32);
> > + if (rsskey->hash_fields & (1 << HASH_FIELD_IPV4_L3))
> > + input_len--;
> > + hash = rte_softrss_be((__u32 *)&v4_tuple, key, 3);
> > + } else if (proto == htons(ETH_P_IPV6)) {
> > + if (data + off + sizeof(struct ipv6hdr) +
> > + sizeof(__u32) > data_end)
> > + return TC_ACT_OK;
> > + __u8 *src_dst_addr = data + off +
> > + offsetof(struct ipv6hdr, saddr);
> > + __u8 *src_dst_port = data + off +
> > + sizeof(struct ipv6hdr);
> > + struct ipv6_l3_l4_tuple v6_tuple;
> > + for (j = 0; j < 4; j++)
> > + *((uint32_t *)&v6_tuple.src_addr + j) =
> > + __builtin_bswap32(*((uint32_t *)
> > + src_dst_addr + j));
> > + for (j = 0; j < 4; j++)
> > + *((uint32_t *)&v6_tuple.dst_addr + j) =
> > + __builtin_bswap32(*((uint32_t *)
> > + src_dst_addr + 4 + j));
> > + v6_tuple.sport = PORT(*(src_dst_port + 0),
> > + *(src_dst_port + 1));
> > + v6_tuple.dport = PORT(*(src_dst_port + 2),
> > + *(src_dst_port + 3));
> > +
> > + __u8 input_len = sizeof(v6_tuple) / sizeof(__u32);
> > + if (rsskey->hash_fields & (1 << HASH_FIELD_IPV6_L3))
> > + input_len--;
> > + hash = rte_softrss_be((__u32 *)&v6_tuple, key, 9);
> > + } else {
> > + return TC_ACT_PIPE;
> > + }
> > +
> > + queue = rsskey->queues[(hash % rsskey->nb_queues) &
> > + (TAP_MAX_QUEUES - 1)];
> > + skb->cb[1] = QUEUE_OFFSET + queue;
> > + /* printt(">>>>> rss_l3_l4 hash=0x%x queue=%u\n", hash, queue); */
> > +
> > + return TC_ACT_RECLASSIFY;
> > +}
> > +
> > +#define RSS(L) \
> > + __section(#L) int \
> > + L ## _hash(struct __sk_buff *skb) \
> > + { \
> > + return rss_ ## L (skb); \
> > + }
> > +
> > +RSS(l3_l4)
> > +
> > +BPF_LICENSE("Dual BSD/GPL");
> > diff --git a/drivers/net/tap/tap_flow.h b/drivers/net/tap/tap_flow.h
> > index 9e332b0..6cc01b4 100644
> > --- a/drivers/net/tap/tap_flow.h
> > +++ b/drivers/net/tap/tap_flow.h
> > @@ -50,6 +50,8 @@
> > #define GROUP_SHIFT 12
> > #define MAX_GROUP GROUP_MASK
> >
> > +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
> > +
> > /**
> > * These index are actually in reversed order: their priority is processed
> > * by subtracting their value to the lowest priority (PRIORITY_MASK).
> > @@ -80,4 +82,7 @@ int tap_flow_implicit_destroy(struct pmd_internals
> *pmd,
> > int tap_flow_implicit_flush(struct pmd_internals *pmd,
> > struct rte_flow_error *error);
> >
> > +int tap_flow_bpf_cls_q(__u32 queue_idx);
> > +int tap_flow_bpf_calc_l3_l4_hash(__u32 key_idx, int map_fd);
> > +
> > #endif /* _TAP_FLOW_H_ */
next prev parent reply other threads:[~2018-01-10 10:12 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-17 12:21 [dpdk-dev] [PATCH v1 0/3] TAP RSS eBPF cover letter Ophir Munk
2017-12-17 12:21 ` [dpdk-dev] [PATCH v1 1/3] net/tap: add BPF sections for TAP device Ophir Munk
2017-12-17 12:21 ` [dpdk-dev] [PATCH v1 2/3] net/tap: add eBPF instructions Ophir Munk
2017-12-17 12:21 ` [dpdk-dev] [PATCH v1 3/3] net/tap: add eBPF classifiers map and actions Ophir Munk
2017-12-28 10:09 ` [dpdk-dev] [PATCH v2 0/2] TAP RSS eBPF cover letter Ophir Munk
2017-12-28 10:09 ` [dpdk-dev] [PATCH v2 1/2] net/tap: add eBPF instructions to TAP device Ophir Munk
2017-12-28 10:09 ` [dpdk-dev] [PATCH v2 2/2] net/tap: implement RSS with eBPF classifier and action Ophir Munk
2018-01-10 7:06 ` [dpdk-dev] [PATCH v3 0/2] TAP RSS eBPF cover letter Ophir Munk
2018-01-10 7:06 ` [dpdk-dev] [PATCH v3 1/2] net/tap: add eBPF instructions to TAP device Ophir Munk
2018-01-10 9:34 ` Pascal Mazon
2018-01-10 10:12 ` Ophir Munk [this message]
2018-01-10 7:06 ` [dpdk-dev] [PATCH v3 2/2] net/tap: implement RSS with eBPF classifier and action Ophir Munk
2018-01-10 10:19 ` Pascal Mazon
2018-01-11 17:20 ` Ophir Munk
2018-01-10 10:10 ` [dpdk-dev] [PATCH v3 0/2] TAP RSS eBPF cover letter Jason Wang
2018-01-10 15:34 ` Ophir Munk
2018-01-11 2:45 ` Jason Wang
2018-01-11 17:45 ` [dpdk-dev] [PATCH v4 0/5] " Ophir Munk
2018-01-11 17:45 ` [dpdk-dev] [PATCH v4 1/5] net/tap: support actions for different classifiers Ophir Munk
2018-01-11 17:45 ` [dpdk-dev] [PATCH v4 2/5] net/tap: add eBPF bytes code Ophir Munk
2018-01-11 17:45 ` [dpdk-dev] [PATCH v4 3/5] net/tap: add eBPF program file Ophir Munk
2018-01-11 17:45 ` [dpdk-dev] [PATCH v4 4/5] net/tap: add eBPF API Ophir Munk
2018-01-11 17:45 ` [dpdk-dev] [PATCH v4 5/5] net/tap: implement TAP RSS using eBPF Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 0/6] TAP RSS eBPF cover letter Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 1/6] net/tap: support actions for different classifiers Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 2/6] net/tap: add eBPF bytes code Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 3/6] net/tap: add eBPF program file Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 4/6] net/tap: add eBPF API Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 5/6] net/tap: implement TAP RSS using eBPF Ophir Munk
2018-01-18 13:38 ` [dpdk-dev] [PATCH v5 6/6] doc: detail new tap RSS feature in guides Ophir Munk
2018-01-19 6:48 ` [dpdk-dev] [PATCH v5 0/6] TAP RSS eBPF cover letter Pascal Mazon
2018-01-20 16:15 ` Ferruh Yigit
2018-01-20 21:25 ` Ophir Munk
2018-01-21 14:20 ` Ferruh Yigit
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 " Ophir Munk
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 1/6] net/tap: support actions for different classifiers Ophir Munk
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 2/6] net/tap: add eBPF program file Ophir Munk
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 3/6] net/tap: add eBPF bytes code Ophir Munk
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 4/6] net/tap: add eBPF API Ophir Munk
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 5/6] net/tap: implement TAP RSS using eBPF Ophir Munk
2018-01-20 21:11 ` [dpdk-dev] [PATCH v6 6/6] doc: detail new tap RSS feature in guides Ophir Munk
2018-01-21 14:50 ` [dpdk-dev] [PATCH v6 0/6] TAP RSS eBPF cover letter Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AM0PR0502MB3875303DDEA1997F8BA5AE2DD1110@AM0PR0502MB3875.eurprd05.prod.outlook.com \
--to=ophirmu@mellanox.com \
--cc=dev@dpdk.org \
--cc=olgas@mellanox.com \
--cc=pascal.mazon@6wind.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).