From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6929D45B09; Thu, 10 Oct 2024 21:43:00 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9907C40659; Thu, 10 Oct 2024 21:42:48 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 338CB40A8B for ; Thu, 10 Oct 2024 21:42:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1728589365; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Qu4rtUpZl0Mvf9V/b8gqTEkHupLhFXixujtSMm++dxM=; b=dtGLDKb7kwaM0J+o7DGb5pxD8iwcxWTAqj+3wWPw9/717Q0oYExvL7zTCkHuJQNppnXmvI AUp83+Dn47SJMq/CFlXdvpYwWr/6aGtlGBOwAx1njUqODu8dH8/U9bdmWHa0/5O+96DD16 TWhlLJDmejqxl3KJTAtaxJb1tJ5+BaA= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-516-k1gl33PvM5W0n-ElCtd_Pw-1; Thu, 10 Oct 2024 15:42:41 -0400 X-MC-Unique: k1gl33PvM5W0n-ElCtd_Pw-1 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E80CD1956077; Thu, 10 Oct 2024 19:42:38 +0000 (UTC) Received: from ringo.redhat.com (unknown [10.39.208.7]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 1772B19560AA; Thu, 10 Oct 2024 19:42:33 +0000 (UTC) From: Robin Jarry To: dev@dpdk.org, Vladimir Medvedkin , Cristian Dumitrescu , Bruce Richardson , Konstantin Ananyev , Wathsala Vithanage , Radu Nicolau , Akhil Goyal , Nithin Dabilpuram , Pavan Nikhilesh Subject: [PATCH dpdk v3 06/17] fib6,rib6,lpm6: use struct rte_ipv6_addr Date: Thu, 10 Oct 2024 21:41:36 +0200 Message-ID: <20241010194148.1877659-7-rjarry@redhat.com> In-Reply-To: <20241010194148.1877659-1-rjarry@redhat.com> References: <20240821162516.610624-17-rjarry@redhat.com> <20241010194148.1877659-1-rjarry@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Replace ad-hoc uint8_t[16] array types in the API of rte_fib6, rte_rib6 and rte_lpm6 with rte_ipv6_addr structures Update all code accordingly. Unfortunately, these three libraries are strongly intertwined, it is not possible to split this change in separate commits. NB: the conversion between 16 bytes arrays and RTE_IPV6() literals was done automatically with the following python script and adjusted manually afterwards: import argparse import re import struct ip = re.compile( r""" \{ [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]*, [\s\t\r\n]*([\da-fA-Fx]+)[\s\t\r\n]* \} """, re.VERBOSE, ) def repl(match): u8 = bytes(int(g, 0) for g in match.groups("0")) nums = [] for u16 in struct.unpack("!HHHHHHHH", u8): if u16: nums.append(f"0x{u16:04x}") else: nums.append("0") return f"RTE_IPV6({', '.join(nums)})" p = argparse.ArgumentParser() p.add_argument("args", nargs="+") args = p.parse_args() for a in args.args: with open(a) as f: buf = f.read() buf = ip.sub(repl, buf) with open(a, "w") as f: f.write(buf) Signed-off-by: Robin Jarry --- Notes: v3: - replace *memcpy(ipv6) with direct struct assignments - use RTE_IPV6_ADDR_FMT and RTE_IPV6_ADDR_SPLIT when possible - use RTE_IPV6_ADDR_UNSPEC instead of {0} - use RTE_IPV6() instead of RTE_IPV6_ADDR() - replace stray in6_addr uses with rte_ipv6_addr app/test-fib/main.c | 51 +- app/test-pipeline/pipeline_lpm_ipv6.c | 11 +- app/test/test_fib6.c | 51 +- app/test/test_fib6_perf.c | 8 +- app/test/test_lpm6.c | 490 +++--- app/test/test_lpm6_data.h | 2025 ++++++++++++------------ app/test/test_lpm6_perf.c | 10 +- app/test/test_rib6.c | 55 +- app/test/test_table_combined.c | 2 +- app/test/test_table_tables.c | 8 +- doc/guides/rel_notes/deprecation.rst | 20 - doc/guides/rel_notes/release_24_11.rst | 1 + examples/ip_fragmentation/main.c | 23 +- examples/ip_pipeline/thread.c | 2 +- examples/ip_reassembly/main.c | 23 +- examples/ipsec-secgw/ipsec_lpm_neon.h | 7 +- examples/ipsec-secgw/ipsec_worker.c | 11 +- examples/ipsec-secgw/ipsec_worker.h | 4 +- examples/ipsec-secgw/rt.c | 22 +- examples/l3fwd/l3fwd_fib.c | 39 +- examples/l3fwd/l3fwd_lpm.c | 8 +- examples/l3fwd/l3fwd_route.h | 9 +- examples/l3fwd/lpm_route_parse.c | 9 +- examples/l3fwd/main.c | 32 +- lib/fib/meson.build | 4 +- lib/fib/rte_fib6.c | 13 +- lib/fib/rte_fib6.h | 11 +- lib/fib/trie.c | 99 +- lib/fib/trie.h | 16 +- lib/fib/trie_avx512.c | 38 +- lib/fib/trie_avx512.h | 10 +- lib/lpm/meson.build | 1 + lib/lpm/rte_lpm6.c | 114 +- lib/lpm/rte_lpm6.h | 14 +- lib/node/ip6_lookup.c | 16 +- lib/rib/meson.build | 2 +- lib/rib/rte_rib6.c | 74 +- lib/rib/rte_rib6.h | 13 +- lib/table/rte_table_lpm_ipv6.c | 12 +- lib/table/rte_table_lpm_ipv6.h | 7 +- 40 files changed, 1652 insertions(+), 1713 deletions(-) diff --git a/app/test-fib/main.c b/app/test-fib/main.c index c49bfe8bcec3..91a3eeecf6ee 100644 --- a/app/test-fib/main.c +++ b/app/test-fib/main.c @@ -123,7 +123,7 @@ struct rt_rule_4 { }; struct rt_rule_6 { - uint8_t addr[16]; + struct rte_ipv6_addr addr; uint8_t depth; uint64_t nh; }; @@ -306,15 +306,15 @@ shuffle_rt_6(struct rt_rule_6 *rt, int n) for (i = 0; i < n; i++) { j = rte_rand() % n; - memcpy(tmp.addr, rt[i].addr, 16); + tmp.addr = rt[i].addr; tmp.depth = rt[i].depth; tmp.nh = rt[i].nh; - memcpy(rt[i].addr, rt[j].addr, 16); + rt[i].addr = rt[j].addr; rt[i].depth = rt[j].depth; rt[i].nh = rt[j].nh; - memcpy(rt[j].addr, tmp.addr, 16); + rt[j].addr = tmp.addr; rt[j].depth = tmp.depth; rt[j].nh = tmp.nh; } @@ -364,7 +364,7 @@ gen_random_rt_6(struct rt_rule_6 *rt, int nh_sz) uint32_t a, i, j, k = 0; if (config.nb_routes_per_depth[0] != 0) { - memset(rt[k].addr, 0, 16); + memset(&rt[k].addr, 0, 16); rt[k].depth = 0; rt[k++].nh = rte_rand() & get_max_nh(nh_sz); } @@ -380,7 +380,7 @@ gen_random_rt_6(struct rt_rule_6 *rt, int nh_sz) uint64_t rnd_val = get_rnd_rng((uint64_t)edge, (uint64_t)(edge + step)); rnd = rte_cpu_to_be_32(rnd_val << (32 - i)); - complete_v6_addr((uint32_t *)rt[k].addr, + complete_v6_addr((uint32_t *)&rt[k].addr, rnd, a); rt[k].depth = (a * 32) + i; rt[k].nh = rte_rand() & get_max_nh(nh_sz); @@ -390,19 +390,19 @@ gen_random_rt_6(struct rt_rule_6 *rt, int nh_sz) } static inline void -set_rnd_ipv6(uint8_t *addr, uint8_t *route, int depth) +set_rnd_ipv6(struct rte_ipv6_addr *addr, struct rte_ipv6_addr *route, int depth) { int i; for (i = 0; i < 16; i++) - addr[i] = rte_rand(); + addr->a[i] = rte_rand(); for (i = 0; i < 16; i++) { if (depth >= 8) - addr[i] = route[i]; + addr->a[i] = route->a[i]; else if (depth > 0) { - addr[i] &= (uint16_t)UINT8_MAX >> depth; - addr[i] |= route[i] & UINT8_MAX << (8 - depth); + addr->a[i] &= (uint16_t)UINT8_MAX >> depth; + addr->a[i] |= route->a[i] & UINT8_MAX << (8 - depth); } else return; depth -= 8; @@ -413,7 +413,7 @@ static void gen_rnd_lookup_tbl(int af) { uint32_t *tbl4 = config.lookup_tbl; - uint8_t *tbl6 = config.lookup_tbl; + struct rte_ipv6_addr *tbl6 = config.lookup_tbl; struct rt_rule_4 *rt4 = (struct rt_rule_4 *)config.rt; struct rt_rule_6 *rt6 = (struct rt_rule_6 *)config.rt; uint32_t i, j; @@ -432,11 +432,10 @@ gen_rnd_lookup_tbl(int af) for (i = 0, j = 0; i < config.nb_lookup_ips; i++, j = (j + 1) % config.nb_routes) { if ((rte_rand() % 100) < config.rnd_lookup_ips_ratio) { - set_rnd_ipv6(&tbl6[i * 16], rt6[j].addr, 0); + set_rnd_ipv6(&tbl6[i], &rt6[j].addr, 0); config.nb_lookup_ips_rnd++; } else { - set_rnd_ipv6(&tbl6[i * 16], rt6[j].addr, - rt6[j].depth); + set_rnd_ipv6(&tbl6[i], &rt6[j].addr, rt6[j].depth); } } } @@ -522,7 +521,7 @@ parse_rt_6(FILE *f) s = NULL; } - ret = _inet_net_pton(AF_INET6, in[RT_PREFIX], rt[j].addr); + ret = _inet_net_pton(AF_INET6, in[RT_PREFIX], &rt[j].addr); if (ret < 0) return ret; @@ -1023,7 +1022,7 @@ dump_rt_6(struct rt_rule_6 *rt) } for (i = 0; i < config.nb_routes; i++) { - fprintf(f, NIPQUAD6_FMT"/%d %"PRIu64"\n", NIPQUAD6(rt[i].addr), + fprintf(f, NIPQUAD6_FMT"/%d %"PRIu64"\n", NIPQUAD6(&rt[i].addr), rt[i].depth, rt[i].nh); } @@ -1043,7 +1042,7 @@ run_v6(void) int ret = 0; struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config lpm_conf; - uint8_t *tbl6; + struct rte_ipv6_addr *tbl6; uint64_t fib_nh[BURST_SZ]; int32_t lpm_nh[BURST_SZ]; @@ -1094,7 +1093,7 @@ run_v6(void) for (k = config.print_fract, i = 0; k > 0; k--) { start = rte_rdtsc_precise(); for (j = 0; j < (config.nb_routes - i) / k; j++) { - ret = rte_fib6_add(fib, rt[i + j].addr, + ret = rte_fib6_add(fib, &rt[i + j].addr, rt[i + j].depth, rt[i + j].nh); if (unlikely(ret != 0)) { printf("Can not add a route to FIB, err %d\n", @@ -1120,7 +1119,7 @@ run_v6(void) for (k = config.print_fract, i = 0; k > 0; k--) { start = rte_rdtsc_precise(); for (j = 0; j < (config.nb_routes - i) / k; j++) { - ret = rte_lpm6_add(lpm, rt[i + j].addr, + ret = rte_lpm6_add(lpm, &rt[i + j].addr, rt[i + j].depth, rt[i + j].nh); if (ret != 0) { if (rt[i + j].depth == 0) @@ -1139,7 +1138,7 @@ run_v6(void) acc = 0; for (i = 0; i < config.nb_lookup_ips; i += BURST_SZ) { start = rte_rdtsc_precise(); - ret = rte_fib6_lookup_bulk(fib, (uint8_t (*)[16])(tbl6 + i*16), + ret = rte_fib6_lookup_bulk(fib, &tbl6[i], fib_nh, BURST_SZ); acc += rte_rdtsc_precise() - start; if (ret != 0) { @@ -1154,7 +1153,7 @@ run_v6(void) for (i = 0; i < config.nb_lookup_ips; i += BURST_SZ) { start = rte_rdtsc_precise(); ret = rte_lpm6_lookup_bulk_func(lpm, - (uint8_t (*)[16])(tbl6 + i*16), + &tbl6[i], lpm_nh, BURST_SZ); acc += rte_rdtsc_precise() - start; if (ret != 0) { @@ -1166,10 +1165,10 @@ run_v6(void) for (i = 0; i < config.nb_lookup_ips; i += BURST_SZ) { rte_fib6_lookup_bulk(fib, - (uint8_t (*)[16])(tbl6 + i*16), + &tbl6[i], fib_nh, BURST_SZ); rte_lpm6_lookup_bulk_func(lpm, - (uint8_t (*)[16])(tbl6 + i*16), + &tbl6[i], lpm_nh, BURST_SZ); for (j = 0; j < BURST_SZ; j++) { if ((fib_nh[j] != (uint32_t)lpm_nh[j]) && @@ -1186,7 +1185,7 @@ run_v6(void) for (k = config.print_fract, i = 0; k > 0; k--) { start = rte_rdtsc_precise(); for (j = 0; j < (config.nb_routes - i) / k; j++) - rte_fib6_delete(fib, rt[i + j].addr, rt[i + j].depth); + rte_fib6_delete(fib, &rt[i + j].addr, rt[i + j].depth); printf("AVG FIB delete %"PRIu64"\n", (rte_rdtsc_precise() - start) / j); @@ -1197,7 +1196,7 @@ run_v6(void) for (k = config.print_fract, i = 0; k > 0; k--) { start = rte_rdtsc_precise(); for (j = 0; j < (config.nb_routes - i) / k; j++) - rte_lpm6_delete(lpm, rt[i + j].addr, + rte_lpm6_delete(lpm, &rt[i + j].addr, rt[i + j].depth); printf("AVG LPM delete %"PRIu64"\n", diff --git a/app/test-pipeline/pipeline_lpm_ipv6.c b/app/test-pipeline/pipeline_lpm_ipv6.c index 207ffbeff00f..6558e887c859 100644 --- a/app/test-pipeline/pipeline_lpm_ipv6.c +++ b/app/test-pipeline/pipeline_lpm_ipv6.c @@ -127,16 +127,11 @@ app_main_loop_worker_pipeline_lpm_ipv6(void) { ip = rte_bswap32(i << (24 - rte_popcount32(app.n_ports - 1))); - memcpy(key.ip, &ip, sizeof(uint32_t)); + memcpy(&key.ip, &ip, sizeof(uint32_t)); printf("Adding rule to IPv6 LPM table (IPv6 destination = " - "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:" - "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x/%u => " - "port out = %u)\n", - key.ip[0], key.ip[1], key.ip[2], key.ip[3], - key.ip[4], key.ip[5], key.ip[6], key.ip[7], - key.ip[8], key.ip[9], key.ip[10], key.ip[11], - key.ip[12], key.ip[13], key.ip[14], key.ip[15], + RTE_IPV6_ADDR_FMT "/%u => port out = %u)\n", + RTE_IPV6_ADDR_SPLIT(&key.ip), key.depth, i); status = rte_pipeline_table_entry_add(p, table_id, &key, &entry, diff --git a/app/test/test_fib6.c b/app/test/test_fib6.c index 2f836238fbf7..d8149e028e4f 100644 --- a/app/test/test_fib6.c +++ b/app/test/test_fib6.c @@ -147,7 +147,7 @@ test_add_del_invalid(void) struct rte_fib6 *fib = NULL; struct rte_fib6_conf config; uint64_t nh = 100; - uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE] = {0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; int ret; uint8_t depth = 24; @@ -157,12 +157,12 @@ test_add_del_invalid(void) config.type = RTE_FIB6_DUMMY; /* rte_fib6_add: fib == NULL */ - ret = rte_fib6_add(NULL, ip, depth, nh); + ret = rte_fib6_add(NULL, &ip, depth, nh); RTE_TEST_ASSERT(ret < 0, "Call succeeded with invalid parameters\n"); /* rte_fib6_delete: fib == NULL */ - ret = rte_fib6_delete(NULL, ip, depth); + ret = rte_fib6_delete(NULL, &ip, depth); RTE_TEST_ASSERT(ret < 0, "Call succeeded with invalid parameters\n"); @@ -171,12 +171,12 @@ test_add_del_invalid(void) RTE_TEST_ASSERT(fib != NULL, "Failed to create FIB\n"); /* rte_fib6_add: depth > RTE_FIB6_MAXDEPTH */ - ret = rte_fib6_add(fib, ip, RTE_FIB6_MAXDEPTH + 1, nh); + ret = rte_fib6_add(fib, &ip, RTE_FIB6_MAXDEPTH + 1, nh); RTE_TEST_ASSERT(ret < 0, "Call succeeded with invalid parameters\n"); /* rte_fib6_delete: depth > RTE_FIB6_MAXDEPTH */ - ret = rte_fib6_delete(fib, ip, RTE_FIB6_MAXDEPTH + 1); + ret = rte_fib6_delete(fib, &ip, RTE_FIB6_MAXDEPTH + 1); RTE_TEST_ASSERT(ret < 0, "Call succeeded with invalid parameters\n"); @@ -212,8 +212,8 @@ test_get_invalid(void) */ static int lookup_and_check_asc(struct rte_fib6 *fib, - uint8_t ip_arr[RTE_FIB6_MAXDEPTH][RTE_FIB6_IPV6_ADDR_SIZE], - uint8_t ip_missing[][RTE_FIB6_IPV6_ADDR_SIZE], uint64_t def_nh, + struct rte_ipv6_addr *ip_arr, + struct rte_ipv6_addr *ip_missing, uint64_t def_nh, uint32_t n) { uint64_t nh_arr[RTE_FIB6_MAXDEPTH]; @@ -240,8 +240,8 @@ lookup_and_check_asc(struct rte_fib6 *fib, static int lookup_and_check_desc(struct rte_fib6 *fib, - uint8_t ip_arr[RTE_FIB6_MAXDEPTH][RTE_FIB6_IPV6_ADDR_SIZE], - uint8_t ip_missing[][RTE_FIB6_IPV6_ADDR_SIZE], uint64_t def_nh, + struct rte_ipv6_addr *ip_arr, + struct rte_ipv6_addr *ip_missing, uint64_t def_nh, uint32_t n) { uint64_t nh_arr[RTE_FIB6_MAXDEPTH]; @@ -270,61 +270,60 @@ static int check_fib(struct rte_fib6 *fib) { uint64_t def_nh = 100; - uint8_t ip_arr[RTE_FIB6_MAXDEPTH][RTE_FIB6_IPV6_ADDR_SIZE]; - uint8_t ip_add[RTE_FIB6_IPV6_ADDR_SIZE] = {0}; - uint8_t ip_missing[1][RTE_FIB6_IPV6_ADDR_SIZE] = { {255} }; + struct rte_ipv6_addr ip_arr[RTE_FIB6_MAXDEPTH]; + struct rte_ipv6_addr ip_add = RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); + struct rte_ipv6_addr ip_missing = + RTE_IPV6(0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff); uint32_t i, j; int ret; - ip_add[0] = 128; - ip_missing[0][0] = 127; for (i = 0; i < RTE_FIB6_MAXDEPTH; i++) { for (j = 0; j < RTE_FIB6_IPV6_ADDR_SIZE; j++) { - ip_arr[i][j] = ip_add[j] | + ip_arr[i].a[j] = ip_add.a[j] | ~get_msk_part(RTE_FIB6_MAXDEPTH - i, j); } } - ret = lookup_and_check_desc(fib, ip_arr, ip_missing, def_nh, 0); + ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, 0); RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); for (i = 1; i <= RTE_FIB6_MAXDEPTH; i++) { - ret = rte_fib6_add(fib, ip_add, i, i); + ret = rte_fib6_add(fib, &ip_add, i, i); RTE_TEST_ASSERT(ret == 0, "Failed to add a route\n"); - ret = lookup_and_check_asc(fib, ip_arr, ip_missing, def_nh, i); + ret = lookup_and_check_asc(fib, ip_arr, &ip_missing, def_nh, i); RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); } for (i = RTE_FIB6_MAXDEPTH; i > 1; i--) { - ret = rte_fib6_delete(fib, ip_add, i); + ret = rte_fib6_delete(fib, &ip_add, i); RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); - ret = lookup_and_check_asc(fib, ip_arr, ip_missing, + ret = lookup_and_check_asc(fib, ip_arr, &ip_missing, def_nh, i - 1); RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); } - ret = rte_fib6_delete(fib, ip_add, i); + ret = rte_fib6_delete(fib, &ip_add, i); RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); - ret = lookup_and_check_desc(fib, ip_arr, ip_missing, def_nh, 0); + ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, 0); RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); for (i = 0; i < RTE_FIB6_MAXDEPTH; i++) { - ret = rte_fib6_add(fib, ip_add, RTE_FIB6_MAXDEPTH - i, + ret = rte_fib6_add(fib, &ip_add, RTE_FIB6_MAXDEPTH - i, RTE_FIB6_MAXDEPTH - i); RTE_TEST_ASSERT(ret == 0, "Failed to add a route\n"); - ret = lookup_and_check_desc(fib, ip_arr, ip_missing, + ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, i + 1); RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); } for (i = 1; i <= RTE_FIB6_MAXDEPTH; i++) { - ret = rte_fib6_delete(fib, ip_add, i); + ret = rte_fib6_delete(fib, &ip_add, i); RTE_TEST_ASSERT(ret == 0, "Failed to delete a route\n"); - ret = lookup_and_check_desc(fib, ip_arr, ip_missing, def_nh, + ret = lookup_and_check_desc(fib, ip_arr, &ip_missing, def_nh, RTE_FIB6_MAXDEPTH - i); RTE_TEST_ASSERT(ret == TEST_SUCCESS, "Lookup and check fails\n"); diff --git a/app/test/test_fib6_perf.c b/app/test/test_fib6_perf.c index fe713e7094e5..a96a0d6b2cdc 100644 --- a/app/test/test_fib6_perf.c +++ b/app/test/test_fib6_perf.c @@ -73,7 +73,7 @@ test_fib6_perf(void) uint64_t next_hop_add; int status = 0; int64_t count = 0; - uint8_t ip_batch[NUM_IPS_ENTRIES][16]; + struct rte_ipv6_addr ip_batch[NUM_IPS_ENTRIES]; uint64_t next_hops[NUM_IPS_ENTRIES]; conf.type = RTE_FIB6_TRIE; @@ -101,7 +101,7 @@ test_fib6_perf(void) for (i = 0; i < NUM_ROUTE_ENTRIES; i++) { next_hop_add = (i & ((1 << 14) - 1)) + 1; - if (rte_fib6_add(fib, large_route_table[i].ip, + if (rte_fib6_add(fib, &large_route_table[i].ip, large_route_table[i].depth, next_hop_add) == 0) status++; } @@ -117,7 +117,7 @@ test_fib6_perf(void) count = 0; for (i = 0; i < NUM_IPS_ENTRIES; i++) - memcpy(ip_batch[i], large_ips_table[i].ip, 16); + ip_batch[i] = large_ips_table[i].ip; for (i = 0; i < ITERATIONS; i++) { @@ -140,7 +140,7 @@ test_fib6_perf(void) for (i = 0; i < NUM_ROUTE_ENTRIES; i++) { /* rte_fib_delete(fib, ip, depth) */ - status += rte_fib6_delete(fib, large_route_table[i].ip, + status += rte_fib6_delete(fib, &large_route_table[i].ip, large_route_table[i].depth); } diff --git a/app/test/test_lpm6.c b/app/test/test_lpm6.c index 1d8a0afa1155..b930fa3f0c17 100644 --- a/app/test/test_lpm6.c +++ b/app/test/test_lpm6.c @@ -92,30 +92,6 @@ rte_lpm6_test tests6[] = { #define MAX_NUM_TBL8S (1 << 21) #define PASS 0 -static void -IPv6(uint8_t *ip, uint8_t b1, uint8_t b2, uint8_t b3, uint8_t b4, uint8_t b5, - uint8_t b6, uint8_t b7, uint8_t b8, uint8_t b9, uint8_t b10, - uint8_t b11, uint8_t b12, uint8_t b13, uint8_t b14, uint8_t b15, - uint8_t b16) -{ - ip[0] = b1; - ip[1] = b2; - ip[2] = b3; - ip[3] = b4; - ip[4] = b5; - ip[5] = b6; - ip[6] = b7; - ip[7] = b8; - ip[8] = b9; - ip[9] = b10; - ip[10] = b11; - ip[11] = b12; - ip[12] = b13; - ip[13] = b14; - ip[14] = b15; - ip[15] = b16; -} - /* * Check that rte_lpm6_create fails gracefully for incorrect user input * arguments @@ -250,7 +226,7 @@ test4(void) struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth = 24, next_hop = 100; int32_t status = 0; @@ -259,7 +235,7 @@ test4(void) config.flags = 0; /* rte_lpm6_add: lpm == NULL */ - status = rte_lpm6_add(NULL, ip, depth, next_hop); + status = rte_lpm6_add(NULL, &ip, depth, next_hop); TEST_LPM_ASSERT(status < 0); /*Create valid lpm to use in rest of test. */ @@ -267,11 +243,11 @@ test4(void) TEST_LPM_ASSERT(lpm != NULL); /* rte_lpm6_add: depth < 1 */ - status = rte_lpm6_add(lpm, ip, 0, next_hop); + status = rte_lpm6_add(lpm, &ip, 0, next_hop); TEST_LPM_ASSERT(status < 0); /* rte_lpm6_add: depth > MAX_DEPTH */ - status = rte_lpm6_add(lpm, ip, (MAX_DEPTH + 1), next_hop); + status = rte_lpm6_add(lpm, &ip, (MAX_DEPTH + 1), next_hop); TEST_LPM_ASSERT(status < 0); rte_lpm6_free(lpm); @@ -288,7 +264,7 @@ test5(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth = 24; int32_t status = 0; @@ -297,7 +273,7 @@ test5(void) config.flags = 0; /* rte_lpm_delete: lpm == NULL */ - status = rte_lpm6_delete(NULL, ip, depth); + status = rte_lpm6_delete(NULL, &ip, depth); TEST_LPM_ASSERT(status < 0); /*Create valid lpm to use in rest of test. */ @@ -305,11 +281,11 @@ test5(void) TEST_LPM_ASSERT(lpm != NULL); /* rte_lpm_delete: depth < 1 */ - status = rte_lpm6_delete(lpm, ip, 0); + status = rte_lpm6_delete(lpm, &ip, 0); TEST_LPM_ASSERT(status < 0); /* rte_lpm_delete: depth > MAX_DEPTH */ - status = rte_lpm6_delete(lpm, ip, (MAX_DEPTH + 1)); + status = rte_lpm6_delete(lpm, &ip, (MAX_DEPTH + 1)); TEST_LPM_ASSERT(status < 0); rte_lpm6_free(lpm); @@ -326,7 +302,7 @@ test6(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint32_t next_hop_return = 0; int32_t status = 0; @@ -335,7 +311,7 @@ test6(void) config.flags = 0; /* rte_lpm6_lookup: lpm == NULL */ - status = rte_lpm6_lookup(NULL, ip, &next_hop_return); + status = rte_lpm6_lookup(NULL, &ip, &next_hop_return); TEST_LPM_ASSERT(status < 0); /*Create valid lpm to use in rest of test. */ @@ -347,7 +323,7 @@ test6(void) TEST_LPM_ASSERT(status < 0); /* rte_lpm6_lookup: next_hop = NULL */ - status = rte_lpm6_lookup(lpm, ip, NULL); + status = rte_lpm6_lookup(lpm, &ip, NULL); TEST_LPM_ASSERT(status < 0); rte_lpm6_free(lpm); @@ -364,7 +340,7 @@ test7(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[10][16]; + struct rte_ipv6_addr ips[10]; int32_t next_hop_return[10]; int32_t status = 0; @@ -373,7 +349,7 @@ test7(void) config.flags = 0; /* rte_lpm6_lookup: lpm == NULL */ - status = rte_lpm6_lookup_bulk_func(NULL, ip, next_hop_return, 10); + status = rte_lpm6_lookup_bulk_func(NULL, ips, next_hop_return, RTE_DIM(ips)); TEST_LPM_ASSERT(status < 0); /*Create valid lpm to use in rest of test. */ @@ -381,11 +357,11 @@ test7(void) TEST_LPM_ASSERT(lpm != NULL); /* rte_lpm6_lookup: ip = NULL */ - status = rte_lpm6_lookup_bulk_func(lpm, NULL, next_hop_return, 10); + status = rte_lpm6_lookup_bulk_func(lpm, NULL, next_hop_return, RTE_DIM(ips)); TEST_LPM_ASSERT(status < 0); /* rte_lpm6_lookup: next_hop = NULL */ - status = rte_lpm6_lookup_bulk_func(lpm, ip, NULL, 10); + status = rte_lpm6_lookup_bulk_func(lpm, ips, NULL, RTE_DIM(ips)); TEST_LPM_ASSERT(status < 0); rte_lpm6_free(lpm); @@ -402,7 +378,7 @@ test8(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[10][16]; + struct rte_ipv6_addr ips[10]; uint8_t depth[10]; int32_t status = 0; @@ -411,7 +387,7 @@ test8(void) config.flags = 0; /* rte_lpm6_delete: lpm == NULL */ - status = rte_lpm6_delete_bulk_func(NULL, ip, depth, 10); + status = rte_lpm6_delete_bulk_func(NULL, ips, depth, RTE_DIM(ips)); TEST_LPM_ASSERT(status < 0); /*Create valid lpm to use in rest of test. */ @@ -419,11 +395,11 @@ test8(void) TEST_LPM_ASSERT(lpm != NULL); /* rte_lpm6_delete: ip = NULL */ - status = rte_lpm6_delete_bulk_func(lpm, NULL, depth, 10); + status = rte_lpm6_delete_bulk_func(lpm, NULL, depth, RTE_DIM(ips)); TEST_LPM_ASSERT(status < 0); /* rte_lpm6_delete: next_hop = NULL */ - status = rte_lpm6_delete_bulk_func(lpm, ip, NULL, 10); + status = rte_lpm6_delete_bulk_func(lpm, ips, NULL, RTE_DIM(ips)); TEST_LPM_ASSERT(status < 0); rte_lpm6_free(lpm); @@ -441,7 +417,7 @@ test9(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth = 16; uint32_t next_hop_add = 100, next_hop_return = 0; int32_t status = 0; @@ -454,21 +430,21 @@ test9(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); for (i = 0; i < UINT8_MAX; i++) { - ip[2] = i; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + ip.a[2] = i; + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); } - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); for (i = 0; i < UINT8_MAX; i++) { - ip[2] = i; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + ip.a[2] = i; + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); } @@ -486,7 +462,7 @@ test10(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth; uint32_t next_hop_add = 100; int32_t status = 0; @@ -501,20 +477,20 @@ test10(void) for (i = 1; i < 128; i++) { depth = (uint8_t)i; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); } depth = 128; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == -ENOSPC); depth = 127; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); depth = 128; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); rte_lpm6_free(lpm); @@ -531,7 +507,7 @@ test11(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth; uint32_t next_hop_add = 100; int32_t status = 0; @@ -544,37 +520,37 @@ test11(void) TEST_LPM_ASSERT(lpm != NULL); depth = 128; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - ip[0] = 1; + ip.a[0] = 1; depth = 25; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); depth = 33; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); depth = 41; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); depth = 49; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == -ENOSPC); depth = 41; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); rte_lpm6_free(lpm); @@ -592,7 +568,7 @@ test12(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth; uint32_t next_hop_add = 100; int32_t status = 0; @@ -605,16 +581,16 @@ test12(void) TEST_LPM_ASSERT(lpm != NULL); depth = 128; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - ip[0] = 1; + ip.a[0] = 1; depth = 41; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); depth = 49; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == -ENOSPC); rte_lpm6_free(lpm); @@ -631,7 +607,7 @@ test13(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth; uint32_t next_hop_add = 100; int32_t status = 0; @@ -644,23 +620,23 @@ test13(void) TEST_LPM_ASSERT(lpm != NULL); depth = 1; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); depth = 2; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); depth = 3; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == -ENOSPC); depth = 2; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); depth = 3; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); rte_lpm6_free(lpm); @@ -679,7 +655,7 @@ test14(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth = 25; uint32_t next_hop_add = 100; int32_t status = 0; @@ -693,24 +669,24 @@ test14(void) TEST_LPM_ASSERT(lpm != NULL); for (i = 0; i < 256; i++) { - ip[0] = (uint8_t)i; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + ip.a[0] = (uint8_t)i; + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); } - ip[0] = 255; - ip[1] = 1; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + ip.a[0] = 255; + ip.a[1] = 1; + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == -ENOSPC); - ip[0] = 255; - ip[1] = 0; - status = rte_lpm6_delete(lpm, ip, depth); + ip.a[0] = 255; + ip.a[1] = 0; + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - ip[0] = 255; - ip[1] = 1; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + ip.a[0] = 255; + ip.a[1] = 1; + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); rte_lpm6_free(lpm); @@ -726,7 +702,7 @@ test15(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6_ADDR_UNSPEC; uint8_t depth = 24; uint32_t next_hop_add = 100, next_hop_return = 0; int32_t status = 0; @@ -738,16 +714,16 @@ test15(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_free(lpm); @@ -763,7 +739,7 @@ test16(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip = RTE_IPV6(0x0c0c, 0x0100, 0, 0, 0, 0, 0, 0); uint8_t depth = 128; uint32_t next_hop_add = 100, next_hop_return = 0; int32_t status = 0; @@ -775,16 +751,16 @@ test16(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_free(lpm); @@ -806,9 +782,9 @@ test17(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip1[] = {127,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255}; - uint8_t ip2[] = {128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + struct rte_ipv6_addr ip1 = + RTE_IPV6(0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff); + struct rte_ipv6_addr ip2 = RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); uint8_t depth; uint32_t next_hop_add, next_hop_return; int32_t status = 0; @@ -825,14 +801,14 @@ test17(void) /* Let the next_hop_add value = depth. Just for change. */ next_hop_add = depth; - status = rte_lpm6_add(lpm, ip2, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip2, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); /* Check IP in first half of tbl24 which should be empty. */ - status = rte_lpm6_lookup(lpm, ip1, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip1, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); - status = rte_lpm6_lookup(lpm, ip2, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip2, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); } @@ -841,10 +817,10 @@ test17(void) for (depth = 16; depth >= 1; depth--) { next_hop_add = (depth - 1); - status = rte_lpm6_delete(lpm, ip2, depth); + status = rte_lpm6_delete(lpm, &ip2, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip2, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip2, &next_hop_return); if (depth != 1) { TEST_LPM_ASSERT((status == 0) && @@ -854,7 +830,7 @@ test17(void) TEST_LPM_ASSERT(status == -ENOENT); } - status = rte_lpm6_lookup(lpm, ip1, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip1, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); } @@ -874,7 +850,7 @@ test18(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[16], ip_1[16], ip_2[16]; + struct rte_ipv6_addr ip, ip_1, ip_2; uint8_t depth, depth_1, depth_2; uint32_t next_hop_add, next_hop_add_1, next_hop_add_2, next_hop_return; @@ -885,58 +861,58 @@ test18(void) config.flags = 0; /* Add & lookup to hit invalid TBL24 entry */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; next_hop_add = 100; lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); /* Add & lookup to hit valid TBL24 entry not extended */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 23; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); depth = 24; next_hop_add = 101; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); depth = 24; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); depth = 23; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); @@ -944,37 +920,37 @@ test18(void) /* Add & lookup to hit valid extended TBL24 entry with invalid TBL8 * entry. */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 32; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - IPv6(ip, 128, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0x0005, 0, 0, 0, 0, 0, 0); depth = 32; next_hop_add = 101; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 32; next_hop_add = 100; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); @@ -982,38 +958,38 @@ test18(void) /* Add & lookup to hit valid extended TBL24 entry with valid TBL8 * entry */ - IPv6(ip_1, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_1 = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth_1 = 25; next_hop_add_1 = 101; - IPv6(ip_2, 128, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_2 = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0x0005, 0, 0, 0, 0, 0, 0); depth_2 = 32; next_hop_add_2 = 102; next_hop_return = 0; - status = rte_lpm6_add(lpm, ip_1, depth_1, next_hop_add_1); + status = rte_lpm6_add(lpm, &ip_1, depth_1, next_hop_add_1); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_1, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_1, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_1)); - status = rte_lpm6_add(lpm, ip_2, depth_2, next_hop_add_2); + status = rte_lpm6_add(lpm, &ip_2, depth_2, next_hop_add_2); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_2, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_2, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_2)); - status = rte_lpm6_delete(lpm, ip_2, depth_2); + status = rte_lpm6_delete(lpm, &ip_2, depth_2); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_2, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_2, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_1)); - status = rte_lpm6_delete(lpm, ip_1, depth_1); + status = rte_lpm6_delete(lpm, &ip_1, depth_1); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_1, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_1, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_free(lpm); @@ -1037,7 +1013,7 @@ test19(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t depth; uint32_t next_hop_add, next_hop_return; int32_t status = 0; @@ -1052,35 +1028,35 @@ test19(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 16; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 25; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); rte_lpm6_delete_all(lpm); @@ -1090,45 +1066,45 @@ test19(void) * (& delete & lookup) */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip, 128, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0x000a, 0, 0, 0, 0, 0, 0); depth = 32; next_hop_add = 101; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); next_hop_add = 100; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); - IPv6(ip, 128, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0x000a, 0, 0, 0, 0, 0, 0); depth = 32; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); @@ -1138,28 +1114,28 @@ test19(void) * (& delete & lookup) */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); next_hop_add = 101; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); @@ -1169,56 +1145,56 @@ test19(void) * (& delete & lookup) */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 32; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); next_hop_add = 101; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); /* Delete a rule that is not present in the TBL24 & lookup */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; next_hop_add = 100; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status < 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_delete_all(lpm); /* Delete a rule that is not present in the TBL8 & lookup */ - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 32; next_hop_add = 100; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status < 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_free(lpm); @@ -1236,7 +1212,7 @@ test20(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t depth; uint32_t next_hop_add, next_hop_return; int32_t status = 0; @@ -1248,45 +1224,45 @@ test20(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0x000a); depth = 128; next_hop_add = 101; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); next_hop_add = 100; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 24; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0x000a); depth = 128; - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); rte_lpm6_free(lpm); @@ -1304,7 +1280,7 @@ test21(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip_batch[4][16]; + struct rte_ipv6_addr ip_batch[4]; uint8_t depth; uint32_t next_hop_add; int32_t next_hop_return[4]; @@ -1317,28 +1293,28 @@ test21(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - IPv6(ip_batch[0], 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[0] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0001, 0, 0, 0, 0, 0); depth = 48; next_hop_add = 100; - status = rte_lpm6_add(lpm, ip_batch[0], depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[0], depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[1], 128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[1] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0002, 0, 0, 0, 0, 0); depth = 48; next_hop_add = 101; - status = rte_lpm6_add(lpm, ip_batch[1], depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[1], depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[2], 128, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[2] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0003, 0, 0, 0, 0, 0); depth = 48; next_hop_add = 102; - status = rte_lpm6_add(lpm, ip_batch[2], depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[2], depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[3], 128, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[3] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0004, 0, 0, 0, 0, 0); status = rte_lpm6_lookup_bulk_func(lpm, ip_batch, next_hop_return, 4); @@ -1363,7 +1339,7 @@ test22(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip_batch[5][16]; + struct rte_ipv6_addr ip_batch[5]; uint8_t depth[5]; uint32_t next_hop_add; int32_t next_hop_return[5]; @@ -1378,39 +1354,39 @@ test22(void) /* Adds 5 rules and look them up */ - IPv6(ip_batch[0], 128, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[0] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0001, 0, 0, 0, 0, 0); depth[0] = 48; next_hop_add = 101; - status = rte_lpm6_add(lpm, ip_batch[0], depth[0], next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[0], depth[0], next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[1], 128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[1] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0002, 0, 0, 0, 0, 0); depth[1] = 48; next_hop_add = 102; - status = rte_lpm6_add(lpm, ip_batch[1], depth[1], next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[1], depth[1], next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[2], 128, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[2] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0003, 0, 0, 0, 0, 0); depth[2] = 48; next_hop_add = 103; - status = rte_lpm6_add(lpm, ip_batch[2], depth[2], next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[2], depth[2], next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[3], 128, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[3] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0004, 0, 0, 0, 0, 0); depth[3] = 48; next_hop_add = 104; - status = rte_lpm6_add(lpm, ip_batch[3], depth[3], next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[3], depth[3], next_hop_add); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[4], 128, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[4] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0005, 0, 0, 0, 0, 0); depth[4] = 48; next_hop_add = 105; - status = rte_lpm6_add(lpm, ip_batch[4], depth[4], next_hop_add); + status = rte_lpm6_add(lpm, &ip_batch[4], depth[4], next_hop_add); TEST_LPM_ASSERT(status == 0); status = rte_lpm6_lookup_bulk_func(lpm, ip_batch, @@ -1443,11 +1419,11 @@ test22(void) /* Use the delete_bulk function to delete two, one invalid. Lookup again */ - IPv6(ip_batch[4], 128, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[4] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0006, 0, 0, 0, 0, 0); status = rte_lpm6_delete_bulk_func(lpm, &ip_batch[3], depth, 2); TEST_LPM_ASSERT(status == 0); - IPv6(ip_batch[4], 128, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip_batch[4] = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0x0005, 0, 0, 0, 0, 0); status = rte_lpm6_lookup_bulk_func(lpm, ip_batch, next_hop_return, 5); TEST_LPM_ASSERT(status == 0 && next_hop_return[0] == -1 @@ -1481,7 +1457,7 @@ test23(void) struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; uint32_t i; - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t depth; uint32_t next_hop_add, next_hop_return; int32_t status = 0; @@ -1493,22 +1469,22 @@ test23(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - IPv6(ip, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + ip = (struct rte_ipv6_addr)RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0); depth = 128; next_hop_add = 100; for (i = 0; i < 30; i++) { - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT(status == -ENOENT); } @@ -1565,7 +1541,7 @@ test25(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint32_t i; uint8_t depth; uint32_t next_hop_add, next_hop_return, next_hop_expected; @@ -1579,10 +1555,10 @@ test25(void) TEST_LPM_ASSERT(lpm != NULL); for (i = 0; i < 1000; i++) { - memcpy(ip, large_route_table[i].ip, 16); + ip = large_route_table[i].ip; depth = large_route_table[i].depth; next_hop_add = large_route_table[i].next_hop; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); } @@ -1590,10 +1566,10 @@ test25(void) generate_large_ips_table(1); for (i = 0; i < 100000; i++) { - memcpy(ip, large_ips_table[i].ip, 16); + ip = large_ips_table[i].ip; next_hop_expected = large_ips_table[i].next_hop; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_expected)); } @@ -1615,9 +1591,9 @@ test26(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip_10_32[] = {10, 10, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t ip_10_24[] = {10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t ip_20_25[] = {10, 10, 20, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + struct rte_ipv6_addr ip_10_32 = RTE_IPV6(0x0a0a, 0x0a02, 0, 0, 0, 0, 0, 0); + struct rte_ipv6_addr ip_10_24 = RTE_IPV6(0x0a0a, 0x0a00, 0, 0, 0, 0, 0, 0); + struct rte_ipv6_addr ip_20_25 = RTE_IPV6(0x0a0a, 0x1402, 0, 0, 0, 0, 0, 0); uint8_t d_ip_10_32 = 32; uint8_t d_ip_10_24 = 24; uint8_t d_ip_20_25 = 25; @@ -1634,29 +1610,26 @@ test26(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - if ((status = rte_lpm6_add(lpm, ip_10_32, d_ip_10_32, - next_hop_ip_10_32)) < 0) - return -1; + status = rte_lpm6_add(lpm, &ip_10_32, d_ip_10_32, next_hop_ip_10_32); + TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_10_32, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_10_32, &next_hop_return); uint32_t test_hop_10_32 = next_hop_return; TEST_LPM_ASSERT(status == 0); TEST_LPM_ASSERT(next_hop_return == next_hop_ip_10_32); - if ((status = rte_lpm6_add(lpm, ip_10_24, d_ip_10_24, - next_hop_ip_10_24)) < 0) - return -1; + status = rte_lpm6_add(lpm, &ip_10_24, d_ip_10_24, next_hop_ip_10_24); + TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_10_24, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_10_24, &next_hop_return); uint32_t test_hop_10_24 = next_hop_return; TEST_LPM_ASSERT(status == 0); TEST_LPM_ASSERT(next_hop_return == next_hop_ip_10_24); - if ((status = rte_lpm6_add(lpm, ip_20_25, d_ip_20_25, - next_hop_ip_20_25)) < 0) - return -1; + status = rte_lpm6_add(lpm, &ip_20_25, d_ip_20_25, next_hop_ip_20_25); + TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip_20_25, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_20_25, &next_hop_return); uint32_t test_hop_20_25 = next_hop_return; TEST_LPM_ASSERT(status == 0); TEST_LPM_ASSERT(next_hop_return == next_hop_ip_20_25); @@ -1671,11 +1644,11 @@ test26(void) return -1; } - status = rte_lpm6_lookup(lpm, ip_10_32, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_10_32, &next_hop_return); TEST_LPM_ASSERT(status == 0); TEST_LPM_ASSERT(next_hop_return == next_hop_ip_10_32); - status = rte_lpm6_lookup(lpm, ip_10_24, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip_10_24, &next_hop_return); TEST_LPM_ASSERT(status == 0); TEST_LPM_ASSERT(next_hop_return == next_hop_ip_10_24); @@ -1695,7 +1668,8 @@ test27(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = {128,128,128,128,128,128,128,128,128,128,128,128,128,128,0,0}; + struct rte_ipv6_addr ip = + RTE_IPV6(0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0); uint8_t depth = 128; uint32_t next_hop_add = 100, next_hop_return; int32_t status = 0; @@ -1710,19 +1684,19 @@ test27(void) depth = 128; next_hop_add = 128; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); depth = 112; next_hop_add = 112; - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); for (i = 0; i < 256; i++) { - ip[14] = (uint8_t)i; + ip.a[14] = i; for (j = 0; j < 256; j++) { - ip[15] = (uint8_t)j; - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + ip.a[15] = j; + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); if (i == 0 && j == 0) TEST_LPM_ASSERT(status == 0 && next_hop_return == 128); else @@ -1746,7 +1720,7 @@ test28(void) { struct rte_lpm6 *lpm = NULL; struct rte_lpm6_config config; - uint8_t ip[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + struct rte_ipv6_addr ip = RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0); uint8_t depth = 16; uint32_t next_hop_add = 0x001FFFFF, next_hop_return = 0; int32_t status = 0; @@ -1758,13 +1732,13 @@ test28(void) lpm = rte_lpm6_create(__func__, SOCKET_ID_ANY, &config); TEST_LPM_ASSERT(lpm != NULL); - status = rte_lpm6_add(lpm, ip, depth, next_hop_add); + status = rte_lpm6_add(lpm, &ip, depth, next_hop_add); TEST_LPM_ASSERT(status == 0); - status = rte_lpm6_lookup(lpm, ip, &next_hop_return); + status = rte_lpm6_lookup(lpm, &ip, &next_hop_return); TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); - status = rte_lpm6_delete(lpm, ip, depth); + status = rte_lpm6_delete(lpm, &ip, depth); TEST_LPM_ASSERT(status == 0); rte_lpm6_free(lpm); diff --git a/app/test/test_lpm6_data.h b/app/test/test_lpm6_data.h index 8ddb59563ee4..2a20b9ec36f1 100644 --- a/app/test/test_lpm6_data.h +++ b/app/test/test_lpm6_data.h @@ -7,16 +7,17 @@ #include #include +#include #include struct rules_tbl_entry { - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t depth; uint8_t next_hop; }; struct ips_tbl_entry { - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t next_hop; }; @@ -29,1006 +30,1006 @@ struct ips_tbl_entry { */ static struct rules_tbl_entry large_route_table[] = { - {{66, 70, 154, 143, 197, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 146}, - {{107, 79, 18, 235, 142, 84, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 141}, - {{247, 132, 113, 1, 215, 247, 183, 239, 128, 0, 0, 0, 0, 0, 0, 0}, 67, 23}, - {{48, 19, 41, 12, 76, 101, 114, 160, 45, 103, 134, 146, 128, 0, 0, 0}, 97, 252}, - {{5, 70, 208, 170, 19, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 6}, - {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 137}, - {{12, 188, 26, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 31, 9}, - {{1, 235, 101, 202, 26, 92, 23, 22, 179, 223, 128, 0, 0, 0, 0, 0}, 82, 9}, - {{215, 19, 224, 102, 45, 133, 102, 249, 56, 20, 214, 219, 93, 125, 52, 0}, 120, 163}, - {{178, 183, 109, 64, 136, 84, 11, 53, 217, 102, 0, 0, 0, 0, 0, 0}, 79, 197}, - {{212, 39, 158, 71, 253, 98, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 249}, - {{92, 58, 159, 130, 105, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 88}, - {{118, 140, 65, 198, 212, 93, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 104}, - {{86, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 36}, - {{79, 135, 242, 193, 197, 11, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 239}, - {{163, 228, 239, 80, 41, 66, 176, 176, 0, 0, 0, 0, 0, 0, 0, 0}, 67, 201}, - {{31, 9, 231, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 94}, - {{108, 144, 205, 39, 215, 26, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 241}, - {{247, 217, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 239}, - {{24, 186, 73, 182, 240, 251, 125, 165, 0, 0, 0, 0, 0, 0, 0, 0}, 66, 151}, - {{245, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 12, 137}, - {{44, 94, 138, 224, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 231}, - {{184, 221, 109, 135, 225, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 44, 11}, - {{51, 179, 136, 184, 30, 118, 24, 16, 26, 161, 206, 101, 0, 0, 0, 0}, 96, 20}, - {{48, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 15, 68}, - {{143, 235, 237, 220, 89, 119, 187, 143, 209, 94, 46, 58, 120, 0, 0, 0}, 101, 64}, - {{121, 190, 90, 177, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 152}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 6, 217}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 101}, - {{111, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 15, 58}, - {{162, 23, 52, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 254}, - {{76, 103, 44, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 148}, - {{80, 85, 219, 214, 12, 4, 65, 129, 162, 148, 208, 78, 39, 69, 94, 184}, 126, 126}, - {{80, 54, 251, 28, 152, 23, 244, 192, 151, 83, 6, 144, 223, 213, 224, 128}, 123, 76}, - {{39, 232, 237, 103, 191, 188, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 240}, - {{20, 231, 89, 210, 167, 173, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 33}, - {{125, 67, 198, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 25, 47}, - {{26, 239, 153, 5, 213, 121, 31, 114, 161, 46, 84, 15, 148, 160, 0, 0}, 109, 41}, - {{102, 212, 159, 118, 223, 115, 134, 172, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 72}, - {{85, 181, 241, 127, 3, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 43}, - {{61, 199, 131, 226, 3, 230, 94, 119, 240, 0, 0, 0, 0, 0, 0, 0}, 68, 26}, - {{0, 143, 160, 184, 162, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 139}, - {{170, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 219}, - {{61, 122, 24, 251, 124, 122, 202, 192, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 105}, - {{33, 219, 226, 3, 180, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 210}, - {{51, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 151}, - {{106, 185, 11, 122, 197, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 28}, - {{192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 64}, - {{239, 195, 77, 239, 131, 156, 2, 246, 191, 178, 204, 160, 21, 213, 30, 128}, 121, 9}, - {{141, 207, 181, 99, 55, 245, 151, 228, 65, 50, 85, 16, 0, 0, 0, 0}, 92, 250}, - {{110, 159, 230, 251, 224, 210, 58, 49, 0, 0, 0, 0, 0, 0, 0, 0}, 66, 200}, - {{134, 26, 104, 32, 129, 41, 201, 50, 164, 69, 178, 156, 156, 133, 8, 218}, 127, 132}, - {{253, 207, 116, 105, 210, 166, 186, 99, 182, 0, 0, 0, 0, 0, 0, 0}, 71, 182}, - {{211, 73, 38, 80, 183, 168, 52, 138, 25, 214, 112, 8, 252, 0, 0, 0}, 102, 7}, - {{200, 244, 108, 238, 164, 141, 215, 39, 233, 249, 120, 80, 112, 0, 0, 0}, 100, 146}, - {{107, 44, 250, 202, 64, 37, 107, 105, 140, 0, 0, 0, 0, 0, 0, 0}, 70, 98}, - {{93, 86, 56, 27, 159, 195, 126, 39, 240, 201, 48, 0, 0, 0, 0, 0}, 86, 179}, - {{32, 202, 214, 242, 39, 141, 61, 146, 138, 96, 0, 0, 0, 0, 0, 0}, 77, 245}, - {{167, 77, 249, 28, 210, 196, 227, 241, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 2}, - {{241, 59, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 5}, - {{143, 68, 146, 210, 173, 155, 251, 173, 0, 0, 0, 0, 0, 0, 0, 0}, 66, 169}, - {{167, 180, 226, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 52}, - {{241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 177}, - {{238, 9, 168, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 74}, - {{203, 148, 16, 96, 125, 18, 86, 1, 91, 244, 251, 20, 31, 14, 75, 128}, 122, 212}, - {{111, 227, 137, 94, 65, 21, 77, 137, 119, 130, 159, 19, 159, 45, 18, 192}, 122, 238}, - {{59, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 18}, - {{110, 192, 255, 120, 84, 215, 3, 130, 38, 224, 0, 0, 0, 0, 0, 0}, 75, 155}, - {{152, 79, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 97}, - {{118, 186, 157, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 8}, - {{70, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 123}, - {{253, 119, 114, 227, 18, 243, 81, 61, 238, 107, 190, 144, 0, 0, 0, 0}, 92, 11}, - {{166, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 211}, - {{43, 95, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 20, 116}, - {{94, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 57}, - {{182, 251, 195, 132, 66, 7, 208, 146, 223, 231, 211, 181, 25, 176, 0, 0}, 108, 178}, - {{152, 166, 111, 233, 194, 17, 230, 41, 221, 253, 69, 123, 108, 0, 0, 0}, 102, 93}, - {{106, 141, 235, 190, 82, 241, 152, 186, 195, 81, 86, 144, 0, 0, 0, 0}, 92, 3}, - {{32, 81, 210, 153, 151, 29, 11, 62, 127, 177, 194, 254, 103, 83, 58, 128}, 121, 162}, - {{79, 112, 224, 26, 174, 39, 98, 181, 115, 57, 209, 189, 136, 48, 0, 0}, 109, 125}, - {{106, 197, 83, 151, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 33}, - {{190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 254}, - {{156, 73, 249, 148, 55, 192, 20, 42, 142, 128, 0, 0, 0, 0, 0, 0}, 74, 66}, - {{64, 107, 36, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 4}, - {{115, 148, 71, 250, 158, 174, 168, 249, 106, 110, 196, 0, 0, 0, 0, 0}, 86, 122}, - {{18, 139, 152, 44, 38, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 59}, - {{55, 229, 117, 106, 146, 95, 74, 220, 122, 0, 84, 202, 183, 138, 120, 0}, 117, 99}, - {{153, 211, 3, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 41}, - {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 112}, - {{49, 192, 102, 142, 216, 3, 114, 64, 165, 128, 168, 0, 0, 0, 0, 0}, 85, 255}, - {{201, 143, 240, 240, 209, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 44, 106}, - {{158, 19, 164, 196, 87, 162, 33, 120, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 170}, - {{5, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 86}, - {{34, 170, 246, 62, 198, 85, 193, 227, 252, 68, 0, 0, 0, 0, 0, 0}, 79, 155}, - {{21, 52, 9, 86, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 35, 65}, - {{203, 81, 49, 171, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 39}, - {{211, 218, 87, 244, 93, 181, 118, 41, 156, 143, 254, 0, 0, 0, 0, 0}, 90, 162}, - {{77, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 69}, - {{158, 219, 219, 39, 4, 219, 100, 63, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 163}, - {{61, 50, 232, 1, 185, 252, 243, 54, 189, 240, 170, 192, 0, 0, 0, 0}, 90, 116}, - {{241, 143, 33, 19, 247, 55, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 53, 19}, - {{61, 28, 61, 252, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 48}, - {{102, 112, 194, 108, 90, 253, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 230}, - {{74, 88, 58, 66, 172, 41, 144, 204, 195, 240, 0, 0, 0, 0, 0, 0}, 78, 155}, - {{44, 148, 187, 58, 190, 59, 190, 187, 124, 138, 222, 131, 0, 0, 0, 0}, 96, 158}, - {{67, 7, 216, 139, 93, 224, 20, 135, 186, 86, 209, 111, 60, 80, 0, 0}, 113, 252}, - {{209, 26, 12, 174, 5, 101, 164, 181, 237, 63, 192, 57, 54, 120, 0, 0}, 110, 176}, - {{4, 66, 232, 52, 239, 56, 48, 58, 192, 0, 0, 0, 0, 0, 0, 0}, 66, 211}, - {{158, 165, 2, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 15}, - {{85, 204, 245, 198, 68, 44, 39, 71, 32, 0, 0, 0, 0, 0, 0, 0}, 68, 95}, - {{181, 134, 25, 87, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 169}, - {{26, 230, 61, 36, 79, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 44, 249}, - {{5, 170, 198, 139, 65, 186, 188, 45, 42, 253, 165, 89, 206, 0, 0, 0}, 105, 61}, - {{211, 245, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 23, 63}, - {{117, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 43}, - {{103, 17, 123, 102, 70, 206, 90, 92, 124, 198, 0, 0, 0, 0, 0, 0}, 81, 228}, - {{192, 237, 88, 244, 53, 30, 61, 160, 143, 64, 0, 0, 0, 0, 0, 0}, 78, 165}, - {{199, 82, 217, 183, 2, 179, 195, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 3}, - {{157, 230, 79, 162, 57, 125, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 211}, - {{27, 67, 64, 235, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 210}, - {{72, 158, 163, 106, 193, 137, 190, 7, 250, 165, 249, 73, 64, 0, 0, 0}, 99, 61}, - {{34, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 120}, - {{215, 141, 95, 192, 189, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 94}, - {{31, 181, 56, 141, 120, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 153}, - {{153, 73, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 221}, - {{162, 107, 41, 189, 165, 155, 22, 139, 165, 72, 96, 0, 0, 0, 0, 0}, 87, 163}, - {{218, 17, 204, 165, 217, 251, 107, 45, 29, 15, 192, 167, 75, 0, 0, 0}, 106, 188}, - {{200, 124, 238, 213, 35, 228, 94, 141, 86, 187, 101, 60, 115, 52, 131, 16}, 124, 15}, - {{74, 237, 160, 56, 141, 217, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 28}, - {{163, 47, 242, 103, 173, 217, 88, 154, 38, 200, 32, 0, 0, 0, 0, 0}, 84, 240}, - {{20, 227, 128, 28, 144, 147, 22, 13, 94, 129, 107, 88, 0, 0, 0, 0}, 93, 59}, - {{95, 144, 229, 107, 218, 125, 204, 233, 161, 42, 180, 64, 0, 0, 0, 0}, 90, 195}, - {{155, 220, 83, 208, 108, 16, 134, 156, 128, 0, 0, 0, 0, 0, 0, 0}, 66, 10}, - {{179, 138, 55, 80, 190, 153, 12, 237, 22, 120, 69, 0, 0, 0, 0, 0}, 88, 206}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 137}, - {{3, 119, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 225}, - {{13, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 223}, - {{117, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 15, 29}, - {{164, 19, 195, 47, 136, 190, 156, 255, 30, 74, 143, 134, 162, 0, 0, 0}, 103, 166}, - {{40, 235, 94, 135, 135, 230, 71, 33, 64, 233, 0, 0, 0, 0, 0, 0}, 80, 178}, - {{222, 151, 166, 97, 129, 250, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 38}, - {{174, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 141}, - {{6, 189, 100, 150, 250, 13, 46, 98, 228, 139, 50, 52, 52, 196, 128, 0}, 116, 230}, - {{75, 252, 89, 205, 37, 52, 106, 79, 188, 120, 54, 119, 160, 0, 0, 0}, 99, 124}, - {{38, 18, 146, 6, 63, 64, 231, 10, 152, 199, 5, 143, 147, 4, 252, 0}, 118, 54}, - {{111, 119, 169, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 162}, - {{105, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 32}, - {{143, 57, 57, 101, 98, 182, 74, 227, 205, 143, 253, 237, 8, 0, 0, 0}, 102, 237}, - {{30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 7, 215}, - {{14, 232, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 138}, - {{14, 53, 67, 216, 229, 155, 149, 139, 31, 253, 184, 126, 133, 108, 40, 0}, 118, 73}, - {{22, 58, 40, 143, 188, 132, 239, 14, 181, 252, 81, 192, 0, 0, 0, 0}, 90, 43}, - {{11, 222, 185, 243, 248, 150, 79, 230, 214, 213, 3, 23, 193, 196, 0, 0}, 112, 88}, - {{14, 226, 198, 117, 84, 93, 22, 96, 77, 241, 173, 68, 68, 204, 72, 0}, 119, 91}, - {{15, 103, 247, 219, 150, 142, 92, 50, 144, 0, 0, 0, 0, 0, 0, 0}, 69, 140}, - {{0, 213, 77, 244, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 37, 65}, - {{178, 174, 174, 239, 72, 181, 36, 217, 40, 169, 12, 104, 149, 157, 125, 128}, 122, 201}, - {{118, 53, 55, 17, 97, 227, 243, 176, 2, 0, 0, 0, 0, 0, 0, 0}, 72, 69}, - {{21, 253, 4, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 35, 170}, - {{5, 249, 186, 133, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 192}, - {{47, 79, 35, 66, 11, 178, 161, 28, 87, 180, 45, 128, 0, 0, 0, 0}, 89, 21}, - {{242, 227, 20, 73, 150, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 35}, - {{121, 169, 102, 118, 157, 192, 154, 186, 126, 0, 0, 0, 0, 0, 0, 0}, 71, 235}, - {{9, 138, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 21, 240}, - {{45, 173, 14, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 136}, - {{127, 47, 51, 201, 236, 45, 142, 80, 0, 0, 0, 0, 0, 0, 0, 0}, 60, 186}, - {{247, 233, 34, 38, 181, 207, 127, 20, 224, 118, 59, 148, 0, 0, 0, 0}, 95, 174}, - {{126, 187, 198, 104, 245, 223, 219, 18, 31, 124, 0, 0, 0, 0, 0, 0}, 79, 153}, - {{3, 163, 107, 228, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 35, 118}, - {{167, 109, 2, 95, 11, 62, 45, 128, 0, 0, 0, 0, 0, 0, 0, 0}, 60, 113}, - {{76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 6, 58}, - {{58, 190, 204, 151, 222, 147, 47, 78, 38, 203, 9, 17, 64, 0, 0, 0}, 101, 206}, - {{254, 220, 254, 220, 204, 79, 35, 127, 242, 63, 106, 232, 127, 180, 0, 0}, 111, 42}, - {{77, 156, 8, 209, 181, 37, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 230}, - {{65, 89, 137, 76, 208, 199, 166, 90, 128, 0, 0, 0, 0, 0, 0, 0}, 67, 6}, - {{47, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 254}, - {{172, 154, 12, 108, 77, 37, 106, 8, 234, 7, 248, 212, 112, 160, 0, 0}, 108, 214}, - {{254, 117, 239, 244, 154, 89, 166, 241, 12, 108, 127, 153, 206, 160, 0, 0}, 107, 43}, - {{113, 160, 206, 52, 143, 12, 9, 148, 224, 0, 0, 0, 0, 0, 0, 0}, 67, 178}, - {{178, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 179}, - {{229, 177, 28, 106, 59, 75, 182, 241, 36, 79, 224, 0, 0, 0, 0, 0}, 87, 236}, - {{156, 72, 93, 193, 50, 235, 75, 228, 88, 115, 89, 119, 128, 0, 0, 0}, 98, 184}, - {{28, 232, 28, 249, 83, 105, 211, 7, 136, 147, 231, 64, 0, 0, 0, 0}, 91, 95}, - {{217, 33, 23, 107, 74, 42, 135, 197, 144, 34, 40, 243, 13, 126, 36, 136}, 127, 152}, - {{64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 113}, - {{85, 172, 121, 126, 213, 57, 225, 54, 197, 73, 85, 251, 9, 64, 0, 0}, 108, 137}, - {{104, 46, 25, 71, 86, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 224}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 6, 61}, - {{241, 113, 254, 106, 53, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 205}, - {{29, 36, 12, 244, 197, 127, 240, 8, 167, 134, 154, 248, 199, 123, 143, 240}, 124, 170}, - {{58, 29, 129, 94, 43, 139, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 53, 117}, - {{213, 124, 147, 196, 7, 82, 67, 70, 228, 0, 0, 0, 0, 0, 0, 0}, 70, 225}, - {{164, 168, 161, 140, 87, 85, 250, 41, 34, 0, 0, 0, 0, 0, 0, 0}, 72, 34}, - {{186, 142, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 5}, - {{237, 249, 9, 70, 247, 97, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 92}, - {{155, 92, 145, 218, 125, 226, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 230}, - {{35, 169, 62, 156, 86, 4, 125, 219, 119, 113, 191, 75, 198, 113, 0, 0}, 112, 61}, - {{207, 63, 96, 186, 26, 68, 115, 161, 163, 59, 190, 166, 18, 78, 232, 0}, 117, 221}, - {{86, 40, 200, 199, 247, 86, 159, 179, 191, 184, 117, 173, 211, 158, 0, 128}, 121, 105}, - {{104, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 181}, - {{205, 35, 123, 178, 36, 64, 62, 153, 195, 250, 0, 0, 0, 0, 0, 0}, 79, 110}, - {{117, 40, 57, 157, 138, 160, 223, 59, 155, 145, 64, 0, 0, 0, 0, 0}, 86, 103}, - {{74, 166, 140, 146, 74, 72, 229, 99, 167, 124, 107, 117, 217, 14, 246, 64}, 123, 218}, - {{12, 222, 244, 183, 83, 146, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 56, 146}, - {{11, 98, 146, 110, 95, 96, 80, 142, 224, 0, 0, 0, 0, 0, 0, 0}, 67, 90}, - {{235, 5, 187, 199, 30, 170, 82, 187, 228, 159, 22, 25, 204, 112, 0, 0}, 108, 197}, - {{35, 96, 146, 145, 155, 116, 252, 181, 29, 205, 230, 246, 30, 0, 0, 0}, 103, 158}, - {{174, 38, 56, 244, 227, 102, 252, 237, 128, 86, 0, 0, 0, 0, 0, 0}, 81, 118}, - {{65, 134, 37, 58, 90, 125, 60, 84, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 95}, - {{253, 117, 135, 98, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 152}, - {{111, 115, 188, 184, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 239}, - {{202, 24, 89, 9, 149, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 48}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 228}, - {{244, 98, 52, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 247}, - {{151, 167, 43, 178, 116, 194, 173, 126, 236, 98, 40, 0, 0, 0, 0, 0}, 85, 12}, - {{60, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 129}, - {{208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 50}, - {{126, 11, 216, 242, 7, 45, 121, 208, 110, 135, 210, 75, 59, 182, 228, 42}, 128, 250}, - {{217, 26, 184, 146, 3, 18, 240, 15, 135, 8, 0, 0, 0, 0, 0, 0}, 77, 249}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 230}, - {{145, 28, 29, 184, 2, 85, 234, 135, 98, 111, 136, 32, 0, 0, 0, 0}, 92, 228}, - {{108, 104, 255, 254, 34, 95, 72, 157, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 181}, - {{153, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 206}, - {{22, 250, 130, 201, 132, 248, 189, 108, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 122}, - {{158, 165, 234, 18, 44, 61, 82, 61, 235, 0, 0, 0, 0, 0, 0, 0}, 72, 81}, - {{236, 57, 124, 110, 124, 218, 82, 70, 142, 78, 18, 128, 0, 0, 0, 0}, 95, 175}, - {{94, 209, 200, 201, 149, 162, 248, 134, 239, 226, 1, 237, 16, 134, 56, 0}, 118, 170}, - {{187, 42, 31, 144, 236, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 174}, - {{90, 214, 185, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 104}, - {{194, 220, 211, 212, 211, 32, 196, 98, 71, 62, 153, 103, 80, 35, 128, 0}, 114, 113}, - {{24, 255, 158, 64, 180, 148, 10, 81, 243, 247, 0, 0, 0, 0, 0, 0}, 80, 89}, - {{231, 155, 100, 242, 112, 160, 160, 95, 98, 253, 219, 21, 239, 90, 0, 0}, 113, 151}, - {{225, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 108}, - {{136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 7, 224}, - {{250, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 95}, - {{72, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 173}, - {{185, 51, 51, 167, 18, 44, 36, 59, 35, 135, 20, 104, 0, 0, 0, 0}, 93, 176}, - {{57, 146, 252, 60, 197, 68, 39, 162, 80, 198, 137, 50, 97, 92, 124, 0}, 119, 84}, - {{254, 46, 242, 105, 86, 94, 96, 14, 130, 176, 0, 0, 0, 0, 0, 0}, 78, 104}, - {{247, 202, 176, 76, 69, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 236}, - {{50, 233, 203, 77, 42, 21, 115, 163, 166, 138, 192, 52, 178, 37, 112, 0}, 116, 153}, - {{62, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 190}, - {{53, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 202}, - {{198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 54}, - {{189, 234, 106, 247, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 156}, - {{110, 24, 228, 65, 216, 147, 9, 48, 60, 179, 172, 91, 115, 185, 227, 96}, 126, 245}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 6, 218}, - {{74, 177, 89, 218, 248, 18, 176, 39, 118, 173, 201, 152, 0, 0, 0, 0}, 93, 72}, - {{31, 13, 153, 92, 27, 122, 150, 232, 88, 95, 202, 171, 208, 158, 0, 0}, 112, 183}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 183}, - {{63, 37, 46, 158, 139, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 241}, - {{53, 209, 59, 13, 202, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 106}, - {{184, 44, 149, 221, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 180}, - {{222, 134, 37, 62, 223, 193, 39, 246, 15, 151, 200, 146, 0, 0, 0, 0}, 96, 142}, - {{199, 176, 189, 37, 233, 177, 252, 216, 94, 175, 253, 119, 96, 0, 0, 0}, 100, 6}, - {{44, 195, 201, 106, 209, 120, 122, 38, 43, 30, 142, 22, 196, 175, 100, 0}, 118, 33}, - {{33, 166, 10, 174, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 224}, - {{54, 1, 189, 195, 133, 49, 36, 80, 138, 200, 0, 0, 0, 0, 0, 0}, 78, 14}, - {{241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 149}, - {{221, 131, 4, 247, 112, 89, 187, 119, 219, 80, 122, 156, 216, 160, 0, 0}, 108, 131}, - {{102, 20, 46, 129, 202, 247, 129, 1, 237, 71, 103, 58, 217, 44, 4, 0}, 121, 133}, - {{107, 156, 151, 44, 215, 98, 171, 126, 85, 32, 42, 128, 0, 0, 0, 0}, 89, 33}, - {{54, 25, 70, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 204}, - {{149, 211, 242, 14, 112, 219, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 43}, - {{95, 26, 143, 193, 8, 76, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 168}, - {{63, 102, 244, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 180}, - {{64, 85, 124, 226, 59, 239, 64, 130, 68, 122, 93, 74, 32, 37, 0, 0}, 112, 208}, - {{113, 90, 253, 149, 3, 218, 34, 215, 3, 143, 192, 64, 0, 0, 0, 0}, 90, 25}, - {{75, 231, 33, 5, 11, 94, 117, 104, 150, 60, 72, 161, 96, 38, 0, 0}, 111, 50}, - {{52, 13, 248, 1, 251, 14, 50, 29, 212, 123, 130, 177, 101, 96, 0, 0}, 109, 110}, - {{248, 221, 150, 132, 252, 82, 96, 2, 80, 232, 97, 239, 253, 64, 0, 0}, 109, 21}, - {{136, 77, 164, 161, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 147}, - {{1, 33, 66, 254, 144, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 43, 56}, - {{181, 25, 186, 225, 109, 190, 76, 158, 118, 122, 20, 64, 125, 55, 8, 0}, 117, 144}, - {{191, 187, 160, 140, 17, 6, 80, 120, 236, 212, 104, 144, 128, 0, 0, 0}, 100, 198}, - {{201, 61, 150, 254, 70, 77, 214, 211, 171, 163, 245, 64, 0, 0, 0, 0}, 90, 235}, - {{143, 226, 190, 50, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 105}, - {{65, 168, 226, 36, 201, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 138}, - {{136, 40, 65, 90, 47, 16, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 122}, - {{94, 189, 224, 200, 170, 11, 79, 172, 0, 0, 0, 0, 0, 0, 0, 0}, 65, 193}, - {{236, 41, 169, 234, 14, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 43, 231}, - {{1, 40, 140, 95, 81, 173, 250, 248, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 250}, - {{83, 176, 146, 112, 89, 156, 57, 220, 125, 48, 44, 0, 0, 0, 0, 0}, 86, 24}, - {{76, 125, 228, 249, 243, 160, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 191}, - {{10, 203, 204, 49, 212, 115, 125, 4, 239, 122, 81, 34, 1, 198, 216, 0}, 117, 111}, - {{74, 214, 23, 44, 211, 40, 161, 61, 237, 190, 155, 59, 173, 42, 0, 0}, 111, 205}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 133}, - {{127, 0, 130, 61, 209, 5, 232, 35, 35, 42, 114, 52, 169, 234, 191, 0}, 122, 122}, - {{201, 107, 210, 13, 187, 62, 145, 28, 31, 189, 56, 0, 0, 0, 0, 0}, 87, 227}, - {{147, 171, 63, 145, 47, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 53}, - {{93, 232, 10, 97, 21, 243, 213, 135, 200, 0, 0, 0, 0, 0, 0, 0}, 72, 224}, - {{144, 121, 41, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 199}, - {{116, 105, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 79}, - {{142, 149, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 21, 19}, - {{97, 0, 228, 158, 50, 233, 251, 249, 0, 66, 197, 226, 0, 0, 0, 0}, 96, 211}, - {{114, 228, 199, 155, 175, 104, 26, 213, 66, 249, 120, 218, 164, 252, 212, 0}, 120, 6}, - {{224, 166, 76, 200, 121, 60, 110, 65, 60, 95, 137, 190, 92, 218, 218, 0}, 121, 143}, - {{139, 219, 92, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 31, 135}, - {{203, 237, 64, 189, 28, 13, 75, 197, 219, 243, 172, 3, 142, 32, 0, 0}, 109, 21}, - {{237, 186, 88, 254, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 220}, - {{182, 230, 93, 162, 129, 25, 56, 196, 112, 0, 0, 0, 0, 0, 0, 0}, 68, 151}, - {{245, 45, 69, 226, 90, 212, 254, 16, 0, 0, 0, 0, 0, 0, 0, 0}, 60, 111}, - {{107, 229, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 20, 63}, - {{119, 208, 177, 235, 222, 252, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 112}, - {{178, 151, 220, 162, 120, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 48}, - {{109, 26, 95, 170, 166, 151, 137, 83, 226, 82, 5, 114, 253, 210, 18, 12}, 126, 100}, - {{126, 27, 252, 19, 219, 129, 121, 48, 0, 0, 0, 0, 0, 0, 0, 0}, 60, 156}, - {{211, 195, 152, 145, 154, 93, 228, 215, 135, 101, 28, 82, 0, 0, 0, 0}, 95, 120}, - {{252, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 5}, - {{192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 103}, - {{64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 84}, - {{225, 179, 43, 43, 222, 145, 205, 238, 164, 158, 147, 229, 56, 0, 0, 0}, 101, 24}, - {{208, 127, 151, 24, 64, 113, 47, 85, 209, 79, 144, 0, 0, 0, 0, 0}, 86, 81}, - {{178, 144, 203, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 96}, - {{56, 227, 139, 4, 86, 87, 180, 1, 215, 167, 237, 156, 111, 64, 47, 0}, 121, 6}, - {{80, 76, 204, 119, 172, 169, 254, 81, 104, 166, 219, 44, 173, 161, 212, 0}, 119, 40}, - {{129, 141, 139, 34, 241, 101, 223, 144, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 143}, - {{85, 102, 137, 98, 65, 103, 54, 142, 144, 0, 0, 0, 0, 0, 0, 0}, 68, 69}, - {{56, 31, 159, 13, 201, 139, 161, 31, 89, 137, 4, 0, 0, 0, 0, 0}, 92, 48}, - {{229, 221, 54, 216, 223, 27, 196, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 115}, - {{5, 144, 176, 43, 180, 187, 20, 49, 59, 73, 108, 34, 83, 32, 192, 0}, 115, 130}, - {{24, 217, 205, 193, 74, 123, 160, 106, 103, 74, 200, 0, 0, 0, 0, 0}, 86, 57}, - {{247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 97}, - {{12, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 146}, - {{160, 28, 201, 119, 148, 93, 251, 118, 28, 179, 123, 52, 71, 232, 48, 0}, 117, 194}, - {{152, 126, 17, 54, 101, 56, 130, 1, 205, 41, 207, 90, 151, 123, 128, 0}, 114, 129}, - {{77, 165, 29, 239, 95, 242, 34, 1, 11, 204, 135, 239, 128, 0, 0, 0}, 97, 159}, - {{183, 108, 146, 118, 74, 190, 7, 141, 9, 92, 2, 2, 8, 218, 120, 0}, 117, 242}, - {{37, 152, 29, 239, 242, 53, 56, 143, 219, 22, 14, 158, 49, 0, 0, 0}, 104, 162}, - {{198, 53, 241, 102, 240, 244, 97, 203, 62, 128, 213, 214, 220, 0, 0, 0}, 102, 140}, - {{144, 89, 48, 42, 249, 231, 189, 178, 232, 199, 30, 58, 63, 57, 0, 0}, 113, 77}, - {{68, 212, 177, 123, 44, 224, 19, 172, 89, 87, 192, 0, 0, 0, 0, 0}, 82, 121}, - {{252, 29, 179, 224, 4, 121, 205, 67, 152, 0, 0, 0, 0, 0, 0, 0}, 69, 102}, - {{28, 110, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 23, 28}, - {{24, 88, 231, 1, 4, 71, 71, 241, 252, 14, 197, 0, 0, 0, 0, 0}, 89, 154}, - {{63, 131, 43, 76, 58, 140, 163, 74, 158, 80, 0, 0, 0, 0, 0, 0}, 76, 39}, - {{56, 28, 147, 149, 98, 93, 216, 216, 203, 156, 0, 0, 0, 0, 0, 0}, 78, 163}, - {{134, 169, 6, 103, 161, 244, 134, 117, 16, 0, 0, 0, 0, 0, 0, 0}, 68, 42}, - {{143, 247, 125, 190, 106, 50, 204, 98, 250, 151, 161, 96, 0, 0, 0, 0}, 92, 207}, - {{235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 25}, - {{46, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 150}, - {{171, 35, 128, 117, 74, 29, 199, 67, 109, 176, 0, 0, 0, 0, 0, 0}, 76, 103}, - {{220, 233, 236, 112, 135, 136, 215, 43, 42, 0, 0, 0, 0, 0, 0, 0}, 71, 155}, - {{228, 11, 144, 117, 206, 192, 118, 25, 141, 78, 4, 105, 0, 0, 0, 0}, 96, 142}, - {{195, 67, 194, 229, 14, 53, 129, 7, 30, 208, 38, 100, 182, 59, 0, 0}, 112, 2}, - {{25, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 59}, - {{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 112}, - {{26, 203, 217, 152, 16, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 48, 166}, - {{250, 213, 14, 235, 110, 171, 174, 23, 102, 128, 0, 0, 0, 0, 0, 0}, 73, 62}, - {{175, 230, 160, 13, 187, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 176}, - {{92, 155, 156, 93, 191, 73, 28, 82, 187, 129, 57, 5, 16, 0, 0, 0}, 100, 6}, - {{45, 203, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 26}, - {{120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 6}, - {{216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 13}, - {{135, 215, 0, 71, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 37, 41}, - {{221, 149, 1, 40, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 135}, - {{95, 143, 255, 194, 2, 157, 191, 113, 10, 229, 204, 56, 0, 0, 0, 0}, 93, 171}, - {{202, 212, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 20}, - {{147, 203, 238, 120, 194, 23, 25, 58, 208, 177, 169, 0, 0, 0, 0, 0}, 89, 119}, - {{137, 170, 113, 252, 215, 194, 224, 146, 233, 87, 86, 192, 26, 46, 0, 0}, 112, 49}, - {{224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 141}, - {{250, 90, 241, 174, 163, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 132}, - {{66, 190, 202, 144, 122, 86, 22, 103, 107, 164, 57, 54, 228, 128, 0, 0}, 105, 176}, - {{76, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 12, 186}, - {{120, 246, 1, 52, 187, 163, 78, 105, 224, 0, 0, 0, 0, 0, 0, 0}, 67, 93}, - {{137, 242, 136, 71, 98, 10, 53, 97, 160, 85, 132, 127, 185, 222, 0, 0}, 111, 242}, - {{255, 133, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 163}, - {{128, 177, 92, 155, 91, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 184}, - {{45, 120, 186, 192, 240, 199, 178, 95, 32, 0, 0, 0, 0, 0, 0, 0}, 68, 188}, - {{151, 98, 103, 254, 90, 6, 10, 109, 14, 158, 69, 29, 140, 237, 40, 232}, 126, 193}, - {{148, 164, 81, 85, 76, 14, 84, 64, 89, 176, 0, 0, 0, 0, 0, 0}, 78, 63}, - {{145, 187, 165, 136, 88, 30, 107, 191, 205, 120, 119, 216, 158, 123, 64, 0}, 115, 160}, - {{78, 120, 28, 243, 216, 180, 87, 19, 253, 16, 110, 33, 228, 24, 232, 0}, 117, 251}, - {{74, 6, 166, 166, 183, 157, 96, 84, 151, 0, 0, 0, 0, 0, 0, 0}, 72, 228}, - {{89, 96, 4, 221, 214, 253, 58, 49, 9, 0, 0, 0, 0, 0, 0, 0}, 72, 168}, - {{97, 9, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 194}, - {{213, 215, 45, 200, 170, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 166}, - {{5, 14, 92, 0, 28, 245, 130, 202, 32, 40, 207, 77, 166, 170, 246, 64}, 122, 210}, - {{77, 45, 43, 71, 202, 0, 157, 146, 59, 91, 225, 0, 0, 0, 0, 0}, 89, 254}, - {{101, 174, 94, 168, 162, 171, 71, 12, 16, 224, 0, 0, 0, 0, 0, 0}, 75, 49}, - {{58, 17, 187, 194, 87, 73, 215, 103, 180, 12, 40, 66, 0, 0, 0, 0}, 96, 95}, - {{160, 91, 68, 81, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 193}, - {{94, 112, 249, 13, 167, 245, 101, 64, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 155}, - {{236, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 15, 133}, - {{168, 243, 103, 221, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 10}, - {{86, 194, 218, 188, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 31}, - {{232, 3, 134, 67, 63, 196, 86, 14, 170, 243, 77, 134, 187, 140, 72, 18}, 127, 98}, - {{55, 253, 19, 201, 199, 71, 229, 218, 54, 64, 12, 162, 0, 0, 0, 0}, 96, 22}, - {{142, 34, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 20, 214}, - {{213, 16, 208, 50, 100, 33, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 217}, - {{117, 237, 132, 185, 184, 246, 79, 42, 103, 98, 162, 243, 128, 0, 0, 0}, 98, 102}, - {{120, 25, 214, 222, 61, 157, 203, 102, 3, 146, 192, 0, 0, 0, 0, 0}, 83, 169}, - {{222, 46, 254, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 152}, - {{254, 70, 158, 171, 11, 245, 223, 97, 70, 17, 27, 192, 186, 0, 0, 0}, 103, 214}, - {{192, 128, 228, 17, 68, 20, 44, 31, 52, 34, 212, 1, 224, 0, 0, 0}, 99, 178}, - {{237, 229, 203, 8, 121, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 164}, - {{6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 7, 15}, - {{71, 197, 251, 122, 138, 232, 12, 241, 116, 240, 0, 0, 0, 0, 0, 0}, 76, 94}, - {{18, 241, 135, 210, 233, 54, 121, 185, 4, 0, 0, 0, 0, 0, 0, 0}, 70, 239}, - {{32, 50, 213, 63, 73, 217, 180, 21, 187, 128, 0, 0, 0, 0, 0, 0}, 73, 82}, - {{203, 166, 233, 73, 92, 182, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 54}, - {{56, 162, 126, 4, 18, 195, 192, 64, 164, 156, 119, 196, 64, 0, 0, 0}, 98, 47}, - {{120, 87, 81, 136, 180, 179, 68, 148, 243, 38, 80, 0, 0, 0, 0, 0}, 84, 214}, - {{64, 244, 193, 50, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 37, 215}, - {{91, 168, 253, 158, 131, 83, 159, 163, 113, 169, 112, 0, 0, 0, 0, 0}, 84, 153}, - {{159, 103, 102, 132, 111, 46, 18, 77, 36, 15, 137, 33, 177, 31, 243, 192}, 122, 245}, - {{123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 118}, - {{67, 81, 226, 190, 7, 79, 71, 250, 155, 245, 44, 81, 215, 213, 171, 224}, 123, 128}, - {{103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 7}, - {{246, 44, 168, 200, 198, 238, 52, 196, 125, 115, 0, 0, 0, 0, 0, 0}, 80, 152}, - {{205, 14, 186, 252, 239, 213, 59, 119, 105, 37, 140, 209, 4, 231, 0, 0}, 114, 248}, - {{70, 91, 254, 106, 94, 71, 170, 19, 158, 242, 192, 0, 0, 0, 0, 0}, 85, 143}, - {{250, 86, 233, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 159}, - {{122, 222, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 11}, - {{27, 224, 235, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 31, 110}, - {{239, 100, 224, 3, 46, 127, 150, 251, 204, 120, 228, 64, 0, 0, 0, 0}, 97, 181}, - {{144, 115, 182, 206, 146, 13, 21, 111, 37, 70, 179, 129, 173, 82, 93, 128}, 121, 4}, - {{73, 190, 57, 243, 49, 51, 15, 209, 0, 0, 0, 0, 0, 0, 0, 0}, 67, 101}, - {{18, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 38}, - {{23, 37, 236, 177, 186, 7, 209, 135, 114, 44, 0, 0, 0, 0, 0, 0}, 78, 57}, - {{200, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 142}, - {{181, 255, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 184}, - {{135, 168, 6, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 91}, - {{200, 224, 33, 245, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 224}, - {{70, 111, 10, 62, 200, 224, 38, 204, 14, 164, 0, 0, 0, 0, 0, 0}, 78, 114}, - {{158, 133, 252, 18, 242, 12, 16, 60, 5, 52, 251, 179, 38, 235, 12, 0}, 118, 184}, - {{2, 23, 116, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 215}, - {{33, 25, 170, 74, 215, 134, 151, 181, 175, 232, 20, 155, 189, 242, 13, 0}, 120, 167}, - {{160, 186, 218, 183, 167, 84, 59, 152, 13, 137, 80, 128, 0, 0, 0, 0}, 89, 233}, - {{32, 141, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 101}, - {{207, 24, 202, 226, 191, 136, 78, 124, 160, 0, 0, 0, 0, 0, 0, 0}, 67, 139}, - {{210, 173, 172, 27, 197, 57, 114, 146, 169, 32, 0, 0, 0, 0, 0, 0}, 79, 32}, - {{95, 113, 12, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 57}, - {{129, 108, 186, 28, 19, 229, 96, 134, 199, 254, 199, 64, 0, 0, 0, 0}, 91, 151}, - {{103, 226, 38, 123, 35, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 0}, - {{41, 117, 43, 35, 208, 115, 73, 64, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 227}, - {{42, 220, 61, 34, 199, 183, 42, 16, 223, 135, 0, 135, 213, 150, 100, 0}, 118, 124}, - {{165, 227, 96, 243, 112, 171, 117, 106, 50, 37, 82, 60, 80, 0, 0, 0}, 104, 228}, - {{158, 60, 111, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 64}, - {{124, 108, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 25, 179}, - {{232, 68, 132, 159, 156, 103, 95, 190, 76, 0, 0, 0, 0, 0, 0, 0}, 70, 107}, - {{70, 77, 240, 209, 72, 63, 63, 45, 125, 79, 77, 41, 13, 0, 0, 0}, 104, 206}, - {{146, 254, 7, 5, 68, 240, 67, 237, 112, 0, 0, 0, 0, 0, 0, 0}, 68, 95}, - {{162, 223, 117, 27, 2, 156, 94, 170, 157, 114, 162, 50, 0, 0, 0, 0}, 96, 219}, - {{161, 62, 191, 68, 239, 73, 100, 37, 168, 254, 139, 202, 252, 65, 74, 0}, 119, 138}, - {{248, 122, 115, 81, 15, 158, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 53, 84}, - {{8, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 161}, - {{142, 96, 105, 133, 251, 57, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 25}, - {{138, 196, 139, 131, 233, 93, 65, 242, 86, 169, 7, 72, 82, 128, 0, 0}, 107, 113}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 46}, - {{175, 151, 75, 238, 26, 12, 100, 186, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 72}, - {{82, 205, 211, 176, 170, 79, 57, 153, 161, 218, 32, 48, 0, 0, 0, 0}, 93, 230}, - {{227, 123, 232, 74, 236, 202, 211, 121, 200, 8, 59, 189, 81, 219, 144, 0}, 117, 142}, - {{205, 196, 89, 90, 103, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 134}, - {{63, 145, 23, 127, 102, 216, 49, 36, 168, 164, 59, 133, 18, 146, 0, 0}, 112, 100}, - {{213, 72, 154, 16, 230, 236, 218, 203, 223, 51, 31, 251, 103, 64, 0, 0}, 109, 45}, - {{126, 148, 232, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 219}, - {{160, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 52}, - {{137, 38, 146, 20, 99, 188, 83, 123, 159, 159, 64, 0, 0, 0, 0, 0}, 83, 240}, - {{123, 228, 36, 44, 242, 29, 51, 228, 140, 60, 237, 0, 0, 0, 0, 0}, 90, 13}, - {{163, 169, 25, 89, 190, 114, 165, 158, 140, 210, 192, 0, 0, 0, 0, 0}, 84, 191}, - {{225, 38, 70, 89, 218, 236, 60, 5, 69, 163, 248, 50, 163, 64, 0, 0}, 106, 95}, - {{91, 94, 36, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 65}, - {{209, 238, 110, 0, 2, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 195}, - {{57, 17, 224, 164, 69, 95, 138, 172, 111, 55, 239, 167, 160, 0, 0, 0}, 103, 21}, - {{112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 114}, - {{102, 96, 223, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 31, 92}, - {{137, 204, 150, 75, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 237}, - {{136, 56, 252, 240, 85, 48, 248, 231, 17, 49, 47, 238, 15, 233, 159, 184}, 125, 172}, - {{57, 31, 132, 123, 234, 255, 37, 82, 167, 204, 37, 158, 128, 0, 0, 0}, 98, 116}, - {{55, 198, 139, 219, 161, 156, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 54}, - {{44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 203}, - {{53, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 74}, - {{227, 62, 107, 236, 118, 156, 60, 34, 31, 179, 76, 221, 0, 0, 0, 0}, 96, 220}, - {{105, 40, 240, 216, 91, 61, 19, 128, 224, 0, 0, 0, 0, 0, 0, 0}, 67, 219}, - {{96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 179}, - {{118, 142, 251, 249, 128, 105, 113, 16, 0, 0, 0, 0, 0, 0, 0, 0}, 61, 194}, - {{101, 70, 196, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 187}, - {{245, 173, 165, 177, 200, 161, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 79}, - {{0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 87}, - {{92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 126}, - {{125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 106}, - {{56, 59, 35, 82, 101, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 96}, - {{184, 72, 77, 251, 8, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 45}, - {{143, 74, 132, 205, 218, 247, 30, 160, 145, 199, 138, 12, 89, 220, 0, 0}, 110, 8}, - {{30, 178, 111, 225, 73, 79, 173, 52, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 226}, - {{224, 48, 154, 231, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 222}, - {{123, 144, 170, 143, 85, 169, 130, 245, 214, 0, 0, 0, 0, 0, 0, 0}, 71, 218}, - {{166, 224, 212, 100, 149, 55, 35, 210, 246, 108, 41, 245, 127, 174, 128, 0}, 116, 59}, - {{75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 80}, - {{197, 128, 190, 87, 47, 53, 92, 64, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 177}, - {{249, 10, 76, 217, 225, 20, 124, 205, 44, 159, 190, 8, 0, 0, 0, 0}, 98, 44}, - {{180, 226, 0, 167, 137, 232, 174, 120, 113, 95, 22, 184, 0, 0, 0, 0}, 93, 206}, - {{123, 153, 102, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 64}, - {{5, 144, 206, 158, 239, 189, 171, 120, 69, 46, 128, 237, 0, 0, 0, 0}, 96, 236}, - {{159, 235, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 101}, - {{42, 194, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 49}, - {{205, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 179}, - {{19, 65, 141, 20, 127, 77, 70, 205, 151, 115, 157, 23, 118, 128, 0, 0}, 109, 112}, - {{96, 11, 214, 40, 245, 251, 61, 64, 128, 241, 183, 183, 0, 0, 0, 0}, 96, 31}, - {{120, 4, 235, 112, 34, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 111}, - {{110, 127, 207, 76, 100, 148, 130, 206, 249, 2, 104, 0, 0, 0, 0, 0}, 86, 65}, - {{226, 190, 191, 249, 173, 96, 127, 200, 62, 20, 0, 0, 0, 0, 0, 0}, 78, 222}, - {{89, 88, 182, 14, 78, 122, 213, 192, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 4}, - {{167, 94, 163, 227, 28, 111, 117, 103, 224, 0, 0, 0, 0, 0, 0, 0}, 67, 67}, - {{57, 220, 53, 116, 243, 184, 242, 134, 16, 70, 83, 61, 161, 128, 0, 0}, 109, 197}, - {{63, 235, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 121}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 167}, - {{15, 159, 42, 167, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 140}, - {{216, 252, 113, 40, 239, 46, 172, 48, 103, 250, 82, 179, 136, 64, 0, 0}, 106, 193}, - {{158, 147, 16, 44, 124, 56, 44, 48, 138, 64, 169, 0, 0, 0, 0, 0}, 90, 47}, - {{238, 238, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 21, 187}, - {{63, 159, 177, 162, 106, 212, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 56, 102}, - {{59, 40, 252, 185, 187, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 237}, - {{2, 218, 11, 68, 173, 196, 16, 223, 2, 18, 122, 215, 154, 0, 0, 0}, 103, 237}, - {{3, 9, 206, 73, 108, 196, 183, 119, 141, 162, 10, 180, 115, 32, 0, 0}, 107, 115}, - {{17, 227, 208, 146, 63, 201, 73, 239, 29, 79, 80, 0, 0, 0, 0, 0}, 84, 217}, - {{115, 180, 176, 241, 52, 209, 6, 64, 189, 76, 0, 0, 0, 0, 0, 0}, 79, 21}, - {{191, 88, 98, 245, 91, 46, 137, 254, 170, 80, 11, 55, 212, 28, 128, 0}, 113, 3}, - {{97, 141, 171, 175, 22, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 48, 62}, - {{32, 204, 102, 191, 164, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 80}, - {{29, 133, 210, 252, 124, 66, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 184}, - {{207, 179, 54, 144, 116, 67, 29, 64, 13, 199, 0, 0, 0, 0, 0, 0}, 80, 197}, - {{129, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 63}, - {{50, 152, 249, 143, 174, 234, 240, 48, 158, 255, 80, 105, 0, 0, 0, 0}, 99, 62}, - {{105, 208, 95, 218, 44, 11, 87, 134, 109, 18, 138, 66, 17, 69, 128, 0}, 114, 231}, - {{151, 79, 158, 220, 122, 101, 210, 164, 64, 0, 0, 0, 0, 0, 0, 0}, 67, 158}, - {{236, 97, 87, 155, 254, 137, 122, 208, 168, 201, 194, 118, 224, 0, 0, 0}, 101, 118}, - {{14, 229, 193, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 237}, - {{46, 154, 50, 80, 92, 147, 158, 86, 1, 112, 0, 0, 0, 0, 0, 0}, 79, 15}, - {{88, 131, 21, 84, 62, 86, 7, 110, 142, 251, 242, 110, 194, 175, 247, 0}, 122, 84}, - {{229, 216, 111, 92, 173, 32, 63, 70, 36, 84, 6, 74, 136, 166, 38, 0}, 119, 205}, - {{121, 147, 216, 245, 37, 189, 146, 63, 145, 74, 128, 0, 0, 0, 0, 0}, 82, 220}, - {{44, 26, 254, 11, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 42}, - {{209, 114, 97, 249, 227, 159, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 144}, - {{184, 244, 43, 117, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 37, 74}, - {{60, 81, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 89}, - {{18, 40, 21, 113, 226, 91, 195, 88, 161, 19, 142, 0, 0, 0, 0, 0}, 88, 77}, - {{57, 0, 212, 158, 56, 51, 108, 198, 59, 5, 137, 196, 0, 0, 0, 0}, 94, 2}, - {{168, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 75}, - {{64, 181, 254, 103, 1, 230, 117, 199, 128, 0, 0, 0, 0, 0, 0, 0}, 65, 18}, - {{212, 48, 214, 127, 78, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 246}, - {{155, 185, 236, 163, 204, 49, 129, 120, 183, 47, 10, 243, 65, 92, 192, 0}, 114, 10}, - {{94, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 207}, - {{19, 210, 136, 113, 73, 79, 132, 196, 224, 0, 0, 0, 0, 0, 0, 0}, 68, 41}, - {{24, 203, 246, 242, 241, 223, 150, 237, 213, 202, 11, 128, 0, 0, 0, 0}, 89, 102}, - {{115, 59, 171, 221, 172, 181, 170, 67, 115, 205, 44, 107, 162, 67, 56, 0}, 118, 118}, - {{250, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 146}, - {{203, 240, 28, 158, 182, 12, 86, 182, 142, 47, 143, 57, 239, 0, 0, 0}, 104, 122}, - {{196, 218, 109, 52, 2, 0, 64, 153, 34, 250, 240, 185, 117, 0, 0, 0}, 107, 6}, - {{137, 131, 191, 40, 72, 209, 74, 64, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 18}, - {{236, 126, 167, 37, 185, 20, 34, 207, 76, 0, 0, 0, 0, 0, 0, 0}, 70, 83}, - {{129, 192, 245, 137, 251, 52, 75, 68, 81, 112, 146, 133, 64, 0, 0, 0}, 99, 90}, - {{7, 31, 148, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 140}, - {{112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 242}, - {{167, 50, 202, 179, 74, 146, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 31}, - {{44, 188, 186, 250, 229, 71, 28, 118, 35, 253, 245, 191, 199, 18, 0, 0}, 111, 9}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 230}, - {{156, 163, 215, 175, 71, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 50}, - {{67, 24, 151, 198, 242, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 41, 34}, - {{134, 107, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 11}, - {{35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8, 71}, - {{46, 196, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 146}, - {{82, 172, 8, 26, 154, 34, 125, 188, 5, 149, 159, 44, 78, 222, 236, 176}, 124, 249}, - {{78, 157, 79, 70, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 39, 143}, - {{231, 5, 210, 247, 198, 5, 157, 191, 206, 225, 149, 142, 207, 40, 0, 0}, 110, 17}, - {{38, 254, 235, 199, 191, 60, 43, 159, 190, 243, 203, 185, 184, 218, 132, 0}, 119, 60}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 162}, - {{95, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 12, 5}, - {{17, 128, 244, 178, 160, 78, 83, 92, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 139}, - {{18, 102, 62, 251, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 39, 8}, - {{30, 75, 108, 40, 231, 166, 233, 220, 163, 176, 252, 210, 60, 30, 128, 0}, 114, 246}, - {{18, 3, 207, 64, 25, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 171}, - {{52, 83, 235, 61, 164, 236, 83, 173, 143, 105, 14, 0, 0, 0, 0, 0}, 88, 206}, - {{166, 175, 186, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 163}, - {{221, 154, 82, 98, 41, 126, 85, 52, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 166}, - {{94, 84, 182, 120, 204, 232, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 128}, - {{27, 174, 227, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 31, 59}, - {{218, 12, 4, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 179}, - {{9, 5, 190, 195, 60, 216, 80, 150, 128, 117, 86, 128, 128, 112, 98, 208}, 124, 87}, - {{7, 226, 104, 112, 212, 9, 172, 124, 209, 121, 170, 229, 44, 178, 128, 0}, 114, 29}, - {{47, 71, 174, 76, 52, 83, 23, 18, 106, 48, 56, 32, 0, 0, 0, 0}, 91, 184}, - {{51, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 45}, - {{28, 182, 167, 124, 28, 22, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 144}, - {{34, 61, 14, 51, 253, 17, 19, 170, 49, 206, 188, 207, 247, 167, 192, 0}, 114, 119}, - {{2, 235, 18, 14, 195, 66, 237, 30, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 113}, - {{51, 182, 142, 133, 127, 96, 159, 132, 99, 161, 64, 0, 0, 0, 0, 0}, 82, 50}, - {{170, 145, 230, 123, 215, 189, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 56, 207}, - {{151, 166, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 21, 3}, - {{16, 141, 196, 129, 132, 207, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 13}, - {{205, 25, 184, 191, 201, 206, 109, 224, 0, 0, 0, 0, 0, 0, 0, 0}, 59, 42}, - {{48, 114, 33, 103, 247, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 31}, - {{179, 156, 119, 146, 125, 21, 42, 146, 237, 213, 191, 132, 0, 0, 0, 0}, 94, 30}, - {{179, 129, 186, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 94}, - {{17, 179, 217, 188, 128, 212, 4, 4, 152, 0, 0, 0, 0, 0, 0, 0}, 71, 190}, - {{132, 63, 74, 89, 209, 64, 63, 192, 0, 0, 0, 0, 0, 0, 0, 0}, 59, 238}, - {{16, 50, 248, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 20}, - {{189, 96, 58, 53, 191, 235, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 84}, - {{111, 98, 6, 65, 35, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 108}, - {{118, 223, 83, 220, 110, 122, 23, 112, 185, 155, 73, 0, 0, 0, 0, 0}, 89, 136}, - {{173, 191, 150, 197, 204, 35, 169, 79, 31, 214, 251, 240, 0, 0, 0, 0}, 93, 196}, - {{26, 76, 129, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 67}, - {{231, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 12, 104}, - {{93, 172, 223, 252, 203, 0, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 15}, - {{53, 142, 203, 124, 104, 51, 241, 12, 161, 17, 101, 245, 120, 110, 192, 199}, 128, 237}, - {{9, 77, 120, 197, 193, 10, 237, 174, 233, 2, 165, 11, 229, 47, 144, 0}, 116, 224}, - {{99, 161, 189, 88, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 179}, - {{18, 8, 76, 66, 2, 185, 206, 132, 224, 0, 0, 0, 0, 0, 0, 0}, 67, 84}, - {{169, 53, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 65}, - {{136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 178}, - {{131, 162, 144, 124, 12, 98, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 154}, - {{75, 50, 129, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 27, 106}, - {{212, 183, 40, 225, 152, 136, 174, 91, 0, 0, 0, 0, 0, 0, 0, 0}, 67, 125}, - {{158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 118}, - {{7, 48, 132, 149, 169, 212, 198, 137, 202, 0, 0, 0, 0, 0, 0, 0}, 73, 52}, - {{173, 195, 129, 163, 141, 249, 40, 64, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 173}, - {{109, 79, 75, 219, 205, 182, 22, 245, 223, 17, 146, 78, 109, 119, 128, 0}, 113, 8}, - {{174, 195, 24, 182, 215, 198, 214, 86, 34, 128, 0, 0, 0, 0, 0, 0}, 74, 211}, - {{22, 40, 51, 109, 70, 91, 152, 56, 0, 0, 0, 0, 0, 0, 0, 0}, 61, 253}, - {{169, 115, 246, 126, 65, 118, 219, 192, 0, 0, 0, 0, 0, 0, 0, 0}, 59, 47}, - {{154, 37, 70, 124, 107, 123, 232, 241, 164, 142, 71, 226, 182, 126, 0, 0}, 112, 73}, - {{6, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 192}, - {{216, 167, 158, 158, 222, 19, 96, 28, 40, 6, 70, 12, 147, 27, 85, 240}, 128, 55}, - {{72, 222, 52, 69, 69, 206, 163, 106, 235, 206, 80, 128, 0, 0, 0, 0}, 94, 147}, - {{150, 112, 106, 56, 15, 243, 154, 97, 134, 110, 160, 20, 183, 144, 234, 8}, 125, 86}, - {{58, 186, 106, 58, 124, 171, 53, 85, 33, 100, 64, 0, 0, 0, 0, 0}, 82, 16}, - {{7, 195, 22, 31, 62, 217, 209, 46, 90, 49, 189, 50, 168, 126, 0, 0}, 111, 167}, - {{92, 44, 159, 198, 185, 94, 231, 177, 64, 0, 0, 0, 0, 0, 0, 0}, 67, 148}, - {{169, 108, 190, 162, 23, 39, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 66}, - {{161, 5, 3, 11, 158, 157, 166, 212, 246, 22, 140, 101, 92, 0, 0, 0}, 104, 70}, - {{71, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 166}, - {{48, 136, 194, 145, 57, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 44, 109}, - {{144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 226}, - {{223, 209, 10, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 8}, - {{154, 79, 170, 9, 43, 139, 249, 176, 186, 72, 216, 0, 0, 0, 0, 0}, 85, 218}, - {{1, 8, 123, 205, 167, 134, 128, 102, 10, 72, 0, 0, 0, 0, 0, 0}, 78, 54}, - {{31, 105, 48, 77, 103, 187, 99, 67, 96, 0, 0, 0, 0, 0, 0, 0}, 67, 48}, - {{14, 73, 54, 76, 232, 35, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 244}, - {{14, 109, 251, 190, 36, 253, 99, 120, 94, 64, 0, 0, 0, 0, 0, 0}, 74, 50}, - {{122, 170, 9, 134, 124, 91, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 173}, - {{246, 10, 85, 88, 82, 217, 95, 56, 216, 203, 160, 0, 0, 0, 0, 0}, 84, 245}, - {{77, 100, 114, 207, 150, 177, 69, 134, 74, 131, 147, 117, 177, 64, 210, 128}, 121, 54}, - {{171, 123, 22, 138, 132, 229, 250, 81, 186, 227, 146, 27, 170, 205, 128, 0}, 113, 86}, - {{128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 115}, - {{12, 35, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 144}, - {{255, 124, 179, 165, 169, 250, 66, 171, 223, 125, 247, 0, 0, 0, 0, 0}, 89, 171}, - {{244, 235, 211, 10, 251, 255, 206, 6, 198, 12, 50, 136, 0, 0, 0, 0}, 93, 231}, - {{221, 77, 237, 41, 50, 33, 103, 24, 25, 127, 208, 0, 0, 0, 0, 0}, 88, 34}, - {{216, 69, 47, 53, 117, 24, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 53, 225}, - {{180, 87, 25, 236, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 174}, - {{110, 32, 24, 34, 116, 133, 245, 128, 123, 95, 125, 122, 100, 129, 128, 0}, 113, 37}, - {{27, 117, 179, 112, 133, 137, 110, 193, 246, 201, 219, 65, 56, 234, 106, 128}, 121, 39}, - {{186, 117, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 23, 59}, - {{243, 119, 54, 16, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 96}, - {{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 147}, - {{78, 48, 117, 200, 245, 118, 115, 240, 170, 125, 84, 103, 33, 168, 0, 0}, 110, 56}, - {{201, 253, 184, 254, 143, 81, 95, 42, 243, 147, 96, 145, 23, 26, 0, 0}, 111, 234}, - {{41, 215, 84, 136, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 199}, - {{91, 244, 137, 184, 231, 95, 135, 10, 184, 0, 0, 0, 0, 0, 0, 0}, 69, 191}, - {{113, 31, 181, 245, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 235}, - {{181, 216, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 20, 45}, - {{87, 26, 119, 229, 97, 255, 9, 43, 32, 0, 0, 0, 0, 0, 0, 0}, 67, 164}, - {{205, 112, 67, 163, 196, 148, 5, 105, 8, 138, 144, 3, 171, 213, 159, 128}, 121, 130}, - {{136, 27, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 166}, - {{2, 175, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 140}, - {{222, 131, 85, 218, 16, 229, 44, 230, 243, 76, 250, 139, 1, 203, 108, 0}, 118, 47}, - {{101, 180, 77, 142, 194, 73, 196, 246, 107, 100, 194, 72, 204, 124, 0, 0}, 111, 148}, - {{96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 103}, - {{46, 62, 191, 130, 110, 128, 235, 62, 68, 39, 58, 152, 207, 204, 96, 0}, 116, 94}, - {{111, 11, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 85}, - {{58, 43, 14, 93, 102, 210, 117, 208, 222, 171, 130, 41, 16, 16, 0, 0}, 109, 250}, - {{141, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 153}, - {{170, 153, 160, 170, 144, 235, 122, 8, 106, 34, 24, 32, 102, 57, 12, 168}, 125, 182}, - {{34, 113, 163, 107, 61, 177, 39, 172, 242, 2, 130, 0, 0, 0, 0, 0}, 94, 23}, - {{222, 191, 239, 110, 162, 191, 195, 181, 80, 50, 85, 240, 88, 32, 0, 0}, 108, 38}, - {{179, 82, 253, 151, 212, 0, 72, 253, 175, 22, 34, 78, 53, 32, 0, 0}, 110, 121}, - {{10, 162, 20, 46, 164, 64, 88, 1, 202, 204, 124, 0, 0, 0, 0, 0}, 87, 146}, - {{210, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 138}, - {{183, 200, 1, 2, 51, 6, 66, 142, 20, 77, 48, 244, 0, 0, 0, 0}, 94, 149}, - {{29, 20, 224, 57, 204, 161, 131, 254, 53, 133, 163, 0, 0, 0, 0, 0}, 88, 232}, - {{75, 58, 170, 52, 146, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 255}, - {{92, 21, 1, 113, 185, 88, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 148}, - {{103, 180, 222, 187, 129, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 48, 117}, - {{32, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 237}, - {{7, 60, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 113}, - {{167, 122, 205, 185, 21, 199, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 162}, - {{21, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 21, 225}, - {{92, 159, 167, 169, 136, 176, 95, 255, 87, 137, 112, 16, 0, 0, 0, 0}, 92, 210}, - {{84, 120, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 34}, - {{126, 5, 126, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 224}, - {{4, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 143}, - {{239, 154, 181, 182, 189, 211, 244, 53, 144, 0, 0, 0, 0, 0, 0, 0}, 68, 216}, - {{254, 188, 139, 167, 135, 47, 147, 239, 187, 106, 228, 156, 234, 234, 102, 0}, 120, 239}, - {{225, 168, 138, 92, 193, 255, 47, 233, 11, 154, 205, 86, 209, 88, 0, 0}, 111, 54}, - {{223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 35}, - {{235, 252, 115, 10, 151, 104, 193, 207, 38, 228, 229, 245, 42, 13, 108, 0}, 119, 230}, - {{1, 137, 53, 36, 210, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 234}, - {{149, 182, 72, 197, 92, 229, 9, 10, 220, 128, 72, 19, 4, 58, 192, 0}, 115, 70}, - {{105, 73, 57, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 246}, - {{189, 61, 230, 24, 235, 82, 58, 102, 97, 111, 121, 252, 156, 94, 191, 166}, 127, 217}, - {{193, 108, 231, 86, 140, 14, 192, 4, 135, 80, 129, 166, 158, 61, 230, 20}, 128, 201}, - {{110, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 17, 49}, - {{3, 102, 36, 231, 15, 242, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 2}, - {{81, 189, 220, 168, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 64}, - {{168, 75, 133, 180, 91, 165, 77, 232, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 239}, - {{106, 179, 186, 109, 81, 234, 233, 167, 101, 160, 90, 102, 174, 234, 208, 0}, 116, 47}, - {{46, 105, 234, 21, 23, 247, 169, 33, 47, 5, 0, 0, 0, 0, 0, 0}, 80, 43}, - {{152, 144, 100, 142, 129, 23, 227, 50, 67, 81, 249, 116, 0, 0, 0, 0}, 94, 17}, - {{109, 74, 145, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 5}, - {{100, 243, 22, 230, 38, 44, 128, 86, 132, 57, 0, 0, 0, 0, 0, 0}, 81, 240}, - {{153, 251, 115, 65, 104, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 197}, - {{43, 113, 60, 224, 36, 20, 42, 161, 24, 223, 192, 0, 0, 0, 0, 0}, 84, 192}, - {{61, 77, 121, 176, 138, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 160}, - {{119, 194, 146, 49, 59, 242, 25, 220, 122, 104, 80, 0, 0, 0, 0, 0}, 84, 199}, - {{254, 162, 155, 47, 187, 3, 1, 114, 142, 191, 152, 44, 144, 26, 202, 0}, 127, 217}, - {{176, 1, 114, 42, 191, 145, 43, 1, 141, 18, 64, 0, 0, 0, 0, 0}, 83, 75}, - {{170, 244, 67, 132, 145, 163, 76, 213, 85, 237, 248, 22, 207, 64, 0, 0}, 106, 222}, - {{102, 190, 58, 32, 75, 15, 89, 163, 64, 7, 168, 0, 0, 0, 0, 0}, 85, 39}, - {{124, 170, 35, 47, 152, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 9}, - {{192, 221, 20, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 217}, - {{208, 178, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 25, 142}, - {{188, 68, 77, 30, 68, 153, 102, 180, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 18}, - {{114, 178, 121, 188, 205, 233, 35, 77, 34, 197, 158, 174, 101, 0, 0, 0}, 104, 180}, - {{195, 98, 67, 12, 13, 43, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 56, 205}, - {{146, 190, 42, 222, 14, 54, 28, 128, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 251}, - {{185, 202, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 178}, - {{138, 30, 129, 95, 224, 161, 120, 128, 0, 0, 0, 0, 0, 0, 0, 0}, 59, 198}, - {{69, 181, 5, 227, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 84}, - {{90, 180, 0, 164, 227, 75, 174, 119, 128, 0, 0, 0, 0, 0, 0, 0}, 66, 128}, - {{20, 60, 58, 119, 245, 177, 162, 186, 13, 112, 211, 239, 128, 0, 0, 0}, 97, 75}, - {{158, 124, 157, 25, 230, 139, 51, 212, 76, 109, 236, 210, 48, 0, 0, 0}, 101, 192}, - {{125, 108, 242, 36, 94, 13, 36, 106, 90, 51, 83, 217, 131, 151, 0, 0}, 114, 60}, - {{222, 218, 162, 158, 15, 53, 191, 178, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 169}, - {{104, 202, 127, 109, 73, 16, 17, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 10}, - {{172, 171, 246, 26, 176, 34, 22, 152, 246, 56, 173, 120, 105, 60, 92, 0}, 118, 64}, - {{190, 22, 171, 206, 109, 186, 179, 128, 253, 182, 108, 212, 220, 167, 171, 180}, 127, 182}, - {{119, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 29}, - {{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 39}, - {{170, 144, 64, 2, 107, 166, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 93}, - {{234, 9, 96, 20, 156, 157, 1, 34, 88, 0, 0, 0, 0, 0, 0, 0}, 75, 228}, - {{147, 237, 16, 120, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 236}, - {{182, 189, 162, 158, 223, 90, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 56, 190}, - {{116, 148, 142, 240, 10, 253, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 217}, - {{211, 73, 140, 69, 252, 27, 75, 46, 37, 6, 147, 32, 0, 0, 0, 0}, 93, 74}, - {{148, 61, 120, 49, 220, 65, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 61, 180}, - {{172, 35, 202, 180, 129, 75, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 91}, - {{215, 109, 147, 157, 32, 28, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 230}, - {{151, 26, 182, 112, 205, 220, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 175}, - {{73, 91, 93, 61, 196, 3, 66, 26, 149, 96, 0, 0, 0, 0, 0, 0}, 75, 171}, - {{203, 163, 52, 247, 28, 119, 56, 223, 138, 70, 174, 97, 77, 59, 46, 0}, 120, 202}, - {{251, 50, 228, 178, 202, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 113}, - {{217, 159, 164, 199, 14, 237, 170, 184, 100, 231, 92, 222, 0, 0, 0, 0}, 96, 187}, - {{16, 161, 85, 193, 202, 21, 3, 155, 63, 116, 124, 203, 34, 13, 215, 0}, 120, 38}, - {{111, 52, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 35}, - {{69, 12, 116, 151, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 115}, - {{187, 60, 97, 40, 112, 101, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 18}, - {{230, 194, 136, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 39, 34}, - {{179, 239, 170, 107, 3, 13, 212, 67, 177, 69, 8, 0, 0, 0, 0, 0}, 87, 75}, - {{11, 58, 130, 89, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 232}, - {{217, 178, 43, 203, 234, 20, 234, 186, 157, 88, 146, 192, 0, 0, 0, 0}, 91, 154}, - {{6, 180, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 195}, - {{157, 154, 218, 158, 39, 224, 103, 230, 164, 0, 0, 0, 0, 0, 0, 0}, 70, 122}, - {{225, 10, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 97}, - {{16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 220}, - {{166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 7, 80}, - {{29, 190, 131, 215, 232, 246, 41, 226, 52, 192, 0, 0, 0, 0, 0, 0}, 77, 133}, - {{138, 74, 163, 93, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 38, 93}, - {{229, 64, 97, 41, 28, 243, 249, 185, 97, 35, 49, 27, 175, 24, 0, 0}, 110, 176}, - {{6, 73, 94, 160, 186, 216, 84, 117, 233, 169, 146, 234, 0, 0, 0, 0}, 95, 68}, - {{163, 40, 242, 81, 224, 35, 72, 194, 176, 78, 224, 174, 12, 0, 0, 0}, 103, 247}, - {{2, 205, 40, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 240}, - {{174, 225, 240, 160, 212, 8, 246, 67, 36, 0, 0, 0, 0, 0, 0, 0}, 74, 83}, - {{5, 117, 182, 141, 166, 249, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 132}, - {{46, 152, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 217}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 214}, - {{233, 202, 159, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 193}, - {{172, 54, 159, 5, 14, 245, 106, 182, 2, 0, 0, 0, 0, 0, 0, 0}, 71, 61}, - {{241, 222, 251, 114, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 39, 65}, - {{31, 243, 190, 4, 207, 198, 249, 59, 167, 127, 93, 64, 0, 0, 0, 0}, 91, 108}, - {{201, 35, 222, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 244}, - {{187, 105, 13, 114, 238, 197, 145, 23, 169, 116, 91, 28, 0, 0, 0, 0}, 95, 194}, - {{251, 251, 121, 168, 152, 178, 147, 188, 229, 123, 154, 242, 190, 165, 173, 48}, 124, 82}, - {{66, 187, 191, 164, 31, 196, 40, 186, 148, 115, 134, 57, 222, 254, 48, 0}, 116, 45}, - {{209, 17, 111, 41, 154, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 48, 224}, - {{40, 245, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 17}, - {{72, 121, 151, 83, 170, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 44, 133}, - {{171, 172, 101, 238, 201, 148, 23, 81, 4, 11, 64, 0, 0, 0, 0, 0}, 85, 125}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 42}, - {{20, 46, 27, 93, 195, 184, 6, 162, 109, 225, 22, 152, 0, 0, 0, 0}, 96, 140}, - {{243, 122, 30, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 91}, - {{89, 250, 80, 72, 148, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 48, 92}, - {{187, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 125}, - {{172, 160, 143, 114, 128, 239, 174, 133, 176, 154, 159, 134, 10, 0, 0, 0}, 106, 249}, - {{254, 202, 113, 112, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 202}, - {{80, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 107}, - {{222, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 13, 124}, - {{219, 138, 253, 12, 188, 197, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 53, 57}, - {{124, 41, 173, 8, 202, 192, 61, 254, 174, 48, 239, 112, 0, 0, 0, 0}, 92, 181}, - {{195, 236, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 107}, - {{83, 82, 42, 244, 136, 191, 197, 81, 91, 154, 216, 85, 29, 150, 198, 22}, 128, 101}, - {{112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 102}, - {{44, 30, 219, 248, 214, 88, 225, 132, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 136}, - {{41, 171, 206, 178, 195, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 114}, - {{159, 15, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 215}, - {{42, 188, 37, 174, 86, 40, 4, 84, 174, 216, 0, 0, 0, 0, 0, 0}, 79, 249}, - {{185, 227, 85, 177, 219, 95, 250, 227, 69, 154, 118, 0, 0, 0, 0, 0}, 88, 29}, - {{22, 185, 238, 100, 25, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 44, 71}, - {{122, 149, 117, 77, 88, 250, 187, 203, 136, 22, 85, 42, 105, 234, 79, 8}, 127, 112}, - {{93, 152, 229, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 31, 72}, - {{129, 37, 165, 167, 241, 24, 37, 40, 2, 128, 0, 0, 0, 0, 0, 0}, 73, 155}, - {{30, 202, 177, 3, 253, 202, 164, 248, 0, 0, 0, 0, 0, 0, 0, 0}, 61, 66}, - {{176, 25, 220, 120, 194, 228, 10, 45, 225, 142, 192, 96, 0, 0, 0, 0}, 91, 77}, - {{96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 109}, - {{82, 56, 12, 204, 61, 45, 147, 240, 221, 0, 0, 0, 0, 0, 0, 0}, 72, 37}, - {{242, 38, 240, 41, 140, 75, 250, 37, 175, 115, 97, 224, 0, 0, 0, 0}, 91, 56}, - {{251, 192, 23, 90, 135, 56, 252, 56, 79, 219, 80, 167, 22, 0, 0, 0}, 103, 5}, - {{62, 128, 139, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 25, 15}, - {{214, 1, 84, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 183}, - {{207, 90, 237, 137, 171, 140, 227, 88, 250, 26, 197, 162, 163, 0, 0, 0}, 105, 171}, - {{196, 151, 235, 232, 114, 248, 1, 207, 193, 184, 186, 71, 157, 0, 0, 0}, 112, 202}, - {{152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 136}, - {{9, 174, 211, 200, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 37, 107}, - {{89, 150, 95, 28, 209, 13, 125, 159, 254, 244, 110, 0, 0, 0, 0, 0}, 87, 193}, - {{23, 28, 202, 10, 90, 158, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 4}, - {{48, 25, 180, 9, 84, 236, 6, 144, 30, 198, 41, 56, 0, 0, 0, 0}, 96, 68}, - {{252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 7, 40}, - {{20, 165, 57, 130, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 39, 255}, - {{167, 56, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 108}, - {{91, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 219}, - {{24, 46, 9, 4, 170, 150, 56, 130, 127, 120, 118, 104, 168, 48, 0, 0}, 108, 12}, - {{156, 60, 245, 247, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 84}, - {{148, 104, 187, 174, 129, 28, 127, 162, 92, 222, 52, 18, 0, 0, 0, 0}, 96, 33}, - {{38, 253, 182, 153, 233, 194, 159, 41, 94, 193, 254, 160, 0, 0, 0, 0}, 91, 199}, - {{156, 77, 105, 235, 145, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 52}, - {{100, 211, 238, 147, 65, 222, 99, 73, 252, 113, 46, 113, 52, 136, 0, 0}, 113, 184}, - {{13, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 124}, - {{29, 240, 141, 230, 78, 237, 25, 135, 131, 6, 65, 77, 77, 248, 0, 0}, 109, 128}, - {{15, 192, 109, 31, 149, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 255}, - {{80, 185, 170, 71, 41, 58, 158, 106, 253, 7, 2, 184, 173, 0, 0, 0}, 105, 146}, - {{16, 229, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 24, 172}, - {{169, 2, 153, 9, 169, 203, 245, 154, 184, 0, 0, 0, 0, 0, 0, 0}, 70, 116}, - {{144, 135, 239, 164, 142, 187, 64, 109, 0, 0, 0, 0, 0, 0, 0, 0}, 66, 189}, - {{170, 78, 252, 227, 242, 199, 130, 251, 200, 0, 0, 0, 0, 0, 0, 0}, 70, 10}, - {{232, 18, 15, 126, 166, 126, 58, 25, 209, 62, 76, 79, 0, 0, 0, 0}, 98, 184}, - {{170, 82, 72, 53, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 33, 98}, - {{152, 100, 37, 122, 242, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 37}, - {{174, 231, 230, 33, 71, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 174}, - {{74, 225, 252, 153, 202, 8, 162, 39, 64, 0, 0, 0, 0, 0, 0, 0}, 67, 251}, - {{167, 186, 101, 187, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 115}, - {{83, 7, 21, 122, 243, 67, 171, 146, 145, 160, 168, 103, 223, 64, 0, 0}, 107, 252}, - {{83, 132, 219, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 176}, - {{22, 113, 72, 102, 73, 16, 236, 57, 197, 122, 31, 0, 0, 0, 0, 0}, 91, 155}, - {{250, 59, 64, 35, 72, 112, 159, 85, 200, 5, 193, 39, 152, 185, 148, 16}, 124, 36}, - {{220, 21, 48, 164, 224, 121, 17, 69, 10, 118, 106, 0, 0, 0, 0, 0}, 88, 202}, - {{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 208}, - {{247, 64, 83, 125, 195, 225, 50, 76, 18, 104, 0, 0, 0, 0, 0, 0}, 77, 158}, - {{78, 91, 31, 202, 189, 25, 13, 133, 220, 0, 0, 0, 0, 0, 0, 0}, 72, 136}, - {{105, 197, 26, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 191}, - {{14, 31, 154, 242, 241, 231, 55, 151, 223, 56, 134, 255, 113, 206, 69, 0}, 120, 126}, - {{247, 193, 58, 176, 16, 71, 31, 120, 213, 104, 231, 83, 26, 118, 91, 135}, 128, 139}, - {{136, 32, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 25, 216}, - {{100, 238, 112, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 29, 93}, - {{80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 196}, - {{233, 224, 254, 57, 33, 205, 140, 217, 181, 72, 0, 0, 0, 0, 0, 0}, 81, 119}, - {{107, 75, 65, 158, 128, 142, 191, 188, 188, 240, 148, 243, 116, 0, 0, 0}, 104, 93}, - {{39, 70, 120, 114, 69, 237, 95, 48, 233, 176, 91, 154, 0, 0, 0, 0}, 96, 183}, - {{10, 61, 43, 101, 64, 102, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 207}, - {{151, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 102}, - {{210, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 19, 36}, - {{52, 222, 249, 31, 108, 137, 199, 1, 242, 173, 184, 144, 0, 0, 0, 0}, 93, 41}, - {{123, 111, 88, 192, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 70}, - {{180, 82, 188, 125, 140, 8, 196, 74, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 218}, - {{77, 158, 34, 101, 196, 102, 56, 220, 42, 143, 181, 187, 240, 64, 161, 0}, 120, 226}, - {{88, 220, 222, 38, 23, 108, 5, 148, 185, 110, 20, 14, 67, 61, 0, 0}, 114, 25}, - {{90, 65, 220, 165, 197, 133, 110, 92, 228, 19, 2, 17, 0, 0, 0, 0}, 98, 6}, - {{35, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 26}, - {{103, 123, 49, 209, 228, 229, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 149}, - {{50, 244, 58, 191, 95, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 46, 127}, - {{140, 169, 75, 77, 78, 86, 40, 16, 0, 0, 0, 0, 0, 0, 0, 0}, 62, 144}, - {{99, 176, 175, 83, 114, 50, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 56, 213}, - {{19, 208, 211, 76, 85, 176, 247, 64, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 115}, - {{153, 28, 188, 113, 211, 116, 7, 178, 136, 205, 96, 0, 0, 0, 0, 0}, 83, 146}, - {{160, 180, 220, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 58}, - {{234, 6, 112, 19, 61, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 222}, - {{97, 110, 34, 117, 149, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 16}, - {{99, 173, 119, 73, 250, 30, 144, 30, 128, 0, 0, 0, 0, 0, 0, 0}, 65, 169}, - {{169, 134, 111, 89, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 175}, - {{134, 80, 227, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 3}, - {{231, 243, 35, 80, 75, 207, 128, 137, 54, 170, 71, 238, 0, 0, 0, 0}, 96, 2}, - {{189, 190, 121, 135, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 193}, - {{143, 155, 216, 193, 239, 205, 204, 153, 143, 236, 69, 23, 200, 211, 0, 0}, 118, 151}, - {{32, 1, 115, 244, 33, 219, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 182}, - {{220, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 148}, - {{206, 87, 135, 235, 116, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 42, 53}, - {{152, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 11, 87}, - {{58, 146, 188, 233, 230, 236, 192, 214, 168, 128, 0, 0, 0, 0, 0, 0}, 73, 235}, - {{84, 220, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 23, 51}, - {{106, 145, 142, 42, 186, 186, 58, 1, 48, 98, 165, 131, 48, 156, 192, 0}, 116, 11}, - {{53, 219, 120, 242, 166, 214, 81, 130, 64, 0, 0, 0, 0, 0, 0, 0}, 68, 28}, - {{240, 120, 76, 163, 32, 197, 181, 251, 98, 220, 29, 226, 0, 0, 0, 0}, 96, 73}, - {{234, 197, 12, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 216}, - {{191, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 16, 99}, - {{200, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 35}, - {{29, 129, 47, 83, 19, 75, 158, 1, 28, 24, 26, 147, 82, 119, 140, 100}, 127, 195}, - {{241, 174, 26, 53, 152, 112, 200, 134, 84, 187, 177, 176, 42, 64, 0, 0}, 108, 176}, - {{77, 171, 145, 48, 195, 84, 190, 36, 122, 199, 18, 0, 0, 0, 0, 0}, 87, 217}, - {{105, 104, 135, 53, 226, 118, 238, 169, 9, 253, 132, 162, 217, 123, 191, 96}, 126, 244}, - {{160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 125}, - {{41, 85, 143, 128, 91, 137, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 219}, - {{116, 110, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 165}, - {{75, 213, 44, 16, 43, 157, 34, 171, 98, 117, 109, 151, 5, 60, 224, 0}, 117, 6}, - {{229, 23, 116, 61, 80, 139, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 53, 47}, - {{83, 123, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 23, 73}, - {{151, 243, 45, 217, 216, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47, 98}, - {{171, 184, 110, 211, 237, 114, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 52, 21}, - {{7, 246, 199, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 32, 142}, - {{103, 47, 70, 17, 31, 232, 44, 75, 145, 155, 100, 216, 0, 0, 0, 0}, 93, 34}, - {{65, 170, 169, 100, 167, 147, 142, 251, 20, 64, 0, 0, 0, 0, 0, 0}, 74, 41}, - {{235, 6, 229, 248, 151, 137, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 55, 80}, - {{156, 39, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 22, 11}, - {{92, 188, 82, 192, 142, 249, 190, 128, 0, 0, 0, 0, 0, 0, 0, 0}, 58, 254}, - {{253, 218, 181, 46, 134, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 45, 95}, - {{189, 19, 31, 244, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 40, 8}, - {{30, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 14, 212}, - {{81, 226, 13, 173, 79, 123, 223, 124, 108, 80, 83, 238, 0, 0, 0, 0}, 95, 217}, - {{126, 211, 206, 82, 147, 215, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 15}, - {{42, 229, 135, 197, 196, 243, 94, 181, 133, 34, 16, 0, 0, 0, 0, 0}, 84, 66}, - {{68, 210, 158, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 122}, - {{183, 63, 223, 94, 81, 41, 203, 20, 236, 212, 220, 199, 0, 0, 0, 0}, 97, 12}, - {{131, 146, 2, 125, 174, 43, 231, 20, 194, 0, 0, 0, 0, 0, 0, 0}, 71, 171}, - {{31, 180, 246, 158, 28, 192, 236, 39, 237, 55, 74, 195, 171, 192, 0, 0}, 106, 42}, - {{179, 10, 70, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 28, 194}, - {{147, 51, 85, 185, 234, 209, 236, 87, 147, 17, 7, 68, 148, 32, 0, 0}, 107, 237}, - {{177, 178, 6, 40, 46, 166, 87, 198, 214, 234, 23, 224, 0, 0, 0, 0}, 93, 151}, - {{201, 53, 40, 20, 49, 4, 38, 139, 133, 217, 214, 134, 89, 200, 0, 0}, 109, 238}, - {{4, 26, 181, 37, 206, 129, 233, 32, 0, 0, 0, 0, 0, 0, 0, 0}, 59, 128}, - {{81, 58, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 227}, - {{18, 238, 250, 161, 57, 246, 208, 118, 14, 76, 73, 25, 65, 22, 152, 120}, 127, 138}, - {{31, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 60}, - {{115, 195, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 18, 148}, - {{116, 22, 75, 33, 16, 129, 35, 124, 10, 112, 31, 213, 181, 108, 177, 46}, 128, 129}, - {{117, 214, 20, 80, 83, 51, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 202}, - {{120, 75, 124, 149, 120, 123, 242, 151, 181, 164, 128, 0, 0, 0, 0, 0}, 81, 88}, - {{87, 238, 168, 62, 88, 166, 52, 104, 219, 169, 93, 128, 0, 0, 0, 0}, 90, 3}, - {{237, 44, 224, 146, 52, 85, 245, 192, 65, 137, 37, 95, 156, 176, 0, 0}, 108, 243}, - {{214, 241, 51, 63, 73, 61, 193, 165, 23, 108, 0, 0, 0, 0, 0, 0}, 80, 95}, - {{87, 242, 21, 157, 45, 188, 36, 62, 66, 243, 64, 0, 0, 0, 0, 0}, 87, 255}, - {{0, 97, 220, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 48}, - {{227, 206, 189, 31, 222, 8, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 50, 38}, - {{174, 27, 0, 16, 13, 150, 33, 122, 154, 59, 236, 35, 248, 178, 64, 0}, 115, 20}, - {{39, 20, 125, 69, 252, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 43, 41}, - {{141, 232, 1, 12, 125, 229, 168, 14, 125, 116, 180, 0, 0, 0, 0, 0}, 92, 133}, - {{93, 238, 40, 228, 254, 203, 251, 6, 60, 82, 243, 242, 0, 0, 0, 0}, 95, 189}, - {{44, 115, 200, 17, 146, 223, 115, 253, 126, 206, 152, 90, 0, 0, 0, 0}, 95, 151}, - {{213, 58, 235, 255, 6, 163, 61, 10, 224, 0, 0, 0, 0, 0, 0, 0}, 68, 100}, - {{25, 86, 139, 116, 190, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 49, 118}, - {{113, 40, 65, 141, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 34, 164}, - {{149, 205, 200, 186, 19, 126, 215, 199, 94, 37, 100, 32, 128, 0, 0, 0}, 98, 71}, - {{39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 251}, - {{81, 87, 80, 173, 163, 166, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 51}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 3, 185}, - {{140, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 144}, - {{6, 42, 1, 178, 250, 53, 186, 178, 114, 121, 192, 0, 0, 0, 0, 0}, 84, 51}, - {{2, 17, 234, 51, 169, 5, 219, 149, 245, 237, 4, 0, 0, 0, 0, 0}, 87, 32}, - {{112, 187, 173, 17, 229, 171, 225, 170, 8, 0, 0, 0, 0, 0, 0, 0}, 70, 137}, - {{203, 71, 140, 237, 113, 96, 123, 16, 0, 0, 0, 0, 0, 0, 0, 0}, 60, 2}, - {{99, 138, 207, 2, 244, 25, 211, 98, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 163}, - {{114, 42, 98, 246, 252, 48, 233, 118, 63, 226, 157, 226, 192, 0, 0, 0}, 100, 162}, - {{161, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 10, 192}, - {{233, 70, 240, 45, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 36, 185}, - {{28, 123, 31, 176, 235, 229, 169, 192, 0, 0, 0, 0, 0, 0, 0, 0}, 59, 51}, - {{146, 197, 243, 235, 243, 56, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 93}, - {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 159}, - {{141, 92, 13, 27, 87, 241, 171, 143, 220, 0, 0, 0, 0, 0, 0, 0}, 72, 189}, - {{164, 151, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 21, 248}, - {{35, 188, 248, 79, 39, 151, 232, 215, 248, 245, 185, 144, 78, 102, 173, 128}, 123, 38}, - {{193, 232, 166, 60, 62, 80, 230, 225, 165, 240, 0, 0, 0, 0, 0, 0}, 76, 167}, - {{109, 229, 118, 155, 43, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 28}, - {{160, 62, 63, 212, 218, 138, 154, 108, 163, 127, 197, 237, 183, 44, 140, 192}, 125, 37}, - {{196, 37, 51, 146, 26, 85, 53, 31, 216, 141, 52, 218, 153, 32, 0, 0}, 107, 234}, - {{228, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 9, 70}, - {{154, 248, 20, 242, 154, 244, 63, 17, 121, 52, 70, 84, 118, 208, 0, 0}, 108, 50}, - {{41, 100, 27, 84, 106, 112, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 51, 171}, - {{81, 99, 197, 139, 30, 150, 230, 216, 81, 190, 84, 165, 29, 64, 128, 0}, 113, 236}, - {{112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 3}, - {{164, 119, 253, 126, 160, 249, 183, 191, 119, 111, 224, 0, 0, 0, 0, 0}, 86, 64}, - {{138, 58, 198, 254, 0, 197, 60, 91, 132, 199, 181, 251, 78, 160, 0, 0}, 108, 213}, - {{209, 89, 168, 236, 146, 169, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 54, 15}, - {{131, 210, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 20, 145}, - {{165, 190, 157, 7, 131, 5, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 57, 27}, - {{179, 226, 57, 204, 187, 70, 52, 81, 119, 162, 229, 42, 47, 185, 9, 162}, 127, 75}, - {{98, 235, 155, 51, 107, 167, 127, 137, 254, 246, 162, 171, 180, 13, 233, 0}, 123, 76}, - {{107, 79, 76, 90, 94, 151, 155, 31, 33, 115, 19, 204, 98, 115, 0, 0}, 113, 247}, - {{143, 46, 30, 175, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 43, 121}, - {{155, 85, 217, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 30, 214}, - {{58, 62, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 26, 221}, - {{92, 155, 53, 3, 39, 108, 155, 200, 0, 0, 0, 0, 0, 0, 0, 0}, 63, 102}, - {{64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2, 191}, - {{63, 134, 251, 59, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 39, 197}, - {{234, 149, 220, 106, 0, 144, 214, 128, 35, 102, 0, 0, 0, 0, 0, 0}, 79, 106}, + {RTE_IPV6(0x4246, 0x9a8f, 0xc5e9, 0, 0, 0, 0, 0), 50, 146}, + {RTE_IPV6(0x6b4f, 0x12eb, 0x8e54, 0x5000, 0, 0, 0, 0), 54, 141}, + {RTE_IPV6(0xf784, 0x7101, 0xd7f7, 0xb7ef, 0x8000, 0, 0, 0), 67, 23}, + {RTE_IPV6(0x3013, 0x290c, 0x4c65, 0x72a0, 0x2d67, 0x8692, 0x8000, 0), 97, 252}, + {RTE_IPV6(0x0546, 0xd0aa, 0x1300, 0x7400, 0, 0, 0, 0), 54, 6}, + {RTE_IPV6(0x0100, 0, 0, 0, 0, 0, 0, 0), 9, 137}, + {RTE_IPV6(0x0cbc, 0x1a12, 0, 0, 0, 0, 0, 0), 31, 9}, + {RTE_IPV6(0x01eb, 0x65ca, 0x1a5c, 0x1716, 0xb3df, 0x8000, 0, 0), 82, 9}, + {RTE_IPV6(0xd713, 0xe066, 0x2d85, 0x66f9, 0x3814, 0xd6db, 0x5d7d, 0x3400), 120, 163}, + {RTE_IPV6(0xb2b7, 0x6d40, 0x8854, 0x0b35, 0xd966, 0, 0, 0), 79, 197}, + {RTE_IPV6(0xd427, 0x9e47, 0xfd62, 0xf800, 0, 0, 0, 0), 54, 249}, + {RTE_IPV6(0x5c3a, 0x9f82, 0x6938, 0, 0, 0, 0, 0), 47, 88}, + {RTE_IPV6(0x768c, 0x41c6, 0xd45d, 0x9000, 0, 0, 0, 0), 52, 104}, + {RTE_IPV6(0x5640, 0, 0, 0, 0, 0, 0, 0), 10, 36}, + {RTE_IPV6(0x4f87, 0xf2c1, 0xc50b, 0xc800, 0, 0, 0, 0), 54, 239}, + {RTE_IPV6(0xa3e4, 0xef50, 0x2942, 0xb0b0, 0, 0, 0, 0), 67, 201}, + {RTE_IPV6(0x1f09, 0xe72a, 0, 0, 0, 0, 0, 0), 33, 94}, + {RTE_IPV6(0x6c90, 0xcd27, 0xd71a, 0x6000, 0, 0, 0, 0), 51, 241}, + {RTE_IPV6(0xf7d9, 0xac00, 0, 0, 0, 0, 0, 0), 24, 239}, + {RTE_IPV6(0x18ba, 0x49b6, 0xf0fb, 0x7da5, 0, 0, 0, 0), 66, 151}, + {RTE_IPV6(0xf570, 0, 0, 0, 0, 0, 0, 0), 12, 137}, + {RTE_IPV6(0x2c5e, 0x8ae0, 0xa800, 0, 0, 0, 0, 0), 41, 231}, + {RTE_IPV6(0xb8dd, 0x6d87, 0xe120, 0, 0, 0, 0, 0), 44, 11}, + {RTE_IPV6(0x33b3, 0x88b8, 0x1e76, 0x1810, 0x1aa1, 0xce65, 0, 0), 96, 20}, + {RTE_IPV6(0x302e, 0, 0, 0, 0, 0, 0, 0), 15, 68}, + {RTE_IPV6(0x8feb, 0xeddc, 0x5977, 0xbb8f, 0xd15e, 0x2e3a, 0x7800, 0), 101, 64}, + {RTE_IPV6(0x79be, 0x5ab1, 0x8000, 0, 0, 0, 0, 0), 33, 152}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 6, 217}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 2, 101}, + {RTE_IPV6(0x6fd6, 0, 0, 0, 0, 0, 0, 0), 15, 58}, + {RTE_IPV6(0xa217, 0x3440, 0, 0, 0, 0, 0, 0), 27, 254}, + {RTE_IPV6(0x4c67, 0x2c4f, 0, 0, 0, 0, 0, 0), 32, 148}, + {RTE_IPV6(0x5055, 0xdbd6, 0x0c04, 0x4181, 0xa294, 0xd04e, 0x2745, 0x5eb8), 126, 126}, + {RTE_IPV6(0x5036, 0xfb1c, 0x9817, 0xf4c0, 0x9753, 0x0690, 0xdfd5, 0xe080), 123, 76}, + {RTE_IPV6(0x27e8, 0xed67, 0xbfbc, 0x2400, 0, 0, 0, 0), 54, 240}, + {RTE_IPV6(0x14e7, 0x59d2, 0xa7ad, 0x5000, 0, 0, 0, 0), 54, 33}, + {RTE_IPV6(0x7d43, 0xc680, 0, 0, 0, 0, 0, 0), 25, 47}, + {RTE_IPV6(0x1aef, 0x9905, 0xd579, 0x1f72, 0xa12e, 0x540f, 0x94a0, 0), 109, 41}, + {RTE_IPV6(0x66d4, 0x9f76, 0xdf73, 0x86ac, 0, 0, 0, 0), 62, 72}, + {RTE_IPV6(0x55b5, 0xf17f, 0x032c, 0, 0, 0, 0, 0), 46, 43}, + {RTE_IPV6(0x3dc7, 0x83e2, 0x03e6, 0x5e77, 0xf000, 0, 0, 0), 68, 26}, + {RTE_IPV6(0x008f, 0xa0b8, 0xa2c0, 0, 0, 0, 0, 0), 42, 139}, + {RTE_IPV6(0xaa18, 0, 0, 0, 0, 0, 0, 0), 13, 219}, + {RTE_IPV6(0x3d7a, 0x18fb, 0x7c7a, 0xcac0, 0, 0, 0, 0), 58, 105}, + {RTE_IPV6(0x21db, 0xe203, 0xb4be, 0, 0, 0, 0, 0), 47, 210}, + {RTE_IPV6(0x33fb, 0, 0, 0, 0, 0, 0, 0), 17, 151}, + {RTE_IPV6(0x6ab9, 0x0b7a, 0xc5c0, 0, 0, 0, 0, 0), 42, 28}, + {RTE_IPV6(0xc000, 0, 0, 0, 0, 0, 0, 0), 9, 64}, + {RTE_IPV6(0xefc3, 0x4def, 0x839c, 0x02f6, 0xbfb2, 0xcca0, 0x15d5, 0x1e80), 121, 9}, + {RTE_IPV6(0x8dcf, 0xb563, 0x37f5, 0x97e4, 0x4132, 0x5510, 0, 0), 92, 250}, + {RTE_IPV6(0x6e9f, 0xe6fb, 0xe0d2, 0x3a31, 0, 0, 0, 0), 66, 200}, + {RTE_IPV6(0x861a, 0x6820, 0x8129, 0xc932, 0xa445, 0xb29c, 0x9c85, 0x08da), 127, 132}, + {RTE_IPV6(0xfdcf, 0x7469, 0xd2a6, 0xba63, 0xb600, 0, 0, 0), 71, 182}, + {RTE_IPV6(0xd349, 0x2650, 0xb7a8, 0x348a, 0x19d6, 0x7008, 0xfc00, 0), 102, 7}, + {RTE_IPV6(0xc8f4, 0x6cee, 0xa48d, 0xd727, 0xe9f9, 0x7850, 0x7000, 0), 100, 146}, + {RTE_IPV6(0x6b2c, 0xfaca, 0x4025, 0x6b69, 0x8c00, 0, 0, 0), 70, 98}, + {RTE_IPV6(0x5d56, 0x381b, 0x9fc3, 0x7e27, 0xf0c9, 0x3000, 0, 0), 86, 179}, + {RTE_IPV6(0x20ca, 0xd6f2, 0x278d, 0x3d92, 0x8a60, 0, 0, 0), 77, 245}, + {RTE_IPV6(0xa74d, 0xf91c, 0xd2c4, 0xe3f1, 0, 0, 0, 0), 64, 2}, + {RTE_IPV6(0xf13b, 0x8000, 0, 0, 0, 0, 0, 0), 17, 5}, + {RTE_IPV6(0x8f44, 0x92d2, 0xad9b, 0xfbad, 0, 0, 0, 0), 66, 169}, + {RTE_IPV6(0xa7b4, 0xe290, 0, 0, 0, 0, 0, 0), 33, 52}, + {RTE_IPV6(0xf100, 0, 0, 0, 0, 0, 0, 0), 9, 177}, + {RTE_IPV6(0xee09, 0xa860, 0, 0, 0, 0, 0, 0), 27, 74}, + {RTE_IPV6(0xcb94, 0x1060, 0x7d12, 0x5601, 0x5bf4, 0xfb14, 0x1f0e, 0x4b80), 122, 212}, + {RTE_IPV6(0x6fe3, 0x895e, 0x4115, 0x4d89, 0x7782, 0x9f13, 0x9f2d, 0x12c0), 122, 238}, + {RTE_IPV6(0x3b90, 0, 0, 0, 0, 0, 0, 0), 19, 18}, + {RTE_IPV6(0x6ec0, 0xff78, 0x54d7, 0x0382, 0x26e0, 0, 0, 0), 75, 155}, + {RTE_IPV6(0x984f, 0xdb00, 0, 0, 0, 0, 0, 0), 24, 97}, + {RTE_IPV6(0x76ba, 0x9df8, 0, 0, 0, 0, 0, 0), 32, 8}, + {RTE_IPV6(0x4680, 0, 0, 0, 0, 0, 0, 0), 9, 123}, + {RTE_IPV6(0xfd77, 0x72e3, 0x12f3, 0x513d, 0xee6b, 0xbe90, 0, 0), 92, 11}, + {RTE_IPV6(0xa670, 0, 0, 0, 0, 0, 0, 0), 13, 211}, + {RTE_IPV6(0x2b5f, 0xe000, 0, 0, 0, 0, 0, 0), 20, 116}, + {RTE_IPV6(0x5e80, 0, 0, 0, 0, 0, 0, 0), 11, 57}, + {RTE_IPV6(0xb6fb, 0xc384, 0x4207, 0xd092, 0xdfe7, 0xd3b5, 0x19b0, 0), 108, 178}, + {RTE_IPV6(0x98a6, 0x6fe9, 0xc211, 0xe629, 0xddfd, 0x457b, 0x6c00, 0), 102, 93}, + {RTE_IPV6(0x6a8d, 0xebbe, 0x52f1, 0x98ba, 0xc351, 0x5690, 0, 0), 92, 3}, + {RTE_IPV6(0x2051, 0xd299, 0x971d, 0x0b3e, 0x7fb1, 0xc2fe, 0x6753, 0x3a80), 121, 162}, + {RTE_IPV6(0x4f70, 0xe01a, 0xae27, 0x62b5, 0x7339, 0xd1bd, 0x8830, 0), 109, 125}, + {RTE_IPV6(0x6ac5, 0x5397, 0x4000, 0, 0, 0, 0, 0), 34, 33}, + {RTE_IPV6(0xbe00, 0, 0, 0, 0, 0, 0, 0), 9, 254}, + {RTE_IPV6(0x9c49, 0xf994, 0x37c0, 0x142a, 0x8e80, 0, 0, 0), 74, 66}, + {RTE_IPV6(0x406b, 0x2478, 0, 0, 0, 0, 0, 0), 30, 4}, + {RTE_IPV6(0x7394, 0x47fa, 0x9eae, 0xa8f9, 0x6a6e, 0xc400, 0, 0), 86, 122}, + {RTE_IPV6(0x128b, 0x982c, 0x2658, 0, 0, 0, 0, 0), 46, 59}, + {RTE_IPV6(0x37e5, 0x756a, 0x925f, 0x4adc, 0x7a00, 0x54ca, 0xb78a, 0x7800), 117, 99}, + {RTE_IPV6(0x99d3, 0x0360, 0, 0, 0, 0, 0, 0), 27, 41}, + {RTE_IPV6(0x0100, 0, 0, 0, 0, 0, 0, 0), 8, 112}, + {RTE_IPV6(0x31c0, 0x668e, 0xd803, 0x7240, 0xa580, 0xa800, 0, 0), 85, 255}, + {RTE_IPV6(0xc98f, 0xf0f0, 0xd1e0, 0, 0, 0, 0, 0), 44, 106}, + {RTE_IPV6(0x9e13, 0xa4c4, 0x57a2, 0x2178, 0, 0, 0, 0), 62, 170}, + {RTE_IPV6(0x0572, 0, 0, 0, 0, 0, 0, 0), 16, 86}, + {RTE_IPV6(0x22aa, 0xf63e, 0xc655, 0xc1e3, 0xfc44, 0, 0, 0), 79, 155}, + {RTE_IPV6(0x1534, 0x0956, 0xe000, 0, 0, 0, 0, 0), 35, 65}, + {RTE_IPV6(0xcb51, 0x31ab, 0xe000, 0, 0, 0, 0, 0), 36, 39}, + {RTE_IPV6(0xd3da, 0x57f4, 0x5db5, 0x7629, 0x9c8f, 0xfe00, 0, 0), 90, 162}, + {RTE_IPV6(0x4d40, 0, 0, 0, 0, 0, 0, 0), 10, 69}, + {RTE_IPV6(0x9edb, 0xdb27, 0x04db, 0x643f, 0, 0, 0, 0), 64, 163}, + {RTE_IPV6(0x3d32, 0xe801, 0xb9fc, 0xf336, 0xbdf0, 0xaac0, 0, 0), 90, 116}, + {RTE_IPV6(0xf18f, 0x2113, 0xf737, 0x2000, 0, 0, 0, 0), 53, 19}, + {RTE_IPV6(0x3d1c, 0x3dfc, 0x2000, 0, 0, 0, 0, 0), 36, 48}, + {RTE_IPV6(0x6670, 0xc26c, 0x5afd, 0x8000, 0, 0, 0, 0), 49, 230}, + {RTE_IPV6(0x4a58, 0x3a42, 0xac29, 0x90cc, 0xc3f0, 0, 0, 0), 78, 155}, + {RTE_IPV6(0x2c94, 0xbb3a, 0xbe3b, 0xbebb, 0x7c8a, 0xde83, 0, 0), 96, 158}, + {RTE_IPV6(0x4307, 0xd88b, 0x5de0, 0x1487, 0xba56, 0xd16f, 0x3c50, 0), 113, 252}, + {RTE_IPV6(0xd11a, 0x0cae, 0x0565, 0xa4b5, 0xed3f, 0xc039, 0x3678, 0), 110, 176}, + {RTE_IPV6(0x0442, 0xe834, 0xef38, 0x303a, 0xc000, 0, 0, 0), 66, 211}, + {RTE_IPV6(0x9ea5, 0x0290, 0, 0, 0, 0, 0, 0), 28, 15}, + {RTE_IPV6(0x55cc, 0xf5c6, 0x442c, 0x2747, 0x2000, 0, 0, 0), 68, 95}, + {RTE_IPV6(0xb586, 0x1957, 0x8000, 0, 0, 0, 0, 0), 34, 169}, + {RTE_IPV6(0x1ae6, 0x3d24, 0x4fc0, 0, 0, 0, 0, 0), 44, 249}, + {RTE_IPV6(0x05aa, 0xc68b, 0x41ba, 0xbc2d, 0x2afd, 0xa559, 0xce00, 0), 105, 61}, + {RTE_IPV6(0xd3f5, 0x3e00, 0, 0, 0, 0, 0, 0), 23, 63}, + {RTE_IPV6(0x7544, 0, 0, 0, 0, 0, 0, 0), 14, 43}, + {RTE_IPV6(0x6711, 0x7b66, 0x46ce, 0x5a5c, 0x7cc6, 0, 0, 0), 81, 228}, + {RTE_IPV6(0xc0ed, 0x58f4, 0x351e, 0x3da0, 0x8f40, 0, 0, 0), 78, 165}, + {RTE_IPV6(0xc752, 0xd9b7, 0x02b3, 0xc306, 0, 0, 0, 0), 64, 3}, + {RTE_IPV6(0x9de6, 0x4fa2, 0x397d, 0x9800, 0, 0, 0, 0), 57, 211}, + {RTE_IPV6(0x1b43, 0x40eb, 0x8000, 0, 0, 0, 0, 0), 33, 210}, + {RTE_IPV6(0x489e, 0xa36a, 0xc189, 0xbe07, 0xfaa5, 0xf949, 0x4000, 0), 99, 61}, + {RTE_IPV6(0x22c0, 0, 0, 0, 0, 0, 0, 0), 10, 120}, + {RTE_IPV6(0xd78d, 0x5fc0, 0xbd3e, 0, 0, 0, 0, 0), 47, 94}, + {RTE_IPV6(0x1fb5, 0x388d, 0x7880, 0, 0, 0, 0, 0), 41, 153}, + {RTE_IPV6(0x9949, 0x8000, 0, 0, 0, 0, 0, 0), 18, 221}, + {RTE_IPV6(0xa26b, 0x29bd, 0xa59b, 0x168b, 0xa548, 0x6000, 0, 0), 87, 163}, + {RTE_IPV6(0xda11, 0xcca5, 0xd9fb, 0x6b2d, 0x1d0f, 0xc0a7, 0x4b00, 0), 106, 188}, + {RTE_IPV6(0xc87c, 0xeed5, 0x23e4, 0x5e8d, 0x56bb, 0x653c, 0x7334, 0x8310), 124, 15}, + {RTE_IPV6(0x4aed, 0xa038, 0x8dd9, 0xbf10, 0, 0, 0, 0), 63, 28}, + {RTE_IPV6(0xa32f, 0xf267, 0xadd9, 0x589a, 0x26c8, 0x2000, 0, 0), 84, 240}, + {RTE_IPV6(0x14e3, 0x801c, 0x9093, 0x160d, 0x5e81, 0x6b58, 0, 0), 93, 59}, + {RTE_IPV6(0x5f90, 0xe56b, 0xda7d, 0xcce9, 0xa12a, 0xb440, 0, 0), 90, 195}, + {RTE_IPV6(0x9bdc, 0x53d0, 0x6c10, 0x869c, 0x8000, 0, 0, 0), 66, 10}, + {RTE_IPV6(0xb38a, 0x3750, 0xbe99, 0x0ced, 0x1678, 0x4500, 0, 0), 88, 206}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 2, 137}, + {RTE_IPV6(0x0377, 0x9400, 0, 0, 0, 0, 0, 0), 22, 225}, + {RTE_IPV6(0x0dc0, 0, 0, 0, 0, 0, 0, 0), 10, 223}, + {RTE_IPV6(0x751c, 0, 0, 0, 0, 0, 0, 0), 15, 29}, + {RTE_IPV6(0xa413, 0xc32f, 0x88be, 0x9cff, 0x1e4a, 0x8f86, 0xa200, 0), 103, 166}, + {RTE_IPV6(0x28eb, 0x5e87, 0x87e6, 0x4721, 0x40e9, 0, 0, 0), 80, 178}, + {RTE_IPV6(0xde97, 0xa661, 0x81fa, 0x8c00, 0, 0, 0, 0), 55, 38}, + {RTE_IPV6(0xae80, 0, 0, 0, 0, 0, 0, 0), 9, 141}, + {RTE_IPV6(0x06bd, 0x6496, 0xfa0d, 0x2e62, 0xe48b, 0x3234, 0x34c4, 0x8000), 116, 230}, + {RTE_IPV6(0x4bfc, 0x59cd, 0x2534, 0x6a4f, 0xbc78, 0x3677, 0xa000, 0), 99, 124}, + {RTE_IPV6(0x2612, 0x9206, 0x3f40, 0xe70a, 0x98c7, 0x058f, 0x9304, 0xfc00), 118, 54}, + {RTE_IPV6(0x6f77, 0xa933, 0, 0, 0, 0, 0, 0), 32, 162}, + {RTE_IPV6(0x6980, 0, 0, 0, 0, 0, 0, 0), 13, 32}, + {RTE_IPV6(0x8f39, 0x3965, 0x62b6, 0x4ae3, 0xcd8f, 0xfded, 0x0800, 0), 102, 237}, + {RTE_IPV6(0x1e00, 0, 0, 0, 0, 0, 0, 0), 7, 215}, + {RTE_IPV6(0x0ee8, 0x3000, 0, 0, 0, 0, 0, 0), 22, 138}, + {RTE_IPV6(0x0e35, 0x43d8, 0xe59b, 0x958b, 0x1ffd, 0xb87e, 0x856c, 0x2800), 118, 73}, + {RTE_IPV6(0x163a, 0x288f, 0xbc84, 0xef0e, 0xb5fc, 0x51c0, 0, 0), 90, 43}, + {RTE_IPV6(0x0bde, 0xb9f3, 0xf896, 0x4fe6, 0xd6d5, 0x0317, 0xc1c4, 0), 112, 88}, + {RTE_IPV6(0x0ee2, 0xc675, 0x545d, 0x1660, 0x4df1, 0xad44, 0x44cc, 0x4800), 119, 91}, + {RTE_IPV6(0x0f67, 0xf7db, 0x968e, 0x5c32, 0x9000, 0, 0, 0), 69, 140}, + {RTE_IPV6(0x00d5, 0x4df4, 0x4000, 0, 0, 0, 0, 0), 37, 65}, + {RTE_IPV6(0xb2ae, 0xaeef, 0x48b5, 0x24d9, 0x28a9, 0x0c68, 0x959d, 0x7d80), 122, 201}, + {RTE_IPV6(0x7635, 0x3711, 0x61e3, 0xf3b0, 0x0200, 0, 0, 0), 72, 69}, + {RTE_IPV6(0x15fd, 0x042f, 0, 0, 0, 0, 0, 0), 35, 170}, + {RTE_IPV6(0x05f9, 0xba85, 0x4400, 0, 0, 0, 0, 0), 40, 192}, + {RTE_IPV6(0x2f4f, 0x2342, 0x0bb2, 0xa11c, 0x57b4, 0x2d80, 0, 0), 89, 21}, + {RTE_IPV6(0xf2e3, 0x1449, 0x96c4, 0, 0, 0, 0, 0), 46, 35}, + {RTE_IPV6(0x79a9, 0x6676, 0x9dc0, 0x9aba, 0x7e00, 0, 0, 0), 71, 235}, + {RTE_IPV6(0x098a, 0xc000, 0, 0, 0, 0, 0, 0), 21, 240}, + {RTE_IPV6(0x2dad, 0x0e48, 0, 0, 0, 0, 0, 0), 30, 136}, + {RTE_IPV6(0x7f2f, 0x33c9, 0xec2d, 0x8e50, 0, 0, 0, 0), 60, 186}, + {RTE_IPV6(0xf7e9, 0x2226, 0xb5cf, 0x7f14, 0xe076, 0x3b94, 0, 0), 95, 174}, + {RTE_IPV6(0x7ebb, 0xc668, 0xf5df, 0xdb12, 0x1f7c, 0, 0, 0), 79, 153}, + {RTE_IPV6(0x03a3, 0x6be4, 0xc000, 0, 0, 0, 0, 0), 35, 118}, + {RTE_IPV6(0xa76d, 0x025f, 0x0b3e, 0x2d80, 0, 0, 0, 0), 60, 113}, + {RTE_IPV6(0x4c00, 0, 0, 0, 0, 0, 0, 0), 6, 58}, + {RTE_IPV6(0x3abe, 0xcc97, 0xde93, 0x2f4e, 0x26cb, 0x0911, 0x4000, 0), 101, 206}, + {RTE_IPV6(0xfedc, 0xfedc, 0xcc4f, 0x237f, 0xf23f, 0x6ae8, 0x7fb4, 0), 111, 42}, + {RTE_IPV6(0x4d9c, 0x08d1, 0xb525, 0x4600, 0, 0, 0, 0), 55, 230}, + {RTE_IPV6(0x4159, 0x894c, 0xd0c7, 0xa65a, 0x8000, 0, 0, 0), 67, 6}, + {RTE_IPV6(0x2fe8, 0, 0, 0, 0, 0, 0, 0), 13, 254}, + {RTE_IPV6(0xac9a, 0x0c6c, 0x4d25, 0x6a08, 0xea07, 0xf8d4, 0x70a0, 0), 108, 214}, + {RTE_IPV6(0xfe75, 0xeff4, 0x9a59, 0xa6f1, 0x0c6c, 0x7f99, 0xcea0, 0), 107, 43}, + {RTE_IPV6(0x71a0, 0xce34, 0x8f0c, 0x0994, 0xe000, 0, 0, 0), 67, 178}, + {RTE_IPV6(0xb282, 0, 0, 0, 0, 0, 0, 0), 16, 179}, + {RTE_IPV6(0xe5b1, 0x1c6a, 0x3b4b, 0xb6f1, 0x244f, 0xe000, 0, 0), 87, 236}, + {RTE_IPV6(0x9c48, 0x5dc1, 0x32eb, 0x4be4, 0x5873, 0x5977, 0x8000, 0), 98, 184}, + {RTE_IPV6(0x1ce8, 0x1cf9, 0x5369, 0xd307, 0x8893, 0xe740, 0, 0), 91, 95}, + {RTE_IPV6(0xd921, 0x176b, 0x4a2a, 0x87c5, 0x9022, 0x28f3, 0x0d7e, 0x2488), 127, 152}, + {RTE_IPV6(0x4000, 0, 0, 0, 0, 0, 0, 0), 2, 113}, + {RTE_IPV6(0x55ac, 0x797e, 0xd539, 0xe136, 0xc549, 0x55fb, 0x0940, 0), 108, 137}, + {RTE_IPV6(0x682e, 0x1947, 0x56dc, 0, 0, 0, 0, 0), 46, 224}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 6, 61}, + {RTE_IPV6(0xf171, 0xfe6a, 0x3580, 0, 0, 0, 0, 0), 41, 205}, + {RTE_IPV6(0x1d24, 0x0cf4, 0xc57f, 0xf008, 0xa786, 0x9af8, 0xc77b, 0x8ff0), 124, 170}, + {RTE_IPV6(0x3a1d, 0x815e, 0x2b8b, 0xe000, 0, 0, 0, 0), 53, 117}, + {RTE_IPV6(0xd57c, 0x93c4, 0x0752, 0x4346, 0xe400, 0, 0, 0), 70, 225}, + {RTE_IPV6(0xa4a8, 0xa18c, 0x5755, 0xfa29, 0x2200, 0, 0, 0), 72, 34}, + {RTE_IPV6(0xba8e, 0x8000, 0, 0, 0, 0, 0, 0), 17, 5}, + {RTE_IPV6(0xedf9, 0x0946, 0xf761, 0x4000, 0, 0, 0, 0), 50, 92}, + {RTE_IPV6(0x9b5c, 0x91da, 0x7de2, 0xe200, 0, 0, 0, 0), 55, 230}, + {RTE_IPV6(0x23a9, 0x3e9c, 0x5604, 0x7ddb, 0x7771, 0xbf4b, 0xc671, 0), 112, 61}, + {RTE_IPV6(0xcf3f, 0x60ba, 0x1a44, 0x73a1, 0xa33b, 0xbea6, 0x124e, 0xe800), 117, 221}, + {RTE_IPV6(0x5628, 0xc8c7, 0xf756, 0x9fb3, 0xbfb8, 0x75ad, 0xd39e, 0x0080), 121, 105}, + {RTE_IPV6(0x6840, 0, 0, 0, 0, 0, 0, 0), 11, 181}, + {RTE_IPV6(0xcd23, 0x7bb2, 0x2440, 0x3e99, 0xc3fa, 0, 0, 0), 79, 110}, + {RTE_IPV6(0x7528, 0x399d, 0x8aa0, 0xdf3b, 0x9b91, 0x4000, 0, 0), 86, 103}, + {RTE_IPV6(0x4aa6, 0x8c92, 0x4a48, 0xe563, 0xa77c, 0x6b75, 0xd90e, 0xf640), 123, 218}, + {RTE_IPV6(0x0cde, 0xf4b7, 0x5392, 0x2a00, 0, 0, 0, 0), 56, 146}, + {RTE_IPV6(0x0b62, 0x926e, 0x5f60, 0x508e, 0xe000, 0, 0, 0), 67, 90}, + {RTE_IPV6(0xeb05, 0xbbc7, 0x1eaa, 0x52bb, 0xe49f, 0x1619, 0xcc70, 0), 108, 197}, + {RTE_IPV6(0x2360, 0x9291, 0x9b74, 0xfcb5, 0x1dcd, 0xe6f6, 0x1e00, 0), 103, 158}, + {RTE_IPV6(0xae26, 0x38f4, 0xe366, 0xfced, 0x8056, 0, 0, 0), 81, 118}, + {RTE_IPV6(0x4186, 0x253a, 0x5a7d, 0x3c54, 0, 0, 0, 0), 62, 95}, + {RTE_IPV6(0xfd75, 0x8762, 0x8000, 0, 0, 0, 0, 0), 33, 152}, + {RTE_IPV6(0x6f73, 0xbcb8, 0x8200, 0, 0, 0, 0, 0), 45, 239}, + {RTE_IPV6(0xca18, 0x5909, 0x952d, 0x4000, 0, 0, 0, 0), 50, 48}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 5, 228}, + {RTE_IPV6(0xf462, 0x348c, 0, 0, 0, 0, 0, 0), 30, 247}, + {RTE_IPV6(0x97a7, 0x2bb2, 0x74c2, 0xad7e, 0xec62, 0x2800, 0, 0), 85, 12}, + {RTE_IPV6(0x3c40, 0, 0, 0, 0, 0, 0, 0), 10, 129}, + {RTE_IPV6(0xd000, 0, 0, 0, 0, 0, 0, 0), 4, 50}, + {RTE_IPV6(0x7e0b, 0xd8f2, 0x072d, 0x79d0, 0x6e87, 0xd24b, 0x3bb6, 0xe42a), 128, 250}, + {RTE_IPV6(0xd91a, 0xb892, 0x0312, 0xf00f, 0x8708, 0, 0, 0), 77, 249}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 1, 230}, + {RTE_IPV6(0x911c, 0x1db8, 0x0255, 0xea87, 0x626f, 0x8820, 0, 0), 92, 228}, + {RTE_IPV6(0x6c68, 0xfffe, 0x225f, 0x489d, 0, 0, 0, 0), 64, 181}, + {RTE_IPV6(0x993d, 0, 0, 0, 0, 0, 0, 0), 16, 206}, + {RTE_IPV6(0x16fa, 0x82c9, 0x84f8, 0xbd6c, 0, 0, 0, 0), 63, 122}, + {RTE_IPV6(0x9ea5, 0xea12, 0x2c3d, 0x523d, 0xeb00, 0, 0, 0), 72, 81}, + {RTE_IPV6(0xec39, 0x7c6e, 0x7cda, 0x5246, 0x8e4e, 0x1280, 0, 0), 95, 175}, + {RTE_IPV6(0x5ed1, 0xc8c9, 0x95a2, 0xf886, 0xefe2, 0x01ed, 0x1086, 0x3800), 118, 170}, + {RTE_IPV6(0xbb2a, 0x1f90, 0xec46, 0, 0, 0, 0, 0), 47, 174}, + {RTE_IPV6(0x5ad6, 0xb980, 0, 0, 0, 0, 0, 0), 29, 104}, + {RTE_IPV6(0xc2dc, 0xd3d4, 0xd320, 0xc462, 0x473e, 0x9967, 0x5023, 0x8000), 114, 113}, + {RTE_IPV6(0x18ff, 0x9e40, 0xb494, 0x0a51, 0xf3f7, 0, 0, 0), 80, 89}, + {RTE_IPV6(0xe79b, 0x64f2, 0x70a0, 0xa05f, 0x62fd, 0xdb15, 0xef5a, 0), 113, 151}, + {RTE_IPV6(0xe160, 0, 0, 0, 0, 0, 0, 0), 11, 108}, + {RTE_IPV6(0x8800, 0, 0, 0, 0, 0, 0, 0), 7, 224}, + {RTE_IPV6(0xfa80, 0, 0, 0, 0, 0, 0, 0), 9, 95}, + {RTE_IPV6(0x48a8, 0, 0, 0, 0, 0, 0, 0), 14, 173}, + {RTE_IPV6(0xb933, 0x33a7, 0x122c, 0x243b, 0x2387, 0x1468, 0, 0), 93, 176}, + {RTE_IPV6(0x3992, 0xfc3c, 0xc544, 0x27a2, 0x50c6, 0x8932, 0x615c, 0x7c00), 119, 84}, + {RTE_IPV6(0xfe2e, 0xf269, 0x565e, 0x600e, 0x82b0, 0, 0, 0), 78, 104}, + {RTE_IPV6(0xf7ca, 0xb04c, 0x4528, 0, 0, 0, 0, 0), 49, 236}, + {RTE_IPV6(0x32e9, 0xcb4d, 0x2a15, 0x73a3, 0xa68a, 0xc034, 0xb225, 0x7000), 116, 153}, + {RTE_IPV6(0x3ec0, 0, 0, 0, 0, 0, 0, 0), 11, 190}, + {RTE_IPV6(0x3560, 0, 0, 0, 0, 0, 0, 0), 13, 202}, + {RTE_IPV6(0xc600, 0, 0, 0, 0, 0, 0, 0), 8, 54}, + {RTE_IPV6(0xbdea, 0x6af7, 0x4000, 0, 0, 0, 0, 0), 34, 156}, + {RTE_IPV6(0x6e18, 0xe441, 0xd893, 0x0930, 0x3cb3, 0xac5b, 0x73b9, 0xe360), 126, 245}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 6, 218}, + {RTE_IPV6(0x4ab1, 0x59da, 0xf812, 0xb027, 0x76ad, 0xc998, 0, 0), 93, 72}, + {RTE_IPV6(0x1f0d, 0x995c, 0x1b7a, 0x96e8, 0x585f, 0xcaab, 0xd09e, 0), 112, 183}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 2, 183}, + {RTE_IPV6(0x3f25, 0x2e9e, 0x8b80, 0, 0, 0, 0, 0), 42, 241}, + {RTE_IPV6(0x35d1, 0x3b0d, 0xca46, 0, 0, 0, 0, 0), 47, 106}, + {RTE_IPV6(0xb82c, 0x95dd, 0xb400, 0, 0, 0, 0, 0), 40, 180}, + {RTE_IPV6(0xde86, 0x253e, 0xdfc1, 0x27f6, 0x0f97, 0xc892, 0, 0), 96, 142}, + {RTE_IPV6(0xc7b0, 0xbd25, 0xe9b1, 0xfcd8, 0x5eaf, 0xfd77, 0x6000, 0), 100, 6}, + {RTE_IPV6(0x2cc3, 0xc96a, 0xd178, 0x7a26, 0x2b1e, 0x8e16, 0xc4af, 0x6400), 118, 33}, + {RTE_IPV6(0x21a6, 0x0aae, 0x4000, 0, 0, 0, 0, 0), 34, 224}, + {RTE_IPV6(0x3601, 0xbdc3, 0x8531, 0x2450, 0x8ac8, 0, 0, 0), 78, 14}, + {RTE_IPV6(0xf100, 0, 0, 0, 0, 0, 0, 0), 10, 149}, + {RTE_IPV6(0xdd83, 0x04f7, 0x7059, 0xbb77, 0xdb50, 0x7a9c, 0xd8a0, 0), 108, 131}, + {RTE_IPV6(0x6614, 0x2e81, 0xcaf7, 0x8101, 0xed47, 0x673a, 0xd92c, 0x0400), 121, 133}, + {RTE_IPV6(0x6b9c, 0x972c, 0xd762, 0xab7e, 0x5520, 0x2a80, 0, 0), 89, 33}, + {RTE_IPV6(0x3619, 0x4650, 0, 0, 0, 0, 0, 0), 28, 204}, + {RTE_IPV6(0x95d3, 0xf20e, 0x70db, 0xb000, 0, 0, 0, 0), 52, 43}, + {RTE_IPV6(0x5f1a, 0x8fc1, 0x084c, 0x4000, 0, 0, 0, 0), 51, 168}, + {RTE_IPV6(0x3f66, 0xf4b0, 0, 0, 0, 0, 0, 0), 28, 180}, + {RTE_IPV6(0x4055, 0x7ce2, 0x3bef, 0x4082, 0x447a, 0x5d4a, 0x2025, 0), 112, 208}, + {RTE_IPV6(0x715a, 0xfd95, 0x03da, 0x22d7, 0x038f, 0xc040, 0, 0), 90, 25}, + {RTE_IPV6(0x4be7, 0x2105, 0x0b5e, 0x7568, 0x963c, 0x48a1, 0x6026, 0), 111, 50}, + {RTE_IPV6(0x340d, 0xf801, 0xfb0e, 0x321d, 0xd47b, 0x82b1, 0x6560, 0), 109, 110}, + {RTE_IPV6(0xf8dd, 0x9684, 0xfc52, 0x6002, 0x50e8, 0x61ef, 0xfd40, 0), 109, 21}, + {RTE_IPV6(0x884d, 0xa4a1, 0xc000, 0, 0, 0, 0, 0), 36, 147}, + {RTE_IPV6(0x0121, 0x42fe, 0x9080, 0, 0, 0, 0, 0), 43, 56}, + {RTE_IPV6(0xb519, 0xbae1, 0x6dbe, 0x4c9e, 0x767a, 0x1440, 0x7d37, 0x0800), 117, 144}, + {RTE_IPV6(0xbfbb, 0xa08c, 0x1106, 0x5078, 0xecd4, 0x6890, 0x8000, 0), 100, 198}, + {RTE_IPV6(0xc93d, 0x96fe, 0x464d, 0xd6d3, 0xaba3, 0xf540, 0, 0), 90, 235}, + {RTE_IPV6(0x8fe2, 0xbe32, 0xfc00, 0, 0, 0, 0, 0), 38, 105}, + {RTE_IPV6(0x41a8, 0xe224, 0xc950, 0, 0, 0, 0, 0), 45, 138}, + {RTE_IPV6(0x8828, 0x415a, 0x2f10, 0x8000, 0, 0, 0, 0), 49, 122}, + {RTE_IPV6(0x5ebd, 0xe0c8, 0xaa0b, 0x4fac, 0, 0, 0, 0), 65, 193}, + {RTE_IPV6(0xec29, 0xa9ea, 0x0e80, 0, 0, 0, 0, 0), 43, 231}, + {RTE_IPV6(0x0128, 0x8c5f, 0x51ad, 0xfaf8, 0, 0, 0, 0), 64, 250}, + {RTE_IPV6(0x53b0, 0x9270, 0x599c, 0x39dc, 0x7d30, 0x2c00, 0, 0), 86, 24}, + {RTE_IPV6(0x4c7d, 0xe4f9, 0xf3a0, 0x6a00, 0, 0, 0, 0), 55, 191}, + {RTE_IPV6(0x0acb, 0xcc31, 0xd473, 0x7d04, 0xef7a, 0x5122, 0x01c6, 0xd800), 117, 111}, + {RTE_IPV6(0x4ad6, 0x172c, 0xd328, 0xa13d, 0xedbe, 0x9b3b, 0xad2a, 0), 111, 205}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 1, 133}, + {RTE_IPV6(0x7f00, 0x823d, 0xd105, 0xe823, 0x232a, 0x7234, 0xa9ea, 0xbf00), 122, 122}, + {RTE_IPV6(0xc96b, 0xd20d, 0xbb3e, 0x911c, 0x1fbd, 0x3800, 0, 0), 87, 227}, + {RTE_IPV6(0x93ab, 0x3f91, 0x2fa0, 0, 0, 0, 0, 0), 46, 53}, + {RTE_IPV6(0x5de8, 0x0a61, 0x15f3, 0xd587, 0xc800, 0, 0, 0), 72, 224}, + {RTE_IPV6(0x9079, 0x2940, 0, 0, 0, 0, 0, 0), 26, 199}, + {RTE_IPV6(0x7469, 0x8000, 0, 0, 0, 0, 0, 0), 17, 79}, + {RTE_IPV6(0x8e95, 0x1800, 0, 0, 0, 0, 0, 0), 21, 19}, + {RTE_IPV6(0x6100, 0xe49e, 0x32e9, 0xfbf9, 0x0042, 0xc5e2, 0, 0), 96, 211}, + {RTE_IPV6(0x72e4, 0xc79b, 0xaf68, 0x1ad5, 0x42f9, 0x78da, 0xa4fc, 0xd400), 120, 6}, + {RTE_IPV6(0xe0a6, 0x4cc8, 0x793c, 0x6e41, 0x3c5f, 0x89be, 0x5cda, 0xda00), 121, 143}, + {RTE_IPV6(0x8bdb, 0x5ce0, 0, 0, 0, 0, 0, 0), 31, 135}, + {RTE_IPV6(0xcbed, 0x40bd, 0x1c0d, 0x4bc5, 0xdbf3, 0xac03, 0x8e20, 0), 109, 21}, + {RTE_IPV6(0xedba, 0x58fe, 0x7c00, 0, 0, 0, 0, 0), 38, 220}, + {RTE_IPV6(0xb6e6, 0x5da2, 0x8119, 0x38c4, 0x7000, 0, 0, 0), 68, 151}, + {RTE_IPV6(0xf52d, 0x45e2, 0x5ad4, 0xfe10, 0, 0, 0, 0), 60, 111}, + {RTE_IPV6(0x6be5, 0xf000, 0, 0, 0, 0, 0, 0), 20, 63}, + {RTE_IPV6(0x77d0, 0xb1eb, 0xdefc, 0xdb00, 0, 0, 0, 0), 57, 112}, + {RTE_IPV6(0xb297, 0xdca2, 0x7880, 0, 0, 0, 0, 0), 41, 48}, + {RTE_IPV6(0x6d1a, 0x5faa, 0xa697, 0x8953, 0xe252, 0x0572, 0xfdd2, 0x120c), 126, 100}, + {RTE_IPV6(0x7e1b, 0xfc13, 0xdb81, 0x7930, 0, 0, 0, 0), 60, 156}, + {RTE_IPV6(0xd3c3, 0x9891, 0x9a5d, 0xe4d7, 0x8765, 0x1c52, 0, 0), 95, 120}, + {RTE_IPV6(0xfc6b, 0, 0, 0, 0, 0, 0, 0), 16, 5}, + {RTE_IPV6(0xc000, 0, 0, 0, 0, 0, 0, 0), 4, 103}, + {RTE_IPV6(0x4000, 0, 0, 0, 0, 0, 0, 0), 4, 84}, + {RTE_IPV6(0xe1b3, 0x2b2b, 0xde91, 0xcdee, 0xa49e, 0x93e5, 0x3800, 0), 101, 24}, + {RTE_IPV6(0xd07f, 0x9718, 0x4071, 0x2f55, 0xd14f, 0x9000, 0, 0), 86, 81}, + {RTE_IPV6(0xb290, 0xcb68, 0, 0, 0, 0, 0, 0), 29, 96}, + {RTE_IPV6(0x38e3, 0x8b04, 0x5657, 0xb401, 0xd7a7, 0xed9c, 0x6f40, 0x2f00), 121, 6}, + {RTE_IPV6(0x504c, 0xcc77, 0xaca9, 0xfe51, 0x68a6, 0xdb2c, 0xada1, 0xd400), 119, 40}, + {RTE_IPV6(0x818d, 0x8b22, 0xf165, 0xdf90, 0, 0, 0, 0), 62, 143}, + {RTE_IPV6(0x5566, 0x8962, 0x4167, 0x368e, 0x9000, 0, 0, 0), 68, 69}, + {RTE_IPV6(0x381f, 0x9f0d, 0xc98b, 0xa11f, 0x5989, 0x0400, 0, 0), 92, 48}, + {RTE_IPV6(0xe5dd, 0x36d8, 0xdf1b, 0xc401, 0, 0, 0, 0), 64, 115}, + {RTE_IPV6(0x0590, 0xb02b, 0xb4bb, 0x1431, 0x3b49, 0x6c22, 0x5320, 0xc000), 115, 130}, + {RTE_IPV6(0x18d9, 0xcdc1, 0x4a7b, 0xa06a, 0x674a, 0xc800, 0, 0), 86, 57}, + {RTE_IPV6(0xf700, 0, 0, 0, 0, 0, 0, 0), 8, 97}, + {RTE_IPV6(0x0c80, 0, 0, 0, 0, 0, 0, 0), 9, 146}, + {RTE_IPV6(0xa01c, 0xc977, 0x945d, 0xfb76, 0x1cb3, 0x7b34, 0x47e8, 0x3000), 117, 194}, + {RTE_IPV6(0x987e, 0x1136, 0x6538, 0x8201, 0xcd29, 0xcf5a, 0x977b, 0x8000), 114, 129}, + {RTE_IPV6(0x4da5, 0x1def, 0x5ff2, 0x2201, 0x0bcc, 0x87ef, 0x8000, 0), 97, 159}, + {RTE_IPV6(0xb76c, 0x9276, 0x4abe, 0x078d, 0x095c, 0x0202, 0x08da, 0x7800), 117, 242}, + {RTE_IPV6(0x2598, 0x1def, 0xf235, 0x388f, 0xdb16, 0x0e9e, 0x3100, 0), 104, 162}, + {RTE_IPV6(0xc635, 0xf166, 0xf0f4, 0x61cb, 0x3e80, 0xd5d6, 0xdc00, 0), 102, 140}, + {RTE_IPV6(0x9059, 0x302a, 0xf9e7, 0xbdb2, 0xe8c7, 0x1e3a, 0x3f39, 0), 113, 77}, + {RTE_IPV6(0x44d4, 0xb17b, 0x2ce0, 0x13ac, 0x5957, 0xc000, 0, 0), 82, 121}, + {RTE_IPV6(0xfc1d, 0xb3e0, 0x0479, 0xcd43, 0x9800, 0, 0, 0), 69, 102}, + {RTE_IPV6(0x1c6e, 0xa400, 0, 0, 0, 0, 0, 0), 23, 28}, + {RTE_IPV6(0x1858, 0xe701, 0x0447, 0x47f1, 0xfc0e, 0xc500, 0, 0), 89, 154}, + {RTE_IPV6(0x3f83, 0x2b4c, 0x3a8c, 0xa34a, 0x9e50, 0, 0, 0), 76, 39}, + {RTE_IPV6(0x381c, 0x9395, 0x625d, 0xd8d8, 0xcb9c, 0, 0, 0), 78, 163}, + {RTE_IPV6(0x86a9, 0x0667, 0xa1f4, 0x8675, 0x1000, 0, 0, 0), 68, 42}, + {RTE_IPV6(0x8ff7, 0x7dbe, 0x6a32, 0xcc62, 0xfa97, 0xa160, 0, 0), 92, 207}, + {RTE_IPV6(0xeb00, 0, 0, 0, 0, 0, 0, 0), 8, 25}, + {RTE_IPV6(0x2e48, 0, 0, 0, 0, 0, 0, 0), 18, 150}, + {RTE_IPV6(0xab23, 0x8075, 0x4a1d, 0xc743, 0x6db0, 0, 0, 0), 76, 103}, + {RTE_IPV6(0xdce9, 0xec70, 0x8788, 0xd72b, 0x2a00, 0, 0, 0), 71, 155}, + {RTE_IPV6(0xe40b, 0x9075, 0xcec0, 0x7619, 0x8d4e, 0x0469, 0, 0), 96, 142}, + {RTE_IPV6(0xc343, 0xc2e5, 0x0e35, 0x8107, 0x1ed0, 0x2664, 0xb63b, 0), 112, 2}, + {RTE_IPV6(0x194c, 0, 0, 0, 0, 0, 0, 0), 19, 59}, + {RTE_IPV6(0xa000, 0, 0, 0, 0, 0, 0, 0), 4, 112}, + {RTE_IPV6(0x1acb, 0xd998, 0x10bb, 0, 0, 0, 0, 0), 48, 166}, + {RTE_IPV6(0xfad5, 0x0eeb, 0x6eab, 0xae17, 0x6680, 0, 0, 0), 73, 62}, + {RTE_IPV6(0xafe6, 0xa00d, 0xbb11, 0, 0, 0, 0, 0), 50, 176}, + {RTE_IPV6(0x5c9b, 0x9c5d, 0xbf49, 0x1c52, 0xbb81, 0x3905, 0x1000, 0), 100, 6}, + {RTE_IPV6(0x2dcb, 0x0308, 0, 0, 0, 0, 0, 0), 29, 26}, + {RTE_IPV6(0x7800, 0, 0, 0, 0, 0, 0, 0), 5, 6}, + {RTE_IPV6(0xd800, 0, 0, 0, 0, 0, 0, 0), 5, 13}, + {RTE_IPV6(0x87d7, 0x0047, 0x1800, 0, 0, 0, 0, 0), 37, 41}, + {RTE_IPV6(0xdd95, 0x0128, 0x7000, 0, 0, 0, 0, 0), 36, 135}, + {RTE_IPV6(0x5f8f, 0xffc2, 0x029d, 0xbf71, 0x0ae5, 0xcc38, 0, 0), 93, 171}, + {RTE_IPV6(0xcad4, 0x6000, 0, 0, 0, 0, 0, 0), 19, 20}, + {RTE_IPV6(0x93cb, 0xee78, 0xc217, 0x193a, 0xd0b1, 0xa900, 0, 0), 89, 119}, + {RTE_IPV6(0x89aa, 0x71fc, 0xd7c2, 0xe092, 0xe957, 0x56c0, 0x1a2e, 0), 112, 49}, + {RTE_IPV6(0xe000, 0, 0, 0, 0, 0, 0, 0), 4, 141}, + {RTE_IPV6(0xfa5a, 0xf1ae, 0xa348, 0, 0, 0, 0, 0), 47, 132}, + {RTE_IPV6(0x42be, 0xca90, 0x7a56, 0x1667, 0x6ba4, 0x3936, 0xe480, 0), 105, 176}, + {RTE_IPV6(0x4c40, 0, 0, 0, 0, 0, 0, 0), 12, 186}, + {RTE_IPV6(0x78f6, 0x0134, 0xbba3, 0x4e69, 0xe000, 0, 0, 0), 67, 93}, + {RTE_IPV6(0x89f2, 0x8847, 0x620a, 0x3561, 0xa055, 0x847f, 0xb9de, 0), 111, 242}, + {RTE_IPV6(0xff85, 0xb500, 0, 0, 0, 0, 0, 0), 24, 163}, + {RTE_IPV6(0x80b1, 0x5c9b, 0x5bc0, 0, 0, 0, 0, 0), 42, 184}, + {RTE_IPV6(0x2d78, 0xbac0, 0xf0c7, 0xb25f, 0x2000, 0, 0, 0), 68, 188}, + {RTE_IPV6(0x9762, 0x67fe, 0x5a06, 0x0a6d, 0x0e9e, 0x451d, 0x8ced, 0x28e8), 126, 193}, + {RTE_IPV6(0x94a4, 0x5155, 0x4c0e, 0x5440, 0x59b0, 0, 0, 0), 78, 63}, + {RTE_IPV6(0x91bb, 0xa588, 0x581e, 0x6bbf, 0xcd78, 0x77d8, 0x9e7b, 0x4000), 115, 160}, + {RTE_IPV6(0x4e78, 0x1cf3, 0xd8b4, 0x5713, 0xfd10, 0x6e21, 0xe418, 0xe800), 117, 251}, + {RTE_IPV6(0x4a06, 0xa6a6, 0xb79d, 0x6054, 0x9700, 0, 0, 0), 72, 228}, + {RTE_IPV6(0x5960, 0x04dd, 0xd6fd, 0x3a31, 0x0900, 0, 0, 0), 72, 168}, + {RTE_IPV6(0x6109, 0x4000, 0, 0, 0, 0, 0, 0), 18, 194}, + {RTE_IPV6(0xd5d7, 0x2dc8, 0xaa78, 0, 0, 0, 0, 0), 47, 166}, + {RTE_IPV6(0x050e, 0x5c00, 0x1cf5, 0x82ca, 0x2028, 0xcf4d, 0xa6aa, 0xf640), 122, 210}, + {RTE_IPV6(0x4d2d, 0x2b47, 0xca00, 0x9d92, 0x3b5b, 0xe100, 0, 0), 89, 254}, + {RTE_IPV6(0x65ae, 0x5ea8, 0xa2ab, 0x470c, 0x10e0, 0, 0, 0), 75, 49}, + {RTE_IPV6(0x3a11, 0xbbc2, 0x5749, 0xd767, 0xb40c, 0x2842, 0, 0), 96, 95}, + {RTE_IPV6(0xa05b, 0x4451, 0x8000, 0, 0, 0, 0, 0), 33, 193}, + {RTE_IPV6(0x5e70, 0xf90d, 0xa7f5, 0x6540, 0, 0, 0, 0), 58, 155}, + {RTE_IPV6(0xecc2, 0, 0, 0, 0, 0, 0, 0), 15, 133}, + {RTE_IPV6(0xa8f3, 0x67dd, 0x7800, 0, 0, 0, 0, 0), 38, 10}, + {RTE_IPV6(0x56c2, 0xdabc, 0x8000, 0, 0, 0, 0, 0), 33, 31}, + {RTE_IPV6(0xe803, 0x8643, 0x3fc4, 0x560e, 0xaaf3, 0x4d86, 0xbb8c, 0x4812), 127, 98}, + {RTE_IPV6(0x37fd, 0x13c9, 0xc747, 0xe5da, 0x3640, 0x0ca2, 0, 0), 96, 22}, + {RTE_IPV6(0x8e22, 0x2000, 0, 0, 0, 0, 0, 0), 20, 214}, + {RTE_IPV6(0xd510, 0xd032, 0x6421, 0xc000, 0, 0, 0, 0), 50, 217}, + {RTE_IPV6(0x75ed, 0x84b9, 0xb8f6, 0x4f2a, 0x6762, 0xa2f3, 0x8000, 0), 98, 102}, + {RTE_IPV6(0x7819, 0xd6de, 0x3d9d, 0xcb66, 0x0392, 0xc000, 0, 0), 83, 169}, + {RTE_IPV6(0xde2e, 0xfe40, 0, 0, 0, 0, 0, 0), 27, 152}, + {RTE_IPV6(0xfe46, 0x9eab, 0x0bf5, 0xdf61, 0x4611, 0x1bc0, 0xba00, 0), 103, 214}, + {RTE_IPV6(0xc080, 0xe411, 0x4414, 0x2c1f, 0x3422, 0xd401, 0xe000, 0), 99, 178}, + {RTE_IPV6(0xede5, 0xcb08, 0x79b0, 0, 0, 0, 0, 0), 45, 164}, + {RTE_IPV6(0x0600, 0, 0, 0, 0, 0, 0, 0), 7, 15}, + {RTE_IPV6(0x47c5, 0xfb7a, 0x8ae8, 0x0cf1, 0x74f0, 0, 0, 0), 76, 94}, + {RTE_IPV6(0x12f1, 0x87d2, 0xe936, 0x79b9, 0x0400, 0, 0, 0), 70, 239}, + {RTE_IPV6(0x2032, 0xd53f, 0x49d9, 0xb415, 0xbb80, 0, 0, 0), 73, 82}, + {RTE_IPV6(0xcba6, 0xe949, 0x5cb6, 0xd400, 0, 0, 0, 0), 55, 54}, + {RTE_IPV6(0x38a2, 0x7e04, 0x12c3, 0xc040, 0xa49c, 0x77c4, 0x4000, 0), 98, 47}, + {RTE_IPV6(0x7857, 0x5188, 0xb4b3, 0x4494, 0xf326, 0x5000, 0, 0), 84, 214}, + {RTE_IPV6(0x40f4, 0xc132, 0x3000, 0, 0, 0, 0, 0), 37, 215}, + {RTE_IPV6(0x5ba8, 0xfd9e, 0x8353, 0x9fa3, 0x71a9, 0x7000, 0, 0), 84, 153}, + {RTE_IPV6(0x9f67, 0x6684, 0x6f2e, 0x124d, 0x240f, 0x8921, 0xb11f, 0xf3c0), 122, 245}, + {RTE_IPV6(0x7b00, 0, 0, 0, 0, 0, 0, 0), 8, 118}, + {RTE_IPV6(0x4351, 0xe2be, 0x074f, 0x47fa, 0x9bf5, 0x2c51, 0xd7d5, 0xabe0), 123, 128}, + {RTE_IPV6(0x6700, 0, 0, 0, 0, 0, 0, 0), 8, 7}, + {RTE_IPV6(0xf62c, 0xa8c8, 0xc6ee, 0x34c4, 0x7d73, 0, 0, 0), 80, 152}, + {RTE_IPV6(0xcd0e, 0xbafc, 0xefd5, 0x3b77, 0x6925, 0x8cd1, 0x04e7, 0), 114, 248}, + {RTE_IPV6(0x465b, 0xfe6a, 0x5e47, 0xaa13, 0x9ef2, 0xc000, 0, 0), 85, 143}, + {RTE_IPV6(0xfa56, 0xe9b8, 0, 0, 0, 0, 0, 0), 30, 159}, + {RTE_IPV6(0x7ade, 0x0200, 0, 0, 0, 0, 0, 0), 24, 11}, + {RTE_IPV6(0x1be0, 0xeb46, 0, 0, 0, 0, 0, 0), 31, 110}, + {RTE_IPV6(0xef64, 0xe003, 0x2e7f, 0x96fb, 0xcc78, 0xe440, 0, 0), 97, 181}, + {RTE_IPV6(0x9073, 0xb6ce, 0x920d, 0x156f, 0x2546, 0xb381, 0xad52, 0x5d80), 121, 4}, + {RTE_IPV6(0x49be, 0x39f3, 0x3133, 0x0fd1, 0, 0, 0, 0), 67, 101}, + {RTE_IPV6(0x1240, 0, 0, 0, 0, 0, 0, 0), 11, 38}, + {RTE_IPV6(0x1725, 0xecb1, 0xba07, 0xd187, 0x722c, 0, 0, 0), 78, 57}, + {RTE_IPV6(0xc830, 0, 0, 0, 0, 0, 0, 0), 17, 142}, + {RTE_IPV6(0xb5ff, 0x9900, 0, 0, 0, 0, 0, 0), 24, 184}, + {RTE_IPV6(0x87a8, 0x0680, 0, 0, 0, 0, 0, 0), 27, 91}, + {RTE_IPV6(0xc8e0, 0x21f5, 0x7800, 0, 0, 0, 0, 0), 41, 224}, + {RTE_IPV6(0x466f, 0x0a3e, 0xc8e0, 0x26cc, 0x0ea4, 0, 0, 0), 78, 114}, + {RTE_IPV6(0x9e85, 0xfc12, 0xf20c, 0x103c, 0x0534, 0xfbb3, 0x26eb, 0x0c00), 118, 184}, + {RTE_IPV6(0x0217, 0x7430, 0, 0, 0, 0, 0, 0), 28, 215}, + {RTE_IPV6(0x2119, 0xaa4a, 0xd786, 0x97b5, 0xafe8, 0x149b, 0xbdf2, 0x0d00), 120, 167}, + {RTE_IPV6(0xa0ba, 0xdab7, 0xa754, 0x3b98, 0x0d89, 0x5080, 0, 0), 89, 233}, + {RTE_IPV6(0x208d, 0xc400, 0, 0, 0, 0, 0, 0), 29, 101}, + {RTE_IPV6(0xcf18, 0xcae2, 0xbf88, 0x4e7c, 0xa000, 0, 0, 0), 67, 139}, + {RTE_IPV6(0xd2ad, 0xac1b, 0xc539, 0x7292, 0xa920, 0, 0, 0), 79, 32}, + {RTE_IPV6(0x5f71, 0x0c7b, 0, 0, 0, 0, 0, 0), 32, 57}, + {RTE_IPV6(0x816c, 0xba1c, 0x13e5, 0x6086, 0xc7fe, 0xc740, 0, 0), 91, 151}, + {RTE_IPV6(0x67e2, 0x267b, 0x23c7, 0, 0, 0, 0, 0), 49, 0}, + {RTE_IPV6(0x2975, 0x2b23, 0xd073, 0x4940, 0, 0, 0, 0), 63, 227}, + {RTE_IPV6(0x2adc, 0x3d22, 0xc7b7, 0x2a10, 0xdf87, 0x0087, 0xd596, 0x6400), 118, 124}, + {RTE_IPV6(0xa5e3, 0x60f3, 0x70ab, 0x756a, 0x3225, 0x523c, 0x5000, 0), 104, 228}, + {RTE_IPV6(0x9e3c, 0x6f60, 0, 0, 0, 0, 0, 0), 27, 64}, + {RTE_IPV6(0x7c6c, 0x5800, 0, 0, 0, 0, 0, 0), 25, 179}, + {RTE_IPV6(0xe844, 0x849f, 0x9c67, 0x5fbe, 0x4c00, 0, 0, 0), 70, 107}, + {RTE_IPV6(0x464d, 0xf0d1, 0x483f, 0x3f2d, 0x7d4f, 0x4d29, 0x0d00, 0), 104, 206}, + {RTE_IPV6(0x92fe, 0x0705, 0x44f0, 0x43ed, 0x7000, 0, 0, 0), 68, 95}, + {RTE_IPV6(0xa2df, 0x751b, 0x029c, 0x5eaa, 0x9d72, 0xa232, 0, 0), 96, 219}, + {RTE_IPV6(0xa13e, 0xbf44, 0xef49, 0x6425, 0xa8fe, 0x8bca, 0xfc41, 0x4a00), 119, 138}, + {RTE_IPV6(0xf87a, 0x7351, 0x0f9e, 0x8800, 0, 0, 0, 0), 53, 84}, + {RTE_IPV6(0x0880, 0, 0, 0, 0, 0, 0, 0), 11, 161}, + {RTE_IPV6(0x8e60, 0x6985, 0xfb39, 0x8000, 0, 0, 0, 0), 52, 25}, + {RTE_IPV6(0x8ac4, 0x8b83, 0xe95d, 0x41f2, 0x56a9, 0x0748, 0x5280, 0), 107, 113}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 2, 46}, + {RTE_IPV6(0xaf97, 0x4bee, 0x1a0c, 0x64ba, 0, 0, 0, 0), 63, 72}, + {RTE_IPV6(0x52cd, 0xd3b0, 0xaa4f, 0x3999, 0xa1da, 0x2030, 0, 0), 93, 230}, + {RTE_IPV6(0xe37b, 0xe84a, 0xecca, 0xd379, 0xc808, 0x3bbd, 0x51db, 0x9000), 117, 142}, + {RTE_IPV6(0xcdc4, 0x595a, 0x6780, 0, 0, 0, 0, 0), 41, 134}, + {RTE_IPV6(0x3f91, 0x177f, 0x66d8, 0x3124, 0xa8a4, 0x3b85, 0x1292, 0), 112, 100}, + {RTE_IPV6(0xd548, 0x9a10, 0xe6ec, 0xdacb, 0xdf33, 0x1ffb, 0x6740, 0), 109, 45}, + {RTE_IPV6(0x7e94, 0xe898, 0, 0, 0, 0, 0, 0), 30, 219}, + {RTE_IPV6(0xa048, 0, 0, 0, 0, 0, 0, 0), 16, 52}, + {RTE_IPV6(0x8926, 0x9214, 0x63bc, 0x537b, 0x9f9f, 0x4000, 0, 0), 83, 240}, + {RTE_IPV6(0x7be4, 0x242c, 0xf21d, 0x33e4, 0x8c3c, 0xed00, 0, 0), 90, 13}, + {RTE_IPV6(0xa3a9, 0x1959, 0xbe72, 0xa59e, 0x8cd2, 0xc000, 0, 0), 84, 191}, + {RTE_IPV6(0xe126, 0x4659, 0xdaec, 0x3c05, 0x45a3, 0xf832, 0xa340, 0), 106, 95}, + {RTE_IPV6(0x5b5e, 0x2430, 0, 0, 0, 0, 0, 0), 28, 65}, + {RTE_IPV6(0xd1ee, 0x6e00, 0x0298, 0, 0, 0, 0, 0), 45, 195}, + {RTE_IPV6(0x3911, 0xe0a4, 0x455f, 0x8aac, 0x6f37, 0xefa7, 0xa000, 0), 103, 21}, + {RTE_IPV6(0x7000, 0, 0, 0, 0, 0, 0, 0), 4, 114}, + {RTE_IPV6(0x6660, 0xdf1c, 0, 0, 0, 0, 0, 0), 31, 92}, + {RTE_IPV6(0x89cc, 0x964b, 0xc100, 0, 0, 0, 0, 0), 42, 237}, + {RTE_IPV6(0x8838, 0xfcf0, 0x5530, 0xf8e7, 0x1131, 0x2fee, 0x0fe9, 0x9fb8), 125, 172}, + {RTE_IPV6(0x391f, 0x847b, 0xeaff, 0x2552, 0xa7cc, 0x259e, 0x8000, 0), 98, 116}, + {RTE_IPV6(0x37c6, 0x8bdb, 0xa19c, 0x8c00, 0, 0, 0, 0), 55, 54}, + {RTE_IPV6(0x2c00, 0, 0, 0, 0, 0, 0, 0), 8, 203}, + {RTE_IPV6(0x3526, 0, 0, 0, 0, 0, 0, 0), 16, 74}, + {RTE_IPV6(0xe33e, 0x6bec, 0x769c, 0x3c22, 0x1fb3, 0x4cdd, 0, 0), 96, 220}, + {RTE_IPV6(0x6928, 0xf0d8, 0x5b3d, 0x1380, 0xe000, 0, 0, 0), 67, 219}, + {RTE_IPV6(0x6000, 0, 0, 0, 0, 0, 0, 0), 3, 179}, + {RTE_IPV6(0x768e, 0xfbf9, 0x8069, 0x7110, 0, 0, 0, 0), 61, 194}, + {RTE_IPV6(0x6546, 0xc4ee, 0, 0, 0, 0, 0, 0), 32, 187}, + {RTE_IPV6(0xf5ad, 0xa5b1, 0xc8a1, 0x4000, 0, 0, 0, 0), 50, 79}, + {RTE_IPV6(0x00c6, 0, 0, 0, 0, 0, 0, 0), 19, 87}, + {RTE_IPV6(0x5c00, 0, 0, 0, 0, 0, 0, 0), 8, 126}, + {RTE_IPV6(0x7d00, 0, 0, 0, 0, 0, 0, 0), 11, 106}, + {RTE_IPV6(0x383b, 0x2352, 0x6548, 0, 0, 0, 0, 0), 50, 96}, + {RTE_IPV6(0xb848, 0x4dfb, 0x08a6, 0, 0, 0, 0, 0), 47, 45}, + {RTE_IPV6(0x8f4a, 0x84cd, 0xdaf7, 0x1ea0, 0x91c7, 0x8a0c, 0x59dc, 0), 110, 8}, + {RTE_IPV6(0x1eb2, 0x6fe1, 0x494f, 0xad34, 0, 0, 0, 0), 62, 226}, + {RTE_IPV6(0xe030, 0x9ae7, 0x2000, 0, 0, 0, 0, 0), 36, 222}, + {RTE_IPV6(0x7b90, 0xaa8f, 0x55a9, 0x82f5, 0xd600, 0, 0, 0), 71, 218}, + {RTE_IPV6(0xa6e0, 0xd464, 0x9537, 0x23d2, 0xf66c, 0x29f5, 0x7fae, 0x8000), 116, 59}, + {RTE_IPV6(0x4b00, 0, 0, 0, 0, 0, 0, 0), 8, 80}, + {RTE_IPV6(0xc580, 0xbe57, 0x2f35, 0x5c40, 0, 0, 0, 0), 58, 177}, + {RTE_IPV6(0xf90a, 0x4cd9, 0xe114, 0x7ccd, 0x2c9f, 0xbe08, 0, 0), 98, 44}, + {RTE_IPV6(0xb4e2, 0x00a7, 0x89e8, 0xae78, 0x715f, 0x16b8, 0, 0), 93, 206}, + {RTE_IPV6(0x7b99, 0x66c0, 0, 0, 0, 0, 0, 0), 27, 64}, + {RTE_IPV6(0x0590, 0xce9e, 0xefbd, 0xab78, 0x452e, 0x80ed, 0, 0), 96, 236}, + {RTE_IPV6(0x9feb, 0x3c00, 0, 0, 0, 0, 0, 0), 22, 101}, + {RTE_IPV6(0x2ac2, 0x9600, 0, 0, 0, 0, 0, 0), 26, 49}, + {RTE_IPV6(0xcd60, 0, 0, 0, 0, 0, 0, 0), 11, 179}, + {RTE_IPV6(0x1341, 0x8d14, 0x7f4d, 0x46cd, 0x9773, 0x9d17, 0x7680, 0), 109, 112}, + {RTE_IPV6(0x600b, 0xd628, 0xf5fb, 0x3d40, 0x80f1, 0xb7b7, 0, 0), 96, 31}, + {RTE_IPV6(0x7804, 0xeb70, 0x2280, 0, 0, 0, 0, 0), 41, 111}, + {RTE_IPV6(0x6e7f, 0xcf4c, 0x6494, 0x82ce, 0xf902, 0x6800, 0, 0), 86, 65}, + {RTE_IPV6(0xe2be, 0xbff9, 0xad60, 0x7fc8, 0x3e14, 0, 0, 0), 78, 222}, + {RTE_IPV6(0x5958, 0xb60e, 0x4e7a, 0xd5c0, 0, 0, 0, 0), 58, 4}, + {RTE_IPV6(0xa75e, 0xa3e3, 0x1c6f, 0x7567, 0xe000, 0, 0, 0), 67, 67}, + {RTE_IPV6(0x39dc, 0x3574, 0xf3b8, 0xf286, 0x1046, 0x533d, 0xa180, 0), 109, 197}, + {RTE_IPV6(0x3feb, 0x1400, 0, 0, 0, 0, 0, 0), 22, 121}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 1, 167}, + {RTE_IPV6(0x0f9f, 0x2aa7, 0x4c00, 0, 0, 0, 0, 0), 38, 140}, + {RTE_IPV6(0xd8fc, 0x7128, 0xef2e, 0xac30, 0x67fa, 0x52b3, 0x8840, 0), 106, 193}, + {RTE_IPV6(0x9e93, 0x102c, 0x7c38, 0x2c30, 0x8a40, 0xa900, 0, 0), 90, 47}, + {RTE_IPV6(0xeeee, 0x6000, 0, 0, 0, 0, 0, 0), 21, 187}, + {RTE_IPV6(0x3f9f, 0xb1a2, 0x6ad4, 0xac00, 0, 0, 0, 0), 56, 102}, + {RTE_IPV6(0x3b28, 0xfcb9, 0xbbd8, 0, 0, 0, 0, 0), 46, 237}, + {RTE_IPV6(0x02da, 0x0b44, 0xadc4, 0x10df, 0x0212, 0x7ad7, 0x9a00, 0), 103, 237}, + {RTE_IPV6(0x0309, 0xce49, 0x6cc4, 0xb777, 0x8da2, 0x0ab4, 0x7320, 0), 107, 115}, + {RTE_IPV6(0x11e3, 0xd092, 0x3fc9, 0x49ef, 0x1d4f, 0x5000, 0, 0), 84, 217}, + {RTE_IPV6(0x73b4, 0xb0f1, 0x34d1, 0x0640, 0xbd4c, 0, 0, 0), 79, 21}, + {RTE_IPV6(0xbf58, 0x62f5, 0x5b2e, 0x89fe, 0xaa50, 0x0b37, 0xd41c, 0x8000), 113, 3}, + {RTE_IPV6(0x618d, 0xabaf, 0x16e9, 0, 0, 0, 0, 0), 48, 62}, + {RTE_IPV6(0x20cc, 0x66bf, 0xa4f2, 0, 0, 0, 0, 0), 47, 80}, + {RTE_IPV6(0x1d85, 0xd2fc, 0x7c42, 0xa000, 0, 0, 0, 0), 51, 184}, + {RTE_IPV6(0xcfb3, 0x3690, 0x7443, 0x1d40, 0x0dc7, 0, 0, 0), 80, 197}, + {RTE_IPV6(0x81d8, 0, 0, 0, 0, 0, 0, 0), 13, 63}, + {RTE_IPV6(0x3298, 0xf98f, 0xaeea, 0xf030, 0x9eff, 0x5069, 0, 0), 99, 62}, + {RTE_IPV6(0x69d0, 0x5fda, 0x2c0b, 0x5786, 0x6d12, 0x8a42, 0x1145, 0x8000), 114, 231}, + {RTE_IPV6(0x974f, 0x9edc, 0x7a65, 0xd2a4, 0x4000, 0, 0, 0), 67, 158}, + {RTE_IPV6(0xec61, 0x579b, 0xfe89, 0x7ad0, 0xa8c9, 0xc276, 0xe000, 0), 101, 118}, + {RTE_IPV6(0x0ee5, 0xc1f8, 0, 0, 0, 0, 0, 0), 30, 237}, + {RTE_IPV6(0x2e9a, 0x3250, 0x5c93, 0x9e56, 0x0170, 0, 0, 0), 79, 15}, + {RTE_IPV6(0x5883, 0x1554, 0x3e56, 0x076e, 0x8efb, 0xf26e, 0xc2af, 0xf700), 122, 84}, + {RTE_IPV6(0xe5d8, 0x6f5c, 0xad20, 0x3f46, 0x2454, 0x064a, 0x88a6, 0x2600), 119, 205}, + {RTE_IPV6(0x7993, 0xd8f5, 0x25bd, 0x923f, 0x914a, 0x8000, 0, 0), 82, 220}, + {RTE_IPV6(0x2c1a, 0xfe0b, 0xb500, 0, 0, 0, 0, 0), 40, 42}, + {RTE_IPV6(0xd172, 0x61f9, 0xe39f, 0xe000, 0, 0, 0, 0), 51, 144}, + {RTE_IPV6(0xb8f4, 0x2b75, 0x3800, 0, 0, 0, 0, 0), 37, 74}, + {RTE_IPV6(0x3c51, 0x8000, 0, 0, 0, 0, 0, 0), 19, 89}, + {RTE_IPV6(0x1228, 0x1571, 0xe25b, 0xc358, 0xa113, 0x8e00, 0, 0), 88, 77}, + {RTE_IPV6(0x3900, 0xd49e, 0x3833, 0x6cc6, 0x3b05, 0x89c4, 0, 0), 94, 2}, + {RTE_IPV6(0xa8fc, 0, 0, 0, 0, 0, 0, 0), 14, 75}, + {RTE_IPV6(0x40b5, 0xfe67, 0x01e6, 0x75c7, 0x8000, 0, 0, 0), 65, 18}, + {RTE_IPV6(0xd430, 0xd67f, 0x4eb0, 0, 0, 0, 0, 0), 46, 246}, + {RTE_IPV6(0x9bb9, 0xeca3, 0xcc31, 0x8178, 0xb72f, 0x0af3, 0x415c, 0xc000), 114, 10}, + {RTE_IPV6(0x5ec8, 0, 0, 0, 0, 0, 0, 0), 14, 207}, + {RTE_IPV6(0x13d2, 0x8871, 0x494f, 0x84c4, 0xe000, 0, 0, 0), 68, 41}, + {RTE_IPV6(0x18cb, 0xf6f2, 0xf1df, 0x96ed, 0xd5ca, 0x0b80, 0, 0), 89, 102}, + {RTE_IPV6(0x733b, 0xabdd, 0xacb5, 0xaa43, 0x73cd, 0x2c6b, 0xa243, 0x3800), 118, 118}, + {RTE_IPV6(0xfa80, 0, 0, 0, 0, 0, 0, 0), 10, 146}, + {RTE_IPV6(0xcbf0, 0x1c9e, 0xb60c, 0x56b6, 0x8e2f, 0x8f39, 0xef00, 0), 104, 122}, + {RTE_IPV6(0xc4da, 0x6d34, 0x0200, 0x4099, 0x22fa, 0xf0b9, 0x7500, 0), 107, 6}, + {RTE_IPV6(0x8983, 0xbf28, 0x48d1, 0x4a40, 0, 0, 0, 0), 58, 18}, + {RTE_IPV6(0xec7e, 0xa725, 0xb914, 0x22cf, 0x4c00, 0, 0, 0), 70, 83}, + {RTE_IPV6(0x81c0, 0xf589, 0xfb34, 0x4b44, 0x5170, 0x9285, 0x4000, 0), 99, 90}, + {RTE_IPV6(0x071f, 0x9413, 0, 0, 0, 0, 0, 0), 32, 140}, + {RTE_IPV6(0x7000, 0, 0, 0, 0, 0, 0, 0), 4, 242}, + {RTE_IPV6(0xa732, 0xcab3, 0x4a92, 0xc000, 0, 0, 0, 0), 50, 31}, + {RTE_IPV6(0x2cbc, 0xbafa, 0xe547, 0x1c76, 0x23fd, 0xf5bf, 0xc712, 0), 111, 9}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 1, 230}, + {RTE_IPV6(0x9ca3, 0xd7af, 0x4750, 0, 0, 0, 0, 0), 47, 50}, + {RTE_IPV6(0x4318, 0x97c6, 0xf280, 0, 0, 0, 0, 0), 41, 34}, + {RTE_IPV6(0x866b, 0x8000, 0, 0, 0, 0, 0, 0), 17, 11}, + {RTE_IPV6(0x2300, 0, 0, 0, 0, 0, 0, 0), 8, 71}, + {RTE_IPV6(0x2ec4, 0x5400, 0, 0, 0, 0, 0, 0), 22, 146}, + {RTE_IPV6(0x52ac, 0x081a, 0x9a22, 0x7dbc, 0x0595, 0x9f2c, 0x4ede, 0xecb0), 124, 249}, + {RTE_IPV6(0x4e9d, 0x4f46, 0xfc00, 0, 0, 0, 0, 0), 39, 143}, + {RTE_IPV6(0xe705, 0xd2f7, 0xc605, 0x9dbf, 0xcee1, 0x958e, 0xcf28, 0), 110, 17}, + {RTE_IPV6(0x26fe, 0xebc7, 0xbf3c, 0x2b9f, 0xbef3, 0xcbb9, 0xb8da, 0x8400), 119, 60}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 1, 162}, + {RTE_IPV6(0x5ff0, 0, 0, 0, 0, 0, 0, 0), 12, 5}, + {RTE_IPV6(0x1180, 0xf4b2, 0xa04e, 0x535c, 0, 0, 0, 0), 62, 139}, + {RTE_IPV6(0x1266, 0x3efb, 0x2c00, 0, 0, 0, 0, 0), 39, 8}, + {RTE_IPV6(0x1e4b, 0x6c28, 0xe7a6, 0xe9dc, 0xa3b0, 0xfcd2, 0x3c1e, 0x8000), 114, 246}, + {RTE_IPV6(0x1203, 0xcf40, 0x1980, 0, 0, 0, 0, 0), 42, 171}, + {RTE_IPV6(0x3453, 0xeb3d, 0xa4ec, 0x53ad, 0x8f69, 0x0e00, 0, 0), 88, 206}, + {RTE_IPV6(0xa6af, 0xbad0, 0, 0, 0, 0, 0, 0), 28, 163}, + {RTE_IPV6(0xdd9a, 0x5262, 0x297e, 0x5534, 0, 0, 0, 0), 62, 166}, + {RTE_IPV6(0x5e54, 0xb678, 0xcce8, 0x4000, 0, 0, 0, 0), 51, 128}, + {RTE_IPV6(0x1bae, 0xe3e4, 0, 0, 0, 0, 0, 0), 31, 59}, + {RTE_IPV6(0xda0c, 0x049c, 0, 0, 0, 0, 0, 0), 32, 179}, + {RTE_IPV6(0x0905, 0xbec3, 0x3cd8, 0x5096, 0x8075, 0x5680, 0x8070, 0x62d0), 124, 87}, + {RTE_IPV6(0x07e2, 0x6870, 0xd409, 0xac7c, 0xd179, 0xaae5, 0x2cb2, 0x8000), 114, 29}, + {RTE_IPV6(0x2f47, 0xae4c, 0x3453, 0x1712, 0x6a30, 0x3820, 0, 0), 91, 184}, + {RTE_IPV6(0x33a8, 0, 0, 0, 0, 0, 0, 0), 14, 45}, + {RTE_IPV6(0x1cb6, 0xa77c, 0x1c16, 0x5000, 0, 0, 0, 0), 55, 144}, + {RTE_IPV6(0x223d, 0x0e33, 0xfd11, 0x13aa, 0x31ce, 0xbccf, 0xf7a7, 0xc000), 114, 119}, + {RTE_IPV6(0x02eb, 0x120e, 0xc342, 0xed1e, 0, 0, 0, 0), 64, 113}, + {RTE_IPV6(0x33b6, 0x8e85, 0x7f60, 0x9f84, 0x63a1, 0x4000, 0, 0), 82, 50}, + {RTE_IPV6(0xaa91, 0xe67b, 0xd7bd, 0x4900, 0, 0, 0, 0), 56, 207}, + {RTE_IPV6(0x97a6, 0x2000, 0, 0, 0, 0, 0, 0), 21, 3}, + {RTE_IPV6(0x108d, 0xc481, 0x84cf, 0x0700, 0, 0, 0, 0), 58, 13}, + {RTE_IPV6(0xcd19, 0xb8bf, 0xc9ce, 0x6de0, 0, 0, 0, 0), 59, 42}, + {RTE_IPV6(0x3072, 0x2167, 0xf7ff, 0x4000, 0, 0, 0, 0), 50, 31}, + {RTE_IPV6(0xb39c, 0x7792, 0x7d15, 0x2a92, 0xedd5, 0xbf84, 0, 0), 94, 30}, + {RTE_IPV6(0xb381, 0xba90, 0, 0, 0, 0, 0, 0), 29, 94}, + {RTE_IPV6(0x11b3, 0xd9bc, 0x80d4, 0x0404, 0x9800, 0, 0, 0), 71, 190}, + {RTE_IPV6(0x843f, 0x4a59, 0xd140, 0x3fc0, 0, 0, 0, 0), 59, 238}, + {RTE_IPV6(0x1032, 0xf858, 0, 0, 0, 0, 0, 0), 30, 20}, + {RTE_IPV6(0xbd60, 0x3a35, 0xbfeb, 0x4000, 0, 0, 0, 0), 51, 84}, + {RTE_IPV6(0x6f62, 0x0641, 0x23c0, 0, 0, 0, 0, 0), 42, 108}, + {RTE_IPV6(0x76df, 0x53dc, 0x6e7a, 0x1770, 0xb99b, 0x4900, 0, 0), 89, 136}, + {RTE_IPV6(0xadbf, 0x96c5, 0xcc23, 0xa94f, 0x1fd6, 0xfbf0, 0, 0), 93, 196}, + {RTE_IPV6(0x1a4c, 0x8130, 0, 0, 0, 0, 0, 0), 28, 67}, + {RTE_IPV6(0xe760, 0, 0, 0, 0, 0, 0, 0), 12, 104}, + {RTE_IPV6(0x5dac, 0xdffc, 0xcb00, 0xce00, 0, 0, 0, 0), 55, 15}, + {RTE_IPV6(0x358e, 0xcb7c, 0x6833, 0xf10c, 0xa111, 0x65f5, 0x786e, 0xc0c7), 128, 237}, + {RTE_IPV6(0x094d, 0x78c5, 0xc10a, 0xedae, 0xe902, 0xa50b, 0xe52f, 0x9000), 116, 224}, + {RTE_IPV6(0x63a1, 0xbd58, 0x3000, 0, 0, 0, 0, 0), 36, 179}, + {RTE_IPV6(0x1208, 0x4c42, 0x02b9, 0xce84, 0xe000, 0, 0, 0), 67, 84}, + {RTE_IPV6(0xa935, 0x2000, 0, 0, 0, 0, 0, 0), 22, 65}, + {RTE_IPV6(0x8800, 0, 0, 0, 0, 0, 0, 0), 5, 178}, + {RTE_IPV6(0x83a2, 0x907c, 0x0c62, 0xf200, 0, 0, 0, 0), 55, 154}, + {RTE_IPV6(0x4b32, 0x81c0, 0, 0, 0, 0, 0, 0), 27, 106}, + {RTE_IPV6(0xd4b7, 0x28e1, 0x9888, 0xae5b, 0, 0, 0, 0), 67, 125}, + {RTE_IPV6(0x9e00, 0, 0, 0, 0, 0, 0, 0), 9, 118}, + {RTE_IPV6(0x0730, 0x8495, 0xa9d4, 0xc689, 0xca00, 0, 0, 0), 73, 52}, + {RTE_IPV6(0xadc3, 0x81a3, 0x8df9, 0x2840, 0, 0, 0, 0), 58, 173}, + {RTE_IPV6(0x6d4f, 0x4bdb, 0xcdb6, 0x16f5, 0xdf11, 0x924e, 0x6d77, 0x8000), 113, 8}, + {RTE_IPV6(0xaec3, 0x18b6, 0xd7c6, 0xd656, 0x2280, 0, 0, 0), 74, 211}, + {RTE_IPV6(0x1628, 0x336d, 0x465b, 0x9838, 0, 0, 0, 0), 61, 253}, + {RTE_IPV6(0xa973, 0xf67e, 0x4176, 0xdbc0, 0, 0, 0, 0), 59, 47}, + {RTE_IPV6(0x9a25, 0x467c, 0x6b7b, 0xe8f1, 0xa48e, 0x47e2, 0xb67e, 0), 112, 73}, + {RTE_IPV6(0x066c, 0, 0, 0, 0, 0, 0, 0), 19, 192}, + {RTE_IPV6(0xd8a7, 0x9e9e, 0xde13, 0x601c, 0x2806, 0x460c, 0x931b, 0x55f0), 128, 55}, + {RTE_IPV6(0x48de, 0x3445, 0x45ce, 0xa36a, 0xebce, 0x5080, 0, 0), 94, 147}, + {RTE_IPV6(0x9670, 0x6a38, 0x0ff3, 0x9a61, 0x866e, 0xa014, 0xb790, 0xea08), 125, 86}, + {RTE_IPV6(0x3aba, 0x6a3a, 0x7cab, 0x3555, 0x2164, 0x4000, 0, 0), 82, 16}, + {RTE_IPV6(0x07c3, 0x161f, 0x3ed9, 0xd12e, 0x5a31, 0xbd32, 0xa87e, 0), 111, 167}, + {RTE_IPV6(0x5c2c, 0x9fc6, 0xb95e, 0xe7b1, 0x4000, 0, 0, 0), 67, 148}, + {RTE_IPV6(0xa96c, 0xbea2, 0x1727, 0x8c00, 0, 0, 0, 0), 54, 66}, + {RTE_IPV6(0xa105, 0x030b, 0x9e9d, 0xa6d4, 0xf616, 0x8c65, 0x5c00, 0), 104, 70}, + {RTE_IPV6(0x47bf, 0, 0, 0, 0, 0, 0, 0), 16, 166}, + {RTE_IPV6(0x3088, 0xc291, 0x3960, 0, 0, 0, 0, 0), 44, 109}, + {RTE_IPV6(0x9000, 0, 0, 0, 0, 0, 0, 0), 5, 226}, + {RTE_IPV6(0xdfd1, 0x0a39, 0, 0, 0, 0, 0, 0), 32, 8}, + {RTE_IPV6(0x9a4f, 0xaa09, 0x2b8b, 0xf9b0, 0xba48, 0xd800, 0, 0), 85, 218}, + {RTE_IPV6(0x0108, 0x7bcd, 0xa786, 0x8066, 0x0a48, 0, 0, 0), 78, 54}, + {RTE_IPV6(0x1f69, 0x304d, 0x67bb, 0x6343, 0x6000, 0, 0, 0), 67, 48}, + {RTE_IPV6(0x0e49, 0x364c, 0xe823, 0x2000, 0, 0, 0, 0), 51, 244}, + {RTE_IPV6(0x0e6d, 0xfbbe, 0x24fd, 0x6378, 0x5e40, 0, 0, 0), 74, 50}, + {RTE_IPV6(0x7aaa, 0x0986, 0x7c5b, 0x1800, 0, 0, 0, 0), 54, 173}, + {RTE_IPV6(0xf60a, 0x5558, 0x52d9, 0x5f38, 0xd8cb, 0xa000, 0, 0), 84, 245}, + {RTE_IPV6(0x4d64, 0x72cf, 0x96b1, 0x4586, 0x4a83, 0x9375, 0xb140, 0xd280), 121, 54}, + {RTE_IPV6(0xab7b, 0x168a, 0x84e5, 0xfa51, 0xbae3, 0x921b, 0xaacd, 0x8000), 113, 86}, + {RTE_IPV6(0x8000, 0, 0, 0, 0, 0, 0, 0), 2, 115}, + {RTE_IPV6(0x0c23, 0x3200, 0, 0, 0, 0, 0, 0), 24, 144}, + {RTE_IPV6(0xff7c, 0xb3a5, 0xa9fa, 0x42ab, 0xdf7d, 0xf700, 0, 0), 89, 171}, + {RTE_IPV6(0xf4eb, 0xd30a, 0xfbff, 0xce06, 0xc60c, 0x3288, 0, 0), 93, 231}, + {RTE_IPV6(0xdd4d, 0xed29, 0x3221, 0x6718, 0x197f, 0xd000, 0, 0), 88, 34}, + {RTE_IPV6(0xd845, 0x2f35, 0x7518, 0x3800, 0, 0, 0, 0), 53, 225}, + {RTE_IPV6(0xb457, 0x19ec, 0x3800, 0, 0, 0, 0, 0), 38, 174}, + {RTE_IPV6(0x6e20, 0x1822, 0x7485, 0xf580, 0x7b5f, 0x7d7a, 0x6481, 0x8000), 113, 37}, + {RTE_IPV6(0x1b75, 0xb370, 0x8589, 0x6ec1, 0xf6c9, 0xdb41, 0x38ea, 0x6a80), 121, 39}, + {RTE_IPV6(0xba75, 0xfc00, 0, 0, 0, 0, 0, 0), 23, 59}, + {RTE_IPV6(0xf377, 0x3610, 0x8000, 0, 0, 0, 0, 0), 34, 96}, + {RTE_IPV6(0xa000, 0, 0, 0, 0, 0, 0, 0), 3, 147}, + {RTE_IPV6(0x4e30, 0x75c8, 0xf576, 0x73f0, 0xaa7d, 0x5467, 0x21a8, 0), 110, 56}, + {RTE_IPV6(0xc9fd, 0xb8fe, 0x8f51, 0x5f2a, 0xf393, 0x6091, 0x171a, 0), 111, 234}, + {RTE_IPV6(0x29d7, 0x5488, 0xea00, 0, 0, 0, 0, 0), 46, 199}, + {RTE_IPV6(0x5bf4, 0x89b8, 0xe75f, 0x870a, 0xb800, 0, 0, 0), 69, 191}, + {RTE_IPV6(0x711f, 0xb5f5, 0x1500, 0, 0, 0, 0, 0), 40, 235}, + {RTE_IPV6(0xb5d8, 0xc000, 0, 0, 0, 0, 0, 0), 20, 45}, + {RTE_IPV6(0x571a, 0x77e5, 0x61ff, 0x092b, 0x2000, 0, 0, 0), 67, 164}, + {RTE_IPV6(0xcd70, 0x43a3, 0xc494, 0x0569, 0x088a, 0x9003, 0xabd5, 0x9f80), 121, 130}, + {RTE_IPV6(0x881b, 0xc000, 0, 0, 0, 0, 0, 0), 18, 166}, + {RTE_IPV6(0x02af, 0x6f00, 0, 0, 0, 0, 0, 0), 24, 140}, + {RTE_IPV6(0xde83, 0x55da, 0x10e5, 0x2ce6, 0xf34c, 0xfa8b, 0x01cb, 0x6c00), 118, 47}, + {RTE_IPV6(0x65b4, 0x4d8e, 0xc249, 0xc4f6, 0x6b64, 0xc248, 0xcc7c, 0), 111, 148}, + {RTE_IPV6(0x6000, 0, 0, 0, 0, 0, 0, 0), 3, 103}, + {RTE_IPV6(0x2e3e, 0xbf82, 0x6e80, 0xeb3e, 0x4427, 0x3a98, 0xcfcc, 0x6000), 116, 94}, + {RTE_IPV6(0x6f0b, 0x6000, 0, 0, 0, 0, 0, 0), 19, 85}, + {RTE_IPV6(0x3a2b, 0x0e5d, 0x66d2, 0x75d0, 0xdeab, 0x8229, 0x1010, 0), 109, 250}, + {RTE_IPV6(0x8d34, 0, 0, 0, 0, 0, 0, 0), 16, 153}, + {RTE_IPV6(0xaa99, 0xa0aa, 0x90eb, 0x7a08, 0x6a22, 0x1820, 0x6639, 0x0ca8), 125, 182}, + {RTE_IPV6(0x2271, 0xa36b, 0x3db1, 0x27ac, 0xf202, 0x8200, 0, 0), 94, 23}, + {RTE_IPV6(0xdebf, 0xef6e, 0xa2bf, 0xc3b5, 0x5032, 0x55f0, 0x5820, 0), 108, 38}, + {RTE_IPV6(0xb352, 0xfd97, 0xd400, 0x48fd, 0xaf16, 0x224e, 0x3520, 0), 110, 121}, + {RTE_IPV6(0x0aa2, 0x142e, 0xa440, 0x5801, 0xcacc, 0x7c00, 0, 0), 87, 146}, + {RTE_IPV6(0xd263, 0, 0, 0, 0, 0, 0, 0), 16, 138}, + {RTE_IPV6(0xb7c8, 0x0102, 0x3306, 0x428e, 0x144d, 0x30f4, 0, 0), 94, 149}, + {RTE_IPV6(0x1d14, 0xe039, 0xcca1, 0x83fe, 0x3585, 0xa300, 0, 0), 88, 232}, + {RTE_IPV6(0x4b3a, 0xaa34, 0x9250, 0, 0, 0, 0, 0), 45, 255}, + {RTE_IPV6(0x5c15, 0x0171, 0xb958, 0xa000, 0, 0, 0, 0), 51, 148}, + {RTE_IPV6(0x67b4, 0xdebb, 0x8175, 0, 0, 0, 0, 0), 48, 117}, + {RTE_IPV6(0x204c, 0, 0, 0, 0, 0, 0, 0), 14, 237}, + {RTE_IPV6(0x073c, 0x6000, 0, 0, 0, 0, 0, 0), 19, 113}, + {RTE_IPV6(0xa77a, 0xcdb9, 0x15c7, 0x0600, 0, 0, 0, 0), 57, 162}, + {RTE_IPV6(0x154e, 0, 0, 0, 0, 0, 0, 0), 21, 225}, + {RTE_IPV6(0x5c9f, 0xa7a9, 0x88b0, 0x5fff, 0x5789, 0x7010, 0, 0), 92, 210}, + {RTE_IPV6(0x5478, 0xa000, 0, 0, 0, 0, 0, 0), 22, 34}, + {RTE_IPV6(0x7e05, 0x7eb0, 0, 0, 0, 0, 0, 0), 29, 224}, + {RTE_IPV6(0x043a, 0, 0, 0, 0, 0, 0, 0), 16, 143}, + {RTE_IPV6(0xef9a, 0xb5b6, 0xbdd3, 0xf435, 0x9000, 0, 0, 0), 68, 216}, + {RTE_IPV6(0xfebc, 0x8ba7, 0x872f, 0x93ef, 0xbb6a, 0xe49c, 0xeaea, 0x6600), 120, 239}, + {RTE_IPV6(0xe1a8, 0x8a5c, 0xc1ff, 0x2fe9, 0x0b9a, 0xcd56, 0xd158, 0), 111, 54}, + {RTE_IPV6(0xdf00, 0, 0, 0, 0, 0, 0, 0), 9, 35}, + {RTE_IPV6(0xebfc, 0x730a, 0x9768, 0xc1cf, 0x26e4, 0xe5f5, 0x2a0d, 0x6c00), 119, 230}, + {RTE_IPV6(0x0189, 0x3524, 0xd2b8, 0, 0, 0, 0, 0), 45, 234}, + {RTE_IPV6(0x95b6, 0x48c5, 0x5ce5, 0x090a, 0xdc80, 0x4813, 0x043a, 0xc000), 115, 70}, + {RTE_IPV6(0x6949, 0x396c, 0, 0, 0, 0, 0, 0), 32, 246}, + {RTE_IPV6(0xbd3d, 0xe618, 0xeb52, 0x3a66, 0x616f, 0x79fc, 0x9c5e, 0xbfa6), 127, 217}, + {RTE_IPV6(0xc16c, 0xe756, 0x8c0e, 0xc004, 0x8750, 0x81a6, 0x9e3d, 0xe614), 128, 201}, + {RTE_IPV6(0x6e4d, 0, 0, 0, 0, 0, 0, 0), 17, 49}, + {RTE_IPV6(0x0366, 0x24e7, 0x0ff2, 0x8f00, 0, 0, 0, 0), 57, 2}, + {RTE_IPV6(0x51bd, 0xdca8, 0xc000, 0, 0, 0, 0, 0), 38, 64}, + {RTE_IPV6(0xa84b, 0x85b4, 0x5ba5, 0x4de8, 0, 0, 0, 0), 62, 239}, + {RTE_IPV6(0x6ab3, 0xba6d, 0x51ea, 0xe9a7, 0x65a0, 0x5a66, 0xaeea, 0xd000), 116, 47}, + {RTE_IPV6(0x2e69, 0xea15, 0x17f7, 0xa921, 0x2f05, 0, 0, 0), 80, 43}, + {RTE_IPV6(0x9890, 0x648e, 0x8117, 0xe332, 0x4351, 0xf974, 0, 0), 94, 17}, + {RTE_IPV6(0x6d4a, 0x91c0, 0, 0, 0, 0, 0, 0), 26, 5}, + {RTE_IPV6(0x64f3, 0x16e6, 0x262c, 0x8056, 0x8439, 0, 0, 0), 81, 240}, + {RTE_IPV6(0x99fb, 0x7341, 0x68b3, 0, 0, 0, 0, 0), 50, 197}, + {RTE_IPV6(0x2b71, 0x3ce0, 0x2414, 0x2aa1, 0x18df, 0xc000, 0, 0), 84, 192}, + {RTE_IPV6(0x3d4d, 0x79b0, 0x8a98, 0, 0, 0, 0, 0), 47, 160}, + {RTE_IPV6(0x77c2, 0x9231, 0x3bf2, 0x19dc, 0x7a68, 0x5000, 0, 0), 84, 199}, + {RTE_IPV6(0xfea2, 0x9b2f, 0xbb03, 0x0172, 0x8ebf, 0x982c, 0x901a, 0xca00), 127, 217}, + {RTE_IPV6(0xb001, 0x722a, 0xbf91, 0x2b01, 0x8d12, 0x4000, 0, 0), 83, 75}, + {RTE_IPV6(0xaaf4, 0x4384, 0x91a3, 0x4cd5, 0x55ed, 0xf816, 0xcf40, 0), 106, 222}, + {RTE_IPV6(0x66be, 0x3a20, 0x4b0f, 0x59a3, 0x4007, 0xa800, 0, 0), 85, 39}, + {RTE_IPV6(0x7caa, 0x232f, 0x98e0, 0, 0, 0, 0, 0), 45, 9}, + {RTE_IPV6(0xc0dd, 0x14e4, 0, 0, 0, 0, 0, 0), 33, 217}, + {RTE_IPV6(0xd0b2, 0x8800, 0, 0, 0, 0, 0, 0), 25, 142}, + {RTE_IPV6(0xbc44, 0x4d1e, 0x4499, 0x66b4, 0, 0, 0, 0), 62, 18}, + {RTE_IPV6(0x72b2, 0x79bc, 0xcde9, 0x234d, 0x22c5, 0x9eae, 0x6500, 0), 104, 180}, + {RTE_IPV6(0xc362, 0x430c, 0x0d2b, 0x0600, 0, 0, 0, 0), 56, 205}, + {RTE_IPV6(0x92be, 0x2ade, 0x0e36, 0x1c80, 0, 0, 0, 0), 57, 251}, + {RTE_IPV6(0xb9ca, 0x9400, 0, 0, 0, 0, 0, 0), 22, 178}, + {RTE_IPV6(0x8a1e, 0x815f, 0xe0a1, 0x7880, 0, 0, 0, 0), 59, 198}, + {RTE_IPV6(0x45b5, 0x05e3, 0x4000, 0, 0, 0, 0, 0), 34, 84}, + {RTE_IPV6(0x5ab4, 0x00a4, 0xe34b, 0xae77, 0x8000, 0, 0, 0), 66, 128}, + {RTE_IPV6(0x143c, 0x3a77, 0xf5b1, 0xa2ba, 0x0d70, 0xd3ef, 0x8000, 0), 97, 75}, + {RTE_IPV6(0x9e7c, 0x9d19, 0xe68b, 0x33d4, 0x4c6d, 0xecd2, 0x3000, 0), 101, 192}, + {RTE_IPV6(0x7d6c, 0xf224, 0x5e0d, 0x246a, 0x5a33, 0x53d9, 0x8397, 0), 114, 60}, + {RTE_IPV6(0xdeda, 0xa29e, 0x0f35, 0xbfb2, 0, 0, 0, 0), 63, 169}, + {RTE_IPV6(0x68ca, 0x7f6d, 0x4910, 0x110c, 0, 0, 0, 0), 62, 10}, + {RTE_IPV6(0xacab, 0xf61a, 0xb022, 0x1698, 0xf638, 0xad78, 0x693c, 0x5c00), 118, 64}, + {RTE_IPV6(0xbe16, 0xabce, 0x6dba, 0xb380, 0xfdb6, 0x6cd4, 0xdca7, 0xabb4), 127, 182}, + {RTE_IPV6(0x77d0, 0, 0, 0, 0, 0, 0, 0), 13, 29}, + {RTE_IPV6(0xa000, 0, 0, 0, 0, 0, 0, 0), 3, 39}, + {RTE_IPV6(0xaa90, 0x4002, 0x6ba6, 0x8000, 0, 0, 0, 0), 51, 93}, + {RTE_IPV6(0xea09, 0x6014, 0x9c9d, 0x0122, 0x5800, 0, 0, 0), 75, 228}, + {RTE_IPV6(0x93ed, 0x1078, 0xc000, 0, 0, 0, 0, 0), 34, 236}, + {RTE_IPV6(0xb6bd, 0xa29e, 0xdf5a, 0xad00, 0, 0, 0, 0), 56, 190}, + {RTE_IPV6(0x7494, 0x8ef0, 0x0afd, 0x8000, 0, 0, 0, 0), 49, 217}, + {RTE_IPV6(0xd349, 0x8c45, 0xfc1b, 0x4b2e, 0x2506, 0x9320, 0, 0), 93, 74}, + {RTE_IPV6(0x943d, 0x7831, 0xdc41, 0x9600, 0, 0, 0, 0), 61, 180}, + {RTE_IPV6(0xac23, 0xcab4, 0x814b, 0xf000, 0, 0, 0, 0), 55, 91}, + {RTE_IPV6(0xd76d, 0x939d, 0x201c, 0x3400, 0, 0, 0, 0), 54, 230}, + {RTE_IPV6(0x971a, 0xb670, 0xcddc, 0xa000, 0, 0, 0, 0), 52, 175}, + {RTE_IPV6(0x495b, 0x5d3d, 0xc403, 0x421a, 0x9560, 0, 0, 0), 75, 171}, + {RTE_IPV6(0xcba3, 0x34f7, 0x1c77, 0x38df, 0x8a46, 0xae61, 0x4d3b, 0x2e00), 120, 202}, + {RTE_IPV6(0xfb32, 0xe4b2, 0xcac3, 0, 0, 0, 0, 0), 49, 113}, + {RTE_IPV6(0xd99f, 0xa4c7, 0x0eed, 0xaab8, 0x64e7, 0x5cde, 0, 0), 96, 187}, + {RTE_IPV6(0x10a1, 0x55c1, 0xca15, 0x039b, 0x3f74, 0x7ccb, 0x220d, 0xd700), 120, 38}, + {RTE_IPV6(0x6f34, 0x0a00, 0, 0, 0, 0, 0, 0), 26, 35}, + {RTE_IPV6(0x450c, 0x7497, 0x2000, 0, 0, 0, 0, 0), 38, 115}, + {RTE_IPV6(0xbb3c, 0x6128, 0x7065, 0x6000, 0, 0, 0, 0), 51, 18}, + {RTE_IPV6(0xe6c2, 0x88ff, 0xce00, 0, 0, 0, 0, 0), 39, 34}, + {RTE_IPV6(0xb3ef, 0xaa6b, 0x030d, 0xd443, 0xb145, 0x0800, 0, 0), 87, 75}, + {RTE_IPV6(0x0b3a, 0x8259, 0x8000, 0, 0, 0, 0, 0), 33, 232}, + {RTE_IPV6(0xd9b2, 0x2bcb, 0xea14, 0xeaba, 0x9d58, 0x92c0, 0, 0), 91, 154}, + {RTE_IPV6(0x06b4, 0xe000, 0, 0, 0, 0, 0, 0), 19, 195}, + {RTE_IPV6(0x9d9a, 0xda9e, 0x27e0, 0x67e6, 0xa400, 0, 0, 0), 70, 122}, + {RTE_IPV6(0xe10a, 0x8300, 0, 0, 0, 0, 0, 0), 24, 97}, + {RTE_IPV6(0x1000, 0, 0, 0, 0, 0, 0, 0), 5, 220}, + {RTE_IPV6(0xa600, 0, 0, 0, 0, 0, 0, 0), 7, 80}, + {RTE_IPV6(0x1dbe, 0x83d7, 0xe8f6, 0x29e2, 0x34c0, 0, 0, 0), 77, 133}, + {RTE_IPV6(0x8a4a, 0xa35d, 0x0c00, 0, 0, 0, 0, 0), 38, 93}, + {RTE_IPV6(0xe540, 0x6129, 0x1cf3, 0xf9b9, 0x6123, 0x311b, 0xaf18, 0), 110, 176}, + {RTE_IPV6(0x0649, 0x5ea0, 0xbad8, 0x5475, 0xe9a9, 0x92ea, 0, 0), 95, 68}, + {RTE_IPV6(0xa328, 0xf251, 0xe023, 0x48c2, 0xb04e, 0xe0ae, 0x0c00, 0), 103, 247}, + {RTE_IPV6(0x02cd, 0x2818, 0, 0, 0, 0, 0, 0), 29, 240}, + {RTE_IPV6(0xaee1, 0xf0a0, 0xd408, 0xf643, 0x2400, 0, 0, 0), 74, 83}, + {RTE_IPV6(0x0575, 0xb68d, 0xa6f9, 0xc400, 0, 0, 0, 0), 55, 132}, + {RTE_IPV6(0x2e98, 0xa900, 0, 0, 0, 0, 0, 0), 24, 217}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 3, 214}, + {RTE_IPV6(0xe9ca, 0x9fdb, 0, 0, 0, 0, 0, 0), 34, 193}, + {RTE_IPV6(0xac36, 0x9f05, 0x0ef5, 0x6ab6, 0x0200, 0, 0, 0), 71, 61}, + {RTE_IPV6(0xf1de, 0xfb72, 0xc800, 0, 0, 0, 0, 0), 39, 65}, + {RTE_IPV6(0x1ff3, 0xbe04, 0xcfc6, 0xf93b, 0xa77f, 0x5d40, 0, 0), 91, 108}, + {RTE_IPV6(0xc923, 0xded0, 0, 0, 0, 0, 0, 0), 28, 244}, + {RTE_IPV6(0xbb69, 0x0d72, 0xeec5, 0x9117, 0xa974, 0x5b1c, 0, 0), 95, 194}, + {RTE_IPV6(0xfbfb, 0x79a8, 0x98b2, 0x93bc, 0xe57b, 0x9af2, 0xbea5, 0xad30), 124, 82}, + {RTE_IPV6(0x42bb, 0xbfa4, 0x1fc4, 0x28ba, 0x9473, 0x8639, 0xdefe, 0x3000), 116, 45}, + {RTE_IPV6(0xd111, 0x6f29, 0x9a5e, 0, 0, 0, 0, 0), 48, 224}, + {RTE_IPV6(0x28f5, 0x8000, 0, 0, 0, 0, 0, 0), 22, 17}, + {RTE_IPV6(0x4879, 0x9753, 0xaa50, 0, 0, 0, 0, 0), 44, 133}, + {RTE_IPV6(0xabac, 0x65ee, 0xc994, 0x1751, 0x040b, 0x4000, 0, 0), 85, 125}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 3, 42}, + {RTE_IPV6(0x142e, 0x1b5d, 0xc3b8, 0x06a2, 0x6de1, 0x1698, 0, 0), 96, 140}, + {RTE_IPV6(0xf37a, 0x1e50, 0, 0, 0, 0, 0, 0), 28, 91}, + {RTE_IPV6(0x59fa, 0x5048, 0x9404, 0, 0, 0, 0, 0), 48, 92}, + {RTE_IPV6(0xbb98, 0, 0, 0, 0, 0, 0, 0), 13, 125}, + {RTE_IPV6(0xaca0, 0x8f72, 0x80ef, 0xae85, 0xb09a, 0x9f86, 0x0a00, 0), 106, 249}, + {RTE_IPV6(0xfeca, 0x7170, 0xad00, 0, 0, 0, 0, 0), 40, 202}, + {RTE_IPV6(0x5098, 0, 0, 0, 0, 0, 0, 0), 13, 107}, + {RTE_IPV6(0xded8, 0, 0, 0, 0, 0, 0, 0), 13, 124}, + {RTE_IPV6(0xdb8a, 0xfd0c, 0xbcc5, 0x3000, 0, 0, 0, 0), 53, 57}, + {RTE_IPV6(0x7c29, 0xad08, 0xcac0, 0x3dfe, 0xae30, 0xef70, 0, 0), 92, 181}, + {RTE_IPV6(0xc3ec, 0xf500, 0, 0, 0, 0, 0, 0), 24, 107}, + {RTE_IPV6(0x5352, 0x2af4, 0x88bf, 0xc551, 0x5b9a, 0xd855, 0x1d96, 0xc616), 128, 101}, + {RTE_IPV6(0x7000, 0, 0, 0, 0, 0, 0, 0), 4, 102}, + {RTE_IPV6(0x2c1e, 0xdbf8, 0xd658, 0xe184, 0, 0, 0, 0), 62, 136}, + {RTE_IPV6(0x29ab, 0xceb2, 0xc350, 0, 0, 0, 0, 0), 45, 114}, + {RTE_IPV6(0x9f0f, 0xb400, 0, 0, 0, 0, 0, 0), 22, 215}, + {RTE_IPV6(0x2abc, 0x25ae, 0x5628, 0x0454, 0xaed8, 0, 0, 0), 79, 249}, + {RTE_IPV6(0xb9e3, 0x55b1, 0xdb5f, 0xfae3, 0x459a, 0x7600, 0, 0), 88, 29}, + {RTE_IPV6(0x16b9, 0xee64, 0x1910, 0, 0, 0, 0, 0), 44, 71}, + {RTE_IPV6(0x7a95, 0x754d, 0x58fa, 0xbbcb, 0x8816, 0x552a, 0x69ea, 0x4f08), 127, 112}, + {RTE_IPV6(0x5d98, 0xe58c, 0, 0, 0, 0, 0, 0), 31, 72}, + {RTE_IPV6(0x8125, 0xa5a7, 0xf118, 0x2528, 0x0280, 0, 0, 0), 73, 155}, + {RTE_IPV6(0x1eca, 0xb103, 0xfdca, 0xa4f8, 0, 0, 0, 0), 61, 66}, + {RTE_IPV6(0xb019, 0xdc78, 0xc2e4, 0x0a2d, 0xe18e, 0xc060, 0, 0), 91, 77}, + {RTE_IPV6(0x6000, 0, 0, 0, 0, 0, 0, 0), 3, 109}, + {RTE_IPV6(0x5238, 0x0ccc, 0x3d2d, 0x93f0, 0xdd00, 0, 0, 0), 72, 37}, + {RTE_IPV6(0xf226, 0xf029, 0x8c4b, 0xfa25, 0xaf73, 0x61e0, 0, 0), 91, 56}, + {RTE_IPV6(0xfbc0, 0x175a, 0x8738, 0xfc38, 0x4fdb, 0x50a7, 0x1600, 0), 103, 5}, + {RTE_IPV6(0x3e80, 0x8b80, 0, 0, 0, 0, 0, 0), 25, 15}, + {RTE_IPV6(0xd601, 0x54e8, 0, 0, 0, 0, 0, 0), 29, 183}, + {RTE_IPV6(0xcf5a, 0xed89, 0xab8c, 0xe358, 0xfa1a, 0xc5a2, 0xa300, 0), 105, 171}, + {RTE_IPV6(0xc497, 0xebe8, 0x72f8, 0x01cf, 0xc1b8, 0xba47, 0x9d00, 0), 112, 202}, + {RTE_IPV6(0x9800, 0, 0, 0, 0, 0, 0, 0), 5, 136}, + {RTE_IPV6(0x09ae, 0xd3c8, 0x7800, 0, 0, 0, 0, 0), 37, 107}, + {RTE_IPV6(0x5996, 0x5f1c, 0xd10d, 0x7d9f, 0xfef4, 0x6e00, 0, 0), 87, 193}, + {RTE_IPV6(0x171c, 0xca0a, 0x5a9e, 0x4000, 0, 0, 0, 0), 52, 4}, + {RTE_IPV6(0x3019, 0xb409, 0x54ec, 0x0690, 0x1ec6, 0x2938, 0, 0), 96, 68}, + {RTE_IPV6(0xfc00, 0, 0, 0, 0, 0, 0, 0), 7, 40}, + {RTE_IPV6(0x14a5, 0x3982, 0xa400, 0, 0, 0, 0, 0), 39, 255}, + {RTE_IPV6(0xa738, 0x8000, 0, 0, 0, 0, 0, 0), 18, 108}, + {RTE_IPV6(0x5bcc, 0, 0, 0, 0, 0, 0, 0), 14, 219}, + {RTE_IPV6(0x182e, 0x0904, 0xaa96, 0x3882, 0x7f78, 0x7668, 0xa830, 0), 108, 12}, + {RTE_IPV6(0x9c3c, 0xf5f7, 0xbd00, 0, 0, 0, 0, 0), 40, 84}, + {RTE_IPV6(0x9468, 0xbbae, 0x811c, 0x7fa2, 0x5cde, 0x3412, 0, 0), 96, 33}, + {RTE_IPV6(0x26fd, 0xb699, 0xe9c2, 0x9f29, 0x5ec1, 0xfea0, 0, 0), 91, 199}, + {RTE_IPV6(0x9c4d, 0x69eb, 0x91d8, 0, 0, 0, 0, 0), 46, 52}, + {RTE_IPV6(0x64d3, 0xee93, 0x41de, 0x6349, 0xfc71, 0x2e71, 0x3488, 0), 113, 184}, + {RTE_IPV6(0x0d1e, 0, 0, 0, 0, 0, 0, 0), 18, 124}, + {RTE_IPV6(0x1df0, 0x8de6, 0x4eed, 0x1987, 0x8306, 0x414d, 0x4df8, 0), 109, 128}, + {RTE_IPV6(0x0fc0, 0x6d1f, 0x95dd, 0, 0, 0, 0, 0), 49, 255}, + {RTE_IPV6(0x50b9, 0xaa47, 0x293a, 0x9e6a, 0xfd07, 0x02b8, 0xad00, 0), 105, 146}, + {RTE_IPV6(0x10e5, 0xe000, 0, 0, 0, 0, 0, 0), 24, 172}, + {RTE_IPV6(0xa902, 0x9909, 0xa9cb, 0xf59a, 0xb800, 0, 0, 0), 70, 116}, + {RTE_IPV6(0x9087, 0xefa4, 0x8ebb, 0x406d, 0, 0, 0, 0), 66, 189}, + {RTE_IPV6(0xaa4e, 0xfce3, 0xf2c7, 0x82fb, 0xc800, 0, 0, 0), 70, 10}, + {RTE_IPV6(0xe812, 0x0f7e, 0xa67e, 0x3a19, 0xd13e, 0x4c4f, 0, 0), 98, 184}, + {RTE_IPV6(0xaa52, 0x4835, 0x8000, 0, 0, 0, 0, 0), 33, 98}, + {RTE_IPV6(0x9864, 0x257a, 0xf240, 0, 0, 0, 0, 0), 42, 37}, + {RTE_IPV6(0xaee7, 0xe621, 0x47e0, 0, 0, 0, 0, 0), 46, 174}, + {RTE_IPV6(0x4ae1, 0xfc99, 0xca08, 0xa227, 0x4000, 0, 0, 0), 67, 251}, + {RTE_IPV6(0xa7ba, 0x65bb, 0x7a00, 0, 0, 0, 0, 0), 42, 115}, + {RTE_IPV6(0x5307, 0x157a, 0xf343, 0xab92, 0x91a0, 0xa867, 0xdf40, 0), 107, 252}, + {RTE_IPV6(0x5384, 0xdb56, 0x5600, 0, 0, 0, 0, 0), 40, 176}, + {RTE_IPV6(0x1671, 0x4866, 0x4910, 0xec39, 0xc57a, 0x1f00, 0, 0), 91, 155}, + {RTE_IPV6(0xfa3b, 0x4023, 0x4870, 0x9f55, 0xc805, 0xc127, 0x98b9, 0x9410), 124, 36}, + {RTE_IPV6(0xdc15, 0x30a4, 0xe079, 0x1145, 0x0a76, 0x6a00, 0, 0), 88, 202}, + {RTE_IPV6(0xa000, 0, 0, 0, 0, 0, 0, 0), 5, 208}, + {RTE_IPV6(0xf740, 0x537d, 0xc3e1, 0x324c, 0x1268, 0, 0, 0), 77, 158}, + {RTE_IPV6(0x4e5b, 0x1fca, 0xbd19, 0x0d85, 0xdc00, 0, 0, 0), 72, 136}, + {RTE_IPV6(0x69c5, 0x1a50, 0, 0, 0, 0, 0, 0), 28, 191}, + {RTE_IPV6(0x0e1f, 0x9af2, 0xf1e7, 0x3797, 0xdf38, 0x86ff, 0x71ce, 0x4500), 120, 126}, + {RTE_IPV6(0xf7c1, 0x3ab0, 0x1047, 0x1f78, 0xd568, 0xe753, 0x1a76, 0x5b87), 128, 139}, + {RTE_IPV6(0x8820, 0xf000, 0, 0, 0, 0, 0, 0), 25, 216}, + {RTE_IPV6(0x64ee, 0x7028, 0, 0, 0, 0, 0, 0), 29, 93}, + {RTE_IPV6(0x5000, 0, 0, 0, 0, 0, 0, 0), 4, 196}, + {RTE_IPV6(0xe9e0, 0xfe39, 0x21cd, 0x8cd9, 0xb548, 0, 0, 0), 81, 119}, + {RTE_IPV6(0x6b4b, 0x419e, 0x808e, 0xbfbc, 0xbcf0, 0x94f3, 0x7400, 0), 104, 93}, + {RTE_IPV6(0x2746, 0x7872, 0x45ed, 0x5f30, 0xe9b0, 0x5b9a, 0, 0), 96, 183}, + {RTE_IPV6(0x0a3d, 0x2b65, 0x4066, 0xd000, 0, 0, 0, 0), 52, 207}, + {RTE_IPV6(0x9780, 0, 0, 0, 0, 0, 0, 0), 9, 102}, + {RTE_IPV6(0xd2f1, 0, 0, 0, 0, 0, 0, 0), 19, 36}, + {RTE_IPV6(0x34de, 0xf91f, 0x6c89, 0xc701, 0xf2ad, 0xb890, 0, 0), 93, 41}, + {RTE_IPV6(0x7b6f, 0x58c0, 0x4546, 0, 0, 0, 0, 0), 47, 70}, + {RTE_IPV6(0xb452, 0xbc7d, 0x8c08, 0xc44a, 0, 0, 0, 0), 63, 218}, + {RTE_IPV6(0x4d9e, 0x2265, 0xc466, 0x38dc, 0x2a8f, 0xb5bb, 0xf040, 0xa100), 120, 226}, + {RTE_IPV6(0x58dc, 0xde26, 0x176c, 0x0594, 0xb96e, 0x140e, 0x433d, 0), 114, 25}, + {RTE_IPV6(0x5a41, 0xdca5, 0xc585, 0x6e5c, 0xe413, 0x0211, 0, 0), 98, 6}, + {RTE_IPV6(0x2320, 0, 0, 0, 0, 0, 0, 0), 11, 26}, + {RTE_IPV6(0x677b, 0x31d1, 0xe4e5, 0x9000, 0, 0, 0, 0), 52, 149}, + {RTE_IPV6(0x32f4, 0x3abf, 0x5f9c, 0, 0, 0, 0, 0), 46, 127}, + {RTE_IPV6(0x8ca9, 0x4b4d, 0x4e56, 0x2810, 0, 0, 0, 0), 62, 144}, + {RTE_IPV6(0x63b0, 0xaf53, 0x7232, 0xd600, 0, 0, 0, 0), 56, 213}, + {RTE_IPV6(0x13d0, 0xd34c, 0x55b0, 0xf740, 0, 0, 0, 0), 58, 115}, + {RTE_IPV6(0x991c, 0xbc71, 0xd374, 0x07b2, 0x88cd, 0x6000, 0, 0), 83, 146}, + {RTE_IPV6(0xa0b4, 0xdc80, 0, 0, 0, 0, 0, 0), 26, 58}, + {RTE_IPV6(0xea06, 0x7013, 0x3d4a, 0, 0, 0, 0, 0), 47, 222}, + {RTE_IPV6(0x616e, 0x2275, 0x9594, 0, 0, 0, 0, 0), 50, 16}, + {RTE_IPV6(0x63ad, 0x7749, 0xfa1e, 0x901e, 0x8000, 0, 0, 0), 65, 169}, + {RTE_IPV6(0xa986, 0x6f59, 0x0900, 0, 0, 0, 0, 0), 40, 175}, + {RTE_IPV6(0x8650, 0xe32b, 0, 0, 0, 0, 0, 0), 32, 3}, + {RTE_IPV6(0xe7f3, 0x2350, 0x4bcf, 0x8089, 0x36aa, 0x47ee, 0, 0), 96, 2}, + {RTE_IPV6(0xbdbe, 0x7987, 0xa000, 0, 0, 0, 0, 0), 36, 193}, + {RTE_IPV6(0x8f9b, 0xd8c1, 0xefcd, 0xcc99, 0x8fec, 0x4517, 0xc8d3, 0), 118, 151}, + {RTE_IPV6(0x2001, 0x73f4, 0x21db, 0x6000, 0, 0, 0, 0), 51, 182}, + {RTE_IPV6(0xdc80, 0, 0, 0, 0, 0, 0, 0), 10, 148}, + {RTE_IPV6(0xce57, 0x87eb, 0x7480, 0, 0, 0, 0, 0), 42, 53}, + {RTE_IPV6(0x9880, 0, 0, 0, 0, 0, 0, 0), 11, 87}, + {RTE_IPV6(0x3a92, 0xbce9, 0xe6ec, 0xc0d6, 0xa880, 0, 0, 0), 73, 235}, + {RTE_IPV6(0x54dc, 0x5200, 0, 0, 0, 0, 0, 0), 23, 51}, + {RTE_IPV6(0x6a91, 0x8e2a, 0xbaba, 0x3a01, 0x3062, 0xa583, 0x309c, 0xc000), 116, 11}, + {RTE_IPV6(0x35db, 0x78f2, 0xa6d6, 0x5182, 0x4000, 0, 0, 0), 68, 28}, + {RTE_IPV6(0xf078, 0x4ca3, 0x20c5, 0xb5fb, 0x62dc, 0x1de2, 0, 0), 96, 73}, + {RTE_IPV6(0xeac5, 0x0ca0, 0, 0, 0, 0, 0, 0), 28, 216}, + {RTE_IPV6(0xbf5e, 0, 0, 0, 0, 0, 0, 0), 16, 99}, + {RTE_IPV6(0xc808, 0, 0, 0, 0, 0, 0, 0), 18, 35}, + {RTE_IPV6(0x1d81, 0x2f53, 0x134b, 0x9e01, 0x1c18, 0x1a93, 0x5277, 0x8c64), 127, 195}, + {RTE_IPV6(0xf1ae, 0x1a35, 0x9870, 0xc886, 0x54bb, 0xb1b0, 0x2a40, 0), 108, 176}, + {RTE_IPV6(0x4dab, 0x9130, 0xc354, 0xbe24, 0x7ac7, 0x1200, 0, 0), 87, 217}, + {RTE_IPV6(0x6968, 0x8735, 0xe276, 0xeea9, 0x09fd, 0x84a2, 0xd97b, 0xbf60), 126, 244}, + {RTE_IPV6(0xa000, 0, 0, 0, 0, 0, 0, 0), 3, 125}, + {RTE_IPV6(0x2955, 0x8f80, 0x5b89, 0xc000, 0, 0, 0, 0), 50, 219}, + {RTE_IPV6(0x746e, 0xc000, 0, 0, 0, 0, 0, 0), 18, 165}, + {RTE_IPV6(0x4bd5, 0x2c10, 0x2b9d, 0x22ab, 0x6275, 0x6d97, 0x053c, 0xe000), 117, 6}, + {RTE_IPV6(0xe517, 0x743d, 0x508b, 0xc800, 0, 0, 0, 0), 53, 47}, + {RTE_IPV6(0x537b, 0x4a00, 0, 0, 0, 0, 0, 0), 23, 73}, + {RTE_IPV6(0x97f3, 0x2dd9, 0xd89e, 0, 0, 0, 0, 0), 47, 98}, + {RTE_IPV6(0xabb8, 0x6ed3, 0xed72, 0x9000, 0, 0, 0, 0), 52, 21}, + {RTE_IPV6(0x07f6, 0xc777, 0, 0, 0, 0, 0, 0), 32, 142}, + {RTE_IPV6(0x672f, 0x4611, 0x1fe8, 0x2c4b, 0x919b, 0x64d8, 0, 0), 93, 34}, + {RTE_IPV6(0x41aa, 0xa964, 0xa793, 0x8efb, 0x1440, 0, 0, 0), 74, 41}, + {RTE_IPV6(0xeb06, 0xe5f8, 0x9789, 0x2400, 0, 0, 0, 0), 55, 80}, + {RTE_IPV6(0x9c27, 0x6000, 0, 0, 0, 0, 0, 0), 22, 11}, + {RTE_IPV6(0x5cbc, 0x52c0, 0x8ef9, 0xbe80, 0, 0, 0, 0), 58, 254}, + {RTE_IPV6(0xfdda, 0xb52e, 0x8690, 0, 0, 0, 0, 0), 45, 95}, + {RTE_IPV6(0xbd13, 0x1ff4, 0x5000, 0, 0, 0, 0, 0), 40, 8}, + {RTE_IPV6(0x1e74, 0, 0, 0, 0, 0, 0, 0), 14, 212}, + {RTE_IPV6(0x51e2, 0x0dad, 0x4f7b, 0xdf7c, 0x6c50, 0x53ee, 0, 0), 95, 217}, + {RTE_IPV6(0x7ed3, 0xce52, 0x93d7, 0x0600, 0, 0, 0, 0), 57, 15}, + {RTE_IPV6(0x2ae5, 0x87c5, 0xc4f3, 0x5eb5, 0x8522, 0x1000, 0, 0), 84, 66}, + {RTE_IPV6(0x44d2, 0x9e40, 0, 0, 0, 0, 0, 0), 28, 122}, + {RTE_IPV6(0xb73f, 0xdf5e, 0x5129, 0xcb14, 0xecd4, 0xdcc7, 0, 0), 97, 12}, + {RTE_IPV6(0x8392, 0x027d, 0xae2b, 0xe714, 0xc200, 0, 0, 0), 71, 171}, + {RTE_IPV6(0x1fb4, 0xf69e, 0x1cc0, 0xec27, 0xed37, 0x4ac3, 0xabc0, 0), 106, 42}, + {RTE_IPV6(0xb30a, 0x4650, 0, 0, 0, 0, 0, 0), 28, 194}, + {RTE_IPV6(0x9333, 0x55b9, 0xead1, 0xec57, 0x9311, 0x0744, 0x9420, 0), 107, 237}, + {RTE_IPV6(0xb1b2, 0x0628, 0x2ea6, 0x57c6, 0xd6ea, 0x17e0, 0, 0), 93, 151}, + {RTE_IPV6(0xc935, 0x2814, 0x3104, 0x268b, 0x85d9, 0xd686, 0x59c8, 0), 109, 238}, + {RTE_IPV6(0x041a, 0xb525, 0xce81, 0xe920, 0, 0, 0, 0), 59, 128}, + {RTE_IPV6(0x513a, 0xf800, 0, 0, 0, 0, 0, 0), 26, 227}, + {RTE_IPV6(0x12ee, 0xfaa1, 0x39f6, 0xd076, 0x0e4c, 0x4919, 0x4116, 0x9878), 127, 138}, + {RTE_IPV6(0x1f80, 0, 0, 0, 0, 0, 0, 0), 10, 60}, + {RTE_IPV6(0x73c3, 0x4000, 0, 0, 0, 0, 0, 0), 18, 148}, + {RTE_IPV6(0x7416, 0x4b21, 0x1081, 0x237c, 0x0a70, 0x1fd5, 0xb56c, 0xb12e), 128, 129}, + {RTE_IPV6(0x75d6, 0x1450, 0x5333, 0x8000, 0, 0, 0, 0), 49, 202}, + {RTE_IPV6(0x784b, 0x7c95, 0x787b, 0xf297, 0xb5a4, 0x8000, 0, 0), 81, 88}, + {RTE_IPV6(0x57ee, 0xa83e, 0x58a6, 0x3468, 0xdba9, 0x5d80, 0, 0), 90, 3}, + {RTE_IPV6(0xed2c, 0xe092, 0x3455, 0xf5c0, 0x4189, 0x255f, 0x9cb0, 0), 108, 243}, + {RTE_IPV6(0xd6f1, 0x333f, 0x493d, 0xc1a5, 0x176c, 0, 0, 0), 80, 95}, + {RTE_IPV6(0x57f2, 0x159d, 0x2dbc, 0x243e, 0x42f3, 0x4000, 0, 0), 87, 255}, + {RTE_IPV6(0x0061, 0xdc40, 0, 0, 0, 0, 0, 0), 26, 48}, + {RTE_IPV6(0xe3ce, 0xbd1f, 0xde08, 0xc000, 0, 0, 0, 0), 50, 38}, + {RTE_IPV6(0xae1b, 0x0010, 0x0d96, 0x217a, 0x9a3b, 0xec23, 0xf8b2, 0x4000), 115, 20}, + {RTE_IPV6(0x2714, 0x7d45, 0xfc40, 0, 0, 0, 0, 0), 43, 41}, + {RTE_IPV6(0x8de8, 0x010c, 0x7de5, 0xa80e, 0x7d74, 0xb400, 0, 0), 92, 133}, + {RTE_IPV6(0x5dee, 0x28e4, 0xfecb, 0xfb06, 0x3c52, 0xf3f2, 0, 0), 95, 189}, + {RTE_IPV6(0x2c73, 0xc811, 0x92df, 0x73fd, 0x7ece, 0x985a, 0, 0), 95, 151}, + {RTE_IPV6(0xd53a, 0xebff, 0x06a3, 0x3d0a, 0xe000, 0, 0, 0), 68, 100}, + {RTE_IPV6(0x1956, 0x8b74, 0xbe58, 0, 0, 0, 0, 0), 49, 118}, + {RTE_IPV6(0x7128, 0x418d, 0x4000, 0, 0, 0, 0, 0), 34, 164}, + {RTE_IPV6(0x95cd, 0xc8ba, 0x137e, 0xd7c7, 0x5e25, 0x6420, 0x8000, 0), 98, 71}, + {RTE_IPV6(0x2700, 0, 0, 0, 0, 0, 0, 0), 9, 251}, + {RTE_IPV6(0x5157, 0x50ad, 0xa3a6, 0x6800, 0, 0, 0, 0), 57, 51}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 3, 185}, + {RTE_IPV6(0x8c80, 0, 0, 0, 0, 0, 0, 0), 10, 144}, + {RTE_IPV6(0x062a, 0x01b2, 0xfa35, 0xbab2, 0x7279, 0xc000, 0, 0), 84, 51}, + {RTE_IPV6(0x0211, 0xea33, 0xa905, 0xdb95, 0xf5ed, 0x0400, 0, 0), 87, 32}, + {RTE_IPV6(0x70bb, 0xad11, 0xe5ab, 0xe1aa, 0x0800, 0, 0, 0), 70, 137}, + {RTE_IPV6(0xcb47, 0x8ced, 0x7160, 0x7b10, 0, 0, 0, 0), 60, 2}, + {RTE_IPV6(0x638a, 0xcf02, 0xf419, 0xd362, 0, 0, 0, 0), 63, 163}, + {RTE_IPV6(0x722a, 0x62f6, 0xfc30, 0xe976, 0x3fe2, 0x9de2, 0xc000, 0), 100, 162}, + {RTE_IPV6(0xa140, 0, 0, 0, 0, 0, 0, 0), 10, 192}, + {RTE_IPV6(0xe946, 0xf02d, 0xf000, 0, 0, 0, 0, 0), 36, 185}, + {RTE_IPV6(0x1c7b, 0x1fb0, 0xebe5, 0xa9c0, 0, 0, 0, 0), 59, 51}, + {RTE_IPV6(0x92c5, 0xf3eb, 0xf338, 0x8c00, 0, 0, 0, 0), 54, 93}, + {RTE_IPV6(0, 0, 0, 0, 0, 0, 0, 0), 2, 159}, + {RTE_IPV6(0x8d5c, 0x0d1b, 0x57f1, 0xab8f, 0xdc00, 0, 0, 0), 72, 189}, + {RTE_IPV6(0xa497, 0xc000, 0, 0, 0, 0, 0, 0), 21, 248}, + {RTE_IPV6(0x23bc, 0xf84f, 0x2797, 0xe8d7, 0xf8f5, 0xb990, 0x4e66, 0xad80), 123, 38}, + {RTE_IPV6(0xc1e8, 0xa63c, 0x3e50, 0xe6e1, 0xa5f0, 0, 0, 0), 76, 167}, + {RTE_IPV6(0x6de5, 0x769b, 0x2b9a, 0, 0, 0, 0, 0), 51, 28}, + {RTE_IPV6(0xa03e, 0x3fd4, 0xda8a, 0x9a6c, 0xa37f, 0xc5ed, 0xb72c, 0x8cc0), 125, 37}, + {RTE_IPV6(0xc425, 0x3392, 0x1a55, 0x351f, 0xd88d, 0x34da, 0x9920, 0), 107, 234}, + {RTE_IPV6(0xe480, 0, 0, 0, 0, 0, 0, 0), 9, 70}, + {RTE_IPV6(0x9af8, 0x14f2, 0x9af4, 0x3f11, 0x7934, 0x4654, 0x76d0, 0), 108, 50}, + {RTE_IPV6(0x2964, 0x1b54, 0x6a70, 0x6000, 0, 0, 0, 0), 51, 171}, + {RTE_IPV6(0x5163, 0xc58b, 0x1e96, 0xe6d8, 0x51be, 0x54a5, 0x1d40, 0x8000), 113, 236}, + {RTE_IPV6(0x7000, 0, 0, 0, 0, 0, 0, 0), 4, 3}, + {RTE_IPV6(0xa477, 0xfd7e, 0xa0f9, 0xb7bf, 0x776f, 0xe000, 0, 0), 86, 64}, + {RTE_IPV6(0x8a3a, 0xc6fe, 0x00c5, 0x3c5b, 0x84c7, 0xb5fb, 0x4ea0, 0), 108, 213}, + {RTE_IPV6(0xd159, 0xa8ec, 0x92a9, 0x6400, 0, 0, 0, 0), 54, 15}, + {RTE_IPV6(0x83d2, 0xd000, 0, 0, 0, 0, 0, 0), 20, 145}, + {RTE_IPV6(0xa5be, 0x9d07, 0x8305, 0x9300, 0, 0, 0, 0), 57, 27}, + {RTE_IPV6(0xb3e2, 0x39cc, 0xbb46, 0x3451, 0x77a2, 0xe52a, 0x2fb9, 0x09a2), 127, 75}, + {RTE_IPV6(0x62eb, 0x9b33, 0x6ba7, 0x7f89, 0xfef6, 0xa2ab, 0xb40d, 0xe900), 123, 76}, + {RTE_IPV6(0x6b4f, 0x4c5a, 0x5e97, 0x9b1f, 0x2173, 0x13cc, 0x6273, 0), 113, 247}, + {RTE_IPV6(0x8f2e, 0x1eaf, 0xe000, 0, 0, 0, 0, 0), 43, 121}, + {RTE_IPV6(0x9b55, 0xd9b4, 0, 0, 0, 0, 0, 0), 30, 214}, + {RTE_IPV6(0x3a3e, 0x9c00, 0, 0, 0, 0, 0, 0), 26, 221}, + {RTE_IPV6(0x5c9b, 0x3503, 0x276c, 0x9bc8, 0, 0, 0, 0), 63, 102}, + {RTE_IPV6(0x4000, 0, 0, 0, 0, 0, 0, 0), 2, 191}, + {RTE_IPV6(0x3f86, 0xfb3b, 0xc000, 0, 0, 0, 0, 0), 39, 197}, + {RTE_IPV6(0xea95, 0xdc6a, 0x0090, 0xd680, 0x2366, 0, 0, 0), 79, 106}, }; #define NUM_ROUTE_ENTRIES RTE_DIM(large_route_table) @@ -1067,19 +1068,19 @@ static inline void mask_ip6_prefix(uint8_t *ip_out, /* check if IPv6 address ip[] match the rule with IPv6 address ip_rule[] * and depth. if matched, return 0, else return -1. */ -static inline int check_lpm6_rule(uint8_t *ip, - const uint8_t *ip_rule, uint8_t depth) +static inline int check_lpm6_rule(const struct rte_ipv6_addr *ip, + const struct rte_ipv6_addr *ip_rule, uint8_t depth) { int k; uint8_t mask; for (k = 0; k < 16; k++) { if (depth >= 8) { - if (ip[k] != ip_rule[k]) + if (ip->a[k] != ip_rule->a[k]) return -1; } else if (depth > 0) { mask = (uint8_t)((unsigned int)(-1) << (8 - depth)); - if ((ip[k] & mask) == (ip_rule[k] & mask)) + if ((ip->a[k] & mask) == (ip_rule->a[k] & mask)) return 0; else return -1; @@ -1098,7 +1099,7 @@ static inline int check_lpm6_rule(uint8_t *ip, * if found that some item in rule[] is matched return 0, * else return -1; */ -static int get_next_hop(uint8_t *ip, uint8_t *next_hop, +static int get_next_hop(const struct rte_ipv6_addr *ip, uint8_t *next_hop, const struct rules_tbl_entry *rule, int rule_num) { int i; @@ -1107,7 +1108,7 @@ static int get_next_hop(uint8_t *ip, uint8_t *next_hop, for (i = 0; i < rule_num; i++) { if (rule[i].depth >= max_depth) { - result = check_lpm6_rule(ip, rule[i].ip, rule[i].depth); + result = check_lpm6_rule(ip, &rule[i].ip, rule[i].depth); if (result == 0) { *next_hop = rule[i].next_hop; max_depth = rule[i].depth; @@ -1131,12 +1132,12 @@ static void generate_large_ips_table(int gen_expected_next_hop) for (i = 0; i < NUM_IPS_ENTRIES; i++) { for (j = 0; j < 16; j++) - large_ips_table[i].ip[j] = rte_rand(); + large_ips_table[i].ip.a[j] = rte_rand(); } for (k = j = 0, i = 0; i < NUM_IPS_ENTRIES; i++) { - mask_ip6_prefix(large_ips_table[i].ip, - large_route_table[j].ip, large_route_table[j].depth); + mask_ip6_prefix(large_ips_table[i].ip.a, + large_route_table[j].ip.a, large_route_table[j].depth); k++; if (k == (NUM_IPS_ENTRIES / NUM_ROUTE_ENTRIES)) { j++; @@ -1150,7 +1151,7 @@ static void generate_large_ips_table(int gen_expected_next_hop) return; for (k = 0; k < NUM_IPS_ENTRIES; k++) - get_next_hop(large_ips_table[k].ip, + get_next_hop(&large_ips_table[k].ip, &(large_ips_table[k].next_hop), large_route_table, NUM_ROUTE_ENTRIES); diff --git a/app/test/test_lpm6_perf.c b/app/test/test_lpm6_perf.c index c847dcb18375..1860a99ed6f1 100644 --- a/app/test/test_lpm6_perf.c +++ b/app/test/test_lpm6_perf.c @@ -82,7 +82,7 @@ test_lpm6_perf(void) begin = rte_rdtsc(); for (i = 0; i < NUM_ROUTE_ENTRIES; i++) { - if (rte_lpm6_add(lpm, large_route_table[i].ip, + if (rte_lpm6_add(lpm, &large_route_table[i].ip, large_route_table[i].depth, next_hop_add) == 0) status++; } @@ -101,7 +101,7 @@ test_lpm6_perf(void) begin = rte_rdtsc(); for (j = 0; j < NUM_IPS_ENTRIES; j ++) { - if (rte_lpm6_lookup(lpm, large_ips_table[j].ip, + if (rte_lpm6_lookup(lpm, &large_ips_table[j].ip, &next_hop_return) != 0) count++; } @@ -117,11 +117,11 @@ test_lpm6_perf(void) total_time = 0; count = 0; - uint8_t ip_batch[NUM_IPS_ENTRIES][16]; + struct rte_ipv6_addr ip_batch[NUM_IPS_ENTRIES]; int32_t next_hops[NUM_IPS_ENTRIES]; for (i = 0; i < NUM_IPS_ENTRIES; i++) - memcpy(ip_batch[i], large_ips_table[i].ip, 16); + ip_batch[i] = large_ips_table[i].ip; for (i = 0; i < ITERATIONS; i ++) { @@ -144,7 +144,7 @@ test_lpm6_perf(void) for (i = 0; i < NUM_ROUTE_ENTRIES; i++) { /* rte_lpm_delete(lpm, ip, depth) */ - status += rte_lpm6_delete(lpm, large_route_table[i].ip, + status += rte_lpm6_delete(lpm, &large_route_table[i].ip, large_route_table[i].depth); } diff --git a/app/test/test_rib6.c b/app/test/test_rib6.c index 33596fddb4e5..6a3445297cb1 100644 --- a/app/test/test_rib6.c +++ b/app/test/test_rib6.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include "test.h" @@ -118,14 +118,14 @@ test_insert_invalid(void) struct rte_rib6 *rib = NULL; struct rte_rib6_node *node, *node1; struct rte_rib6_conf config; - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE] = {0}; + struct rte_ipv6_addr ip = {0}; uint8_t depth = 24; config.max_nodes = MAX_RULES; config.ext_sz = 0; /* rte_rib6_insert: rib == NULL */ - node = rte_rib6_insert(NULL, ip, depth); + node = rte_rib6_insert(NULL, &ip, depth); RTE_TEST_ASSERT(node == NULL, "Call succeeded with invalid parameters\n"); @@ -134,14 +134,14 @@ test_insert_invalid(void) RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n"); /* rte_rib6_insert: depth > MAX_DEPTH */ - node = rte_rib6_insert(rib, ip, MAX_DEPTH + 1); + node = rte_rib6_insert(rib, &ip, MAX_DEPTH + 1); RTE_TEST_ASSERT(node == NULL, "Call succeeded with invalid parameters\n"); /* insert the same ip/depth twice*/ - node = rte_rib6_insert(rib, ip, depth); + node = rte_rib6_insert(rib, &ip, depth); RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n"); - node1 = rte_rib6_insert(rib, ip, depth); + node1 = rte_rib6_insert(rib, &ip, depth); RTE_TEST_ASSERT(node1 == NULL, "Call succeeded with invalid parameters\n"); @@ -162,9 +162,8 @@ test_get_fn(void) struct rte_rib6_node *node; struct rte_rib6_conf config; void *ext; - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE] = {192, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t ip_ret[RTE_RIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ip = RTE_IPV6(0xc000, 0x0200, 0, 0, 0, 0, 0, 0); + struct rte_ipv6_addr ip_ret; uint64_t nh_set = 10; uint64_t nh_ret; uint8_t depth = 24; @@ -177,11 +176,11 @@ test_get_fn(void) rib = rte_rib6_create(__func__, SOCKET_ID_ANY, &config); RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n"); - node = rte_rib6_insert(rib, ip, depth); + node = rte_rib6_insert(rib, &ip, depth); RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n"); /* test rte_rib6_get_ip() with incorrect args */ - ret = rte_rib6_get_ip(NULL, ip_ret); + ret = rte_rib6_get_ip(NULL, &ip_ret); RTE_TEST_ASSERT(ret < 0, "Call succeeded with invalid parameters\n"); ret = rte_rib6_get_ip(node, NULL); @@ -215,8 +214,8 @@ test_get_fn(void) "Call succeeded with invalid parameters\n"); /* check the return values */ - ret = rte_rib6_get_ip(node, ip_ret); - RTE_TEST_ASSERT((ret == 0) && (rte_rib6_is_equal(ip_ret, ip)), + ret = rte_rib6_get_ip(node, &ip_ret); + RTE_TEST_ASSERT((ret == 0) && (rte_rib6_is_equal(ip_ret.a, ip.a)), "Failed to get proper node ip\n"); ret = rte_rib6_get_depth(node, &depth_ret); RTE_TEST_ASSERT((ret == 0) && (depth_ret == depth), @@ -243,8 +242,7 @@ test_basic(void) struct rte_rib6_node *node; struct rte_rib6_conf config; - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE] = {192, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; + struct rte_ipv6_addr ip = RTE_IPV6(0xc000, 0x0200, 0, 0, 0, 0, 0, 0); uint64_t next_hop_add = 10; uint64_t next_hop_return; uint8_t depth = 24; @@ -256,21 +254,21 @@ test_basic(void) rib = rte_rib6_create(__func__, SOCKET_ID_ANY, &config); RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n"); - node = rte_rib6_insert(rib, ip, depth); + node = rte_rib6_insert(rib, &ip, depth); RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n"); status = rte_rib6_set_nh(node, next_hop_add); RTE_TEST_ASSERT(status == 0, "Failed to set rte_rib_node field\n"); - node = rte_rib6_lookup(rib, ip); + node = rte_rib6_lookup(rib, &ip); RTE_TEST_ASSERT(node != NULL, "Failed to lookup\n"); status = rte_rib6_get_nh(node, &next_hop_return); RTE_TEST_ASSERT((status == 0) && (next_hop_add == next_hop_return), "Failed to get proper nexthop\n"); - node = rte_rib6_lookup_exact(rib, ip, depth); + node = rte_rib6_lookup_exact(rib, &ip, depth); RTE_TEST_ASSERT(node != NULL, "Failed to lookup\n"); @@ -278,12 +276,12 @@ test_basic(void) RTE_TEST_ASSERT((status == 0) && (next_hop_add == next_hop_return), "Failed to get proper nexthop\n"); - rte_rib6_remove(rib, ip, depth); + rte_rib6_remove(rib, &ip, depth); - node = rte_rib6_lookup(rib, ip); + node = rte_rib6_lookup(rib, &ip); RTE_TEST_ASSERT(node == NULL, "Lookup returns non existent rule\n"); - node = rte_rib6_lookup_exact(rib, ip, depth); + node = rte_rib6_lookup_exact(rib, &ip, depth); RTE_TEST_ASSERT(node == NULL, "Lookup returns non existent rule\n"); @@ -299,12 +297,9 @@ test_tree_traversal(void) struct rte_rib6_node *node; struct rte_rib6_conf config; - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE] = {10, 0, 2, 130, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t ip1[RTE_RIB6_IPV6_ADDR_SIZE] = {10, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t ip2[RTE_RIB6_IPV6_ADDR_SIZE] = {10, 0, 2, 130, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 80}; + struct rte_ipv6_addr ip = RTE_IPV6(0x0a00, 0x0282, 0, 0, 0, 0, 0, 0); + struct rte_ipv6_addr ip1 = RTE_IPV6(0x0a00, 0x0200, 0, 0, 0, 0, 0, 0); + struct rte_ipv6_addr ip2 = RTE_IPV6(0x0a00, 0x0282, 0, 0, 0, 0, 0, 0x0050); uint8_t depth = 126; config.max_nodes = MAX_RULES; @@ -313,13 +308,13 @@ test_tree_traversal(void) rib = rte_rib6_create(__func__, SOCKET_ID_ANY, &config); RTE_TEST_ASSERT(rib != NULL, "Failed to create RIB\n"); - node = rte_rib6_insert(rib, ip1, depth); + node = rte_rib6_insert(rib, &ip1, depth); RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n"); - node = rte_rib6_insert(rib, ip2, depth); + node = rte_rib6_insert(rib, &ip2, depth); RTE_TEST_ASSERT(node != NULL, "Failed to insert rule\n"); node = NULL; - node = rte_rib6_get_nxt(rib, ip, 32, node, RTE_RIB6_GET_NXT_ALL); + node = rte_rib6_get_nxt(rib, &ip, 32, node, RTE_RIB6_GET_NXT_ALL); RTE_TEST_ASSERT(node != NULL, "Failed to get rib_node\n"); rte_rib6_free(rib); diff --git a/app/test/test_table_combined.c b/app/test/test_table_combined.c index 1c2efe649ded..04503baa5180 100644 --- a/app/test/test_table_combined.c +++ b/app/test/test_table_combined.c @@ -362,7 +362,7 @@ test_table_lpm_ipv6_combined(void) struct rte_table_lpm_ipv6_key lpm_ipv6_key = { .depth = 16, }; - memset(lpm_ipv6_key.ip, 0xad, 16); + memset(&lpm_ipv6_key.ip, 0xad, 16); struct table_packets table_packets; diff --git a/app/test/test_table_tables.c b/app/test/test_table_tables.c index 26908e6112fc..920aa555cbd2 100644 --- a/app/test/test_table_tables.c +++ b/app/test/test_table_tables.c @@ -525,10 +525,10 @@ test_table_lpm_ipv6(void) /* Add */ struct rte_table_lpm_ipv6_key lpm_key; - lpm_key.ip[0] = 0xad; - lpm_key.ip[1] = 0xad; - lpm_key.ip[2] = 0xad; - lpm_key.ip[3] = 0xad; + lpm_key.ip.a[0] = 0xad; + lpm_key.ip.a[1] = 0xad; + lpm_key.ip.a[2] = 0xad; + lpm_key.ip.a[3] = 0xad; table = rte_table_lpm_ipv6_ops.f_create(&lpm_params, 0, entry_size); if (table == NULL) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 439867289cf3..ee958c689b3a 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -70,36 +70,16 @@ Deprecation Notices - ``struct rte_flow_item_icmp6_nd_na`` - ``struct rte_flow_action_set_ipv6`` - ``struct rte_flow_tunnel`` - fib - - ``rte_fib6_add()`` - - ``rte_fib6_delete()`` - - ``rte_fib6_lookup_bulk()`` gro - ``struct tcp6_flow_key`` hash - ``struct rte_ipv6_tuple`` ipsec - ``struct rte_ipsec_sadv6_key`` - lpm - - ``rte_lpm6_add()`` - - ``rte_lpm6_is_rule_present()`` - - ``rte_lpm6_delete()`` - - ``rte_lpm6_delete_bulk_func()`` - - ``rte_lpm6_lookup()`` - - ``rte_lpm6_lookup_bulk_func()`` node - ``rte_node_ip6_route_add()`` pipeline - ``struct rte_table_action_ipv6_header`` - rib - - ``rte_rib6_lookup()`` - - ``rte_rib6_lookup_exact()`` - - ``rte_rib6_get_nxt()`` - - ``rte_rib6_insert()`` - - ``rte_rib6_remove()`` - - ``rte_rib6_get_ip()`` - table - - ``struct rte_table_lpm_ipv6_key`` * net, ethdev: The flow item ``RTE_FLOW_ITEM_TYPE_VXLAN_GPE`` is replaced with ``RTE_FLOW_ITEM_TYPE_VXLAN``. diff --git a/doc/guides/rel_notes/release_24_11.rst b/doc/guides/rel_notes/release_24_11.rst index e769d275f784..dc8926a6078e 100644 --- a/doc/guides/rel_notes/release_24_11.rst +++ b/doc/guides/rel_notes/release_24_11.rst @@ -144,6 +144,7 @@ API Changes * net: IPv6 related symbols were moved from ```` to the new ```` header. * net: The ``rte_ipv6_hdr`` structure was modified to use ``struct rte_ipv6_addr`` instead of ``uint8_t[16]`` fields. +* rib6,fib6,lpm6: All public API functions were modified to use ``struct rte_ipv6_addr`` instead of ``uint8_t[16]`` parameters. ABI Changes ----------- diff --git a/examples/ip_fragmentation/main.c b/examples/ip_fragmentation/main.c index 4c0fa5054a2e..1f841028442f 100644 --- a/examples/ip_fragmentation/main.c +++ b/examples/ip_fragmentation/main.c @@ -184,21 +184,20 @@ struct l3fwd_ipv4_route l3fwd_ipv4_route_array[] = { */ struct l3fwd_ipv6_route { - uint8_t ip[IPV6_ADDR_LEN]; + struct rte_ipv6_addr ip; uint8_t depth; uint8_t if_out; }; /* Default l3fwd_ipv6_route_array table. 8< */ static struct l3fwd_ipv6_route l3fwd_ipv6_route_array[] = { - {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 0}, - {{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 1}, - {{3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 2}, - {{4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 3}, - {{5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 4}, - {{6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 5}, - {{7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 6}, - {{8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 7}, + {RTE_IPV6(0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 0}, + {RTE_IPV6(0x0201, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 1}, + {RTE_IPV6(0x0301, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 2}, + {RTE_IPV6(0x0401, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 3}, + {RTE_IPV6(0x0501, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 4}, + {RTE_IPV6(0x0601, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 5}, + {RTE_IPV6(0x0701, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 6} }; /* >8 End of default l3fwd_ipv6_route_array table. */ @@ -311,7 +310,7 @@ l3fwd_simple_forward(struct rte_mbuf *m, struct lcore_queue_conf *qconf, ip_hdr = rte_pktmbuf_mtod(m, struct rte_ipv6_hdr *); /* Find destination port */ - if (rte_lpm6_lookup(rxq->lpm6, ip_hdr->dst_addr.a, + if (rte_lpm6_lookup(rxq->lpm6, &ip_hdr->dst_addr, &next_hop) == 0 && (enabled_port_mask & 1 << next_hop) != 0) { port_out = next_hop; @@ -751,7 +750,7 @@ init_routing_table(void) /* populate the LPM6 table */ for (i = 0; i < RTE_DIM(l3fwd_ipv6_route_array); i++) { ret = rte_lpm6_add(lpm6, - l3fwd_ipv6_route_array[i].ip, + &l3fwd_ipv6_route_array[i].ip, l3fwd_ipv6_route_array[i].depth, l3fwd_ipv6_route_array[i].if_out); @@ -764,7 +763,7 @@ init_routing_table(void) RTE_LOG(INFO, IP_FRAG, "Socket %i: adding route " IPv6_BYTES_FMT "/%d (port %d)\n", socket, - IPv6_BYTES(l3fwd_ipv6_route_array[i].ip), + IPv6_BYTES(l3fwd_ipv6_route_array[i].ip.a), l3fwd_ipv6_route_array[i].depth, l3fwd_ipv6_route_array[i].if_out); } diff --git a/examples/ip_pipeline/thread.c b/examples/ip_pipeline/thread.c index 8a912dc1b392..9d8082b73080 100644 --- a/examples/ip_pipeline/thread.c +++ b/examples/ip_pipeline/thread.c @@ -2563,7 +2563,7 @@ match_convert(struct table_rule_match *mh, ml->lpm_ipv4.ip = mh->match.lpm.ipv4; ml->lpm_ipv4.depth = mh->match.lpm.depth; } else { - memcpy(ml->lpm_ipv6.ip, + memcpy(&ml->lpm_ipv6.ip, mh->match.lpm.ipv6, sizeof(ml->lpm_ipv6.ip)); ml->lpm_ipv6.depth = mh->match.lpm.depth; } diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c index 4da692eb23e6..17ae76d4badb 100644 --- a/examples/ip_reassembly/main.c +++ b/examples/ip_reassembly/main.c @@ -205,21 +205,20 @@ struct l3fwd_ipv4_route l3fwd_ipv4_route_array[] = { */ struct l3fwd_ipv6_route { - uint8_t ip[IPV6_ADDR_LEN]; + struct rte_ipv6_addr ip; uint8_t depth; uint8_t if_out; }; /* Default l3fwd_ipv6_route_array table. 8< */ static struct l3fwd_ipv6_route l3fwd_ipv6_route_array[] = { - {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 0}, - {{2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 1}, - {{3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 2}, - {{4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 3}, - {{5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 4}, - {{6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 5}, - {{7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 6}, - {{8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 48, 7}, + {RTE_IPV6(0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 0}, + {RTE_IPV6(0x0201, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 1}, + {RTE_IPV6(0x0301, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 2}, + {RTE_IPV6(0x0401, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 3}, + {RTE_IPV6(0x0501, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 4}, + {RTE_IPV6(0x0601, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 5}, + {RTE_IPV6(0x0701, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101), 48, 6} }; /* >8 End of default l3fwd_ipv6_route_array table. */ @@ -400,7 +399,7 @@ reassemble(struct rte_mbuf *m, uint16_t portid, uint32_t queue, } /* Find destination port */ - if (rte_lpm6_lookup(rxq->lpm6, ip_hdr->dst_addr.a, + if (rte_lpm6_lookup(rxq->lpm6, &ip_hdr->dst_addr, &next_hop) == 0 && (enabled_port_mask & 1 << next_hop) != 0) { dst_port = next_hop; @@ -797,7 +796,7 @@ init_routing_table(void) /* populate the LPM6 table */ for (i = 0; i < RTE_DIM(l3fwd_ipv6_route_array); i++) { ret = rte_lpm6_add(lpm6, - l3fwd_ipv6_route_array[i].ip, + &l3fwd_ipv6_route_array[i].ip, l3fwd_ipv6_route_array[i].depth, l3fwd_ipv6_route_array[i].if_out); @@ -810,7 +809,7 @@ init_routing_table(void) RTE_LOG(INFO, IP_RSMBL, "Socket %i: adding route " IPv6_BYTES_FMT "/%d (port %d)\n", socket, - IPv6_BYTES(l3fwd_ipv6_route_array[i].ip), + IPv6_BYTES(l3fwd_ipv6_route_array[i].ip.a), l3fwd_ipv6_route_array[i].depth, l3fwd_ipv6_route_array[i].if_out); } diff --git a/examples/ipsec-secgw/ipsec_lpm_neon.h b/examples/ipsec-secgw/ipsec_lpm_neon.h index 9573f53ae957..752401d9f27f 100644 --- a/examples/ipsec-secgw/ipsec_lpm_neon.h +++ b/examples/ipsec-secgw/ipsec_lpm_neon.h @@ -5,6 +5,8 @@ #ifndef IPSEC_LPM_NEON_H #define IPSEC_LPM_NEON_H +#include + #include #include "ipsec_neon.h" @@ -114,7 +116,7 @@ process_single_pkt(struct rt_ctx *rt_ctx, struct rte_mbuf *pkt, static inline void route6_pkts_neon(struct rt_ctx *rt_ctx, struct rte_mbuf **pkts, int nb_rx) { - uint8_t dst_ip6[MAX_PKT_BURST][16]; + struct rte_ipv6_addr dst_ip6[MAX_PKT_BURST]; uint16_t dst_port[MAX_PKT_BURST]; struct rte_ether_hdr *eth_hdr; struct rte_ipv6_hdr *ipv6_hdr; @@ -142,8 +144,7 @@ route6_pkts_neon(struct rt_ctx *rt_ctx, struct rte_mbuf **pkts, int nb_rx) * required to get the hop */ ipv6_hdr = (struct rte_ipv6_hdr *)(eth_hdr + 1); - memcpy(&dst_ip6[lpm_pkts][0], - ipv6_hdr->dst_addr, 16); + dst_ip6[lpm_pkts] = ipv6_hdr->dst_addr; lpm_pkts++; } } diff --git a/examples/ipsec-secgw/ipsec_worker.c b/examples/ipsec-secgw/ipsec_worker.c index c9c43ebd2b99..c205e70ad0be 100644 --- a/examples/ipsec-secgw/ipsec_worker.c +++ b/examples/ipsec-secgw/ipsec_worker.c @@ -298,17 +298,12 @@ route4_pkt(struct rte_mbuf *pkt, struct rt_ctx *rt_ctx) static inline uint16_t route6_pkt(struct rte_mbuf *pkt, struct rt_ctx *rt_ctx) { - uint8_t dst_ip[16]; - uint8_t *ip6_dst; - uint16_t offset; + struct rte_ipv6_hdr *ip; uint32_t hop; int ret; - offset = RTE_ETHER_HDR_LEN + offsetof(struct ip6_hdr, ip6_dst); - ip6_dst = rte_pktmbuf_mtod_offset(pkt, uint8_t *, offset); - memcpy(&dst_ip[0], ip6_dst, 16); - - ret = rte_lpm6_lookup((struct rte_lpm6 *)rt_ctx, dst_ip, &hop); + ip = rte_pktmbuf_mtod_offset(pkt, struct rte_ipv6_hdr *, RTE_ETHER_HDR_LEN); + ret = rte_lpm6_lookup((struct rte_lpm6 *)rt_ctx, &ip->dst_addr, &hop); if (ret == 0) { /* We have a hit */ diff --git a/examples/ipsec-secgw/ipsec_worker.h b/examples/ipsec-secgw/ipsec_worker.h index 8f6a1c06aa7f..8f9616129362 100644 --- a/examples/ipsec-secgw/ipsec_worker.h +++ b/examples/ipsec-secgw/ipsec_worker.h @@ -560,7 +560,7 @@ static __rte_always_inline void route6_pkts(struct rt_ctx *rt_ctx, struct rte_mbuf *pkts[], uint32_t nb_pkts) { int32_t hop[MAX_PKT_BURST * 2]; - uint8_t dst_ip[MAX_PKT_BURST * 2][16]; + struct rte_ipv6_addr dst_ip[MAX_PKT_BURST * 2]; struct rte_ether_hdr *ethhdr; uint8_t *ip6_dst; uint32_t pkt_hop = 0; @@ -586,7 +586,7 @@ route6_pkts(struct rt_ctx *rt_ctx, struct rte_mbuf *pkts[], uint32_t nb_pkts) offset = offsetof(struct ip6_hdr, ip6_dst); ip6_dst = rte_pktmbuf_mtod_offset(pkt, uint8_t *, offset); - memcpy(&dst_ip[lpm_pkts][0], ip6_dst, 16); + memcpy(&dst_ip[lpm_pkts], ip6_dst, 16); lpm_pkts++; } } diff --git a/examples/ipsec-secgw/rt.c b/examples/ipsec-secgw/rt.c index ce854ccb6018..059fc0c8f28c 100644 --- a/examples/ipsec-secgw/rt.c +++ b/examples/ipsec-secgw/rt.c @@ -25,7 +25,7 @@ struct ip4_route { }; struct ip6_route { - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t depth; uint8_t if_out; }; @@ -99,7 +99,7 @@ parse_rt_tokens(char **tokens, uint32_t n_tokens, tokens[ti]); if (status->status < 0) return; - memcpy(route_ipv6->ip, ip.s6_addr, 16); + memcpy(&route_ipv6->ip, ip.s6_addr, 16); route_ipv6->depth = (uint8_t)depth; } } @@ -183,7 +183,7 @@ rt_init(struct socket_ctx *ctx, int32_t socket_id) /* populate the LPM table */ for (i = 0; i < nb_rt_ip6; i++) { - ret = rte_lpm6_add(lpm6, rt_ip6[i].ip, rt_ip6[i].depth, + ret = rte_lpm6_add(lpm6, &rt_ip6[i].ip, rt_ip6[i].depth, rt_ip6[i].if_out); if (ret < 0) rte_exit(EXIT_FAILURE, "Fail to add entry num %u to %s " @@ -191,14 +191,14 @@ rt_init(struct socket_ctx *ctx, int32_t socket_id) printf("LPM6: Adding route " " %hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hhx (%hhx)\n", - (uint16_t)((rt_ip6[i].ip[0] << 8) | rt_ip6[i].ip[1]), - (uint16_t)((rt_ip6[i].ip[2] << 8) | rt_ip6[i].ip[3]), - (uint16_t)((rt_ip6[i].ip[4] << 8) | rt_ip6[i].ip[5]), - (uint16_t)((rt_ip6[i].ip[6] << 8) | rt_ip6[i].ip[7]), - (uint16_t)((rt_ip6[i].ip[8] << 8) | rt_ip6[i].ip[9]), - (uint16_t)((rt_ip6[i].ip[10] << 8) | rt_ip6[i].ip[11]), - (uint16_t)((rt_ip6[i].ip[12] << 8) | rt_ip6[i].ip[13]), - (uint16_t)((rt_ip6[i].ip[14] << 8) | rt_ip6[i].ip[15]), + (uint16_t)((rt_ip6[i].ip.a[0] << 8) | rt_ip6[i].ip.a[1]), + (uint16_t)((rt_ip6[i].ip.a[2] << 8) | rt_ip6[i].ip.a[3]), + (uint16_t)((rt_ip6[i].ip.a[4] << 8) | rt_ip6[i].ip.a[5]), + (uint16_t)((rt_ip6[i].ip.a[6] << 8) | rt_ip6[i].ip.a[7]), + (uint16_t)((rt_ip6[i].ip.a[8] << 8) | rt_ip6[i].ip.a[9]), + (uint16_t)((rt_ip6[i].ip.a[10] << 8) | rt_ip6[i].ip.a[11]), + (uint16_t)((rt_ip6[i].ip.a[12] << 8) | rt_ip6[i].ip.a[13]), + (uint16_t)((rt_ip6[i].ip.a[14] << 8) | rt_ip6[i].ip.a[15]), rt_ip6[i].depth, rt_ip6[i].if_out); } diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c index 4a9534e9dbef..f98795071faf 100644 --- a/examples/l3fwd/l3fwd_fib.c +++ b/examples/l3fwd/l3fwd_fib.c @@ -46,7 +46,7 @@ static struct rte_fib6 *ipv6_l3fwd_fib_lookup_struct[NB_SOCKETS]; static inline void fib_parse_packet(struct rte_mbuf *mbuf, uint32_t *ipv4, uint32_t *ipv4_cnt, - uint8_t ipv6[RTE_FIB6_IPV6_ADDR_SIZE], + struct rte_ipv6_addr *ipv6, uint32_t *ipv6_cnt, uint8_t *ip_type) { struct rte_ether_hdr *eth_hdr; @@ -65,7 +65,7 @@ fib_parse_packet(struct rte_mbuf *mbuf, /* IPv6 */ else { ipv6_hdr = (struct rte_ipv6_hdr *)(eth_hdr + 1); - rte_mov16(ipv6, ipv6_hdr->dst_addr.a); + *ipv6 = ipv6_hdr->dst_addr; *ip_type = 0; (*ipv6_cnt)++; } @@ -120,7 +120,7 @@ fib_send_packets(int nb_rx, struct rte_mbuf **pkts_burst, uint16_t portid, struct lcore_conf *qconf) { uint32_t ipv4_arr[nb_rx]; - uint8_t ipv6_arr[nb_rx][RTE_FIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ipv6_arr[nb_rx]; uint16_t hops[nb_rx]; uint64_t hopsv4[nb_rx], hopsv6[nb_rx]; uint8_t type_arr[nb_rx]; @@ -140,7 +140,7 @@ fib_send_packets(int nb_rx, struct rte_mbuf **pkts_burst, i + FIB_PREFETCH_OFFSET], void *)); fib_parse_packet(pkts_burst[i], &ipv4_arr[ipv4_cnt], &ipv4_cnt, - ipv6_arr[ipv6_cnt], &ipv6_cnt, + &ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); } @@ -148,7 +148,7 @@ fib_send_packets(int nb_rx, struct rte_mbuf **pkts_burst, for (; i < nb_rx; i++) fib_parse_packet(pkts_burst[i], &ipv4_arr[ipv4_cnt], &ipv4_cnt, - ipv6_arr[ipv6_cnt], &ipv6_cnt, + &ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); /* Lookup IPv4 hops if IPv4 packets are present. */ @@ -270,7 +270,7 @@ fib_event_loop(struct l3fwd_event_resources *evt_rsrc, unsigned int lcore_id; uint32_t ipv4_arr[MAX_PKT_BURST]; - uint8_t ipv6_arr[MAX_PKT_BURST][RTE_FIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ipv6_arr[MAX_PKT_BURST]; uint64_t hopsv4[MAX_PKT_BURST], hopsv6[MAX_PKT_BURST]; uint16_t nh, hops[MAX_PKT_BURST]; uint8_t type_arr[MAX_PKT_BURST]; @@ -323,7 +323,7 @@ fib_event_loop(struct l3fwd_event_resources *evt_rsrc, fib_parse_packet(events[i].mbuf, &ipv4_arr[ipv4_cnt], &ipv4_cnt, - ipv6_arr[ipv6_cnt], &ipv6_cnt, + &ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); } @@ -340,7 +340,7 @@ fib_event_loop(struct l3fwd_event_resources *evt_rsrc, fib_parse_packet(events[i].mbuf, &ipv4_arr[ipv4_cnt], &ipv4_cnt, - ipv6_arr[ipv6_cnt], &ipv6_cnt, + &ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); } @@ -436,7 +436,7 @@ fib_event_main_loop_tx_q_burst(__rte_unused void *dummy) static __rte_always_inline void fib_process_event_vector(struct rte_event_vector *vec, uint8_t *type_arr, - uint8_t **ipv6_arr, uint64_t *hopsv4, uint64_t *hopsv6, + struct rte_ipv6_addr *ipv6_arr, uint64_t *hopsv4, uint64_t *hopsv6, uint32_t *ipv4_arr, uint16_t *hops) { uint32_t ipv4_arr_assem, ipv6_arr_assem; @@ -463,13 +463,13 @@ fib_process_event_vector(struct rte_event_vector *vec, uint8_t *type_arr, rte_prefetch0(rte_pktmbuf_mtod(mbufs[i + FIB_PREFETCH_OFFSET], void *)); fib_parse_packet(mbufs[i], &ipv4_arr[ipv4_cnt], &ipv4_cnt, - ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); + &ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); } /* Parse remaining packet info. */ for (; i < vec->nb_elem; i++) fib_parse_packet(mbufs[i], &ipv4_arr[ipv4_cnt], &ipv4_cnt, - ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); + &ipv6_arr[ipv6_cnt], &ipv6_cnt, &type_arr[i]); /* Lookup IPv4 hops if IPv4 packets are present. */ if (likely(ipv4_cnt > 0)) @@ -480,7 +480,7 @@ fib_process_event_vector(struct rte_event_vector *vec, uint8_t *type_arr, if (ipv6_cnt > 0) rte_fib6_lookup_bulk( lconf->ipv6_lookup_struct, - (uint8_t(*)[RTE_FIB6_IPV6_ADDR_SIZE])ipv6_arr, hopsv6, + ipv6_arr, hopsv6, ipv6_cnt); /* Assign ports looked up in fib depending on IPv4 or IPv6 */ @@ -522,7 +522,8 @@ fib_event_loop_vector(struct l3fwd_event_resources *evt_rsrc, const uint8_t event_d_id = evt_rsrc->event_d_id; const uint16_t deq_len = evt_rsrc->deq_depth; struct rte_event events[MAX_PKT_BURST]; - uint8_t *type_arr, **ipv6_arr, *ptr; + uint8_t *type_arr; + struct rte_ipv6_addr *ipv6_arr; int nb_enq = 0, nb_deq = 0, i; uint64_t *hopsv4, *hopsv6; uint32_t *ipv4_arr; @@ -533,7 +534,7 @@ fib_event_loop_vector(struct l3fwd_event_resources *evt_rsrc, "vector_fib", (sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(uint16_t) + sizeof(uint8_t *) + - (sizeof(uint8_t) * RTE_FIB6_IPV6_ADDR_SIZE)) * + sizeof(struct rte_ipv6_addr)) * evt_rsrc->vector_size, RTE_CACHE_LINE_SIZE); if (mem == 0) @@ -543,11 +544,7 @@ fib_event_loop_vector(struct l3fwd_event_resources *evt_rsrc, hopsv4 = (uint64_t *)&type_arr[evt_rsrc->vector_size]; hopsv6 = (uint64_t *)&hopsv4[evt_rsrc->vector_size]; hops = (uint16_t *)&hopsv6[evt_rsrc->vector_size]; - ipv6_arr = (uint8_t **)&hops[evt_rsrc->vector_size]; - - ptr = (uint8_t *)&ipv6_arr[evt_rsrc->vector_size]; - for (i = 0; i < evt_rsrc->vector_size; i++) - ipv6_arr[i] = &ptr[RTE_FIB6_IPV6_ADDR_SIZE + i]; + ipv6_arr = (struct rte_ipv6_addr *)&hops[evt_rsrc->vector_size]; if (event_p_id < 0) { rte_free((void *)mem); @@ -732,7 +729,7 @@ setup_fib(const int socketid) rte_eth_dev_info_get(route_base_v6[i].if_out, &dev_info); ret = rte_fib6_add(ipv6_l3fwd_fib_lookup_struct[socketid], - route_base_v6[i].ip_8, + &route_base_v6[i].ip6, route_base_v6[i].depth, route_base_v6[i].if_out); @@ -744,7 +741,7 @@ setup_fib(const int socketid) i, socketid); } - if (inet_ntop(AF_INET6, route_base_v6[i].ip_8, + if (inet_ntop(AF_INET6, &route_base_v6[i].ip6, abuf, sizeof(abuf)) != NULL) { printf("FIB: Adding route %s / %d (%d) [%s]\n", abuf, route_base_v6[i].depth, diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c index 422fdb70054d..fc4f5878fcd8 100644 --- a/examples/l3fwd/l3fwd_lpm.c +++ b/examples/l3fwd/l3fwd_lpm.c @@ -62,7 +62,7 @@ lpm_get_ipv6_dst_port(const struct rte_ipv6_hdr *ipv6_hdr, uint16_t portid, struct rte_lpm6 *ipv6_l3fwd_lookup_struct) { - const uint8_t *dst_ip = ipv6_hdr->dst_addr.a; + const struct rte_ipv6_addr *dst_ip = &ipv6_hdr->dst_addr; uint32_t next_hop; if (rte_lpm6_lookup(ipv6_l3fwd_lookup_struct, dst_ip, &next_hop) == 0) @@ -122,7 +122,7 @@ lpm_get_dst_port_with_ipv4(const struct lcore_conf *qconf, struct rte_mbuf *pkt, ipv6_hdr = (struct rte_ipv6_hdr *)(eth_hdr + 1); return (uint16_t) ((rte_lpm6_lookup(qconf->ipv6_lookup_struct, - ipv6_hdr->dst_addr.a, &next_hop) == 0) + &ipv6_hdr->dst_addr, &next_hop) == 0) ? next_hop : portid); } @@ -635,7 +635,7 @@ setup_lpm(const int socketid) rte_eth_dev_info_get(route_base_v6[i].if_out, &dev_info); ret = rte_lpm6_add(ipv6_l3fwd_lpm_lookup_struct[socketid], - route_base_v6[i].ip_8, + &route_base_v6[i].ip6, route_base_v6[i].depth, route_base_v6[i].if_out); @@ -647,7 +647,7 @@ setup_lpm(const int socketid) } printf("LPM: Adding route %s / %d (%d) [%s]\n", - inet_ntop(AF_INET6, route_base_v6[i].ip_8, abuf, + inet_ntop(AF_INET6, &route_base_v6[i].ip6, abuf, sizeof(abuf)), route_base_v6[i].depth, route_base_v6[i].if_out, rte_dev_name(dev_info.device)); diff --git a/examples/l3fwd/l3fwd_route.h b/examples/l3fwd/l3fwd_route.h index 467c4d285915..62263c354054 100644 --- a/examples/l3fwd/l3fwd_route.h +++ b/examples/l3fwd/l3fwd_route.h @@ -2,6 +2,8 @@ * Copyright(c) 2021 Intel Corporation */ +#include + /* Log file related character defs. */ #define COMMENT_LEAD_CHAR ('#') #define ROUTE_LEAD_CHAR ('R') @@ -29,7 +31,7 @@ struct ipv4_l3fwd_route { }; struct ipv6_l3fwd_route { - uint8_t ip[16]; + struct rte_ipv6_addr ip; uint8_t depth; uint8_t if_out; }; @@ -53,10 +55,7 @@ struct ipv6_5tuple { struct lpm_route_rule { union { uint32_t ip; - union { - uint32_t ip_32[IPV6_ADDR_U32]; - uint8_t ip_8[IPV6_ADDR_LEN]; - }; + struct rte_ipv6_addr ip6; }; uint8_t depth; uint8_t if_out; diff --git a/examples/l3fwd/lpm_route_parse.c b/examples/l3fwd/lpm_route_parse.c index f2028d79e180..9c179dc065c0 100644 --- a/examples/l3fwd/lpm_route_parse.c +++ b/examples/l3fwd/lpm_route_parse.c @@ -40,7 +40,7 @@ is_bypass_line(const char *buff) } static int -parse_ipv6_addr_mask(char *token, uint32_t *ipv6, uint8_t *mask) +parse_ipv6_addr_mask(char *token, struct rte_ipv6_addr *ipv6, uint8_t *mask) { char *sa, *sm, *sv; const char *dlm = "/"; @@ -83,7 +83,7 @@ parse_ipv4_addr_mask(char *token, uint32_t *ipv4, uint8_t *mask) } static int -lpm_parse_v6_net(char *in, uint32_t *v, uint8_t *mask_len) +lpm_parse_v6_net(char *in, struct rte_ipv6_addr *v, uint8_t *mask_len) { int32_t rc; @@ -108,7 +108,7 @@ lpm_parse_v6_rule(char *str, struct lpm_route_rule *v) return -EINVAL; } - rc = lpm_parse_v6_net(in[CB_FLD_DST_ADDR], v->ip_32, &v->depth); + rc = lpm_parse_v6_net(in[CB_FLD_DST_ADDR], &v->ip6, &v->depth); GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, UINT8_MAX, 0); @@ -164,8 +164,7 @@ lpm_add_default_v6_rules(void) route_base_v6 = calloc(route_num_v6, rule_size); for (i = 0; i < (unsigned int)route_num_v6; i++) { - memcpy(route_base_v6[i].ip_8, ipv6_l3fwd_route_array[i].ip, - sizeof(route_base_v6[i].ip_8)); + route_base_v6[i].ip6 = ipv6_l3fwd_route_array[i].ip; route_base_v6[i].depth = ipv6_l3fwd_route_array[i].depth; route_base_v6[i].if_out = ipv6_l3fwd_route_array[i].if_out; } diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c index 01b763e5ba11..6e2155e0052e 100644 --- a/examples/l3fwd/main.c +++ b/examples/l3fwd/main.c @@ -228,22 +228,22 @@ const struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = { * 2001:200:0:{0-f}::/64 = Port {0-15} */ const struct ipv6_l3fwd_route ipv6_l3fwd_route_array[] = { - {{32, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 0}, - {{32, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 1}, - {{32, 1, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 2}, - {{32, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 3}, - {{32, 1, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 4}, - {{32, 1, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 5}, - {{32, 1, 2, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 6}, - {{32, 1, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 7}, - {{32, 1, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 8}, - {{32, 1, 2, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 9}, - {{32, 1, 2, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 10}, - {{32, 1, 2, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 11}, - {{32, 1, 2, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 12}, - {{32, 1, 2, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 13}, - {{32, 1, 2, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 14}, - {{32, 1, 2, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0}, 64, 15}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x0, 0, 0, 0, 0), 64, 0}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x1, 0, 0, 0, 0), 64, 1}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x2, 0, 0, 0, 0), 64, 2}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x3, 0, 0, 0, 0), 64, 3}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x4, 0, 0, 0, 0), 64, 4}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x5, 0, 0, 0, 0), 64, 5}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x6, 0, 0, 0, 0), 64, 6}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x7, 0, 0, 0, 0), 64, 7}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x8, 0, 0, 0, 0), 64, 8}, + {RTE_IPV6(0x2001, 0x0200, 0, 0x9, 0, 0, 0, 0), 64, 9}, + {RTE_IPV6(0x2001, 0x0200, 0, 0xa, 0, 0, 0, 0), 64, 10}, + {RTE_IPV6(0x2001, 0x0200, 0, 0xb, 0, 0, 0, 0), 64, 11}, + {RTE_IPV6(0x2001, 0x0200, 0, 0xc, 0, 0, 0, 0), 64, 12}, + {RTE_IPV6(0x2001, 0x0200, 0, 0xd, 0, 0, 0, 0), 64, 13}, + {RTE_IPV6(0x2001, 0x0200, 0, 0xe, 0, 0, 0, 0), 64, 14}, + {RTE_IPV6(0x2001, 0x0200, 0, 0xf, 0, 0, 0, 0), 64, 15}, }; /* diff --git a/lib/fib/meson.build b/lib/fib/meson.build index 6795f41a0ad2..268007ef6c93 100644 --- a/lib/fib/meson.build +++ b/lib/fib/meson.build @@ -10,7 +10,7 @@ endif sources = files('rte_fib.c', 'rte_fib6.c', 'dir24_8.c', 'trie.c') headers = files('rte_fib.h', 'rte_fib6.h') -deps += ['rib'] +deps += ['net', 'rib'] # compile AVX512 version if: # we are building 64-bit binary AND binutils can generate proper code @@ -54,7 +54,7 @@ if dpdk_conf.has('RTE_ARCH_X86_64') and binutils_ok if cc.has_argument('-mavx512bw') trie_avx512_tmp = static_library('trie_avx512_tmp', 'trie_avx512.c', - dependencies: static_rte_eal, + dependencies: [static_rte_eal, static_rte_net], c_args: cflags + ['-mavx512f', \ '-mavx512dq', '-mavx512bw']) objs += trie_avx512_tmp.extract_objects('trie_avx512.c') diff --git a/lib/fib/rte_fib6.c b/lib/fib/rte_fib6.c index 9ad990724a8b..d95cac79cbb5 100644 --- a/lib/fib/rte_fib6.c +++ b/lib/fib/rte_fib6.c @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -49,7 +50,7 @@ struct rte_fib6 { }; static void -dummy_lookup(void *fib_p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +dummy_lookup(void *fib_p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n) { unsigned int i; @@ -57,7 +58,7 @@ dummy_lookup(void *fib_p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], struct rte_rib6_node *node; for (i = 0; i < n; i++) { - node = rte_rib6_lookup(fib->rib, ips[i]); + node = rte_rib6_lookup(fib->rib, &ips[i]); if (node != NULL) rte_rib6_get_nh(node, &next_hops[i]); else @@ -66,7 +67,7 @@ dummy_lookup(void *fib_p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], } static int -dummy_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], +dummy_modify(struct rte_fib6 *fib, const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop, int op) { struct rte_rib6_node *node; @@ -118,7 +119,7 @@ init_dataplane(struct rte_fib6 *fib, __rte_unused int socket_id, } int -rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], +rte_fib6_add(struct rte_fib6 *fib, const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop) { if ((fib == NULL) || (ip == NULL) || (fib->modify == NULL) || @@ -128,7 +129,7 @@ rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], } int -rte_fib6_delete(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], +rte_fib6_delete(struct rte_fib6 *fib, const struct rte_ipv6_addr *ip, uint8_t depth) { if ((fib == NULL) || (ip == NULL) || (fib->modify == NULL) || @@ -139,7 +140,7 @@ rte_fib6_delete(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], int rte_fib6_lookup_bulk(struct rte_fib6 *fib, - uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], + const struct rte_ipv6_addr *ips, uint64_t *next_hops, int n) { FIB6_RETURN_IF_TRUE((fib == NULL) || (ips == NULL) || diff --git a/lib/fib/rte_fib6.h b/lib/fib/rte_fib6.h index 2eb8b8267647..d26a0c7c0b77 100644 --- a/lib/fib/rte_fib6.h +++ b/lib/fib/rte_fib6.h @@ -17,6 +17,7 @@ #include +#include #ifdef __cplusplus extern "C" { @@ -37,11 +38,11 @@ enum rte_fib6_type { /** Modify FIB function */ typedef int (*rte_fib6_modify_fn_t)(struct rte_fib6 *fib, - const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], uint8_t depth, + const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop, int op); /** FIB bulk lookup function */ typedef void (*rte_fib6_lookup_fn_t)(void *fib, - uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], + const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n); enum rte_fib6_op { @@ -134,7 +135,7 @@ rte_fib6_free(struct rte_fib6 *fib); * 0 on success, negative value otherwise */ int -rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], +rte_fib6_add(struct rte_fib6 *fib, const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop); /** @@ -151,7 +152,7 @@ rte_fib6_add(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], */ int rte_fib6_delete(struct rte_fib6 *fib, - const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], uint8_t depth); + const struct rte_ipv6_addr *ip, uint8_t depth); /** * Lookup multiple IP addresses in the FIB. @@ -172,7 +173,7 @@ rte_fib6_delete(struct rte_fib6 *fib, */ int rte_fib6_lookup_bulk(struct rte_fib6 *fib, - uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], + const struct rte_ipv6_addr *ips, uint64_t *next_hops, int n); /** diff --git a/lib/fib/trie.c b/lib/fib/trie.c index 09470e7287cc..0b459b3749b9 100644 --- a/lib/fib/trie.c +++ b/lib/fib/trie.c @@ -225,7 +225,7 @@ tbl8_recycle(struct rte_trie_tbl *dp, void *par, uint64_t tbl8_idx) #define BYTE_SIZE 8 static inline uint32_t -get_idx(const uint8_t *ip, uint32_t prev_idx, int bytes, int first_byte) +get_idx(const struct rte_ipv6_addr *ip, uint32_t prev_idx, int bytes, int first_byte) { int i; uint32_t idx = 0; @@ -233,7 +233,7 @@ get_idx(const uint8_t *ip, uint32_t prev_idx, int bytes, int first_byte) for (i = first_byte; i < (first_byte + bytes); i++) { bitshift = (int8_t)(((first_byte + bytes - 1) - i)*BYTE_SIZE); - idx |= ip[i] << bitshift; + idx |= ip->a[i] << bitshift; } return (prev_idx * TRIE_TBL8_GRP_NUM_ENT) + idx; } @@ -280,7 +280,7 @@ recycle_root_path(struct rte_trie_tbl *dp, const uint8_t *ip_part, } static inline int -build_common_root(struct rte_trie_tbl *dp, const uint8_t *ip, +build_common_root(struct rte_trie_tbl *dp, const struct rte_ipv6_addr *ip, int common_bytes, void **tbl) { void *tbl_ptr = NULL; @@ -355,8 +355,8 @@ write_edge(struct rte_trie_tbl *dp, const uint8_t *ip_part, uint64_t next_hop, #define TBL8_LEN (RTE_FIB6_IPV6_ADDR_SIZE - TBL24_BYTES) static int -install_to_dp(struct rte_trie_tbl *dp, const uint8_t *ledge, const uint8_t *r, - uint64_t next_hop) +install_to_dp(struct rte_trie_tbl *dp, const struct rte_ipv6_addr *ledge, + const struct rte_ipv6_addr *r, uint64_t next_hop) { void *common_root_tbl; void *ent; @@ -364,18 +364,18 @@ install_to_dp(struct rte_trie_tbl *dp, const uint8_t *ledge, const uint8_t *r, int i; int common_bytes; int llen, rlen; - uint8_t redge[16]; + struct rte_ipv6_addr redge; /* decrement redge by 1*/ - rte_rib6_copy_addr(redge, r); + redge = *r; for (i = 15; i >= 0; i--) { - redge[i]--; - if (redge[i] != 0xff) + redge.a[i]--; + if (redge.a[i] != 0xff) break; } for (common_bytes = 0; common_bytes < 15; common_bytes++) { - if (ledge[common_bytes] != redge[common_bytes]) + if (ledge->a[common_bytes] != redge.a[common_bytes]) break; } @@ -386,14 +386,14 @@ install_to_dp(struct rte_trie_tbl *dp, const uint8_t *ledge, const uint8_t *r, uint8_t first_tbl8_byte = RTE_MAX(common_bytes, TBL24_BYTES); for (i = IPV6_MAX_IDX; i > first_tbl8_byte; i--) { - if (ledge[i] != 0) + if (ledge->a[i] != 0) break; } llen = i - first_tbl8_byte + (common_bytes < 3); for (i = IPV6_MAX_IDX; i > first_tbl8_byte; i--) { - if (redge[i] != UINT8_MAX) + if (redge.a[i] != UINT8_MAX) break; } rlen = i - first_tbl8_byte + (common_bytes < 3); @@ -403,10 +403,10 @@ install_to_dp(struct rte_trie_tbl *dp, const uint8_t *ledge, const uint8_t *r, uint8_t first_idx_len = (common_bytes < 3) ? 3 : 1; uint32_t left_idx = get_idx(ledge, 0, first_idx_len, first_byte_idx); - uint32_t right_idx = get_idx(redge, 0, first_idx_len, first_byte_idx); + uint32_t right_idx = get_idx(&redge, 0, first_idx_len, first_byte_idx); ent = get_tbl_p_by_idx(common_root_tbl, left_idx, dp->nh_sz); - ret = write_edge(dp, &ledge[first_tbl8_byte + !(common_bytes < 3)], + ret = write_edge(dp, &ledge->a[first_tbl8_byte + !(common_bytes < 3)], next_hop, llen, LEDGE, ent); if (ret < 0) return ret; @@ -418,7 +418,7 @@ install_to_dp(struct rte_trie_tbl *dp, const uint8_t *ledge, const uint8_t *r, right_idx - (left_idx + 1)); } ent = get_tbl_p_by_idx(common_root_tbl, right_idx, dp->nh_sz); - ret = write_edge(dp, &redge[first_tbl8_byte + !((common_bytes < 3))], + ret = write_edge(dp, &redge.a[first_tbl8_byte + !((common_bytes < 3))], next_hop, rlen, REDGE, ent); if (ret < 0) return ret; @@ -426,12 +426,12 @@ install_to_dp(struct rte_trie_tbl *dp, const uint8_t *ledge, const uint8_t *r, uint8_t common_tbl8 = (common_bytes < TBL24_BYTES) ? 0 : common_bytes - (TBL24_BYTES - 1); ent = get_tbl24_p(dp, ledge, dp->nh_sz); - recycle_root_path(dp, ledge + TBL24_BYTES, common_tbl8, ent); + recycle_root_path(dp, ledge->a + TBL24_BYTES, common_tbl8, ent); return 0; } static void -get_nxt_net(uint8_t *ip, uint8_t depth) +get_nxt_net(struct rte_ipv6_addr *ip, uint8_t depth) { int i; uint8_t part_depth; @@ -440,12 +440,12 @@ get_nxt_net(uint8_t *ip, uint8_t depth) for (i = 0, part_depth = depth; part_depth > 8; part_depth -= 8, i++) ; - prev_byte = ip[i]; - ip[i] += 1 << (8 - part_depth); - if (ip[i] < prev_byte) { + prev_byte = ip->a[i]; + ip->a[i] += 1 << (8 - part_depth); + if (ip->a[i] < prev_byte) { while (i > 0) { - ip[--i] += 1; - if (ip[i] != 0) + ip->a[--i] += 1; + if (ip->a[i] != 0) break; } } @@ -461,19 +461,18 @@ v6_addr_is_zero(const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE]) static int modify_dp(struct rte_trie_tbl *dp, struct rte_rib6 *rib, - const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], + const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop) { struct rte_rib6_node *tmp = NULL; - uint8_t ledge[RTE_FIB6_IPV6_ADDR_SIZE]; - uint8_t redge[RTE_FIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ledge, redge; int ret; uint8_t tmp_depth; if (next_hop > get_max_nh(dp->nh_sz)) return -EINVAL; - rte_rib6_copy_addr(ledge, ip); + ledge = *ip; do { tmp = rte_rib6_get_nxt(rib, ip, depth, tmp, RTE_RIB6_GET_NXT_COVER); @@ -481,32 +480,30 @@ modify_dp(struct rte_trie_tbl *dp, struct rte_rib6 *rib, rte_rib6_get_depth(tmp, &tmp_depth); if (tmp_depth == depth) continue; - rte_rib6_get_ip(tmp, redge); - if (rte_rib6_is_equal(ledge, redge)) { - get_nxt_net(ledge, tmp_depth); + rte_rib6_get_ip(tmp, &redge); + if (rte_rib6_is_equal(ledge.a, redge.a)) { + get_nxt_net(&ledge, tmp_depth); continue; } - ret = install_to_dp(dp, ledge, redge, - next_hop); + ret = install_to_dp(dp, &ledge, &redge, next_hop); if (ret != 0) return ret; - get_nxt_net(redge, tmp_depth); - rte_rib6_copy_addr(ledge, redge); + get_nxt_net(&redge, tmp_depth); + ledge = redge; /* * we got to the end of address space * and wrapped around */ - if (v6_addr_is_zero(ledge)) + if (v6_addr_is_zero(ledge.a)) break; } else { - rte_rib6_copy_addr(redge, ip); - get_nxt_net(redge, depth); - if (rte_rib6_is_equal(ledge, redge) && - !v6_addr_is_zero(ledge)) + redge = *ip; + get_nxt_net(&redge, depth); + if (rte_rib6_is_equal(ledge.a, redge.a) && + !v6_addr_is_zero(ledge.a)) break; - ret = install_to_dp(dp, ledge, redge, - next_hop); + ret = install_to_dp(dp, &ledge, &redge, next_hop); if (ret != 0) return ret; } @@ -516,7 +513,7 @@ modify_dp(struct rte_trie_tbl *dp, struct rte_rib6 *rib, } int -trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], +trie_modify(struct rte_fib6 *fib, const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop, int op) { struct rte_trie_tbl *dp; @@ -524,7 +521,7 @@ trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], struct rte_rib6_node *tmp = NULL; struct rte_rib6_node *node; struct rte_rib6_node *parent; - uint8_t ip_masked[RTE_FIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ip_masked; int i, ret = 0; uint64_t par_nh, node_nh; uint8_t tmp_depth, depth_diff = 0, parent_depth = 24; @@ -538,10 +535,10 @@ trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], RTE_ASSERT(rib); for (i = 0; i < RTE_FIB6_IPV6_ADDR_SIZE; i++) - ip_masked[i] = ip[i] & get_msk_part(depth, i); + ip_masked.a[i] = ip->a[i] & get_msk_part(depth, i); if (depth > 24) { - tmp = rte_rib6_get_nxt(rib, ip_masked, + tmp = rte_rib6_get_nxt(rib, &ip_masked, RTE_ALIGN_FLOOR(depth, 8), NULL, RTE_RIB6_GET_NXT_COVER); if (tmp == NULL) { @@ -555,14 +552,14 @@ trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], depth_diff = depth_diff >> 3; } } - node = rte_rib6_lookup_exact(rib, ip_masked, depth); + node = rte_rib6_lookup_exact(rib, &ip_masked, depth); switch (op) { case RTE_FIB6_ADD: if (node != NULL) { rte_rib6_get_nh(node, &node_nh); if (node_nh == next_hop) return 0; - ret = modify_dp(dp, rib, ip_masked, depth, next_hop); + ret = modify_dp(dp, rib, &ip_masked, depth, next_hop); if (ret == 0) rte_rib6_set_nh(node, next_hop); return 0; @@ -572,7 +569,7 @@ trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], dp->number_tbl8s - depth_diff)) return -ENOSPC; - node = rte_rib6_insert(rib, ip_masked, depth); + node = rte_rib6_insert(rib, &ip_masked, depth); if (node == NULL) return -rte_errno; rte_rib6_set_nh(node, next_hop); @@ -582,9 +579,9 @@ trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], if (par_nh == next_hop) return 0; } - ret = modify_dp(dp, rib, ip_masked, depth, next_hop); + ret = modify_dp(dp, rib, &ip_masked, depth, next_hop); if (ret != 0) { - rte_rib6_remove(rib, ip_masked, depth); + rte_rib6_remove(rib, &ip_masked, depth); return ret; } @@ -599,10 +596,10 @@ trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], rte_rib6_get_nh(parent, &par_nh); rte_rib6_get_nh(node, &node_nh); if (par_nh != node_nh) - ret = modify_dp(dp, rib, ip_masked, depth, + ret = modify_dp(dp, rib, &ip_masked, depth, par_nh); } else - ret = modify_dp(dp, rib, ip_masked, depth, dp->def_nh); + ret = modify_dp(dp, rib, &ip_masked, depth, dp->def_nh); if (ret != 0) return ret; diff --git a/lib/fib/trie.h b/lib/fib/trie.h index 2c20184a26a3..6e235edaf89c 100644 --- a/lib/fib/trie.h +++ b/lib/fib/trie.h @@ -8,6 +8,8 @@ #include +#include + /** * @file * RTE IPv6 Longest Prefix Match (LPM) @@ -42,13 +44,13 @@ struct rte_trie_tbl { }; static inline uint32_t -get_tbl24_idx(const uint8_t *ip) +get_tbl24_idx(const struct rte_ipv6_addr *ip) { - return ip[0] << 16|ip[1] << 8|ip[2]; + return ip->a[0] << 16|ip->a[1] << 8|ip->a[2]; } static inline void * -get_tbl24_p(struct rte_trie_tbl *dp, const uint8_t *ip, uint8_t nh_sz) +get_tbl24_p(struct rte_trie_tbl *dp, const struct rte_ipv6_addr *ip, uint8_t nh_sz) { uint32_t tbl24_idx; @@ -107,7 +109,7 @@ is_entry_extended(uint64_t ent) #define LOOKUP_FUNC(suffix, type, nh_sz) \ static inline void rte_trie_lookup_bulk_##suffix(void *p, \ - uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], \ + const struct rte_ipv6_addr *ips, \ uint64_t *next_hops, const unsigned int n) \ { \ struct rte_trie_tbl *dp = (struct rte_trie_tbl *)p; \ @@ -115,10 +117,10 @@ static inline void rte_trie_lookup_bulk_##suffix(void *p, \ uint32_t i, j; \ \ for (i = 0; i < n; i++) { \ - tmp = ((type *)dp->tbl24)[get_tbl24_idx(&ips[i][0])]; \ + tmp = ((type *)dp->tbl24)[get_tbl24_idx(&ips[i])]; \ j = 3; \ while (is_entry_extended(tmp)) { \ - tmp = ((type *)dp->tbl8)[ips[i][j++] + \ + tmp = ((type *)dp->tbl8)[ips[i].a[j++] + \ ((tmp >> 1) * TRIE_TBL8_GRP_NUM_ENT)]; \ } \ next_hops[i] = tmp >> 1; \ @@ -138,7 +140,7 @@ rte_fib6_lookup_fn_t trie_get_lookup_fn(void *p, enum rte_fib6_lookup_type type); int -trie_modify(struct rte_fib6 *fib, const uint8_t ip[RTE_FIB6_IPV6_ADDR_SIZE], +trie_modify(struct rte_fib6 *fib, const struct rte_ipv6_addr *ip, uint8_t depth, uint64_t next_hop, int op); #endif /* _TRIE_H_ */ diff --git a/lib/fib/trie_avx512.c b/lib/fib/trie_avx512.c index d4d70d84bf60..f49482a95dfa 100644 --- a/lib/fib/trie_avx512.c +++ b/lib/fib/trie_avx512.c @@ -9,7 +9,7 @@ #include "trie_avx512.h" static __rte_always_inline void -transpose_x16(uint8_t ips[16][RTE_FIB6_IPV6_ADDR_SIZE], +transpose_x16(const struct rte_ipv6_addr *ips, __m512i *first, __m512i *second, __m512i *third, __m512i *fourth) { __m512i tmp1, tmp2, tmp3, tmp4; @@ -21,10 +21,10 @@ transpose_x16(uint8_t ips[16][RTE_FIB6_IPV6_ADDR_SIZE], }; /* load all ip addresses */ - tmp1 = _mm512_loadu_si512(&ips[0][0]); - tmp2 = _mm512_loadu_si512(&ips[4][0]); - tmp3 = _mm512_loadu_si512(&ips[8][0]); - tmp4 = _mm512_loadu_si512(&ips[12][0]); + tmp1 = _mm512_loadu_si512(&ips[0]); + tmp2 = _mm512_loadu_si512(&ips[4]); + tmp3 = _mm512_loadu_si512(&ips[8]); + tmp4 = _mm512_loadu_si512(&ips[12]); /* transpose 4 byte chunks of 16 ips */ tmp5 = _mm512_unpacklo_epi32(tmp1, tmp2); @@ -48,7 +48,7 @@ transpose_x16(uint8_t ips[16][RTE_FIB6_IPV6_ADDR_SIZE], } static __rte_always_inline void -transpose_x8(uint8_t ips[8][RTE_FIB6_IPV6_ADDR_SIZE], +transpose_x8(const struct rte_ipv6_addr *ips, __m512i *first, __m512i *second) { __m512i tmp1, tmp2, tmp3, tmp4; @@ -57,8 +57,8 @@ transpose_x8(uint8_t ips[8][RTE_FIB6_IPV6_ADDR_SIZE], }, }; - tmp1 = _mm512_loadu_si512(&ips[0][0]); - tmp2 = _mm512_loadu_si512(&ips[4][0]); + tmp1 = _mm512_loadu_si512(&ips[0]); + tmp2 = _mm512_loadu_si512(&ips[4]); tmp3 = _mm512_unpacklo_epi64(tmp1, tmp2); *first = _mm512_permutexvar_epi64(perm_idxes.z, tmp3); @@ -67,7 +67,7 @@ transpose_x8(uint8_t ips[8][RTE_FIB6_IPV6_ADDR_SIZE], } static __rte_always_inline void -trie_vec_lookup_x16x2(void *p, uint8_t ips[32][RTE_FIB6_IPV6_ADDR_SIZE], +trie_vec_lookup_x16x2(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, int size) { struct rte_trie_tbl *dp = (struct rte_trie_tbl *)p; @@ -213,7 +213,7 @@ trie_vec_lookup_x16x2(void *p, uint8_t ips[32][RTE_FIB6_IPV6_ADDR_SIZE], } static void -trie_vec_lookup_x8x2_8b(void *p, uint8_t ips[16][RTE_FIB6_IPV6_ADDR_SIZE], +trie_vec_lookup_x8x2_8b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops) { struct rte_trie_tbl *dp = (struct rte_trie_tbl *)p; @@ -306,40 +306,40 @@ trie_vec_lookup_x8x2_8b(void *p, uint8_t ips[16][RTE_FIB6_IPV6_ADDR_SIZE], } void -rte_trie_vec_lookup_bulk_2b(void *p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +rte_trie_vec_lookup_bulk_2b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n) { uint32_t i; for (i = 0; i < (n / 32); i++) { - trie_vec_lookup_x16x2(p, (uint8_t (*)[16])&ips[i * 32][0], + trie_vec_lookup_x16x2(p, &ips[i * 32], next_hops + i * 32, sizeof(uint16_t)); } - rte_trie_lookup_bulk_2b(p, (uint8_t (*)[16])&ips[i * 32][0], + rte_trie_lookup_bulk_2b(p, &ips[i * 32], next_hops + i * 32, n - i * 32); } void -rte_trie_vec_lookup_bulk_4b(void *p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +rte_trie_vec_lookup_bulk_4b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n) { uint32_t i; for (i = 0; i < (n / 32); i++) { - trie_vec_lookup_x16x2(p, (uint8_t (*)[16])&ips[i * 32][0], + trie_vec_lookup_x16x2(p, &ips[i * 32], next_hops + i * 32, sizeof(uint32_t)); } - rte_trie_lookup_bulk_4b(p, (uint8_t (*)[16])&ips[i * 32][0], + rte_trie_lookup_bulk_4b(p, &ips[i * 32], next_hops + i * 32, n - i * 32); } void -rte_trie_vec_lookup_bulk_8b(void *p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +rte_trie_vec_lookup_bulk_8b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n) { uint32_t i; for (i = 0; i < (n / 16); i++) { - trie_vec_lookup_x8x2_8b(p, (uint8_t (*)[16])&ips[i * 16][0], + trie_vec_lookup_x8x2_8b(p, &ips[i * 16], next_hops + i * 16); } - rte_trie_lookup_bulk_8b(p, (uint8_t (*)[16])&ips[i * 16][0], + rte_trie_lookup_bulk_8b(p, &ips[i * 16], next_hops + i * 16, n - i * 16); } diff --git a/lib/fib/trie_avx512.h b/lib/fib/trie_avx512.h index ef8c7f0e3474..1028a4899fc7 100644 --- a/lib/fib/trie_avx512.h +++ b/lib/fib/trie_avx512.h @@ -5,16 +5,20 @@ #ifndef _TRIE_AVX512_H_ #define _TRIE_AVX512_H_ +#include + +struct rte_ipv6_addr; + void -rte_trie_vec_lookup_bulk_2b(void *p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +rte_trie_vec_lookup_bulk_2b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n); void -rte_trie_vec_lookup_bulk_4b(void *p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +rte_trie_vec_lookup_bulk_4b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n); void -rte_trie_vec_lookup_bulk_8b(void *p, uint8_t ips[][RTE_FIB6_IPV6_ADDR_SIZE], +rte_trie_vec_lookup_bulk_8b(void *p, const struct rte_ipv6_addr *ips, uint64_t *next_hops, const unsigned int n); #endif /* _TRIE_AVX512_H_ */ diff --git a/lib/lpm/meson.build b/lib/lpm/meson.build index ae30f80b69c8..fae4f79fb938 100644 --- a/lib/lpm/meson.build +++ b/lib/lpm/meson.build @@ -20,3 +20,4 @@ indirect_headers += files( ) deps += ['hash'] deps += ['rcu'] +deps += ['net'] diff --git a/lib/lpm/rte_lpm6.c b/lib/lpm/rte_lpm6.c index 5bc17601ab71..b03221d013c5 100644 --- a/lib/lpm/rte_lpm6.c +++ b/lib/lpm/rte_lpm6.c @@ -67,14 +67,14 @@ struct rte_lpm6_tbl_entry { /** Rules tbl entry structure. */ struct rte_lpm6_rule { - uint8_t ip[RTE_LPM6_IPV6_ADDR_SIZE]; /**< Rule IP address. */ + struct rte_ipv6_addr ip; /**< Rule IP address. */ uint32_t next_hop; /**< Rule next hop. */ uint8_t depth; /**< Rule depth. */ }; /** Rules tbl entry key. */ struct rte_lpm6_rule_key { - uint8_t ip[RTE_LPM6_IPV6_ADDR_SIZE]; /**< Rule IP address. */ + struct rte_ipv6_addr ip; /**< Rule IP address. */ uint32_t depth; /**< Rule depth. */ }; @@ -135,13 +135,6 @@ ip6_mask_addr(uint8_t *ip, uint8_t depth) } } -/* copy ipv6 address */ -static inline void -ip6_copy_addr(uint8_t *dst, const uint8_t *src) -{ - rte_memcpy(dst, src, RTE_LPM6_IPV6_ADDR_SIZE); -} - /* * LPM6 rule hash function * @@ -213,9 +206,9 @@ tbl8_available(struct rte_lpm6 *lpm) * note that ip must be already masked */ static inline void -rule_key_init(struct rte_lpm6_rule_key *key, uint8_t *ip, uint8_t depth) +rule_key_init(struct rte_lpm6_rule_key *key, const struct rte_ipv6_addr *ip, uint8_t depth) { - ip6_copy_addr(key->ip, ip); + key->ip = *ip; key->depth = depth; } @@ -231,7 +224,7 @@ rebuild_lpm(struct rte_lpm6 *lpm) while (rte_hash_iterate(lpm->rules_tbl, (void *) &rule_key, (void **) &next_hop, &iter) >= 0) - rte_lpm6_add(lpm, rule_key->ip, rule_key->depth, + rte_lpm6_add(lpm, &rule_key->ip, rule_key->depth, (uint32_t) next_hop); } @@ -460,7 +453,7 @@ rule_find_with_key(struct rte_lpm6 *lpm, /* Find a rule */ static int -rule_find(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth, +rule_find(struct rte_lpm6 *lpm, struct rte_ipv6_addr *ip, uint8_t depth, uint32_t *next_hop) { struct rte_lpm6_rule_key rule_key; @@ -481,7 +474,7 @@ rule_find(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth, * <0 - error */ static inline int -rule_add(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth, uint32_t next_hop) +rule_add(struct rte_lpm6 *lpm, struct rte_ipv6_addr *ip, uint8_t depth, uint32_t next_hop) { int ret, rule_exist; struct rte_lpm6_rule_key rule_key; @@ -570,7 +563,7 @@ init_tbl8_header(struct rte_lpm6 *lpm, uint32_t tbl_ind, * of the bytes being inspected in this step. */ static uint32_t -get_bitshift(const uint8_t *ip, uint8_t first_byte, uint8_t bytes) +get_bitshift(const struct rte_ipv6_addr *ip, uint8_t first_byte, uint8_t bytes) { uint32_t entry_ind, i; int8_t bitshift; @@ -581,7 +574,7 @@ get_bitshift(const uint8_t *ip, uint8_t first_byte, uint8_t bytes) if (bitshift < 0) bitshift = 0; - entry_ind = entry_ind | ip[i-1] << bitshift; + entry_ind = entry_ind | ip->a[i-1] << bitshift; } return entry_ind; @@ -596,7 +589,7 @@ get_bitshift(const uint8_t *ip, uint8_t first_byte, uint8_t bytes) */ static inline int simulate_add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl, - struct rte_lpm6_tbl_entry **next_tbl, const uint8_t *ip, + struct rte_lpm6_tbl_entry **next_tbl, const struct rte_ipv6_addr *ip, uint8_t bytes, uint8_t first_byte, uint8_t depth, uint32_t *need_tbl_nb) { @@ -649,7 +642,7 @@ simulate_add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl, static inline int add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl, uint32_t tbl_ind, struct rte_lpm6_tbl_entry **next_tbl, - uint32_t *next_tbl_ind, uint8_t *ip, uint8_t bytes, + uint32_t *next_tbl_ind, struct rte_ipv6_addr *ip, uint8_t bytes, uint8_t first_byte, uint8_t depth, uint32_t next_hop, uint8_t is_new_rule) { @@ -814,7 +807,7 @@ add_step(struct rte_lpm6 *lpm, struct rte_lpm6_tbl_entry *tbl, * -ENOSPC not enough tbl8 left */ static int -simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth) +simulate_add(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *masked_ip, uint8_t depth) { struct rte_lpm6_tbl_entry *tbl; struct rte_lpm6_tbl_entry *tbl_next = NULL; @@ -851,7 +844,7 @@ simulate_add(struct rte_lpm6 *lpm, const uint8_t *masked_ip, uint8_t depth) * Add a route */ int -rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, +rte_lpm6_add(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth, uint32_t next_hop) { struct rte_lpm6_tbl_entry *tbl; @@ -859,7 +852,7 @@ rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, /* init to avoid compiler warning */ uint32_t tbl_next_num = 123456; int status; - uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr masked_ip; int i; /* Check user arguments. */ @@ -867,16 +860,16 @@ rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, return -EINVAL; /* Copy the IP and mask it to avoid modifying user's input data. */ - ip6_copy_addr(masked_ip, ip); - ip6_mask_addr(masked_ip, depth); + masked_ip = *ip; + ip6_mask_addr(masked_ip.a, depth); /* Simulate adding a new route */ - int ret = simulate_add(lpm, masked_ip, depth); + int ret = simulate_add(lpm, &masked_ip, depth); if (ret < 0) return ret; /* Add the rule to the rule table. */ - int is_new_rule = rule_add(lpm, masked_ip, depth, next_hop); + int is_new_rule = rule_add(lpm, &masked_ip, depth, next_hop); /* If there is no space available for new rule return error. */ if (is_new_rule < 0) return is_new_rule; @@ -884,7 +877,7 @@ rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, /* Inspect the first three bytes through tbl24 on the first step. */ tbl = lpm->tbl24; status = add_step(lpm, tbl, TBL24_IND, &tbl_next, &tbl_next_num, - masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop, + &masked_ip, ADD_FIRST_BYTE, 1, depth, next_hop, is_new_rule); assert(status >= 0); @@ -895,7 +888,7 @@ rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, for (i = ADD_FIRST_BYTE; i < RTE_LPM6_IPV6_ADDR_SIZE && status == 1; i++) { tbl = tbl_next; status = add_step(lpm, tbl, tbl_next_num, &tbl_next, - &tbl_next_num, masked_ip, 1, (uint8_t)(i + 1), + &tbl_next_num, &masked_ip, 1, (uint8_t)(i + 1), depth, next_hop, is_new_rule); assert(status >= 0); } @@ -910,7 +903,7 @@ rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, */ static inline int lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl, - const struct rte_lpm6_tbl_entry **tbl_next, const uint8_t *ip, + const struct rte_lpm6_tbl_entry **tbl_next, const struct rte_ipv6_addr *ip, uint8_t first_byte, uint32_t *next_hop) { uint32_t tbl8_index, tbl_entry; @@ -922,7 +915,7 @@ lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl, if ((tbl_entry & RTE_LPM6_VALID_EXT_ENTRY_BITMASK) == RTE_LPM6_VALID_EXT_ENTRY_BITMASK) { - tbl8_index = ip[first_byte-1] + + tbl8_index = ip->a[first_byte-1] + ((tbl_entry & RTE_LPM6_TBL8_BITMASK) * RTE_LPM6_TBL8_GROUP_NUM_ENTRIES); @@ -940,7 +933,7 @@ lookup_step(const struct rte_lpm6 *lpm, const struct rte_lpm6_tbl_entry *tbl, * Looks up an IP */ int -rte_lpm6_lookup(const struct rte_lpm6 *lpm, const uint8_t *ip, +rte_lpm6_lookup(const struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint32_t *next_hop) { const struct rte_lpm6_tbl_entry *tbl; @@ -954,7 +947,7 @@ rte_lpm6_lookup(const struct rte_lpm6 *lpm, const uint8_t *ip, return -EINVAL; first_byte = LOOKUP_FIRST_BYTE; - tbl24_index = (ip[0] << BYTES2_SIZE) | (ip[1] << BYTE_SIZE) | ip[2]; + tbl24_index = (ip->a[0] << BYTES2_SIZE) | (ip->a[1] << BYTE_SIZE) | ip->a[2]; /* Calculate pointer to the first entry to be inspected */ tbl = &lpm->tbl24[tbl24_index]; @@ -973,7 +966,7 @@ rte_lpm6_lookup(const struct rte_lpm6 *lpm, const uint8_t *ip, */ int rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm, - uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE], + struct rte_ipv6_addr *ips, int32_t *next_hops, unsigned int n) { unsigned int i; @@ -989,8 +982,8 @@ rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm, for (i = 0; i < n; i++) { first_byte = LOOKUP_FIRST_BYTE; - tbl24_index = (ips[i][0] << BYTES2_SIZE) | - (ips[i][1] << BYTE_SIZE) | ips[i][2]; + tbl24_index = (ips[i].a[0] << BYTES2_SIZE) | + (ips[i].a[1] << BYTE_SIZE) | ips[i].a[2]; /* Calculate pointer to the first entry to be inspected */ tbl = &lpm->tbl24[tbl24_index]; @@ -999,7 +992,7 @@ rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm, /* Continue inspecting following levels * until success or failure */ - status = lookup_step(lpm, tbl, &tbl_next, ips[i], + status = lookup_step(lpm, tbl, &tbl_next, &ips[i], first_byte++, &next_hop); tbl = tbl_next; } while (status == 1); @@ -1017,10 +1010,10 @@ rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm, * Look for a rule in the high-level rules table */ int -rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, +rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth, uint32_t *next_hop) { - uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr masked_ip; /* Check user arguments. */ if ((lpm == NULL) || next_hop == NULL || ip == NULL || @@ -1028,10 +1021,10 @@ rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, return -EINVAL; /* Copy the IP and mask it to avoid modifying user's input data. */ - ip6_copy_addr(masked_ip, ip); - ip6_mask_addr(masked_ip, depth); + masked_ip = *ip; + ip6_mask_addr(masked_ip.a, depth); - return rule_find(lpm, masked_ip, depth, next_hop); + return rule_find(lpm, &masked_ip, depth, next_hop); } /* @@ -1042,7 +1035,7 @@ rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, * <0 on failure */ static inline int -rule_delete(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth) +rule_delete(struct rte_lpm6 *lpm, struct rte_ipv6_addr *ip, uint8_t depth) { int ret; struct rte_lpm6_rule_key rule_key; @@ -1067,10 +1060,10 @@ rule_delete(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth) */ int rte_lpm6_delete_bulk_func(struct rte_lpm6 *lpm, - uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE], uint8_t *depths, + struct rte_ipv6_addr *ips, uint8_t *depths, unsigned n) { - uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr masked_ip; unsigned i; /* Check input arguments. */ @@ -1078,9 +1071,9 @@ rte_lpm6_delete_bulk_func(struct rte_lpm6 *lpm, return -EINVAL; for (i = 0; i < n; i++) { - ip6_copy_addr(masked_ip, ips[i]); - ip6_mask_addr(masked_ip, depths[i]); - rule_delete(lpm, masked_ip, depths[i]); + masked_ip = ips[i]; + ip6_mask_addr(masked_ip.a, depths[i]); + rule_delete(lpm, &masked_ip, depths[i]); } /* @@ -1141,7 +1134,7 @@ depth_to_mask_1b(uint8_t depth) * Find a less specific rule */ static int -rule_find_less_specific(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth, +rule_find_less_specific(struct rte_lpm6 *lpm, struct rte_ipv6_addr *ip, uint8_t depth, struct rte_lpm6_rule *rule) { int ret; @@ -1163,12 +1156,12 @@ rule_find_less_specific(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth, mask = depth_to_mask_1b(mask); rule_key.depth = depth; - rule_key.ip[depth >> 3] &= mask; + rule_key.ip.a[depth >> 3] &= mask; ret = rule_find_with_key(lpm, &rule_key, &next_hop); if (ret) { rule->depth = depth; - ip6_copy_addr(rule->ip, rule_key.ip); + rule->ip = rule_key.ip; rule->next_hop = next_hop; return 1; } @@ -1181,13 +1174,14 @@ rule_find_less_specific(struct rte_lpm6 *lpm, uint8_t *ip, uint8_t depth, * Find range of tbl8 cells occupied by a rule */ static void -rule_find_range(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, +rule_find_range(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth, struct rte_lpm6_tbl_entry **from, struct rte_lpm6_tbl_entry **to, uint32_t *out_tbl_ind) { uint32_t ind; - uint32_t first_3bytes = (uint32_t)ip[0] << 16 | ip[1] << 8 | ip[2]; + uint32_t first_3bytes = (uint32_t)ip->a[0] << 16 | + ip->a[1] << 8 | ip->a[2]; if (depth <= 24) { /* rule is within the top level */ @@ -1213,7 +1207,7 @@ rule_find_range(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, * until we reach the last one */ while (depth > 8) { - tbl += ip[byte]; + tbl += ip->a[byte]; assert(tbl->ext_entry == 1); /* go to the next level/tbl8 */ tbl_ind = tbl->lpm6_tbl8_gindex; @@ -1224,7 +1218,7 @@ rule_find_range(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, } /* last level/tbl8 */ - ind = ip[byte] & depth_to_mask_1b(depth); + ind = ip->a[byte] & depth_to_mask_1b(depth); *from = &tbl[ind]; ind += (1 << (8 - depth)) - 1; *to = &tbl[ind]; @@ -1288,9 +1282,9 @@ remove_tbl(struct rte_lpm6 *lpm, struct rte_lpm_tbl8_hdr *tbl_hdr, * Deletes a rule */ int -rte_lpm6_delete(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth) +rte_lpm6_delete(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth) { - uint8_t masked_ip[RTE_LPM6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr masked_ip; struct rte_lpm6_rule lsp_rule_obj; struct rte_lpm6_rule *lsp_rule; int ret; @@ -1302,21 +1296,21 @@ rte_lpm6_delete(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth) return -EINVAL; /* Copy the IP and mask it to avoid modifying user's input data. */ - ip6_copy_addr(masked_ip, ip); - ip6_mask_addr(masked_ip, depth); + masked_ip = *ip; + ip6_mask_addr(masked_ip.a, depth); /* Delete the rule from the rule table. */ - ret = rule_delete(lpm, masked_ip, depth); + ret = rule_delete(lpm, &masked_ip, depth); if (ret < 0) return -ENOENT; /* find rule cells */ - rule_find_range(lpm, masked_ip, depth, &from, &to, &tbl_ind); + rule_find_range(lpm, &masked_ip, depth, &from, &to, &tbl_ind); /* find a less specific rule (a rule with smaller depth) * note: masked_ip will be modified, don't use it anymore */ - ret = rule_find_less_specific(lpm, masked_ip, depth, + ret = rule_find_less_specific(lpm, &masked_ip, depth, &lsp_rule_obj); lsp_rule = ret ? &lsp_rule_obj : NULL; diff --git a/lib/lpm/rte_lpm6.h b/lib/lpm/rte_lpm6.h index c93683e6240c..87392194237c 100644 --- a/lib/lpm/rte_lpm6.h +++ b/lib/lpm/rte_lpm6.h @@ -9,6 +9,8 @@ * RTE Longest Prefix Match for IPv6 (LPM6) */ +#include + #include #ifdef __cplusplus @@ -92,7 +94,7 @@ rte_lpm6_free(struct rte_lpm6 *lpm); * 0 on success, negative value otherwise */ int -rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, +rte_lpm6_add(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth, uint32_t next_hop); /** @@ -111,7 +113,7 @@ rte_lpm6_add(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, * 1 if the rule exists, 0 if it does not, a negative value on failure */ int -rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, +rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth, uint32_t *next_hop); /** @@ -127,7 +129,7 @@ rte_lpm6_is_rule_present(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth, * 0 on success, negative value otherwise */ int -rte_lpm6_delete(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth); +rte_lpm6_delete(struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint8_t depth); /** * Delete a rule from the LPM table. @@ -145,7 +147,7 @@ rte_lpm6_delete(struct rte_lpm6 *lpm, const uint8_t *ip, uint8_t depth); */ int rte_lpm6_delete_bulk_func(struct rte_lpm6 *lpm, - uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE], uint8_t *depths, unsigned n); + struct rte_ipv6_addr *ips, uint8_t *depths, unsigned int n); /** * Delete all rules from the LPM table. @@ -169,7 +171,7 @@ rte_lpm6_delete_all(struct rte_lpm6 *lpm); * -EINVAL for incorrect arguments, -ENOENT on lookup miss, 0 on lookup hit */ int -rte_lpm6_lookup(const struct rte_lpm6 *lpm, const uint8_t *ip, uint32_t *next_hop); +rte_lpm6_lookup(const struct rte_lpm6 *lpm, const struct rte_ipv6_addr *ip, uint32_t *next_hop); /** * Lookup multiple IP addresses in an LPM table. @@ -189,7 +191,7 @@ rte_lpm6_lookup(const struct rte_lpm6 *lpm, const uint8_t *ip, uint32_t *next_ho */ int rte_lpm6_lookup_bulk_func(const struct rte_lpm6 *lpm, - uint8_t ips[][RTE_LPM6_IPV6_ADDR_SIZE], + struct rte_ipv6_addr *ips, int32_t *next_hops, unsigned int n); #ifdef __cplusplus diff --git a/lib/node/ip6_lookup.c b/lib/node/ip6_lookup.c index 6bbcf14e2aa8..f291ef74832b 100644 --- a/lib/node/ip6_lookup.c +++ b/lib/node/ip6_lookup.c @@ -74,7 +74,7 @@ ip6_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node, /* Get stream for the speculated next node */ to_next = rte_node_next_stream_get(graph, node, next_index, nb_objs); while (n_left_from >= 4) { - uint8_t ip_batch[4][16]; + struct rte_ipv6_addr ip_batch[4]; int32_t next_hop[4]; uint16_t next[4]; @@ -112,28 +112,28 @@ ip6_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node, sizeof(struct rte_ether_hdr)); /* Extract hop_limits as ipv6 hdr is in cache */ node_mbuf_priv1(mbuf0, dyn)->ttl = ipv6_hdr->hop_limits; - rte_memcpy(ip_batch[0], &ipv6_hdr->dst_addr, 16); + ip_batch[0] = ipv6_hdr->dst_addr; /* Extract DIP of mbuf1 */ ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf1, struct rte_ipv6_hdr *, sizeof(struct rte_ether_hdr)); /* Extract hop_limits as ipv6 hdr is in cache */ node_mbuf_priv1(mbuf1, dyn)->ttl = ipv6_hdr->hop_limits; - rte_memcpy(ip_batch[1], &ipv6_hdr->dst_addr, 16); + ip_batch[1] = ipv6_hdr->dst_addr; /* Extract DIP of mbuf2 */ ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf2, struct rte_ipv6_hdr *, sizeof(struct rte_ether_hdr)); /* Extract hop_limits as ipv6 hdr is in cache */ node_mbuf_priv1(mbuf2, dyn)->ttl = ipv6_hdr->hop_limits; - rte_memcpy(ip_batch[2], &ipv6_hdr->dst_addr, 16); + ip_batch[2] = ipv6_hdr->dst_addr; /* Extract DIP of mbuf3 */ ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf3, struct rte_ipv6_hdr *, sizeof(struct rte_ether_hdr)); /* Extract hop_limits as ipv6 hdr is in cache */ node_mbuf_priv1(mbuf3, dyn)->ttl = ipv6_hdr->hop_limits; - rte_memcpy(ip_batch[3], &ipv6_hdr->dst_addr, 16); + ip_batch[3] = ipv6_hdr->dst_addr; rte_lpm6_lookup_bulk_func(lpm6, ip_batch, next_hop, 4); @@ -223,7 +223,7 @@ ip6_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node, /* Extract TTL as IPv6 hdr is in cache */ node_mbuf_priv1(mbuf0, dyn)->ttl = ipv6_hdr->hop_limits; - rc = rte_lpm6_lookup(lpm6, ipv6_hdr->dst_addr.a, &next_hop); + rc = rte_lpm6_lookup(lpm6, &ipv6_hdr->dst_addr, &next_hop); next_hop = (rc == 0) ? next_hop : drop_nh; node_mbuf_priv1(mbuf0, dyn)->nh = (uint16_t)next_hop; @@ -278,8 +278,8 @@ rte_node_ip6_route_add(const uint8_t *ip, uint8_t depth, uint16_t next_hop, if (!ip6_lookup_nm.lpm_tbl[socket]) continue; - ret = rte_lpm6_add(ip6_lookup_nm.lpm_tbl[socket], ip, depth, - val); + ret = rte_lpm6_add(ip6_lookup_nm.lpm_tbl[socket], + (const struct rte_ipv6_addr *)ip, depth, val); if (ret < 0) { node_err("ip6_lookup", "Unable to add entry %s / %d nh (%x) to LPM " diff --git a/lib/rib/meson.build b/lib/rib/meson.build index 7bacbb453592..e98f70848189 100644 --- a/lib/rib/meson.build +++ b/lib/rib/meson.build @@ -4,4 +4,4 @@ sources = files('rte_rib.c', 'rte_rib6.c') headers = files('rte_rib.h', 'rte_rib6.h') -deps += ['mempool'] +deps += ['net', 'mempool'] diff --git a/lib/rib/rte_rib6.c b/lib/rib/rte_rib6.c index 89c8390c63be..d0b11b777697 100644 --- a/lib/rib/rte_rib6.c +++ b/lib/rib/rte_rib6.c @@ -35,7 +35,7 @@ struct rte_rib6_node { struct rte_rib6_node *right; struct rte_rib6_node *parent; uint64_t nh; - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ip; uint8_t depth; uint8_t flag; uint64_t ext[]; @@ -79,7 +79,7 @@ is_covered(const uint8_t ip1[RTE_RIB6_IPV6_ADDR_SIZE], } static inline int -get_dir(const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth) +get_dir(const struct rte_ipv6_addr *ip, uint8_t depth) { uint8_t index, msk; @@ -98,12 +98,12 @@ get_dir(const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth) */ msk = 1 << (7 - (depth & 7)); - return (ip[index] & msk) != 0; + return (ip->a[index] & msk) != 0; } static inline struct rte_rib6_node * get_nxt_node(struct rte_rib6_node *node, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]) + const struct rte_ipv6_addr *ip) { if (node->depth == RIB6_MAXDEPTH) return NULL; @@ -133,7 +133,7 @@ node_free(struct rte_rib6 *rib, struct rte_rib6_node *ent) struct rte_rib6_node * rte_rib6_lookup(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]) + const struct rte_ipv6_addr *ip) { struct rte_rib6_node *cur; struct rte_rib6_node *prev = NULL; @@ -144,7 +144,7 @@ rte_rib6_lookup(struct rte_rib6 *rib, } cur = rib->tree; - while ((cur != NULL) && is_covered(ip, cur->ip, cur->depth)) { + while ((cur != NULL) && is_covered(ip->a, cur->ip.a, cur->depth)) { if (is_valid_node(cur)) prev = cur; cur = get_nxt_node(cur, ip); @@ -169,10 +169,10 @@ rte_rib6_lookup_parent(struct rte_rib6_node *ent) struct rte_rib6_node * rte_rib6_lookup_exact(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth) + const struct rte_ipv6_addr *ip, uint8_t depth) { struct rte_rib6_node *cur; - uint8_t tmp_ip[RTE_RIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr tmp_ip; int i; if (unlikely(rib == NULL || ip == NULL || depth > RIB6_MAXDEPTH)) { @@ -182,19 +182,19 @@ rte_rib6_lookup_exact(struct rte_rib6 *rib, cur = rib->tree; for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) - tmp_ip[i] = ip[i] & get_msk_part(depth, i); + tmp_ip.a[i] = ip->a[i] & get_msk_part(depth, i); while (cur != NULL) { - if (rte_rib6_is_equal(cur->ip, tmp_ip) && + if (rte_rib6_is_equal(cur->ip.a, tmp_ip.a) && (cur->depth == depth) && is_valid_node(cur)) return cur; - if (!(is_covered(tmp_ip, cur->ip, cur->depth)) || + if (!(is_covered(tmp_ip.a, cur->ip.a, cur->depth)) || (cur->depth >= depth)) break; - cur = get_nxt_node(cur, tmp_ip); + cur = get_nxt_node(cur, &tmp_ip); } return NULL; @@ -207,11 +207,11 @@ rte_rib6_lookup_exact(struct rte_rib6 *rib, */ struct rte_rib6_node * rte_rib6_get_nxt(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], + const struct rte_ipv6_addr *ip, uint8_t depth, struct rte_rib6_node *last, int flag) { struct rte_rib6_node *tmp, *prev = NULL; - uint8_t tmp_ip[RTE_RIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr tmp_ip; int i; if (unlikely(rib == NULL || ip == NULL || depth > RIB6_MAXDEPTH)) { @@ -220,19 +220,19 @@ rte_rib6_get_nxt(struct rte_rib6 *rib, } for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) - tmp_ip[i] = ip[i] & get_msk_part(depth, i); + tmp_ip.a[i] = ip->a[i] & get_msk_part(depth, i); if (last == NULL) { tmp = rib->tree; while ((tmp) && (tmp->depth < depth)) - tmp = get_nxt_node(tmp, tmp_ip); + tmp = get_nxt_node(tmp, &tmp_ip); } else { tmp = last; while ((tmp->parent != NULL) && (is_right_node(tmp) || (tmp->parent->right == NULL))) { tmp = tmp->parent; if (is_valid_node(tmp) && - (is_covered(tmp->ip, tmp_ip, depth) && + (is_covered(tmp->ip.a, tmp_ip.a, depth) && (tmp->depth > depth))) return tmp; } @@ -240,7 +240,7 @@ rte_rib6_get_nxt(struct rte_rib6 *rib, } while (tmp) { if (is_valid_node(tmp) && - (is_covered(tmp->ip, tmp_ip, depth) && + (is_covered(tmp->ip.a, tmp_ip.a, depth) && (tmp->depth > depth))) { prev = tmp; if (flag == RTE_RIB6_GET_NXT_COVER) @@ -253,7 +253,7 @@ rte_rib6_get_nxt(struct rte_rib6 *rib, void rte_rib6_remove(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth) + const struct rte_ipv6_addr *ip, uint8_t depth) { struct rte_rib6_node *cur, *prev, *child; @@ -286,14 +286,14 @@ rte_rib6_remove(struct rte_rib6 *rib, struct rte_rib6_node * rte_rib6_insert(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth) + const struct rte_ipv6_addr *ip, uint8_t depth) { struct rte_rib6_node **tmp; struct rte_rib6_node *prev = NULL; struct rte_rib6_node *new_node = NULL; struct rte_rib6_node *common_node = NULL; - uint8_t common_prefix[RTE_RIB6_IPV6_ADDR_SIZE]; - uint8_t tmp_ip[RTE_RIB6_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr common_prefix; + struct rte_ipv6_addr tmp_ip; int i, d; uint8_t common_depth, ip_xor; @@ -305,9 +305,9 @@ rte_rib6_insert(struct rte_rib6 *rib, tmp = &rib->tree; for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) - tmp_ip[i] = ip[i] & get_msk_part(depth, i); + tmp_ip.a[i] = ip->a[i] & get_msk_part(depth, i); - new_node = rte_rib6_lookup_exact(rib, tmp_ip, depth); + new_node = rte_rib6_lookup_exact(rib, &tmp_ip, depth); if (new_node != NULL) { rte_errno = EEXIST; return NULL; @@ -321,7 +321,7 @@ rte_rib6_insert(struct rte_rib6 *rib, new_node->left = NULL; new_node->right = NULL; new_node->parent = NULL; - rte_rib6_copy_addr(new_node->ip, tmp_ip); + new_node->ip = tmp_ip; new_node->depth = depth; new_node->flag = RTE_RIB_VALID_NODE; @@ -340,7 +340,7 @@ rte_rib6_insert(struct rte_rib6 *rib, * but node with proper search criteria is found. * Validate intermediate node and return. */ - if (rte_rib6_is_equal(tmp_ip, (*tmp)->ip) && + if (rte_rib6_is_equal(tmp_ip.a, (*tmp)->ip.a) && (depth == (*tmp)->depth)) { node_free(rib, new_node); (*tmp)->flag |= RTE_RIB_VALID_NODE; @@ -348,20 +348,20 @@ rte_rib6_insert(struct rte_rib6 *rib, return *tmp; } - if (!is_covered(tmp_ip, (*tmp)->ip, (*tmp)->depth) || + if (!is_covered(tmp_ip.a, (*tmp)->ip.a, (*tmp)->depth) || ((*tmp)->depth >= depth)) { break; } prev = *tmp; - tmp = (get_dir(tmp_ip, (*tmp)->depth)) ? &(*tmp)->right : + tmp = (get_dir(&tmp_ip, (*tmp)->depth)) ? &(*tmp)->right : &(*tmp)->left; } /* closest node found, new_node should be inserted in the middle */ common_depth = RTE_MIN(depth, (*tmp)->depth); for (i = 0, d = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) { - ip_xor = tmp_ip[i] ^ (*tmp)->ip[i]; + ip_xor = tmp_ip.a[i] ^ (*tmp)->ip.a[i]; if (ip_xor == 0) d += 8; else { @@ -373,12 +373,12 @@ rte_rib6_insert(struct rte_rib6 *rib, common_depth = RTE_MIN(d, common_depth); for (i = 0; i < RTE_RIB6_IPV6_ADDR_SIZE; i++) - common_prefix[i] = tmp_ip[i] & get_msk_part(common_depth, i); + common_prefix.a[i] = tmp_ip.a[i] & get_msk_part(common_depth, i); - if (rte_rib6_is_equal(common_prefix, tmp_ip) && + if (rte_rib6_is_equal(common_prefix.a, tmp_ip.a) && (common_depth == depth)) { /* insert as a parent */ - if (get_dir((*tmp)->ip, depth)) + if (get_dir(&(*tmp)->ip, depth)) new_node->right = *tmp; else new_node->left = *tmp; @@ -393,13 +393,13 @@ rte_rib6_insert(struct rte_rib6 *rib, rte_errno = ENOMEM; return NULL; } - rte_rib6_copy_addr(common_node->ip, common_prefix); + common_node->ip = common_prefix; common_node->depth = common_depth; common_node->flag = 0; common_node->parent = (*tmp)->parent; new_node->parent = common_node; (*tmp)->parent = common_node; - if (get_dir((*tmp)->ip, common_depth) == 1) { + if (get_dir(&(*tmp)->ip, common_depth) == 1) { common_node->left = new_node; common_node->right = *tmp; } else { @@ -414,13 +414,13 @@ rte_rib6_insert(struct rte_rib6 *rib, int rte_rib6_get_ip(const struct rte_rib6_node *node, - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]) + struct rte_ipv6_addr *ip) { if (unlikely(node == NULL || ip == NULL)) { rte_errno = EINVAL; return -1; } - rte_rib6_copy_addr(ip, node->ip); + *ip = node->ip; return 0; } @@ -604,7 +604,7 @@ rte_rib6_free(struct rte_rib6 *rib) while ((tmp = rte_rib6_get_nxt(rib, 0, 0, tmp, RTE_RIB6_GET_NXT_ALL)) != NULL) - rte_rib6_remove(rib, tmp->ip, tmp->depth); + rte_rib6_remove(rib, &tmp->ip, tmp->depth); rte_mempool_free(rib->node_pool); diff --git a/lib/rib/rte_rib6.h b/lib/rib/rte_rib6.h index 775286f965f2..47dcb6d15183 100644 --- a/lib/rib/rte_rib6.h +++ b/lib/rib/rte_rib6.h @@ -16,6 +16,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -124,7 +125,7 @@ get_msk_part(uint8_t depth, int byte) { */ struct rte_rib6_node * rte_rib6_lookup(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]); + const struct rte_ipv6_addr *ip); /** * Lookup less specific route into the RIB structure @@ -154,7 +155,7 @@ rte_rib6_lookup_parent(struct rte_rib6_node *ent); */ struct rte_rib6_node * rte_rib6_lookup_exact(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth); + const struct rte_ipv6_addr *ip, uint8_t depth); /** * Retrieve next more specific prefix from the RIB @@ -181,7 +182,7 @@ rte_rib6_lookup_exact(struct rte_rib6 *rib, */ struct rte_rib6_node * rte_rib6_get_nxt(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], + const struct rte_ipv6_addr *ip, uint8_t depth, struct rte_rib6_node *last, int flag); /** @@ -196,7 +197,7 @@ rte_rib6_get_nxt(struct rte_rib6 *rib, */ void rte_rib6_remove(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth); + const struct rte_ipv6_addr *ip, uint8_t depth); /** * Insert prefix into the RIB @@ -213,7 +214,7 @@ rte_rib6_remove(struct rte_rib6 *rib, */ struct rte_rib6_node * rte_rib6_insert(struct rte_rib6 *rib, - const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth); + const struct rte_ipv6_addr *ip, uint8_t depth); /** * Get an ip from rte_rib6_node @@ -228,7 +229,7 @@ rte_rib6_insert(struct rte_rib6 *rib, */ int rte_rib6_get_ip(const struct rte_rib6_node *node, - uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE]); + struct rte_ipv6_addr *ip); /** * Get a depth from rte_rib6_node diff --git a/lib/table/rte_table_lpm_ipv6.c b/lib/table/rte_table_lpm_ipv6.c index c1a7412f92cf..dea11130d3d5 100644 --- a/lib/table/rte_table_lpm_ipv6.c +++ b/lib/table/rte_table_lpm_ipv6.c @@ -207,7 +207,7 @@ rte_table_lpm_ipv6_entry_add( } /* Check if rule is already present in the table */ - status = rte_lpm6_is_rule_present(lpm->lpm, ip_prefix->ip, + status = rte_lpm6_is_rule_present(lpm->lpm, &ip_prefix->ip, ip_prefix->depth, &nht_pos0); nht_pos0_valid = status > 0; @@ -225,7 +225,7 @@ rte_table_lpm_ipv6_entry_add( } /* Add rule to low level LPM table */ - if (rte_lpm6_add(lpm->lpm, ip_prefix->ip, ip_prefix->depth, + if (rte_lpm6_add(lpm->lpm, &ip_prefix->ip, ip_prefix->depth, nht_pos) < 0) { TABLE_LOG(ERR, "%s: LPM IPv6 rule add failed", __func__); return -1; @@ -270,7 +270,7 @@ rte_table_lpm_ipv6_entry_delete( } /* Return if rule is not present in the table */ - status = rte_lpm6_is_rule_present(lpm->lpm, ip_prefix->ip, + status = rte_lpm6_is_rule_present(lpm->lpm, &ip_prefix->ip, ip_prefix->depth, &nht_pos); if (status < 0) { TABLE_LOG(ERR, "%s: LPM IPv6 algorithmic error", @@ -283,7 +283,7 @@ rte_table_lpm_ipv6_entry_delete( } /* Delete rule from the low-level LPM table */ - status = rte_lpm6_delete(lpm->lpm, ip_prefix->ip, ip_prefix->depth); + status = rte_lpm6_delete(lpm->lpm, &ip_prefix->ip, ip_prefix->depth); if (status) { TABLE_LOG(ERR, "%s: LPM IPv6 rule delete failed", __func__); @@ -323,11 +323,11 @@ rte_table_lpm_ipv6_lookup( if (pkt_mask & pkts_mask) { struct rte_mbuf *pkt = pkts[i]; - uint8_t *ip = RTE_MBUF_METADATA_UINT8_PTR(pkt, - lpm->offset); + const struct rte_ipv6_addr *ip; int status; uint32_t nht_pos; + ip = (struct rte_ipv6_addr *)RTE_MBUF_METADATA_UINT8_PTR(pkt, lpm->offset); status = rte_lpm6_lookup(lpm->lpm, ip, &nht_pos); if (status == 0) { pkts_out_mask |= pkt_mask; diff --git a/lib/table/rte_table_lpm_ipv6.h b/lib/table/rte_table_lpm_ipv6.h index 166a5ba9ee67..3ea888360635 100644 --- a/lib/table/rte_table_lpm_ipv6.h +++ b/lib/table/rte_table_lpm_ipv6.h @@ -39,13 +39,16 @@ #include +#include +#include + #include "rte_table.h" #ifdef __cplusplus extern "C" { #endif -#define RTE_LPM_IPV6_ADDR_SIZE 16 +#define RTE_LPM_IPV6_ADDR_SIZE (RTE_DEPRECATED(RTE_LPM_IPV6_ADDR_SIZE) RTE_IPV6_ADDR_SIZE) /** LPM table parameters */ struct rte_table_lpm_ipv6_params { @@ -73,7 +76,7 @@ each rule covering for a multitude of lookup keys (destination IP addresses) that share the same data (next hop). */ struct rte_table_lpm_ipv6_key { /** IP address */ - uint8_t ip[RTE_LPM_IPV6_ADDR_SIZE]; + struct rte_ipv6_addr ip; /** IP address depth. The most significant "depth" bits of the IP address specify the network part of the IP address, while the rest of -- 2.46.2