From af75078fece3615088e561357c1e97603e43a5fe Mon Sep 17 00:00:00 2001 From: Intel Date: Tue, 4 Sep 2012 13:54:00 +0100 Subject: first public release version 1.2.3 Signed-off-by: Intel --- Makefile | 47 + app/Makefile | 42 + app/chkincs/Makefile | 96 + app/chkincs/test.c | 50 + app/chkincs/test.h | 90 + app/chkincs/test_alarm.c | 53 + app/chkincs/test_atomic.c | 93 + app/chkincs/test_branch_prediction.c | 58 + app/chkincs/test_byteorder.c | 84 + app/chkincs/test_common.c | 76 + app/chkincs/test_cpuflags.c | 53 + app/chkincs/test_cycles.c | 63 + app/chkincs/test_debug.c | 55 + app/chkincs/test_eal.c | 52 + app/chkincs/test_errno.c | 54 + app/chkincs/test_ethdev.c | 72 + app/chkincs/test_ether.c | 52 + app/chkincs/test_fbk_hash.c | 53 + app/chkincs/test_hash.c | 85 + app/chkincs/test_hash_crc.c | 52 + app/chkincs/test_interrupts.c | 53 + app/chkincs/test_ip.c | 53 + app/chkincs/test_jhash.c | 54 + app/chkincs/test_launch.c | 68 + app/chkincs/test_lcore.c | 66 + app/chkincs/test_log.c | 58 + app/chkincs/test_lpm.c | 64 + app/chkincs/test_malloc.c | 57 + app/chkincs/test_mbuf.c | 110 + app/chkincs/test_memcpy.c | 58 + app/chkincs/test_memory.c | 65 + app/chkincs/test_mempool.c | 111 + app/chkincs/test_memzone.c | 61 + app/chkincs/test_pci.c | 86 + app/chkincs/test_pci_dev_ids.c | 60 + app/chkincs/test_per_lcore.c | 57 + app/chkincs/test_prefetch.c | 58 + app/chkincs/test_random.c | 54 + app/chkincs/test_ring.c | 97 + app/chkincs/test_rwlock.c | 60 + app/chkincs/test_sctp.c | 52 + app/chkincs/test_spinlock.c | 59 + app/chkincs/test_string_fns.c | 52 + app/chkincs/test_tailq.c | 55 + app/chkincs/test_tcp.c | 52 + app/chkincs/test_timer.c | 74 + app/chkincs/test_udp.c | 52 + app/chkincs/test_version.c | 52 + app/dump_cfg/Makefile | 49 + app/dump_cfg/dump_cfg_main.c | 229 + app/test-pmd/Makefile | 63 + app/test-pmd/cmdline.c | 2180 ++ app/test-pmd/config.c | 1142 + app/test-pmd/csumonly.c | 449 + app/test-pmd/ieee1588fwd.c | 657 + app/test-pmd/iofwd.c | 131 + app/test-pmd/macfwd.c | 148 + app/test-pmd/parameters.c | 646 + app/test-pmd/rxonly.c | 194 + app/test-pmd/testpmd.c | 1105 + app/test-pmd/testpmd.h | 413 + app/test-pmd/txonly.c | 317 + app/test/Makefile | 82 + app/test/autotest.py | 664 + app/test/commands.c | 391 + app/test/graph_mempool.py | 193 + app/test/graph_ring.py | 201 + app/test/process.h | 89 + app/test/test.c | 153 + app/test/test.h | 85 + app/test/test_alarm.c | 258 + app/test/test_atomic.c | 381 + app/test/test_byteorder.c | 97 + app/test/test_cpuflags.c | 134 + app/test/test_cycles.c | 94 + app/test/test_debug.c | 150 + app/test/test_eal_flags.c | 303 + app/test/test_errno.c | 110 + app/test/test_hash.c | 1785 ++ app/test/test_interrupts.c | 419 + app/test/test_logs.c | 96 + app/test/test_lpm.c | 1365 + app/test/test_lpm_routes.h | 28947 +++++++++++++++++++ app/test/test_malloc.c | 776 + app/test/test_mbuf.c | 875 + app/test/test_memcpy.c | 429 + app/test/test_memory.c | 92 + app/test/test_mempool.c | 707 + app/test/test_memzone.c | 639 + app/test/test_mp_secondary.c | 236 + app/test/test_pci.c | 192 + app/test/test_per_lcore.c | 142 + app/test/test_prefetch.c | 63 + app/test/test_ring.c | 987 + app/test/test_rwlock.c | 135 + app/test/test_spinlock.c | 318 + app/test/test_string_fns.c | 305 + app/test/test_tailq.c | 125 + app/test/test_timer.c | 363 + app/test/test_version.c | 59 + config/defconfig_i686-default-linuxapp-gcc | 240 + config/defconfig_i686-default-linuxapp-icc | 230 + config/defconfig_x86_64-default-linuxapp-gcc | 240 + config/defconfig_x86_64-default-linuxapp-icc | 230 + .../482246_CmdLine_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 53739 bytes examples/cmdline/Makefile | 52 + examples/cmdline/commands.c | 282 + examples/cmdline/commands.h | 41 + examples/cmdline/main.c | 100 + examples/cmdline/main.h | 47 + examples/cmdline/parse_obj_list.c | 164 + examples/cmdline/parse_obj_list.h | 113 + ...kAssist_in_DPDK_Env_Sample_App_Guide_Rev1.0.pdf | Bin 0 -> 99638 bytes examples/dpdk_qat/Makefile | 81 + .../config_files/shumway_B0/dh89xxcc_qa_dev0.conf | 537 + .../config_files/shumway_B0/dh89xxcc_qa_dev1.conf | 537 + .../config_files/stargo_B0/dh89xxcc_qa_dev0.conf | 409 + examples/dpdk_qat/crypto.c | 921 + examples/dpdk_qat/crypto.h | 88 + examples/dpdk_qat/main.c | 857 + examples/dpdk_qat/main.h | 47 + ...82248_ExceptionPath_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 77734 bytes examples/exception_path/Makefile | 57 + examples/exception_path/main.c | 569 + .../482249_HelloWorld_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 48353 bytes examples/helloworld/Makefile | 52 + examples/helloworld/main.c | 82 + examples/helloworld/main.h | 47 + .../490761_IPv4_Frag_Sample_App_Guide_Rev1.0.pdf | Bin 0 -> 67178 bytes examples/ipv4_frag/Makefile | 63 + examples/ipv4_frag/main.c | 707 + examples/ipv4_frag/main.h | 48 + examples/ipv4_frag/rte_ipv4_frag.h | 253 + ...6632_IPv4_Multicast_Sample_App_Guide_Rev1.0.pdf | Bin 0 -> 109644 bytes examples/ipv4_multicast/Makefile | 63 + examples/ipv4_multicast/main.c | 834 + examples/ipv4_multicast/main.h | 48 + ...2Forwarding_VirtEnv_Sample_App_Guide_Rev1.0.pdf | Bin 0 -> 70953 bytes examples/l2fwd-vf/Makefile | 53 + examples/l2fwd-vf/main.c | 708 + examples/l2fwd-vf/main.h | 47 + ...482250_L2Forwarding_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 80691 bytes examples/l2fwd/Makefile | 52 + examples/l2fwd/main.c | 745 + examples/l2fwd/main.h | 47 + ...3Forwarding_VirtEnv_Sample_App_Guide_Rev1.0.pdf | Bin 0 -> 52089 bytes examples/l3fwd-vf/Makefile | 58 + examples/l3fwd-vf/main.c | 1079 + examples/l3fwd-vf/main.h | 47 + ...482251_L3Forwarding_Sample_App_Guide_Rev1.2.pdf | Bin 0 -> 61714 bytes examples/l3fwd/Makefile | 58 + examples/l3fwd/main.c | 1118 + examples/l3fwd/main.h | 47 + ...nk_Status_Interrupt_Sample_App_Guide_Rev1.0.pdf | Bin 0 -> 70985 bytes examples/link_status_interrupt/Makefile | 52 + examples/link_status_interrupt/main.c | 792 + examples/link_status_interrupt/main.h | 47 + ...482252_LoadBalancer_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 62413 bytes examples/load_balancer/Makefile | 58 + examples/load_balancer/config.c | 1058 + examples/load_balancer/init.c | 507 + examples/load_balancer/main.c | 112 + examples/load_balancer/main.h | 377 + examples/load_balancer/runtime.c | 669 + ...82253_Multi_Process_Sample_App_Guide_Rev1.3.pdf | Bin 0 -> 144607 bytes examples/multi_process/Makefile | 49 + examples/multi_process/client_server_mp/Makefile | 49 + .../client_server_mp/mp_client/Makefile | 50 + .../client_server_mp/mp_client/client.c | 294 + .../client_server_mp/mp_server/Makefile | 63 + .../client_server_mp/mp_server/args.c | 175 + .../client_server_mp/mp_server/args.h | 41 + .../client_server_mp/mp_server/init.c | 304 + .../client_server_mp/mp_server/init.h | 74 + .../client_server_mp/mp_server/main.c | 330 + .../client_server_mp/mp_server/main.h | 50 + .../multi_process/client_server_mp/shared/common.h | 89 + .../client_server_mp/shared/init_drivers.h | 58 + examples/multi_process/simple_mp/Makefile | 52 + examples/multi_process/simple_mp/main.c | 160 + examples/multi_process/simple_mp/mp_commands.c | 169 + examples/multi_process/simple_mp/mp_commands.h | 46 + examples/multi_process/symmetric_mp/Makefile | 52 + examples/multi_process/symmetric_mp/main.c | 471 + .../timer/482254_Timer_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 52612 bytes examples/timer/Makefile | 58 + examples/timer/main.c | 156 + examples/timer/main.h | 47 + ...2255_VMDQ_DCB_L2Fwd_Sample_App_Guide_Rev1.1.pdf | Bin 0 -> 71737 bytes examples/vmdq_dcb/Makefile | 59 + examples/vmdq_dcb/main.c | 331 + examples/vmdq_dcb/main.h | 48 + lib/Makefile | 51 + lib/librte_cmdline/Makefile | 65 + lib/librte_cmdline/cmdline.c | 240 + lib/librte_cmdline/cmdline.h | 94 + lib/librte_cmdline/cmdline_cirbuf.c | 434 + lib/librte_cmdline/cmdline_cirbuf.h | 248 + lib/librte_cmdline/cmdline_parse.c | 544 + lib/librte_cmdline/cmdline_parse.h | 188 + lib/librte_cmdline/cmdline_parse_etheraddr.c | 172 + lib/librte_cmdline/cmdline_parse_etheraddr.h | 102 + lib/librte_cmdline/cmdline_parse_ipaddr.c | 383 + lib/librte_cmdline/cmdline_parse_ipaddr.h | 194 + lib/librte_cmdline/cmdline_parse_num.c | 493 + lib/librte_cmdline/cmdline_parse_num.h | 119 + lib/librte_cmdline/cmdline_parse_portlist.c | 172 + lib/librte_cmdline/cmdline_parse_portlist.h | 113 + lib/librte_cmdline/cmdline_parse_string.c | 228 + lib/librte_cmdline/cmdline_parse_string.h | 113 + lib/librte_cmdline/cmdline_rdline.c | 675 + lib/librte_cmdline/cmdline_rdline.h | 260 + lib/librte_cmdline/cmdline_socket.c | 120 + lib/librte_cmdline/cmdline_socket.h | 78 + lib/librte_cmdline/cmdline_vt100.c | 182 + lib/librte_cmdline/cmdline_vt100.h | 153 + lib/librte_eal/Makefile | 41 + lib/librte_eal/common/Makefile | 56 + lib/librte_eal/common/eal_common_cpuflags.c | 265 + lib/librte_eal/common/eal_common_errno.c | 72 + lib/librte_eal/common/eal_common_launch.c | 122 + lib/librte_eal/common/eal_common_log.c | 390 + lib/librte_eal/common/eal_common_memory.c | 116 + lib/librte_eal/common/eal_common_memzone.c | 376 + lib/librte_eal/common/eal_common_pci.c | 145 + lib/librte_eal/common/eal_common_tailqs.c | 113 + lib/librte_eal/common/include/eal_private.h | 176 + .../common/include/i686/arch/rte_atomic.h | 959 + lib/librte_eal/common/include/rte_alarm.h | 100 + lib/librte_eal/common/include/rte_atomic.h | 657 + .../common/include/rte_branch_prediction.h | 72 + lib/librte_eal/common/include/rte_byteorder.h | 244 + lib/librte_eal/common/include/rte_common.h | 310 + lib/librte_eal/common/include/rte_cpuflags.h | 174 + lib/librte_eal/common/include/rte_cycles.h | 120 + lib/librte_eal/common/include/rte_debug.h | 96 + lib/librte_eal/common/include/rte_eal.h | 174 + lib/librte_eal/common/include/rte_errno.h | 98 + lib/librte_eal/common/include/rte_interrupts.h | 123 + lib/librte_eal/common/include/rte_launch.h | 179 + lib/librte_eal/common/include/rte_lcore.h | 191 + lib/librte_eal/common/include/rte_log.h | 290 + lib/librte_eal/common/include/rte_memcpy.h | 355 + lib/librte_eal/common/include/rte_memory.h | 143 + lib/librte_eal/common/include/rte_memzone.h | 200 + lib/librte_eal/common/include/rte_pci.h | 197 + lib/librte_eal/common/include/rte_pci_dev_ids.h | 205 + lib/librte_eal/common/include/rte_per_lcore.h | 81 + lib/librte_eal/common/include/rte_prefetch.h | 90 + lib/librte_eal/common/include/rte_random.h | 93 + lib/librte_eal/common/include/rte_rwlock.h | 174 + lib/librte_eal/common/include/rte_spinlock.h | 243 + lib/librte_eal/common/include/rte_string_fns.h | 165 + lib/librte_eal/common/include/rte_tailq.h | 146 + lib/librte_eal/common/include/rte_version.h | 85 + lib/librte_eal/common/include/rte_warnings.h | 88 + .../common/include/x86_64/arch/rte_atomic.h | 943 + lib/librte_eal/linuxapp/Makefile | 39 + lib/librte_eal/linuxapp/eal/Makefile | 91 + lib/librte_eal/linuxapp/eal/eal.c | 620 + lib/librte_eal/linuxapp/eal/eal_alarm.c | 232 + lib/librte_eal/linuxapp/eal/eal_debug.c | 114 + lib/librte_eal/linuxapp/eal/eal_hpet.c | 232 + lib/librte_eal/linuxapp/eal/eal_hugepage_info.c | 229 + lib/librte_eal/linuxapp/eal/eal_interrupts.c | 540 + lib/librte_eal/linuxapp/eal/eal_lcore.c | 192 + lib/librte_eal/linuxapp/eal/eal_log.c | 137 + lib/librte_eal/linuxapp/eal/eal_memory.c | 796 + lib/librte_eal/linuxapp/eal/eal_pci.c | 770 + lib/librte_eal/linuxapp/eal/eal_thread.c | 237 + lib/librte_eal/linuxapp/eal/include/eal_fs_paths.h | 96 + .../linuxapp/eal/include/eal_hugepages.h | 62 + .../linuxapp/eal/include/eal_internal_cfg.h | 76 + lib/librte_eal/linuxapp/eal/include/eal_thread.h | 55 + .../linuxapp/eal/include/exec-env/rte_interrupts.h | 56 + .../linuxapp/eal/include/exec-env/rte_lcore.h | 92 + .../linuxapp/eal/include/exec-env/rte_per_lcore.h | 69 + lib/librte_eal/linuxapp/igb_uio/Makefile | 55 + lib/librte_eal/linuxapp/igb_uio/igb_uio.c | 402 + lib/librte_ether/Makefile | 55 + lib/librte_ether/rte_ethdev.c | 1381 + lib/librte_ether/rte_ethdev.h | 1809 ++ lib/librte_ether/rte_ether.h | 256 + lib/librte_hash/Makefile | 55 + lib/librte_hash/rte_fbk_hash.c | 210 + lib/librte_hash/rte_fbk_hash.h | 334 + lib/librte_hash/rte_hash.c | 407 + lib/librte_hash/rte_hash.h | 236 + lib/librte_hash/rte_hash_crc.h | 114 + lib/librte_hash/rte_jhash.h | 263 + lib/librte_lpm/Makefile | 51 + lib/librte_lpm/rte_lpm.c | 971 + lib/librte_lpm/rte_lpm.h | 288 + lib/librte_malloc/Makefile | 50 + lib/librte_malloc/malloc_elem.c | 280 + lib/librte_malloc/malloc_elem.h | 177 + lib/librte_malloc/malloc_heap.c | 181 + lib/librte_malloc/malloc_heap.h | 68 + lib/librte_malloc/rte_malloc.c | 166 + lib/librte_malloc/rte_malloc.h | 212 + lib/librte_mbuf/Makefile | 50 + lib/librte_mbuf/rte_mbuf.c | 252 + lib/librte_mbuf/rte_mbuf.h | 1019 + lib/librte_mempool/Makefile | 50 + lib/librte_mempool/rte_mempool.c | 491 + lib/librte_mempool/rte_mempool.h | 1087 + lib/librte_net/Makefile | 42 + lib/librte_net/rte_ip.h | 255 + lib/librte_net/rte_sctp.h | 101 + lib/librte_net/rte_tcp.h | 106 + lib/librte_net/rte_udp.h | 101 + lib/librte_pmd_igb/Makefile | 64 + lib/librte_pmd_igb/e1000_ethdev.c | 1319 + lib/librte_pmd_igb/e1000_ethdev.h | 117 + lib/librte_pmd_igb/e1000_logs.h | 74 + lib/librte_pmd_igb/e1000_rxtx.c | 1859 ++ lib/librte_pmd_igb/igb/README | 74 + lib/librte_pmd_igb/igb/e1000_82575.c | 2429 ++ lib/librte_pmd_igb/igb/e1000_82575.h | 487 + lib/librte_pmd_igb/igb/e1000_api.c | 1152 + lib/librte_pmd_igb/igb/e1000_api.h | 156 + lib/librte_pmd_igb/igb/e1000_defines.h | 1733 ++ lib/librte_pmd_igb/igb/e1000_hw.h | 767 + lib/librte_pmd_igb/igb/e1000_mac.c | 2170 ++ lib/librte_pmd_igb/igb/e1000_mac.h | 95 + lib/librte_pmd_igb/igb/e1000_manage.c | 472 + lib/librte_pmd_igb/igb/e1000_manage.h | 90 + lib/librte_pmd_igb/igb/e1000_mbx.c | 764 + lib/librte_pmd_igb/igb/e1000_mbx.h | 106 + lib/librte_pmd_igb/igb/e1000_nvm.c | 1071 + lib/librte_pmd_igb/igb/e1000_nvm.h | 66 + lib/librte_pmd_igb/igb/e1000_osdep.c | 72 + lib/librte_pmd_igb/igb/e1000_osdep.h | 128 + lib/librte_pmd_igb/igb/e1000_phy.c | 2988 ++ lib/librte_pmd_igb/igb/e1000_phy.h | 217 + lib/librte_pmd_igb/igb/e1000_regs.h | 574 + lib/librte_pmd_igb/igb/e1000_vf.c | 574 + lib/librte_pmd_igb/igb/e1000_vf.h | 294 + lib/librte_pmd_igb/igb/if_igb.c | 5567 ++++ lib/librte_pmd_igb/igb/if_igb.h | 541 + lib/librte_pmd_ixgbe/Makefile | 65 + lib/librte_pmd_ixgbe/ixgbe/README | 70 + lib/librte_pmd_ixgbe/ixgbe/ixgbe.c | 5442 ++++ lib/librte_pmd_ixgbe/ixgbe/ixgbe.h | 521 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_82598.c | 1402 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_82599.c | 2281 ++ lib/librte_pmd_ixgbe/ixgbe/ixgbe_api.c | 1130 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_api.h | 168 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_common.c | 4049 +++ lib/librte_pmd_ixgbe/ixgbe/ixgbe_common.h | 135 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_mbx.c | 751 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_mbx.h | 112 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_osdep.h | 145 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_phy.c | 1843 ++ lib/librte_pmd_ixgbe/ixgbe/ixgbe_phy.h | 141 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h | 3138 ++ lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c | 524 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.h | 113 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_x540.c | 989 + lib/librte_pmd_ixgbe/ixgbe/ixgbe_x540.h | 42 + lib/librte_pmd_ixgbe/ixgbe/ixv.c | 4010 +++ lib/librte_pmd_ixgbe/ixgbe/ixv.h | 430 + lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 1609 ++ lib/librte_pmd_ixgbe/ixgbe_ethdev.h | 176 + lib/librte_pmd_ixgbe/ixgbe_fdir.c | 891 + lib/librte_pmd_ixgbe/ixgbe_logs.h | 76 + lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 2445 ++ lib/librte_ring/Makefile | 50 + lib/librte_ring/rte_ring.c | 283 + lib/librte_ring/rte_ring.h | 830 + lib/librte_timer/Makefile | 50 + lib/librte_timer/rte_timer.c | 506 + lib/librte_timer/rte_timer.h | 332 + mk/arch/i686/rte.vars.mk | 59 + mk/arch/x86_64/rte.vars.mk | 59 + mk/exec-env/linuxapp/rte.app.mk | 38 + mk/exec-env/linuxapp/rte.vars.mk | 52 + mk/internal/rte.build-post.mk | 64 + mk/internal/rte.build-pre.mk | 34 + mk/internal/rte.clean-post.mk | 64 + mk/internal/rte.clean-pre.mk | 34 + mk/internal/rte.compile-post.mk | 35 + mk/internal/rte.compile-pre.mk | 178 + mk/internal/rte.depdirs-post.mk | 44 + mk/internal/rte.depdirs-pre.mk | 34 + mk/internal/rte.exthelp-post.mk | 41 + mk/internal/rte.install-post.mk | 101 + mk/internal/rte.install-pre.mk | 62 + mk/machine/atm/rte.vars.mk | 61 + mk/machine/default/rte.vars.mk | 61 + mk/machine/ivb/rte.vars.mk | 61 + mk/machine/native/rte.vars.mk | 111 + mk/machine/nhm/rte.vars.mk | 61 + mk/machine/snb/rte.vars.mk | 61 + mk/machine/wsm/rte.vars.mk | 61 + mk/rte.app.mk | 236 + mk/rte.doc.mk | 127 + mk/rte.extapp.mk | 56 + mk/rte.extlib.mk | 56 + mk/rte.extobj.mk | 56 + mk/rte.extvars.mk | 83 + mk/rte.gnuconfigure.mk | 76 + mk/rte.hostapp.mk | 125 + mk/rte.hostlib.mk | 118 + mk/rte.install.mk | 60 + mk/rte.lib.mk | 116 + mk/rte.module.mk | 117 + mk/rte.obj.mk | 114 + mk/rte.sdkbuild.mk | 102 + mk/rte.sdkconfig.mk | 109 + mk/rte.sdkdepdirs.mk | 65 + mk/rte.sdkdoc.mk | 73 + mk/rte.sdkgcov.mk | 69 + mk/rte.sdkinstall.mk | 76 + mk/rte.sdkroot.mk | 158 + mk/rte.sdktest.mk | 66 + mk/rte.sdktestall.mk | 65 + mk/rte.subdir.mk | 114 + mk/rte.vars.mk | 125 + mk/target/generic/rte.app.mk | 43 + mk/target/generic/rte.vars.mk | 150 + mk/toolchain/gcc/rte.toolchain-compat.mk | 93 + mk/toolchain/gcc/rte.vars.mk | 87 + mk/toolchain/icc/rte.toolchain-compat.mk | 82 + mk/toolchain/icc/rte.vars.mk | 98 + scripts/Makefile | 38 + scripts/depdirs-rule.sh | 97 + scripts/gen-build-mk.sh | 55 + scripts/gen-config-h.sh | 41 + scripts/import_autotest.sh | 87 + scripts/relpath.sh | 100 + scripts/test-framework.sh | 133 + scripts/testhost/Makefile | 50 + scripts/testhost/testhost.c | 57 + tools/setup.sh | 420 + 435 files changed, 169022 insertions(+) create mode 100644 Makefile create mode 100644 app/Makefile create mode 100644 app/chkincs/Makefile create mode 100644 app/chkincs/test.c create mode 100644 app/chkincs/test.h create mode 100644 app/chkincs/test_alarm.c create mode 100644 app/chkincs/test_atomic.c create mode 100644 app/chkincs/test_branch_prediction.c create mode 100644 app/chkincs/test_byteorder.c create mode 100644 app/chkincs/test_common.c create mode 100644 app/chkincs/test_cpuflags.c create mode 100644 app/chkincs/test_cycles.c create mode 100644 app/chkincs/test_debug.c create mode 100644 app/chkincs/test_eal.c create mode 100644 app/chkincs/test_errno.c create mode 100644 app/chkincs/test_ethdev.c create mode 100644 app/chkincs/test_ether.c create mode 100644 app/chkincs/test_fbk_hash.c create mode 100644 app/chkincs/test_hash.c create mode 100644 app/chkincs/test_hash_crc.c create mode 100644 app/chkincs/test_interrupts.c create mode 100644 app/chkincs/test_ip.c create mode 100644 app/chkincs/test_jhash.c create mode 100644 app/chkincs/test_launch.c create mode 100644 app/chkincs/test_lcore.c create mode 100644 app/chkincs/test_log.c create mode 100644 app/chkincs/test_lpm.c create mode 100644 app/chkincs/test_malloc.c create mode 100644 app/chkincs/test_mbuf.c create mode 100644 app/chkincs/test_memcpy.c create mode 100644 app/chkincs/test_memory.c create mode 100644 app/chkincs/test_mempool.c create mode 100644 app/chkincs/test_memzone.c create mode 100644 app/chkincs/test_pci.c create mode 100644 app/chkincs/test_pci_dev_ids.c create mode 100644 app/chkincs/test_per_lcore.c create mode 100644 app/chkincs/test_prefetch.c create mode 100644 app/chkincs/test_random.c create mode 100644 app/chkincs/test_ring.c create mode 100644 app/chkincs/test_rwlock.c create mode 100644 app/chkincs/test_sctp.c create mode 100644 app/chkincs/test_spinlock.c create mode 100644 app/chkincs/test_string_fns.c create mode 100644 app/chkincs/test_tailq.c create mode 100644 app/chkincs/test_tcp.c create mode 100644 app/chkincs/test_timer.c create mode 100644 app/chkincs/test_udp.c create mode 100644 app/chkincs/test_version.c create mode 100644 app/dump_cfg/Makefile create mode 100644 app/dump_cfg/dump_cfg_main.c create mode 100644 app/test-pmd/Makefile create mode 100644 app/test-pmd/cmdline.c create mode 100644 app/test-pmd/config.c create mode 100644 app/test-pmd/csumonly.c create mode 100644 app/test-pmd/ieee1588fwd.c create mode 100644 app/test-pmd/iofwd.c create mode 100644 app/test-pmd/macfwd.c create mode 100644 app/test-pmd/parameters.c create mode 100644 app/test-pmd/rxonly.c create mode 100644 app/test-pmd/testpmd.c create mode 100644 app/test-pmd/testpmd.h create mode 100644 app/test-pmd/txonly.c create mode 100644 app/test/Makefile create mode 100755 app/test/autotest.py create mode 100644 app/test/commands.c create mode 100755 app/test/graph_mempool.py create mode 100755 app/test/graph_ring.py create mode 100644 app/test/process.h create mode 100644 app/test/test.c create mode 100644 app/test/test.h create mode 100644 app/test/test_alarm.c create mode 100644 app/test/test_atomic.c create mode 100644 app/test/test_byteorder.c create mode 100644 app/test/test_cpuflags.c create mode 100644 app/test/test_cycles.c create mode 100644 app/test/test_debug.c create mode 100644 app/test/test_eal_flags.c create mode 100644 app/test/test_errno.c create mode 100644 app/test/test_hash.c create mode 100644 app/test/test_interrupts.c create mode 100644 app/test/test_logs.c create mode 100644 app/test/test_lpm.c create mode 100644 app/test/test_lpm_routes.h create mode 100644 app/test/test_malloc.c create mode 100644 app/test/test_mbuf.c create mode 100644 app/test/test_memcpy.c create mode 100644 app/test/test_memory.c create mode 100644 app/test/test_mempool.c create mode 100644 app/test/test_memzone.c create mode 100644 app/test/test_mp_secondary.c create mode 100644 app/test/test_pci.c create mode 100644 app/test/test_per_lcore.c create mode 100644 app/test/test_prefetch.c create mode 100644 app/test/test_ring.c create mode 100644 app/test/test_rwlock.c create mode 100644 app/test/test_spinlock.c create mode 100644 app/test/test_string_fns.c create mode 100644 app/test/test_tailq.c create mode 100644 app/test/test_timer.c create mode 100644 app/test/test_version.c create mode 100644 config/defconfig_i686-default-linuxapp-gcc create mode 100644 config/defconfig_i686-default-linuxapp-icc create mode 100644 config/defconfig_x86_64-default-linuxapp-gcc create mode 100644 config/defconfig_x86_64-default-linuxapp-icc create mode 100644 examples/cmdline/482246_CmdLine_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/cmdline/Makefile create mode 100644 examples/cmdline/commands.c create mode 100644 examples/cmdline/commands.h create mode 100644 examples/cmdline/main.c create mode 100644 examples/cmdline/main.h create mode 100644 examples/cmdline/parse_obj_list.c create mode 100644 examples/cmdline/parse_obj_list.h create mode 100644 examples/dpdk_qat/497691_QuickAssist_in_DPDK_Env_Sample_App_Guide_Rev1.0.pdf create mode 100644 examples/dpdk_qat/Makefile create mode 100644 examples/dpdk_qat/config_files/shumway_B0/dh89xxcc_qa_dev0.conf create mode 100644 examples/dpdk_qat/config_files/shumway_B0/dh89xxcc_qa_dev1.conf create mode 100644 examples/dpdk_qat/config_files/stargo_B0/dh89xxcc_qa_dev0.conf create mode 100644 examples/dpdk_qat/crypto.c create mode 100644 examples/dpdk_qat/crypto.h create mode 100644 examples/dpdk_qat/main.c create mode 100644 examples/dpdk_qat/main.h create mode 100644 examples/exception_path/482248_ExceptionPath_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/exception_path/Makefile create mode 100644 examples/exception_path/main.c create mode 100644 examples/helloworld/482249_HelloWorld_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/helloworld/Makefile create mode 100644 examples/helloworld/main.c create mode 100644 examples/helloworld/main.h create mode 100644 examples/ipv4_frag/490761_IPv4_Frag_Sample_App_Guide_Rev1.0.pdf create mode 100644 examples/ipv4_frag/Makefile create mode 100644 examples/ipv4_frag/main.c create mode 100644 examples/ipv4_frag/main.h create mode 100644 examples/ipv4_frag/rte_ipv4_frag.h create mode 100644 examples/ipv4_multicast/496632_IPv4_Multicast_Sample_App_Guide_Rev1.0.pdf create mode 100644 examples/ipv4_multicast/Makefile create mode 100644 examples/ipv4_multicast/main.c create mode 100644 examples/ipv4_multicast/main.h create mode 100644 examples/l2fwd-vf/496039_L2Forwarding_VirtEnv_Sample_App_Guide_Rev1.0.pdf create mode 100644 examples/l2fwd-vf/Makefile create mode 100644 examples/l2fwd-vf/main.c create mode 100644 examples/l2fwd-vf/main.h create mode 100644 examples/l2fwd/482250_L2Forwarding_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/l2fwd/Makefile create mode 100644 examples/l2fwd/main.c create mode 100644 examples/l2fwd/main.h create mode 100644 examples/l3fwd-vf/496040_L3Forwarding_VirtEnv_Sample_App_Guide_Rev1.0.pdf create mode 100644 examples/l3fwd-vf/Makefile create mode 100644 examples/l3fwd-vf/main.c create mode 100644 examples/l3fwd-vf/main.h create mode 100644 examples/l3fwd/482251_L3Forwarding_Sample_App_Guide_Rev1.2.pdf create mode 100644 examples/l3fwd/Makefile create mode 100644 examples/l3fwd/main.c create mode 100644 examples/l3fwd/main.h create mode 100644 examples/link_status_interrupt/495672_Link_Status_Interrupt_Sample_App_Guide_Rev1.0.pdf create mode 100644 examples/link_status_interrupt/Makefile create mode 100644 examples/link_status_interrupt/main.c create mode 100644 examples/link_status_interrupt/main.h create mode 100644 examples/load_balancer/482252_LoadBalancer_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/load_balancer/Makefile create mode 100644 examples/load_balancer/config.c create mode 100644 examples/load_balancer/init.c create mode 100644 examples/load_balancer/main.c create mode 100644 examples/load_balancer/main.h create mode 100644 examples/load_balancer/runtime.c create mode 100644 examples/multi_process/482253_Multi_Process_Sample_App_Guide_Rev1.3.pdf create mode 100644 examples/multi_process/Makefile create mode 100644 examples/multi_process/client_server_mp/Makefile create mode 100644 examples/multi_process/client_server_mp/mp_client/Makefile create mode 100644 examples/multi_process/client_server_mp/mp_client/client.c create mode 100644 examples/multi_process/client_server_mp/mp_server/Makefile create mode 100644 examples/multi_process/client_server_mp/mp_server/args.c create mode 100644 examples/multi_process/client_server_mp/mp_server/args.h create mode 100644 examples/multi_process/client_server_mp/mp_server/init.c create mode 100644 examples/multi_process/client_server_mp/mp_server/init.h create mode 100644 examples/multi_process/client_server_mp/mp_server/main.c create mode 100644 examples/multi_process/client_server_mp/mp_server/main.h create mode 100644 examples/multi_process/client_server_mp/shared/common.h create mode 100644 examples/multi_process/client_server_mp/shared/init_drivers.h create mode 100644 examples/multi_process/simple_mp/Makefile create mode 100644 examples/multi_process/simple_mp/main.c create mode 100644 examples/multi_process/simple_mp/mp_commands.c create mode 100644 examples/multi_process/simple_mp/mp_commands.h create mode 100644 examples/multi_process/symmetric_mp/Makefile create mode 100644 examples/multi_process/symmetric_mp/main.c create mode 100644 examples/timer/482254_Timer_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/timer/Makefile create mode 100644 examples/timer/main.c create mode 100644 examples/timer/main.h create mode 100644 examples/vmdq_dcb/482255_VMDQ_DCB_L2Fwd_Sample_App_Guide_Rev1.1.pdf create mode 100644 examples/vmdq_dcb/Makefile create mode 100644 examples/vmdq_dcb/main.c create mode 100644 examples/vmdq_dcb/main.h create mode 100644 lib/Makefile create mode 100644 lib/librte_cmdline/Makefile create mode 100644 lib/librte_cmdline/cmdline.c create mode 100644 lib/librte_cmdline/cmdline.h create mode 100644 lib/librte_cmdline/cmdline_cirbuf.c create mode 100644 lib/librte_cmdline/cmdline_cirbuf.h create mode 100644 lib/librte_cmdline/cmdline_parse.c create mode 100644 lib/librte_cmdline/cmdline_parse.h create mode 100644 lib/librte_cmdline/cmdline_parse_etheraddr.c create mode 100644 lib/librte_cmdline/cmdline_parse_etheraddr.h create mode 100644 lib/librte_cmdline/cmdline_parse_ipaddr.c create mode 100644 lib/librte_cmdline/cmdline_parse_ipaddr.h create mode 100644 lib/librte_cmdline/cmdline_parse_num.c create mode 100644 lib/librte_cmdline/cmdline_parse_num.h create mode 100644 lib/librte_cmdline/cmdline_parse_portlist.c create mode 100644 lib/librte_cmdline/cmdline_parse_portlist.h create mode 100644 lib/librte_cmdline/cmdline_parse_string.c create mode 100644 lib/librte_cmdline/cmdline_parse_string.h create mode 100644 lib/librte_cmdline/cmdline_rdline.c create mode 100644 lib/librte_cmdline/cmdline_rdline.h create mode 100644 lib/librte_cmdline/cmdline_socket.c create mode 100644 lib/librte_cmdline/cmdline_socket.h create mode 100644 lib/librte_cmdline/cmdline_vt100.c create mode 100644 lib/librte_cmdline/cmdline_vt100.h create mode 100644 lib/librte_eal/Makefile create mode 100644 lib/librte_eal/common/Makefile create mode 100644 lib/librte_eal/common/eal_common_cpuflags.c create mode 100644 lib/librte_eal/common/eal_common_errno.c create mode 100644 lib/librte_eal/common/eal_common_launch.c create mode 100644 lib/librte_eal/common/eal_common_log.c create mode 100644 lib/librte_eal/common/eal_common_memory.c create mode 100644 lib/librte_eal/common/eal_common_memzone.c create mode 100644 lib/librte_eal/common/eal_common_pci.c create mode 100644 lib/librte_eal/common/eal_common_tailqs.c create mode 100644 lib/librte_eal/common/include/eal_private.h create mode 100644 lib/librte_eal/common/include/i686/arch/rte_atomic.h create mode 100644 lib/librte_eal/common/include/rte_alarm.h create mode 100644 lib/librte_eal/common/include/rte_atomic.h create mode 100644 lib/librte_eal/common/include/rte_branch_prediction.h create mode 100644 lib/librte_eal/common/include/rte_byteorder.h create mode 100644 lib/librte_eal/common/include/rte_common.h create mode 100644 lib/librte_eal/common/include/rte_cpuflags.h create mode 100644 lib/librte_eal/common/include/rte_cycles.h create mode 100644 lib/librte_eal/common/include/rte_debug.h create mode 100644 lib/librte_eal/common/include/rte_eal.h create mode 100644 lib/librte_eal/common/include/rte_errno.h create mode 100644 lib/librte_eal/common/include/rte_interrupts.h create mode 100644 lib/librte_eal/common/include/rte_launch.h create mode 100644 lib/librte_eal/common/include/rte_lcore.h create mode 100644 lib/librte_eal/common/include/rte_log.h create mode 100644 lib/librte_eal/common/include/rte_memcpy.h create mode 100644 lib/librte_eal/common/include/rte_memory.h create mode 100644 lib/librte_eal/common/include/rte_memzone.h create mode 100644 lib/librte_eal/common/include/rte_pci.h create mode 100644 lib/librte_eal/common/include/rte_pci_dev_ids.h create mode 100644 lib/librte_eal/common/include/rte_per_lcore.h create mode 100644 lib/librte_eal/common/include/rte_prefetch.h create mode 100644 lib/librte_eal/common/include/rte_random.h create mode 100644 lib/librte_eal/common/include/rte_rwlock.h create mode 100644 lib/librte_eal/common/include/rte_spinlock.h create mode 100644 lib/librte_eal/common/include/rte_string_fns.h create mode 100644 lib/librte_eal/common/include/rte_tailq.h create mode 100644 lib/librte_eal/common/include/rte_version.h create mode 100644 lib/librte_eal/common/include/rte_warnings.h create mode 100644 lib/librte_eal/common/include/x86_64/arch/rte_atomic.h create mode 100644 lib/librte_eal/linuxapp/Makefile create mode 100644 lib/librte_eal/linuxapp/eal/Makefile create mode 100644 lib/librte_eal/linuxapp/eal/eal.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_alarm.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_debug.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_hpet.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_hugepage_info.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_interrupts.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_lcore.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_log.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_memory.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_pci.c create mode 100644 lib/librte_eal/linuxapp/eal/eal_thread.c create mode 100644 lib/librte_eal/linuxapp/eal/include/eal_fs_paths.h create mode 100644 lib/librte_eal/linuxapp/eal/include/eal_hugepages.h create mode 100644 lib/librte_eal/linuxapp/eal/include/eal_internal_cfg.h create mode 100644 lib/librte_eal/linuxapp/eal/include/eal_thread.h create mode 100644 lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h create mode 100644 lib/librte_eal/linuxapp/eal/include/exec-env/rte_lcore.h create mode 100644 lib/librte_eal/linuxapp/eal/include/exec-env/rte_per_lcore.h create mode 100644 lib/librte_eal/linuxapp/igb_uio/Makefile create mode 100644 lib/librte_eal/linuxapp/igb_uio/igb_uio.c create mode 100644 lib/librte_ether/Makefile create mode 100644 lib/librte_ether/rte_ethdev.c create mode 100644 lib/librte_ether/rte_ethdev.h create mode 100644 lib/librte_ether/rte_ether.h create mode 100644 lib/librte_hash/Makefile create mode 100644 lib/librte_hash/rte_fbk_hash.c create mode 100644 lib/librte_hash/rte_fbk_hash.h create mode 100644 lib/librte_hash/rte_hash.c create mode 100644 lib/librte_hash/rte_hash.h create mode 100644 lib/librte_hash/rte_hash_crc.h create mode 100644 lib/librte_hash/rte_jhash.h create mode 100644 lib/librte_lpm/Makefile create mode 100644 lib/librte_lpm/rte_lpm.c create mode 100644 lib/librte_lpm/rte_lpm.h create mode 100644 lib/librte_malloc/Makefile create mode 100644 lib/librte_malloc/malloc_elem.c create mode 100644 lib/librte_malloc/malloc_elem.h create mode 100644 lib/librte_malloc/malloc_heap.c create mode 100644 lib/librte_malloc/malloc_heap.h create mode 100644 lib/librte_malloc/rte_malloc.c create mode 100644 lib/librte_malloc/rte_malloc.h create mode 100644 lib/librte_mbuf/Makefile create mode 100644 lib/librte_mbuf/rte_mbuf.c create mode 100644 lib/librte_mbuf/rte_mbuf.h create mode 100644 lib/librte_mempool/Makefile create mode 100644 lib/librte_mempool/rte_mempool.c create mode 100644 lib/librte_mempool/rte_mempool.h create mode 100644 lib/librte_net/Makefile create mode 100644 lib/librte_net/rte_ip.h create mode 100644 lib/librte_net/rte_sctp.h create mode 100644 lib/librte_net/rte_tcp.h create mode 100644 lib/librte_net/rte_udp.h create mode 100644 lib/librte_pmd_igb/Makefile create mode 100644 lib/librte_pmd_igb/e1000_ethdev.c create mode 100644 lib/librte_pmd_igb/e1000_ethdev.h create mode 100644 lib/librte_pmd_igb/e1000_logs.h create mode 100644 lib/librte_pmd_igb/e1000_rxtx.c create mode 100644 lib/librte_pmd_igb/igb/README create mode 100644 lib/librte_pmd_igb/igb/e1000_82575.c create mode 100644 lib/librte_pmd_igb/igb/e1000_82575.h create mode 100644 lib/librte_pmd_igb/igb/e1000_api.c create mode 100644 lib/librte_pmd_igb/igb/e1000_api.h create mode 100644 lib/librte_pmd_igb/igb/e1000_defines.h create mode 100644 lib/librte_pmd_igb/igb/e1000_hw.h create mode 100644 lib/librte_pmd_igb/igb/e1000_mac.c create mode 100644 lib/librte_pmd_igb/igb/e1000_mac.h create mode 100644 lib/librte_pmd_igb/igb/e1000_manage.c create mode 100644 lib/librte_pmd_igb/igb/e1000_manage.h create mode 100644 lib/librte_pmd_igb/igb/e1000_mbx.c create mode 100644 lib/librte_pmd_igb/igb/e1000_mbx.h create mode 100644 lib/librte_pmd_igb/igb/e1000_nvm.c create mode 100644 lib/librte_pmd_igb/igb/e1000_nvm.h create mode 100644 lib/librte_pmd_igb/igb/e1000_osdep.c create mode 100644 lib/librte_pmd_igb/igb/e1000_osdep.h create mode 100644 lib/librte_pmd_igb/igb/e1000_phy.c create mode 100644 lib/librte_pmd_igb/igb/e1000_phy.h create mode 100644 lib/librte_pmd_igb/igb/e1000_regs.h create mode 100644 lib/librte_pmd_igb/igb/e1000_vf.c create mode 100644 lib/librte_pmd_igb/igb/e1000_vf.h create mode 100644 lib/librte_pmd_igb/igb/if_igb.c create mode 100644 lib/librte_pmd_igb/igb/if_igb.h create mode 100644 lib/librte_pmd_ixgbe/Makefile create mode 100644 lib/librte_pmd_ixgbe/ixgbe/README create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_82598.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_82599.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_api.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_api.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_common.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_common.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_mbx.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_mbx.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_osdep.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_phy.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_phy.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_type.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_vf.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_x540.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixgbe_x540.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixv.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe/ixv.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe_ethdev.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe_ethdev.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe_fdir.c create mode 100644 lib/librte_pmd_ixgbe/ixgbe_logs.h create mode 100644 lib/librte_pmd_ixgbe/ixgbe_rxtx.c create mode 100644 lib/librte_ring/Makefile create mode 100644 lib/librte_ring/rte_ring.c create mode 100644 lib/librte_ring/rte_ring.h create mode 100644 lib/librte_timer/Makefile create mode 100644 lib/librte_timer/rte_timer.c create mode 100644 lib/librte_timer/rte_timer.h create mode 100644 mk/arch/i686/rte.vars.mk create mode 100644 mk/arch/x86_64/rte.vars.mk create mode 100644 mk/exec-env/linuxapp/rte.app.mk create mode 100644 mk/exec-env/linuxapp/rte.vars.mk create mode 100644 mk/internal/rte.build-post.mk create mode 100644 mk/internal/rte.build-pre.mk create mode 100644 mk/internal/rte.clean-post.mk create mode 100644 mk/internal/rte.clean-pre.mk create mode 100644 mk/internal/rte.compile-post.mk create mode 100644 mk/internal/rte.compile-pre.mk create mode 100644 mk/internal/rte.depdirs-post.mk create mode 100644 mk/internal/rte.depdirs-pre.mk create mode 100644 mk/internal/rte.exthelp-post.mk create mode 100644 mk/internal/rte.install-post.mk create mode 100644 mk/internal/rte.install-pre.mk create mode 100644 mk/machine/atm/rte.vars.mk create mode 100644 mk/machine/default/rte.vars.mk create mode 100644 mk/machine/ivb/rte.vars.mk create mode 100644 mk/machine/native/rte.vars.mk create mode 100644 mk/machine/nhm/rte.vars.mk create mode 100644 mk/machine/snb/rte.vars.mk create mode 100644 mk/machine/wsm/rte.vars.mk create mode 100644 mk/rte.app.mk create mode 100644 mk/rte.doc.mk create mode 100644 mk/rte.extapp.mk create mode 100644 mk/rte.extlib.mk create mode 100644 mk/rte.extobj.mk create mode 100644 mk/rte.extvars.mk create mode 100644 mk/rte.gnuconfigure.mk create mode 100644 mk/rte.hostapp.mk create mode 100644 mk/rte.hostlib.mk create mode 100644 mk/rte.install.mk create mode 100644 mk/rte.lib.mk create mode 100644 mk/rte.module.mk create mode 100644 mk/rte.obj.mk create mode 100644 mk/rte.sdkbuild.mk create mode 100644 mk/rte.sdkconfig.mk create mode 100644 mk/rte.sdkdepdirs.mk create mode 100644 mk/rte.sdkdoc.mk create mode 100644 mk/rte.sdkgcov.mk create mode 100644 mk/rte.sdkinstall.mk create mode 100644 mk/rte.sdkroot.mk create mode 100644 mk/rte.sdktest.mk create mode 100644 mk/rte.sdktestall.mk create mode 100644 mk/rte.subdir.mk create mode 100644 mk/rte.vars.mk create mode 100644 mk/target/generic/rte.app.mk create mode 100644 mk/target/generic/rte.vars.mk create mode 100644 mk/toolchain/gcc/rte.toolchain-compat.mk create mode 100644 mk/toolchain/gcc/rte.vars.mk create mode 100644 mk/toolchain/icc/rte.toolchain-compat.mk create mode 100644 mk/toolchain/icc/rte.vars.mk create mode 100644 scripts/Makefile create mode 100755 scripts/depdirs-rule.sh create mode 100755 scripts/gen-build-mk.sh create mode 100755 scripts/gen-config-h.sh create mode 100755 scripts/import_autotest.sh create mode 100755 scripts/relpath.sh create mode 100755 scripts/test-framework.sh create mode 100644 scripts/testhost/Makefile create mode 100644 scripts/testhost/testhost.c create mode 100755 tools/setup.sh diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..347f7e1 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +# +# Head Makefile for compiling rte SDK +# + +RTE_SDK := $(CURDIR) +export RTE_SDK + +# +# directory list +# + +ROOTDIRS-y := scripts lib app + +include $(RTE_SDK)/mk/rte.sdkroot.mk diff --git a/app/Makefile b/app/Makefile new file mode 100644 index 0000000..7a206e3 --- /dev/null +++ b/app/Makefile @@ -0,0 +1,42 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +include $(RTE_SDK)/mk/rte.vars.mk + +DIRS-$(CONFIG_RTE_APP_TEST) += test +DIRS-$(CONFIG_RTE_TEST_PMD) += test-pmd +DIRS-$(CONFIG_RTE_APP_CHKINCS) += chkincs + +DIRS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += dump_cfg + +include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/app/chkincs/Makefile b/app/chkincs/Makefile new file mode 100644 index 0000000..1ec3337 --- /dev/null +++ b/app/chkincs/Makefile @@ -0,0 +1,96 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +APP = chkincs + +# +# all source are stored in SRCS-y +# + +SRCS-$(CONFIG_RTE_APP_CHKINCS) += test.c \ + test_alarm.c \ + test_atomic.c \ + test_branch_prediction.c \ + test_byteorder.c \ + test_common.c \ + test_cpuflags.c \ + test_cycles.c \ + test_debug.c \ + test_eal.c \ + test_errno.c \ + test_ethdev.c \ + test_ether.c \ + test_fbk_hash.c \ + test_hash_crc.c \ + test_hash.c \ + test_interrupts.c \ + test_ip.c \ + test_jhash.c \ + test_launch.c \ + test_lcore.c \ + test_log.c \ + test_lpm.c \ + test_malloc.c \ + test_mbuf.c \ + test_memcpy.c \ + test_memory.c \ + test_mempool.c \ + test_memzone.c \ + test_pci_dev_ids.c \ + test_pci.c \ + test_per_lcore.c \ + test_prefetch.c \ + test_random.c \ + test_ring.c \ + test_rwlock.c \ + test_sctp.c \ + test_spinlock.c \ + test_string_fns.c \ + test_tailq.c \ + test_tcp.c \ + test_timer.c \ + test_udp.c \ + test_version.c + +CFLAGS += -O0 -fno-inline +CFLAGS += $(WERROR_FLAGS) + +# this application needs libraries first +DEPDIRS-$(CONFIG_RTE_APP_CHKINCS) += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/chkincs/test.c b/app/chkincs/test.c new file mode 100644 index 0000000..cd44fc2 --- /dev/null +++ b/app/chkincs/test.c @@ -0,0 +1,50 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +main(__attribute__((unused)) int argc, __attribute__((unused)) char **argv) +{ + return 0; +} diff --git a/app/chkincs/test.h b/app/chkincs/test.h new file mode 100644 index 0000000..4d6ec6e --- /dev/null +++ b/app/chkincs/test.h @@ -0,0 +1,90 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#ifndef _TEST_H_ +#define _TEST_H_ + +/* icc on baremetal gives us troubles with function named 'main' */ +#ifdef RTE_EXEC_ENV_BAREMETAL +#define main _main +#endif + +int main(int argc, char **argv); + +int test_alarm(void); +int test_atomic(void); +int test_branch_prediction(void); +int test_byteorder(void); +int test_common(void); +int test_cpuflags(void); +int test_cycles(void); +int test_debug(void); +int test_eal(void); +int test_errno(void); +int test_ethdev(void); +int test_ether(void); +int test_fbk_hash(void); +int test_hash_crc(void); +int test_hash(void); +int test_interrupts(void); +int test_ip(void); +int test_jhash(void); +int test_launch(void); +int test_lcore(void); +int test_log(void); +int test_lpm(void); +int test_malloc(void); +int test_mbuf(void); +int test_memcpy(void); +int test_memory(void); +int test_mempool(void); +int test_memzone(void); +int test_pci_dev_ids(void); +int test_pci(void); +int test_per_lcore(void); +int test_prefetch(void); +int test_random(void); +int test_ring(void); +int test_rwlock(void); +int test_sctp(void); +int test_spinlock(void); +int test_string_fns(void); +int test_tailq(void); +int test_tcp(void); +int test_timer(void); +int test_udp(void); +int test_version(void); + +#endif diff --git a/app/chkincs/test_alarm.c b/app/chkincs/test_alarm.c new file mode 100644 index 0000000..233d4f6 --- /dev/null +++ b/app/chkincs/test_alarm.c @@ -0,0 +1,53 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_alarm(void) +{ + rte_eal_alarm_set(10, 0, 0); + return 1; +} diff --git a/app/chkincs/test_atomic.c b/app/chkincs/test_atomic.c new file mode 100644 index 0000000..f490639 --- /dev/null +++ b/app/chkincs/test_atomic.c @@ -0,0 +1,93 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_atomic(void) +{ + rte_atomic16_t a16 = RTE_ATOMIC16_INIT(1); + rte_atomic32_t a32 = RTE_ATOMIC32_INIT(1); + rte_atomic64_t a64 = RTE_ATOMIC64_INIT(1); + int x; + + rte_mb(); + rte_wmb(); + rte_rmb(); + + rte_atomic16_init(&a16); + rte_atomic16_set(&a16, 1); + x = rte_atomic16_read(&a16); + rte_atomic16_inc(&a16); + rte_atomic16_dec(&a16); + rte_atomic16_add(&a16, 5); + rte_atomic16_sub(&a16, 5); + x = rte_atomic16_test_and_set(&a16); + x = rte_atomic16_add_return(&a16, 10); + + rte_atomic32_init(&a32); + rte_atomic32_set(&a32, 1); + x = rte_atomic32_read(&a32); + rte_atomic32_inc(&a32); + rte_atomic32_dec(&a32); + rte_atomic32_add(&a32, 5); + rte_atomic32_sub(&a32, 5); + x = rte_atomic32_test_and_set(&a32); + x = rte_atomic32_add_return(&a32, 10); + + rte_atomic64_init(&a64); + rte_atomic64_set(&a64, 1); + x = rte_atomic64_read(&a64); + rte_atomic64_inc(&a64); + rte_atomic64_dec(&a64); + rte_atomic64_add(&a64, 5); + rte_atomic64_sub(&a64, 5); + x = rte_atomic64_test_and_set(&a64); + x = rte_atomic64_add_return(&a64, 10); + (void)x; + + return 1; +} + diff --git a/app/chkincs/test_branch_prediction.c b/app/chkincs/test_branch_prediction.c new file mode 100644 index 0000000..219ddf1 --- /dev/null +++ b/app/chkincs/test_branch_prediction.c @@ -0,0 +1,58 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int test_branch_prediction(void) +{ + int a = 1; + int b = 2; + + if (likely(a < b)) + return 0; + else if (unlikely(a < b)) + return 1; + else return 2; +} diff --git a/app/chkincs/test_byteorder.c b/app/chkincs/test_byteorder.c new file mode 100644 index 0000000..91b0d6e --- /dev/null +++ b/app/chkincs/test_byteorder.c @@ -0,0 +1,84 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +static volatile uint16_t u16 = 0x1337; +static volatile uint32_t u32 = 0xdeadbeefUL; +static volatile uint64_t u64 = 0xdeadcafebabefaceULL; + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_byteorder(void) +{ + uint16_t res_u16; + uint32_t res_u32; + uint64_t res_u64; + + res_u16 = rte_bswap16(u16); + res_u32 = rte_bswap32(u32); + res_u64 = rte_bswap64(u64); + + res_u16 = rte_cpu_to_le_16(u16); + res_u32 = rte_cpu_to_le_32(u32); + res_u64 = rte_cpu_to_le_64(u64); + + res_u16 = rte_cpu_to_be_16(u16); + res_u32 = rte_cpu_to_be_32(u32); + res_u64 = rte_cpu_to_be_64(u64); + + res_u16 = rte_le_to_cpu_16(u16); + res_u32 = rte_le_to_cpu_32(u32); + res_u64 = rte_le_to_cpu_64(u64); + + res_u16 = rte_be_to_cpu_16(u16); + res_u32 = rte_be_to_cpu_32(u32); + res_u64 = rte_be_to_cpu_64(u64); + + (void)res_u16; + (void)res_u32; + (void)res_u64; + + return 1; +} diff --git a/app/chkincs/test_common.c b/app/chkincs/test_common.c new file mode 100644 index 0000000..3f86d5c --- /dev/null +++ b/app/chkincs/test_common.c @@ -0,0 +1,76 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +static int +test_func(__rte_unused int var1, int var2) +{ + RTE_SET_USED(var2); + return 1; +} + +static int static_var1 = 3; +static int static_var2 = 6; + +int +test_common(void) +{ + int *ptr1 = &static_var1, *ptr2 = &static_var2; + int var; + + ptr2 = RTE_PTR_ADD(ptr1, 10); + ptr2 = RTE_PTR_SUB(ptr1, 5); + var = RTE_PTR_DIFF(ptr1, ptr2); + + var = RTE_ALIGN(var, 16); + + RTE_BUILD_BUG_ON(0); + + var = RTE_MIN(10, 5); + var = RTE_MAX(10, 5); + + return test_func(10, 5); +} diff --git a/app/chkincs/test_cpuflags.c b/app/chkincs/test_cpuflags.c new file mode 100644 index 0000000..017bb66 --- /dev/null +++ b/app/chkincs/test_cpuflags.c @@ -0,0 +1,53 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_cpuflags(void) +{ + rte_cpu_get_flag_enabled(RTE_CPUFLAG_SSE3); + return 1; +} diff --git a/app/chkincs/test_cycles.c b/app/chkincs/test_cycles.c new file mode 100644 index 0000000..c85a35a --- /dev/null +++ b/app/chkincs/test_cycles.c @@ -0,0 +1,63 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_cycles(void) +{ + uint64_t hz, c; + + hz = rte_get_hpet_hz(); + c = rte_get_hpet_cycles(); + rte_delay_us(10); + rte_delay_ms(10); + c = rte_rdtsc(); + + (void)hz; + (void)c; + + return 1; +} diff --git a/app/chkincs/test_debug.c b/app/chkincs/test_debug.c new file mode 100644 index 0000000..58ecdad --- /dev/null +++ b/app/chkincs/test_debug.c @@ -0,0 +1,55 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_debug(void) +{ + rte_dump_stack(); + rte_dump_registers(); + rte_panic("oops %d", 10); + return 1; +} diff --git a/app/chkincs/test_eal.c b/app/chkincs/test_eal.c new file mode 100644 index 0000000..2b77e62 --- /dev/null +++ b/app/chkincs/test_eal.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_eal(void) +{ + return 1; +} diff --git a/app/chkincs/test_errno.c b/app/chkincs/test_errno.c new file mode 100644 index 0000000..d02ec94 --- /dev/null +++ b/app/chkincs/test_errno.c @@ -0,0 +1,54 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_errno(void) +{ + if (rte_errno != 0) + return -1; + return 1; +} diff --git a/app/chkincs/test_ethdev.c b/app/chkincs/test_ethdev.c new file mode 100644 index 0000000..180a796 --- /dev/null +++ b/app/chkincs/test_ethdev.c @@ -0,0 +1,72 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +static struct rte_eth_conf port_conf; +static struct rte_eth_rxconf rx_conf; +static struct rte_eth_txconf tx_conf; +static struct rte_mempool *mp; + +int +test_ethdev(void) +{ + struct rte_eth_link link; + int x; + struct ether_addr ea; + + x = rte_eth_dev_count(); + x = rte_eth_dev_configure(0, 1, 1, &port_conf); + rte_eth_macaddr_get(0, &ea); + x = rte_eth_rx_queue_setup(0, 0, 128, 0, &rx_conf, mp); + x = rte_eth_tx_queue_setup(0, 0, 128, 0, &tx_conf); + rte_eth_link_get(0, &link); + x = rte_eth_dev_start(0); + + (void)x; + + return 1; +} diff --git a/app/chkincs/test_ether.c b/app/chkincs/test_ether.c new file mode 100644 index 0000000..b089aaf --- /dev/null +++ b/app/chkincs/test_ether.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_ether(void) +{ + return 1; +} diff --git a/app/chkincs/test_fbk_hash.c b/app/chkincs/test_fbk_hash.c new file mode 100644 index 0000000..e1e62a0 --- /dev/null +++ b/app/chkincs/test_fbk_hash.c @@ -0,0 +1,53 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_fbk_hash(void) +{ + void * ptr = (void *)RTE_FBK_HASH_FUNC_DEFAULT; + return ptr == ptr; +} diff --git a/app/chkincs/test_hash.c b/app/chkincs/test_hash.c new file mode 100644 index 0000000..c989070 --- /dev/null +++ b/app/chkincs/test_hash.c @@ -0,0 +1,85 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +/* Parameters used for hash table in unit test functions. */ +static struct rte_hash_parameters ut_params = { + "name", /* name */ + 64, /* entries */ + 4, /* bucket_entries */ + 8, /* key_len */ + 0, /* hash_func */ + 0, /* hash_func_init_val */ + 0, /* socket_id */ +}; + +struct key { + char key[8]; +}; + +/* Keys used by unit test functions */ +static struct key keys[1] = { + { + { 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, }, + } +}; + +int test_hash(void) +{ + struct rte_hash *handle; + int32_t pos0; + + handle = rte_hash_create(&ut_params); + if (handle == 0) { + return -1; + } + pos0 = rte_hash_add_key(handle, &keys[0]); + pos0 = rte_hash_lookup(handle, &keys[0]); + pos0 = rte_hash_del_key(handle, &keys[0]); + rte_hash_free(handle); + (void)pos0; /* remove compiler warning */ + return 0; +} diff --git a/app/chkincs/test_hash_crc.c b/app/chkincs/test_hash_crc.c new file mode 100644 index 0000000..f996a09 --- /dev/null +++ b/app/chkincs/test_hash_crc.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_hash_crc(void) +{ + return 1; +} diff --git a/app/chkincs/test_interrupts.c b/app/chkincs/test_interrupts.c new file mode 100644 index 0000000..9d55160 --- /dev/null +++ b/app/chkincs/test_interrupts.c @@ -0,0 +1,53 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_interrupts(void) +{ + rte_intr_callback_register(0, 0, 0); + return 1; +} diff --git a/app/chkincs/test_ip.c b/app/chkincs/test_ip.c new file mode 100644 index 0000000..4da405c --- /dev/null +++ b/app/chkincs/test_ip.c @@ -0,0 +1,53 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_ip(void) +{ + uint64_t var = IPv4(1,1,1,1); + return IS_IPV4_MCAST(var); +} diff --git a/app/chkincs/test_jhash.c b/app/chkincs/test_jhash.c new file mode 100644 index 0000000..f63a68d --- /dev/null +++ b/app/chkincs/test_jhash.c @@ -0,0 +1,54 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_jhash(void) +{ + uint32_t a = 1, b = 2, c = 3; + __rte_jhash_mix(a,b,c); + return 1; +} diff --git a/app/chkincs/test_launch.c b/app/chkincs/test_launch.c new file mode 100644 index 0000000..6395147 --- /dev/null +++ b/app/chkincs/test_launch.c @@ -0,0 +1,68 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +static int +test_launch_per_core(__attribute__((unused)) void *arg) +{ + return 0; +} + +int +test_launch(void) +{ + enum rte_lcore_state_t s; + + rte_eal_remote_launch(test_launch_per_core, (void *)0, 0); + rte_eal_wait_lcore(0); + rte_eal_mp_remote_launch(test_launch_per_core, (void *)0, CALL_MASTER); + rte_eal_mp_wait_lcore(); + s = rte_eal_get_lcore_state(0); + + (void)s; + + return 0; +} diff --git a/app/chkincs/test_lcore.c b/app/chkincs/test_lcore.c new file mode 100644 index 0000000..221b122 --- /dev/null +++ b/app/chkincs/test_lcore.c @@ -0,0 +1,66 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_lcore(void) +{ + unsigned x; + + x = rte_socket_id(); + x = rte_lcore_id(); + x = rte_lcore_to_socket_id(x); + x = rte_lcore_count(); + x = rte_lcore_is_enabled(x); + + RTE_LCORE_FOREACH(x) + (void)x; + + RTE_LCORE_FOREACH_SLAVE(x) + (void)x; + + return 0; +} diff --git a/app/chkincs/test_log.c b/app/chkincs/test_log.c new file mode 100644 index 0000000..c640966 --- /dev/null +++ b/app/chkincs/test_log.c @@ -0,0 +1,58 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +#define RTE_LOGTYPE_TESTAPP1 RTE_LOGTYPE_USER1 + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_log(void) +{ + rte_set_log_type(RTE_LOGTYPE_TESTAPP1, 1); + rte_set_log_level(RTE_LOG_DEBUG); + RTE_LOG(DEBUG, TESTAPP1, "this is a debug level message %d\n", 1); + rte_log_dump_history(); + return 0; +} diff --git a/app/chkincs/test_lpm.c b/app/chkincs/test_lpm.c new file mode 100644 index 0000000..989676e --- /dev/null +++ b/app/chkincs/test_lpm.c @@ -0,0 +1,64 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_lpm(void) +{ + struct rte_lpm *lpm = 0; + uint32_t ip = 0; + uint8_t depth = 24, next_hop_add = 100, next_hop_return = 0; + + lpm = rte_lpm_create(__func__, -1, 256, RTE_LPM_HEAP); + if (lpm == 0) + return -1; + rte_lpm_add(lpm, ip, depth, next_hop_add); + rte_lpm_lookup(lpm, ip, &next_hop_return); + rte_lpm_delete(lpm, ip, depth); + rte_lpm_lookup(lpm, ip, &next_hop_return); + rte_lpm_free(lpm); + return 0; +} diff --git a/app/chkincs/test_malloc.c b/app/chkincs/test_malloc.c new file mode 100644 index 0000000..885b356 --- /dev/null +++ b/app/chkincs/test_malloc.c @@ -0,0 +1,57 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_malloc(void) +{ + void *p1; + + p1 = rte_malloc("dummy", 1000, 8); + rte_free(p1); + + return 0; +} diff --git a/app/chkincs/test_mbuf.c b/app/chkincs/test_mbuf.c new file mode 100644 index 0000000..1d3ff9c --- /dev/null +++ b/app/chkincs/test_mbuf.c @@ -0,0 +1,110 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + + +#include + +#include "test.h" + +#define MBUF_SIZE 2048 +#define NB_MBUF 128 + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_mbuf(void) +{ + struct rte_mempool *mbuf_pool; + struct rte_mbuf *m, *m1; + char *hdr; + int x; + int* ptr; + + mbuf_pool = rte_mempool_create("test_mbuf_pool", NB_MBUF, + MBUF_SIZE, 32, 0, + (void (*)(struct rte_mempool*, void*)) 0, (void *)0, + rte_pktmbuf_init, (void *)0, + SOCKET_ID_ANY, 0); + if (mbuf_pool == NULL) { + return -1; + } + + m = rte_pktmbuf_alloc(mbuf_pool); + if(m == NULL) { + return -1; + } + + m1 = RTE_MBUF_FROM_BADDR(RTE_MBUF_TO_BADDR(m)); + (void)m1; + + x = rte_pktmbuf_pkt_len(m); + x = rte_pktmbuf_data_len(m); + x = rte_pktmbuf_headroom(m); + x = rte_pktmbuf_tailroom(m); + x = rte_pktmbuf_is_contiguous(m); + + m = rte_pktmbuf_lastseg(m); + + hdr = rte_pktmbuf_mtod(m, char *); + rte_pktmbuf_dump(m, 0); + + hdr = rte_pktmbuf_append(m, 10); + x = rte_pktmbuf_trim(m, 10); + hdr = rte_pktmbuf_prepend(m, 10); + hdr = rte_pktmbuf_adj(m, 10); + + ptr = (int*) rte_ctrlmbuf_data(m); + *ptr = rte_ctrlmbuf_len(m); + *ptr = rte_pktmbuf_pkt_len(m); + *ptr = rte_pktmbuf_data_len(m); + + rte_pktmbuf_free_seg(m); + rte_pktmbuf_free(m); + + RTE_MBUF_PREFETCH_TO_FREE(m); + + rte_mbuf_sanity_check(m, RTE_MBUF_CTRL, 1); + + (void)x; + (void)hdr; + + return 0; +} diff --git a/app/chkincs/test_memcpy.c b/app/chkincs/test_memcpy.c new file mode 100644 index 0000000..19db8d2 --- /dev/null +++ b/app/chkincs/test_memcpy.c @@ -0,0 +1,58 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_memcpy(void) +{ + char buf[16]; + const char s[] = "hello\n"; + volatile int a = 10; + + rte_memcpy(buf, s, sizeof(s)); + rte_memcpy(buf, s, a); + return 0; +} diff --git a/app/chkincs/test_memory.c b/app/chkincs/test_memory.c new file mode 100644 index 0000000..c17db89 --- /dev/null +++ b/app/chkincs/test_memory.c @@ -0,0 +1,65 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +static int a __rte_cache_aligned; + +int +test_memory(void) +{ + const struct rte_memseg *mem; + int s = CACHE_LINE_ROUNDUP(10); + + rte_dump_physmem_layout(); + s = rte_eal_get_physmem_size(); + mem = rte_eal_get_physmem_layout(); + + (void)a; + (void)s; + (void)mem; + + return 0; +} diff --git a/app/chkincs/test_mempool.c b/app/chkincs/test_mempool.c new file mode 100644 index 0000000..9c669d6 --- /dev/null +++ b/app/chkincs/test_mempool.c @@ -0,0 +1,111 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +#define MAX_BULK 16 +#define MEMPOOL_ELT_SIZE 2048 +#define MEMPOOL_SIZE 2047 + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_mempool(void) +{ + struct rte_mempool *mp; + void *ptrs[MAX_BULK]; + int x; + phys_addr_t addr; + + mp = rte_mempool_create("test_nocache", MEMPOOL_SIZE, + MEMPOOL_ELT_SIZE, 0, 0, + (void (*)(struct rte_mempool*, void*)) 0, + (void *)0, + (void (*)(struct rte_mempool*, void*, void*, unsigned int)) 0, + (void *)0, + SOCKET_ID_ANY, 0); + + if (mp == NULL) { + return -1; + } + + rte_mempool_set_bulk_count(mp, MAX_BULK); + rte_mempool_dump(mp); + + rte_mempool_mc_get_bulk(mp, ptrs, 1); + rte_mempool_mc_get_bulk(mp, ptrs, MAX_BULK); + rte_mempool_sc_get_bulk(mp, ptrs, 1); + rte_mempool_sc_get_bulk(mp, ptrs, MAX_BULK); + rte_mempool_get_bulk(mp, ptrs, 1); + rte_mempool_get_bulk(mp, ptrs, MAX_BULK); + rte_mempool_mc_get(mp, ptrs); + rte_mempool_sc_get(mp, ptrs); + rte_mempool_get(mp, ptrs); + + rte_mempool_mp_put_bulk(mp, ptrs, 1); + rte_mempool_mp_put_bulk(mp, ptrs, MAX_BULK); + rte_mempool_sp_put_bulk(mp, ptrs, 1); + rte_mempool_sp_put_bulk(mp, ptrs, MAX_BULK); + rte_mempool_put_bulk(mp, ptrs, 1); + rte_mempool_put_bulk(mp, ptrs, MAX_BULK); + rte_mempool_mp_put(mp, ptrs); + rte_mempool_sp_put(mp, ptrs); + rte_mempool_put(mp, ptrs); + + __MEMPOOL_STAT_ADD(mp, put, 1); + __mempool_check_cookies(mp, 0, 0, 0); + + x = rte_mempool_count(mp); + x = rte_mempool_free_count(mp); + x = rte_mempool_full(mp); + x = rte_mempool_empty(mp); + + addr = rte_mempool_virt2phy(mp, ptrs[0]); + rte_mempool_audit(mp); + ptrs[0] = rte_mempool_get_priv(mp); + + (void)x; + (void)addr; + + return 0; +} diff --git a/app/chkincs/test_memzone.c b/app/chkincs/test_memzone.c new file mode 100644 index 0000000..31c9af6 --- /dev/null +++ b/app/chkincs/test_memzone.c @@ -0,0 +1,61 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_memzone(void) +{ + const struct rte_memzone *memzone1; + + memzone1 = rte_memzone_lookup("testzone1"); + memzone1 = rte_memzone_reserve("testzone1", 100, + 0, 0); + rte_memzone_dump(); + + (void)memzone1; + + return 0; +} diff --git a/app/chkincs/test_pci.c b/app/chkincs/test_pci.c new file mode 100644 index 0000000..7af0894 --- /dev/null +++ b/app/chkincs/test_pci.c @@ -0,0 +1,86 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +static int my_driver_init(struct rte_pci_driver *dr, + struct rte_pci_device *dev); + +struct rte_pci_id my_driver_id[] = { + { + 0x8086, + 0x10E8, + PCI_ANY_ID, + PCI_ANY_ID, + }, + { + 0, 0, 0, 0 /* sentinel */ + }, +}; +struct rte_pci_driver my_driver = { + {0, 0}, + "test_driver", + my_driver_init, + my_driver_id, + RTE_PCI_DRV_NEED_IGB_UIO, +}; + +static int +my_driver_init(__attribute__((unused)) struct rte_pci_driver *dr, + __attribute__((unused)) struct rte_pci_device *dev) +{ + return 0; +} + +int +test_pci(void) +{ + struct rte_pci_id id = {RTE_PCI_DEVICE(0, 0)}; + rte_eal_pci_dump(); + rte_eal_pci_register(&my_driver); + rte_eal_pci_probe(); + (void)id; + return 0; +} diff --git a/app/chkincs/test_pci_dev_ids.c b/app/chkincs/test_pci_dev_ids.c new file mode 100644 index 0000000..290105c --- /dev/null +++ b/app/chkincs/test_pci_dev_ids.c @@ -0,0 +1,60 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include "test.h" + +struct A { + int x; + int y; +}; + +static struct A a[] = { +#define RTE_PCI_DEV_ID_DECL(vend, dev) {vend, dev}, +#include +}; + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_pci_dev_ids(void) +{ + return a[0].x; +} diff --git a/app/chkincs/test_per_lcore.c b/app/chkincs/test_per_lcore.c new file mode 100644 index 0000000..d2fc666 --- /dev/null +++ b/app/chkincs/test_per_lcore.c @@ -0,0 +1,57 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +static RTE_DEFINE_PER_LCORE(unsigned, test) = 0x12345678; + +int +test_per_lcore(void) +{ + if (RTE_PER_LCORE(test) != 0x12345678) + return -1; + + return 0; +} diff --git a/app/chkincs/test_prefetch.c b/app/chkincs/test_prefetch.c new file mode 100644 index 0000000..df81f0e --- /dev/null +++ b/app/chkincs/test_prefetch.c @@ -0,0 +1,58 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_prefetch(void) +{ + int a; + + rte_prefetch0(&a); + rte_prefetch1(&a); + rte_prefetch2(&a); + + return 0; +} diff --git a/app/chkincs/test_random.c b/app/chkincs/test_random.c new file mode 100644 index 0000000..9e10176 --- /dev/null +++ b/app/chkincs/test_random.c @@ -0,0 +1,54 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_random(void) +{ + rte_srand(1); + rte_rand(); + return 0; +} diff --git a/app/chkincs/test_ring.c b/app/chkincs/test_ring.c new file mode 100644 index 0000000..5e37a6a --- /dev/null +++ b/app/chkincs/test_ring.c @@ -0,0 +1,97 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +#define MAX_BULK 16 +#define RING_SIZE 4096 + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_ring(void) +{ + struct rte_ring *r; + void *ptrs[MAX_BULK]; + int x; + + r = rte_ring_create("test", RING_SIZE, SOCKET_ID_ANY, 0); + if (r == 0) { + return -1; + } + rte_ring_dump(r); + + rte_ring_set_bulk_count(r, MAX_BULK); + rte_ring_set_water_mark(r, 50); + + rte_ring_sp_enqueue_bulk(r, &ptrs[0], 1); + rte_ring_mp_enqueue_bulk(r, &ptrs[0], 1); + rte_ring_sp_enqueue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_mp_enqueue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_enqueue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_enqueue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_sp_enqueue(r, &ptrs[0]); + rte_ring_mp_enqueue(r, &ptrs[0]); + rte_ring_enqueue(r, &ptrs[0]); + + rte_ring_sc_dequeue_bulk(r, &ptrs[0], 1); + rte_ring_sc_dequeue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_mc_dequeue_bulk(r, &ptrs[0], 1); + rte_ring_mc_dequeue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_dequeue_bulk(r, &ptrs[0], 1); + rte_ring_dequeue_bulk(r, &ptrs[0], MAX_BULK); + rte_ring_sc_dequeue(r, &ptrs[0]); + rte_ring_mc_dequeue(r, &ptrs[0]); + rte_ring_dequeue(r, &ptrs[0]); + + __RING_STAT_ADD(r, enq_fail, 10); + + x = rte_ring_full(r); + x = rte_ring_empty(r); + x = rte_ring_count(r); + x = rte_ring_free_count(r); + + (void)x; + + return 0; +} diff --git a/app/chkincs/test_rwlock.c b/app/chkincs/test_rwlock.c new file mode 100644 index 0000000..20ab519 --- /dev/null +++ b/app/chkincs/test_rwlock.c @@ -0,0 +1,60 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_rwlock(void) +{ + rte_rwlock_t rwl = RTE_RWLOCK_INITIALIZER; + + rte_rwlock_init(&rwl); + rte_rwlock_write_lock(&rwl); + rte_rwlock_write_unlock(&rwl); + rte_rwlock_read_lock(&rwl); + rte_rwlock_read_unlock(&rwl); + + return 0; +} diff --git a/app/chkincs/test_sctp.c b/app/chkincs/test_sctp.c new file mode 100644 index 0000000..11b6b78 --- /dev/null +++ b/app/chkincs/test_sctp.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_sctp(void) +{ + return 0; +} diff --git a/app/chkincs/test_spinlock.c b/app/chkincs/test_spinlock.c new file mode 100644 index 0000000..eb538df --- /dev/null +++ b/app/chkincs/test_spinlock.c @@ -0,0 +1,59 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +static rte_spinlock_t sl = RTE_SPINLOCK_INITIALIZER; +static rte_spinlock_recursive_t slr = RTE_SPINLOCK_RECURSIVE_INITIALIZER; + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_spinlock(void) +{ + rte_spinlock_init(&sl); + rte_spinlock_lock(&sl); + rte_spinlock_unlock(&sl); + rte_spinlock_recursive_lock(&slr); + return 0; +} diff --git a/app/chkincs/test_string_fns.c b/app/chkincs/test_string_fns.c new file mode 100644 index 0000000..09a24de --- /dev/null +++ b/app/chkincs/test_string_fns.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_string_fns(void) +{ + return 0; +} diff --git a/app/chkincs/test_tailq.c b/app/chkincs/test_tailq.c new file mode 100644 index 0000000..4730e1c --- /dev/null +++ b/app/chkincs/test_tailq.c @@ -0,0 +1,55 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_tailq(void) +{ + struct rte_dummy *t1, *t2; + t1 = RTE_TAILQ_RESERVE("dummy", rte_dummy); + t2 = RTE_TAILQ_LOOKUP("dummy", rte_dummy); + return (t1 == t2) ? 0 : -1; +} diff --git a/app/chkincs/test_tcp.c b/app/chkincs/test_tcp.c new file mode 100644 index 0000000..96e54a6 --- /dev/null +++ b/app/chkincs/test_tcp.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_tcp(void) +{ + return 0; +} diff --git a/app/chkincs/test_timer.c b/app/chkincs/test_timer.c new file mode 100644 index 0000000..ea63b42 --- /dev/null +++ b/app/chkincs/test_timer.c @@ -0,0 +1,74 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +/* timer callback for basic tests */ +static void +timer_cb(__attribute__((unused)) struct rte_timer *tim, + __attribute__((unused)) void *arg) +{ + return; +} + +int +test_timer(void) +{ + int x; + struct rte_timer tim = RTE_TIMER_INITIALIZER; + + rte_timer_subsystem_init(); + rte_timer_init(&tim); + rte_timer_reset(&tim, 1234, SINGLE, 0, timer_cb, &x); + rte_timer_stop(&tim); + rte_timer_reset_sync(&tim, 1234, SINGLE, 0, timer_cb, &x); + rte_timer_stop_sync(&tim); + x = rte_timer_pending(&tim); + rte_timer_manage(); + rte_timer_dump_stats(); + + return 0; +} diff --git a/app/chkincs/test_udp.c b/app/chkincs/test_udp.c new file mode 100644 index 0000000..9ccb5ba --- /dev/null +++ b/app/chkincs/test_udp.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include "test.h" + +#include + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_udp(void) +{ + return 0; +} diff --git a/app/chkincs/test_version.c b/app/chkincs/test_version.c new file mode 100644 index 0000000..e518a67 --- /dev/null +++ b/app/chkincs/test_version.c @@ -0,0 +1,52 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include "test.h" + +/* + * ^ + * / \ + * / | \ WARNING: this test program does *not* show how to use the + * / . \ API. Its only goal is to check dependencies of include files. + * /_______\ + */ + +int +test_version(void) +{ + return 1; +} diff --git a/app/dump_cfg/Makefile b/app/dump_cfg/Makefile new file mode 100644 index 0000000..916166a --- /dev/null +++ b/app/dump_cfg/Makefile @@ -0,0 +1,49 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 +# + +include $(RTE_SDK)/mk/rte.vars.mk + +APP = dump_cfg + +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-y := dump_cfg_main.c + +# this application needs libraries first +DEPDIRS-y += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/dump_cfg/dump_cfg_main.c b/app/dump_cfg/dump_cfg_main.c new file mode 100644 index 0000000..9227f35 --- /dev/null +++ b/app/dump_cfg/dump_cfg_main.c @@ -0,0 +1,229 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +/* some functions used for printing out the memory segments and memory zones information */ + +#define PRINT_STR_FIELD(structname, field) do{ \ + count+= rte_snprintf(buf + count, len-count, " %s='%s',", \ + #field, (const char *)structname->field);\ +} while(0) + +#define PRINT_PTR_FIELD(structname, field) do{ \ + count+= rte_snprintf(buf + count, len-count, " %s=%p,", \ + #field, (void *)structname->field);\ +} while(0) + +#define PRINT_UINT_FIELD(structname, field) do{ \ + count+= rte_snprintf(buf + count, len-count, " %s=%llu,", \ + #field, (unsigned long long)structname->field);\ +} while(0) + +#define PRINT_INT_FIELD(structname, field) do{ \ + count+= rte_snprintf(buf + count, len-count, " %s=%lld,", \ + #field, (long long)structname->field);\ +} while(0) + +#define PRINT_CUSTOM_FIELD(structname, field, print_fn) do{ \ + char buf2[1024]; \ + count+= rte_snprintf(buf + count, len-count, " %s=%s,", \ + #field, print_fn(structname->field, buf2, sizeof(buf2)));\ +} while(0) + +static inline const char * +memseg_to_str(const struct rte_memseg *seg, char *buf, size_t len) +{ + int count = 0; + count += rte_snprintf(buf + count, len - count, "{"); + PRINT_UINT_FIELD(seg, phys_addr); + PRINT_PTR_FIELD(seg, addr); + PRINT_UINT_FIELD(seg, len); + PRINT_INT_FIELD(seg, socket_id); + PRINT_UINT_FIELD(seg, hugepage_sz); + PRINT_UINT_FIELD(seg, nchannel); + PRINT_UINT_FIELD(seg, nrank); + rte_snprintf(buf + count - 1, len - count + 1, " }"); + return buf; +} + +static inline const char * +memzone_to_str(const struct rte_memzone *zone, char *buf, size_t len) +{ + int count = 0; + count += rte_snprintf(buf + count, len - count, "{"); + PRINT_STR_FIELD(zone, name); + PRINT_UINT_FIELD(zone, phys_addr); + PRINT_PTR_FIELD(zone, addr); + PRINT_UINT_FIELD(zone, len); + PRINT_INT_FIELD(zone, socket_id); + PRINT_UINT_FIELD(zone, flags); + rte_snprintf(buf + count - 1, len - count + 1, " }"); + return buf; +} + +static inline const char * +tailq_to_str(const struct rte_tailq_head *tailq, char *buf, size_t len) +{ + int count = 0; + count += rte_snprintf(buf + count, len - count, "{"); + PRINT_STR_FIELD(tailq, qname); + const struct rte_dummy_head *head = &tailq->tailq_head; + PRINT_PTR_FIELD(head, tqh_first); + PRINT_PTR_FIELD(head, tqh_last); + rte_snprintf(buf + count - 1, len - count + 1, " }"); + return buf; +} + +#define PREFIX "prefix" +static const char *directory = "/var/run"; +static const char *pre = "rte"; + +static void +usage(const char *prgname) +{ + printf("%s --prefix \n\n" + "dump_config option list:\n" + "\t--"PREFIX": filename prefix\n", + prgname); +} + +static int +dmp_cfg_parse_args(int argc, char **argv) +{ + const char *prgname = argv[0]; + const char *home_dir = getenv("HOME"); + int opt; + int option_index; + static struct option lgopts[] = { + {PREFIX, 1, 0, 0}, + {0, 0, 0, 0} + }; + + if (getuid() != 0 && home_dir != NULL) + directory = home_dir; + + while ((opt = getopt_long(argc, argv, "", + lgopts, &option_index)) != EOF) { + switch (opt) { + case 0: + if (!strcmp(lgopts[option_index].name, PREFIX)) + pre = optarg; + else{ + usage(prgname); + return -1; + } + break; + + default: + usage(prgname); + return -1; + } + } + return 0; +} + +int +main(int argc, char **argv) +{ + char buffer[1024]; + char path[PATH_MAX]; + int i; + int fd = 0; + + dmp_cfg_parse_args(argc, argv); + rte_snprintf(path, sizeof(path), "%s/.%s_config", directory, pre); + printf("Path to mem_config: %s\n\n", path); + + fd = open(path, O_RDWR); + if (fd < 0){ + printf("Error with config open\n"); + return 1; + } + struct rte_mem_config *cfg = mmap(NULL, sizeof(*cfg), PROT_READ, \ + MAP_SHARED, fd, 0); + if (cfg == NULL){ + printf("Error with config mmap\n"); + close(fd); + return 1; + } + close(fd); + + printf("----------- MEMORY_SEGMENTS -------------\n"); + for (i = 0; i < RTE_MAX_MEMSEG; i++){ + if (cfg->memseg[i].addr == NULL) break; + printf("Segment %d: ", i); + printf("%s\n", memseg_to_str(&cfg->memseg[i], buffer, sizeof(buffer))); + } + printf("--------- END_MEMORY_SEGMENTS -----------\n"); + + printf("------------ MEMORY_ZONES ---------------\n"); + for (i = 0; i < RTE_MAX_MEMZONE; i++){ + if (cfg->memzone[i].addr == NULL) break; + printf("Zone %d: ", i); + printf("%s\n", memzone_to_str(&cfg->memzone[i], buffer, sizeof(buffer))); + + } + printf("---------- END_MEMORY_ZONES -------------\n"); + + printf("------------- TAIL_QUEUES ---------------\n"); + for (i = 0; i < RTE_MAX_TAILQ; i++){ + if (cfg->tailq_head[i].qname[0] == '\0') break; + printf("Tailq %d: ", i); + printf("%s\n", tailq_to_str(&cfg->tailq_head[i], buffer, sizeof(buffer))); + + } + printf("----------- END_TAIL_QUEUES -------------\n"); + + return 0; +} + diff --git a/app/test-pmd/Makefile b/app/test-pmd/Makefile new file mode 100644 index 0000000..bad337a --- /dev/null +++ b/app/test-pmd/Makefile @@ -0,0 +1,63 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +APP = testpmd + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_TEST_PMD) := testpmd.c +SRCS-$(CONFIG_RTE_TEST_PMD) += parameters.c +SRCS-$(CONFIG_RTE_TEST_PMD) += cmdline.c +SRCS-$(CONFIG_RTE_TEST_PMD) += config.c +SRCS-$(CONFIG_RTE_TEST_PMD) += iofwd.c +SRCS-$(CONFIG_RTE_TEST_PMD) += macfwd.c +SRCS-$(CONFIG_RTE_TEST_PMD) += rxonly.c +SRCS-$(CONFIG_RTE_TEST_PMD) += txonly.c +SRCS-$(CONFIG_RTE_TEST_PMD) += csumonly.c +ifeq ($(CONFIG_RTE_LIBRTE_IEEE1588),y) +SRCS-$(CONFIG_RTE_TEST_PMD) += ieee1588fwd.c +endif + +# this application needs libraries first +DEPDIRS-$(CONFIG_RTE_TEST_PMD) += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c new file mode 100644 index 0000000..28233a6 --- /dev/null +++ b/app/test-pmd/cmdline.c @@ -0,0 +1,2180 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef __linux__ +#include +#endif +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +/* *** HELP *** */ +struct cmd_help_result { + cmdline_fixed_string_t help; +}; + +static void cmd_help_parsed(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, + __attribute__((unused)) void *data) +{ + cmdline_printf(cl, + "\n" + "TEST PMD\n" + "--------\n" + "\n" + "This commandline can be used to configure forwarding\n" + "\n"); + cmdline_printf(cl, + "Display informations:\n" + "---------------------\n" + "- show port info|stats|fdir X|all\n" + " Diplays information or stats on port X, or all\n" + "- clear port stats X|all\n" + " Clear stats for port X, or all\n" + "- show config rxtx|cores|fwd\n" + " Displays the given configuration\n" + "- read reg port_id reg_off\n" + " Displays value of a port register\n" + "- read regfield port_id reg_off bit_x bit_y\n" + " Displays value of a port register bit field\n" + "- read regbit port_id reg_off bit_x\n" + " Displays value of a port register bit\n" + "- read rxd port_id queue_id rxd_id\n" + " Displays a RX descriptor of a port RX queue\n" + "- read txd port_id queue_id txd_id\n" + " Displays a TX descriptor of a port TX queue\n" + "\n"); + cmdline_printf(cl, + "Configure:\n" + "----------\n" + "Modifications are taken into account once " + "forwarding is restarted.\n" + "- set default\n" + " Set forwarding to default configuration\n" + "- set nbport|nbcore|burst|verbose X\n" + " Set number of ports, number of cores, number " + "of packets per burst,\n or verbose level to X\n" + "- set txpkts x[,y]*\n" + " Set the length of each segment of TXONLY packets\n" + "- set coremask|portmask X\n" + " Set the hexadecimal mask of forwarding cores / " + "forwarding ports\n" + "- set corelist|portlist x[,y]*\n" + " Set the list of forwarding cores / forwarding " + "ports\n" + "- rx_vlan add/rm vlan_id|all port_id\n" + " Add/remove vlan_id, or all identifiers, to/from " + "the set of VLAN Identifiers\n filtered by port_id\n" + "- tx_vlan set vlan_id port_id\n" + " Enable hardware insertion of a VLAN header with " + "the Tag Identifier vlan_id\n in packets sent on" + "port_id\n" + "- tx_vlan reset port_id\n" + " Disable hardware insertion of a VLAN header in " + "packets sent on port_id\n" + "- tx_checksum set mask port_id\n" + " Enable hardware insertion of checksum offload with " + "the 4-bit mask (0~0xf)\n in packets sent on port_id\n" + " Please check the NIC datasheet for HW limits\n" + " bit 0 - insert ip checksum offload if set \n" + " bit 1 - insert udp checksum offload if set \n" + " bit 2 - insert tcp checksum offload if set\n" + " bit 3 - insert sctp checksum offload if set\n" +#ifdef RTE_LIBRTE_IEEE1588 + "- set fwd io|mac|rxonly|txonly|csum|ieee1588\n" + " Set IO, MAC, RXONLY, TXONLY, CSUM or IEEE1588 " + "packet forwarding mode\n" +#else + "- set fwd io|mac|rxonly|txonly|csum\n" + " Set IO, MAC, RXONLY, CSUM or TXONLY packet " + "forwarding mode\n" +#endif + "- mac_addr add|remove X \n" + " Add/Remove the MAC address on port X\n" + "- set promisc|allmulti [all|X] on|off\n" + " Set/unset promisc|allmulti mode on port X, or all\n" + "- set flow_ctrl rx on|off tx on|off high_water low_water " + "pause_time send_xon port_id \n" + " Set the link flow control parameter on the port \n" + "- write reg port_id reg_off value\n" + " Set value of a port register\n" + "- write regfield port_id reg_off bit_x bit_y value\n" + " Set bit field value of a port register\n" + "- write regbit port_id reg_off bit_x value\n" + " Set bit value of a port register\n" + "\n"); + cmdline_printf(cl, + "Control forwarding:\n" + "-------------------\n" + "- start\n" + " Start packet forwarding with current config\n" + "- start tx_first\n" + " Start packet forwarding with current config" + " after sending one burst\n of packets\n" + "- stop\n" + " Stop packet forwarding, and displays accumulated" + " stats\n" + "\n"); + cmdline_printf(cl, + "Flow director mode:\n" + "-------------------\n" + "- add_signature_filter port_id ip|udp|tcp|sctp src\n" + " ip_src_address port_src dst ip_dst_address port_dst\n" + " flexbytes flexbytes_values vlan vlan_id queue queue_id\n" + "- upd_signature_filter port_id ip|udp|tcp|sctp src \n" + " ip_src_address port_src dst ip_dst_address port_dst\n" + " flexbytes flexbytes_values vlan vlan_id queue queue_id\n" + "- rm_signature_filter port_id ip|udp|tcp|sctp src\n" + " ip_src_address port_src dst ip_dst_address port_dst\n" + " flexbytes flexbytes_values vlan vlan_id\n" + "- add_perfect_filter port_id ip|udp|tcp|sctp src\n" + " ip_src_address port_src dst ip_dst_address port_dst\n" + " flexbytes flexbytes_values vlan vlan_id queue \n" + " queue_id soft soft_id\n" + "- upd_perfect_filter port_id ip|udp|tcp|sctp src\n" + " ip_src_address port_src dst ip_dst_address port_dst\n" + " flexbytes flexbytes_values vlan vlan_id queue queue_id\n" + "- rm_perfect_filter port_id ip|udp|tcp|sctp src\n" + " ip_src_address port_src dst ip_dst_address port_dst\n" + " flexbytes flexbytes_values vlan vlan_id soft soft_id\n" + "- set_masks_filter port_id only_ip_flow 0|1 src_mask\n" + " ip_src_mask port_src_mask dst_mask ip_dst_mask\n" + " port_dst_mask flexbytes 0|1 vlan_id 0|1 vlan_prio 0|1\n" + "\n"); + cmdline_printf(cl, + "Misc:\n" + "-----\n" + "- quit\n" + " Quit to prompt in linux, and reboot on baremetal\n" + "\n"); +} + +cmdline_parse_token_string_t cmd_help_help = + TOKEN_STRING_INITIALIZER(struct cmd_help_result, help, "help"); + +cmdline_parse_inst_t cmd_help = { + .f = cmd_help_parsed, + .data = NULL, + .help_str = "show help", + .tokens = { + (void *)&cmd_help_help, + NULL, + }, +}; + +/* *** stop *** */ +struct cmd_stop_result { + cmdline_fixed_string_t stop; +}; + +static void cmd_stop_parsed(__attribute__((unused)) void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + stop_packet_forwarding(); +} + +cmdline_parse_token_string_t cmd_stop_stop = + TOKEN_STRING_INITIALIZER(struct cmd_stop_result, stop, "stop"); + +cmdline_parse_inst_t cmd_stop = { + .f = cmd_stop_parsed, + .data = NULL, + .help_str = "stop - stop packet forwarding", + .tokens = { + (void *)&cmd_stop_stop, + NULL, + }, +}; + +/* *** SET CORELIST and PORTLIST CONFIGURATION *** */ + +static unsigned int +parse_item_list(char* str, const char* item_name, unsigned int max_items, + unsigned int *parsed_items, int check_unique_values) +{ + unsigned int nb_item; + unsigned int value; + unsigned int i; + unsigned int j; + int value_ok; + char c; + + /* + * First parse all items in the list and store their value. + */ + value = 0; + nb_item = 0; + value_ok = 0; + for (i = 0; i < strnlen(str, STR_TOKEN_SIZE); i++) { + c = str[i]; + if ((c >= '0') && (c <= '9')) { + value = (unsigned int) (value * 10 + (c - '0')); + value_ok = 1; + continue; + } + if (c != ',') { + printf("character %c is not a decimal digit\n", c); + return (0); + } + if (! value_ok) { + printf("No valid value before comma\n"); + return (0); + } + if (nb_item < max_items) { + parsed_items[nb_item] = value; + value_ok = 0; + value = 0; + } + nb_item++; + } + if (nb_item >= max_items) { + printf("Number of %s = %u > %u (maximum items)\n", + item_name, nb_item + 1, max_items); + return (0); + } + parsed_items[nb_item++] = value; + if (! check_unique_values) + return (nb_item); + + /* + * Then, check that all values in the list are differents. + * No optimization here... + */ + for (i = 0; i < nb_item; i++) { + for (j = i + 1; j < nb_item; j++) { + if (parsed_items[j] == parsed_items[i]) { + printf("duplicated %s %u at index %u and %u\n", + item_name, parsed_items[i], i, j); + return (0); + } + } + } + return (nb_item); +} + +struct cmd_set_list_result { + cmdline_fixed_string_t cmd_keyword; + cmdline_fixed_string_t list_name; + cmdline_fixed_string_t list_of_items; +}; + +static void cmd_set_list_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_list_result *res; + union { + unsigned int lcorelist[RTE_MAX_LCORE]; + unsigned int portlist[RTE_MAX_ETHPORTS]; + } parsed_items; + unsigned int nb_item; + + res = parsed_result; + if (!strcmp(res->list_name, "corelist")) { + nb_item = parse_item_list(res->list_of_items, "core", + RTE_MAX_LCORE, + parsed_items.lcorelist, 1); + if (nb_item > 0) + set_fwd_lcores_list(parsed_items.lcorelist, nb_item); + return; + } + if (!strcmp(res->list_name, "portlist")) { + nb_item = parse_item_list(res->list_of_items, "port", + RTE_MAX_ETHPORTS, + parsed_items.portlist, 1); + if (nb_item > 0) + set_fwd_ports_list(parsed_items.portlist, nb_item); + } +} + +cmdline_parse_token_string_t cmd_set_list_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, cmd_keyword, + "set"); +cmdline_parse_token_string_t cmd_set_list_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_name, + "corelist#portlist"); +cmdline_parse_token_string_t cmd_set_list_of_items = + TOKEN_STRING_INITIALIZER(struct cmd_set_list_result, list_of_items, + NULL); + +cmdline_parse_inst_t cmd_set_fwd_list = { + .f = cmd_set_list_parsed, + .data = NULL, + .help_str = "set corelist|portlist x[,y]*", + .tokens = { + (void *)&cmd_set_list_keyword, + (void *)&cmd_set_list_name, + (void *)&cmd_set_list_of_items, + NULL, + }, +}; + +/* *** SET COREMASK and PORTMASK CONFIGURATION *** */ + +struct cmd_setmask_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t mask; + uint64_t hexavalue; +}; + +static void cmd_set_mask_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_setmask_result *res = parsed_result; + + if (!strcmp(res->mask, "coremask")) + set_fwd_lcores_mask(res->hexavalue); + else if (!strcmp(res->mask, "portmask")) + set_fwd_ports_mask(res->hexavalue); +} + +cmdline_parse_token_string_t cmd_setmask_set = + TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, set, "set"); +cmdline_parse_token_string_t cmd_setmask_mask = + TOKEN_STRING_INITIALIZER(struct cmd_setmask_result, mask, + "coremask#portmask"); +cmdline_parse_token_num_t cmd_setmask_value = + TOKEN_NUM_INITIALIZER(struct cmd_setmask_result, hexavalue, UINT64); + +cmdline_parse_inst_t cmd_set_fwd_mask = { + .f = cmd_set_mask_parsed, + .data = NULL, + .help_str = "set coremask|portmask hexadecimal value", + .tokens = { + (void *)&cmd_setmask_set, + (void *)&cmd_setmask_mask, + (void *)&cmd_setmask_value, + NULL, + }, +}; + +/* + * SET NBPORT, NBCORE, PACKET BURST, and VERBOSE LEVEL CONFIGURATION + */ +struct cmd_set_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t what; + uint16_t value; +}; + +static void cmd_set_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_result *res = parsed_result; + if (!strcmp(res->what, "nbport")) + set_fwd_ports_number(res->value); + else if (!strcmp(res->what, "nbcore")) + set_fwd_lcores_number(res->value); + else if (!strcmp(res->what, "burst")) + set_nb_pkt_per_burst(res->value); + else if (!strcmp(res->what, "verbose")) + set_verbose_level(res->value); +} + +cmdline_parse_token_string_t cmd_set_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_result, set, "set"); +cmdline_parse_token_string_t cmd_set_what = + TOKEN_STRING_INITIALIZER(struct cmd_set_result, what, + "nbport#nbcore#burst#verbose"); +cmdline_parse_token_num_t cmd_set_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_result, value, UINT16); + +cmdline_parse_inst_t cmd_set_numbers = { + .f = cmd_set_parsed, + .data = NULL, + .help_str = "set nbport|nbcore|burst|verbose value", + .tokens = { + (void *)&cmd_set_set, + (void *)&cmd_set_what, + (void *)&cmd_set_value, + NULL, + }, +}; + +/* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */ + +struct cmd_set_txpkts_result { + cmdline_fixed_string_t cmd_keyword; + cmdline_fixed_string_t txpkts; + cmdline_fixed_string_t seg_lengths; +}; + +static void +cmd_set_txpkts_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_txpkts_result *res; + unsigned seg_lengths[RTE_MAX_SEGS_PER_PKT]; + unsigned int nb_segs; + + res = parsed_result; + nb_segs = parse_item_list(res->seg_lengths, "segment lengths", + RTE_MAX_SEGS_PER_PKT, seg_lengths, 0); + if (nb_segs > 0) + set_tx_pkt_segments(seg_lengths, nb_segs); +} + +cmdline_parse_token_string_t cmd_set_txpkts_keyword = + TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, + cmd_keyword, "set"); +cmdline_parse_token_string_t cmd_set_txpkts_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, + txpkts, "txpkts"); +cmdline_parse_token_string_t cmd_set_txpkts_lengths = + TOKEN_STRING_INITIALIZER(struct cmd_set_txpkts_result, + seg_lengths, NULL); + +cmdline_parse_inst_t cmd_set_txpkts = { + .f = cmd_set_txpkts_parsed, + .data = NULL, + .help_str = "set txpkts x[,y]*", + .tokens = { + (void *)&cmd_set_txpkts_keyword, + (void *)&cmd_set_txpkts_name, + (void *)&cmd_set_txpkts_lengths, + NULL, + }, +}; + +/* *** ADD/REMOVE ALL VLAN IDENTIFIERS TO/FROM A PORT VLAN RX FILTER *** */ +struct cmd_rx_vlan_filter_all_result { + cmdline_fixed_string_t rx_vlan; + cmdline_fixed_string_t what; + cmdline_fixed_string_t all; + uint8_t port_id; +}; + +static void +cmd_rx_vlan_filter_all_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_rx_vlan_filter_all_result *res = parsed_result; + + if (!strcmp(res->what, "add")) + rx_vlan_all_filter_set(res->port_id, 1); + else + rx_vlan_all_filter_set(res->port_id, 0); +} + +cmdline_parse_token_string_t cmd_rx_vlan_filter_all_rx_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, + rx_vlan, "rx_vlan"); +cmdline_parse_token_string_t cmd_rx_vlan_filter_all_what = + TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, + what, "add#rm"); +cmdline_parse_token_string_t cmd_rx_vlan_filter_all_all = + TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_all_result, + all, "all"); +cmdline_parse_token_num_t cmd_rx_vlan_filter_all_portid = + TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_all_result, + port_id, UINT8); + +cmdline_parse_inst_t cmd_rx_vlan_filter_all = { + .f = cmd_rx_vlan_filter_all_parsed, + .data = NULL, + .help_str = "add/remove all identifiers to/from the set of VLAN " + "Identifiers filtered by a port", + .tokens = { + (void *)&cmd_rx_vlan_filter_all_rx_vlan, + (void *)&cmd_rx_vlan_filter_all_what, + (void *)&cmd_rx_vlan_filter_all_all, + (void *)&cmd_rx_vlan_filter_all_portid, + NULL, + }, +}; + +/* *** ADD/REMOVE A VLAN IDENTIFIER TO/FROM A PORT VLAN RX FILTER *** */ +struct cmd_rx_vlan_filter_result { + cmdline_fixed_string_t rx_vlan; + cmdline_fixed_string_t what; + uint16_t vlan_id; + uint8_t port_id; +}; + +static void +cmd_rx_vlan_filter_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_rx_vlan_filter_result *res = parsed_result; + + if (!strcmp(res->what, "add")) + rx_vlan_filter_set(res->port_id, res->vlan_id, 1); + else + rx_vlan_filter_set(res->port_id, res->vlan_id, 0); +} + +cmdline_parse_token_string_t cmd_rx_vlan_filter_rx_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result, + rx_vlan, "rx_vlan"); +cmdline_parse_token_string_t cmd_rx_vlan_filter_what = + TOKEN_STRING_INITIALIZER(struct cmd_rx_vlan_filter_result, + what, "add#rm"); +cmdline_parse_token_num_t cmd_rx_vlan_filter_vlanid = + TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result, + vlan_id, UINT16); +cmdline_parse_token_num_t cmd_rx_vlan_filter_portid = + TOKEN_NUM_INITIALIZER(struct cmd_rx_vlan_filter_result, + port_id, UINT8); + +cmdline_parse_inst_t cmd_rx_vlan_filter = { + .f = cmd_rx_vlan_filter_parsed, + .data = NULL, + .help_str = "add/remove a VLAN identifier to/from the set of VLAN " + "Identifiers filtered by a port", + .tokens = { + (void *)&cmd_rx_vlan_filter_rx_vlan, + (void *)&cmd_rx_vlan_filter_what, + (void *)&cmd_rx_vlan_filter_vlanid, + (void *)&cmd_rx_vlan_filter_portid, + NULL, + }, +}; + +/* *** ENABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */ +struct cmd_tx_vlan_set_result { + cmdline_fixed_string_t tx_vlan; + cmdline_fixed_string_t set; + uint16_t vlan_id; + uint8_t port_id; +}; + +static void +cmd_tx_vlan_set_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_tx_vlan_set_result *res = parsed_result; + + tx_vlan_set(res->port_id, res->vlan_id); +} + +cmdline_parse_token_string_t cmd_tx_vlan_set_tx_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result, + tx_vlan, "tx_vlan"); +cmdline_parse_token_string_t cmd_tx_vlan_set_set = + TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_set_result, + set, "set"); +cmdline_parse_token_num_t cmd_tx_vlan_set_vlanid = + TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result, + vlan_id, UINT16); +cmdline_parse_token_num_t cmd_tx_vlan_set_portid = + TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_set_result, + port_id, UINT8); + +cmdline_parse_inst_t cmd_tx_vlan_set = { + .f = cmd_tx_vlan_set_parsed, + .data = NULL, + .help_str = "enable hardware insertion of a VLAN header with a given " + "TAG Identifier in packets sent on a port", + .tokens = { + (void *)&cmd_tx_vlan_set_tx_vlan, + (void *)&cmd_tx_vlan_set_set, + (void *)&cmd_tx_vlan_set_vlanid, + (void *)&cmd_tx_vlan_set_portid, + NULL, + }, +}; + +/* *** DISABLE HARDWARE INSERTION OF VLAN HEADER IN TX PACKETS *** */ +struct cmd_tx_vlan_reset_result { + cmdline_fixed_string_t tx_vlan; + cmdline_fixed_string_t reset; + uint8_t port_id; +}; + +static void +cmd_tx_vlan_reset_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_tx_vlan_reset_result *res = parsed_result; + + tx_vlan_reset(res->port_id); +} + +cmdline_parse_token_string_t cmd_tx_vlan_reset_tx_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result, + tx_vlan, "tx_vlan"); +cmdline_parse_token_string_t cmd_tx_vlan_reset_reset = + TOKEN_STRING_INITIALIZER(struct cmd_tx_vlan_reset_result, + reset, "reset"); +cmdline_parse_token_num_t cmd_tx_vlan_reset_portid = + TOKEN_NUM_INITIALIZER(struct cmd_tx_vlan_reset_result, + port_id, UINT8); + +cmdline_parse_inst_t cmd_tx_vlan_reset = { + .f = cmd_tx_vlan_reset_parsed, + .data = NULL, + .help_str = "disable hardware insertion of a VLAN header in packets " + "sent on a port", + .tokens = { + (void *)&cmd_tx_vlan_reset_tx_vlan, + (void *)&cmd_tx_vlan_reset_reset, + (void *)&cmd_tx_vlan_reset_portid, + NULL, + }, +}; + + +/* *** ENABLE HARDWARE INSERTION OF CHECKSUM IN TX PACKETS *** */ +struct cmd_tx_cksum_set_result { + cmdline_fixed_string_t tx_cksum; + cmdline_fixed_string_t set; + uint8_t cksum_mask; + uint8_t port_id; +}; + +static void +cmd_tx_cksum_set_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_tx_cksum_set_result *res = parsed_result; + + tx_cksum_set(res->port_id, res->cksum_mask); +} + +cmdline_parse_token_string_t cmd_tx_cksum_set_tx_cksum = + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_set_result, + tx_cksum, "tx_checksum"); +cmdline_parse_token_string_t cmd_tx_cksum_set_set = + TOKEN_STRING_INITIALIZER(struct cmd_tx_cksum_set_result, + set, "set"); +cmdline_parse_token_num_t cmd_tx_cksum_set_cksum_mask = + TOKEN_NUM_INITIALIZER(struct cmd_tx_cksum_set_result, + cksum_mask, UINT8); +cmdline_parse_token_num_t cmd_tx_cksum_set_portid = + TOKEN_NUM_INITIALIZER(struct cmd_tx_cksum_set_result, + port_id, UINT8); + +cmdline_parse_inst_t cmd_tx_cksum_set = { + .f = cmd_tx_cksum_set_parsed, + .data = NULL, + .help_str = "enable hardware insertion of L3/L4checksum with a given " + "mask in packets sent on a port, the bit mapping is given as, Bit 0 for ip" + "Bit 1 for UDP, Bit 2 for TCP, Bit 3 for SCTP", + .tokens = { + (void *)&cmd_tx_cksum_set_tx_cksum, + (void *)&cmd_tx_cksum_set_set, + (void *)&cmd_tx_cksum_set_cksum_mask, + (void *)&cmd_tx_cksum_set_portid, + NULL, + }, +}; + +/* *** SET FORWARDING MODE *** */ +struct cmd_set_fwd_mode_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t fwd; + cmdline_fixed_string_t mode; +}; + +static void cmd_set_fwd_mode_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_fwd_mode_result *res = parsed_result; + + set_pkt_forwarding_mode(res->mode); +} + +cmdline_parse_token_string_t cmd_setfwd_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, set, "set"); +cmdline_parse_token_string_t cmd_setfwd_fwd = + TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, fwd, "fwd"); +cmdline_parse_token_string_t cmd_setfwd_mode = + TOKEN_STRING_INITIALIZER(struct cmd_set_fwd_mode_result, mode, +#ifdef RTE_LIBRTE_IEEE1588 + "io#mac#rxonly#txonly#csum#ieee1588"); +#else + "io#mac#rxonly#txonly#csum"); +#endif + +cmdline_parse_inst_t cmd_set_fwd_mode = { + .f = cmd_set_fwd_mode_parsed, + .data = NULL, +#ifdef RTE_LIBRTE_IEEE1588 + .help_str = "set fwd io|mac|rxonly|txonly|csum|ieee1588 - set IO, MAC," + " RXONLY, TXONLY, CSUM or IEEE1588 packet forwarding mode", +#else + .help_str = "set fwd io|mac|rxonly|txonly|csum - set IO, MAC," + " RXONLY, CSUM or TXONLY packet forwarding mode", +#endif + .tokens = { + (void *)&cmd_setfwd_set, + (void *)&cmd_setfwd_fwd, + (void *)&cmd_setfwd_mode, + NULL, + }, +}; + +/* *** SET PROMISC MODE *** */ +struct cmd_set_promisc_mode_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t promisc; + cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ + uint8_t port_num; /* valid if "allports" argument == 0 */ + cmdline_fixed_string_t mode; +}; + +static void cmd_set_promisc_mode_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + void *allports) +{ + struct cmd_set_promisc_mode_result *res = parsed_result; + int enable; + portid_t i; + + if (!strcmp(res->mode, "on")) + enable = 1; + else + enable = 0; + + /* all ports */ + if (allports) { + for (i = 0; i < nb_ports; i++) { + if (enable) + rte_eth_promiscuous_enable(i); + else + rte_eth_promiscuous_disable(i); + } + } + else { + if (enable) + rte_eth_promiscuous_enable(res->port_num); + else + rte_eth_promiscuous_disable(res->port_num); + } +} + +cmdline_parse_token_string_t cmd_setpromisc_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, set, "set"); +cmdline_parse_token_string_t cmd_setpromisc_promisc = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, promisc, + "promisc"); +cmdline_parse_token_string_t cmd_setpromisc_portall = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, port_all, + "all"); +cmdline_parse_token_num_t cmd_setpromisc_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_set_promisc_mode_result, port_num, + UINT8); +cmdline_parse_token_string_t cmd_setpromisc_mode = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, mode, + "on#off"); + +cmdline_parse_inst_t cmd_set_promisc_mode_all = { + .f = cmd_set_promisc_mode_parsed, + .data = (void *)1, + .help_str = "set promisc all on|off: set promisc mode for all ports", + .tokens = { + (void *)&cmd_setpromisc_set, + (void *)&cmd_setpromisc_promisc, + (void *)&cmd_setpromisc_portall, + (void *)&cmd_setpromisc_mode, + NULL, + }, +}; + +cmdline_parse_inst_t cmd_set_promisc_mode_one = { + .f = cmd_set_promisc_mode_parsed, + .data = (void *)0, + .help_str = "set promisc X on|off: set promisc mode on port X", + .tokens = { + (void *)&cmd_setpromisc_set, + (void *)&cmd_setpromisc_promisc, + (void *)&cmd_setpromisc_portnum, + (void *)&cmd_setpromisc_mode, + NULL, + }, +}; + +/* *** SET ALLMULTI MODE *** */ +struct cmd_set_allmulti_mode_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t allmulti; + cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ + uint8_t port_num; /* valid if "allports" argument == 0 */ + cmdline_fixed_string_t mode; +}; + +static void cmd_set_allmulti_mode_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + void *allports) +{ + struct cmd_set_allmulti_mode_result *res = parsed_result; + int enable; + portid_t i; + + if (!strcmp(res->mode, "on")) + enable = 1; + else + enable = 0; + + /* all ports */ + if (allports) { + for (i = 0; i < nb_ports; i++) { + if (enable) + rte_eth_allmulticast_enable(i); + else + rte_eth_allmulticast_disable(i); + } + } + else { + if (enable) + rte_eth_allmulticast_enable(res->port_num); + else + rte_eth_allmulticast_disable(res->port_num); + } +} + +cmdline_parse_token_string_t cmd_setallmulti_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, set, "set"); +cmdline_parse_token_string_t cmd_setallmulti_allmulti = + TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, allmulti, + "allmulti"); +cmdline_parse_token_string_t cmd_setallmulti_portall = + TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, port_all, + "all"); +cmdline_parse_token_num_t cmd_setallmulti_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_set_allmulti_mode_result, port_num, + UINT8); +cmdline_parse_token_string_t cmd_setallmulti_mode = + TOKEN_STRING_INITIALIZER(struct cmd_set_allmulti_mode_result, mode, + "on#off"); + +cmdline_parse_inst_t cmd_set_allmulti_mode_all = { + .f = cmd_set_allmulti_mode_parsed, + .data = (void *)1, + .help_str = "set allmulti all on|off: set allmulti mode for all ports", + .tokens = { + (void *)&cmd_setallmulti_set, + (void *)&cmd_setallmulti_allmulti, + (void *)&cmd_setallmulti_portall, + (void *)&cmd_setallmulti_mode, + NULL, + }, +}; + +cmdline_parse_inst_t cmd_set_allmulti_mode_one = { + .f = cmd_set_allmulti_mode_parsed, + .data = (void *)0, + .help_str = "set allmulti X on|off: set allmulti mode on port X", + .tokens = { + (void *)&cmd_setallmulti_set, + (void *)&cmd_setallmulti_allmulti, + (void *)&cmd_setallmulti_portnum, + (void *)&cmd_setallmulti_mode, + NULL, + }, +}; + +/* *** ADD/REMOVE A PKT FILTER *** */ +struct cmd_pkt_filter_result { + cmdline_fixed_string_t pkt_filter; + uint8_t port_id; + cmdline_fixed_string_t protocol; + cmdline_fixed_string_t src; + cmdline_ipaddr_t ip_src; + uint16_t port_src; + cmdline_fixed_string_t dst; + cmdline_ipaddr_t ip_dst; + uint16_t port_dst; + cmdline_fixed_string_t flexbytes; + uint16_t flexbytes_value; + cmdline_fixed_string_t vlan; + uint16_t vlan_id; + cmdline_fixed_string_t queue; + int8_t queue_id; + cmdline_fixed_string_t soft; + uint8_t soft_id; +}; + +static void +cmd_pkt_filter_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct rte_fdir_filter fdir_filter; + struct cmd_pkt_filter_result *res = parsed_result; + + memset(&fdir_filter, 0, sizeof(struct rte_fdir_filter)); + + if (res->ip_src.family == AF_INET) + fdir_filter.ip_src.ipv4_addr = res->ip_src.addr.ipv4.s_addr; + else + memcpy(&(fdir_filter.ip_src.ipv6_addr), + &(res->ip_src.addr.ipv6), + sizeof(struct in6_addr)); + + if (res->ip_dst.family == AF_INET) + fdir_filter.ip_dst.ipv4_addr = res->ip_dst.addr.ipv4.s_addr; + else + memcpy(&(fdir_filter.ip_dst.ipv6_addr), + &(res->ip_dst.addr.ipv6), + sizeof(struct in6_addr)); + + fdir_filter.port_dst = rte_cpu_to_be_16(res->port_dst); + fdir_filter.port_src = rte_cpu_to_be_16(res->port_src); + + if (!strcmp(res->protocol, "udp")) + fdir_filter.l4type = RTE_FDIR_L4TYPE_UDP; + else if (!strcmp(res->protocol, "tcp")) + fdir_filter.l4type = RTE_FDIR_L4TYPE_TCP; + else if (!strcmp(res->protocol, "sctp")) + fdir_filter.l4type = RTE_FDIR_L4TYPE_SCTP; + else /* default only IP */ + fdir_filter.l4type = RTE_FDIR_L4TYPE_NONE; + + if (res->ip_dst.family == AF_INET6) + fdir_filter.iptype = RTE_FDIR_IPTYPE_IPV6; + else + fdir_filter.iptype = RTE_FDIR_IPTYPE_IPV4; + + fdir_filter.vlan_id = rte_cpu_to_be_16(res->vlan_id); + fdir_filter.flex_bytes = rte_cpu_to_be_16(res->flexbytes_value); + + if (!strcmp(res->pkt_filter, "add_signature_filter")) + fdir_add_signature_filter(res->port_id, res->queue_id, + &fdir_filter); + else if (!strcmp(res->pkt_filter, "upd_signature_filter")) + fdir_update_signature_filter(res->port_id, res->queue_id, + &fdir_filter); + else if (!strcmp(res->pkt_filter, "rm_signature_filter")) + fdir_remove_signature_filter(res->port_id, &fdir_filter); + else if (!strcmp(res->pkt_filter, "add_perfect_filter")) + fdir_add_perfect_filter(res->port_id, res->soft_id, + res->queue_id, + (uint8_t) (res->queue_id < 0), + &fdir_filter); + else if (!strcmp(res->pkt_filter, "upd_perfect_filter")) + fdir_update_perfect_filter(res->port_id, res->soft_id, + res->queue_id, + (uint8_t) (res->queue_id < 0), + &fdir_filter); + else if (!strcmp(res->pkt_filter, "rm_perfect_filter")) + fdir_remove_perfect_filter(res->port_id, res->soft_id, + &fdir_filter); + +} + + +cmdline_parse_token_num_t cmd_pkt_filter_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + port_id, UINT8); +cmdline_parse_token_string_t cmd_pkt_filter_protocol = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + protocol, "ip#tcp#udp#sctp"); +cmdline_parse_token_string_t cmd_pkt_filter_src = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + src, "src"); +cmdline_parse_token_ipaddr_t cmd_pkt_filter_ip_src = + TOKEN_IPADDR_INITIALIZER(struct cmd_pkt_filter_result, + ip_src); +cmdline_parse_token_num_t cmd_pkt_filter_port_src = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + port_src, UINT16); +cmdline_parse_token_string_t cmd_pkt_filter_dst = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + dst, "dst"); +cmdline_parse_token_ipaddr_t cmd_pkt_filter_ip_dst = + TOKEN_IPADDR_INITIALIZER(struct cmd_pkt_filter_result, + ip_dst); +cmdline_parse_token_num_t cmd_pkt_filter_port_dst = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + port_dst, UINT16); +cmdline_parse_token_string_t cmd_pkt_filter_flexbytes = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + flexbytes, "flexbytes"); +cmdline_parse_token_num_t cmd_pkt_filter_flexbytes_value = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + flexbytes_value, UINT16); +cmdline_parse_token_string_t cmd_pkt_filter_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + vlan, "vlan"); +cmdline_parse_token_num_t cmd_pkt_filter_vlan_id = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + vlan_id, UINT16); +cmdline_parse_token_string_t cmd_pkt_filter_queue = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + queue, "queue"); +cmdline_parse_token_num_t cmd_pkt_filter_queue_id = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + queue_id, INT8); +cmdline_parse_token_string_t cmd_pkt_filter_soft = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + soft, "soft"); +cmdline_parse_token_num_t cmd_pkt_filter_soft_id = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_result, + soft_id, UINT16); + + +cmdline_parse_token_string_t cmd_pkt_filter_add_signature_filter = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + pkt_filter, "add_signature_filter"); +cmdline_parse_inst_t cmd_add_signature_filter = { + .f = cmd_pkt_filter_parsed, + .data = NULL, + .help_str = "add a signature filter", + .tokens = { + (void *)&cmd_pkt_filter_add_signature_filter, + (void *)&cmd_pkt_filter_port_id, + (void *)&cmd_pkt_filter_protocol, + (void *)&cmd_pkt_filter_src, + (void *)&cmd_pkt_filter_ip_src, + (void *)&cmd_pkt_filter_port_src, + (void *)&cmd_pkt_filter_dst, + (void *)&cmd_pkt_filter_ip_dst, + (void *)&cmd_pkt_filter_port_dst, + (void *)&cmd_pkt_filter_flexbytes, + (void *)&cmd_pkt_filter_flexbytes_value, + (void *)&cmd_pkt_filter_vlan, + (void *)&cmd_pkt_filter_vlan_id, + (void *)&cmd_pkt_filter_queue, + (void *)&cmd_pkt_filter_queue_id, + NULL, + }, +}; + + +cmdline_parse_token_string_t cmd_pkt_filter_upd_signature_filter = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + pkt_filter, "upd_signature_filter"); +cmdline_parse_inst_t cmd_upd_signature_filter = { + .f = cmd_pkt_filter_parsed, + .data = NULL, + .help_str = "update a signature filter", + .tokens = { + (void *)&cmd_pkt_filter_upd_signature_filter, + (void *)&cmd_pkt_filter_port_id, + (void *)&cmd_pkt_filter_protocol, + (void *)&cmd_pkt_filter_src, + (void *)&cmd_pkt_filter_ip_src, + (void *)&cmd_pkt_filter_port_src, + (void *)&cmd_pkt_filter_dst, + (void *)&cmd_pkt_filter_ip_dst, + (void *)&cmd_pkt_filter_port_dst, + (void *)&cmd_pkt_filter_flexbytes, + (void *)&cmd_pkt_filter_flexbytes_value, + (void *)&cmd_pkt_filter_vlan, + (void *)&cmd_pkt_filter_vlan_id, + (void *)&cmd_pkt_filter_queue, + (void *)&cmd_pkt_filter_queue_id, + NULL, + }, +}; + + +cmdline_parse_token_string_t cmd_pkt_filter_rm_signature_filter = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + pkt_filter, "rm_signature_filter"); +cmdline_parse_inst_t cmd_rm_signature_filter = { + .f = cmd_pkt_filter_parsed, + .data = NULL, + .help_str = "remove a signature filter", + .tokens = { + (void *)&cmd_pkt_filter_rm_signature_filter, + (void *)&cmd_pkt_filter_port_id, + (void *)&cmd_pkt_filter_protocol, + (void *)&cmd_pkt_filter_src, + (void *)&cmd_pkt_filter_ip_src, + (void *)&cmd_pkt_filter_port_src, + (void *)&cmd_pkt_filter_dst, + (void *)&cmd_pkt_filter_ip_dst, + (void *)&cmd_pkt_filter_port_dst, + (void *)&cmd_pkt_filter_flexbytes, + (void *)&cmd_pkt_filter_flexbytes_value, + (void *)&cmd_pkt_filter_vlan, + (void *)&cmd_pkt_filter_vlan_id, + NULL + }, +}; + + +cmdline_parse_token_string_t cmd_pkt_filter_add_perfect_filter = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + pkt_filter, "add_perfect_filter"); +cmdline_parse_inst_t cmd_add_perfect_filter = { + .f = cmd_pkt_filter_parsed, + .data = NULL, + .help_str = "add a perfect filter", + .tokens = { + (void *)&cmd_pkt_filter_add_perfect_filter, + (void *)&cmd_pkt_filter_port_id, + (void *)&cmd_pkt_filter_protocol, + (void *)&cmd_pkt_filter_src, + (void *)&cmd_pkt_filter_ip_src, + (void *)&cmd_pkt_filter_port_src, + (void *)&cmd_pkt_filter_dst, + (void *)&cmd_pkt_filter_ip_dst, + (void *)&cmd_pkt_filter_port_dst, + (void *)&cmd_pkt_filter_flexbytes, + (void *)&cmd_pkt_filter_flexbytes_value, + (void *)&cmd_pkt_filter_vlan, + (void *)&cmd_pkt_filter_vlan_id, + (void *)&cmd_pkt_filter_queue, + (void *)&cmd_pkt_filter_queue_id, + (void *)&cmd_pkt_filter_soft, + (void *)&cmd_pkt_filter_soft_id, + NULL, + }, +}; + + +cmdline_parse_token_string_t cmd_pkt_filter_upd_perfect_filter = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + pkt_filter, "upd_perfect_filter"); +cmdline_parse_inst_t cmd_upd_perfect_filter = { + .f = cmd_pkt_filter_parsed, + .data = NULL, + .help_str = "update a perfect filter", + .tokens = { + (void *)&cmd_pkt_filter_upd_perfect_filter, + (void *)&cmd_pkt_filter_port_id, + (void *)&cmd_pkt_filter_protocol, + (void *)&cmd_pkt_filter_src, + (void *)&cmd_pkt_filter_ip_src, + (void *)&cmd_pkt_filter_port_src, + (void *)&cmd_pkt_filter_dst, + (void *)&cmd_pkt_filter_ip_dst, + (void *)&cmd_pkt_filter_port_dst, + (void *)&cmd_pkt_filter_flexbytes, + (void *)&cmd_pkt_filter_flexbytes_value, + (void *)&cmd_pkt_filter_vlan, + (void *)&cmd_pkt_filter_vlan_id, + (void *)&cmd_pkt_filter_queue, + (void *)&cmd_pkt_filter_queue_id, + (void *)&cmd_pkt_filter_soft, + (void *)&cmd_pkt_filter_soft_id, + NULL, + }, +}; + + +cmdline_parse_token_string_t cmd_pkt_filter_rm_perfect_filter = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_result, + pkt_filter, "rm_perfect_filter"); +cmdline_parse_inst_t cmd_rm_perfect_filter = { + .f = cmd_pkt_filter_parsed, + .data = NULL, + .help_str = "remove a perfect filter", + .tokens = { + (void *)&cmd_pkt_filter_rm_perfect_filter, + (void *)&cmd_pkt_filter_port_id, + (void *)&cmd_pkt_filter_protocol, + (void *)&cmd_pkt_filter_src, + (void *)&cmd_pkt_filter_ip_src, + (void *)&cmd_pkt_filter_port_src, + (void *)&cmd_pkt_filter_dst, + (void *)&cmd_pkt_filter_ip_dst, + (void *)&cmd_pkt_filter_port_dst, + (void *)&cmd_pkt_filter_flexbytes, + (void *)&cmd_pkt_filter_flexbytes_value, + (void *)&cmd_pkt_filter_vlan, + (void *)&cmd_pkt_filter_vlan_id, + (void *)&cmd_pkt_filter_soft, + (void *)&cmd_pkt_filter_soft_id, + NULL, + }, +}; + +/* *** SETUP MASKS FILTER *** */ +struct cmd_pkt_filter_masks_result { + cmdline_fixed_string_t filter_mask; + uint8_t port_id; + cmdline_fixed_string_t src_mask; + uint32_t ip_src_mask; + uint16_t port_src_mask; + cmdline_fixed_string_t dst_mask; + uint32_t ip_dst_mask; + uint16_t port_dst_mask; + cmdline_fixed_string_t flexbytes; + uint8_t flexbytes_value; + cmdline_fixed_string_t vlan_id; + uint8_t vlan_id_value; + cmdline_fixed_string_t vlan_prio; + uint8_t vlan_prio_value; + cmdline_fixed_string_t only_ip_flow; + uint8_t only_ip_flow_value; +}; + +static void +cmd_pkt_filter_masks_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct rte_fdir_masks fdir_masks; + struct cmd_pkt_filter_masks_result *res = parsed_result; + + memset(&fdir_masks, 0, sizeof(struct rte_fdir_masks)); + + fdir_masks.only_ip_flow = res->only_ip_flow_value; + fdir_masks.vlan_id = res->vlan_id_value; + fdir_masks.vlan_prio = res->vlan_prio_value; + fdir_masks.dst_ipv4_mask = res->ip_dst_mask; + fdir_masks.src_ipv4_mask = res->ip_src_mask; + fdir_masks.src_port_mask = res->port_src_mask; + fdir_masks.dst_port_mask = res->port_dst_mask; + fdir_masks.flexbytes = res->flexbytes_value; + + fdir_set_masks(res->port_id, &fdir_masks); +} + +cmdline_parse_token_string_t cmd_pkt_filter_masks_filter_mask = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + filter_mask, "set_masks_filter"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + port_id, UINT8); +cmdline_parse_token_string_t cmd_pkt_filter_masks_only_ip_flow = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + only_ip_flow, "only_ip_flow"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_only_ip_flow_value = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + only_ip_flow_value, UINT8); +cmdline_parse_token_string_t cmd_pkt_filter_masks_src_mask = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + src_mask, "src_mask"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_ip_src_mask = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + ip_src_mask, UINT32); +cmdline_parse_token_num_t cmd_pkt_filter_masks_port_src_mask = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + port_src_mask, UINT16); +cmdline_parse_token_string_t cmd_pkt_filter_masks_dst_mask = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + src_mask, "dst_mask"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_ip_dst_mask = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + ip_dst_mask, UINT32); +cmdline_parse_token_num_t cmd_pkt_filter_masks_port_dst_mask = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + port_dst_mask, UINT16); +cmdline_parse_token_string_t cmd_pkt_filter_masks_flexbytes = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + flexbytes, "flexbytes"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_flexbytes_value = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + flexbytes_value, UINT8); +cmdline_parse_token_string_t cmd_pkt_filter_masks_vlan_id = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + vlan_id, "vlan_id"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_vlan_id_value = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + vlan_id_value, UINT8); +cmdline_parse_token_string_t cmd_pkt_filter_masks_vlan_prio = + TOKEN_STRING_INITIALIZER(struct cmd_pkt_filter_masks_result, + vlan_prio, "vlan_prio"); +cmdline_parse_token_num_t cmd_pkt_filter_masks_vlan_prio_value = + TOKEN_NUM_INITIALIZER(struct cmd_pkt_filter_masks_result, + vlan_prio_value, UINT8); + +cmdline_parse_inst_t cmd_set_masks_filter = { + .f = cmd_pkt_filter_masks_parsed, + .data = NULL, + .help_str = "setup masks filter", + .tokens = { + (void *)&cmd_pkt_filter_masks_filter_mask, + (void *)&cmd_pkt_filter_masks_port_id, + (void *)&cmd_pkt_filter_masks_only_ip_flow, + (void *)&cmd_pkt_filter_masks_only_ip_flow_value, + (void *)&cmd_pkt_filter_masks_src_mask, + (void *)&cmd_pkt_filter_masks_ip_src_mask, + (void *)&cmd_pkt_filter_masks_port_src_mask, + (void *)&cmd_pkt_filter_masks_dst_mask, + (void *)&cmd_pkt_filter_masks_ip_dst_mask, + (void *)&cmd_pkt_filter_masks_port_dst_mask, + (void *)&cmd_pkt_filter_masks_flexbytes, + (void *)&cmd_pkt_filter_masks_flexbytes_value, + (void *)&cmd_pkt_filter_masks_vlan_id, + (void *)&cmd_pkt_filter_masks_vlan_id_value, + (void *)&cmd_pkt_filter_masks_vlan_prio, + (void *)&cmd_pkt_filter_masks_vlan_prio_value, + NULL, + }, +}; + +/* *** SETUP ETHERNET LINK FLOW CONTROL *** */ +struct cmd_link_flow_ctrl_set_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t flow_ctrl; + cmdline_fixed_string_t rx; + cmdline_fixed_string_t rx_lfc_mode; + cmdline_fixed_string_t tx; + cmdline_fixed_string_t tx_lfc_mode; + uint32_t high_water; + uint32_t low_water; + uint16_t pause_time; + uint16_t send_xon; + uint8_t port_id; +}; + +static void +cmd_link_flow_ctrl_set_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_link_flow_ctrl_set_result *res = parsed_result; + struct rte_eth_fc_conf fc_conf; + int rx_fc_enable, tx_fc_enable; + int ret; + + /* + * Rx on/off, flow control is enabled/disabled on RX side. This can indicate + * the RTE_FC_TX_PAUSE, Transmit pause frame at the Rx side. + * Tx on/off, flow control is enabled/disabled on TX side. This can indicate + * the RTE_FC_RX_PAUSE, Respond to the pause frame at the Tx side. + */ + static enum rte_eth_fc_mode rx_tx_onoff_2_lfc_mode[2][2] = { + {RTE_FC_NONE, RTE_FC_RX_PAUSE}, {RTE_FC_TX_PAUSE, RTE_FC_FULL} + }; + + rx_fc_enable = (!strcmp(res->rx_lfc_mode, "on")) ? 1 : 0; + tx_fc_enable = (!strcmp(res->tx_lfc_mode, "on")) ? 1 : 0; + + fc_conf.mode = rx_tx_onoff_2_lfc_mode[rx_fc_enable][tx_fc_enable]; + fc_conf.high_water = res->high_water; + fc_conf.low_water = res->low_water; + fc_conf.pause_time = res->pause_time; + fc_conf.send_xon = res->send_xon; + + ret = rte_eth_dev_flow_ctrl_set(res->port_id, &fc_conf); + if (ret != 0) + printf("bad flow contrl parameter, return code = %d \n", ret); +} + +cmdline_parse_token_string_t cmd_lfc_set_set = + TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + set, "set"); +cmdline_parse_token_string_t cmd_lfc_set_flow_ctrl = + TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + flow_ctrl, "flow_ctrl"); +cmdline_parse_token_string_t cmd_lfc_set_rx = + TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + rx, "rx"); +cmdline_parse_token_string_t cmd_lfc_set_rx_mode = + TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + rx_lfc_mode, "on#off"); +cmdline_parse_token_string_t cmd_lfc_set_tx = + TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + tx, "tx"); +cmdline_parse_token_string_t cmd_lfc_set_tx_mode = + TOKEN_STRING_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + tx_lfc_mode, "on#off"); +cmdline_parse_token_num_t cmd_lfc_set_high_water = + TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + high_water, UINT32); +cmdline_parse_token_num_t cmd_lfc_set_low_water = + TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + low_water, UINT32); +cmdline_parse_token_num_t cmd_lfc_set_pause_time = + TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + pause_time, UINT16); +cmdline_parse_token_num_t cmd_lfc_set_send_xon = + TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + send_xon, UINT16); +cmdline_parse_token_num_t cmd_lfc_set_portid = + TOKEN_NUM_INITIALIZER(struct cmd_link_flow_ctrl_set_result, + port_id, UINT8); + +cmdline_parse_inst_t cmd_link_flow_control_set = { + .f = cmd_link_flow_ctrl_set_parsed, + .data = NULL, + .help_str = "Configure the Ethernet link flow control...", + .tokens = { + (void *)&cmd_lfc_set_set, + (void *)&cmd_lfc_set_flow_ctrl, + (void *)&cmd_lfc_set_rx, + (void *)&cmd_lfc_set_rx_mode, + (void *)&cmd_lfc_set_tx, + (void *)&cmd_lfc_set_tx_mode, + (void *)&cmd_lfc_set_high_water, + (void *)&cmd_lfc_set_low_water, + (void *)&cmd_lfc_set_pause_time, + (void *)&cmd_lfc_set_send_xon, + (void *)&cmd_lfc_set_portid, + NULL, + }, +}; + +/* *** RESET CONFIGURATION *** */ +struct cmd_reset_result { + cmdline_fixed_string_t reset; + cmdline_fixed_string_t def; +}; + +static void cmd_reset_parsed(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, + __attribute__((unused)) void *data) +{ + cmdline_printf(cl, "Reset to default forwarding configuration...\n"); + set_def_fwd_config(); +} + +cmdline_parse_token_string_t cmd_reset_set = + TOKEN_STRING_INITIALIZER(struct cmd_reset_result, reset, "set"); +cmdline_parse_token_string_t cmd_reset_def = + TOKEN_STRING_INITIALIZER(struct cmd_reset_result, def, + "default"); + +cmdline_parse_inst_t cmd_reset = { + .f = cmd_reset_parsed, + .data = NULL, + .help_str = "set default: reset default forwarding configuration", + .tokens = { + (void *)&cmd_reset_set, + (void *)&cmd_reset_def, + NULL, + }, +}; + +/* *** START FORWARDING *** */ +struct cmd_start_result { + cmdline_fixed_string_t start; +}; + +cmdline_parse_token_string_t cmd_start_start = + TOKEN_STRING_INITIALIZER(struct cmd_start_result, start, "start"); + +static void cmd_start_parsed(__attribute__((unused)) void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + start_packet_forwarding(0); +} + +cmdline_parse_inst_t cmd_start = { + .f = cmd_start_parsed, + .data = NULL, + .help_str = "start packet forwarding", + .tokens = { + (void *)&cmd_start_start, + NULL, + }, +}; + +/* *** START FORWARDING WITH ONE TX BURST FIRST *** */ +struct cmd_start_tx_first_result { + cmdline_fixed_string_t start; + cmdline_fixed_string_t tx_first; +}; + +static void +cmd_start_tx_first_parsed(__attribute__((unused)) void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + start_packet_forwarding(1); +} + +cmdline_parse_token_string_t cmd_start_tx_first_start = + TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, start, + "start"); +cmdline_parse_token_string_t cmd_start_tx_first_tx_first = + TOKEN_STRING_INITIALIZER(struct cmd_start_tx_first_result, + tx_first, "tx_first"); + +cmdline_parse_inst_t cmd_start_tx_first = { + .f = cmd_start_tx_first_parsed, + .data = NULL, + .help_str = "start packet forwarding, after sending 1 burst of packets", + .tokens = { + (void *)&cmd_start_tx_first_start, + (void *)&cmd_start_tx_first_tx_first, + NULL, + }, +}; + +/* *** SHOW CFG *** */ +struct cmd_showcfg_result { + cmdline_fixed_string_t show; + cmdline_fixed_string_t cfg; + cmdline_fixed_string_t what; +}; + +static void cmd_showcfg_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_showcfg_result *res = parsed_result; + if (!strcmp(res->what, "rxtx")) + rxtx_config_display(); + else if (!strcmp(res->what, "cores")) + fwd_lcores_config_display(); + else if (!strcmp(res->what, "fwd")) + fwd_config_display(); +} + +cmdline_parse_token_string_t cmd_showcfg_show = + TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, show, "show"); +cmdline_parse_token_string_t cmd_showcfg_port = + TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, cfg, "config"); +cmdline_parse_token_string_t cmd_showcfg_what = + TOKEN_STRING_INITIALIZER(struct cmd_showcfg_result, what, + "rxtx#cores#fwd"); + +cmdline_parse_inst_t cmd_showcfg = { + .f = cmd_showcfg_parsed, + .data = NULL, + .help_str = "show config rxtx|cores|fwd", + .tokens = { + (void *)&cmd_showcfg_show, + (void *)&cmd_showcfg_port, + (void *)&cmd_showcfg_what, + NULL, + }, +}; + +/* *** SHOW ALL PORT INFO *** */ +struct cmd_showportall_result { + cmdline_fixed_string_t show; + cmdline_fixed_string_t port; + cmdline_fixed_string_t what; + cmdline_fixed_string_t all; +}; + +static void cmd_showportall_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + portid_t i; + + struct cmd_showportall_result *res = parsed_result; + if (!strcmp(res->show, "clear")) { + if (!strcmp(res->what, "stats")) + for (i = 0; i < nb_ports; i++) + nic_stats_clear(i); + } else if (!strcmp(res->what, "info")) + for (i = 0; i < nb_ports; i++) + port_infos_display(i); + else if (!strcmp(res->what, "stats")) + for (i = 0; i < nb_ports; i++) + nic_stats_display(i); + else if (!strcmp(res->what, "fdir")) + for (i = 0; i < nb_ports; i++) + fdir_get_infos(i); +} + +cmdline_parse_token_string_t cmd_showportall_show = + TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, show, + "show#clear"); +cmdline_parse_token_string_t cmd_showportall_port = + TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, port, "port"); +cmdline_parse_token_string_t cmd_showportall_what = + TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, what, + "info#stats#fdir"); +cmdline_parse_token_string_t cmd_showportall_all = + TOKEN_STRING_INITIALIZER(struct cmd_showportall_result, all, "all"); +cmdline_parse_inst_t cmd_showportall = { + .f = cmd_showportall_parsed, + .data = NULL, + .help_str = "show|clear port info|stats|fdir all", + .tokens = { + (void *)&cmd_showportall_show, + (void *)&cmd_showportall_port, + (void *)&cmd_showportall_what, + (void *)&cmd_showportall_all, + NULL, + }, +}; + +/* *** SHOW PORT INFO *** */ +struct cmd_showport_result { + cmdline_fixed_string_t show; + cmdline_fixed_string_t port; + cmdline_fixed_string_t what; + uint8_t portnum; +}; + +static void cmd_showport_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_showport_result *res = parsed_result; + if (!strcmp(res->show, "clear")) { + if (!strcmp(res->what, "stats")) + nic_stats_clear(res->portnum); + } else if (!strcmp(res->what, "info")) + port_infos_display(res->portnum); + else if (!strcmp(res->what, "stats")) + nic_stats_display(res->portnum); + else if (!strcmp(res->what, "fdir")) + fdir_get_infos(res->portnum); +} + +cmdline_parse_token_string_t cmd_showport_show = + TOKEN_STRING_INITIALIZER(struct cmd_showport_result, show, + "show#clear"); +cmdline_parse_token_string_t cmd_showport_port = + TOKEN_STRING_INITIALIZER(struct cmd_showport_result, port, "port"); +cmdline_parse_token_string_t cmd_showport_what = + TOKEN_STRING_INITIALIZER(struct cmd_showport_result, what, + "info#stats#fdir"); +cmdline_parse_token_num_t cmd_showport_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_showport_result, portnum, INT32); + +cmdline_parse_inst_t cmd_showport = { + .f = cmd_showport_parsed, + .data = NULL, + .help_str = "show|clear port info|stats|fdir X (X = port number)", + .tokens = { + (void *)&cmd_showport_show, + (void *)&cmd_showport_port, + (void *)&cmd_showport_what, + (void *)&cmd_showport_portnum, + NULL, + }, +}; + +/* *** READ PORT REGISTER *** */ +struct cmd_read_reg_result { + cmdline_fixed_string_t read; + cmdline_fixed_string_t reg; + uint8_t port_id; + uint32_t reg_off; +}; + +static void +cmd_read_reg_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_read_reg_result *res = parsed_result; + port_reg_display(res->port_id, res->reg_off); +} + +cmdline_parse_token_string_t cmd_read_reg_read = + TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, read, "read"); +cmdline_parse_token_string_t cmd_read_reg_reg = + TOKEN_STRING_INITIALIZER(struct cmd_read_reg_result, reg, "reg"); +cmdline_parse_token_num_t cmd_read_reg_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, port_id, UINT8); +cmdline_parse_token_num_t cmd_read_reg_reg_off = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_result, reg_off, UINT32); + +cmdline_parse_inst_t cmd_read_reg = { + .f = cmd_read_reg_parsed, + .data = NULL, + .help_str = "read reg port_id reg_off", + .tokens = { + (void *)&cmd_read_reg_read, + (void *)&cmd_read_reg_reg, + (void *)&cmd_read_reg_port_id, + (void *)&cmd_read_reg_reg_off, + NULL, + }, +}; + +/* *** READ PORT REGISTER BIT FIELD *** */ +struct cmd_read_reg_bit_field_result { + cmdline_fixed_string_t read; + cmdline_fixed_string_t regfield; + uint8_t port_id; + uint32_t reg_off; + uint8_t bit1_pos; + uint8_t bit2_pos; +}; + +static void +cmd_read_reg_bit_field_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_read_reg_bit_field_result *res = parsed_result; + port_reg_bit_field_display(res->port_id, res->reg_off, + res->bit1_pos, res->bit2_pos); +} + +cmdline_parse_token_string_t cmd_read_reg_bit_field_read = + TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, read, + "read"); +cmdline_parse_token_string_t cmd_read_reg_bit_field_regfield = + TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_field_result, + regfield, "regfield"); +cmdline_parse_token_num_t cmd_read_reg_bit_field_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, port_id, + UINT8); +cmdline_parse_token_num_t cmd_read_reg_bit_field_reg_off = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, reg_off, + UINT32); +cmdline_parse_token_num_t cmd_read_reg_bit_field_bit1_pos = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit1_pos, + UINT8); +cmdline_parse_token_num_t cmd_read_reg_bit_field_bit2_pos = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_field_result, bit2_pos, + UINT8); + +cmdline_parse_inst_t cmd_read_reg_bit_field = { + .f = cmd_read_reg_bit_field_parsed, + .data = NULL, + .help_str = "read regfield port_id reg_off bit_x bit_y " + "(read register bit field between bit_x and bit_y included)", + .tokens = { + (void *)&cmd_read_reg_bit_field_read, + (void *)&cmd_read_reg_bit_field_regfield, + (void *)&cmd_read_reg_bit_field_port_id, + (void *)&cmd_read_reg_bit_field_reg_off, + (void *)&cmd_read_reg_bit_field_bit1_pos, + (void *)&cmd_read_reg_bit_field_bit2_pos, + NULL, + }, +}; + +/* *** READ PORT REGISTER BIT *** */ +struct cmd_read_reg_bit_result { + cmdline_fixed_string_t read; + cmdline_fixed_string_t regbit; + uint8_t port_id; + uint32_t reg_off; + uint8_t bit_pos; +}; + +static void +cmd_read_reg_bit_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_read_reg_bit_result *res = parsed_result; + port_reg_bit_display(res->port_id, res->reg_off, res->bit_pos); +} + +cmdline_parse_token_string_t cmd_read_reg_bit_read = + TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, read, "read"); +cmdline_parse_token_string_t cmd_read_reg_bit_regbit = + TOKEN_STRING_INITIALIZER(struct cmd_read_reg_bit_result, + regbit, "regbit"); +cmdline_parse_token_num_t cmd_read_reg_bit_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, port_id, UINT8); +cmdline_parse_token_num_t cmd_read_reg_bit_reg_off = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, reg_off, UINT32); +cmdline_parse_token_num_t cmd_read_reg_bit_bit_pos = + TOKEN_NUM_INITIALIZER(struct cmd_read_reg_bit_result, bit_pos, UINT8); + +cmdline_parse_inst_t cmd_read_reg_bit = { + .f = cmd_read_reg_bit_parsed, + .data = NULL, + .help_str = "read regbit port_id reg_off bit_x (0 <= bit_x <= 31)", + .tokens = { + (void *)&cmd_read_reg_bit_read, + (void *)&cmd_read_reg_bit_regbit, + (void *)&cmd_read_reg_bit_port_id, + (void *)&cmd_read_reg_bit_reg_off, + (void *)&cmd_read_reg_bit_bit_pos, + NULL, + }, +}; + +/* *** WRITE PORT REGISTER *** */ +struct cmd_write_reg_result { + cmdline_fixed_string_t write; + cmdline_fixed_string_t reg; + uint8_t port_id; + uint32_t reg_off; + uint32_t value; +}; + +static void +cmd_write_reg_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_write_reg_result *res = parsed_result; + port_reg_set(res->port_id, res->reg_off, res->value); +} + +cmdline_parse_token_string_t cmd_write_reg_write = + TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, write, "write"); +cmdline_parse_token_string_t cmd_write_reg_reg = + TOKEN_STRING_INITIALIZER(struct cmd_write_reg_result, reg, "reg"); +cmdline_parse_token_num_t cmd_write_reg_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, port_id, UINT8); +cmdline_parse_token_num_t cmd_write_reg_reg_off = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, reg_off, UINT32); +cmdline_parse_token_num_t cmd_write_reg_value = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_result, value, UINT32); + +cmdline_parse_inst_t cmd_write_reg = { + .f = cmd_write_reg_parsed, + .data = NULL, + .help_str = "write reg port_id reg_off reg_value", + .tokens = { + (void *)&cmd_write_reg_write, + (void *)&cmd_write_reg_reg, + (void *)&cmd_write_reg_port_id, + (void *)&cmd_write_reg_reg_off, + (void *)&cmd_write_reg_value, + NULL, + }, +}; + +/* *** WRITE PORT REGISTER BIT FIELD *** */ +struct cmd_write_reg_bit_field_result { + cmdline_fixed_string_t write; + cmdline_fixed_string_t regfield; + uint8_t port_id; + uint32_t reg_off; + uint8_t bit1_pos; + uint8_t bit2_pos; + uint32_t value; +}; + +static void +cmd_write_reg_bit_field_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_write_reg_bit_field_result *res = parsed_result; + port_reg_bit_field_set(res->port_id, res->reg_off, + res->bit1_pos, res->bit2_pos, res->value); +} + +cmdline_parse_token_string_t cmd_write_reg_bit_field_write = + TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, write, + "write"); +cmdline_parse_token_string_t cmd_write_reg_bit_field_regfield = + TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_field_result, + regfield, "regfield"); +cmdline_parse_token_num_t cmd_write_reg_bit_field_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, port_id, + UINT8); +cmdline_parse_token_num_t cmd_write_reg_bit_field_reg_off = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, reg_off, + UINT32); +cmdline_parse_token_num_t cmd_write_reg_bit_field_bit1_pos = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit1_pos, + UINT8); +cmdline_parse_token_num_t cmd_write_reg_bit_field_bit2_pos = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, bit2_pos, + UINT8); +cmdline_parse_token_num_t cmd_write_reg_bit_field_value = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_field_result, value, + UINT32); + +cmdline_parse_inst_t cmd_write_reg_bit_field = { + .f = cmd_write_reg_bit_field_parsed, + .data = NULL, + .help_str = "write regfield port_id reg_off bit_x bit_y reg_value" + "(set register bit field between bit_x and bit_y included)", + .tokens = { + (void *)&cmd_write_reg_bit_field_write, + (void *)&cmd_write_reg_bit_field_regfield, + (void *)&cmd_write_reg_bit_field_port_id, + (void *)&cmd_write_reg_bit_field_reg_off, + (void *)&cmd_write_reg_bit_field_bit1_pos, + (void *)&cmd_write_reg_bit_field_bit2_pos, + (void *)&cmd_write_reg_bit_field_value, + NULL, + }, +}; + +/* *** WRITE PORT REGISTER BIT *** */ +struct cmd_write_reg_bit_result { + cmdline_fixed_string_t write; + cmdline_fixed_string_t regbit; + uint8_t port_id; + uint32_t reg_off; + uint8_t bit_pos; + uint8_t value; +}; + +static void +cmd_write_reg_bit_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_write_reg_bit_result *res = parsed_result; + port_reg_bit_set(res->port_id, res->reg_off, res->bit_pos, res->value); +} + +cmdline_parse_token_string_t cmd_write_reg_bit_write = + TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, write, + "write"); +cmdline_parse_token_string_t cmd_write_reg_bit_regbit = + TOKEN_STRING_INITIALIZER(struct cmd_write_reg_bit_result, + regbit, "regbit"); +cmdline_parse_token_num_t cmd_write_reg_bit_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, port_id, UINT8); +cmdline_parse_token_num_t cmd_write_reg_bit_reg_off = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, reg_off, UINT32); +cmdline_parse_token_num_t cmd_write_reg_bit_bit_pos = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, bit_pos, UINT8); +cmdline_parse_token_num_t cmd_write_reg_bit_value = + TOKEN_NUM_INITIALIZER(struct cmd_write_reg_bit_result, value, UINT8); + +cmdline_parse_inst_t cmd_write_reg_bit = { + .f = cmd_write_reg_bit_parsed, + .data = NULL, + .help_str = "write regbit port_id reg_off bit_x 0/1 (0 <= bit_x <= 31)", + .tokens = { + (void *)&cmd_write_reg_bit_write, + (void *)&cmd_write_reg_bit_regbit, + (void *)&cmd_write_reg_bit_port_id, + (void *)&cmd_write_reg_bit_reg_off, + (void *)&cmd_write_reg_bit_bit_pos, + (void *)&cmd_write_reg_bit_value, + NULL, + }, +}; + +/* *** READ A RING DESCRIPTOR OF A PORT RX/TX QUEUE *** */ +struct cmd_read_rxd_txd_result { + cmdline_fixed_string_t read; + cmdline_fixed_string_t rxd_txd; + uint8_t port_id; + uint16_t queue_id; + uint16_t desc_id; +}; + +static void +cmd_read_rxd_txd_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_read_rxd_txd_result *res = parsed_result; + + if (!strcmp(res->rxd_txd, "rxd")) + rx_ring_desc_display(res->port_id, res->queue_id, res->desc_id); + else if (!strcmp(res->rxd_txd, "txd")) + tx_ring_desc_display(res->port_id, res->queue_id, res->desc_id); +} + +cmdline_parse_token_string_t cmd_read_rxd_txd_read = + TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, read, "read"); +cmdline_parse_token_string_t cmd_read_rxd_txd_rxd_txd = + TOKEN_STRING_INITIALIZER(struct cmd_read_rxd_txd_result, rxd_txd, + "rxd#txd"); +cmdline_parse_token_num_t cmd_read_rxd_txd_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, port_id, UINT8); +cmdline_parse_token_num_t cmd_read_rxd_txd_queue_id = + TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, queue_id, UINT16); +cmdline_parse_token_num_t cmd_read_rxd_txd_desc_id = + TOKEN_NUM_INITIALIZER(struct cmd_read_rxd_txd_result, desc_id, UINT16); + +cmdline_parse_inst_t cmd_read_rxd_txd = { + .f = cmd_read_rxd_txd_parsed, + .data = NULL, + .help_str = "read rxd|txd port_id queue_id rxd_id", + .tokens = { + (void *)&cmd_read_rxd_txd_read, + (void *)&cmd_read_rxd_txd_rxd_txd, + (void *)&cmd_read_rxd_txd_port_id, + (void *)&cmd_read_rxd_txd_queue_id, + (void *)&cmd_read_rxd_txd_desc_id, + NULL, + }, +}; + +/* *** QUIT *** */ +struct cmd_quit_result { + cmdline_fixed_string_t quit; +}; + +static void cmd_quit_parsed(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, + __attribute__((unused)) void *data) +{ + pmd_test_exit(); + cmdline_quit(cl); +} + +cmdline_parse_token_string_t cmd_quit_quit = + TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, "quit"); + +cmdline_parse_inst_t cmd_quit = { + .f = cmd_quit_parsed, + .data = NULL, + .help_str = "exit application", + .tokens = { + (void *)&cmd_quit_quit, + NULL, + }, +}; + +/* *** ADD/REMOVE MAC ADDRESS FROM A PORT *** */ +struct cmd_mac_addr_result { + cmdline_fixed_string_t mac_addr_cmd; + cmdline_fixed_string_t what; + uint8_t port_num; + struct ether_addr address; +}; + +static void cmd_mac_addr_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_mac_addr_result *res = parsed_result; + int ret; + + if (strcmp(res->what, "add") == 0) + ret = rte_eth_dev_mac_addr_add(res->port_num, &res->address, 0); + else + ret = rte_eth_dev_mac_addr_remove(res->port_num, &res->address); + + /* check the return value and print it if is < 0 */ + if(ret < 0) + printf("mac_addr_cmd error: (%s)\n", strerror(-ret)); + +} + +cmdline_parse_token_string_t cmd_mac_addr_cmd = + TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, mac_addr_cmd, + "mac_addr"); +cmdline_parse_token_string_t cmd_mac_addr_what = + TOKEN_STRING_INITIALIZER(struct cmd_mac_addr_result, what, + "add#remove"); +cmdline_parse_token_num_t cmd_mac_addr_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_mac_addr_result, port_num, UINT8); +cmdline_parse_token_string_t cmd_mac_addr_addr = + TOKEN_ETHERADDR_INITIALIZER(struct cmd_mac_addr_result, address); + +cmdline_parse_inst_t cmd_mac_addr = { + .f = cmd_mac_addr_parsed, + .data = (void *)0, + .help_str = "mac_addr add|remove X
: " + "add/remove MAC address on port X", + .tokens = { + (void *)&cmd_mac_addr_cmd, + (void *)&cmd_mac_addr_what, + (void *)&cmd_mac_addr_portnum, + (void *)&cmd_mac_addr_addr, + NULL, + }, +}; + + +/* list of instructions */ +cmdline_parse_ctx_t main_ctx[] = { + (cmdline_parse_inst_t *)&cmd_help, + (cmdline_parse_inst_t *)&cmd_quit, + (cmdline_parse_inst_t *)&cmd_showport, + (cmdline_parse_inst_t *)&cmd_showportall, + (cmdline_parse_inst_t *)&cmd_showcfg, + (cmdline_parse_inst_t *)&cmd_start, + (cmdline_parse_inst_t *)&cmd_start_tx_first, + (cmdline_parse_inst_t *)&cmd_reset, + (cmdline_parse_inst_t *)&cmd_set_numbers, + (cmdline_parse_inst_t *)&cmd_set_txpkts, + (cmdline_parse_inst_t *)&cmd_set_fwd_list, + (cmdline_parse_inst_t *)&cmd_set_fwd_mask, + (cmdline_parse_inst_t *)&cmd_set_fwd_mode, + (cmdline_parse_inst_t *)&cmd_set_promisc_mode_one, + (cmdline_parse_inst_t *)&cmd_set_promisc_mode_all, + (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_one, + (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all, + (cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all, + (cmdline_parse_inst_t *)&cmd_rx_vlan_filter, + (cmdline_parse_inst_t *)&cmd_tx_vlan_set, + (cmdline_parse_inst_t *)&cmd_tx_vlan_reset, + (cmdline_parse_inst_t *)&cmd_tx_cksum_set, + (cmdline_parse_inst_t *)&cmd_link_flow_control_set, + (cmdline_parse_inst_t *)&cmd_read_reg, + (cmdline_parse_inst_t *)&cmd_read_reg_bit_field, + (cmdline_parse_inst_t *)&cmd_read_reg_bit, + (cmdline_parse_inst_t *)&cmd_write_reg, + (cmdline_parse_inst_t *)&cmd_write_reg_bit_field, + (cmdline_parse_inst_t *)&cmd_write_reg_bit, + (cmdline_parse_inst_t *)&cmd_read_rxd_txd, + (cmdline_parse_inst_t *)&cmd_add_signature_filter, + (cmdline_parse_inst_t *)&cmd_upd_signature_filter, + (cmdline_parse_inst_t *)&cmd_rm_signature_filter, + (cmdline_parse_inst_t *)&cmd_add_perfect_filter, + (cmdline_parse_inst_t *)&cmd_upd_perfect_filter, + (cmdline_parse_inst_t *)&cmd_rm_perfect_filter, + (cmdline_parse_inst_t *)&cmd_set_masks_filter, + (cmdline_parse_inst_t *)&cmd_stop, + (cmdline_parse_inst_t *)&cmd_mac_addr, + NULL, +}; + +/* prompt function, called from main on MASTER lcore */ +void +prompt(void) +{ + struct cmdline *cl; + + cl = cmdline_stdin_new(main_ctx, "testpmd> "); + if (cl == NULL) { + return; + } + cmdline_interact(cl); + cmdline_stdin_exit(cl); +} diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c new file mode 100644 index 0000000..fd62235 --- /dev/null +++ b/app/test-pmd/config.c @@ -0,0 +1,1142 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +static void +print_ethaddr(const char *name, struct ether_addr *eth_addr) +{ + printf("%s%02X:%02X:%02X:%02X:%02X:%02X", name, + eth_addr->addr_bytes[0], + eth_addr->addr_bytes[1], + eth_addr->addr_bytes[2], + eth_addr->addr_bytes[3], + eth_addr->addr_bytes[4], + eth_addr->addr_bytes[5]); +} + +void +nic_stats_display(portid_t port_id) +{ + struct rte_eth_stats stats; + + static const char *nic_stats_border = "########################"; + + if (port_id >= nb_ports) { + printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + return; + } + rte_eth_stats_get(port_id, &stats); + printf("\n %s NIC statistics for port %-2d %s\n", + nic_stats_border, port_id, nic_stats_border); + printf(" RX-packets: %-10"PRIu64" RX-errors: %-10"PRIu64"RX-bytes: " + "%-"PRIu64"\n" + " TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64"TX-bytes: " + "%-"PRIu64"\n", + stats.ipackets, stats.ierrors, stats.ibytes, + stats.opackets, stats.oerrors, stats.obytes); + + /* stats fdir */ + if (fdir_conf.mode != RTE_FDIR_MODE_NONE) + printf(" Fdirmiss: %-10"PRIu64" Fdirmatch: %-10"PRIu64"\n", + stats.fdirmiss, + stats.fdirmatch); + + printf(" %s############################%s\n", + nic_stats_border, nic_stats_border); +} + +void +nic_stats_clear(portid_t port_id) +{ + if (port_id >= nb_ports) { + printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + return; + } + rte_eth_stats_reset(port_id); + printf("\n NIC statistics for port %d cleared\n", port_id); +} + +void +port_infos_display(portid_t port_id) +{ + struct rte_port *port; + struct rte_eth_link link; + static const char *info_border = "*********************"; + + if (port_id >= nb_ports) { + printf("Invalid port, range is [0, %d]\n", nb_ports - 1); + return; + } + port = &ports[port_id]; + rte_eth_link_get(port_id, &link); + printf("\n%s Infos for port %-2d %s\n", + info_border, port_id, info_border); + print_ethaddr("MAC address: ", &port->eth_addr); + printf("\nLink status: %s\n", (link.link_status) ? ("up") : ("down")); + printf("Link speed: %u Mbps\n", (unsigned) link.link_speed); + printf("Link duplex: %s\n", (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? + ("full-duplex") : ("half-duplex")); + printf("Promiscuous mode: %s\n", + rte_eth_promiscuous_get(port_id) ? "enabled" : "disabled"); + printf("Allmulticast mode: %s\n", + rte_eth_allmulticast_get(port_id) ? "enabled" : "disabled"); + printf("Maximum number of MAC addresses: %u\n", + (unsigned int)(port->dev_info.max_mac_addrs)); +} + +static int +port_id_is_invalid(portid_t port_id) +{ + if (port_id < nb_ports) + return 0; + printf("Invalid port %d (must be < nb_ports=%d)\n", port_id, nb_ports); + return 1; +} + +static int +vlan_id_is_invalid(uint16_t vlan_id) +{ + if (vlan_id < 4096) + return 0; + printf("Invalid vlan_id %d (must be < 4096)\n", vlan_id); + return 1; +} + +static int +port_reg_off_is_invalid(portid_t port_id, uint32_t reg_off) +{ + uint64_t pci_len; + + if (reg_off & 0x3) { + printf("Port register offset 0x%X not aligned on a 4-byte " + "boundary\n", + (unsigned)reg_off); + return 1; + } + pci_len = ports[port_id].dev_info.pci_dev->mem_resource.len; + if (reg_off >= pci_len) { + printf("Port %d: register offset %u (0x%X) out of port PCI " + "resource (length=%"PRIu64")\n", + port_id, (unsigned)reg_off, (unsigned)reg_off, pci_len); + return 1; + } + return 0; +} + +static int +reg_bit_pos_is_invalid(uint8_t bit_pos) +{ + if (bit_pos <= 31) + return 0; + printf("Invalid bit position %d (must be <= 31)\n", bit_pos); + return 1; +} + +#define display_port_and_reg_off(port_id, reg_off) \ + printf("port %d PCI register at offset 0x%X: ", (port_id), (reg_off)) + +static inline void +display_port_reg_value(portid_t port_id, uint32_t reg_off, uint32_t reg_v) +{ + display_port_and_reg_off(port_id, (unsigned)reg_off); + printf("0x%08X (%u)\n", (unsigned)reg_v, (unsigned)reg_v); +} + +void +port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_x) +{ + uint32_t reg_v; + + + if (port_id_is_invalid(port_id)) + return; + if (port_reg_off_is_invalid(port_id, reg_off)) + return; + if (reg_bit_pos_is_invalid(bit_x)) + return; + reg_v = port_id_pci_reg_read(port_id, reg_off); + display_port_and_reg_off(port_id, (unsigned)reg_off); + printf("bit %d=%d\n", bit_x, (int) ((reg_v & (1 << bit_x)) >> bit_x)); +} + +void +port_reg_bit_field_display(portid_t port_id, uint32_t reg_off, + uint8_t bit1_pos, uint8_t bit2_pos) +{ + uint32_t reg_v; + uint8_t l_bit; + uint8_t h_bit; + + if (port_id_is_invalid(port_id)) + return; + if (port_reg_off_is_invalid(port_id, reg_off)) + return; + if (reg_bit_pos_is_invalid(bit1_pos)) + return; + if (reg_bit_pos_is_invalid(bit2_pos)) + return; + if (bit1_pos > bit2_pos) + l_bit = bit2_pos, h_bit = bit1_pos; + else + l_bit = bit1_pos, h_bit = bit2_pos; + + reg_v = port_id_pci_reg_read(port_id, reg_off); + reg_v >>= l_bit; + if (h_bit < 31) + reg_v &= ((1 << (h_bit - l_bit + 1)) - 1); + display_port_and_reg_off(port_id, (unsigned)reg_off); + printf("bits[%d, %d]=0x%0*X (%u)\n", l_bit, h_bit, + ((h_bit - l_bit) / 4) + 1, (unsigned)reg_v, (unsigned)reg_v); +} + +void +port_reg_display(portid_t port_id, uint32_t reg_off) +{ + uint32_t reg_v; + + if (port_id_is_invalid(port_id)) + return; + if (port_reg_off_is_invalid(port_id, reg_off)) + return; + reg_v = port_id_pci_reg_read(port_id, reg_off); + display_port_reg_value(port_id, reg_off, reg_v); +} + +void +port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos, + uint8_t bit_v) +{ + uint32_t reg_v; + + if (port_id_is_invalid(port_id)) + return; + if (port_reg_off_is_invalid(port_id, reg_off)) + return; + if (reg_bit_pos_is_invalid(bit_pos)) + return; + if (bit_v > 1) { + printf("Invalid bit value %d (must be 0 or 1)\n", (int) bit_v); + return; + } + reg_v = port_id_pci_reg_read(port_id, reg_off); + if (bit_v == 0) + reg_v &= ~(1 << bit_pos); + else + reg_v |= (1 << bit_pos); + port_id_pci_reg_write(port_id, reg_off, reg_v); + display_port_reg_value(port_id, reg_off, reg_v); +} + +void +port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, + uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value) +{ + uint32_t max_v; + uint32_t reg_v; + uint8_t l_bit; + uint8_t h_bit; + + if (port_id_is_invalid(port_id)) + return; + if (port_reg_off_is_invalid(port_id, reg_off)) + return; + if (reg_bit_pos_is_invalid(bit1_pos)) + return; + if (reg_bit_pos_is_invalid(bit2_pos)) + return; + if (bit1_pos > bit2_pos) + l_bit = bit2_pos, h_bit = bit1_pos; + else + l_bit = bit1_pos, h_bit = bit2_pos; + + if ((h_bit - l_bit) < 31) + max_v = (1 << (h_bit - l_bit + 1)) - 1; + else + max_v = 0xFFFFFFFF; + + if (value > max_v) { + printf("Invalid value %u (0x%x) must be < %u (0x%x)\n", + (unsigned)value, (unsigned)value, + (unsigned)max_v, (unsigned)max_v); + return; + } + reg_v = port_id_pci_reg_read(port_id, reg_off); + reg_v &= ~(max_v << l_bit); /* Keep unchanged bits */ + reg_v |= (value << l_bit); /* Set changed bits */ + port_id_pci_reg_write(port_id, reg_off, reg_v); + display_port_reg_value(port_id, reg_off, reg_v); +} + +void +port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t reg_v) +{ + if (port_id_is_invalid(port_id)) + return; + if (port_reg_off_is_invalid(port_id, reg_off)) + return; + port_id_pci_reg_write(port_id, reg_off, reg_v); + display_port_reg_value(port_id, reg_off, reg_v); +} + +/* + * RX/TX ring descriptors display functions. + */ +static int +rx_queue_id_is_invalid(queueid_t rxq_id) +{ + if (rxq_id < nb_rxq) + return 0; + printf("Invalid RX queue %d (must be < nb_rxq=%d)\n", rxq_id, nb_rxq); + return 1; +} + +static int +tx_queue_id_is_invalid(queueid_t txq_id) +{ + if (txq_id < nb_txq) + return 0; + printf("Invalid TX queue %d (must be < nb_rxq=%d)\n", txq_id, nb_txq); + return 1; +} + +static int +rx_desc_id_is_invalid(uint16_t rxdesc_id) +{ + if (rxdesc_id < nb_rxd) + return 0; + printf("Invalid RX descriptor %d (must be < nb_rxd=%d)\n", + rxdesc_id, nb_rxd); + return 1; +} + +static int +tx_desc_id_is_invalid(uint16_t txdesc_id) +{ + if (txdesc_id < nb_txd) + return 0; + printf("Invalid TX descriptor %d (must be < nb_txd=%d)\n", + txdesc_id, nb_txd); + return 1; +} + +static const struct rte_memzone * +ring_dma_zone_lookup(const char *ring_name, uint8_t port_id, uint16_t q_id) +{ + char mz_name[RTE_MEMZONE_NAMESIZE]; + const struct rte_memzone *mz; + + rte_snprintf(mz_name, sizeof(mz_name), "%s_%s_%d_%d", + ports[port_id].dev_info.driver_name, ring_name, port_id, q_id); + mz = rte_memzone_lookup(mz_name); + if (mz == NULL) + printf("%s ring memory zoneof (port %d, queue %d) not" + "found (zone name = %s\n", + ring_name, port_id, q_id, mz_name); + return (mz); +} + +union igb_ring_dword { + uint64_t dword; + struct { + uint32_t hi; + uint32_t lo; + } words; +}; + +struct igb_ring_desc { + union igb_ring_dword lo_dword; + union igb_ring_dword hi_dword; +}; + +static void +ring_descriptor_display(const struct rte_memzone *ring_mz, uint16_t desc_id) +{ + struct igb_ring_desc *ring; + struct igb_ring_desc rd; + + ring = (struct igb_ring_desc *) ring_mz->addr; + rd.lo_dword = rte_le_to_cpu_64(ring[desc_id].lo_dword); + rd.hi_dword = rte_le_to_cpu_64(ring[desc_id].hi_dword); + printf(" 0x%08X - 0x%08X / 0x%08X - 0x%08X\n", + (unsigned)rd.lo_dword.words.lo, (unsigned)rd.lo_dword.words.hi, + (unsigned)rd.hi_dword.words.lo, (unsigned)rd.hi_dword.words.hi); +} + +void +rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id) +{ + const struct rte_memzone *rx_mz; + + if (port_id_is_invalid(port_id)) + return; + if (rx_queue_id_is_invalid(rxq_id)) + return; + if (rx_desc_id_is_invalid(rxd_id)) + return; + rx_mz = ring_dma_zone_lookup("rx_ring", port_id, rxq_id); + if (rx_mz == NULL) + return; + ring_descriptor_display(rx_mz, rxd_id); +} + +void +tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id) +{ + const struct rte_memzone *tx_mz; + + if (port_id_is_invalid(port_id)) + return; + if (tx_queue_id_is_invalid(txq_id)) + return; + if (tx_desc_id_is_invalid(txd_id)) + return; + tx_mz = ring_dma_zone_lookup("tx_ring", port_id, txq_id); + if (tx_mz == NULL) + return; + ring_descriptor_display(tx_mz, txd_id); +} + +void +fwd_lcores_config_display(void) +{ + lcoreid_t lc_id; + + printf("List of forwarding lcores:"); + for (lc_id = 0; lc_id < nb_cfg_lcores; lc_id++) + printf(" %2u", fwd_lcores_cpuids[lc_id]); + printf("\n"); +} +void +rxtx_config_display(void) +{ + printf(" %s packet forwarding - CRC stripping %s - " + "packets/burst=%d\n", cur_fwd_eng->fwd_mode_name, + rx_mode.hw_strip_crc ? "enabled" : "disabled", + nb_pkt_per_burst); + + if (cur_fwd_eng == &tx_only_engine) + printf(" packet len=%u - nb packet segments=%d\n", + (unsigned)tx_pkt_length, (int) tx_pkt_nb_segs); + + printf(" nb forwarding cores=%d - nb forwarding ports=%d\n", + nb_fwd_lcores, nb_fwd_ports); + printf(" RX queues=%d - RX desc=%d - RX free threshold=%d\n", + nb_rxq, nb_rxd, rx_free_thresh); + printf(" RX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n", + rx_thresh.pthresh, rx_thresh.hthresh, rx_thresh.wthresh); + printf(" TX queues=%d - TX desc=%d - TX free threshold=%d\n", + nb_txq, nb_txd, tx_free_thresh); + printf(" TX threshold registers: pthresh=%d hthresh=%d wthresh=%d\n", + tx_thresh.pthresh, tx_thresh.hthresh, tx_thresh.wthresh); + printf(" TX RS bit threshold=%d\n", tx_rs_thresh); +} + +/* + * Setup forwarding configuration for each logical core. + */ +static void +setup_fwd_config_of_each_lcore(struct fwd_config *cfg) +{ + streamid_t nb_fs_per_lcore; + streamid_t nb_fs; + streamid_t sm_id; + lcoreid_t nb_extra; + lcoreid_t nb_fc; + lcoreid_t nb_lc; + lcoreid_t lc_id; + + nb_fs = cfg->nb_fwd_streams; + nb_fc = cfg->nb_fwd_lcores; + if (nb_fs <= nb_fc) { + nb_fs_per_lcore = 1; + nb_extra = 0; + } else { + nb_fs_per_lcore = (streamid_t) (nb_fs / nb_fc); + nb_extra = (lcoreid_t) (nb_fs % nb_fc); + } + nb_extra = (lcoreid_t) (nb_fs % nb_fc); + + nb_lc = (lcoreid_t) (nb_fc - nb_extra); + sm_id = 0; + for (lc_id = 0; lc_id < nb_lc; lc_id++) { + fwd_lcores[lc_id]->stream_idx = sm_id; + fwd_lcores[lc_id]->stream_nb = nb_fs_per_lcore; + sm_id = (streamid_t) (sm_id + nb_fs_per_lcore); + } + + /* + * Assign extra remaining streams, if any. + */ + nb_fs_per_lcore = (streamid_t) (nb_fs_per_lcore + 1); + for (lc_id = 0; lc_id < nb_extra; lc_id++) { + fwd_lcores[nb_lc + lc_id]->stream_idx = sm_id; + fwd_lcores[nb_lc + lc_id]->stream_nb = nb_fs_per_lcore; + sm_id = (streamid_t) (sm_id + nb_fs_per_lcore); + } +} + +static void +simple_fwd_config_setup(void) +{ + portid_t i; + portid_t j; + portid_t inc = 2; + + if (nb_fwd_ports % 2) { + if (port_topology == PORT_TOPOLOGY_CHAINED) { + inc = 1; + } + else { + printf("\nWarning! Cannot handle an odd number of ports " + "with the current port topology. Configuration " + "must be changed to have an even number of ports, " + "or relaunch application with " + "--port-topology=chained\n\n"); + } + } + + cur_fwd_config.nb_fwd_ports = (portid_t) nb_fwd_ports; + cur_fwd_config.nb_fwd_streams = + (streamid_t) cur_fwd_config.nb_fwd_ports; + + /* + * In the simple forwarding test, the number of forwarding cores + * must be lower or equal to the number of forwarding ports. + */ + cur_fwd_config.nb_fwd_lcores = (lcoreid_t) nb_fwd_lcores; + if (cur_fwd_config.nb_fwd_lcores > cur_fwd_config.nb_fwd_ports) + cur_fwd_config.nb_fwd_lcores = + (lcoreid_t) cur_fwd_config.nb_fwd_ports; + setup_fwd_config_of_each_lcore(&cur_fwd_config); + + for (i = 0; i < cur_fwd_config.nb_fwd_ports; i = (portid_t) (i + inc)) { + j = (portid_t) ((i + 1) % cur_fwd_config.nb_fwd_ports); + fwd_streams[i]->rx_port = fwd_ports_ids[i]; + fwd_streams[i]->rx_queue = 0; + fwd_streams[i]->tx_port = fwd_ports_ids[j]; + fwd_streams[i]->tx_queue = 0; + fwd_streams[i]->peer_addr = j; + + if (port_topology == PORT_TOPOLOGY_PAIRED) { + fwd_streams[j]->rx_port = fwd_ports_ids[j]; + fwd_streams[j]->rx_queue = 0; + fwd_streams[j]->tx_port = fwd_ports_ids[i]; + fwd_streams[j]->tx_queue = 0; + fwd_streams[j]->peer_addr = i; + } + } +} + +/** + * For the RSS forwarding test, each core is assigned on every port a transmit + * queue whose index is the index of the core itself. This approach limits the + * maximumm number of processing cores of the RSS test to the maximum number of + * TX queues supported by the devices. + * + * Each core is assigned a single stream, each stream being composed of + * a RX queue to poll on a RX port for input messages, associated with + * a TX queue of a TX port where to send forwarded packets. + * All packets received on the RX queue of index "RxQj" of the RX port "RxPi" + * are sent on the TX queue "TxQl" of the TX port "TxPk" according to the two + * following rules: + * - TxPk = (RxPi + 1) if RxPi is even, (RxPi - 1) if RxPi is odd + * - TxQl = RxQj + */ +static void +rss_fwd_config_setup(void) +{ + portid_t rxp; + portid_t txp; + queueid_t rxq; + queueid_t nb_q; + lcoreid_t lc_id; + + nb_q = nb_rxq; + if (nb_q > nb_txq) + nb_q = nb_txq; + cur_fwd_config.nb_fwd_lcores = (lcoreid_t) nb_fwd_lcores; + cur_fwd_config.nb_fwd_ports = nb_fwd_ports; + cur_fwd_config.nb_fwd_streams = + (streamid_t) (nb_q * cur_fwd_config.nb_fwd_ports); + if (cur_fwd_config.nb_fwd_streams > cur_fwd_config.nb_fwd_lcores) + cur_fwd_config.nb_fwd_streams = + (streamid_t)cur_fwd_config.nb_fwd_lcores; + else + cur_fwd_config.nb_fwd_lcores = + (lcoreid_t)cur_fwd_config.nb_fwd_streams; + setup_fwd_config_of_each_lcore(&cur_fwd_config); + rxp = 0; rxq = 0; + for (lc_id = 0; lc_id < cur_fwd_config.nb_fwd_lcores; lc_id++) { + struct fwd_stream *fs; + + fs = fwd_streams[lc_id]; + if ((rxp & 0x1) == 0) + txp = (portid_t) (rxp + 1); + else + txp = (portid_t) (rxp - 1); + fs->rx_port = fwd_ports_ids[rxp]; + fs->rx_queue = rxq; + fs->tx_port = fwd_ports_ids[txp]; + fs->tx_queue = rxq; + fs->peer_addr = fs->tx_port; + rxq = (queueid_t) (rxq + 1); + if (rxq < nb_q) + continue; + /* + * rxq == nb_q + * Restart from RX queue 0 on next RX port + */ + rxq = 0; + if (numa_support && (nb_fwd_ports <= (nb_ports >> 1))) + rxp = (portid_t) + (rxp + ((nb_ports >> 1) / nb_fwd_ports)); + else + rxp = (portid_t) (rxp + 1); + } +} + +void +fwd_config_setup(void) +{ + cur_fwd_config.fwd_eng = cur_fwd_eng; + if ((nb_rxq > 1) && (nb_txq > 1)) + rss_fwd_config_setup(); + else + simple_fwd_config_setup(); +} + +static void +pkt_fwd_config_display(struct fwd_config *cfg) +{ + struct fwd_stream *fs; + lcoreid_t lc_id; + streamid_t sm_id; + + printf("%s packet forwarding - ports=%d - cores=%d - streams=%d - " + "NUMA support %s\n", + cfg->fwd_eng->fwd_mode_name, + cfg->nb_fwd_ports, cfg->nb_fwd_lcores, cfg->nb_fwd_streams, + numa_support == 1 ? "enabled" : "disabled"); + for (lc_id = 0; lc_id < cfg->nb_fwd_lcores; lc_id++) { + printf("Logical Core %u (socket %u) forwards packets on " + "%d streams:", + fwd_lcores_cpuids[lc_id], + rte_lcore_to_socket_id(fwd_lcores_cpuids[lc_id]), + fwd_lcores[lc_id]->stream_nb); + for (sm_id = 0; sm_id < fwd_lcores[lc_id]->stream_nb; sm_id++) { + fs = fwd_streams[fwd_lcores[lc_id]->stream_idx + sm_id]; + printf("\n RX P=%d/Q=%d (socket %u) -> TX " + "P=%d/Q=%d (socket %u) ", + fs->rx_port, fs->rx_queue, + ports[fs->rx_port].socket_id, + fs->tx_port, fs->tx_queue, + ports[fs->tx_port].socket_id); + print_ethaddr("peer=", + &peer_eth_addrs[fs->peer_addr]); + } + printf("\n"); + } + printf("\n"); +} + + +void +fwd_config_display(void) +{ + fwd_config_setup(); + pkt_fwd_config_display(&cur_fwd_config); +} + +void +set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc) +{ + unsigned int i; + unsigned int lcore_cpuid; + int record_now; + + record_now = 0; + again: + for (i = 0; i < nb_lc; i++) { + lcore_cpuid = lcorelist[i]; + if (! rte_lcore_is_enabled(lcore_cpuid)) { + printf("Logical core %u not enabled\n", lcore_cpuid); + return; + } + if (lcore_cpuid == rte_get_master_lcore()) { + printf("Master core %u cannot forward packets\n", + lcore_cpuid); + return; + } + if (record_now) + fwd_lcores_cpuids[i] = lcore_cpuid; + } + if (record_now == 0) { + record_now = 1; + goto again; + } + nb_cfg_lcores = (lcoreid_t) nb_lc; + if (nb_fwd_lcores != (lcoreid_t) nb_lc) { + printf("previous number of forwarding cores %u - changed to " + "number of configured cores %u\n", + (unsigned int) nb_fwd_lcores, nb_lc); + nb_fwd_lcores = (lcoreid_t) nb_lc; + } +} + +void +set_fwd_lcores_mask(uint64_t lcoremask) +{ + unsigned int lcorelist[64]; + unsigned int nb_lc; + unsigned int i; + + if (lcoremask == 0) { + printf("Invalid NULL mask of cores\n"); + return; + } + nb_lc = 0; + for (i = 0; i < 64; i++) { + if (! ((uint64_t)(1ULL << i) & lcoremask)) + continue; + lcorelist[nb_lc++] = i; + } + set_fwd_lcores_list(lcorelist, nb_lc); +} + +void +set_fwd_lcores_number(uint16_t nb_lc) +{ + if (nb_lc > nb_cfg_lcores) { + printf("nb fwd cores %u > %u (max. number of configured " + "lcores) - ignored\n", + (unsigned int) nb_lc, (unsigned int) nb_cfg_lcores); + return; + } + nb_fwd_lcores = (lcoreid_t) nb_lc; + printf("Number of forwarding cores set to %u\n", + (unsigned int) nb_fwd_lcores); +} + +void +set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt) +{ + unsigned int i; + portid_t port_id; + int record_now; + + record_now = 0; + again: + for (i = 0; i < nb_pt; i++) { + port_id = (portid_t) portlist[i]; + if (port_id >= nb_ports) { + printf("Invalid port id %u > %u\n", + (unsigned int) port_id, + (unsigned int) nb_ports); + return; + } + if (record_now) + fwd_ports_ids[i] = port_id; + } + if (record_now == 0) { + record_now = 1; + goto again; + } + nb_cfg_ports = (portid_t) nb_pt; + if (nb_fwd_ports != (portid_t) nb_pt) { + printf("previous number of forwarding ports %u - changed to " + "number of configured ports %u\n", + (unsigned int) nb_fwd_ports, nb_pt); + nb_fwd_ports = (portid_t) nb_pt; + } +} + +void +set_fwd_ports_mask(uint64_t portmask) +{ + unsigned int portlist[64]; + unsigned int nb_pt; + unsigned int i; + + if (portmask == 0) { + printf("Invalid NULL mask of ports\n"); + return; + } + nb_pt = 0; + for (i = 0; i < 64; i++) { + if (! ((uint64_t)(1ULL << i) & portmask)) + continue; + portlist[nb_pt++] = i; + } + set_fwd_ports_list(portlist, nb_pt); +} + +void +set_fwd_ports_number(uint16_t nb_pt) +{ + if (nb_pt > nb_cfg_ports) { + printf("nb fwd ports %u > %u (number of configured " + "ports) - ignored\n", + (unsigned int) nb_pt, (unsigned int) nb_cfg_ports); + return; + } + nb_fwd_ports = (portid_t) nb_pt; + printf("Number of forwarding ports set to %u\n", + (unsigned int) nb_fwd_ports); +} + +void +set_nb_pkt_per_burst(uint16_t nb) +{ + if (nb > MAX_PKT_BURST) { + printf("nb pkt per burst: %u > %u (maximum packet per burst) " + " ignored\n", + (unsigned int) nb, (unsigned int) MAX_PKT_BURST); + return; + } + nb_pkt_per_burst = nb; + printf("Number of packets per burst set to %u\n", + (unsigned int) nb_pkt_per_burst); +} + +void +set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs) +{ + uint16_t tx_pkt_len; + unsigned i; + + if (nb_segs >= (unsigned) nb_txd) { + printf("nb segments per TX packets=%u >= nb_txd=%u - ignored\n", + nb_segs, (unsigned int) nb_txd); + return; + } + + /* + * Check that each segment length is greater or equal than + * the mbuf data sise. + * Check also that the total packet length is greater or equal than the + * size of an empty UDP/IP packet (sizeof(struct ether_hdr) + 20 + 8). + */ + tx_pkt_len = 0; + for (i = 0; i < nb_segs; i++) { + if (seg_lengths[i] > (unsigned) mbuf_data_size) { + printf("length[%u]=%u > mbuf_data_size=%u - give up\n", + i, seg_lengths[i], (unsigned) mbuf_data_size); + return; + } + tx_pkt_len = (uint16_t)(tx_pkt_len + seg_lengths[i]); + } + if (tx_pkt_len < (sizeof(struct ether_hdr) + 20 + 8)) { + printf("total packet length=%u < %d - give up\n", + (unsigned) tx_pkt_len, + (int)(sizeof(struct ether_hdr) + 20 + 8)); + return; + } + + for (i = 0; i < nb_segs; i++) + tx_pkt_seg_lengths[i] = (uint16_t) seg_lengths[i]; + + tx_pkt_length = tx_pkt_len; + tx_pkt_nb_segs = (uint8_t) nb_segs; +} + +void +set_pkt_forwarding_mode(const char *fwd_mode_name) +{ + struct fwd_engine *fwd_eng; + unsigned i; + + i = 0; + while ((fwd_eng = fwd_engines[i]) != NULL) { + if (! strcmp(fwd_eng->fwd_mode_name, fwd_mode_name)) { + printf("Set %s packet forwarding mode\n", + fwd_mode_name); + cur_fwd_eng = fwd_eng; + return; + } + i++; + } + printf("Invalid %s packet forwarding mode\n", fwd_mode_name); +} + +void +set_verbose_level(uint16_t vb_level) +{ + printf("Change verbose level from %u to %u\n", + (unsigned int) verbose_level, (unsigned int) vb_level); + verbose_level = vb_level; +} + +void +rx_vlan_filter_set(portid_t port_id, uint16_t vlan_id, int on) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + if (vlan_id_is_invalid(vlan_id)) + return; + diag = rte_eth_dev_vlan_filter(port_id, vlan_id, on); + if (diag == 0) + return; + printf("rte_eth_dev_vlan_filter(port_pi=%d, vlan_id=%d, on=%d) failed " + "diag=%d\n", + port_id, vlan_id, on, diag); +} + +void +rx_vlan_all_filter_set(portid_t port_id, int on) +{ + uint16_t vlan_id; + + if (port_id_is_invalid(port_id)) + return; + for (vlan_id = 0; vlan_id < 4096; vlan_id++) + rx_vlan_filter_set(port_id, vlan_id, on); +} + +void +tx_vlan_set(portid_t port_id, uint16_t vlan_id) +{ + if (port_id_is_invalid(port_id)) + return; + if (vlan_id_is_invalid(vlan_id)) + return; + ports[port_id].tx_ol_flags |= PKT_TX_VLAN_PKT; + ports[port_id].tx_vlan_id = vlan_id; +} + +void +tx_vlan_reset(portid_t port_id) +{ + if (port_id_is_invalid(port_id)) + return; + ports[port_id].tx_ol_flags &= ~PKT_TX_VLAN_PKT; +} + +void +tx_cksum_set(portid_t port_id, uint8_t cksum_mask) +{ + uint16_t tx_ol_flags; + if (port_id_is_invalid(port_id)) + return; + /* Clear last 4 bits and then set L3/4 checksum mask again */ + tx_ol_flags = (uint16_t) (ports[port_id].tx_ol_flags & 0xFFF0); + ports[port_id].tx_ol_flags = (uint16_t) ((cksum_mask & 0xf) | tx_ol_flags); +} + +void +fdir_add_signature_filter(portid_t port_id, uint8_t queue_id, + struct rte_fdir_filter *fdir_filter) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_add_signature_filter(port_id, fdir_filter, + queue_id); + if (diag == 0) + return; + + printf("rte_eth_dev_fdir_add_signature_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); +} + +void +fdir_update_signature_filter(portid_t port_id, uint8_t queue_id, + struct rte_fdir_filter *fdir_filter) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_update_signature_filter(port_id, fdir_filter, + queue_id); + if (diag == 0) + return; + + printf("rte_eth_dev_fdir_update_signature_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); +} + +void +fdir_remove_signature_filter(portid_t port_id, + struct rte_fdir_filter *fdir_filter) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_remove_signature_filter(port_id, fdir_filter); + if (diag == 0) + return; + + printf("rte_eth_dev_fdir_add_signature_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); + +} + +void +fdir_get_infos(portid_t port_id) +{ + struct rte_eth_fdir fdir_infos; + + static const char *fdir_stats_border = "########################"; + + if (port_id_is_invalid(port_id)) + return; + + rte_eth_dev_fdir_get_infos(port_id, &fdir_infos); + + printf("\n %s FDIR infos for port %-2d %s\n", + fdir_stats_border, port_id, fdir_stats_border); + + printf(" collision: %-10"PRIu64" free: %-10"PRIu64"\n" + " maxhash: %-10"PRIu64" maxlen: %-10"PRIu64"\n" + " add : %-10"PRIu64" remove : %-10"PRIu64"\n" + " f_add: %-10"PRIu64" f_remove: %-10"PRIu64"\n", + (uint64_t)(fdir_infos.collision), (uint64_t)(fdir_infos.free), + (uint64_t)(fdir_infos.maxhash), (uint64_t)(fdir_infos.maxlen), + fdir_infos.add, fdir_infos.remove, + fdir_infos.f_add, fdir_infos.f_remove); + printf(" %s############################%s\n", + fdir_stats_border, fdir_stats_border); +} + +void +fdir_add_perfect_filter(portid_t port_id, uint16_t soft_id, uint8_t queue_id, + uint8_t drop, struct rte_fdir_filter *fdir_filter) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_add_perfect_filter(port_id, fdir_filter, + soft_id, queue_id, drop); + if (diag == 0) + return; + + printf("rte_eth_dev_fdir_add_perfect_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); +} + +void +fdir_update_perfect_filter(portid_t port_id, uint16_t soft_id, uint8_t queue_id, + uint8_t drop, struct rte_fdir_filter *fdir_filter) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_update_perfect_filter(port_id, fdir_filter, + soft_id, queue_id, drop); + if (diag == 0) + return; + + printf("rte_eth_dev_fdir_update_perfect_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); +} + +void +fdir_remove_perfect_filter(portid_t port_id, uint16_t soft_id, + struct rte_fdir_filter *fdir_filter) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_remove_perfect_filter(port_id, fdir_filter, + soft_id); + if (diag == 0) + return; + + printf("rte_eth_dev_fdir_update_perfect_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); +} + +void +fdir_set_masks(portid_t port_id, struct rte_fdir_masks *fdir_masks) +{ + int diag; + + if (port_id_is_invalid(port_id)) + return; + + diag = rte_eth_dev_fdir_set_masks(port_id, fdir_masks); + if (diag == 0) + return; + + printf("rte_eth_dev_set_masks_filter for port_id=%d failed " + "diag=%d\n", port_id, diag); +} diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c new file mode 100644 index 0000000..7aabcde --- /dev/null +++ b/app/test-pmd/csumonly.c @@ -0,0 +1,449 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "testpmd.h" + + + +#define IP_DEFTTL 64 /* from RFC 1340. */ +#define IP_VERSION 0x40 +#define IP_HDRLEN 0x05 /* default IP header length == five 32-bits words. */ +#define IP_VHL_DEF (IP_VERSION | IP_HDRLEN) + +/* Pseudo Header for IPv4/UDP/TCP checksum */ +struct psd_header { + uint32_t src_addr; /* IP address of source host. */ + uint32_t dst_addr; /* IP address of destination host(s). */ + uint8_t zero; /* zero. */ + uint8_t proto; /* L4 protocol type. */ + uint16_t len; /* L4 length. */ +} __attribute__((__packed__)); + + +/* Pseudo Header for IPv6/UDP/TCP checksum */ +struct ipv6_psd_header { + uint8_t src_addr[16]; /* IP address of source host. */ + uint8_t dst_addr[16]; /* IP address of destination host(s). */ + uint32_t len; /* L4 length. */ + uint8_t zero[3]; /* zero. */ + uint8_t proto; /* L4 protocol. */ +} __attribute__((__packed__)); + + +static inline uint16_t +get_16b_sum(uint16_t *ptr16, uint32_t nr) +{ + uint32_t sum = 0; + while (nr > 1) + { + sum +=*ptr16; + nr -= sizeof(uint16_t); + ptr16++; + if (sum > UINT16_MAX) + sum -= UINT16_MAX; + } + + /* If length is in odd bytes */ + if (nr) + sum += *((uint8_t*)ptr16); + + sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff); + sum &= 0x0ffff; + return (uint16_t)sum; +} + +static inline uint16_t +get_ipv4_cksum(struct ipv4_hdr *ipv4_hdr) +{ + uint16_t cksum; + cksum = get_16b_sum((uint16_t*)ipv4_hdr, sizeof(struct ipv4_hdr)); + return (uint16_t)((cksum == 0xffff)?cksum:~cksum); +} + + +static inline +uint16_t get_ipv4_psd_sum (struct ipv4_hdr * ip_hdr) +{ + struct psd_header psd_hdr; + psd_hdr.src_addr = ip_hdr->src_addr; + psd_hdr.dst_addr = ip_hdr->dst_addr; + psd_hdr.zero = 0; + psd_hdr.proto = ip_hdr->next_proto_id; + psd_hdr.len = rte_cpu_to_be_16((uint16_t)(rte_be_to_cpu_16(ip_hdr->total_length) + - sizeof(struct ipv4_hdr))); + return get_16b_sum((uint16_t*)&psd_hdr, sizeof(struct psd_header)); +} + +static inline +uint16_t get_ipv6_psd_sum (struct ipv6_hdr * ip_hdr) +{ + struct ipv6_psd_header psd_hdr; + rte_memcpy(psd_hdr.src_addr, ip_hdr->src_addr, sizeof(ip_hdr->src_addr) + + sizeof(ip_hdr->dst_addr)); + + psd_hdr.zero[0] = 0; + psd_hdr.zero[1] = 0; + psd_hdr.zero[2] = 0; + psd_hdr.proto = ip_hdr->proto; + psd_hdr.len = ip_hdr->payload_len; + + return get_16b_sum((uint16_t*)&psd_hdr, sizeof(struct ipv6_psd_header)); +} + +static inline uint16_t +get_ipv4_udptcp_checksum(struct ipv4_hdr *ipv4_hdr, uint16_t *l4_hdr) +{ + uint32_t cksum; + uint32_t l4_len; + + l4_len = rte_be_to_cpu_16(ipv4_hdr->total_length) - sizeof(struct ipv4_hdr); + + cksum = get_16b_sum(l4_hdr, l4_len); + cksum += get_ipv4_psd_sum(ipv4_hdr); + + cksum = ((cksum & 0xffff0000) >> 16) + (cksum & 0xffff); + cksum = (~cksum) & 0xffff; + if (cksum == 0) + cksum = 0xffff; + return (uint16_t)cksum; + +} + +static inline uint16_t +get_ipv6_udptcp_checksum(struct ipv6_hdr *ipv6_hdr, uint16_t *l4_hdr) +{ + uint32_t cksum; + uint32_t l4_len; + + l4_len = rte_be_to_cpu_16(ipv6_hdr->payload_len); + + cksum = get_16b_sum(l4_hdr, l4_len); + cksum += get_ipv6_psd_sum(ipv6_hdr); + + cksum = ((cksum & 0xffff0000) >> 16) + (cksum & 0xffff); + cksum = (~cksum) & 0xffff; + if (cksum == 0) + cksum = 0xffff; + + return (uint16_t)cksum; +} + + +/* + * Forwarding of packets. Change the checksum field with HW or SW methods + * The HW/SW method selection depends on the ol_flags on every packet + */ +static void +pkt_burst_checksum_forward(struct fwd_stream *fs) +{ + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + struct rte_port *txp; + struct rte_mbuf *mb; + struct ether_hdr *eth_hdr; + struct ipv4_hdr *ipv4_hdr; + struct ipv6_hdr *ipv6_hdr; + struct udp_hdr *udp_hdr; + struct tcp_hdr *tcp_hdr; + struct sctp_hdr *sctp_hdr; + + uint16_t nb_rx; + uint16_t nb_tx; + uint16_t i; + uint16_t ol_flags; + uint16_t pkt_ol_flags; + uint16_t tx_ol_flags; + uint16_t l4_proto; + uint8_t l2_len; + uint8_t l3_len; + + uint32_t rx_bad_ip_csum; + uint32_t rx_bad_l4_csum; + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t start_tsc; + uint64_t end_tsc; + uint64_t core_cycles; +#endif + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + start_tsc = rte_rdtsc(); +#endif + + /* + * Receive a burst of packets and forward them. + */ + nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst, + nb_pkt_per_burst); + if (unlikely(nb_rx == 0)) + return; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->rx_burst_stats.pkt_burst_spread[nb_rx]++; +#endif + fs->rx_packets += nb_rx; + rx_bad_ip_csum = 0; + rx_bad_l4_csum = 0; + + txp = &ports[fs->tx_port]; + tx_ol_flags = txp->tx_ol_flags; + + for (i = 0; i < nb_rx; i++) { + + mb = pkts_burst[i]; + l2_len = sizeof(struct ether_hdr); + pkt_ol_flags = mb->ol_flags; + ol_flags = (uint16_t) (pkt_ol_flags & (~PKT_TX_L4_MASK)); + + eth_hdr = (struct ether_hdr *) mb->pkt.data; + if (rte_be_to_cpu_16(eth_hdr->ether_type) == ETHER_TYPE_VLAN) { + /* Only allow single VLAN label here */ + l2_len += sizeof(struct vlan_hdr); + } + + /* Update the L3/L4 checksum error packet count */ + rx_bad_ip_csum += (uint16_t) ((pkt_ol_flags & PKT_RX_IP_CKSUM_BAD) != 0); + rx_bad_l4_csum += (uint16_t) ((pkt_ol_flags & PKT_RX_L4_CKSUM_BAD) != 0); + + /* + * Simplify the protocol parsing + * Assuming the incoming packets format as + * Ethernet2 + optional single VLAN + * + ipv4 or ipv6 + * + udp or tcp or sctp or others + */ + if (pkt_ol_flags & PKT_RX_IPV4_HDR) { + + /* Do not support ipv4 option field */ + l3_len = sizeof(struct ipv4_hdr) ; + + ipv4_hdr = (struct ipv4_hdr *) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len); + + l4_proto = ipv4_hdr->next_proto_id; + + /* Do not delete, this is required by HW*/ + ipv4_hdr->hdr_checksum = 0; + + if (tx_ol_flags & 0x1) { + /* HW checksum */ + ol_flags |= PKT_TX_IP_CKSUM; + } + else { + /* SW checksum calculation */ + ipv4_hdr->src_addr++; + ipv4_hdr->hdr_checksum = get_ipv4_cksum(ipv4_hdr); + } + + if (l4_proto == IPPROTO_UDP) { + udp_hdr = (struct udp_hdr*) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len + l3_len); + if (tx_ol_flags & 0x2) { + /* HW Offload */ + ol_flags |= PKT_TX_UDP_CKSUM; + /* Pseudo header sum need be set properly */ + udp_hdr->dgram_cksum = get_ipv4_psd_sum(ipv4_hdr); + } + else { + /* SW Implementation, clear checksum field first */ + udp_hdr->dgram_cksum = 0; + udp_hdr->dgram_cksum = get_ipv4_udptcp_checksum(ipv4_hdr, + (uint16_t*)udp_hdr); + } + } + else if (l4_proto == IPPROTO_TCP){ + tcp_hdr = (struct tcp_hdr*) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len + l3_len); + if (tx_ol_flags & 0x4) { + ol_flags |= PKT_TX_TCP_CKSUM; + tcp_hdr->cksum = get_ipv4_psd_sum(ipv4_hdr); + } + else { + tcp_hdr->cksum = 0; + tcp_hdr->cksum = get_ipv4_udptcp_checksum(ipv4_hdr, + (uint16_t*)tcp_hdr); + } + } + else if (l4_proto == IPPROTO_SCTP) { + sctp_hdr = (struct sctp_hdr*) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len + l3_len); + + if (tx_ol_flags & 0x8) { + ol_flags |= PKT_TX_SCTP_CKSUM; + sctp_hdr->cksum = 0; + + /* Sanity check, only number of 4 bytes supported */ + if ((rte_be_to_cpu_16(ipv4_hdr->total_length) % 4) != 0) + printf("sctp payload must be a multiple " + "of 4 bytes for checksum offload"); + } + else { + sctp_hdr->cksum = 0; + /* CRC32c sample code available in RFC3309 */ + } + } + /* End of L4 Handling*/ + } + + else { + ipv6_hdr = (struct ipv6_hdr *) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len); + l3_len = sizeof(struct ipv6_hdr) ; + l4_proto = ipv6_hdr->proto; + + if (l4_proto == IPPROTO_UDP) { + udp_hdr = (struct udp_hdr*) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len + l3_len); + if (tx_ol_flags & 0x2) { + /* HW Offload */ + ol_flags |= PKT_TX_UDP_CKSUM; + udp_hdr->dgram_cksum = get_ipv6_psd_sum(ipv6_hdr); + } + else { + /* SW Implementation */ + /* checksum field need be clear first */ + udp_hdr->dgram_cksum = 0; + udp_hdr->dgram_cksum = get_ipv6_udptcp_checksum(ipv6_hdr, + (uint16_t*)udp_hdr); + } + } + else if (l4_proto == IPPROTO_TCP) { + tcp_hdr = (struct tcp_hdr*) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len + l3_len); + if (tx_ol_flags & 0x4) { + ol_flags |= PKT_TX_TCP_CKSUM; + tcp_hdr->cksum = get_ipv6_psd_sum(ipv6_hdr); + } + else { + tcp_hdr->cksum = 0; + tcp_hdr->cksum = get_ipv6_udptcp_checksum(ipv6_hdr, + (uint16_t*)tcp_hdr); + } + } + else if (l4_proto == IPPROTO_SCTP) { + sctp_hdr = (struct sctp_hdr*) (rte_pktmbuf_mtod(mb, + unsigned char *) + l2_len + l3_len); + + if (tx_ol_flags & 0x8) { + ol_flags |= PKT_TX_SCTP_CKSUM; + sctp_hdr->cksum = 0; + /* Sanity check, only number of 4 bytes supported by HW */ + if ((rte_be_to_cpu_16(ipv6_hdr->payload_len) % 4) != 0) + printf("sctp payload must be a multiple " + "of 4 bytes for checksum offload"); + } + else { + /* CRC32c sample code available in RFC3309 */ + sctp_hdr->cksum = 0; + } + } else { + printf("Test flow control for 1G PMD \n"); + } + /* End of L4 Handling*/ + } + + /* Combine the packet header write. VLAN is not consider here */ + mb->pkt.l2_len = l2_len; + mb->pkt.l3_len = l3_len; + mb->ol_flags = ol_flags; + } + nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx); + fs->tx_packets += nb_tx; + fs->rx_bad_ip_csum += rx_bad_ip_csum; + fs->rx_bad_l4_csum += rx_bad_l4_csum; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->tx_burst_stats.pkt_burst_spread[nb_tx]++; +#endif + if (unlikely(nb_tx < nb_rx)) { + fs->fwd_dropped += (nb_rx - nb_tx); + do { + rte_pktmbuf_free(pkts_burst[nb_tx]); + } while (++nb_tx < nb_rx); + } +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + end_tsc = rte_rdtsc(); + core_cycles = (end_tsc - start_tsc); + fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles); +#endif +} + + +struct fwd_engine csum_fwd_engine = { + .fwd_mode_name = "csum", + .port_fwd_begin = NULL, + .port_fwd_end = NULL, + .packet_fwd = pkt_burst_checksum_forward, +}; + diff --git a/app/test-pmd/ieee1588fwd.c b/app/test-pmd/ieee1588fwd.c new file mode 100644 index 0000000..1fbc554 --- /dev/null +++ b/app/test-pmd/ieee1588fwd.c @@ -0,0 +1,657 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +/** + * The structure of a PTP V2 packet. + * + * Only the minimum fields used by the ieee1588 test are represented. + */ +struct ptpv2_msg { + uint8_t msg_id; + uint8_t version; /**< must be 0x02 */ + uint8_t unused[34]; +}; +#define PTP_SYNC_MESSAGE 0x0 +#define PTP_DELAY_REQ_MESSAGE 0x1 +#define PTP_PATH_DELAY_REQ_MESSAGE 0x2 +#define PTP_PATH_DELAY_RESP_MESSAGE 0x3 +#define PTP_FOLLOWUP_MESSAGE 0x8 +#define PTP_DELAY_RESP_MESSAGE 0x9 +#define PTP_PATH_DELAY_FOLLOWUP_MESSAGE 0xA +#define PTP_ANNOUNCE_MESSAGE 0xB +#define PTP_SIGNALLING_MESSAGE 0xC +#define PTP_MANAGEMENT_MESSAGE 0xD + +/* + * Forwarding of IEEE1588 Precise Time Protocol (PTP) packets. + * + * In this mode, packets are received one by one and are expected to be + * PTP V2 L2 Ethernet frames (with the specific Ethernet type "0x88F7") + * containing PTP "sync" messages (version 2 at offset 1, and message ID + * 0 at offset 0). + * + * Check that each received packet is a IEEE1588 PTP V2 packet of type + * PTP_SYNC_MESSAGE, and that it has been identified and timestamped + * by the hardware. + * Check that the value of the last RX timestamp recorded by the controller + * is greater than the previous one. + * + * If everything is OK, send the received packet back on the same port, + * requesting for it to be timestamped by the hardware. + * Check that the value of the last TX timestamp recorded by the controller + * is greater than the previous one. + */ + +/* + * 1GbE 82576 Kawela registers used for IEEE1588 hardware support + */ +#define IGBE_82576_ETQF(n) (0x05CB0 + (4 * (n))) +#define IGBE_82576_ETQF_FILTER_ENABLE (1 << 26) +#define IGBE_82576_ETQF_1588_TIMESTAMP (1 << 30) + +#define IGBE_82576_TSYNCRXCTL 0x0B620 +#define IGBE_82576_TSYNCRXCTL_RXTS_ENABLE (1 << 4) + +#define IGBE_82576_RXSTMPL 0x0B624 +#define IGBE_82576_RXSTMPH 0x0B628 +#define IGBE_82576_RXSATRL 0x0B62C +#define IGBE_82576_RXSATRH 0x0B630 +#define IGBE_82576_TSYNCTXCTL 0x0B614 +#define IGBE_82576_TSYNCTXCTL_TXTS_ENABLE (1 << 4) + +#define IGBE_82576_TXSTMPL 0x0B618 +#define IGBE_82576_TXSTMPH 0x0B61C +#define IGBE_82576_SYSTIML 0x0B600 +#define IGBE_82576_SYSTIMH 0x0B604 +#define IGBE_82576_TIMINCA 0x0B608 +#define IGBE_82576_TIMADJL 0x0B60C +#define IGBE_82576_TIMADJH 0x0B610 +#define IGBE_82576_TSAUXC 0x0B640 +#define IGBE_82576_TRGTTIML0 0x0B644 +#define IGBE_82576_TRGTTIMH0 0x0B648 +#define IGBE_82576_TRGTTIML1 0x0B64C +#define IGBE_82576_TRGTTIMH1 0x0B650 +#define IGBE_82576_AUXSTMPL0 0x0B65C +#define IGBE_82576_AUXSTMPH0 0x0B660 +#define IGBE_82576_AUXSTMPL1 0x0B664 +#define IGBE_82576_AUXSTMPH1 0x0B668 +#define IGBE_82576_TSYNCRXCFG 0x05F50 +#define IGBE_82576_TSSDP 0x0003C + +/* + * 10GbE 82599 Niantic registers used for IEEE1588 hardware support + */ +#define IXGBE_82599_ETQF(n) (0x05128 + (4 * (n))) +#define IXGBE_82599_ETQF_FILTER_ENABLE (1 << 31) +#define IXGBE_82599_ETQF_1588_TIMESTAMP (1 << 30) + +#define IXGBE_82599_TSYNCRXCTL 0x05188 +#define IXGBE_82599_TSYNCRXCTL_RXTS_ENABLE (1 << 4) + +#define IXGBE_82599_RXSTMPL 0x051E8 +#define IXGBE_82599_RXSTMPH 0x051A4 +#define IXGBE_82599_RXSATRL 0x051A0 +#define IXGBE_82599_RXSATRH 0x051A8 +#define IXGBE_82599_RXMTRL 0x05120 +#define IXGBE_82599_TSYNCTXCTL 0x08C00 +#define IXGBE_82599_TSYNCTXCTL_TXTS_ENABLE (1 << 4) + +#define IXGBE_82599_TXSTMPL 0x08C04 +#define IXGBE_82599_TXSTMPH 0x08C08 +#define IXGBE_82599_SYSTIML 0x08C0C +#define IXGBE_82599_SYSTIMH 0x08C10 +#define IXGBE_82599_TIMINCA 0x08C14 +#define IXGBE_82599_TIMADJL 0x08C18 +#define IXGBE_82599_TIMADJH 0x08C1C +#define IXGBE_82599_TSAUXC 0x08C20 +#define IXGBE_82599_TRGTTIML0 0x08C24 +#define IXGBE_82599_TRGTTIMH0 0x08C28 +#define IXGBE_82599_TRGTTIML1 0x08C2C +#define IXGBE_82599_TRGTTIMH1 0x08C30 +#define IXGBE_82599_AUXSTMPL0 0x08C3C +#define IXGBE_82599_AUXSTMPH0 0x08C40 +#define IXGBE_82599_AUXSTMPL1 0x08C44 +#define IXGBE_82599_AUXSTMPH1 0x08C48 + +/** + * Mandatory ETQF register for IEEE1588 packets filter. + */ +#define ETQF_FILTER_1588_REG 3 + +/** + * Recommended value for increment and period of + * the Increment Attribute Register. + */ +#define IEEE1588_TIMINCA_INIT ((0x02 << 24) | 0x00F42400) + +/** + * Data structure with pointers to port-specific functions. + */ +typedef void (*ieee1588_start_t)(portid_t pi); /**< Start IEEE1588 feature. */ +typedef void (*ieee1588_stop_t)(portid_t pi); /**< Stop IEEE1588 feature. */ +typedef int (*tmst_read_t)(portid_t pi, uint64_t *tmst); /**< Read TMST regs */ + +struct port_ieee1588_ops { + ieee1588_start_t ieee1588_start; + ieee1588_stop_t ieee1588_stop; + tmst_read_t rx_tmst_read; + tmst_read_t tx_tmst_read; +}; + +/** + * 1GbE 82576 IEEE1588 operations. + */ +static void +igbe_82576_ieee1588_start(portid_t pi) +{ + uint32_t tsync_ctl; + + /* + * Start incrementation of the System Time registers used to + * timestamp PTP packets. + */ + port_id_pci_reg_write(pi, IGBE_82576_TIMINCA, IEEE1588_TIMINCA_INIT); + port_id_pci_reg_write(pi, IGBE_82576_TSAUXC, 0); + + /* + * Enable L2 filtering of IEEE1588 Ethernet frame types. + */ + port_id_pci_reg_write(pi, IGBE_82576_ETQF(ETQF_FILTER_1588_REG), + (ETHER_TYPE_1588 | + IGBE_82576_ETQF_FILTER_ENABLE | + IGBE_82576_ETQF_1588_TIMESTAMP)); + + /* + * Enable timestamping of received PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IGBE_82576_TSYNCRXCTL); + tsync_ctl |= IGBE_82576_TSYNCRXCTL_RXTS_ENABLE; + port_id_pci_reg_write(pi, IGBE_82576_TSYNCRXCTL, tsync_ctl); + + /* + * Enable Timestamping of transmitted PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IGBE_82576_TSYNCTXCTL); + tsync_ctl |= IGBE_82576_TSYNCTXCTL_TXTS_ENABLE; + port_id_pci_reg_write(pi, IGBE_82576_TSYNCTXCTL, tsync_ctl); +} + +static void +igbe_82576_ieee1588_stop(portid_t pi) +{ + uint32_t tsync_ctl; + + /* + * Disable Timestamping of transmitted PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IGBE_82576_TSYNCTXCTL); + tsync_ctl &= ~IGBE_82576_TSYNCTXCTL_TXTS_ENABLE; + port_id_pci_reg_write(pi, IGBE_82576_TSYNCTXCTL, tsync_ctl); + + /* + * Disable timestamping of received PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IGBE_82576_TSYNCRXCTL); + tsync_ctl &= ~IGBE_82576_TSYNCRXCTL_RXTS_ENABLE; + port_id_pci_reg_write(pi, IGBE_82576_TSYNCRXCTL, tsync_ctl); + + /* + * Disable L2 filtering of IEEE1588 Ethernet types. + */ + port_id_pci_reg_write(pi, IGBE_82576_ETQF(ETQF_FILTER_1588_REG), 0); + + /* + * Stop incrementation of the System Time registers. + */ + port_id_pci_reg_write(pi, IGBE_82576_TIMINCA, 0); +} + +/** + * Return the 64-bit value contained in the RX IEEE1588 timestamp registers + * of a 1GbE 82576 port. + * + * @param pi + * The port identifier. + * + * @param tmst + * The address of a 64-bit variable to return the value of the RX timestamp. + * + * @return + * -1: the RXSTMPL and RXSTMPH registers of the port are not valid. + * 0: the variable pointed to by the "tmst" parameter contains the value + * of the RXSTMPL and RXSTMPH registers of the port. + */ +static int +igbe_82576_rx_timestamp_read(portid_t pi, uint64_t *tmst) +{ + uint32_t tsync_rxctl; + uint32_t rx_stmpl; + uint32_t rx_stmph; + + tsync_rxctl = port_id_pci_reg_read(pi, IGBE_82576_TSYNCRXCTL); + if ((tsync_rxctl & 0x01) == 0) + return (-1); + + rx_stmpl = port_id_pci_reg_read(pi, IGBE_82576_RXSTMPL); + rx_stmph = port_id_pci_reg_read(pi, IGBE_82576_RXSTMPH); + *tmst = (uint64_t)(((uint64_t) rx_stmph << 32) | rx_stmpl); + return (0); +} + +/** + * Return the 64-bit value contained in the TX IEEE1588 timestamp registers + * of a 1GbE 82576 port. + * + * @param pi + * The port identifier. + * + * @param tmst + * The address of a 64-bit variable to return the value of the TX timestamp. + * + * @return + * -1: the TXSTMPL and TXSTMPH registers of the port are not valid. + * 0: the variable pointed to by the "tmst" parameter contains the value + * of the TXSTMPL and TXSTMPH registers of the port. + */ +static int +igbe_82576_tx_timestamp_read(portid_t pi, uint64_t *tmst) +{ + uint32_t tsync_txctl; + uint32_t tx_stmpl; + uint32_t tx_stmph; + + tsync_txctl = port_id_pci_reg_read(pi, IGBE_82576_TSYNCTXCTL); + if ((tsync_txctl & 0x01) == 0) + return (-1); + + tx_stmpl = port_id_pci_reg_read(pi, IGBE_82576_TXSTMPL); + tx_stmph = port_id_pci_reg_read(pi, IGBE_82576_TXSTMPH); + *tmst = (uint64_t)(((uint64_t) tx_stmph << 32) | tx_stmpl); + return (0); +} + +static struct port_ieee1588_ops igbe_82576_ieee1588_ops = { + .ieee1588_start = igbe_82576_ieee1588_start, + .ieee1588_stop = igbe_82576_ieee1588_stop, + .rx_tmst_read = igbe_82576_rx_timestamp_read, + .tx_tmst_read = igbe_82576_tx_timestamp_read, +}; + +/** + * 10GbE 82599 IEEE1588 operations. + */ +static void +ixgbe_82599_ieee1588_start(portid_t pi) +{ + uint32_t tsync_ctl; + + /* + * Start incrementation of the System Time registers used to + * timestamp PTP packets. + */ + port_id_pci_reg_write(pi, IXGBE_82599_TIMINCA, IEEE1588_TIMINCA_INIT); + + /* + * Enable L2 filtering of IEEE1588 Ethernet frame types. + */ + port_id_pci_reg_write(pi, IXGBE_82599_ETQF(ETQF_FILTER_1588_REG), + (ETHER_TYPE_1588 | + IXGBE_82599_ETQF_FILTER_ENABLE | + IXGBE_82599_ETQF_1588_TIMESTAMP)); + + /* + * Enable timestamping of received PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IXGBE_82599_TSYNCRXCTL); + tsync_ctl |= IXGBE_82599_TSYNCRXCTL_RXTS_ENABLE; + port_id_pci_reg_write(pi, IXGBE_82599_TSYNCRXCTL, tsync_ctl); + + /* + * Enable Timestamping of transmitted PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IXGBE_82599_TSYNCTXCTL); + tsync_ctl |= IXGBE_82599_TSYNCTXCTL_TXTS_ENABLE; + port_id_pci_reg_write(pi, IXGBE_82599_TSYNCTXCTL, tsync_ctl); +} + +static void +ixgbe_82599_ieee1588_stop(portid_t pi) +{ + uint32_t tsync_ctl; + + /* + * Disable Timestamping of transmitted PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IXGBE_82599_TSYNCTXCTL); + tsync_ctl &= ~IXGBE_82599_TSYNCTXCTL_TXTS_ENABLE; + port_id_pci_reg_write(pi, IXGBE_82599_TSYNCTXCTL, tsync_ctl); + + /* + * Disable timestamping of received PTP packets. + */ + tsync_ctl = port_id_pci_reg_read(pi, IXGBE_82599_TSYNCRXCTL); + tsync_ctl &= ~IXGBE_82599_TSYNCRXCTL_RXTS_ENABLE; + port_id_pci_reg_write(pi, IXGBE_82599_TSYNCRXCTL, tsync_ctl); + + /* + * Disable L2 filtering of IEEE1588 Ethernet frame types. + */ + port_id_pci_reg_write(pi, IXGBE_82599_ETQF(ETQF_FILTER_1588_REG), 0); + + /* + * Stop incrementation of the System Time registers. + */ + port_id_pci_reg_write(pi, IXGBE_82599_TIMINCA, 0); +} + +/** + * Return the 64-bit value contained in the RX IEEE1588 timestamp registers + * of a 10GbE 82599 port. + * + * @param pi + * The port identifier. + * + * @param tmst + * The address of a 64-bit variable to return the value of the TX timestamp. + * + * @return + * -1: the RX timestamp registers of the port are not valid. + * 0: the variable pointed to by the "tmst" parameter contains the value + * of the RXSTMPL and RXSTMPH registers of the port. + */ +static int +ixgbe_82599_rx_timestamp_read(portid_t pi, uint64_t *tmst) +{ + uint32_t tsync_rxctl; + uint32_t rx_stmpl; + uint32_t rx_stmph; + + tsync_rxctl = port_id_pci_reg_read(pi, IXGBE_82599_TSYNCRXCTL); + if ((tsync_rxctl & 0x01) == 0) + return (-1); + + rx_stmpl = port_id_pci_reg_read(pi, IXGBE_82599_RXSTMPL); + rx_stmph = port_id_pci_reg_read(pi, IXGBE_82599_RXSTMPH); + *tmst = (uint64_t)(((uint64_t) rx_stmph << 32) | rx_stmpl); + return (0); +} + +/** + * Return the 64-bit value contained in the TX IEEE1588 timestamp registers + * of a 10GbE 82599 port. + * + * @param pi + * The port identifier. + * + * @param tmst + * The address of a 64-bit variable to return the value of the TX timestamp. + * + * @return + * -1: the TXSTMPL and TXSTMPH registers of the port are not valid. + * 0: the variable pointed to by the "tmst" parameter contains the value + * of the TXSTMPL and TXSTMPH registers of the port. + */ +static int +ixgbe_82599_tx_timestamp_read(portid_t pi, uint64_t *tmst) +{ + uint32_t tsync_txctl; + uint32_t tx_stmpl; + uint32_t tx_stmph; + + tsync_txctl = port_id_pci_reg_read(pi, IXGBE_82599_TSYNCTXCTL); + if ((tsync_txctl & 0x01) == 0) + return (-1); + + tx_stmpl = port_id_pci_reg_read(pi, IXGBE_82599_TXSTMPL); + tx_stmph = port_id_pci_reg_read(pi, IXGBE_82599_TXSTMPH); + *tmst = (uint64_t)(((uint64_t) tx_stmph << 32) | tx_stmpl); + return (0); +} + +static struct port_ieee1588_ops ixgbe_82599_ieee1588_ops = { + .ieee1588_start = ixgbe_82599_ieee1588_start, + .ieee1588_stop = ixgbe_82599_ieee1588_stop, + .rx_tmst_read = ixgbe_82599_rx_timestamp_read, + .tx_tmst_read = ixgbe_82599_tx_timestamp_read, +}; + +static void +port_ieee1588_rx_timestamp_check(portid_t pi) +{ + struct port_ieee1588_ops *ieee_ops; + uint64_t rx_tmst; + + ieee_ops = (struct port_ieee1588_ops *)ports[pi].fwd_ctx; + if (ieee_ops->rx_tmst_read(pi, &rx_tmst) < 0) { + printf("Port %u: RX timestamp registers not valid\n", + (unsigned) pi); + return; + } + printf("Port %u RX timestamp value 0x%"PRIu64"\n", + (unsigned) pi, rx_tmst); +} + +#define MAX_TX_TMST_WAIT_MICROSECS 1000 /**< 1 milli-second */ + +static void +port_ieee1588_tx_timestamp_check(portid_t pi) +{ + struct port_ieee1588_ops *ieee_ops; + uint64_t tx_tmst; + unsigned wait_us; + + ieee_ops = (struct port_ieee1588_ops *)ports[pi].fwd_ctx; + wait_us = 0; + while ((ieee_ops->tx_tmst_read(pi, &tx_tmst) < 0) && + (wait_us < MAX_TX_TMST_WAIT_MICROSECS)) { + rte_delay_us(1); + wait_us++; + } + if (wait_us >= MAX_TX_TMST_WAIT_MICROSECS) { + printf("Port %u: TX timestamp registers not valid after" + "%u micro-seconds\n", + (unsigned) pi, (unsigned) MAX_TX_TMST_WAIT_MICROSECS); + return; + } + printf("Port %u TX timestamp value 0x%"PRIu64" validated after " + "%u micro-second%s\n", + (unsigned) pi, tx_tmst, wait_us, + (wait_us == 1) ? "" : "s"); +} + +static void +ieee1588_packet_fwd(struct fwd_stream *fs) +{ + struct rte_mbuf *mb; + struct ether_hdr *eth_hdr; + struct ptpv2_msg *ptp_hdr; + uint16_t eth_type; + + /* + * Receive 1 packet at a time. + */ + if (rte_eth_rx_burst(fs->rx_port, fs->rx_queue, &mb, 1) == 0) + return; + + fs->rx_packets += 1; + + /* + * Check that the received packet is a PTP packet that was detected + * by the hardware. + */ + eth_hdr = (struct ether_hdr *)mb->pkt.data; + eth_type = rte_be_to_cpu_16(eth_hdr->ether_type); + if (! (mb->ol_flags & PKT_RX_IEEE1588_PTP)) { + if (eth_type == ETHER_TYPE_1588) { + printf("Port %u Received PTP packet not filtered" + " by hardware\n", + (unsigned) fs->rx_port); + } else { + printf("Port %u Received non PTP packet type=0x%4x " + "len=%u\n", + (unsigned) fs->rx_port, eth_type, + (unsigned) mb->pkt.pkt_len); + } + rte_pktmbuf_free(mb); + return; + } + if (eth_type != ETHER_TYPE_1588) { + printf("Port %u Received NON PTP packet wrongly" + " detected by hardware\n", + (unsigned) fs->rx_port); + rte_pktmbuf_free(mb); + return; + } + + /* + * Check that the received PTP packet is a PTP V2 packet of type + * PTP_SYNC_MESSAGE. + */ + ptp_hdr = (struct ptpv2_msg *) ((char *) mb->pkt.data + + sizeof(struct ether_hdr)); + if (ptp_hdr->version != 0x02) { + printf("Port %u Received PTP V2 Ethernet frame with wrong PTP" + " protocol version 0x%x (should be 0x02)\n", + (unsigned) fs->rx_port, ptp_hdr->version); + rte_pktmbuf_free(mb); + return; + } + if (ptp_hdr->msg_id != PTP_SYNC_MESSAGE) { + printf("Port %u Received PTP V2 Ethernet frame with unexpected" + " messageID 0x%x (expected 0x0 - PTP_SYNC_MESSAGE)\n", + (unsigned) fs->rx_port, ptp_hdr->msg_id); + rte_pktmbuf_free(mb); + return; + } + printf("Port %u IEEE1588 PTP V2 SYNC Message filtered by hardware\n", + (unsigned) fs->rx_port); + + /* + * Check that the received PTP packet has been timestamped by the + * hardware. + */ + if (! (mb->ol_flags & PKT_RX_IEEE1588_TMST)) { + printf("Port %u Received PTP packet not timestamped" + " by hardware\n", + (unsigned) fs->rx_port); + rte_pktmbuf_free(mb); + return; + } + + /* Check the RX timestamp */ + port_ieee1588_rx_timestamp_check(fs->rx_port); + + /* Forward PTP packet with hardware TX timestamp */ + mb->ol_flags |= PKT_TX_IEEE1588_TMST; + fs->tx_packets += 1; + if (rte_eth_tx_burst(fs->rx_port, fs->tx_queue, &mb, 1) == 0) { + printf("Port %u sent PTP packet dropped\n", + (unsigned) fs->rx_port); + fs->fwd_dropped += 1; + rte_pktmbuf_free(mb); + return; + } + + /* + * Check the TX timestamp. + */ + port_ieee1588_tx_timestamp_check(fs->rx_port); +} + +static void +port_ieee1588_fwd_begin(portid_t pi) +{ + struct port_ieee1588_ops *ieee_ops; + + if (strcmp(ports[pi].dev_info.driver_name, "rte_igb_pmd") == 0) + ieee_ops = &igbe_82576_ieee1588_ops; + else + ieee_ops = &ixgbe_82599_ieee1588_ops; + ports[pi].fwd_ctx = ieee_ops; + (ieee_ops->ieee1588_start)(pi); +} + +static void +port_ieee1588_fwd_end(portid_t pi) +{ + struct port_ieee1588_ops *ieee_ops; + + ieee_ops = (struct port_ieee1588_ops *)ports[pi].fwd_ctx; + (ieee_ops->ieee1588_stop)(pi); +} + +struct fwd_engine ieee1588_fwd_engine = { + .fwd_mode_name = "ieee1588", + .port_fwd_begin = port_ieee1588_fwd_begin, + .port_fwd_end = port_ieee1588_fwd_end, + .packet_fwd = ieee1588_packet_fwd, +}; diff --git a/app/test-pmd/iofwd.c b/app/test-pmd/iofwd.c new file mode 100644 index 0000000..3f29f6d --- /dev/null +++ b/app/test-pmd/iofwd.c @@ -0,0 +1,131 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +/* + * Forwarding of packets in I/O mode. + * Forward packets "as-is". + * This is the fastest possible forwarding operation, as it does not access + * to packets data. + */ +static void +pkt_burst_io_forward(struct fwd_stream *fs) +{ + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + uint16_t nb_rx; + uint16_t nb_tx; +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t start_tsc; + uint64_t end_tsc; + uint64_t core_cycles; +#endif + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + start_tsc = rte_rdtsc(); +#endif + + /* + * Receive a burst of packets and forward them. + */ + nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst, + nb_pkt_per_burst); + if (unlikely(nb_rx == 0)) + return; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->rx_burst_stats.pkt_burst_spread[nb_rx]++; +#endif + fs->rx_packets += nb_rx; + nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx); + fs->tx_packets += nb_tx; +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->tx_burst_stats.pkt_burst_spread[nb_tx]++; +#endif + if (unlikely(nb_tx < nb_rx)) { + fs->fwd_dropped += (nb_rx - nb_tx); + do { + rte_pktmbuf_free(pkts_burst[nb_tx]); + } while (++nb_tx < nb_rx); + } +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + end_tsc = rte_rdtsc(); + core_cycles = (end_tsc - start_tsc); + fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles); +#endif +} + +struct fwd_engine io_fwd_engine = { + .fwd_mode_name = "io", + .port_fwd_begin = NULL, + .port_fwd_end = NULL, + .packet_fwd = pkt_burst_io_forward, +}; diff --git a/app/test-pmd/macfwd.c b/app/test-pmd/macfwd.c new file mode 100644 index 0000000..8f31e05 --- /dev/null +++ b/app/test-pmd/macfwd.c @@ -0,0 +1,148 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +/* + * Forwarding of packets in MAC mode. + * Change the source and the destination Ethernet addressed of packets + * before forwarding them. + */ +static void +pkt_burst_mac_forward(struct fwd_stream *fs) +{ + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + struct rte_port *txp; + struct rte_mbuf *mb; + struct ether_hdr *eth_hdr; + uint16_t nb_rx; + uint16_t nb_tx; + uint16_t i; +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t start_tsc; + uint64_t end_tsc; + uint64_t core_cycles; +#endif + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + start_tsc = rte_rdtsc(); +#endif + + /* + * Receive a burst of packets and forward them. + */ + nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst, + nb_pkt_per_burst); + if (unlikely(nb_rx == 0)) + return; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->rx_burst_stats.pkt_burst_spread[nb_rx]++; +#endif + fs->rx_packets += nb_rx; + txp = &ports[fs->tx_port]; + for (i = 0; i < nb_rx; i++) { + mb = pkts_burst[i]; + eth_hdr = (struct ether_hdr *) mb->pkt.data; + ether_addr_copy(&peer_eth_addrs[fs->peer_addr], + ð_hdr->d_addr); + ether_addr_copy(&ports[fs->tx_port].eth_addr, + ð_hdr->s_addr); + mb->ol_flags = txp->tx_ol_flags; + mb->pkt.l2_len = sizeof(struct ether_hdr); + mb->pkt.l3_len = sizeof(struct ipv4_hdr); + mb->pkt.vlan_tci = txp->tx_vlan_id; + } + nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx); + fs->tx_packets += nb_tx; +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->tx_burst_stats.pkt_burst_spread[nb_tx]++; +#endif + if (unlikely(nb_tx < nb_rx)) { + fs->fwd_dropped += (nb_rx - nb_tx); + do { + rte_pktmbuf_free(pkts_burst[nb_tx]); + } while (++nb_tx < nb_rx); + } +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + end_tsc = rte_rdtsc(); + core_cycles = (end_tsc - start_tsc); + fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles); +#endif +} + +struct fwd_engine mac_fwd_engine = { + .fwd_mode_name = "mac", + .port_fwd_begin = NULL, + .port_fwd_end = NULL, + .packet_fwd = pkt_burst_mac_forward, +}; diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c new file mode 100644 index 0000000..4c559ef --- /dev/null +++ b/app/test-pmd/parameters.c @@ -0,0 +1,646 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +static void +usage(char* progname) +{ + printf("usage: %s [--interactive|-i] [--help|-h] | [" + "--coremask=COREMASK --portmask=PORTMASK --numa " + "--eth-peers-configfile= | " + "--eth-peer=X,M:M:M:M:M:M | --nb-cores= | --nb-ports= | " + "--pkt-filter-mode= |" + "--rss-ip | --rss-udp | " + "--rxpt= | --rxht= | --rxwt= | --rxfreet= | " + "--txpt= | --txht= | --txwt= | --txfreet= | " + "--txrst= ]\n", + progname); + printf(" --interactive: run in interactive mode\n"); + printf(" --help: display this message and quit\n"); + printf(" --eth-peers-configfile=name of file with ethernet addresses " + "of peer ports\n"); + printf(" --eth-peer=X,M:M:M:M:M:M set the mac address of the X peer " + "port (0 <= X < %d)\n", RTE_MAX_ETHPORTS); + printf(" --nb-cores=N set the number of forwarding cores" + " (1 <= N <= %d)\n", nb_lcores); + printf(" --nb-ports=N set the number of forwarding ports" + " (1 <= N <= %d)\n", nb_ports); + printf(" --coremask=COREMASK: hexadecimal bitmask of cores running " + "the packet forwarding test\n"); + printf(" --portmask=PORTMASK: hexadecimal bitmask of ports used " + "by the packet forwarding test\n"); + printf(" --numa: enable NUMA-aware allocation of RX/TX rings and of " + " RX memory buffers (mbufs)\n"); + printf(" --mbuf-size=N set the data size of mbuf to N bytes\n"); + printf(" --max-pkt-len=N set the maximum size of packet to N bytes\n"); + printf(" --pkt-filter-mode=N: set Flow director mode " + "( N: none (default mode) or signature or perfect)\n"); + printf(" --pkt-filter-report-hash=N: set Flow director report mode " + "( N: none or match (default) or always)\n"); + printf(" --pkt-filter-size=N: set Flow director mode " + "( N: 64K (default mode) or 128K or 256K)\n"); + printf(" --pkt-filter-flexbytes-offset=N: set flexbytes-offset." + " The offset is defined in word units counted from the" + " first byte of the destination Ethernet MAC address." + " 0 <= N <= 32\n"); + printf(" --pkt-filter-drop-queue=N: set drop-queue." + " In perfect mode, when you add a rule with queue -1" + " the packet will be enqueued into the rx drop-queue." + " If the drop-queue doesn't exist, the packet is dropped." + " By default drop-queue=127\n"); + printf(" --crc-strip: enable CRC stripping by hardware\n"); + printf(" --enable-rx-cksum: enable rx hardware checksum offload\n"); + printf(" --disable-hw-vlan: disable hardware vlan\n"); + printf(" --disable-rss: disable rss\n"); + printf(" --port-topology=N: set port topology (N: paired (default) or " + "chained)\n"); + printf(" --rss-ip: set RSS functions to IPv4/IPv6 only \n"); + printf(" --rss-udp: set RSS functions to IPv4/IPv6 + UDP\n"); + printf(" --rxq=N set the number of RX queues per port to N\n"); + printf(" --rxd=N set the number of descriptors in RX rings to N\n"); + printf(" --txq=N set the number of TX queues per port to N\n"); + printf(" --txd=N set the number of descriptors in TX rings to N\n"); + printf(" --burst=N set the number of packets per burst to N\n"); + printf(" --mbcache=N set the cache of mbuf memory pool to N\n"); + printf(" --rxpt=N set prefetch threshold register of RX rings to N" + " (0 <= N <= 16)\n"); + printf(" --rxht=N set the host threshold register of RX rings to N" + " (0 <= N <= 16)\n"); + printf(" --rxfreet=N set the free threshold of RX descriptors to N" + " (0 <= N < value of rxd)\n"); + printf(" --rxwt=N set the write-back threshold register of RX rings" + " to N (0 <= N <= 16)\n"); + printf(" --txpt=N set the prefetch threshold register of TX rings" + " to N (0 <= N <= 16)\n"); + printf(" --txht=N set the nhost threshold register of TX rings to N" + " (0 <= N <= 16)\n"); + printf(" --txwt=N set the write-back threshold register of TX rings" + " to N (0 <= N <= 16)\n"); + printf(" --txfreet=N set the transmit free threshold of TX rings to N" + " (0 <= N <= value of txd)\n"); + printf(" --txrst=N set the transmit RS bit threshold of TX rings to N" + " (0 <= N <= value of txd)\n"); +} + +static int +init_peer_eth_addrs(char *config_filename) +{ + FILE *config_file; + portid_t i; + char buf[50]; + + config_file = fopen(config_filename, "r"); + if (config_file == NULL) { + perror("open log file failed\n"); + return -1; + } + + for (i = 0; i < RTE_MAX_ETHPORTS; i++) { + + if (fgets(buf, sizeof(buf), config_file) == NULL) + break; + + if (cmdline_parse_etheraddr(NULL, buf, &peer_eth_addrs[i]) < 0 ){ + printf("bad format of mac address on line %d\n", i); + fclose(config_file); + return -1; + } + } + fclose(config_file); + nb_peer_eth_addrs = (portid_t) i; + return 0; +} + +/* + * Parse the coremask given as argument (hexadecimal string) and set + * the global configuration of forwarding cores. + */ +static void +parse_fwd_coremask(const char *coremask) +{ + char *end; + unsigned long long int cm; + + /* parse hexadecimal string */ + end = NULL; + cm = strtoull(coremask, &end, 16); + if ((coremask[0] == '\0') || (end == NULL) || (*end != '\0')) + rte_exit(EXIT_FAILURE, "Invalid fwd core mask\n"); + else + set_fwd_lcores_mask((uint64_t) cm); +} + +/* + * Parse the coremask given as argument (hexadecimal string) and set + * the global configuration of forwarding cores. + */ +static void +parse_fwd_portmask(const char *portmask) +{ + char *end; + unsigned long long int pm; + + /* parse hexadecimal string */ + end = NULL; + pm = strtoull(portmask, &end, 16); + if ((portmask[0] == '\0') || (end == NULL) || (*end != '\0')) + rte_exit(EXIT_FAILURE, "Invalid fwd port mask\n"); + else + set_fwd_ports_mask((uint64_t) pm); +} + +void +launch_args_parse(int argc, char** argv) +{ + int n, opt; + char **argvopt; + int opt_idx; + static struct option lgopts[] = { + { "help", 0, 0, 0 }, + { "interactive", 0, 0, 0 }, + { "eth-peers-configfile", 1, 0, 0 }, + { "eth-peer", 1, 0, 0 }, + { "ports", 1, 0, 0 }, + { "nb-cores", 1, 0, 0 }, + { "nb-ports", 1, 0, 0 }, + { "coremask", 1, 0, 0 }, + { "portmask", 1, 0, 0 }, + { "numa", 0, 0, 0 }, + { "mbuf-size", 1, 0, 0 }, + { "max-pkt-len", 1, 0, 0 }, + { "pkt-filter-mode", 1, 0, 0 }, + { "pkt-filter-report-hash", 1, 0, 0 }, + { "pkt-filter-size", 1, 0, 0 }, + { "pkt-filter-flexbytes-offset",1, 0, 0 }, + { "pkt-filter-drop-queue", 1, 0, 0 }, + { "crc-strip", 0, 0, 0 }, + { "disable-hw-vlan", 0, 0, 0 }, + { "disable-rss", 0, 0, 0 }, + { "port-topology", 1, 0, 0 }, + { "rss-ip", 0, 0, 0 }, + { "rss-udp", 0, 0, 0 }, + { "rxq", 1, 0, 0 }, + { "txq", 1, 0, 0 }, + { "rxd", 1, 0, 0 }, + { "txd", 1, 0, 0 }, + { "burst", 1, 0, 0 }, + { "mbcache", 1, 0, 0 }, + { "txpt", 1, 0, 0 }, + { "txht", 1, 0, 0 }, + { "txwt", 1, 0, 0 }, + { "txfreet", 1, 0, 0 }, + { "txrst", 1, 0, 0 }, + { "rxpt", 1, 0, 0 }, + { "rxht", 1, 0, 0 }, + { "rxwt", 1, 0, 0 }, + { "rxfreet", 1, 0, 0 }, + { 0, 0, 0, 0 }, + }; + + argvopt = argv; + + while ((opt = getopt_long(argc, argvopt, "ih", + lgopts, &opt_idx)) != EOF) { + switch (opt) { + case 'i': + printf("Interactive-mode selected\n"); + interactive = 1; + break; + case 0: /*long options */ + if (!strcmp(lgopts[opt_idx].name, "help")) { + usage(argv[0]); + rte_exit(EXIT_SUCCESS, "Displayed help\n"); + } + if (!strcmp(lgopts[opt_idx].name, "interactive")) { + printf("Interactive-mode selected\n"); + interactive = 1; + } + if (!strcmp(lgopts[opt_idx].name, + "eth-peers-configfile")) { + if (init_peer_eth_addrs(optarg) != 0) + rte_exit(EXIT_FAILURE, + "Cannot open logfile\n"); + } + if (!strcmp(lgopts[opt_idx].name, "eth-peer")) { + char *port_end; + uint8_t c, peer_addr[6]; + + errno = 0; + n = strtoul(optarg, &port_end, 10); + if (errno != 0 || port_end == optarg || *port_end++ != ',') + rte_exit(EXIT_FAILURE, + "Invalid eth-peer: %s", optarg); + if (n >= RTE_MAX_ETHPORTS) + rte_exit(EXIT_FAILURE, + "eth-peer: port %d >= RTE_MAX_ETHPORTS(%d)\n", + n, RTE_MAX_ETHPORTS); + + if (cmdline_parse_etheraddr(NULL, port_end, &peer_addr) < 0 ) + rte_exit(EXIT_FAILURE, + "Invalid ethernet address: %s\n", + port_end); + for (c = 0; c < 6; c++) + peer_eth_addrs[n].addr_bytes[c] = + peer_addr[c]; + nb_peer_eth_addrs++; + } + if (!strcmp(lgopts[opt_idx].name, "nb-ports")) { + n = atoi(optarg); + if (n > 0 && n <= nb_ports) + nb_fwd_ports = (uint8_t) n; + else + rte_exit(EXIT_FAILURE, + "nb-ports should be > 0 and <= %d\n", + nb_ports); + } + if (!strcmp(lgopts[opt_idx].name, "nb-cores")) { + n = atoi(optarg); + if (n > 0 && n <= nb_lcores) + nb_fwd_lcores = (uint8_t) n; + else + rte_exit(EXIT_FAILURE, + "nb-cores should be > 0 and <= %d\n", + nb_lcores); + } + if (!strcmp(lgopts[opt_idx].name, "coremask")) + parse_fwd_coremask(optarg); + if (!strcmp(lgopts[opt_idx].name, "portmask")) + parse_fwd_portmask(optarg); + if (!strcmp(lgopts[opt_idx].name, "numa")) + numa_support = 1; + if (!strcmp(lgopts[opt_idx].name, "mbuf-size")) { + n = atoi(optarg); + if (n > 0 && n <= 0xFFFF) + mbuf_data_size = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, + "mbuf-size should be > 0 and < 65536\n"); + } + if (!strcmp(lgopts[opt_idx].name, "max-pkt-len")) { + n = atoi(optarg); + if (n >= ETHER_MIN_LEN) { + rx_mode.max_rx_pkt_len = (uint32_t) n; + if (n > ETHER_MAX_LEN) + rx_mode.jumbo_frame = 1; + } else + rte_exit(EXIT_FAILURE, + "Invalid max-pkt-len=%d - should be > %d\n", + n, ETHER_MIN_LEN); + } + if (!strcmp(lgopts[opt_idx].name, "pkt-filter-mode")) { + if (!strcmp(optarg, "signature")) + fdir_conf.mode = + RTE_FDIR_MODE_SIGNATURE; + else if (!strcmp(optarg, "perfect")) + fdir_conf.mode = RTE_FDIR_MODE_PERFECT; + else if (!strcmp(optarg, "none")) + fdir_conf.mode = RTE_FDIR_MODE_NONE; + else + rte_exit(EXIT_FAILURE, + "pkt-mode-invalid %s invalid - must be: " + "none, signature or perfect\n", + optarg); + } + if (!strcmp(lgopts[opt_idx].name, + "pkt-filter-report-hash")) { + if (!strcmp(optarg, "none")) + fdir_conf.status = + RTE_FDIR_NO_REPORT_STATUS; + else if (!strcmp(optarg, "match")) + fdir_conf.status = + RTE_FDIR_REPORT_STATUS; + else if (!strcmp(optarg, "always")) + fdir_conf.status = + RTE_FDIR_REPORT_STATUS_ALWAYS; + else + rte_exit(EXIT_FAILURE, + "pkt-filter-report-hash %s invalid " + "- must be: none or match or always\n", + optarg); + } + if (!strcmp(lgopts[opt_idx].name, "pkt-filter-size")) { + if (!strcmp(optarg, "64K")) + fdir_conf.pballoc = + RTE_FDIR_PBALLOC_64K; + else if (!strcmp(optarg, "128K")) + fdir_conf.pballoc = + RTE_FDIR_PBALLOC_128K; + else if (!strcmp(optarg, "256K")) + fdir_conf.pballoc = + RTE_FDIR_PBALLOC_256K; + else + rte_exit(EXIT_FAILURE, "pkt-filter-size %s invalid -" + " must be: 64K or 128K or 256K\n", + optarg); + } + if (!strcmp(lgopts[opt_idx].name, + "pkt-filter-flexbytes-offset")) { + n = atoi(optarg); + if ( n >= 0 && n <= (int) 32) + fdir_conf.flexbytes_offset = + (uint8_t) n; + else + rte_exit(EXIT_FAILURE, + "flexbytes %d invalid - must" + "be >= 0 && <= 32\n", n); + } + if (!strcmp(lgopts[opt_idx].name, + "pkt-filter-drop-queue")) { + n = atoi(optarg); + if (n >= 0) + fdir_conf.drop_queue = (uint8_t) n; + else + rte_exit(EXIT_FAILURE, + "drop queue %d invalid - must" + "be >= 0 \n", n); + } + if (!strcmp(lgopts[opt_idx].name, "crc-strip")) + rx_mode.hw_strip_crc = 1; + if (!strcmp(lgopts[opt_idx].name, "enable-rx-cksum")) + rx_mode.hw_ip_checksum = 1; + if (!strcmp(lgopts[opt_idx].name, "disable-hw-vlan")) + rx_mode.hw_vlan_filter = 0; + if (!strcmp(lgopts[opt_idx].name, "disable-rss")) + rss_hf = 0; + if (!strcmp(lgopts[opt_idx].name, "port-topology")) { + if (!strcmp(optarg, "paired")) + port_topology = PORT_TOPOLOGY_PAIRED; + else if (!strcmp(optarg, "chained")) + port_topology = PORT_TOPOLOGY_CHAINED; + else + rte_exit(EXIT_FAILURE, "port-topology %s invalid -" + " must be: paired or chained \n", + optarg); + } + if (!strcmp(lgopts[opt_idx].name, "rss-ip")) + rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6; + if (!strcmp(lgopts[opt_idx].name, "rss-udp")) + rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6 | + ETH_RSS_IPV4_UDP; + if (!strcmp(lgopts[opt_idx].name, "rxq")) { + n = atoi(optarg); + if (n >= 1 && n <= (int) MAX_QUEUE_ID) + nb_rxq = (queueid_t) n; + else + rte_exit(EXIT_FAILURE, "rxq %d invalid - must be" + " >= 1 && <= %d\n", n, + (int) MAX_QUEUE_ID); + } + if (!strcmp(lgopts[opt_idx].name, "txq")) { + n = atoi(optarg); + if (n >= 1 && n <= (int) MAX_QUEUE_ID) + nb_txq = (queueid_t) n; + else + rte_exit(EXIT_FAILURE, "txq %d invalid - must be" + " >= 1 && <= %d\n", n, + (int) MAX_QUEUE_ID); + } + if (!strcmp(lgopts[opt_idx].name, "rxd")) { + n = atoi(optarg); + if (n > 0) + nb_rxd = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, "rxd must be > 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txd")) { + n = atoi(optarg); + if (n > 0) + nb_txd = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, "txd must be in > 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "burst")) { + n = atoi(optarg); + if ((n >= 1) && (n <= MAX_PKT_BURST)) + nb_pkt_per_burst = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, + "burst must >= 1 and <= %d]", + MAX_PKT_BURST); + } + if (!strcmp(lgopts[opt_idx].name, "mbcache")) { + n = atoi(optarg); + if ((n >= 0) && + (n <= RTE_MEMPOOL_CACHE_MAX_SIZE)) + mb_mempool_cache = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, + "mbcache must be >= 0 and <= %d\n", + RTE_MEMPOOL_CACHE_MAX_SIZE); + } + if (!strcmp(lgopts[opt_idx].name, "txpt")) { + n = atoi(optarg); + if (n >= 0) + tx_thresh.pthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "txpt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txht")) { + n = atoi(optarg); + if (n >= 0) + tx_thresh.hthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "txht must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txwt")) { + n = atoi(optarg); + if (n >= 0) + tx_thresh.wthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "txwt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txfreet")) { + n = atoi(optarg); + if (n >= 0) + tx_free_thresh = (uint16_t)n; + else + rte_exit(EXIT_FAILURE, "txfreet must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txrst")) { + n = atoi(optarg); + if (n >= 0) + tx_rs_thresh = (uint16_t)n; + else + rte_exit(EXIT_FAILURE, "txrst must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxpt")) { + n = atoi(optarg); + if (n >= 0) + rx_thresh.pthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "rxpt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxht")) { + n = atoi(optarg); + if (n >= 0) + rx_thresh.hthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "rxht must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxwt")) { + n = atoi(optarg); + if (n >= 0) + rx_thresh.wthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "rxwt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxd")) { + n = atoi(optarg); + if (n > 0) { + if (rx_free_thresh >= n) + rte_exit(EXIT_FAILURE, + "rxd must be > " + "rx_free_thresh(%d)\n", + (int)rx_free_thresh); + else + nb_rxd = (uint16_t) n; + } else + rte_exit(EXIT_FAILURE, + "rxd(%d) invalid - must be > 0\n", + n); + } + if (!strcmp(lgopts[opt_idx].name, "txd")) { + n = atoi(optarg); + if (n > 0) + nb_txd = (uint16_t) n; + else + rte_exit(EXIT_FAILURE, "txd must be in > 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txpt")) { + n = atoi(optarg); + if (n >= 0) + tx_thresh.pthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "txpt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txht")) { + n = atoi(optarg); + if (n >= 0) + tx_thresh.hthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "txht must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "txwt")) { + n = atoi(optarg); + if (n >= 0) + tx_thresh.wthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "txwt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxpt")) { + n = atoi(optarg); + if (n >= 0) + rx_thresh.pthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "rxpt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxht")) { + n = atoi(optarg); + if (n >= 0) + rx_thresh.hthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "rxht must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxwt")) { + n = atoi(optarg); + if (n >= 0) + rx_thresh.wthresh = (uint8_t)n; + else + rte_exit(EXIT_FAILURE, "rxwt must be >= 0\n"); + } + if (!strcmp(lgopts[opt_idx].name, "rxfreet")) { + n = atoi(optarg); + if (n >= 0) + rx_free_thresh = (uint16_t)n; + else + rte_exit(EXIT_FAILURE, "rxfreet must be >= 0\n"); + } + break; + case 'h': + usage(argv[0]); + rte_exit(EXIT_SUCCESS, "Displayed help\n"); + break; + default: + usage(argv[0]); + rte_exit(EXIT_FAILURE, + "Command line is incomplete or incorrect\n"); + break; + } + } +} diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c new file mode 100644 index 0000000..d1b1289 --- /dev/null +++ b/app/test-pmd/rxonly.c @@ -0,0 +1,194 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +#define MAX_PKT_RX_FLAGS 11 +static const char *pkt_rx_flag_names[MAX_PKT_RX_FLAGS] = { + "VLAN_PKT", + "RSS_HASH", + "PKT_RX_FDIR", + "IP_CKSUM", + "IP_CKSUM_BAD", + + "IPV4_HDR", + "IPV4_HDR_EXT", + "IPV6_HDR", + "IPV6_HDR_EXT", + + "IEEE1588_PTP", + "IEEE1588_TMST", +}; + +static inline void +print_ether_addr(const char *what, struct ether_addr *eth_addr) +{ + printf("%s%02X:%02X:%02X:%02X:%02X:%02X", + what, + eth_addr->addr_bytes[0], + eth_addr->addr_bytes[1], + eth_addr->addr_bytes[2], + eth_addr->addr_bytes[3], + eth_addr->addr_bytes[4], + eth_addr->addr_bytes[5]); +} + +/* + * Received a burst of packets. + */ +static void +pkt_burst_receive(struct fwd_stream *fs) +{ + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + struct rte_mbuf *mb; + struct ether_hdr *eth_hdr; + uint16_t eth_type; + uint16_t ol_flags; + uint16_t nb_rx; + uint16_t i; +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t start_tsc; + uint64_t end_tsc; + uint64_t core_cycles; +#endif + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + start_tsc = rte_rdtsc(); +#endif + + /* + * Receive a burst of packets. + */ + nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue, pkts_burst, + nb_pkt_per_burst); + if (unlikely(nb_rx == 0)) + return; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->rx_burst_stats.pkt_burst_spread[nb_rx]++; +#endif + fs->rx_packets += nb_rx; + + /* + * Dump each received packet if verbose_level > 0. + */ + if (verbose_level > 0) + printf("port %u/queue %u: received %u packets\n", + (unsigned) fs->rx_port, + (unsigned) fs->rx_queue, + (unsigned) nb_rx); + for (i = 0; i < nb_rx; i++) { + mb = pkts_burst[i]; + if (verbose_level == 0) { + rte_pktmbuf_free(mb); + continue; + } + eth_hdr = (struct ether_hdr *) mb->pkt.data; + eth_type = RTE_BE_TO_CPU_16(eth_hdr->ether_type); + ol_flags = mb->ol_flags; + print_ether_addr(" src=", ð_hdr->s_addr); + print_ether_addr(" - dst=", ð_hdr->d_addr); + printf(" - type=0x%04x - length=%u - nb_segs=%d", + eth_type, (unsigned) mb->pkt.pkt_len, + (int)mb->pkt.nb_segs); + if (ol_flags & PKT_RX_RSS_HASH) + printf(" - RSS hash=0x%x", (unsigned) mb->pkt.hash.rss); + else if (ol_flags & PKT_RX_FDIR) + printf(" - FDIR hash=0x%x - FDIR id=0x%x ", + mb->pkt.hash.fdir.hash, mb->pkt.hash.fdir.id); + if (ol_flags & PKT_RX_VLAN_PKT) + printf(" - VLAN tci=0x%x", mb->pkt.vlan_tci); + printf("\n"); + if (ol_flags != 0) { + int rxf; + + for (rxf = 0; rxf < MAX_PKT_RX_FLAGS; rxf++) { + if (ol_flags & (1 << rxf)) + printf(" PKT_RX_%s\n", + pkt_rx_flag_names[rxf]); + } + } + rte_pktmbuf_free(mb); + } + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + end_tsc = rte_rdtsc(); + core_cycles = (end_tsc - start_tsc); + fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles); +#endif +} + +struct fwd_engine rx_only_engine = { + .fwd_mode_name = "rxonly", + .port_fwd_begin = NULL, + .port_fwd_end = NULL, + .packet_fwd = pkt_burst_receive, +}; diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c new file mode 100644 index 0000000..6813b66 --- /dev/null +++ b/app/test-pmd/testpmd.c @@ -0,0 +1,1105 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +uint16_t verbose_level = 0; /**< Silent by default. */ + +/* use master core for command line ? */ +uint8_t interactive = 0; + +/* + * NUMA support configuration. + * When set, the NUMA support attempts to dispatch the allocation of the + * RX and TX memory rings, and of the DMA memory buffers (mbufs) for the + * probed ports among the CPU sockets 0 and 1. + * Otherwise, all memory is allocated from CPU socket 0. + */ +uint8_t numa_support = 0; /**< No numa support by default */ + +/* + * Record the Ethernet address of peer target ports to which packets are + * forwarded. + * Must be instanciated with the ethernet addresses of peer traffic generator + * ports. + */ +struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS]; +portid_t nb_peer_eth_addrs = 0; + +/* + * Probed Target Environment. + */ +struct rte_port *ports; /**< For all probed ethernet ports. */ +portid_t nb_ports; /**< Number of probed ethernet ports. */ +struct fwd_lcore **fwd_lcores; /**< For all probed logical cores. */ +lcoreid_t nb_lcores; /**< Number of probed logical cores. */ + +/* + * Test Forwarding Configuration. + * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores + * nb_fwd_ports <= nb_cfg_ports <= nb_ports + */ +lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */ +lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */ +portid_t nb_cfg_ports; /**< Number of configured ports. */ +portid_t nb_fwd_ports; /**< Number of forwarding ports. */ + +unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; /**< CPU ids configuration. */ +portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; /**< Port ids configuration. */ + +struct fwd_stream **fwd_streams; /**< For each RX queue of each port. */ +streamid_t nb_fwd_streams; /**< Is equal to (nb_ports * nb_rxq). */ + +/* + * Forwarding engines. + */ +struct fwd_engine * fwd_engines[] = { + &io_fwd_engine, + &mac_fwd_engine, + &rx_only_engine, + &tx_only_engine, + &csum_fwd_engine, +#ifdef RTE_LIBRTE_IEEE1588 + &ieee1588_fwd_engine, +#endif + NULL, +}; + +struct fwd_config cur_fwd_config; +struct fwd_engine *cur_fwd_eng = &io_fwd_engine; /**< IO mode by default. */ + +uint16_t mbuf_data_size = DEFAULT_MBUF_DATA_SIZE; /**< Mbuf data space size. */ + +/* + * Configuration of packet segments used by the "txonly" processing engine. + */ +uint16_t tx_pkt_length = TXONLY_DEF_PACKET_LEN; /**< TXONLY packet length. */ +uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT] = { + TXONLY_DEF_PACKET_LEN, +}; +uint8_t tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */ + +uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */ +uint16_t mb_mempool_cache = DEF_PKT_BURST; /**< Size of mbuf mempool cache. */ + +/* + * Ethernet Ports Configuration. + */ +int promiscuous_on = 1; /**< Ports set in promiscuous mode by default. */ + +/* + * Configurable number of RX/TX queues. + */ +queueid_t nb_rxq = 1; /**< Number of RX queues per port. */ +queueid_t nb_txq = 1; /**< Number of TX queues per port. */ + +/* + * Configurable number of RX/TX ring descriptors. + */ +#define RTE_TEST_RX_DESC_DEFAULT 128 +#define RTE_TEST_TX_DESC_DEFAULT 512 +uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; /**< Number of RX descriptors. */ +uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; /**< Number of TX descriptors. */ + +/* + * Configurable values of RX and TX ring threshold registers. + */ +#define RX_PTHRESH 8 /**< Default value of RX prefetch threshold register. */ +#define RX_HTHRESH 8 /**< Default value of RX host threshold register. */ +#define RX_WTHRESH 4 /**< Default value of RX write-back threshold register. */ + +#define TX_PTHRESH 36 /**< Default value of TX prefetch threshold register. */ +#define TX_HTHRESH 0 /**< Default value of TX host threshold register. */ +#define TX_WTHRESH 0 /**< Default value of TX write-back threshold register. */ + +struct rte_eth_thresh rx_thresh = { + .pthresh = RX_PTHRESH, + .hthresh = RX_HTHRESH, + .wthresh = RX_WTHRESH, +}; + +struct rte_eth_thresh tx_thresh = { + .pthresh = TX_PTHRESH, + .hthresh = TX_HTHRESH, + .wthresh = TX_WTHRESH, +}; + +/* + * Configurable value of RX free threshold. + */ +uint16_t rx_free_thresh = 0; /* Immediately free RX descriptors by default. */ + +/* + * Configurable value of TX free threshold. + */ +uint16_t tx_free_thresh = 0; /* Use default values. */ + +/* + * Configurable value of TX RS bit threshold. + */ +uint16_t tx_rs_thresh = 0; /* Use default values. */ + +/* + * Receive Side Scaling (RSS) configuration. + */ +uint16_t rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6; /* RSS IP by default. */ + +/* + * Port topology configuration + */ +uint16_t port_topology = PORT_TOPOLOGY_PAIRED; /* Ports are paired by default */ + +/* + * Ethernet device configuration. + */ +struct rte_eth_rxmode rx_mode = { + .max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */ + .split_hdr_size = 0, + .header_split = 0, /**< Header Split disabled. */ + .hw_ip_checksum = 0, /**< IP checksum offload disabled. */ + .hw_vlan_filter = 1, /**< VLAN filtering enabled. */ + .jumbo_frame = 0, /**< Jumbo Frame Support disabled. */ + .hw_strip_crc = 0, /**< CRC stripping by hardware disabled. */ +}; + +struct rte_fdir_conf fdir_conf = { + .mode = RTE_FDIR_MODE_NONE, + .pballoc = RTE_FDIR_PBALLOC_64K, + .status = RTE_FDIR_REPORT_STATUS, + .flexbytes_offset = 0x6, + .drop_queue = 127, +}; + +static volatile int test_done = 1; /* stop packet forwarding when set to 1. */ + +/* + * Setup default configuration. + */ +static void +set_default_fwd_lcores_config(void) +{ + unsigned int i; + unsigned int nb_lc; + + nb_lc = 0; + for (i = 0; i < RTE_MAX_LCORE; i++) { + if (! rte_lcore_is_enabled(i)) + continue; + if (i == rte_get_master_lcore()) + continue; + fwd_lcores_cpuids[nb_lc++] = i; + } + nb_lcores = (lcoreid_t) nb_lc; + nb_cfg_lcores = nb_lcores; + nb_fwd_lcores = 1; +} + +static void +set_def_peer_eth_addrs(void) +{ + portid_t i; + + for (i = 0; i < RTE_MAX_ETHPORTS; i++) { + peer_eth_addrs[i].addr_bytes[0] = ETHER_LOCAL_ADMIN_ADDR; + peer_eth_addrs[i].addr_bytes[5] = i; + } +} + +static void +set_default_fwd_ports_config(void) +{ + portid_t pt_id; + + for (pt_id = 0; pt_id < nb_ports; pt_id++) + fwd_ports_ids[pt_id] = pt_id; + + nb_cfg_ports = nb_ports; + nb_fwd_ports = nb_ports; +} + +void +set_def_fwd_config(void) +{ + set_default_fwd_lcores_config(); + set_def_peer_eth_addrs(); + set_default_fwd_ports_config(); +} + +/* + * Configuration initialisation done once at init time. + */ +struct mbuf_ctor_arg { + uint16_t seg_buf_offset; /**< offset of data in data segment of mbuf. */ + uint16_t seg_buf_size; /**< size of data segment in mbuf. */ +}; + +struct mbuf_pool_ctor_arg { + uint16_t seg_buf_size; /**< size of data segment in mbuf. */ +}; + +static void +testpmd_mbuf_ctor(struct rte_mempool *mp, + void *opaque_arg, + void *raw_mbuf, + __attribute__((unused)) unsigned i) +{ + struct mbuf_ctor_arg *mb_ctor_arg; + struct rte_mbuf *mb; + + mb_ctor_arg = (struct mbuf_ctor_arg *) opaque_arg; + mb = (struct rte_mbuf *) raw_mbuf; + + mb->pool = mp; + mb->buf_addr = (void *) ((char *)mb + mb_ctor_arg->seg_buf_offset); + mb->buf_physaddr = (uint64_t) (rte_mempool_virt2phy(mp, mb) + + mb_ctor_arg->seg_buf_offset); + mb->buf_len = mb_ctor_arg->seg_buf_size; + mb->type = RTE_MBUF_PKT; + mb->ol_flags = 0; + mb->pkt.data = (char *) mb->buf_addr + RTE_PKTMBUF_HEADROOM; + mb->pkt.nb_segs = 1; + mb->pkt.l2_len = 0; + mb->pkt.l3_len = 0; + mb->pkt.vlan_tci = 0; + mb->pkt.hash.rss = 0; +} + +static void +testpmd_mbuf_pool_ctor(struct rte_mempool *mp, + void *opaque_arg) +{ + struct mbuf_pool_ctor_arg *mbp_ctor_arg; + struct rte_pktmbuf_pool_private *mbp_priv; + + if (mp->private_data_size < sizeof(struct rte_pktmbuf_pool_private)) { + printf("%s(%s) private_data_size %d < %d\n", + __func__, mp->name, (int) mp->private_data_size, + (int) sizeof(struct rte_pktmbuf_pool_private)); + return; + } + mbp_ctor_arg = (struct mbuf_pool_ctor_arg *) opaque_arg; + mbp_priv = (struct rte_pktmbuf_pool_private *) + ((char *)mp + sizeof(struct rte_mempool)); + mbp_priv->mbuf_data_room_size = mbp_ctor_arg->seg_buf_size; +} + +static void +mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf, + unsigned int socket_id) +{ + char pool_name[RTE_MEMPOOL_NAMESIZE]; + struct rte_mempool *rte_mp; + struct mbuf_pool_ctor_arg mbp_ctor_arg; + struct mbuf_ctor_arg mb_ctor_arg; + uint32_t mb_size; + + mbp_ctor_arg.seg_buf_size = (uint16_t) (RTE_PKTMBUF_HEADROOM + + mbuf_seg_size); + mb_ctor_arg.seg_buf_offset = + (uint16_t) CACHE_LINE_ROUNDUP(sizeof(struct rte_mbuf)); + mb_ctor_arg.seg_buf_size = mbp_ctor_arg.seg_buf_size; + mb_size = mb_ctor_arg.seg_buf_offset + mb_ctor_arg.seg_buf_size; + mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name)); + rte_mp = rte_mempool_create(pool_name, nb_mbuf, (unsigned) mb_size, + (unsigned) mb_mempool_cache, + sizeof(struct rte_pktmbuf_pool_private), + testpmd_mbuf_pool_ctor, &mbp_ctor_arg, + testpmd_mbuf_ctor, &mb_ctor_arg, + socket_id, 0); + if (rte_mp == NULL) { + rte_exit(EXIT_FAILURE, "Creation of mbuf pool for socket %u failed\n", + socket_id); + } +} + +static void +init_config(void) +{ + struct rte_port *port; + struct rte_mempool *mbp; + unsigned int nb_mbuf_per_pool; + streamid_t sm_id; + lcoreid_t lc_id; + portid_t pt_id; + + /* Configuration of logical cores. */ + fwd_lcores = rte_zmalloc("testpmd: fwd_lcores", + sizeof(struct fwd_lcore *) * nb_lcores, + CACHE_LINE_SIZE); + if (fwd_lcores == NULL) { + rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_lcore *)) failed\n", + nb_lcores); + } + for (lc_id = 0; lc_id < nb_lcores; lc_id++) { + fwd_lcores[lc_id] = rte_zmalloc("testpmd: struct fwd_lcore", + sizeof(struct fwd_lcore), + CACHE_LINE_SIZE); + if (fwd_lcores[lc_id] == NULL) { + rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_lcore) failed\n"); + } + fwd_lcores[lc_id]->cpuid_idx = lc_id; + } + + /* + * Create pools of mbuf. + * If NUMA support is disabled, create a single pool of mbuf in + * socket 0 memory. + * Otherwise, create a pool of mbuf in the memory of sockets 0 and 1. + */ + nb_mbuf_per_pool = nb_rxd + (nb_lcores * mb_mempool_cache) + + nb_txd + MAX_PKT_BURST; + if (numa_support) { + nb_mbuf_per_pool = nb_mbuf_per_pool * (nb_ports >> 1); + mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0); + mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 1); + } else { + nb_mbuf_per_pool = (nb_mbuf_per_pool * nb_ports); + mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0); + } + + /* + * Records which Mbuf pool to use by each logical core, if needed. + */ + for (lc_id = 0; lc_id < nb_lcores; lc_id++) { + mbp = mbuf_pool_find(rte_lcore_to_socket_id(lc_id)); + if (mbp == NULL) + mbp = mbuf_pool_find(0); + fwd_lcores[lc_id]->mbp = mbp; + } + + /* Configuration of Ethernet ports. */ + ports = rte_zmalloc("testpmd: ports", + sizeof(struct rte_port) * nb_ports, + CACHE_LINE_SIZE); + if (ports == NULL) { + rte_exit(EXIT_FAILURE, "rte_zmalloc(%d struct rte_port) failed\n", + nb_ports); + } + port = ports; + for (pt_id = 0; pt_id < nb_ports; pt_id++, port++) { + rte_eth_dev_info_get(pt_id, &port->dev_info); + if (nb_rxq > port->dev_info.max_rx_queues) { + rte_exit(EXIT_FAILURE, "Port %d: max RX queues %d < nb_rxq %d\n", + (int) pt_id, + (int) port->dev_info.max_rx_queues, + (int) nb_rxq); + } + if (nb_txq > port->dev_info.max_tx_queues) { + rte_exit(EXIT_FAILURE, "Port %d: max TX queues %d < nb_txq %d\n", + (int) pt_id, + (int) port->dev_info.max_tx_queues, + (int) nb_txq); + } + + if (numa_support) + port->socket_id = (pt_id < (nb_ports >> 1)) ? 0 : 1; + else + port->socket_id = 0; + } + + /* Configuration of packet forwarding streams. */ + nb_fwd_streams = (streamid_t) (nb_ports * nb_rxq); + fwd_streams = rte_zmalloc("testpmd: fwd_streams", + sizeof(struct fwd_stream *) * nb_fwd_streams, + CACHE_LINE_SIZE); + if (fwd_streams == NULL) { + rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_stream *)) failed\n", + nb_fwd_streams); + } + for (sm_id = 0; sm_id < nb_fwd_streams; sm_id++) { + fwd_streams[sm_id] = rte_zmalloc("testpmd: struct fwd_stream", + sizeof(struct fwd_stream), + CACHE_LINE_SIZE); + if (fwd_streams[sm_id] == NULL) { + rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_stream) failed\n"); + } + } +} + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS +static void +pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs) +{ + unsigned int total_burst; + unsigned int nb_burst; + unsigned int burst_stats[3]; + uint16_t pktnb_stats[3]; + uint16_t nb_pkt; + int burst_percent[3]; + + /* + * First compute the total number of packet bursts and the + * two highest numbers of bursts of the same number of packets. + */ + total_burst = 0; + burst_stats[0] = burst_stats[1] = burst_stats[2] = 0; + pktnb_stats[0] = pktnb_stats[1] = pktnb_stats[2] = 0; + for (nb_pkt = 0; nb_pkt < MAX_PKT_BURST; nb_pkt++) { + nb_burst = pbs->pkt_burst_spread[nb_pkt]; + if (nb_burst == 0) + continue; + total_burst += nb_burst; + if (nb_burst > burst_stats[0]) { + burst_stats[1] = burst_stats[0]; + pktnb_stats[1] = pktnb_stats[0]; + burst_stats[0] = nb_burst; + pktnb_stats[0] = nb_pkt; + } + } + if (total_burst == 0) + return; + burst_percent[0] = (burst_stats[0] * 100) / total_burst; + printf(" %s-bursts : %u [%d%% of %d pkts", rx_tx, total_burst, + burst_percent[0], (int) pktnb_stats[0]); + if (burst_stats[0] == total_burst) { + printf("]\n"); + return; + } + if (burst_stats[0] + burst_stats[1] == total_burst) { + printf(" + %d%% of %d pkts]\n", + 100 - burst_percent[0], pktnb_stats[1]); + return; + } + burst_percent[1] = (burst_stats[1] * 100) / total_burst; + burst_percent[2] = 100 - (burst_percent[0] + burst_percent[1]); + if ((burst_percent[1] == 0) || (burst_percent[2] == 0)) { + printf(" + %d%% of others]\n", 100 - burst_percent[0]); + return; + } + printf(" + %d%% of %d pkts + %d%% of others]\n", + burst_percent[1], (int) pktnb_stats[1], burst_percent[2]); +} +#endif /* RTE_TEST_PMD_RECORD_BURST_STATS */ + +static void +fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats) +{ + struct rte_port *port; + + static const char *fwd_stats_border = "----------------------"; + + port = &ports[port_id]; + printf("\n %s Forward statistics for port %-2d %s\n", + fwd_stats_border, port_id, fwd_stats_border); + printf(" RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: " + "%-"PRIu64"\n", + stats->ipackets, stats->ierrors, + (uint64_t) (stats->ipackets + stats->ierrors)); + + if (cur_fwd_eng == &csum_fwd_engine) + printf(" Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64" \n", + port->rx_bad_ip_csum, port->rx_bad_l4_csum); + + printf(" TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: " + "%-"PRIu64"\n", + stats->opackets, port->tx_dropped, + (uint64_t) (stats->opackets + port->tx_dropped)); + + if (stats->rx_nombuf > 0) + printf(" RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf); +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + if (port->rx_stream) + pkt_burst_stats_display("RX", &port->rx_stream->rx_burst_stats); + if (port->tx_stream) + pkt_burst_stats_display("TX", &port->tx_stream->tx_burst_stats); +#endif + /* stats fdir */ + if (fdir_conf.mode != RTE_FDIR_MODE_NONE) + printf(" Fdirmiss: %-14"PRIu64" Fdirmatch: %-14"PRIu64"\n", + stats->fdirmiss, + stats->fdirmatch); + + printf(" %s--------------------------------%s\n", + fwd_stats_border, fwd_stats_border); +} + +static void +fwd_stream_stats_display(streamid_t stream_id) +{ + struct fwd_stream *fs; + static const char *fwd_top_stats_border = "-------"; + + fs = fwd_streams[stream_id]; + if ((fs->rx_packets == 0) && (fs->tx_packets == 0) && + (fs->fwd_dropped == 0)) + return; + printf("\n %s Forward Stats for RX Port=%2d/Queue=%2d -> " + "TX Port=%2d/Queue=%2d %s\n", + fwd_top_stats_border, fs->rx_port, fs->rx_queue, + fs->tx_port, fs->tx_queue, fwd_top_stats_border); + printf(" RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u", + fs->rx_packets, fs->tx_packets, fs->fwd_dropped); + + /* if checksum mode */ + if (cur_fwd_eng == &csum_fwd_engine) { + printf(" RX- bad IP checksum: %-14u Rx- bad L4 checksum: %-14u\n", + fs->rx_bad_ip_csum, fs->rx_bad_l4_csum); + } + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + pkt_burst_stats_display("RX", &fs->rx_burst_stats); + pkt_burst_stats_display("TX", &fs->tx_burst_stats); +#endif +} + +static void +flush_all_rx_queues(void) +{ + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + portid_t rxp; + queueid_t rxq; + uint16_t nb_rx; + uint16_t i; + uint8_t j; + + for (j = 0; j < 2; j++) { + for (rxp = 0; rxp < nb_ports; rxp++) { + for (rxq = 0; rxq < nb_rxq; rxq++) { + do { + nb_rx = rte_eth_rx_burst(rxp, rxq, + pkts_burst, + MAX_PKT_BURST); + for (i = 0; i < nb_rx; i++) + rte_pktmbuf_free(pkts_burst[i]); + } while (nb_rx > 0); + } + } + rte_delay_ms(10); /* wait 10 milli-seconds before retrying */ + } +} + +static void +run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd) +{ + struct fwd_stream **fsm; + streamid_t nb_fs; + streamid_t sm_id; + + fsm = &fwd_streams[fc->stream_idx]; + nb_fs = fc->stream_nb; + do { + for (sm_id = 0; sm_id < nb_fs; sm_id++) + (*pkt_fwd)(fsm[sm_id]); + } while (! fc->stopped); +} + +static int +start_pkt_forward_on_core(void *fwd_arg) +{ + run_pkt_fwd_on_lcore((struct fwd_lcore *) fwd_arg, + cur_fwd_config.fwd_eng->packet_fwd); + return 0; +} + +/* + * Run the TXONLY packet forwarding engine to send a single burst of packets. + * Used to start communication flows in network loopback test configurations. + */ +static int +run_one_txonly_burst_on_core(void *fwd_arg) +{ + struct fwd_lcore *fwd_lc; + struct fwd_lcore tmp_lcore; + + fwd_lc = (struct fwd_lcore *) fwd_arg; + tmp_lcore = *fwd_lc; + tmp_lcore.stopped = 1; + run_pkt_fwd_on_lcore(&tmp_lcore, tx_only_engine.packet_fwd); + return 0; +} + +/* + * Launch packet forwarding: + * - Setup per-port forwarding context. + * - launch logical cores with their forwarding configuration. + */ +static void +launch_packet_forwarding(lcore_function_t *pkt_fwd_on_lcore) +{ + port_fwd_begin_t port_fwd_begin; + unsigned int i; + unsigned int lc_id; + int diag; + + port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin; + if (port_fwd_begin != NULL) { + for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) + (*port_fwd_begin)(fwd_ports_ids[i]); + } + for (i = 0; i < cur_fwd_config.nb_fwd_lcores; i++) { + lc_id = fwd_lcores_cpuids[i]; + if ((interactive == 0) || (lc_id != rte_lcore_id())) { + fwd_lcores[i]->stopped = 0; + diag = rte_eal_remote_launch(pkt_fwd_on_lcore, + fwd_lcores[i], lc_id); + if (diag != 0) + printf("launch lcore %u failed - diag=%d\n", + lc_id, diag); + } + } +} + +/* + * Launch packet forwarding configuration. + */ +void +start_packet_forwarding(int with_tx_first) +{ + port_fwd_begin_t port_fwd_begin; + port_fwd_end_t port_fwd_end; + struct rte_port *port; + unsigned int i; + portid_t pt_id; + streamid_t sm_id; + + if (test_done == 0) { + printf("Packet forwarding already started\n"); + return; + } + test_done = 0; + flush_all_rx_queues(); + fwd_config_setup(); + rxtx_config_display(); + + for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) { + pt_id = fwd_ports_ids[i]; + port = &ports[pt_id]; + rte_eth_stats_get(pt_id, &port->stats); + port->tx_dropped = 0; + } + for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) { + fwd_streams[sm_id]->rx_packets = 0; + fwd_streams[sm_id]->tx_packets = 0; + fwd_streams[sm_id]->fwd_dropped = 0; + fwd_streams[sm_id]->rx_bad_ip_csum = 0; + fwd_streams[sm_id]->rx_bad_l4_csum = 0; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + memset(&fwd_streams[sm_id]->rx_burst_stats, 0, + sizeof(fwd_streams[sm_id]->rx_burst_stats)); + memset(&fwd_streams[sm_id]->tx_burst_stats, 0, + sizeof(fwd_streams[sm_id]->tx_burst_stats)); +#endif +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + fwd_streams[sm_id]->core_cycles = 0; +#endif + } + if (with_tx_first) { + port_fwd_begin = tx_only_engine.port_fwd_begin; + if (port_fwd_begin != NULL) { + for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) + (*port_fwd_begin)(fwd_ports_ids[i]); + } + launch_packet_forwarding(run_one_txonly_burst_on_core); + rte_eal_mp_wait_lcore(); + port_fwd_end = tx_only_engine.port_fwd_end; + if (port_fwd_end != NULL) { + for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) + (*port_fwd_end)(fwd_ports_ids[i]); + } + } + launch_packet_forwarding(start_pkt_forward_on_core); +} + +void +stop_packet_forwarding(void) +{ + struct rte_eth_stats stats; + struct rte_port *port; + port_fwd_end_t port_fwd_end; + int i; + portid_t pt_id; + streamid_t sm_id; + lcoreid_t lc_id; + uint64_t total_recv; + uint64_t total_xmit; + uint64_t total_rx_dropped; + uint64_t total_tx_dropped; + uint64_t total_rx_nombuf; + uint64_t tx_dropped; + uint64_t rx_bad_ip_csum; + uint64_t rx_bad_l4_csum; +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t fwd_cycles; +#endif + static const char *acc_stats_border = "+++++++++++++++"; + + if (test_done) { + printf("Packet forwarding not started\n"); + return; + } + printf("Telling cores to stop..."); + for (lc_id = 0; lc_id < cur_fwd_config.nb_fwd_lcores; lc_id++) + fwd_lcores[lc_id]->stopped = 1; + printf("\nWaiting for lcores to finish...\n"); + rte_eal_mp_wait_lcore(); + port_fwd_end = cur_fwd_config.fwd_eng->port_fwd_end; + if (port_fwd_end != NULL) { + for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) { + pt_id = fwd_ports_ids[i]; + (*port_fwd_end)(pt_id); + } + } +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + fwd_cycles = 0; +#endif + for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) { + if (cur_fwd_config.nb_fwd_streams > + cur_fwd_config.nb_fwd_ports) { + fwd_stream_stats_display(sm_id); + ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL; + ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL; + } else { + ports[fwd_streams[sm_id]->tx_port].tx_stream = + fwd_streams[sm_id]; + ports[fwd_streams[sm_id]->rx_port].rx_stream = + fwd_streams[sm_id]; + } + tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped; + tx_dropped = (uint64_t) (tx_dropped + + fwd_streams[sm_id]->fwd_dropped); + ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped; + + rx_bad_ip_csum = ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum; + rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum + + fwd_streams[sm_id]->rx_bad_ip_csum); + ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum = rx_bad_ip_csum; + + rx_bad_l4_csum = ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum; + rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum + + fwd_streams[sm_id]->rx_bad_l4_csum); + ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum = rx_bad_l4_csum; + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + fwd_cycles = (uint64_t) (fwd_cycles + + fwd_streams[sm_id]->core_cycles); +#endif + } + total_recv = 0; + total_xmit = 0; + total_rx_dropped = 0; + total_tx_dropped = 0; + total_rx_nombuf = 0; + for (i = 0; i < ((cur_fwd_config.nb_fwd_ports + 1) & ~0x1); i++) { + pt_id = fwd_ports_ids[i]; + + port = &ports[pt_id]; + rte_eth_stats_get(pt_id, &stats); + stats.ipackets -= port->stats.ipackets; + port->stats.ipackets = 0; + stats.opackets -= port->stats.opackets; + port->stats.opackets = 0; + stats.ibytes -= port->stats.ibytes; + port->stats.ibytes = 0; + stats.obytes -= port->stats.obytes; + port->stats.obytes = 0; + stats.ierrors -= port->stats.ierrors; + port->stats.ierrors = 0; + stats.oerrors -= port->stats.oerrors; + port->stats.oerrors = 0; + stats.rx_nombuf -= port->stats.rx_nombuf; + port->stats.rx_nombuf = 0; + stats.fdirmatch -= port->stats.fdirmatch; + port->stats.rx_nombuf = 0; + stats.fdirmiss -= port->stats.fdirmiss; + port->stats.rx_nombuf = 0; + + total_recv += stats.ipackets; + total_xmit += stats.opackets; + total_rx_dropped += stats.ierrors; + total_tx_dropped += port->tx_dropped; + total_rx_nombuf += stats.rx_nombuf; + + fwd_port_stats_display(pt_id, &stats); + } + printf("\n %s Accumulated forward statistics for all ports" + "%s\n", + acc_stats_border, acc_stats_border); + printf(" RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: " + "%-"PRIu64"\n" + " TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: " + "%-"PRIu64"\n", + total_recv, total_rx_dropped, total_recv + total_rx_dropped, + total_xmit, total_tx_dropped, total_xmit + total_tx_dropped); + if (total_rx_nombuf > 0) + printf(" RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf); + printf(" %s++++++++++++++++++++++++++++++++++++++++++++++" + "%s\n", + acc_stats_border, acc_stats_border); +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + if (total_recv > 0) + printf("\n CPU cycles/packet=%u (total cycles=" + "%"PRIu64" / total RX packets=%"PRIu64")\n", + (unsigned int)(fwd_cycles / total_recv), + fwd_cycles, total_recv); +#endif + printf("\nDone.\n"); + test_done = 1; +} + +void +pmd_test_exit(void) +{ + portid_t pt_id; + + for (pt_id = 0; pt_id < nb_ports; pt_id++) { + printf("Stopping port %d...", pt_id); + fflush(stdout); + rte_eth_dev_close(pt_id); + printf("done\n"); + } + printf("bye...\n"); +} + +typedef void (*cmd_func_t)(void); +struct pmd_test_command { + const char *cmd_name; + cmd_func_t cmd_func; +}; + +#define PMD_TEST_CMD_NB (sizeof(pmd_test_menu) / sizeof(pmd_test_menu[0])) + +static void +fatal_init_error(const char *func_name, uint8_t port_id, int diag) +{ + rte_panic("%s(port_id=%d) failed - diag=%d\n", + func_name, port_id, diag); +} + +static void +init_ports(void) +{ + struct rte_eth_link link; + struct rte_eth_conf port_conf = { + .intr_conf = { + .lsc = 0, + }, + }; + struct rte_eth_rxconf rx_conf; + struct rte_eth_txconf tx_conf; + struct rte_port *port; + unsigned int sock_id; + portid_t pi; + queueid_t qi; + int diag; + + port_conf.rxmode = rx_mode; + port_conf.fdir_conf = fdir_conf; + + if (nb_rxq > 0) { /* configure RSS */ + port_conf.rx_adv_conf.rss_conf.rss_key = NULL; + /* use default hash key */ + port_conf.rx_adv_conf.rss_conf.rss_hf = rss_hf; + } else + port_conf.rx_adv_conf.rss_conf.rss_hf = 0; + rx_conf.rx_thresh = rx_thresh; + rx_conf.rx_free_thresh = rx_free_thresh; + tx_conf.tx_thresh = tx_thresh; + tx_conf.tx_rs_thresh = tx_rs_thresh; + tx_conf.tx_free_thresh = tx_free_thresh; + + for (pi = 0; pi < nb_ports; pi++) { + port = &ports[pi]; + memcpy(&port->dev_conf, &port_conf, sizeof(port_conf)); + sock_id = port->socket_id; + printf("Initializing port %d... ", pi); + fflush(stdout); + diag = rte_eth_dev_configure(pi, nb_rxq, nb_txq, &port_conf); + if (diag != 0) { + fatal_init_error("rte_eth_dev_configure", pi, diag); + /* NOT REACHED */ + } + rte_eth_macaddr_get(pi, &port->eth_addr); + for (qi = 0; qi < nb_txq; qi++) { + diag = rte_eth_tx_queue_setup(pi, qi, nb_txd, + sock_id, + &tx_conf); + if (diag != 0) { + fatal_init_error("rte_eth_tx_queue_setup", + pi, diag); + /* NOT REACHED */ + } + } + for (qi = 0; qi < nb_rxq; qi++) { + diag = rte_eth_rx_queue_setup(pi, qi, nb_rxd, sock_id, + &rx_conf, + mbuf_pool_find(sock_id)); + if (diag != 0) { + fatal_init_error("rte_eth_rx_queue_setup", + pi , diag); + /* NOT REACHED */ + } + } + + /* Start device */ + diag = rte_eth_dev_start(pi); + if (diag != 0) { + fatal_init_error("rte_eth_dev_start", pi, diag); + /* NOT REACHED */ + } + printf("done: "); + rte_eth_link_get(pi, &link); + if (link.link_status) { + printf(" Link Up - speed %u Mbps - %s\n", + (unsigned) link.link_speed, + (link.link_duplex == ETH_LINK_FULL_DUPLEX) ? + ("full-duplex") : ("half-duplex\n")); + } else { + printf(" Link Down\n"); + } + + /* + * If enabled, put device in promiscuous mode. + * This allows the PMD test in IO forwarding mode to forward + * packets to itself through 2 cross-connected ports of the + * target machine. + */ + if (promiscuous_on) + rte_eth_promiscuous_enable(pi); + } +} + +#ifdef RTE_EXEC_ENV_BAREMETAL +#define main _main +#endif + +int +main(int argc, char** argv) +{ + int diag; + + diag = rte_eal_init(argc, argv); + if (diag < 0) + rte_panic("Cannot init EAL\n"); + +#ifdef RTE_LIBRTE_IGB_PMD + if (rte_igb_pmd_init()) + rte_panic("Cannot init igb PMD\n"); +#endif +#ifdef RTE_LIBRTE_IXGBE_PMD + if (rte_ixgbe_pmd_init()) + rte_panic("Cannot init ixgbe PMD\n"); + + if (rte_ixgbevf_pmd_init()) + rte_panic("Cannot init ixgbevf PMD\n"); +#endif + + if (rte_eal_pci_probe()) + rte_panic("Cannot probe PCI\n"); + + nb_ports = (portid_t) rte_eth_dev_count(); + if (nb_ports == 0) + rte_exit(EXIT_FAILURE, "No probed ethernet devices - check that " + "CONFIG_RTE_LIBRTE_IGB_PMD=y and that " + "CONFIG_RTE_LIBRTE_IXGBE_PMD=y in your " + "configuration file\n"); + + set_def_fwd_config(); + if (nb_lcores == 0) + rte_panic("Empty set of forwarding logical cores - check the " + "core mask supplied in the command parameters\n"); + + argc -= diag; + argv += diag; + if (argc > 1) + launch_args_parse(argc, argv); + + if (nb_rxq > nb_txq) + printf("Warning: nb_rxq=%d enables RSS configuration, " + "but nb_txq=%d will prevent to fully test it.\n", + nb_rxq, nb_txq); + + init_config(); + + init_ports(); + + if (interactive == 1) + prompt(); + else { + char c; + int rc; + + printf("No commandline core given, start packet forwarding\n"); + start_packet_forwarding(0); + printf("Press enter to exit\n"); + rc = read(0, &c, 1); + if (rc < 0) + return 1; + } + + return 0; +} diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h new file mode 100644 index 0000000..cc4a0fd --- /dev/null +++ b/app/test-pmd/testpmd.h @@ -0,0 +1,413 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#ifndef _TESTPMD_H_ +#define _TESTPMD_H_ + +/* icc on baremetal gives us troubles with function named 'main' */ +#ifdef RTE_EXEC_ENV_BAREMETAL +#define main _main +int main(int argc, char **argv); +#endif + +/* + * Default size of the mbuf data buffer to receive standard 1518-byte + * Ethernet frames in a mono-segment memory buffer. + */ +#define DEFAULT_MBUF_DATA_SIZE 2048 /**< Default size of mbuf data buffer. */ + +/* + * The maximum number of segments per packet is used when creating + * scattered transmit packets composed of a list of mbufs. + */ +#define RTE_MAX_SEGS_PER_PKT 255 /**< pkt.nb_segs is a 8-bit unsigned char. */ + +#define MAX_PKT_BURST 512 +#define DEF_PKT_BURST 16 + +#define CACHE_LINE_SIZE_ROUNDUP(size) \ + (CACHE_LINE_SIZE * ((size + CACHE_LINE_SIZE - 1) / CACHE_LINE_SIZE)) + +typedef uint8_t lcoreid_t; +typedef uint8_t portid_t; +typedef uint16_t queueid_t; +typedef uint16_t streamid_t; + +#define MAX_QUEUE_ID ((1 << (sizeof(queueid_t) * 8)) - 1) + +enum { + PORT_TOPOLOGY_PAIRED, + PORT_TOPOLOGY_CHAINED +}; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS +/** + * The data structure associated with RX and TX packet burst statistics + * that are recorded for each forwarding stream. + */ +struct pkt_burst_stats { + unsigned int pkt_burst_spread[MAX_PKT_BURST]; +}; +#endif + +/** + * The data structure associated with a forwarding stream between a receive + * port/queue and a transmit port/queue. + */ +struct fwd_stream { + /* "read-only" data */ + portid_t rx_port; /**< port to poll for received packets */ + queueid_t rx_queue; /**< RX queue to poll on "rx_port" */ + portid_t tx_port; /**< forwarding port of received packets */ + queueid_t tx_queue; /**< TX queue to send forwarded packets */ + streamid_t peer_addr; /**< index of peer ethernet address of packets */ + + /* "read-write" results */ + unsigned int rx_packets; /**< received packets */ + unsigned int tx_packets; /**< received packets transmitted */ + unsigned int fwd_dropped; /**< received packets not forwarded */ + unsigned int rx_bad_ip_csum ; /**< received packets has bad ip checksum */ + unsigned int rx_bad_l4_csum ; /**< received packets has bad l4 checksum */ +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t core_cycles; /**< used for RX and TX processing */ +#endif +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + struct pkt_burst_stats rx_burst_stats; + struct pkt_burst_stats tx_burst_stats; +#endif +}; + +/** + * The data structure associated with each port. + * tx_ol_flags is slightly different from ol_flags of rte_mbuf. + * Bit 0: Insert IP checksum + * Bit 1: Insert UDP checksum + * Bit 2: Insert TCP checksum + * Bit 3: Insert SCTP checksum + * Bit 11: Insert VLAN Label + */ +struct rte_port { + struct rte_eth_dev_info dev_info; /**< PCI info + driver name */ + struct rte_eth_conf dev_conf; /**< Port configuration. */ + struct ether_addr eth_addr; /**< Port ethernet address */ + struct rte_eth_stats stats; /**< Last port statistics */ + uint64_t tx_dropped; /**< If no descriptor in TX ring */ + struct fwd_stream *rx_stream; /**< Port RX stream, if unique */ + struct fwd_stream *tx_stream; /**< Port TX stream, if unique */ + unsigned int socket_id; /**< For NUMA support */ + uint16_t tx_ol_flags;/**< Offload Flags of TX packets. */ + uint16_t tx_vlan_id; /**< Tag Id. in TX VLAN packets. */ + void *fwd_ctx; /**< Forwarding mode context */ + uint64_t rx_bad_ip_csum; /**< rx pkts with bad ip checksum */ + uint64_t rx_bad_l4_csum; /**< rx pkts with bad l4 checksum */ +}; + +/** + * The data structure associated with each forwarding logical core. + * The logical cores are internally numbered by a core index from 0 to + * the maximum number of logical cores - 1. + * The system CPU identifier of all logical cores are setup in a global + * CPU id. configuration table. + */ +struct fwd_lcore { + struct rte_mempool *mbp; /**< The mbuf pool to use by this core */ + streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */ + streamid_t stream_nb; /**< number of streams in "fwd_streams" */ + lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */ + queueid_t tx_queue; /**< TX queue to send forwarded packets */ + volatile char stopped; /**< stop forwarding when set */ +}; + +/* + * Forwarding mode operations: + * - IO forwarding mode (default mode) + * Forwards packets unchanged. + * + * - MAC forwarding mode + * Set the source and the destination Ethernet addresses of packets + * before forwarding them. + * + * - IEEE1588 forwarding mode + * Check that received IEEE1588 Precise Time Protocol (PTP) packets are + * filtered and timestamped by the hardware. + * Forwards packets unchanged on the same port. + * Check that sent IEEE1588 PTP packets are timestamped by the hardware. + */ +typedef void (*port_fwd_begin_t)(portid_t pi); +typedef void (*port_fwd_end_t)(portid_t pi); +typedef void (*packet_fwd_t)(struct fwd_stream *fs); + +struct fwd_engine { + const char *fwd_mode_name; /**< Forwarding mode name. */ + port_fwd_begin_t port_fwd_begin; /**< NULL if nothing special to do. */ + port_fwd_end_t port_fwd_end; /**< NULL if nothing special to do. */ + packet_fwd_t packet_fwd; /**< Mandatory. */ +}; + +extern struct fwd_engine io_fwd_engine; +extern struct fwd_engine mac_fwd_engine; +extern struct fwd_engine rx_only_engine; +extern struct fwd_engine tx_only_engine; +extern struct fwd_engine csum_fwd_engine; +#ifdef RTE_LIBRTE_IEEE1588 +extern struct fwd_engine ieee1588_fwd_engine; +#endif + +extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ + +/** + * Forwarding Configuration + * + */ +struct fwd_config { + struct fwd_engine *fwd_eng; /**< Packet forwarding mode. */ + streamid_t nb_fwd_streams; /**< Nb. of forward streams to process. */ + lcoreid_t nb_fwd_lcores; /**< Nb. of logical cores to launch. */ + portid_t nb_fwd_ports; /**< Nb. of ports involved. */ +}; + +/* globals used for configuration */ +extern uint16_t verbose_level; /**< Drives messages being displayed, if any. */ +extern uint8_t interactive; +extern uint8_t numa_support; /**< set by "--numa" parameter */ +extern uint16_t port_topology; /**< set by "--port-topology" parameter */ + +/* + * Configuration of logical cores: + * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores + */ +extern lcoreid_t nb_lcores; /**< Number of logical cores probed at init time. */ +extern lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */ +extern lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */ +extern unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; + +/* + * Configuration of Ethernet ports: + * nb_fwd_ports <= nb_cfg_ports <= nb_ports + */ +extern portid_t nb_ports; /**< Number of ethernet ports probed at init time. */ +extern portid_t nb_cfg_ports; /**< Number of configured ports. */ +extern portid_t nb_fwd_ports; /**< Number of forwarding ports. */ +extern portid_t fwd_ports_ids[RTE_MAX_ETHPORTS]; +extern struct rte_port *ports; + +extern struct rte_eth_rxmode rx_mode; +extern uint16_t rss_hf; + +extern queueid_t nb_rxq; +extern queueid_t nb_txq; + +extern uint16_t nb_rxd; +extern uint16_t nb_txd; + +extern uint16_t rx_free_thresh; +extern uint16_t tx_free_thresh; +extern uint16_t tx_rs_thresh; + +extern uint16_t mbuf_data_size; /**< Mbuf data space size. */ + +extern struct rte_fdir_conf fdir_conf; + +/* + * Configuration of packet segments used by the "txonly" processing engine. + */ +#define TXONLY_DEF_PACKET_LEN 64 +extern uint16_t tx_pkt_length; /**< Length of TXONLY packet */ +extern uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT]; /**< Seg. lengths */ +extern uint8_t tx_pkt_nb_segs; /**< Number of segments in TX packets */ + +extern uint16_t nb_pkt_per_burst; +extern uint16_t mb_mempool_cache; +extern struct rte_eth_thresh rx_thresh; +extern struct rte_eth_thresh tx_thresh; + +extern struct fwd_config cur_fwd_config; +extern struct fwd_engine *cur_fwd_eng; +extern struct fwd_lcore **fwd_lcores; +extern struct fwd_stream **fwd_streams; + +extern portid_t nb_peer_eth_addrs; /**< Number of peer ethernet addresses. */ +extern struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS]; + +static inline unsigned int +lcore_num(void) +{ + unsigned int i; + + for (i = 0; i < RTE_MAX_LCORE; ++i) + if (fwd_lcores_cpuids[i] == rte_lcore_id()) + return i; + + rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n"); +} + +static inline struct fwd_lcore * +current_fwd_lcore(void) +{ + return fwd_lcores[lcore_num()]; +} + +/* Mbuf Pools */ +static inline void +mbuf_poolname_build(unsigned int sock_id, char* mp_name, int name_size) +{ + rte_snprintf(mp_name, name_size, "mbuf_pool_socket_%u", sock_id); +} + +static inline struct rte_mempool * +mbuf_pool_find(unsigned int sock_id) +{ + char pool_name[RTE_MEMPOOL_NAMESIZE]; + + mbuf_poolname_build(sock_id, pool_name, sizeof(pool_name)); + return (rte_mempool_lookup((const char *)pool_name)); +} + +/** + * Read/Write operations on a PCI register of a port. + */ +static inline uint32_t +port_pci_reg_read(struct rte_port *port, uint32_t reg_off) +{ + void *reg_addr; + uint32_t reg_v; + + reg_addr = (void *)((char *)port->dev_info.pci_dev->mem_resource.addr + + reg_off); + reg_v = *((volatile uint32_t *)reg_addr); + return rte_le_to_cpu_32(reg_v); +} + +#define port_id_pci_reg_read(pt_id, reg_off) \ + port_pci_reg_read(&ports[(pt_id)], (reg_off)) + +static inline void +port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) +{ + void *reg_addr; + + reg_addr = (void *)((char *)port->dev_info.pci_dev->mem_resource.addr + + reg_off); + *((volatile uint32_t *)reg_addr) = rte_cpu_to_le_32(reg_v); +} + +#define port_id_pci_reg_write(pt_id, reg_off, reg_value) \ + port_pci_reg_write(&ports[(pt_id)], (reg_off), (reg_value)) + +/* Prototypes */ +void launch_args_parse(int argc, char** argv); +void prompt(void); +void nic_stats_display(portid_t port_id); +void nic_stats_clear(portid_t port_id); +void port_infos_display(portid_t port_id); +void fwd_lcores_config_display(void); +void fwd_config_display(void); +void rxtx_config_display(void); +void fwd_config_setup(void); +void set_def_fwd_config(void); + +void port_reg_bit_display(portid_t port_id, uint32_t reg_off, uint8_t bit_pos); +void port_reg_bit_set(portid_t port_id, uint32_t reg_off, uint8_t bit_pos, + uint8_t bit_v); +void port_reg_bit_field_display(portid_t port_id, uint32_t reg_off, + uint8_t bit1_pos, uint8_t bit2_pos); +void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, + uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value); +void port_reg_display(portid_t port_id, uint32_t reg_off); +void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value); + +void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id); +void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id); + +void set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc); +void set_fwd_lcores_mask(uint64_t lcoremask); +void set_fwd_lcores_number(uint16_t nb_lc); + +void set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt); +void set_fwd_ports_mask(uint64_t portmask); +void set_fwd_ports_number(uint16_t nb_pt); + +void rx_vlan_filter_set(portid_t port_id, uint16_t vlan_id, int on); +void rx_vlan_all_filter_set(portid_t port_id, int on); +void tx_vlan_set(portid_t port_id, uint16_t vlan_id); +void tx_vlan_reset(portid_t port_id); + +void tx_cksum_set(portid_t port_id, uint8_t cksum_mask); + +void set_verbose_level(uint16_t vb_level); +void set_tx_pkt_segments(unsigned *seg_lengths, unsigned nb_segs); +void set_nb_pkt_per_burst(uint16_t pkt_burst); +void set_pkt_forwarding_mode(const char *fwd_mode); +void start_packet_forwarding(int with_tx_first); +void stop_packet_forwarding(void); +void pmd_test_exit(void); + +void fdir_add_signature_filter(portid_t port_id, uint8_t queue_id, + struct rte_fdir_filter *fdir_filter); +void fdir_update_signature_filter(portid_t port_id, uint8_t queue_id, + struct rte_fdir_filter *fdir_filter); +void fdir_remove_signature_filter(portid_t port_id, + struct rte_fdir_filter *fdir_filter); +void fdir_get_infos(portid_t port_id); +void fdir_add_perfect_filter(portid_t port_id, uint16_t soft_id, + uint8_t queue_id, uint8_t drop, + struct rte_fdir_filter *fdir_filter); +void fdir_update_perfect_filter(portid_t port_id, uint16_t soft_id, + uint8_t queue_id, uint8_t drop, + struct rte_fdir_filter *fdir_filter); +void fdir_remove_perfect_filter(portid_t port_id, uint16_t soft_id, + struct rte_fdir_filter *fdir_filter); +void fdir_set_masks(portid_t port_id, struct rte_fdir_masks *fdir_masks); + +/* + * Work-around of a compilation error with ICC on invocations of the + * rte_be_to_cpu_16() function. + */ +#ifdef __GCC__ +#define RTE_BE_TO_CPU_16(be_16_v) rte_be_to_cpu_16((be_16_v)) +#define RTE_CPU_TO_BE_16(cpu_16_v) rte_cpu_to_be_16((cpu_16_v)) +#else +#ifdef __big_endian__ +#define RTE_BE_TO_CPU_16(be_16_v) (be_16_v) +#define RTE_CPU_TO_BE_16(cpu_16_v) (cpu_16_v) +#else +#define RTE_BE_TO_CPU_16(be_16_v) \ + (uint16_t) ((((be_16_v) & 0xFF) << 8) | ((be_16_v) >> 8)) +#define RTE_CPU_TO_BE_16(cpu_16_v) \ + (uint16_t) ((((cpu_16_v) & 0xFF) << 8) | ((cpu_16_v) >> 8)) +#endif +#endif /* __GCC__ */ + +#endif /* _TESTPMD_H_ */ diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c new file mode 100644 index 0000000..bf0a3e2 --- /dev/null +++ b/app/test-pmd/txonly.c @@ -0,0 +1,317 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "testpmd.h" + +#define UDP_SRC_PORT 1024 +#define UDP_DST_PORT 1024 + +#define IP_SRC_ADDR ((192 << 24) | (168 << 16) | (0 << 8) | 1) +#define IP_DST_ADDR ((192 << 24) | (168 << 16) | (0 << 8) | 2) + +#define IP_DEFTTL 64 /* from RFC 1340. */ +#define IP_VERSION 0x40 +#define IP_HDRLEN 0x05 /* default IP header length == five 32-bits words. */ +#define IP_VHL_DEF (IP_VERSION | IP_HDRLEN) + +static struct ipv4_hdr pkt_ip_hdr; /**< IP header of transmitted packets. */ +static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */ + +static inline struct rte_mbuf * +tx_mbuf_alloc(struct rte_mempool *mp) +{ + struct rte_mbuf *m; + void *mb; + + if (rte_mempool_get(mp, &mb) < 0) + return NULL; + m = (struct rte_mbuf *)mb; + __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + return m; +} + +static void +copy_buf_to_pkt_segs(void* buf, unsigned len, struct rte_mbuf *pkt, + unsigned offset) +{ + struct rte_mbuf *seg; + void *seg_buf; + unsigned copy_len; + + seg = pkt; + while (offset >= seg->pkt.data_len) { + offset -= seg->pkt.data_len; + seg = seg->pkt.next; + } + copy_len = seg->pkt.data_len - offset; + seg_buf = ((char *) seg->pkt.data + offset); + while (len > copy_len) { + rte_memcpy(seg_buf, buf, (size_t) copy_len); + len -= copy_len; + buf = ((char*) buf + copy_len); + seg = seg->pkt.next; + seg_buf = seg->pkt.data; + } + rte_memcpy(seg_buf, buf, (size_t) len); +} + +static inline void +copy_buf_to_pkt(void* buf, unsigned len, struct rte_mbuf *pkt, unsigned offset) +{ + if (offset + len <= pkt->pkt.data_len) { + rte_memcpy(((char *) pkt->pkt.data + offset), buf, (size_t) len); + return; + } + copy_buf_to_pkt_segs(buf, len, pkt, offset); +} + +static void +setup_pkt_udp_ip_headers(struct ipv4_hdr *ip_hdr, + struct udp_hdr *udp_hdr, + uint16_t pkt_data_len) +{ + uint16_t *ptr16; + uint32_t ip_cksum; + uint16_t pkt_len; + + /* + * Initialize UDP header. + */ + pkt_len = (uint16_t) (pkt_data_len + sizeof(struct udp_hdr)); + udp_hdr->src_port = rte_cpu_to_be_16(UDP_SRC_PORT); + udp_hdr->dst_port = rte_cpu_to_be_16(UDP_DST_PORT); + udp_hdr->dgram_len = RTE_CPU_TO_BE_16(pkt_len); + udp_hdr->dgram_cksum = 0; /* No UDP checksum. */ + + /* + * Initialize IP header. + */ + pkt_len = (uint16_t) (pkt_len + sizeof(struct ipv4_hdr)); + ip_hdr->version_ihl = IP_VHL_DEF; + ip_hdr->type_of_service = 0; + ip_hdr->fragment_offset = 0; + ip_hdr->time_to_live = IP_DEFTTL; + ip_hdr->next_proto_id = IPPROTO_UDP; + ip_hdr->packet_id = 0; + ip_hdr->total_length = RTE_CPU_TO_BE_16(pkt_len); + ip_hdr->src_addr = rte_cpu_to_be_32(IP_SRC_ADDR); + ip_hdr->dst_addr = rte_cpu_to_be_32(IP_DST_ADDR); + + /* + * Compute IP header checksum. + */ + ptr16 = (uint16_t*) ip_hdr; + ip_cksum = 0; + ip_cksum += ptr16[0]; ip_cksum += ptr16[1]; + ip_cksum += ptr16[2]; ip_cksum += ptr16[3]; + ip_cksum += ptr16[4]; + ip_cksum += ptr16[6]; ip_cksum += ptr16[7]; + ip_cksum += ptr16[8]; ip_cksum += ptr16[9]; + + /* + * Reduce 32 bit checksum to 16 bits and complement it. + */ + ip_cksum = ((ip_cksum & 0xFFFF0000) >> 16) + + (ip_cksum & 0x0000FFFF); + if (ip_cksum > 65535) + ip_cksum -= 65535; + ip_cksum = (~ip_cksum) & 0x0000FFFF; + if (ip_cksum == 0) + ip_cksum = 0xFFFF; + ip_hdr->hdr_checksum = (uint16_t) ip_cksum; +} + +/* + * Transmit a burst of multi-segments packets. + */ +static void +pkt_burst_transmit(struct fwd_stream *fs) +{ + struct rte_mbuf *pkts_burst[MAX_PKT_BURST]; + struct rte_mbuf *pkt; + struct rte_mbuf *pkt_seg; + struct rte_mempool *mbp; + struct ether_hdr eth_hdr; + uint16_t nb_tx; + uint16_t nb_pkt; + uint16_t vlan_tci; + uint16_t ol_flags; + uint8_t i; +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + uint64_t start_tsc; + uint64_t end_tsc; + uint64_t core_cycles; +#endif + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + start_tsc = rte_rdtsc(); +#endif + + mbp = current_fwd_lcore()->mbp; + vlan_tci = ports[fs->tx_port].tx_vlan_id; + ol_flags = ports[fs->tx_port].tx_ol_flags; + for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) { + pkt = tx_mbuf_alloc(mbp); + if (pkt == NULL) { + nomore_mbuf: + if (nb_pkt == 0) + return; + break; + } + pkt->pkt.data_len = tx_pkt_seg_lengths[0]; + pkt_seg = pkt; + for (i = 1; i < tx_pkt_nb_segs; i++) { + pkt_seg->pkt.next = tx_mbuf_alloc(mbp); + if (pkt_seg->pkt.next == NULL) { + rte_pktmbuf_free(pkt); + goto nomore_mbuf; + } + pkt_seg = pkt_seg->pkt.next; + pkt_seg->pkt.data_len = tx_pkt_seg_lengths[i]; + } + pkt_seg->pkt.next = NULL; /* Last segment of packet. */ + + /* + * Initialize Ethernet header. + */ + ether_addr_copy(&peer_eth_addrs[fs->peer_addr],ð_hdr.d_addr); + ether_addr_copy(&ports[fs->tx_port].eth_addr, ð_hdr.s_addr); + eth_hdr.ether_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4); + + /* + * Copy headers in first packet segment(s). + */ + copy_buf_to_pkt(ð_hdr, sizeof(eth_hdr), pkt, 0); + copy_buf_to_pkt(&pkt_ip_hdr, sizeof(pkt_ip_hdr), pkt, + sizeof(struct ether_hdr)); + copy_buf_to_pkt(&pkt_udp_hdr, sizeof(pkt_udp_hdr), pkt, + sizeof(struct ether_hdr) + + sizeof(struct ipv4_hdr)); + + /* + * Complete first mbuf of packet and append it to the + * burst of packets to be transmitted. + */ + pkt->pkt.nb_segs = tx_pkt_nb_segs; + pkt->pkt.pkt_len = tx_pkt_length; + pkt->ol_flags = ol_flags; + pkt->pkt.vlan_tci = vlan_tci; + pkt->pkt.l2_len = sizeof(struct ether_hdr); + pkt->pkt.l3_len = sizeof(struct ipv4_hdr); + pkts_burst[nb_pkt] = pkt; + } + nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_pkt); + fs->tx_packets += nb_tx; + +#ifdef RTE_TEST_PMD_RECORD_BURST_STATS + fs->tx_burst_stats.pkt_burst_spread[nb_tx]++; +#endif + if (unlikely(nb_tx < nb_pkt)) { + if (verbose_level > 0 && fs->fwd_dropped == 0) + printf("port %d tx_queue %d - drop " + "(nb_pkt:%u - nb_tx:%u)=%u packets\n", + fs->tx_port, fs->tx_queue, + (unsigned) nb_pkt, (unsigned) nb_tx, + (unsigned) (nb_pkt - nb_tx)); + fs->fwd_dropped += (nb_pkt - nb_tx); + do { + rte_pktmbuf_free(pkts_burst[nb_tx]); + } while (++nb_tx < nb_pkt); + } + +#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES + end_tsc = rte_rdtsc(); + core_cycles = (end_tsc - start_tsc); + fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles); +#endif +} + +static void +tx_only_begin(__attribute__((unused)) portid_t pi) +{ + uint16_t pkt_data_len; + + pkt_data_len = (uint16_t) (tx_pkt_length - (sizeof(struct ether_hdr) + + sizeof(struct ipv4_hdr) + + sizeof(struct udp_hdr))); + setup_pkt_udp_ip_headers(&pkt_ip_hdr, &pkt_udp_hdr, pkt_data_len); +} + +struct fwd_engine tx_only_engine = { + .fwd_mode_name = "txonly", + .port_fwd_begin = tx_only_begin, + .port_fwd_end = NULL, + .packet_fwd = pkt_burst_transmit, +}; diff --git a/app/test/Makefile b/app/test/Makefile new file mode 100644 index 0000000..80d210d --- /dev/null +++ b/app/test/Makefile @@ -0,0 +1,82 @@ +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +APP = test + +# +# all sources are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_APP_TEST) := commands.c +SRCS-$(CONFIG_RTE_APP_TEST) += test.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_pci.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_prefetch.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_byteorder.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_per_lcore.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_atomic.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_malloc.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_cycles.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_spinlock.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_memory.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_memzone.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_ring.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_rwlock.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_timer.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_mempool.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_mbuf.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_logs.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_memcpy.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_hash.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_lpm.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_debug.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_errno.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_tailq.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_string_fns.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_mp_secondary.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_cpuflags.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_eal_flags.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_alarm.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_interrupts.c +SRCS-$(CONFIG_RTE_APP_TEST) += test_version.c + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# this application needs libraries first +DEPDIRS-$(CONFIG_RTE_APP_TEST) += lib + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/app/test/autotest.py b/app/test/autotest.py new file mode 100755 index 0000000..2609142 --- /dev/null +++ b/app/test/autotest.py @@ -0,0 +1,664 @@ +#!/usr/bin/python + +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +# Script that uses qemu controlled by python-pexpect to check that +# all autotests are working in the baremetal environment. + +import sys, pexpect, time, os, re + +directory = sys.argv[2] +target = sys.argv[3] +log_file = "%s.txt"%(target) + +if "baremetal" in target: + cmdline = "qemu-system-x86_64 -cdrom %s.iso -boot d "%(sys.argv[1]) + cmdline += "-m 2000 -smp 4 -nographic -net nic,model=e1000" + platform = "QEMU x86_64" +else: + cmdline = "%s -c f -n 4"%(sys.argv[1]) + try: + platform = open("/root/rte_platform_model.txt").read() + except: + platform = "unknown" + +print cmdline + +report_hdr=""".. + +""" + +test_whitelist=None +test_blacklist=None + +class SubTest: + "Defines a subtest" + def __init__(self, title, function, command=None, timeout=10, genreport=None): + self.title = title + self.function = function + self.command = command + self.timeout = timeout + self.genreport = genreport + +class AutoTest: + """This class contains all methods needed to launch several + automatic tests, archive test results, log, and generate a nice + test report in restructured text""" + + title = "new" + mainlog = None + logbuf = None + literal = 0 + test_list = [] + report_list = [] + child = None + + def __init__(self, pexpectchild, filename, mode): + "Init the Autotest class" + self.mainlog = file(filename, mode) + self.child = pexpectchild + pexpectchild.logfile = self + def register(self, filename, title, subtest_list): + "Register a test with a list of subtests" + test = {} + test["filename"] = filename + test["title"] = title + test["subtest_list"] = subtest_list + self.test_list.append(test) + + def start(self): + "start the tests, and fill the internal report_list field" + for t in self.test_list: + report = {} + report["date"] = time.asctime() + report["title"] = t["title"] + report["filename"] = t["filename"] + report["subreport_list"] = [] + report["fails"] = 0 + report["success"] = 0 + report["subreport_list"] = [] + for st in t["subtest_list"]: + if test_whitelist is not None and st.title not in test_whitelist: + continue + if test_blacklist is not None and st.title in test_blacklist: + continue + subreport = {} + self.reportbuf = "" + subreport["title"] = st.title + subreport["func"] = st.function + subreport["command"] = st.command + subreport["timeout"] = st.timeout + subreport["genreport"] = st.genreport + + # launch subtest + print "%s (%s): "%(subreport["title"], subreport["command"]), + sys.stdout.flush() + start = time.time() + res = subreport["func"](self.child, + command = subreport["command"], + timeout = subreport["timeout"]) + t = int(time.time() - start) + + subreport["time"] = "%dmn%d"%(t/60, t%60) + subreport["result"] = res[0] # 0 or -1 + subreport["result_str"] = res[1] # cause of fail + subreport["logs"] = self.reportbuf + print "%s [%s]"%(subreport["result_str"], subreport["time"]) + if subreport["result"] == 0: + report["success"] += 1 + else: + report["fails"] += 1 + report["subreport_list"].append(subreport) + self.report_list.append(report) + + def gen_report(self): + for report in self.report_list: + # main report header and stats + self.literal = 0 + reportlog = file(report["filename"], "w") + reportlog.write(report_hdr) + reportlog.write(report["title"] + "\n") + reportlog.write(re.sub(".", "=", report["title"]) + "\n\n") + reportlog.write("Autogenerated test report:\n\n" ) + reportlog.write("- date: **%s**\n"%(report["date"])) + reportlog.write("- target: **%s**\n"%(target)) + reportlog.write("- success: **%d**\n"%(report["success"])) + reportlog.write("- fails: **%d**\n"%(report["fails"])) + reportlog.write("- platform: **%s**\n\n"%(platform)) + + # summary + reportlog.write(".. csv-table:: Test results summary\n") + reportlog.write(' :header: "Name", "Result"\n\n') + for subreport in report["subreport_list"]: + if subreport["result"] == 0: + res_str = "Success" + else: + res_str = "Failure" + reportlog.write(' "%s", "%s"\n'%(subreport["title"], res_str)) + reportlog.write('\n') + + # subreports + for subreport in report["subreport_list"]: + # print subtitle + reportlog.write(subreport["title"] + "\n") + reportlog.write(re.sub(".", "-", subreport["title"]) + "\n\n") + # print logs + reportlog.write("::\n \n ") + s = subreport["logs"].replace("\n", "\n ") + reportlog.write(s) + # print result + reportlog.write("\n\n") + reportlog.write("**" + subreport["result_str"] + "**\n\n") + # custom genreport + if subreport["genreport"] != None: + s = subreport["genreport"]() + reportlog.write(s) + + reportlog.close() + + # displayed on console + print + print "-------------------------" + print + if report["fails"] == 0: + print "All test OK" + else: + print "%s test(s) failed"%(report["fails"]) + + # file API, to store logs from pexpect + def write(self, buf): + s = buf[:] + s = s.replace("\r", "") + self.mainlog.write(s) + self.reportbuf += s + def flush(self): + self.mainlog.flush() + def close(self): + self.mainlog.close() + + +# Try to match prompt: return 0 on success, else return -1 +def wait_prompt(child): + for i in range(3): + index = child.expect(["RTE>>", pexpect.TIMEOUT], timeout = 1) + child.sendline("") + if index == 0: + return 0 + print "Cannot find prompt" + return -1 + +# Try to match prompt after boot: return 0 on success, else return -1 +def wait_boot(child): + index = child.expect(["RTE>>", pexpect.TIMEOUT], + timeout = 120) + if index == 0: + return 0 + if (wait_prompt(child) == -1): + print "Target did not boot, failed" + return -1 + return 0 + +# quit RTE +def quit(child): + if wait_boot(child) != 0: + return -1, "Cannot find prompt" + child.sendline("quit") + return 0, "Success" + +# Default function to launch an autotest that does not need to +# interact with the user. Basically, this function calls the autotest +# function through command line interface, then check that it displays +# "Test OK" or "Test Failed". +def default_autotest(child, command, timeout=10): + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + index = child.expect(["Test OK", "Test Failed", + pexpect.TIMEOUT], timeout = timeout) + if index == 1: + return -1, "Failed" + elif index == 2: + return -1, "Failed [Timeout]" + return 0, "Success" + +# wait boot +def boot_autotest(child, **kargs): + if wait_boot(child) != 0: + return -1, "Cannot find prompt" + return 0, "Success" + +# Test memory dump. We need to check that at least one memory zone is +# displayed. +def memory_autotest(child, command, **kargs): + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + regexp = "phys:0x[0-9a-f]*, len:0x([0-9a-f]*), virt:0x[0-9a-f]*, socket_id:[0-9]*" + index = child.expect([regexp, pexpect.TIMEOUT], timeout = 180) + if index != 0: + return -1, "Failed: timeout" + size = int(child.match.groups()[0], 16) + if size <= 0: + return -1, "Failed: bad size" + index = child.expect(["Test OK", "Test Failed", + pexpect.TIMEOUT], timeout = 10) + if index == 1: + return -1, "Failed: C code returned an error" + elif index == 2: + return -1, "Failed: timeout" + return 0, "Success" + +# Test some libc functions including scanf. This requires a +# interaction with the user (simulated in expect), so we cannot use +# default_autotest() here. +def string_autotest(child, command, **kargs): + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + index = child.expect(["Now, test scanf, enter this number", + pexpect.TIMEOUT], timeout = 10) + if index != 0: + return -1, "Failed: timeout" + child.sendline("123456") + index = child.expect(["number=123456", pexpect.TIMEOUT], timeout = 10) + if index != 0: + return -1, "Failed: timeout (2)" + index = child.expect(["Test OK", "Test Failed", + pexpect.TIMEOUT], timeout = 10) + if index != 0: + return -1, "Failed: C code returned an error" + return 0, "Success" + +# Test spinlock. This requires to check the order of displayed lines: +# we cannot use default_autotest() here. +def spinlock_autotest(child, command, **kargs): + i = 0 + ir = 0 + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + while True: + index = child.expect(["Test OK", + "Test Failed", + "Hello from core ([0-9]*) !", + "Hello from within recursive locks from ([0-9]*) !", + pexpect.TIMEOUT], timeout = 20) + # ok + if index == 0: + break + + # message, check ordering + elif index == 2: + if int(child.match.groups()[0]) < i: + return -1, "Failed: bad order" + i = int(child.match.groups()[0]) + elif index == 3: + if int(child.match.groups()[0]) < ir: + return -1, "Failed: bad order" + ir = int(child.match.groups()[0]) + + # fail + else: + return -1, "Failed: timeout or error" + + return 0, "Success" + + +# Test rwlock. This requires to check the order of displayed lines: +# we cannot use default_autotest() here. +def rwlock_autotest(child, command, **kargs): + i = 0 + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + while True: + index = child.expect(["Test OK", + "Test Failed", + "Hello from core ([0-9]*) !", + "Global write lock taken on master core ([0-9]*)", + pexpect.TIMEOUT], timeout = 10) + # ok + if index == 0: + if i != 0xffff: + return -1, "Failed: a message is missing" + break + + # message, check ordering + elif index == 2: + if int(child.match.groups()[0]) < i: + return -1, "Failed: bad order" + i = int(child.match.groups()[0]) + + # must be the last message, check ordering + elif index == 3: + i = 0xffff + + # fail + else: + return -1, "Failed: timeout or error" + + return 0, "Success" + +# Test logs. This requires to check the order of displayed lines: +# we cannot use default_autotest() here. +def logs_autotest(child, command, **kargs): + i = 0 + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + + log_list = [ + "TESTAPP1: this is a debug level message", + "TESTAPP1: this is a info level message", + "TESTAPP1: this is a warning level message", + "TESTAPP2: this is a info level message", + "TESTAPP2: this is a warning level message", + "TESTAPP1: this is a debug level message", + "TESTAPP1: this is a debug level message", + "TESTAPP1: this is a info level message", + "TESTAPP1: this is a warning level message", + "TESTAPP2: this is a info level message", + "TESTAPP2: this is a warning level message", + "TESTAPP1: this is a debug level message", + ] + + for log_msg in log_list: + index = child.expect([log_msg, + "Test OK", + "Test Failed", + pexpect.TIMEOUT], timeout = 10) + + # not ok + if index != 0: + return -1, "Failed: timeout or error" + + index = child.expect(["Test OK", + "Test Failed", + pexpect.TIMEOUT], timeout = 10) + + return 0, "Success" + +# Test timers. This requires to check the order of displayed lines: +# we cannot use default_autotest() here. +def timer_autotest(child, command, **kargs): + i = 0 + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + + index = child.expect(["Start timer stress tests \(30 seconds\)", + "Test Failed", + pexpect.TIMEOUT], timeout = 10) + + # not ok + if index != 0: + return -1, "Failed: timeout or error" + + index = child.expect(["Start timer basic tests \(30 seconds\)", + "Test Failed", + pexpect.TIMEOUT], timeout = 40) + + # not ok + if index != 0: + return -1, "Failed: timeout or error (2)" + + prev_lcore_timer1 = -1 + + lcore_tim0 = -1 + lcore_tim1 = -1 + lcore_tim2 = -1 + lcore_tim3 = -1 + + while True: + index = child.expect(["TESTTIMER: ([0-9]*): callback id=([0-9]*) count=([0-9]*) on core ([0-9]*)", + "Test OK", + "Test Failed", + pexpect.TIMEOUT], timeout = 10) + + if index == 1: + break + + if index != 0: + return -1, "Failed: timeout or error (3)" + + try: + t = int(child.match.groups()[0]) + id = int(child.match.groups()[1]) + cnt = int(child.match.groups()[2]) + lcore = int(child.match.groups()[3]) + except: + return -1, "Failed: cannot parse output" + + # timer0 always expires on the same core when cnt < 20 + if id == 0: + if lcore_tim0 == -1: + lcore_tim0 = lcore + elif lcore != lcore_tim0 and cnt < 20: + return -1, "Failed: lcore != lcore_tim0 (%d, %d)"%(lcore, lcore_tim0) + if cnt > 21: + return -1, "Failed: tim0 cnt > 21" + + # timer1 each time expires on a different core + if id == 1: + if lcore == lcore_tim1: + return -1, "Failed: lcore == lcore_tim1 (%d, %d)"%(lcore, lcore_tim1) + lcore_tim1 = lcore + if cnt > 10: + return -1, "Failed: tim1 cnt > 30" + + # timer0 always expires on the same core + if id == 2: + if lcore_tim2 == -1: + lcore_tim2 = lcore + elif lcore != lcore_tim2: + return -1, "Failed: lcore != lcore_tim2 (%d, %d)"%(lcore, lcore_tim2) + if cnt > 30: + return -1, "Failed: tim2 cnt > 30" + + # timer0 always expires on the same core + if id == 3: + if lcore_tim3 == -1: + lcore_tim3 = lcore + elif lcore != lcore_tim3: + return -1, "Failed: lcore_tim3 changed (%d -> %d)"%(lcore, lcore_tim3) + if cnt > 30: + return -1, "Failed: tim3 cnt > 30" + + # must be 2 different cores + if lcore_tim0 == lcore_tim3: + return -1, "Failed: lcore_tim0 (%d) == lcore_tim3 (%d)"%(lcore_tim0, lcore_tim3) + + return 0, "Success" + +# Ring autotest +def ring_autotest(child, command, timeout=10): + if wait_prompt(child) != 0: + return -1, "Failed: cannot find prompt" + child.sendline(command) + index = child.expect(["Test OK", "Test Failed", + pexpect.TIMEOUT], timeout = timeout) + if index != 0: + return -1, "Failed" + + child.sendline("set_watermark test 100") + child.sendline("set_quota test 16") + child.sendline("dump_ring test") + index = child.expect([" watermark=100", + pexpect.TIMEOUT], timeout = 1) + if index != 0: + return -1, "Failed: bad watermark" + + index = child.expect([" bulk_default=16", + pexpect.TIMEOUT], timeout = 1) + if index != 0: + return -1, "Failed: bad quota" + + return 0, "Success" + +def ring_genreport(): + s = "Performance curves\n" + s += "------------------\n\n" + sdk = os.getenv("RTE_SDK") + script = os.path.join(sdk, "app/test/graph_ring.py") + title ='"Autotest %s %s"'%(target, time.asctime()) + filename = target + ".txt" + os.system("/usr/bin/python %s %s %s"%(script, filename, title)) + for f in os.listdir("."): + if not f.startswith("ring"): + continue + if not f.endswith(".svg"): + continue + # skip single producer/consumer + if "_sc" in f: + continue + if "_sp" in f: + continue + f = f[:-4] + ".png" + s += ".. figure:: ../../images/autotests/%s/%s\n"%(target, f) + s += " :width: 50%\n\n" + s += " %s\n\n"%(f) + return s + +def mempool_genreport(): + s = "Performance curves\n" + s += "------------------\n\n" + sdk = os.getenv("RTE_SDK") + script = os.path.join(sdk, "app/test/graph_mempool.py") + title ='"Autotest %s %s"'%(target, time.asctime()) + filename = target + ".txt" + os.system("/usr/bin/python %s %s %s"%(script, filename, title)) + for f in os.listdir("."): + if not f.startswith("mempool"): + continue + if not f.endswith(".svg"): + continue + # skip when n_keep = 128 + if "_128." in f: + continue + f = f[:-4] + ".png" + s += ".. figure:: ../../images/autotests/%s/%s\n"%(target, f) + s += " :width: 50%\n\n" + s += " %s\n\n"%(f) + return s + +# +# main +# + +if len(sys.argv) > 4: + testlist=sys.argv[4].split(',') + if testlist[0].startswith('-'): + testlist[0]=testlist[0].lstrip('-') + test_blacklist=testlist + else: + test_whitelist=testlist + +child = pexpect.spawn(cmdline) +autotest = AutoTest(child, log_file,'w') + +# timeout for memcpy and hash test +if "baremetal" in target: + timeout = 60*180 +else: + timeout = 180 + +autotest.register("eal_report.rst", "EAL-%s"%(target), + [ SubTest("Boot", boot_autotest, "boot_autotest"), + SubTest("EAL Flags", default_autotest, "eal_flags_autotest"), + SubTest("Version", default_autotest, "version_autotest"), + SubTest("PCI", default_autotest, "pci_autotest"), + SubTest("Memory", memory_autotest, "memory_autotest"), + SubTest("Lcore launch", default_autotest, "per_lcore_autotest"), + SubTest("Spinlock", spinlock_autotest, "spinlock_autotest"), + SubTest("Rwlock", rwlock_autotest, "rwlock_autotest"), + SubTest("Atomic", default_autotest, "atomic_autotest"), + SubTest("Byte order", default_autotest, "byteorder_autotest"), + SubTest("Prefetch", default_autotest, "prefetch_autotest"), + SubTest("Debug", default_autotest, "debug_autotest"), + SubTest("Cycles", default_autotest, "cycles_autotest"), + SubTest("Logs", logs_autotest, "logs_autotest"), + SubTest("Memzone", default_autotest, "memzone_autotest"), + SubTest("Cpu flags", default_autotest, "cpuflags_autotest"), + SubTest("Memcpy", default_autotest, "memcpy_autotest", timeout), + SubTest("String Functions", default_autotest, "string_autotest"), + SubTest("Alarm", default_autotest, "alarm_autotest", 30), + SubTest("Interrupt", default_autotest, "interrupt_autotest"), + ]) + +autotest.register("ring_report.rst", "Ring-%s"%(target), + [ SubTest("Ring", ring_autotest, "ring_autotest", 30*60, + ring_genreport) + ]) + +if "baremetal" in target: + timeout = 60*60*3 +else: + timeout = 60*30 + +autotest.register("mempool_report.rst", "Mempool-%s"%(target), + [ SubTest("Mempool", default_autotest, "mempool_autotest", + timeout, mempool_genreport) + ]) +autotest.register("mbuf_report.rst", "Mbuf-%s"%(target), + [ SubTest("Mbuf", default_autotest, "mbuf_autotest", timeout=120) + ]) +autotest.register("timer_report.rst", "Timer-%s"%(target), + [ SubTest("Timer", timer_autotest, "timer_autotest") + ]) +autotest.register("malloc_report.rst", "Malloc-%s"%(target), + [ SubTest("Malloc", default_autotest, "malloc_autotest") + ]) + +# only do the hash autotest if supported by the platform +if not (platform.startswith("Intel(R) Core(TM)2 Quad CPU") or + platform.startswith("QEMU")): + autotest.register("hash_report.rst", "Hash-%s"%(target), + [ SubTest("Hash", default_autotest, "hash_autotest", timeout) + ]) + +autotest.register("lpm_report.rst", "LPM-%s"%(target), + [ SubTest("Lpm", default_autotest, "lpm_autotest", timeout) + ]) +autotest.register("eal2_report.rst", "EAL2-%s"%(target), + [ SubTest("TailQ", default_autotest, "tailq_autotest"), + SubTest("Errno", default_autotest, "errno_autotest"), + SubTest("Multiprocess", default_autotest, "multiprocess_autotest") + ]) + +autotest.start() +autotest.gen_report() + +quit(child) +child.terminate() +sys.exit(0) diff --git a/app/test/commands.c b/app/test/commands.c new file mode 100644 index 0000000..a1d23d8 --- /dev/null +++ b/app/test/commands.c @@ -0,0 +1,391 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include +#ifndef __linux__ +#include +#endif +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "test.h" + +/****************/ + +struct cmd_autotest_result { + cmdline_fixed_string_t autotest; +}; + +static void cmd_autotest_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_autotest_result *res = parsed_result; + int ret = 0; + int all = 0; + + if (!strcmp(res->autotest, "all_autotests")) + all = 1; + + if (all || !strcmp(res->autotest, "version_autotest")) + ret |= test_version(); + if (all || !strcmp(res->autotest, "debug_autotest")) + ret |= test_debug(); + if (all || !strcmp(res->autotest, "pci_autotest")) + ret |= test_pci(); + if (all || !strcmp(res->autotest, "prefetch_autotest")) + ret |= test_prefetch(); + if (all || !strcmp(res->autotest, "byteorder_autotest")) + ret |= test_byteorder(); + if (all || !strcmp(res->autotest, "per_lcore_autotest")) + ret |= test_per_lcore(); + if (all || !strcmp(res->autotest, "atomic_autotest")) + ret |= test_atomic(); + if (all || !strcmp(res->autotest, "malloc_autotest")) + ret |= test_malloc(); + if (all || !strcmp(res->autotest, "spinlock_autotest")) + ret |= test_spinlock(); + if (all || !strcmp(res->autotest, "memory_autotest")) + ret |= test_memory(); + if (all || !strcmp(res->autotest, "memzone_autotest")) + ret |= test_memzone(); + if (all || !strcmp(res->autotest, "rwlock_autotest")) + ret |= test_rwlock(); + if (all || !strcmp(res->autotest, "mbuf_autotest")) + ret |= test_mbuf(); + if (all || !strcmp(res->autotest, "logs_autotest")) + ret |= test_logs(); + if (all || !strcmp(res->autotest, "errno_autotest")) + ret |= test_errno(); + if (all || !strcmp(res->autotest, "hash_autotest")) + ret |= test_hash(); + if (all || !strcmp(res->autotest, "lpm_autotest")) + ret |= test_lpm(); + if (all || !strcmp(res->autotest, "cpuflags_autotest")) + ret |= test_cpuflags(); + /* tailq autotest must go after all lpm and hashs tests or any other + * tests which need to create tailq objects (ring and mempool are implicitly + * created in earlier tests so can go later) + */ + if (all || !strcmp(res->autotest, "tailq_autotest")) + ret |= test_tailq(); + if (all || !strcmp(res->autotest, "multiprocess_autotest")) + ret |= test_mp_secondary(); + if (all || !strcmp(res->autotest, "memcpy_autotest")) + ret |= test_memcpy(); + if (all || !strcmp(res->autotest, "string_autotest")) + ret |= test_string_fns(); + if (all || !strcmp(res->autotest, "eal_flags_autotest")) + ret |= test_eal_flags(); + if (all || !strcmp(res->autotest, "alarm_autotest")) + ret |= test_alarm(); + if (all || !strcmp(res->autotest, "interrupt_autotest")) + ret |= test_interrupt(); + if (all || !strcmp(res->autotest, "cycles_autotest")) + ret |= test_cycles(); + if (all || !strcmp(res->autotest, "ring_autotest")) + ret |= test_ring(); + if (all || !strcmp(res->autotest, "timer_autotest")) + ret |= test_timer(); + if (all || !strcmp(res->autotest, "mempool_autotest")) + ret |= test_mempool(); + + if (ret == 0) + printf("Test OK\n"); + else + printf("Test Failed\n"); + fflush(stdout); +} + +cmdline_parse_token_string_t cmd_autotest_autotest = + TOKEN_STRING_INITIALIZER(struct cmd_autotest_result, autotest, + "pci_autotest#memory_autotest#" + "per_lcore_autotest#spinlock_autotest#" + "rwlock_autotest#atomic_autotest#" + "byteorder_autotest#prefetch_autotest#" + "cycles_autotest#logs_autotest#" + "memzone_autotest#ring_autotest#" + "mempool_autotest#mbuf_autotest#" + "timer_autotest#malloc_autotest#" + "memcpy_autotest#hash_autotest#" + "lpm_autotest#debug_autotest#" + "errno_autotest#tailq_autotest#" + "string_autotest#multiprocess_autotest#" + "cpuflags_autotest#eal_flags_autotest#" + "alarm_autotest#interrupt_autotest#" + "version_autotest#" + "all_autotests"); + +cmdline_parse_inst_t cmd_autotest = { + .f = cmd_autotest_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "launch autotest", + .tokens = { /* token list, NULL terminated */ + (void *)&cmd_autotest_autotest, + NULL, + }, +}; + +/****************/ + +struct cmd_dump_result { + cmdline_fixed_string_t dump; +}; + +static void +dump_struct_sizes(void) +{ +#define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t)); + DUMP_SIZE(struct rte_mbuf); + DUMP_SIZE(struct rte_pktmbuf); + DUMP_SIZE(struct rte_ctrlmbuf); + DUMP_SIZE(struct rte_mempool); + DUMP_SIZE(struct rte_ring); +#undef DUMP_SIZE +} + +static void cmd_dump_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_dump_result *res = parsed_result; + + if (!strcmp(res->dump, "dump_physmem")) + rte_dump_physmem_layout(); + else if (!strcmp(res->dump, "dump_memzone")) + rte_memzone_dump(); + else if (!strcmp(res->dump, "dump_log_history")) + rte_log_dump_history(); + else if (!strcmp(res->dump, "dump_struct_sizes")) + dump_struct_sizes(); + else if (!strcmp(res->dump, "dump_ring")) + rte_ring_list_dump(); + else if (!strcmp(res->dump, "dump_mempool")) + rte_mempool_list_dump(); +} + +cmdline_parse_token_string_t cmd_dump_dump = + TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump, + "dump_physmem#dump_memzone#dump_log_history#" + "dump_struct_sizes#dump_ring#dump_mempool"); + +cmdline_parse_inst_t cmd_dump = { + .f = cmd_dump_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "dump status", + .tokens = { /* token list, NULL terminated */ + (void *)&cmd_dump_dump, + NULL, + }, +}; + +/****************/ + +struct cmd_dump_one_result { + cmdline_fixed_string_t dump; + cmdline_fixed_string_t name; +}; + +static void cmd_dump_one_parsed(void *parsed_result, struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_dump_one_result *res = parsed_result; + + if (!strcmp(res->dump, "dump_ring")) { + struct rte_ring *r; + r = rte_ring_lookup(res->name); + if (r == NULL) { + cmdline_printf(cl, "Cannot find ring\n"); + return; + } + rte_ring_dump(r); + } + else if (!strcmp(res->dump, "dump_mempool")) { + struct rte_mempool *mp; + mp = rte_mempool_lookup(res->name); + if (mp == NULL) { + cmdline_printf(cl, "Cannot find mempool\n"); + return; + } + rte_mempool_dump(mp); + } +} + +cmdline_parse_token_string_t cmd_dump_one_dump = + TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, dump, + "dump_ring#dump_mempool"); + +cmdline_parse_token_string_t cmd_dump_one_name = + TOKEN_STRING_INITIALIZER(struct cmd_dump_one_result, name, NULL); + +cmdline_parse_inst_t cmd_dump_one = { + .f = cmd_dump_one_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "dump one ring/mempool: dump_ring|dump_mempool ", + .tokens = { /* token list, NULL terminated */ + (void *)&cmd_dump_one_dump, + (void *)&cmd_dump_one_name, + NULL, + }, +}; + +/****************/ + +struct cmd_set_ring_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t name; + uint32_t value; +}; + +static void cmd_set_ring_parsed(void *parsed_result, struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_ring_result *res = parsed_result; + struct rte_ring *r; + int ret; + + r = rte_ring_lookup(res->name); + if (r == NULL) { + cmdline_printf(cl, "Cannot find ring\n"); + return; + } + + if (!strcmp(res->set, "set_quota")) { + ret = rte_ring_set_bulk_count(r, res->value); + if (ret != 0) + cmdline_printf(cl, "Cannot set quota\n"); + } + else if (!strcmp(res->set, "set_watermark")) { + ret = rte_ring_set_water_mark(r, res->value); + if (ret != 0) + cmdline_printf(cl, "Cannot set water mark\n"); + } +} + +cmdline_parse_token_string_t cmd_set_ring_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_ring_result, set, + "set_quota#set_watermark"); + +cmdline_parse_token_string_t cmd_set_ring_name = + TOKEN_STRING_INITIALIZER(struct cmd_set_ring_result, name, NULL); + +cmdline_parse_token_num_t cmd_set_ring_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_ring_result, value, UINT32); + +cmdline_parse_inst_t cmd_set_ring = { + .f = cmd_set_ring_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "set quota/watermark: " + "set_quota|set_watermark ", + .tokens = { /* token list, NULL terminated */ + (void *)&cmd_set_ring_set, + (void *)&cmd_set_ring_name, + (void *)&cmd_set_ring_value, + NULL, + }, +}; + +/****************/ + +struct cmd_quit_result { + cmdline_fixed_string_t quit; +}; + +static void +cmd_quit_parsed(__attribute__((unused)) void *parsed_result, + struct cmdline *cl, + __attribute__((unused)) void *data) +{ + cmdline_quit(cl); +} + +cmdline_parse_token_string_t cmd_quit_quit = + TOKEN_STRING_INITIALIZER(struct cmd_quit_result, quit, + "quit"); + +cmdline_parse_inst_t cmd_quit = { + .f = cmd_quit_parsed, /* function to call */ + .data = NULL, /* 2nd arg of func */ + .help_str = "exit application", + .tokens = { /* token list, NULL terminated */ + (void *)&cmd_quit_quit, + NULL, + }, +}; + +/****************/ + +cmdline_parse_ctx_t main_ctx[] = { + (cmdline_parse_inst_t *)&cmd_autotest, + (cmdline_parse_inst_t *)&cmd_dump, + (cmdline_parse_inst_t *)&cmd_dump_one, + (cmdline_parse_inst_t *)&cmd_set_ring, + (cmdline_parse_inst_t *)&cmd_quit, + NULL, +}; + diff --git a/app/test/graph_mempool.py b/app/test/graph_mempool.py new file mode 100755 index 0000000..46e3e7b --- /dev/null +++ b/app/test/graph_mempool.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +import sys, re +import numpy as np +import matplotlib +matplotlib.use('Agg') # we don't want to use X11 +import matplotlib.pyplot as plt +from matplotlib.ticker import FuncFormatter + +INT = "([-+]?[0-9][0-9]*)" + +class MempoolTest: + l = [] + + def __init__(self): + pass + + # sort a test case list + def sort(self, x, y): + for t in [ "cache", "cores", "n_get_bulk", "n_put_bulk", + "n_keep", "rate" ]: + if x[t] > y[t]: + return 1 + if x[t] < y[t]: + return -1 + return 0 + + # add a test case + def add(self, **args): + self.l.append(args) + + # get an ordered list matching parameters + # ex: r.get(enq_core=1, deq_core=1) + def get(self, **args): + retlist = [] + for t in self.l: + add_it = 1 + for a in args: + if args[a] != t[a]: + add_it = 0 + break + if add_it: + retlist.append(t) + retlist.sort(cmp=self.sort) + return retlist + + # return an ordered list of all values for this param or param list + # ex: r.get_value_list("enq_core") + def get_value_list(self, param): + retlist = [] + if type(param) is not list: + param = [param] + for t in self.l: + entry = [] + for p in param: + entry.append(t[p]) + if len(entry) == 1: + entry = entry[0] + else: + entry = tuple(entry) + if not entry in retlist: + retlist.append(entry) + retlist.sort() + return retlist + +# read the file and return a MempoolTest object containing all data +def read_data_from_file(filename): + + mempool_test = MempoolTest() + + # parse the file: it produces a list of dict containing the data for + # each test case (each dict in the list corresponds to a line) + f = open(filename) + while True: + l = f.readline() + + if l == "": + break + + regexp = "mempool_autotest " + regexp += "cache=%s cores=%s "%(INT, INT) + regexp += "n_get_bulk=%s n_put_bulk=%s "%(INT, INT) + regexp += "n_keep=%s rate_persec=%s"%(INT, INT) + m = re.match(regexp, l) + if m == None: + continue + + mempool_test.add(cache = int(m.groups()[0]), + cores = int(m.groups()[1]), + n_get_bulk = int(m.groups()[2]), + n_put_bulk = int(m.groups()[3]), + n_keep = int(m.groups()[4]), + rate = int(m.groups()[5])) + + f.close() + return mempool_test + +def millions(x, pos): + return '%1.1fM' % (x*1e-6) + +# graph one, with specific parameters -> generate a .svg file +def graph_one(str, mempool_test, cache, cores, n_keep): + filename = "mempool_%d_%d_%d.svg"%(cache, cores, n_keep) + + n_get_bulk_list = mempool_test.get_value_list("n_get_bulk") + N_n_get_bulk = len(n_get_bulk_list) + get_names = map(lambda x:"get=%d"%x, n_get_bulk_list) + + n_put_bulk_list = mempool_test.get_value_list("n_put_bulk") + N_n_put_bulk = len(n_put_bulk_list) + put_names = map(lambda x:"put=%d"%x, n_put_bulk_list) + + N = N_n_get_bulk * (N_n_put_bulk + 1) + rates = [] + + colors = [] + for n_get_bulk in mempool_test.get_value_list("n_get_bulk"): + col = 0. + for n_put_bulk in mempool_test.get_value_list("n_put_bulk"): + col += 0.9 / len(mempool_test.get_value_list("n_put_bulk")) + r = mempool_test.get(cache=cache, cores=cores, + n_get_bulk=n_get_bulk, + n_put_bulk=n_put_bulk, n_keep=n_keep) + if len(r) != 0: + r = r[0]["rate"] + rates.append(r) + colors.append((1. - col, 0.2, col, 1.)) # rgba + + rates.append(0) + colors.append((0.,0.,0.,0.)) + + ind = np.arange(N) # the x locations for the groups + width = 1 # the width of the bars: can also be len(x) sequence + + + formatter = FuncFormatter(millions) + fig = plt.figure() + p = plt.bar(ind, tuple(rates), width, color=tuple(colors)) + fig.axes[0].yaxis.set_major_formatter(formatter) + + plt.ylabel('Obj/sec') + #plt.ylim(0, 400000000.) + title = "Mempool autotest \"%s\"\n"%(str) + title += "cache=%d, core(s)=%d, n_keep=%d"%(cache, cores, n_keep) + plt.title(title) + ind_names = np.arange(N_n_get_bulk) * (N_n_put_bulk+1) + (N_n_put_bulk+1) / 2 + plt.xticks(ind_names, tuple(get_names)) + plt.legend(tuple([p[i] for i in range(N_n_put_bulk)]), tuple(put_names), + loc="upper left") + plt.savefig(filename) + +if len(sys.argv) != 3: + print "usage: graph_mempool.py file title" + sys.exit(1) + +mempool_test = read_data_from_file(sys.argv[1]) + +for cache, cores, n_keep in mempool_test.get_value_list(["cache", "cores", + "n_keep"]): + graph_one(sys.argv[2], mempool_test, cache, cores, n_keep) diff --git a/app/test/graph_ring.py b/app/test/graph_ring.py new file mode 100755 index 0000000..02c4228 --- /dev/null +++ b/app/test/graph_ring.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python + +# BSD LICENSE +# +# Copyright(c) 2010-2012 Intel Corporation. All rights reserved. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# version: DPDK.L.1.2.3-3 + +import sys, re +import numpy as np +import matplotlib +matplotlib.use('Agg') # we don't want to use X11 +import matplotlib.pyplot as plt +from matplotlib.ticker import FuncFormatter + +INT = "([-+]?[0-9][0-9]*)" + +class RingTest: + l = [] + + def __init__(self): + pass + + # sort a test case list + def sort(self, x, y): + for t in [ "enq_core", "deq_core", "enq_bulk", "deq_bulk", "rate" ]: + if x[t] > y[t]: + return 1 + if x[t] < y[t]: + return -1 + return 0 + + # add a test case + def add(self, **args): + self.l.append(args) + + # get an ordered list matching parameters + # ex: r.get(enq_core=1, deq_core=1) + def get(self, **args): + retlist = [] + for t in self.l: + add_it = 1 + for a in args: + if args[a] != t[a]: + add_it = 0 + break + if add_it: + retlist.append(t) + retlist.sort(cmp=self.sort) + return retlist + + # return an ordered list of all values for this param or param list + # ex: r.get_value_list("enq_core") + def get_value_list(self, param): + retlist = [] + if type(param) is not list: + param = [param] + for t in self.l: + entry = [] + for p in param: + entry.append(t[p]) + if len(entry) == 1: + entry = entry[0] + else: + entry = tuple(entry) + if not entry in retlist: + retlist.append(entry) + retlist.sort() + return retlist + +# read the file and return a RingTest object containing all data +def read_data_from_file(filename): + + ring_test = RingTest() + + # parse the file: it produces a list of dict containing the data for + # each test case (each dict in the list corresponds to a line) + f = open(filename) + while True: + l = f.readline() + + if l == "": + break + + regexp = "ring_autotest " + regexp += "e/d_core=%s,%s e/d_bulk=%s,%s "%(INT, INT, INT, INT) + regexp += "sp=%s sc=%s "%(INT, INT) + regexp += "rate_persec=%s"%(INT) + m = re.match(regexp, l) + if m == None: + continue + + ring_test.add(enq_core = int(m.groups()[0]), + deq_core = int(m.groups()[1]), + enq_bulk = int(m.groups()[2]), + deq_bulk = int(m.groups()[3]), + sp = int(m.groups()[4]), + sc = int(m.groups()[5]), + rate = int(m.groups()[6])) + + f.close() + return ring_test + +def millions(x, pos): + return '%1.1fM' % (x*1e-6) + +# graph one, with specific parameters -> generate a .svg file +def graph_one(str, ring_test, enq_core, deq_core, sp, sc): + filename = "ring_%d_%d"%(enq_core, deq_core) + if sp: + sp_str = "sp" + else: + sp_str = "mp" + if sc: + sc_str = "sc" + else: + sc_str = "mc" + filename += "_%s_%s.svg"%(sp_str, sc_str) + + + enq_bulk_list = ring_test.get_value_list("enq_bulk") + N_enq_bulk = len(enq_bulk_list) + enq_names = map(lambda x:"enq=%d"%x, enq_bulk_list) + + deq_bulk_list = ring_test.get_value_list("deq_bulk") + N_deq_bulk = len(deq_bulk_list) + deq_names = map(lambda x:"deq=%d"%x, deq_bulk_list) + + N = N_enq_bulk * (N_deq_bulk + 1) + rates = [] + + colors = [] + for enq_bulk in ring_test.get_value_list("enq_bulk"): + col = 0. + for deq_bulk in ring_test.get_value_list("deq_bulk"): + col += 0.9 / len(ring_test.get_value_list("deq_bulk")) + r = ring_test.get(enq_core=enq_core, deq_core=deq_core, + enq_bulk=enq_bulk, deq_bulk=deq_bulk, + sp=sp, sc=sc) + r = r[0]["rate"] + rates.append(r) + colors.append((1. - col, 0.2, col, 1.)) # rgba + + rates.append(0) + colors.append((0.,0.,0.,0.)) + + ind = np.arange(N) # the x locations for the groups + width = 1 # the width of the bars: can also be len(x) sequence + + + formatter = FuncFormatter(millions) + fig = plt.figure() + p = plt.bar(ind, tuple(rates), width, color=tuple(colors)) + fig.axes[0].yaxis.set_major_formatter(formatter) + + plt.ylabel('Obj/sec') + #plt.ylim(0, 400000000.) + plt.title("Ring autotest \"%s\"\nenq core(s)=%d, deq core(s)=%d, %s, %s"\ + %(str, enq_core, deq_core, sp_str, sc_str)) + ind_names = np.arange(N_enq_bulk) * (N_deq_bulk+1) + (N_deq_bulk+1) / 2 + plt.xticks(ind_names, tuple(enq_names)) + plt.legend(tuple([p[i] for i in range(N_deq_bulk)]), tuple(deq_names), + loc="upper left") + plt.savefig(filename) + +if len(sys.argv) != 3: + print "usage: graph_ring.py file title" + sys.exit(1) + +ring_test = read_data_from_file(sys.argv[1]) + +for enq_core, deq_core, sp, sc in \ + ring_test.get_value_list(["enq_core", "deq_core", "sp", "sc"]): + graph_one(sys.argv[2], ring_test, enq_core, deq_core, sp, sc) diff --git a/app/test/process.h b/app/test/process.h new file mode 100644 index 0000000..0dbc898 --- /dev/null +++ b/app/test/process.h @@ -0,0 +1,89 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#ifndef _PROCESS_H_ +#define _PROCESS_H_ + +#ifndef RTE_EXEC_ENV_BAREMETAL + +/* + * launches a second copy of the test process using the given argv parameters, + * which should include argv[0] as the process name. To identify in the + * subprocess the source of the call, the env_value parameter is set in the + * environment as $RTE_TEST + */ +static inline int +process_dup(const char *const argv[], int numargs, const char *env_value) +{ + char *argv_cpy[numargs + 1]; + int i, fd, status; + char path[32]; + + pid_t pid = fork(); + if (pid < 0) + return -1; + else if (pid == 0) { + /* make a copy of the arguments to be passed to exec */ + for (i = 0; i < numargs; i++) + argv_cpy[i] = strdup(argv[i]); + argv_cpy[i] = NULL; + + /* close all open file descriptors, check /proc/self/fd to only + * call close on open fds. Exclude fds 0, 1 and 2*/ + for (fd = getdtablesize(); fd > 2; fd-- ) { + rte_snprintf(path, sizeof(path), "/proc/self/fd/%d", fd); + if (access(path, F_OK) == 0) + close(fd); + } + printf("Running binary with argv[]:"); + for (i = 0; i < numargs; i++) + printf("'%s' ", argv_cpy[i]); + printf("\n"); + + /* set the environment variable */ + if (setenv(RECURSIVE_ENV_VAR, env_value, 1) != 0) + rte_panic("Cannot export environment variable\n"); + if (execv("/proc/self/exe", argv_cpy) < 0) + rte_panic("Cannot exec\n"); + } + /* parent process does a wait */ + while (wait(&status) != pid) + ; + return status; +} + +#endif /* not baremetal */ + +#endif /* _PROCESS_H_ */ diff --git a/app/test/test.c b/app/test/test.c new file mode 100644 index 0000000..f98656c --- /dev/null +++ b/app/test/test.c @@ -0,0 +1,153 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "test.h" + +const char *prgname; /* to be set to argv[0] */ + +#ifndef RTE_EXEC_ENV_BAREMETAL +static const char *recursive_call; /* used in linuxapp for MP and other tests */ + +static int +no_action(void){ return 0; } + +static int +do_recursive_call(void) +{ + unsigned i; + struct { + const char *env_var; + int (*action_fn)(void); + } actions[] = { + { "run_secondary_instances", test_mp_secondary }, + { "test_missing_c_flag", no_action }, + { "test_missing_n_flag", no_action }, + { "test_no_hpet_flag", no_action }, + { "test_invalid_b_flag", no_action }, + { "test_invalid_r_flag", no_action }, + { "test_misc_flags", no_action }, + }; + + if (recursive_call == NULL) + return -1; + for (i = 0; i < sizeof(actions)/sizeof(actions[0]); i++) { + if (strcmp(actions[i].env_var, recursive_call) == 0) + return (actions[i].action_fn)(); + } + return -1; +} +#endif + +void +test_hexdump(const char *title, const void *buf, unsigned int len) +{ + unsigned int i, out, ofs; + const unsigned char *data = buf; +#define LINE_LEN 80 + char line[LINE_LEN]; /* space needed 8+16*3+3+16 == 75 */ + + printf("%s at [%p], len=%u\n", title, data, len); + ofs = 0; + while (ofs < len) { + /* format 1 line in the buffer, then use printf to print them */ + out = rte_snprintf(line, LINE_LEN, "%08X", ofs); + for (i = 0; ofs+i < len && i < 16; i++) + out += rte_snprintf(line+out, LINE_LEN - out, " %02X", + data[ofs+i]&0xff); + for(; i <= 16; i++) + out += rte_snprintf(line+out, LINE_LEN - out, " "); + for(i = 0; ofs < len && i < 16; i++, ofs++) { + unsigned char c = data[ofs]; + if (!isascii(c) || !isprint(c)) + c = '.'; + out += rte_snprintf(line+out, LINE_LEN - out, "%c", c); + } + printf("%s\n", line); + } +} + +int +main(int argc, char **argv) +{ + struct cmdline *cl; + int ret; + + ret = rte_eal_init(argc, argv); + if (ret < 0) + return -1; + + rte_timer_subsystem_init(); + + argc -= ret; + argv += ret; + + prgname = argv[0]; + +#ifndef RTE_EXEC_ENV_BAREMETAL + if ((recursive_call = getenv(RECURSIVE_ENV_VAR)) != NULL) + return do_recursive_call(); +#endif + + cl = cmdline_stdin_new(main_ctx, "RTE>>"); + if (cl == NULL) { + return -1; + } + cmdline_interact(cl); + cmdline_stdin_exit(cl); + + return 0; +} diff --git a/app/test/test.h b/app/test/test.h new file mode 100644 index 0000000..3c927d2 --- /dev/null +++ b/app/test/test.h @@ -0,0 +1,85 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#ifndef _TEST_H_ +#define _TEST_H_ + +/* icc on baremetal gives us troubles with function named 'main' */ +#ifdef RTE_EXEC_ENV_BAREMETAL +#define main _main +#endif + +#define RECURSIVE_ENV_VAR "RTE_TEST_RECURSIVE" + +extern const char *prgname; + +extern cmdline_parse_ctx_t main_ctx[]; + +void test_hexdump(const char *title, const void *buf, unsigned int len); + +int main(int argc, char **argv); + +int test_pci(void); +int test_memory(void); +int test_per_lcore(void); +int test_spinlock(void); +int test_rwlock(void); +int test_atomic(void); +int test_byteorder(void); +int test_prefetch(void); +int test_cycles(void); +int test_logs(void); +int test_memzone(void); +int test_ring(void); +int test_mempool(void); +int test_mbuf(void); +int test_timer(void); +int test_malloc(void); +int test_memcpy(void); +int test_hash(void); +int test_lpm(void); +int test_debug(void); +int test_errno(void); +int test_tailq(void); +int test_string_fns(void); +int test_mp_secondary(void); +int test_cpuflags(void); +int test_eal_flags(void); +int test_alarm(void); +int test_interrupt(void); +int test_version(void); +int test_pci_run; + +#endif diff --git a/app/test/test_alarm.c b/app/test/test_alarm.c new file mode 100644 index 0000000..5e36a3d --- /dev/null +++ b/app/test/test_alarm.c @@ -0,0 +1,258 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "test.h" + +#define US_PER_MS 1000 + +#define RTE_TEST_ALARM_TIMEOUT 3000 /* ms */ +#define RTE_TEST_CHECK_PERIOD 1000 /* ms */ + +static volatile int flag; + +static void +test_alarm_callback(void *cb_arg) +{ + flag = 1; + printf("Callback setting flag - OK. [cb_arg = %p]\n", cb_arg); +} + +static rte_atomic32_t cb_count; + +static void +test_multi_cb(void *arg) +{ + rte_atomic32_inc(&cb_count); + printf("In %s - arg = %p\n", __func__, arg); +} + +static volatile int recursive_error = 0; + +static void +test_remove_in_callback(void *arg) +{ + printf("In %s - arg = %p\n", __func__, arg); + if (rte_eal_alarm_cancel(test_remove_in_callback, arg) || + rte_eal_alarm_cancel(test_remove_in_callback, (void *)-1)) { + printf("Error - cancelling callback from within function succeeded!\n"); + recursive_error = 1; + } + flag = (int)((uintptr_t)arg); +} + +static volatile int flag_2; + +static void +test_remove_in_callback_2(void *arg) +{ + if (rte_eal_alarm_cancel(test_remove_in_callback_2, arg) || rte_eal_alarm_cancel(test_remove_in_callback_2, (void *)-1)) { + printf("Error - cancelling callback of test_remove_in_callback_2\n"); + return; + } + flag_2 = 1; +} + +static int +test_multi_alarms(void) +{ + int rm_count = 0; + cb_count.cnt = 0; + + printf("Expect 6 callbacks in order...\n"); + /* add two alarms in order */ + rte_eal_alarm_set(1000 * US_PER_MS, test_multi_cb, (void *)1); + rte_eal_alarm_set(2000 * US_PER_MS, test_multi_cb, (void *)2); + + /* now add in reverse order */ + rte_eal_alarm_set(6000 * US_PER_MS, test_multi_cb, (void *)6); + rte_eal_alarm_set(5000 * US_PER_MS, test_multi_cb, (void *)5); + rte_eal_alarm_set(4000 * US_PER_MS, test_multi_cb, (void *)4); + rte_eal_alarm_set(3000 * US_PER_MS, test_multi_cb, (void *)3); + + /* wait for expiry */ + rte_delay_ms(6500); + if (cb_count.cnt != 6) { + printf("Missing callbacks\n"); + /* remove any callbacks that might remain */ + rte_eal_alarm_cancel(test_multi_cb, (void *)-1); + return -1; + } + + cb_count.cnt = 0; + printf("Expect only callbacks with args 1 and 3...\n"); + /* Add 3 flags, then delete one */ + rte_eal_alarm_set(3000 * US_PER_MS, test_multi_cb, (void *)3); + rte_eal_alarm_set(2000 * US_PER_MS, test_multi_cb, (void *)2); + rte_eal_alarm_set(1000 * US_PER_MS, test_multi_cb, (void *)1); + rm_count = rte_eal_alarm_cancel(test_multi_cb, (void *)2); + + rte_delay_ms(3500); + if (cb_count.cnt != 2 || rm_count != 1) { + printf("Error: invalid flags count or alarm removal failure" + " - flags value = %d, expected = %d\n", cb_count.cnt, 2); + /* remove any callbacks that might remain */ + rte_eal_alarm_cancel(test_multi_cb, (void *)-1); + return -1; + } + + printf("Testing adding and then removing multiple alarms\n"); + /* finally test that no callbacks are called if we delete them all*/ + rte_eal_alarm_set(1000 * US_PER_MS, test_multi_cb, (void *)1); + rte_eal_alarm_set(1000 * US_PER_MS, test_multi_cb, (void *)2); + rte_eal_alarm_set(1000 * US_PER_MS, test_multi_cb, (void *)3); + rm_count = rte_eal_alarm_cancel(test_alarm_callback, (void *)-1); + if (rm_count != 0) { + printf("Error removing non-existant alarm succeeded\n"); + rte_eal_alarm_cancel(test_multi_cb, (void *) -1); + return -1; + } + rm_count = rte_eal_alarm_cancel(test_multi_cb, (void *) -1); + if (rm_count != 3) { + printf("Error removing all pending alarm callbacks\n"); + return -1; + } + + /* Test that we cannot cancel an alarm from within the callback itself + * Also test that we can cancel head-of-line callbacks ok.*/ + flag = 0; + recursive_error = 0; + rte_eal_alarm_set(1000 * US_PER_MS, test_remove_in_callback, (void *)1); + rte_eal_alarm_set(2000 * US_PER_MS, test_remove_in_callback, (void *)2); + rm_count = rte_eal_alarm_cancel(test_remove_in_callback, (void *)1); + if (rm_count != 1) { + printf("Error cancelling head-of-list callback\n"); + return -1; + } + rte_delay_ms(1500); + if (flag != 0) { + printf("Error, cancelling head-of-list leads to premature callback\n"); + return -1; + } + rte_delay_ms(1000); + if (flag != 2) { + printf("Error - expected callback not called\n"); + rte_eal_alarm_cancel(test_remove_in_callback, (void *)-1); + return -1; + } + if (recursive_error == 1) + return -1; + + /* Check if it can cancel all for the same callback */ + printf("Testing canceling all for the same callback\n"); + flag_2 = 0; + rte_eal_alarm_set(1000 * US_PER_MS, test_remove_in_callback, (void *)1); + rte_eal_alarm_set(2000 * US_PER_MS, test_remove_in_callback_2, (void *)2); + rte_eal_alarm_set(3000 * US_PER_MS, test_remove_in_callback_2, (void *)3); + rte_eal_alarm_set(4000 * US_PER_MS, test_remove_in_callback, (void *)4); + rm_count = rte_eal_alarm_cancel(test_remove_in_callback_2, (void *)-1); + if (rm_count != 2) { + printf("Error, cannot cancel all for the same callback\n"); + return -1; + } + rm_count = rte_eal_alarm_cancel(test_remove_in_callback, (void *)-1); + if (rm_count != 2) { + printf("Error, cannot cancel all for the same callback\n"); + return -1; + } + + return 0; +} + +int +test_alarm(void) +{ + int count = 0; + + /* check if the callback will be called */ + printf("check if the callback will be called\n"); + flag = 0; + if (rte_eal_alarm_set(RTE_TEST_ALARM_TIMEOUT * US_PER_MS, + test_alarm_callback, NULL) < 0) { + printf("fail to set alarm callback\n"); + return -1; + } + while (flag == 0 && count ++ < 6) + rte_delay_ms(RTE_TEST_CHECK_PERIOD); + + if (flag == 0){ + printf("Callback not called\n"); + return -1; + } + + /* check if it will fail to set alarm with wrong us value */ + printf("check if it will fail to set alarm with wrong ms values\n"); + if (rte_eal_alarm_set(0, test_alarm_callback, + NULL) >= 0) { + printf("should not be successful with 0 us value\n"); + return -1; + } + if (rte_eal_alarm_set(UINT64_MAX - 1, test_alarm_callback, + NULL) >= 0) { + printf("should not be successful with (UINT64_MAX-1) us value\n"); + return -1; + } + + /* check if it will fail to set alarm with null callback parameter */ + printf("check if it will fail to set alarm with null callback parameter\n"); + if (rte_eal_alarm_set(RTE_TEST_ALARM_TIMEOUT, NULL, NULL) >= 0) { + printf("should not be successful to set alarm with null callback parameter\n"); + return -1; + } + + /* check if it will fail to remove alarm with null callback parameter */ + printf("check if it will fail to remove alarm with null callback parameter\n"); + if (rte_eal_alarm_cancel(NULL, NULL) == 0) { + printf("should not be successful to remove alarm with null callback parameter"); + return -1; + } + + if (test_multi_alarms() != 0) + return -1; + + return 0; +} + diff --git a/app/test/test_atomic.c b/app/test/test_atomic.c new file mode 100644 index 0000000..b64f361 --- /dev/null +++ b/app/test/test_atomic.c @@ -0,0 +1,381 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "test.h" + +/* + * Atomic Variables + * ================ + * + * - The main test function performs three subtests. The first test + * checks that the usual inc/dec/add/sub functions are working + * correctly: + * + * - Initialize 16-bit, 32-bit and 64-bit atomic variables to specific + * values. + * + * - These variables are incremented and decremented on each core at + * the same time in ``test_atomic_usual()``. + * + * - The function checks that once all lcores finish their function, + * the value of the atomic variables are still the same. + * + * - The second test verifies the behavior of "test and set" functions. + * + * - Initialize 16-bit, 32-bit and 64-bit atomic variables to zero. + * + * - Invoke ``test_atomic_tas()`` on each lcore: before doing anything + * else. The cores are waiting a synchro using ``while + * (rte_atomic32_read(&val) == 0)`` which is triggered by the main test + * function. Then all cores do a + * ``rte_atomicXX_test_and_set()`` at the same time. If it is successful, + * it increments another atomic counter. + * + * - The main function checks that the atomic counter was incremented + * twice only (one for 16-bit, one for 32-bit and one for 64-bit values). + * + * - Test "add/sub and return" + * + * - Initialize 16-bit, 32-bit and 64-bit atomic variables to zero. + * + * - Invoke ``test_atomic_addsub_return()`` on each lcore. Before doing + * anything else, the cores are waiting a synchro. Each lcore does + * this operation several times:: + * + * tmp = rte_atomicXX_add_return(&a, 1); + * atomic_add(&count, tmp); + * tmp = rte_atomicXX_sub_return(&a, 1); + * atomic_sub(&count, tmp+1); + * + * - At the end of the test, the *count* value must be 0. + */ + +#define NUM_ATOMIC_TYPES 3 + +#define N 10000 + +static rte_atomic16_t a16; +static rte_atomic32_t a32; +static rte_atomic64_t a64; +static rte_atomic32_t count; +static rte_atomic32_t synchro; + +static int +test_atomic_usual(__attribute__((unused)) void *arg) +{ + unsigned i; + + while (rte_atomic32_read(&synchro) == 0) + ; + + for (i = 0; i < N; i++) + rte_atomic16_inc(&a16); + for (i = 0; i < N; i++) + rte_atomic16_dec(&a16); + for (i = 0; i < (N / 5); i++) + rte_atomic16_add(&a16, 5); + for (i = 0; i < (N / 5); i++) + rte_atomic16_sub(&a16, 5); + + for (i = 0; i < N; i++) + rte_atomic32_inc(&a32); + for (i = 0; i < N; i++) + rte_atomic32_dec(&a32); + for (i = 0; i < (N / 5); i++) + rte_atomic32_add(&a32, 5); + for (i = 0; i < (N / 5); i++) + rte_atomic32_sub(&a32, 5); + + for (i = 0; i < N; i++) + rte_atomic64_inc(&a64); + for (i = 0; i < N; i++) + rte_atomic64_dec(&a64); + for (i = 0; i < (N / 5); i++) + rte_atomic64_add(&a64, 5); + for (i = 0; i < (N / 5); i++) + rte_atomic64_sub(&a64, 5); + + return 0; +} + +static int +test_atomic_tas(__attribute__((unused)) void *arg) +{ + while (rte_atomic32_read(&synchro) == 0) + ; + + if (rte_atomic16_test_and_set(&a16)) + rte_atomic32_inc(&count); + if (rte_atomic32_test_and_set(&a32)) + rte_atomic32_inc(&count); + if (rte_atomic64_test_and_set(&a64)) + rte_atomic32_inc(&count); + + return 0; +} + +static int +test_atomic_addsub_and_return(__attribute__((unused)) void *arg) +{ + uint32_t tmp16; + uint32_t tmp32; + uint64_t tmp64; + unsigned i; + + while (rte_atomic32_read(&synchro) == 0) + ; + + for (i = 0; i < N; i++) { + tmp16 = rte_atomic16_add_return(&a16, 1); + rte_atomic32_add(&count, tmp16); + + tmp16 = rte_atomic16_sub_return(&a16, 1); + rte_atomic32_sub(&count, tmp16+1); + + tmp32 = rte_atomic32_add_return(&a32, 1); + rte_atomic32_add(&count, tmp32); + + tmp32 = rte_atomic32_sub_return(&a32, 1); + rte_atomic32_sub(&count, tmp32+1); + + tmp64 = rte_atomic64_add_return(&a64, 1); + rte_atomic32_add(&count, tmp64); + + tmp64 = rte_atomic64_sub_return(&a64, 1); + rte_atomic32_sub(&count, tmp64+1); + } + + return 0; +} + +/* + * rte_atomic32_inc_and_test() would increase a 32 bits counter by one and then + * test if that counter is equal to 0. It would return true if the counter is 0 + * and false if the counter is not 0. rte_atomic64_inc_and_test() could do the + * same thing but for a 64 bits counter. + * Here checks that if the 32/64 bits counter is equal to 0 after being atomically + * increased by one. If it is, increase the variable of "count" by one which would + * be checked as the result later. + * + */ +static int +test_atomic_inc_and_test(__attribute__((unused)) void *arg) +{ + while (rte_atomic32_read(&synchro) == 0) + ; + + if (rte_atomic16_inc_and_test(&a16)) { + rte_atomic32_inc(&count); + } + if (rte_atomic32_inc_and_test(&a32)) { + rte_atomic32_inc(&count); + } + if (rte_atomic64_inc_and_test(&a64)) { + rte_atomic32_inc(&count); + } + + return 0; +} + +/* + * rte_atomicXX_dec_and_test() should decrease a 32 bits counter by one and then + * test if that counter is equal to 0. It should return true if the counter is 0 + * and false if the counter is not 0. + * This test checks if the counter is equal to 0 after being atomically + * decreased by one. If it is, increase the value of "count" by one which is to + * be checked as the result later. + */ +static int +test_atomic_dec_and_test(__attribute__((unused)) void *arg) +{ + while (rte_atomic32_read(&synchro) == 0) + ; + + if (rte_atomic16_dec_and_test(&a16)) + rte_atomic32_inc(&count); + + if (rte_atomic32_dec_and_test(&a32)) + rte_atomic32_inc(&count); + + if (rte_atomic64_dec_and_test(&a64)) + rte_atomic32_inc(&count); + + return 0; +} + +int +test_atomic(void) +{ + rte_atomic16_init(&a16); + rte_atomic32_init(&a32); + rte_atomic64_init(&a64); + rte_atomic32_init(&count); + rte_atomic32_init(&synchro); + + rte_atomic16_set(&a16, 1UL << 10); + rte_atomic32_set(&a32, 1UL << 10); + rte_atomic64_set(&a64, 1ULL << 33); + + printf("usual inc/dec/add/sub functions\n"); + + rte_eal_mp_remote_launch(test_atomic_usual, NULL, SKIP_MASTER); + rte_atomic32_set(&synchro, 1); + rte_eal_mp_wait_lcore(); + rte_atomic32_set(&synchro, 0); + + if (rte_atomic16_read(&a16) != 1UL << 10) { + printf("Atomic16 usual functions failed\n"); + return -1; + } + + if (rte_atomic32_read(&a32) != 1UL << 10) { + printf("Atomic32 usual functions failed\n"); + return -1; + } + + if (rte_atomic64_read(&a64) != 1ULL << 33) { + printf("Atomic64 usual functions failed\n"); + return -1; + } + + printf("test and set\n"); + + rte_atomic64_set(&a64, 0); + rte_atomic32_set(&a32, 0); + rte_atomic16_set(&a16, 0); + rte_atomic32_set(&count, 0); + rte_eal_mp_remote_launch(test_atomic_tas, NULL, SKIP_MASTER); + rte_atomic32_set(&synchro, 1); + rte_eal_mp_wait_lcore(); + rte_atomic32_set(&synchro, 0); + + if (rte_atomic32_read(&count) != NUM_ATOMIC_TYPES) { + printf("Atomic test and set failed\n"); + return -1; + } + + printf("add/sub and return\n"); + + rte_atomic64_set(&a64, 0); + rte_atomic32_set(&a32, 0); + rte_atomic16_set(&a16, 0); + rte_atomic32_set(&count, 0); + rte_eal_mp_remote_launch(test_atomic_addsub_and_return, NULL, + SKIP_MASTER); + rte_atomic32_set(&synchro, 1); + rte_eal_mp_wait_lcore(); + rte_atomic32_set(&synchro, 0); + + if (rte_atomic32_read(&count) != 0) { + printf("Atomic add/sub+return failed\n"); + return -1; + } + + /* + * Set a64, a32 and a16 with the same value of minus "number of slave + * lcores", launch all slave lcores to atomically increase by one and + * test them respectively. + * Each lcore should have only one chance to increase a64 by one and + * then check if it is equal to 0, but there should be only one lcore + * that finds that it is 0. It is similar for a32 and a16. + * Then a variable of "count", initialized to zero, is increased by + * one if a64, a32 or a16 is 0 after being increased and tested + * atomically. + * We can check if "count" is finally equal to 3 to see if all slave + * lcores performed "atomic inc and test" right. + */ + printf("inc and test\n"); + + rte_atomic64_clear(&a64); + rte_atomic32_clear(&a32); + rte_atomic16_clear(&a16); + rte_atomic32_clear(&synchro); + rte_atomic32_clear(&count); + + rte_atomic64_set(&a64, (int64_t)(1 - (int64_t)rte_lcore_count())); + rte_atomic32_set(&a32, (int32_t)(1 - (int32_t)rte_lcore_count())); + rte_atomic16_set(&a16, (int16_t)(1 - (int16_t)rte_lcore_count())); + rte_eal_mp_remote_launch(test_atomic_inc_and_test, NULL, SKIP_MASTER); + rte_atomic32_set(&synchro, 1); + rte_eal_mp_wait_lcore(); + rte_atomic32_clear(&synchro); + + if (rte_atomic32_read(&count) != NUM_ATOMIC_TYPES) { + printf("Atomic inc and test failed %d\n", count.cnt); + return -1; + } + + /* + * Same as above, but this time we set the values to "number of slave + * lcores", and decrement instead of increment. + */ + printf("dec and test\n"); + + rte_atomic32_clear(&synchro); + rte_atomic32_clear(&count); + + rte_atomic64_set(&a64, (int64_t)(rte_lcore_count() - 1)); + rte_atomic32_set(&a32, (int32_t)(rte_lcore_count() - 1)); + rte_atomic16_set(&a16, (int16_t)(rte_lcore_count() - 1)); + rte_eal_mp_remote_launch(test_atomic_dec_and_test, NULL, SKIP_MASTER); + rte_atomic32_set(&synchro, 1); + rte_eal_mp_wait_lcore(); + rte_atomic32_clear(&synchro); + + if (rte_atomic32_read(&count) != NUM_ATOMIC_TYPES) { + printf("Atomic dec and test failed\n"); + return -1; + } + + return 0; +} + diff --git a/app/test/test_byteorder.c b/app/test/test_byteorder.c new file mode 100644 index 0000000..593e26f --- /dev/null +++ b/app/test/test_byteorder.c @@ -0,0 +1,97 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include + +#include + +#include + +#include "test.h" + +static volatile uint16_t u16 = 0x1337; +static volatile uint32_t u32 = 0xdeadbeefUL; +static volatile uint64_t u64 = 0xdeadcafebabefaceULL; + +/* + * Byteorder functions + * =================== + * + * - check that optimized byte swap functions are working for each + * size (16, 32, 64 bits) + */ + +int +test_byteorder(void) +{ + uint16_t res_u16; + uint32_t res_u32; + uint64_t res_u64; + + res_u16 = rte_bswap16(u16); + printf("%"PRIx16" -> %"PRIx16"\n", u16, res_u16); + if (res_u16 != 0x3713) + return -1; + + res_u32 = rte_bswap32(u32); + printf("%"PRIx32" -> %"PRIx32"\n", u32, res_u32); + if (res_u32 != 0xefbeaddeUL) + return -1; + + res_u64 = rte_bswap64(u64); + printf("%"PRIx64" -> %"PRIx64"\n", u64, res_u64); + if (res_u64 != 0xcefabebafecaaddeULL) + return -1; + + res_u16 = rte_bswap16(0x1337); + printf("const %"PRIx16" -> %"PRIx16"\n", 0x1337, res_u16); + if (res_u16 != 0x3713) + return -1; + + res_u32 = rte_bswap32(0xdeadbeefUL); + printf("const %"PRIx32" -> %"PRIx32"\n", (uint32_t) 0xdeadbeef, res_u32); + if (res_u32 != 0xefbeaddeUL) + return -1; + + res_u64 = rte_bswap64(0xdeadcafebabefaceULL); + printf("const %"PRIx64" -> %"PRIx64"\n", (uint64_t) 0xdeadcafebabefaceULL, res_u64); + if (res_u64 != 0xcefabebafecaaddeULL) + return -1; + + return 0; +} diff --git a/app/test/test_cpuflags.c b/app/test/test_cpuflags.c new file mode 100644 index 0000000..d15d6e4 --- /dev/null +++ b/app/test/test_cpuflags.c @@ -0,0 +1,134 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include + +#include +#include +#include +#include +#include + +#include "test.h" + + +/* convenience define */ +#define CHECK_FOR_FLAG(x) \ + result = rte_cpu_get_flag_enabled(x); \ + printf("%s\n", cpu_flag_result(result)); \ + if (result == -ENOENT) \ + return -1; + +/* + * Helper function to display result + */ +static inline const char * +cpu_flag_result(int result) +{ + switch (result) { + case 0: + return "NOT PRESENT"; + case 1: + return "OK"; + default: + return "ERROR"; + } +} + + + +/* + * CPUID test + * =========== + * + * - Check flags from different registers with rte_cpu_get_flag_enabled() + * - Check if register and CPUID functions fail properly + */ + +int +test_cpuflags(void) +{ + int result; + printf("\nChecking for flags from different registers...\n"); + + printf("Check for SSE:\t\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_SSE); + + printf("Check for SSE2:\t\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_SSE2); + + printf("Check for SSE3:\t\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_SSE3); + + printf("Check for SSE4.1:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_1); + + printf("Check for SSE4.2:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_SSE4_2); + + printf("Check for AVX:\t\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_AVX); + + printf("Check for AVX2:\t\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_AVX2); + + printf("Check for TRBOBST:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_TRBOBST); + + printf("Check for ENERGY_EFF:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_ENERGY_EFF); + + printf("Check for LAHF_SAHF:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_LAHF_SAHF); + + printf("Check for 1GB_PG:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_1GB_PG); + + printf("Check for INVTSC:\t"); + CHECK_FOR_FLAG(RTE_CPUFLAG_INVTSC); + + + + /* + * Check if invalid data is handled properly + */ + printf("\nCheck for invalid flag:\t"); + result = rte_cpu_get_flag_enabled(RTE_CPUFLAG_NUMFLAGS); + printf("%s\n", cpu_flag_result(result)); + if (result != -ENOENT) + return -1; + + return 0; +} diff --git a/app/test/test_cycles.c b/app/test/test_cycles.c new file mode 100644 index 0000000..f480402 --- /dev/null +++ b/app/test/test_cycles.c @@ -0,0 +1,94 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include + +#include + +#include +#include + +#include "test.h" + +#define N 10000 + +/* + * Cycles test + * =========== + * + * - Loop N times and check that the timer alway increments and + * never decrements during this loop. + * + * - Wait one second using rte_usleep() and check that the increment + * of cycles is correct with regard to the frequency of the timer. + */ + +int +test_cycles(void) +{ + unsigned i; + uint64_t start_cycles, cycles, prev_cycles; + uint64_t hz = rte_get_hpet_hz(); + uint64_t max_inc = (hz / 100); /* 10 ms max between 2 reads */ + + /* check that the timer is always incrementing */ + start_cycles = rte_get_hpet_cycles(); + prev_cycles = start_cycles; + for (i=0; i max_inc) { + printf("increment too high or going backwards\n"); + return -1; + } + prev_cycles = cycles; + } + + /* check that waiting 1 second is precise */ + prev_cycles = rte_get_hpet_cycles(); + rte_delay_us(1000000); + cycles = rte_get_hpet_cycles(); + if ((uint64_t)(cycles - prev_cycles) > (hz + max_inc)) { + printf("delay_us is not accurate\n"); + return -1; + } + cycles = rte_get_hpet_cycles(); + if ((uint64_t)(cycles - prev_cycles) < (hz)) { + printf("delay_us is not accurate\n"); + return -1; + } + + return 0; +} diff --git a/app/test/test_debug.c b/app/test/test_debug.c new file mode 100644 index 0000000..153c562 --- /dev/null +++ b/app/test/test_debug.c @@ -0,0 +1,150 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include + +#include + +#include +#include + +#include "test.h" + +/* + * Debug test + * ========== + * + * - Call rte_dump_stack() and rte_dump_registers(). The result is not checked + * currently, as the functions are not implemented on baremetal. + * - Check that rte_panic() terminates the program using a non-zero error code. + * (Only implemented on linux, since it requires the fork() system call) + */ + +#ifdef RTE_EXEC_ENV_BAREMETAL + +/* baremetal - don't test rte_panic or rte_exit */ +static int +test_panic(void) +{ + return 0; +} + +static int +test_exit(void) +{ + return 0; +} + +#else + +/* linuxapp - use fork() to test rte_panic() */ +static int +test_panic(void) +{ + int pid; + int status; + + pid = fork(); + + if (pid == 0) + rte_panic("Test Debug\n"); + else if (pid < 0){ + printf("Fork Failed\n"); + return -1; + } + wait(&status); + if(status == 0){ + printf("Child process terminated normally!\n"); + return -1; + } else + printf("Child process terminated as expected - Test passed!\n"); + + return 0; +} + +/* linuxapp - use fork() to test rte_exit() */ +static int +test_exit_val(int exit_val) +{ + int pid; + int status; + + pid = fork(); + + if (pid == 0) + rte_exit(exit_val, __func__); + else if (pid < 0){ + printf("Fork Failed\n"); + return -1; + } + wait(&status); + printf("Child process status: %d\n", status); + if(!WIFEXITED(status) || WEXITSTATUS(status) != (uint8_t)exit_val){ + printf("Child process terminated with incorrect return code!\n"); + return -1; + } + + return 0; +} + +static int +test_exit(void) +{ + int test_vals[] = { 0, 1, 2, 255, -1 }; + unsigned i; + for (i = 0; i < sizeof(test_vals) / sizeof(test_vals[0]); i++){ + if (test_exit_val(test_vals[i]) < 0) + return -1; + } + printf("%s Passed\n", __func__); + return 0; +} + +#endif + +int +test_debug(void) +{ + rte_dump_stack(); + rte_dump_registers(); + if (test_panic() < 0) + return -1; + if (test_exit() < 0) + return -1; + return 0; +} diff --git a/app/test/test_eal_flags.c b/app/test/test_eal_flags.c new file mode 100644 index 0000000..37b9aaf --- /dev/null +++ b/app/test/test_eal_flags.c @@ -0,0 +1,303 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ +#include + +#include + +#include "test.h" + +#ifndef RTE_EXEC_ENV_BAREMETAL +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "process.h" + +#define mp_flag "--proc-type=secondary" +#define no_hpet "--no-hpet" +#define no_huge "--no-huge" +#define no_shconf "--no-shconf" +#define launch_proc(ARGV) process_dup(ARGV, \ + sizeof(ARGV)/(sizeof(ARGV[0])), __func__) + +/* + * Test that the app doesn't run without invalid blacklist option. + * Final test ensures it does run with valid options as sanity check + */ +static int +test_invalid_b_flag(void) +{ + const char *blinval[][8] = { + {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "error"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "0:0:0"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "0:error:0.1"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "0:0:0.1error"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "error0:0:0.1"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "0:0:0.1.2"}, + }; + /* Test with valid blacklist option */ + const char *blval[] = {prgname, mp_flag, "-n", "1", "-c", "1", "-b", "FF:09:0B.3"}; + + int i; + + for (i = 0; i != sizeof (blinval) / sizeof (blinval[0]); i++) { + if (launch_proc(blinval[i]) == 0) { + printf("Error - process did run ok with invalid " + "blacklist parameter\n"); + return -1; + } + } + if (launch_proc(blval) != 0) { + printf("Error - process did not run ok with valid blacklist value\n"); + return -1; + } + return 0; +} + + +/* + * Test that the app doesn't run with invalid -r option. + */ +static int +test_invalid_r_flag(void) +{ + const char *rinval[][8] = { + {prgname, mp_flag, "-n", "1", "-c", "1", "-r", "error"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-r", "0"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-r", "-1"}, + {prgname, mp_flag, "-n", "1", "-c", "1", "-r", "17"}, + }; + /* Test with valid blacklist option */ + const char *rval[] = {prgname, mp_flag, "-n", "1", "-c", "1", "-r", "16"}; + + int i; + + for (i = 0; i != sizeof (rinval) / sizeof (rinval[0]); i++) { + if (launch_proc(rinval[i]) == 0) { + printf("Error - process did run ok with invalid " + "-r (rank) parameter\n"); + return -1; + } + } + if (launch_proc(rval) != 0) { + printf("Error - process did not run ok with valid -r (rank) value\n"); + return -1; + } + return 0; +} + +/* + * Test that the app doesn't run without the coremask flag. In all cases + * should give an error and fail to run + */ +static int +test_missing_c_flag(void) +{ + /* -c flag but no coremask value */ + const char *argv1[] = { prgname, mp_flag, "-n", "3", "-c"}; + /* No -c flag at all */ + const char *argv2[] = { prgname, mp_flag, "-n", "3"}; + /* bad coremask value */ + const char *argv3[] = { prgname, mp_flag, "-n", "3", "-c", "error" }; + /* sanity check of tests - valid coremask value */ + const char *argv4[] = { prgname, mp_flag, "-n", "3", "-c", "1" }; + + if (launch_proc(argv1) == 0 + || launch_proc(argv2) == 0 + || launch_proc(argv3) == 0) { + printf("Error - process ran without error when missing -c flag\n"); + return -1; + } + if (launch_proc(argv4) != 0) { + printf("Error - process did not run ok with valid coremask value\n"); + return -1; + } + return 0; +} + +/* + * Test that the app doesn't run without the -n flag. In all cases + * should give an error and fail to run. + * Since -n is not compulsory for MP, we instead use --no-huge and --no-shconf + * flags. + */ +static int +test_missing_n_flag(void) +{ + /* -n flag but no value */ + const char *argv1[] = { prgname, no_huge, no_shconf, "-c", "1", "-n"}; + /* No -n flag at all */ + const char *argv2[] = { prgname, no_huge, no_shconf, "-c", "1"}; + /* bad numeric value */ + const char *argv3[] = { prgname, no_huge, no_shconf, "-c", "1", "-n", "e" }; + /* out-of-range value */ + const char *argv4[] = { prgname, no_huge, no_shconf, "-c", "1", "-n", "9" }; + /* sanity test - check with good value */ + const char *argv5[] = { prgname, no_huge, no_shconf, "-c", "1", "-n", "2" }; + + if (launch_proc(argv1) == 0 + || launch_proc(argv2) == 0 + || launch_proc(argv3) == 0 + || launch_proc(argv4) == 0) { + printf("Error - process ran without error when missing -n flag\n"); + return -1; + } + if (launch_proc(argv5) != 0) { + printf("Error - process did not run ok with valid num-channel value\n"); + return -1; + } + return 0; +} + +/* + * Test that the app runs with HPET, and without HPET + */ +static int +test_no_hpet_flag(void) +{ + /* With --no-hpet */ + const char *argv1[] = {prgname, mp_flag, no_hpet, "-c", "1", "-n", "2"}; + /* Without --no-hpet */ + const char *argv2[] = {prgname, mp_flag, "-c", "1", "-n", "2"}; + + if (launch_proc(argv1) != 0) { + printf("Error - process did not run ok with --no-hpet flag\n"); + return -1; + } + if (launch_proc(argv2) != 0) { + printf("Error - process did not run ok without --no-hpet flag\n"); + return -1; + } + return 0; +} + +static int +test_misc_flags(void) +{ + /* check that some general flags don't prevent things from working. + * All cases, apart from the first, app should run. + * No futher testing of output done. + */ + /* sanity check - failure with invalid option */ + const char *argv0[] = {prgname, mp_flag, "-c", "1", "--invalid-opt"}; + + /* With --no-pci */ + const char *argv1[] = {prgname, mp_flag, "-c", "1", "--no-pci"}; + /* With -v */ + const char *argv2[] = {prgname, mp_flag, "-c", "1", "-v"}; + /* With -m - ignored for secondary processes */ + const char *argv3[] = {prgname, mp_flag, "-c", "1", "-m", "32"}; + + if (launch_proc(argv0) == 0) { + printf("Error - process ran ok with invalid flag\n"); + return -1; + } + if (launch_proc(argv1) != 0) { + printf("Error - process did not run ok with --no-pci flag\n"); + return -1; + } + if (launch_proc(argv2) != 0) { + printf("Error - process did not run ok with -v flag\n"); + return -1; + } + if (launch_proc(argv3) != 0) { + printf("Error - process did not run ok with -m flag\n"); + return -1; + } + return 0; +} + +int +test_eal_flags(void) +{ + int ret = 0; + + ret = test_missing_c_flag(); + if (ret < 0) { + printf("Error in test_missing_c_flag()"); + return ret; + } + + ret = test_missing_n_flag(); + if (ret < 0) { + printf("Error in test_missing_n_flag()"); + return ret; + } + + ret = test_no_hpet_flag(); + if (ret < 0) { + printf("Error in test_no_hpet_flag()"); + return ret; + } + + ret = test_invalid_b_flag(); + if (ret < 0) { + printf("Error in test_invalid_b_flag()"); + return ret; + } + + ret = test_invalid_r_flag(); + if (ret < 0) { + printf("Error in test_invalid_r_flag()"); + return ret; + } + + ret = test_misc_flags(); + if (ret < 0) { + printf("Error in test_misc_flags()"); + return ret; + } + + return ret; +} + +#else +/* Baremetal version + * Multiprocess not applicable, so just return 0 always + */ +int +test_eal_flags(void) +{ + printf("Multi-process not possible for baremetal, cannot test EAL flags\n"); + return 0; +} + +#endif diff --git a/app/test/test_errno.c b/app/test/test_errno.c new file mode 100644 index 0000000..4233dc1 --- /dev/null +++ b/app/test/test_errno.c @@ -0,0 +1,110 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "test.h" + +int +test_errno(void) +{ + const char *rte_retval; + const char *libc_retval; + const char unknown_code_result[] = "Unknown error %d"; + char expected_libc_retval[sizeof(unknown_code_result)+3]; + + /* use a small selection of standard errors for testing */ + int std_errs[] = {EAGAIN, EBADF, EACCES, EINTR, EINVAL}; + /* test ALL registered RTE error codes for overlap */ + int rte_errs[] = {E_RTE_SECONDARY, E_RTE_NO_CONFIG, E_RTE_NO_TAILQ}; + unsigned i; + + rte_errno = 0; + if (rte_errno != 0) + return -1; + /* check for standard errors we return the same as libc */ + for (i = 0; i < sizeof(std_errs)/sizeof(std_errs[0]); i++){ + rte_retval = rte_strerror(std_errs[i]); + libc_retval = strerror(std_errs[i]); + printf("rte_strerror: '%s', strerror: '%s'\n", + rte_retval, libc_retval); + if (strcmp(rte_retval, libc_retval) != 0) + return -1; + } + /* for rte-specific errors ensure we return a different string + * and that the string for libc is for an unknown error + */ + for (i = 0; i < sizeof(rte_errs)/sizeof(rte_errs[0]); i++){ + rte_retval = rte_strerror(rte_errs[i]); + libc_retval = strerror(rte_errs[i]); + printf("rte_strerror: '%s', strerror: '%s'\n", + rte_retval, libc_retval); + if (strcmp(rte_retval, libc_retval) == 0) + return -1; + /* generate appropriate error string for unknown error number + * and then check that this is what we got back. If not, we have + * a duplicate error number that conflicts with errno.h */ + rte_snprintf(expected_libc_retval, sizeof(expected_libc_retval), + unknown_code_result, rte_errs[i]); + if (strcmp(expected_libc_retval, libc_retval) != 0){ + printf("Error, duplicate error code %d\n", rte_errs[i]); + return -1; + } + } + + /* ensure that beyond RTE_MAX_ERRNO, we always get an unknown code */ + rte_retval = rte_strerror(RTE_MAX_ERRNO + 1); + libc_retval = strerror(RTE_MAX_ERRNO + 1); + rte_snprintf(expected_libc_retval, sizeof(expected_libc_retval), + unknown_code_result, RTE_MAX_ERRNO + 1); + printf("rte_strerror: '%s', strerror: '%s'\n", + rte_retval, libc_retval); + if ((strcmp(rte_retval, libc_retval) != 0) || + (strcmp(expected_libc_retval, libc_retval) != 0)){ + printf("Failed test for RTE_MAX_ERRNO + 1 value\n"); + return -1; + } + + return 0; +} diff --git a/app/test/test_hash.c b/app/test/test_hash.c new file mode 100644 index 0000000..5992fa3 --- /dev/null +++ b/app/test/test_hash.c @@ -0,0 +1,1785 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "test.h" + +#ifdef RTE_LIBRTE_HASH + +/* Types of hash table performance test that can be performed */ +enum hash_test_t { + ADD_ON_EMPTY, /*< Add keys to empty table */ + DELETE_ON_EMPTY, /*< Attempt to delete keys from empty table */ + LOOKUP_ON_EMPTY, /*< Attempt to find keys in an empty table */ + ADD_UPDATE, /*< Add/update keys in a full table */ + DELETE, /*< Delete keys from a full table */ + LOOKUP /*< Find keys in a full table */ +}; + +/* Function type for hash table operations. */ +typedef int32_t (*hash_operation)(const struct rte_hash *h, const void *key); + +/* Structure to hold parameters used to run a hash table performance test */ +struct tbl_perf_test_params { + enum hash_test_t test_type; + uint32_t num_iterations; + uint32_t entries; + uint32_t bucket_entries; + uint32_t key_len; + rte_hash_function hash_func; + uint32_t hash_func_init_val; +}; + +#define ITERATIONS 10000 +#define LOCAL_FBK_HASH_ENTRIES_MAX (1 << 15) + +/******************************************************************************* + * Hash table performance test configuration section. + */ +struct tbl_perf_test_params tbl_perf_params[] = +{ +/* Small table, add */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_ON_EMPTY, 1024, 1024, 1, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 1, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 1, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 1, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 64, rte_jhash, 0}, +/* Small table, update */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_UPDATE, ITERATIONS, 1024, 1, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 1, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 1, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 1, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 64, rte_jhash, 0}, +/* Small table, lookup */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ LOOKUP, ITERATIONS, 1024, 1, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 1, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 1, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 1, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 64, rte_jhash, 0}, +/* Big table, add */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 16, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 32, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 48, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 64, rte_jhash, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 64, rte_jhash, 0}, +/* Big table, update */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 16, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 32, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 48, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 64, rte_jhash, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 64, rte_jhash, 0}, +/* Big table, lookup */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ LOOKUP, ITERATIONS, 1048576, 1, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 16, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 1, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 32, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 1, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 48, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 1, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 64, rte_jhash, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 64, rte_jhash, 0}, + +/* Small table, add */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_ON_EMPTY, 1024, 1024, 1, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 1, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 1, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 1, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 2, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 4, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 8, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1024, 1024, 16, 64, rte_hash_crc, 0}, +/* Small table, update */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_UPDATE, ITERATIONS, 1024, 1, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 1, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 1, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 1, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 2, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 4, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 8, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1024, 16, 64, rte_hash_crc, 0}, +/* Small table, lookup */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ LOOKUP, ITERATIONS, 1024, 1, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 1, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 1, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 1, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 2, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 4, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 8, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1024, 16, 64, rte_hash_crc, 0}, +/* Big table, add */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 16, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 32, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 48, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 1, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 2, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 4, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 8, 64, rte_hash_crc, 0}, +{ ADD_ON_EMPTY, 1048576, 1048576, 16, 64, rte_hash_crc, 0}, +/* Big table, update */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 16, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 32, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 48, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 1, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 2, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 4, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 8, 64, rte_hash_crc, 0}, +{ ADD_UPDATE, ITERATIONS, 1048576, 16, 64, rte_hash_crc, 0}, +/* Big table, lookup */ +/* Test type | Iterations | Entries | BucketSize | KeyLen | HashFunc | InitVal */ +{ LOOKUP, ITERATIONS, 1048576, 1, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 16, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 1, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 32, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 1, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 48, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 1, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 2, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 4, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 8, 64, rte_hash_crc, 0}, +{ LOOKUP, ITERATIONS, 1048576, 16, 64, rte_hash_crc, 0}, +}; + +/******************************************************************************/ + +/******************************************************************************* + * Hash function performance test configuration section. Each performance test + * will be performed HASHTEST_ITERATIONS times. + * + * The five arrays below control what tests are performed. Every combination + * from the array entries is tested. + */ +#define HASHTEST_ITERATIONS 1000000 + +#ifdef RTE_MACHINE_CPUFLAG_SSE4_2 +static rte_hash_function hashtest_funcs[] = {rte_jhash, rte_hash_crc}; +#else +static rte_hash_function hashtest_funcs[] = {rte_jhash}; +#endif +static uint32_t hashtest_initvals[] = {0}; +static uint32_t hashtest_key_lens[] = {2, 4, 5, 6, 7, 8, 10, 11, 15, 16, 21, 31, 32, 33, 63, 64}; +/******************************************************************************/ + +/* + * Check condition and return an error if true. Assumes that "handle" is the + * name of the hash structure pointer to be freed. + */ +#define RETURN_IF_ERROR(cond, str, ...) do { \ + if (cond) { \ + printf("ERROR line %d: " str "\n", __LINE__, ##__VA_ARGS__); \ + if (handle) rte_hash_free(handle); \ + return -1; \ + } \ +} while(0) + +#define RETURN_IF_ERROR_FBK(cond, str, ...) do { \ + if (cond) { \ + printf("ERROR line %d: " str "\n", __LINE__, ##__VA_ARGS__); \ + if (handle) rte_fbk_hash_free(handle); \ + return -1; \ + } \ +} while(0) + +/* 5-tuple key type */ +struct flow_key { + uint32_t ip_src; + uint32_t ip_dst; + uint16_t port_src; + uint16_t port_dst; + uint8_t proto; +} __attribute__((packed)); + +/* + * Hash function that always returns the same value, to easily test what + * happens when a bucket is full. + */ +static uint32_t pseudo_hash(__attribute__((unused)) const void *keys, + __attribute__((unused)) uint32_t key_len, + __attribute__((unused)) uint32_t init_val) +{ + return 3; +} + +/* + * Print out result of unit test hash operation. + */ +#if defined(UNIT_TEST_HASH_VERBOSE) +static void print_key_info(const char *msg, const struct flow_key *key, + int32_t pos) +{ + uint8_t *p = (uint8_t *)key; + unsigned i; + + printf("%s key:0x", msg); + for (i = 0; i < sizeof(struct flow_key); i++) { + printf("%02X", p[i]); + } + printf(" @ pos %d\n", pos); +} +#else +static void print_key_info(__attribute__((unused)) const char *msg, + __attribute__((unused)) const struct flow_key *key, + __attribute__((unused)) int32_t pos) +{ +} +#endif + +/* Keys used by unit test functions */ +static struct flow_key keys[5] = { { + .ip_src = IPv4(0x03, 0x02, 0x01, 0x00), + .ip_dst = IPv4(0x07, 0x06, 0x05, 0x04), + .port_src = 0x0908, + .port_dst = 0x0b0a, + .proto = 0x0c, +}, { + .ip_src = IPv4(0x13, 0x12, 0x11, 0x10), + .ip_dst = IPv4(0x17, 0x16, 0x15, 0x14), + .port_src = 0x1918, + .port_dst = 0x1b1a, + .proto = 0x1c, +}, { + .ip_src = IPv4(0x23, 0x22, 0x21, 0x20), + .ip_dst = IPv4(0x27, 0x26, 0x25, 0x24), + .port_src = 0x2928, + .port_dst = 0x2b2a, + .proto = 0x2c, +}, { + .ip_src = IPv4(0x33, 0x32, 0x31, 0x30), + .ip_dst = IPv4(0x37, 0x36, 0x35, 0x34), + .port_src = 0x3938, + .port_dst = 0x3b3a, + .proto = 0x3c, +}, { + .ip_src = IPv4(0x43, 0x42, 0x41, 0x40), + .ip_dst = IPv4(0x47, 0x46, 0x45, 0x44), + .port_src = 0x4948, + .port_dst = 0x4b4a, + .proto = 0x4c, +} }; + +/* Parameters used for hash table in unit test functions. Name set later. */ +static struct rte_hash_parameters ut_params = { + .entries = 64, + .bucket_entries = 4, + .key_len = sizeof(struct flow_key), /* 13 */ + .hash_func = rte_jhash, + .hash_func_init_val = 0, + .socket_id = 0, +}; + +/* + * Basic sequence of operations for a single key: + * - add + * - lookup (hit) + * - delete + * - lookup (miss) + */ +static int test_add_delete(void) +{ + struct rte_hash *handle; + int pos0, expectedPos0; + + ut_params.name = "test1"; + handle = rte_hash_create(&ut_params); + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); + + pos0 = rte_hash_add_key(handle, &keys[0]); + print_key_info("Add", &keys[0], pos0); + RETURN_IF_ERROR(pos0 < 0, "failed to add key (pos0=%d)", pos0); + expectedPos0 = pos0; + + pos0 = rte_hash_lookup(handle, &keys[0]); + print_key_info("Lkp", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != expectedPos0, + "failed to find key (pos0=%d)", pos0); + + pos0 = rte_hash_del_key(handle, &keys[0]); + print_key_info("Del", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != expectedPos0, + "failed to delete key (pos0=%d)", pos0); + + pos0 = rte_hash_lookup(handle, &keys[0]); + print_key_info("Lkp", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != -ENOENT, + "fail: found key after deleting! (pos0=%d)", pos0); + + rte_hash_free(handle); + return 0; +} + +/* + * Sequence of operations for a single key: + * - delete: miss + * - add + * - lookup: hit + * - add: update + * - lookup: hit (updated data) + * - delete: hit + * - delete: miss + * - lookup: miss + */ +static int test_add_update_delete(void) +{ + struct rte_hash *handle; + int pos0, expectedPos0; + + ut_params.name = "test2"; + handle = rte_hash_create(&ut_params); + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); + + pos0 = rte_hash_del_key(handle, &keys[0]); + print_key_info("Del", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != -ENOENT, + "fail: found non-existent key (pos0=%d)", pos0); + + pos0 = rte_hash_add_key(handle, &keys[0]); + print_key_info("Add", &keys[0], pos0); + RETURN_IF_ERROR(pos0 < 0, "failed to add key (pos0=%d)", pos0); + expectedPos0 = pos0; + + pos0 = rte_hash_lookup(handle, &keys[0]); + print_key_info("Lkp", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != expectedPos0, + "failed to find key (pos0=%d)", pos0); + + pos0 = rte_hash_add_key(handle, &keys[0]); + print_key_info("Add", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != expectedPos0, + "failed to re-add key (pos0=%d)", pos0); + + pos0 = rte_hash_lookup(handle, &keys[0]); + print_key_info("Lkp", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != expectedPos0, + "failed to find key (pos0=%d)", pos0); + + pos0 = rte_hash_del_key(handle, &keys[0]); + print_key_info("Del", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != expectedPos0, + "failed to delete key (pos0=%d)", pos0); + + pos0 = rte_hash_del_key(handle, &keys[0]); + print_key_info("Del", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != -ENOENT, + "fail: deleted already deleted key (pos0=%d)", pos0); + + pos0 = rte_hash_lookup(handle, &keys[0]); + print_key_info("Lkp", &keys[0], pos0); + RETURN_IF_ERROR(pos0 != -ENOENT, + "fail: found key after deleting! (pos0=%d)", pos0); + + rte_hash_free(handle); + return 0; +} + +/* + * Sequence of operations for find existing hash table + * + * - create table + * - find existing table: hit + * - find non-existing table: miss + * + */ +static int test_hash_find_existing(void) +{ + struct rte_hash *handle = NULL, *result = NULL; + + /* Create hash table. */ + ut_params.name = "hash_find_existing"; + handle = rte_hash_create(&ut_params); + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); + + /* Try to find existing hash table */ + result = rte_hash_find_existing("hash_find_existing"); + RETURN_IF_ERROR(result != handle, "could not find existing hash table"); + + /* Try to find non-existing hash table */ + result = rte_hash_find_existing("hash_find_non_existing"); + RETURN_IF_ERROR(!(result == NULL), "found table that shouldn't exist"); + + /* Cleanup. */ + rte_hash_free(handle); + + return 0; +} + +/* + * Sequence of operations for 5 keys + * - add keys + * - lookup keys: hit + * - add keys (update) + * - lookup keys: hit (updated data) + * - delete keys : hit + * - lookup keys: miss + */ +static int test_five_keys(void) +{ + struct rte_hash *handle; + const void *key_array[5] = {0}; + int pos[5]; + int expected_pos[5]; + unsigned i; + int ret; + + ut_params.name = "test3"; + handle = rte_hash_create(&ut_params); + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); + + /* Add */ + for (i = 0; i < 5; i++) { + pos[i] = rte_hash_add_key(handle, &keys[i]); + print_key_info("Add", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] < 0, + "failed to add key (pos[%u]=%d)", i, pos[i]); + expected_pos[i] = pos[i]; + } + + /* Lookup */ + for(i = 0; i < 5; i++) + key_array[i] = &keys[i]; + + ret = rte_hash_lookup_multi(handle, &key_array[0], 5, (int32_t *)pos); + if(ret == 0) + for(i = 0; i < 5; i++) { + print_key_info("Lkp", key_array[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + + /* Add - update */ + for (i = 0; i < 5; i++) { + pos[i] = rte_hash_add_key(handle, &keys[i]); + print_key_info("Add", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to add key (pos[%u]=%d)", i, pos[i]); + } + + /* Lookup */ + for (i = 0; i < 5; i++) { + pos[i] = rte_hash_lookup(handle, &keys[i]); + print_key_info("Lkp", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + + /* Delete */ + for (i = 0; i < 5; i++) { + pos[i] = rte_hash_del_key(handle, &keys[i]); + print_key_info("Del", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to delete key (pos[%u]=%d)", i, pos[i]); + } + + /* Lookup */ + for (i = 0; i < 5; i++) { + pos[i] = rte_hash_lookup(handle, &keys[i]); + print_key_info("Lkp", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != -ENOENT, + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + + rte_hash_free(handle); + + return 0; +} + +/* + * Add keys to the same bucket until bucket full. + * - add 5 keys to the same bucket (hash created with 4 keys per bucket): + * first 4 successful, 5th unsuccessful + * - lookup the 5 keys: 4 hits, 1 miss + * - add the 5 keys again: 4 OK, one error as bucket is full + * - lookup the 5 keys: 4 hits (updated data), 1 miss + * - delete the 5 keys: 5 OK (even if the 5th is not in the table) + * - lookup the 5 keys: 5 misses + * - add the 5th key: OK + * - lookup the 5th key: hit + */ +static int test_full_bucket(void) +{ + struct rte_hash_parameters params_pseudo_hash = { + .name = "test4", + .entries = 64, + .bucket_entries = 4, + .key_len = sizeof(struct flow_key), /* 13 */ + .hash_func = pseudo_hash, + .hash_func_init_val = 0, + .socket_id = 0, + }; + struct rte_hash *handle; + int pos[5]; + int expected_pos[5]; + unsigned i; + + handle = rte_hash_create(¶ms_pseudo_hash); + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); + + /* Fill bucket*/ + for (i = 0; i < 4; i++) { + pos[i] = rte_hash_add_key(handle, &keys[i]); + print_key_info("Add", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] < 0, + "failed to add key (pos[%u]=%d)", i, pos[i]); + expected_pos[i] = pos[i]; + } + /* This shouldn't work because the bucket is full */ + pos[4] = rte_hash_add_key(handle, &keys[4]); + print_key_info("Add", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] != -ENOSPC, + "fail: added key to full bucket (pos[4]=%d)", pos[4]); + + /* Lookup */ + for (i = 0; i < 4; i++) { + pos[i] = rte_hash_lookup(handle, &keys[i]); + print_key_info("Lkp", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + pos[4] = rte_hash_lookup(handle, &keys[4]); + print_key_info("Lkp", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] != -ENOENT, + "fail: found non-existent key (pos[4]=%d)", pos[4]); + + /* Add - update */ + for (i = 0; i < 4; i++) { + pos[i] = rte_hash_add_key(handle, &keys[i]); + print_key_info("Add", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to add key (pos[%u]=%d)", i, pos[i]); + } + pos[4] = rte_hash_add_key(handle, &keys[4]); + print_key_info("Add", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] != -ENOSPC, + "fail: added key to full bucket (pos[4]=%d)", pos[4]); + + /* Lookup */ + for (i = 0; i < 4; i++) { + pos[i] = rte_hash_lookup(handle, &keys[i]); + print_key_info("Lkp", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to find key (pos[%u]=%d)", i, pos[i]); + } + pos[4] = rte_hash_lookup(handle, &keys[4]); + print_key_info("Lkp", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] != -ENOENT, + "fail: found non-existent key (pos[4]=%d)", pos[4]); + + /* Delete 1 key, check other keys are still found */ + pos[1] = rte_hash_del_key(handle, &keys[1]); + print_key_info("Del", &keys[1], pos[1]); + RETURN_IF_ERROR(pos[1] != expected_pos[1], + "failed to delete key (pos[1]=%d)", pos[1]); + pos[3] = rte_hash_lookup(handle, &keys[3]); + print_key_info("Lkp", &keys[3], pos[3]); + RETURN_IF_ERROR(pos[3] != expected_pos[3], + "failed lookup after deleting key from same bucket " + "(pos[3]=%d)", pos[3]); + + /* Go back to previous state */ + pos[1] = rte_hash_add_key(handle, &keys[1]); + print_key_info("Add", &keys[1], pos[1]); + expected_pos[1] = pos[1]; + RETURN_IF_ERROR(pos[1] < 0, "failed to add key (pos[1]=%d)", pos[1]); + + /* Delete */ + for (i = 0; i < 4; i++) { + pos[i] = rte_hash_del_key(handle, &keys[i]); + print_key_info("Del", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != expected_pos[i], + "failed to delete key (pos[%u]=%d)", i, pos[i]); + } + pos[4] = rte_hash_del_key(handle, &keys[4]); + print_key_info("Del", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] != -ENOENT, + "fail: deleted non-existent key (pos[4]=%d)", pos[4]); + + /* Lookup */ + for (i = 0; i < 4; i++) { + pos[i] = rte_hash_lookup(handle, &keys[i]); + print_key_info("Lkp", &keys[i], pos[i]); + RETURN_IF_ERROR(pos[i] != -ENOENT, + "fail: found non-existent key (pos[%u]=%d)", i, pos[i]); + } + + /* Add and lookup the 5th key */ + pos[4] = rte_hash_add_key(handle, &keys[4]); + print_key_info("Add", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] < 0, "failed to add key (pos[4]=%d)", pos[4]); + expected_pos[4] = pos[4]; + pos[4] = rte_hash_lookup(handle, &keys[4]); + print_key_info("Lkp", &keys[4], pos[4]); + RETURN_IF_ERROR(pos[4] != expected_pos[4], + "failed to find key (pos[4]=%d)", pos[4]); + + rte_hash_free(handle); + + /* Cover the NULL case. */ + rte_hash_free(0); + return 0; +} + +/* + * To help print out name of hash functions. + */ +static const char *get_hash_name(rte_hash_function f) +{ + if (f == rte_jhash) + return "jhash"; + + if (f == rte_hash_crc) + return "rte_hash_crc"; + + return "UnknownHash"; +} + +/* + * Find average of array of numbers. + */ +static double +get_avg(const uint32_t *array, uint32_t size) +{ + double sum = 0; + unsigned i; + for (i = 0; i < size; i++) + sum += array[i]; + return sum / (double)size; +} + +/* + * Do a single performance test, of one type of operation. + * + * @param h + * hash table to run test on + * @param func + * function to call (add, delete or lookup function) + * @param avg_occupancy + * The average number of entries in each bucket of the hash table + * @param invalid_pos_count + * The amount of errors (e.g. due to a full bucket). + * @return + * The average number of ticks per hash function call. A negative number + * signifies failure. + */ +static double +run_single_tbl_perf_test(const struct rte_hash *h, hash_operation func, + const struct tbl_perf_test_params *params, double *avg_occupancy, + uint32_t *invalid_pos_count) +{ + uint64_t begin, end, ticks = 0; + uint8_t *key = NULL; + uint32_t *bucket_occupancies = NULL; + uint32_t num_buckets, i, j; + int32_t pos; + + /* Initialise */ + num_buckets = params->entries / params->bucket_entries; + key = (uint8_t *) rte_zmalloc("hash key", + params->key_len * sizeof(uint8_t), 16); + if (key == NULL) + return -1; + + bucket_occupancies = (uint32_t *) rte_zmalloc("bucket occupancies", + num_buckets * sizeof(uint32_t), 16); + if (bucket_occupancies == NULL) { + rte_free(key); + return -1; + } + + ticks = 0; + *invalid_pos_count = 0; + + for (i = 0; i < params->num_iterations; i++) { + /* Prepare inputs for the current iteration */ + for (j = 0; j < params->key_len; j++) + key[j] = (uint8_t) rte_rand(); + + /* Perform operation, and measure time it takes */ + begin = rte_rdtsc(); + pos = func(h, key); + end = rte_rdtsc(); + ticks += end - begin; + + /* Other work per iteration */ + if (pos < 0) + *invalid_pos_count += 1; + else + bucket_occupancies[pos / params->bucket_entries]++; + } + *avg_occupancy = get_avg(bucket_occupancies, num_buckets); + + rte_free(bucket_occupancies); + rte_free(key); + + return (double)ticks / params->num_iterations; +} + +/* + * To help print out what tests are being done. + */ +static const char * +get_tbl_perf_test_desc(enum hash_test_t type) +{ + switch (type){ + case ADD_ON_EMPTY: return "Add on Empty"; + case DELETE_ON_EMPTY: return "Delete on Empty"; + case LOOKUP_ON_EMPTY: return "Lookup on Empty"; + case ADD_UPDATE: return "Add Update"; + case DELETE: return "Delete"; + case LOOKUP: return "Lookup"; + default: return "UNKNOWN"; + } +} + +/* + * Run a hash table performance test based on params. + */ +static int +run_tbl_perf_test(struct tbl_perf_test_params *params) +{ + static unsigned calledCount = 5; + struct rte_hash_parameters hash_params = { + .entries = params->entries, + .bucket_entries = params->bucket_entries, + .key_len = params->key_len, + .hash_func = params->hash_func, + .hash_func_init_val = params->hash_func_init_val, + .socket_id = 0, + }; + struct rte_hash *handle; + double avg_occupancy = 0, ticks = 0; + uint32_t num_iterations, invalid_pos; + char name[RTE_HASH_NAMESIZE]; + char hashname[RTE_HASH_NAMESIZE]; + + rte_snprintf(name, 32, "test%u", calledCount++); + hash_params.name = name; + + handle = rte_hash_create(&hash_params); + RETURN_IF_ERROR(handle == NULL, "hash creation failed"); + + switch (params->test_type){ + case ADD_ON_EMPTY: + ticks = run_single_tbl_perf_test(handle, rte_hash_add_key, + params, &avg_occupancy, &invalid_pos); + break; + case DELETE_ON_EMPTY: + ticks = run_single_tbl_perf_test(handle, rte_hash_del_key, + params, &avg_occupancy, &invalid_pos); + break; + case LOOKUP_ON_EMPTY: + ticks = run_single_tbl_perf_test(handle, rte_hash_lookup, + params, &avg_occupancy, &invalid_pos); + break; + case ADD_UPDATE: + num_iterations = params->num_iterations; + params->num_iterations = params->entries; + run_single_tbl_perf_test(handle, rte_hash_add_key, params, + &avg_occupancy, &invalid_pos); + params->num_iterations = num_iterations; + ticks = run_single_tbl_perf_test(handle, rte_hash_add_key, + params, &avg_occupancy, &invalid_pos); + break; + case DELETE: + num_iterations = params->num_iterations; + params->num_iterations = params->entries; + run_single_tbl_perf_test(handle, rte_hash_add_key, params, + &avg_occupancy, &invalid_pos); + + params->num_iterations = num_iterations; + ticks = run_single_tbl_perf_test(handle, rte_hash_del_key, + params, &avg_occupancy, &invalid_pos); + break; + case LOOKUP: + num_iterations = params->num_iterations; + params->num_iterations = params->entries; + run_single_tbl_perf_test(handle, rte_hash_add_key, params, + &avg_occupancy, &invalid_pos); + + params->num_iterations = num_iterations; + ticks = run_single_tbl_perf_test(handle, rte_hash_lookup, + params, &avg_occupancy, &invalid_pos); + break; + default: return -1; + } + + rte_snprintf(hashname, RTE_HASH_NAMESIZE, "%s", get_hash_name(params->hash_func)); + + printf("%-12s, %-15s, %-16u, %-7u, %-18u, %-8u, %-19.2f, %.2f\n", + hashname, + get_tbl_perf_test_desc(params->test_type), + (unsigned) params->key_len, + (unsigned) params->entries, + (unsigned) params->bucket_entries, + (unsigned) invalid_pos, + avg_occupancy, + ticks + ); + + /* Free */ + rte_hash_free(handle); + return 0; +} + +/* + * Run all hash table performance tests. + */ +static int run_all_tbl_perf_tests(void) +{ + unsigned i; + + printf(" *** Hash table performance test results ***\n"); + printf("Hash Func. , Operation , Key size (bytes), Entries, " + "Entries per bucket, Errors , Avg. bucket entries, Ticks/Op.\n"); + + /* Loop through every combination of test parameters */ + for (i = 0; + i < sizeof(tbl_perf_params) / sizeof(struct tbl_perf_test_params); + i++) { + + /* Perform test */ + if (run_tbl_perf_test(&tbl_perf_params[i]) < 0) + return -1; + } + return 0; +} + +/* + * Test a hash function. + */ +static void run_hash_func_test(rte_hash_function f, uint32_t init_val, + uint32_t key_len) +{ + static uint8_t key[RTE_HASH_KEY_LENGTH_MAX]; + uint64_t ticks = 0, start, end; + unsigned i, j; + + for (i = 0; i < HASHTEST_ITERATIONS; i++) { + + for (j = 0; j < key_len; j++) + key[j] = (uint8_t) rte_rand(); + + start = rte_rdtsc(); + f(key, key_len, init_val); + end = rte_rdtsc(); + ticks += end - start; + } + + printf("%-12s, %-18u, %-13u, %.02f\n", get_hash_name(f), (unsigned) key_len, + (unsigned) init_val, (double)ticks / HASHTEST_ITERATIONS); +} + +/* + * Test all hash functions. + */ +static void run_hash_func_tests(void) +{ + unsigned i, j, k; + + printf("\n\n *** Hash function performance test results ***\n"); + printf(" Number of iterations for each test = %d\n", + HASHTEST_ITERATIONS); + printf("Hash Func. , Key Length (bytes), Initial value, Ticks/Op.\n"); + + for (i = 0; + i < sizeof(hashtest_funcs) / sizeof(rte_hash_function); + i++) { + for (j = 0; + j < sizeof(hashtest_initvals) / sizeof(uint32_t); + j++) { + for (k = 0; + k < sizeof(hashtest_key_lens) / sizeof(uint32_t); + k++) { + run_hash_func_test(hashtest_funcs[i], + hashtest_initvals[j], + hashtest_key_lens[k]); + } + } + } +} + +/******************************************************************************/ +static int +fbk_hash_unit_test(void) +{ + struct rte_fbk_hash_params params = { + .name = "fbk_hash_test", + .entries = LOCAL_FBK_HASH_ENTRIES_MAX, + .entries_per_bucket = 4, + .socket_id = 0, + }; + + struct rte_fbk_hash_params invalid_params_1 = { + .name = "invalid_1", + .entries = LOCAL_FBK_HASH_ENTRIES_MAX + 1, /* Not power of 2 */ + .entries_per_bucket = 4, + .socket_id = 0, + }; + + struct rte_fbk_hash_params invalid_params_2 = { + .name = "invalid_4", + .entries = 4, + .entries_per_bucket = 3, /* Not power of 2 */ + .socket_id = 0, + }; + + struct rte_fbk_hash_params invalid_params_3 = { + .name = "invalid_2", + .entries = 0, /* Entries is 0 */ + .entries_per_bucket = 4, + .socket_id = 0, + }; + + struct rte_fbk_hash_params invalid_params_4 = { + .name = "invalid_3", + .entries = LOCAL_FBK_HASH_ENTRIES_MAX, + .entries_per_bucket = 0, /* Entries per bucket is 0 */ + .socket_id = 0, + }; + + struct rte_fbk_hash_params invalid_params_5 = { + .name = "invalid_4", + .entries = 4, + .entries_per_bucket = 8, /* Entries per bucket > entries */ + .socket_id = 0, + }; + + struct rte_fbk_hash_params invalid_params_6 = { + .name = "invalid_5", + .entries = RTE_FBK_HASH_ENTRIES_MAX * 2, /* Entries > max allowed */ + .entries_per_bucket = 4, + .socket_id = 0, + }; + + struct rte_fbk_hash_params params_jhash = { + .name = "valid", + .entries = LOCAL_FBK_HASH_ENTRIES_MAX, + .entries_per_bucket = 4, + .socket_id = 0, + .hash_func = rte_jhash_1word, /* Tests for different hash_func */ + .init_val = RTE_FBK_HASH_INIT_VAL_DEFAULT, + }; + + struct rte_fbk_hash_params params_nohash = { + .name = "valid nohash", + .entries = LOCAL_FBK_HASH_ENTRIES_MAX, + .entries_per_bucket = 4, + .socket_id = 0, + .hash_func = 0, /* Tests for null hash_func */ + .init_val = RTE_FBK_HASH_INIT_VAL_DEFAULT, + }; + + struct rte_fbk_hash_table *handle; + uint32_t keys[5] = + {0xc6e18639, 0xe67c201c, 0xd4c8cffd, 0x44728691, 0xd5430fa9}; + uint16_t vals[5] = {28108, 5699, 38490, 2166, 61571}; + int status; + unsigned i; + double used_entries; + + /* Try creating hashes with invalid parameters */ + handle = rte_fbk_hash_create(&invalid_params_1); + RETURN_IF_ERROR_FBK(handle != NULL, "fbk hash creation should have failed"); + + handle = rte_fbk_hash_create(&invalid_params_2); + RETURN_IF_ERROR_FBK(handle != NULL, "fbk hash creation should have failed"); + + handle = rte_fbk_hash_create(&invalid_params_3); + RETURN_IF_ERROR_FBK(handle != NULL, "fbk hash creation should have failed"); + + handle = rte_fbk_hash_create(&invalid_params_4); + RETURN_IF_ERROR_FBK(handle != NULL, "fbk hash creation should have failed"); + + handle = rte_fbk_hash_create(&invalid_params_5); + RETURN_IF_ERROR_FBK(handle != NULL, "fbk hash creation should have failed"); + + handle = rte_fbk_hash_create(&invalid_params_6); + RETURN_IF_ERROR_FBK(handle != NULL, "fbk hash creation should have failed"); + + /* Create empty jhash hash. */ + handle = rte_fbk_hash_create(¶ms_jhash); + RETURN_IF_ERROR_FBK(handle == NULL, "fbk jhash hash creation failed"); + + /* Cleanup. */ + rte_fbk_hash_free(handle); + + /* Create empty jhash hash. */ + handle = rte_fbk_hash_create(¶ms_nohash); + RETURN_IF_ERROR_FBK(handle == NULL, "fbk nohash hash creation failed"); + + /* Cleanup. */ + rte_fbk_hash_free(handle); + + /* Create empty hash. */ + handle = rte_fbk_hash_create(¶ms); + RETURN_IF_ERROR_FBK(handle == NULL, "fbk hash creation failed"); + + used_entries = rte_fbk_hash_get_load_factor(handle) * LOCAL_FBK_HASH_ENTRIES_MAX; + RETURN_IF_ERROR_FBK((unsigned)used_entries != 0, \ + "load factor right after creation is not zero but it should be"); + /* Add keys. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_add_key(handle, keys[i], vals[i]); + RETURN_IF_ERROR_FBK(status != 0, "fbk hash add failed"); + } + + used_entries = rte_fbk_hash_get_load_factor(handle) * LOCAL_FBK_HASH_ENTRIES_MAX; + RETURN_IF_ERROR_FBK((unsigned)used_entries != (unsigned)((((double)5)/LOCAL_FBK_HASH_ENTRIES_MAX)*LOCAL_FBK_HASH_ENTRIES_MAX), \ + "load factor now is not as expected"); + /* Find value of added keys. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_lookup(handle, keys[i]); + RETURN_IF_ERROR_FBK(status != vals[i], + "fbk hash lookup failed"); + } + + /* Change value of added keys. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_add_key(handle, keys[i], vals[4 - i]); + RETURN_IF_ERROR_FBK(status != 0, "fbk hash update failed"); + } + + /* Find new values. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_lookup(handle, keys[i]); + RETURN_IF_ERROR_FBK(status != vals[4-i], + "fbk hash lookup failed"); + } + + /* Delete keys individually. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_delete_key(handle, keys[i]); + RETURN_IF_ERROR_FBK(status != 0, "fbk hash delete failed"); + } + + used_entries = rte_fbk_hash_get_load_factor(handle) * LOCAL_FBK_HASH_ENTRIES_MAX; + RETURN_IF_ERROR_FBK((unsigned)used_entries != 0, \ + "load factor right after deletion is not zero but it should be"); + /* Lookup should now fail. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_lookup(handle, keys[i]); + RETURN_IF_ERROR_FBK(status == 0, + "fbk hash lookup should have failed"); + } + + /* Add keys again. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_add_key(handle, keys[i], vals[i]); + RETURN_IF_ERROR_FBK(status != 0, "fbk hash add failed"); + } + + /* Make sure they were added. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_lookup(handle, keys[i]); + RETURN_IF_ERROR_FBK(status != vals[i], + "fbk hash lookup failed"); + } + + /* Clear all entries. */ + rte_fbk_hash_clear_all(handle); + + /* Lookup should fail. */ + for (i = 0; i < 5; i++) { + status = rte_fbk_hash_lookup(handle, keys[i]); + RETURN_IF_ERROR_FBK(status == 0, + "fbk hash lookup should have failed"); + } + + /* Cleanup. */ + rte_fbk_hash_free(handle); + + /* Cover the NULL case. */ + rte_fbk_hash_free(0); + + return 0; +} + +/* Control operation of performance testing of fbk hash. */ +#define LOAD_FACTOR 0.667 /* How full to make the hash table. */ +#define TEST_SIZE 1000000 /* How many operations to time. */ +#define TEST_ITERATIONS 30 /* How many measurements to take. */ +#define ENTRIES (1 << 15) /* How many entries. */ + +static int +fbk_hash_perf_test(void) +{ + struct rte_fbk_hash_params params = { + .name = "fbk_hash_test", + .entries = ENTRIES, + .entries_per_bucket = 4, + .socket_id = 0, + }; + struct rte_fbk_hash_table *handle; + uint32_t keys[ENTRIES] = {0}; + unsigned indexes[TEST_SIZE]; + uint64_t lookup_time = 0; + unsigned added = 0; + unsigned value = 0; + unsigned i, j; + + handle = rte_fbk_hash_create(¶ms); + RETURN_IF_ERROR_FBK(handle == NULL, "fbk hash creation failed"); + + /* Generate random keys and values. */ + for (i = 0; i < ENTRIES; i++) { + uint32_t key = (uint32_t)rte_rand(); + key = ((uint64_t)key << 32) | (uint64_t)rte_rand(); + uint16_t val = (uint16_t)rte_rand(); + + if (rte_fbk_hash_add_key(handle, key, val) == 0) { + keys[added] = key; + added++; + } + if (added > (LOAD_FACTOR * ENTRIES)) { + break; + } + } + + for (i = 0; i < TEST_ITERATIONS; i++) { + uint64_t begin; + uint64_t end; + + /* Generate random indexes into keys[] array. */ + for (j = 0; j < TEST_SIZE; j++) { + indexes[j] = rte_rand() % added; + } + + begin = rte_rdtsc(); + /* Do lookups */ + for (j = 0; j < TEST_SIZE; j++) { + value += rte_fbk_hash_lookup(handle, keys[indexes[j]]); + } + end = rte_rdtsc(); + lookup_time += (double)(end - begin); + } + + printf("\n\n *** FBK Hash function performance test results ***\n"); + /* + * The use of the 'value' variable ensures that the hash lookup is not + * being optimised out by the compiler. + */ + if (value != 0) + printf("Number of ticks per lookup = %g\n", + (double)lookup_time / + ((double)TEST_ITERATIONS * (double)TEST_SIZE)); + + rte_fbk_hash_free(handle); + + return 0; +} + +/* + * Sequence of operations for find existing fbk hash table + * + * - create table + * - find existing table: hit + * - find non-existing table: miss + * + */ +static int test_fbk_hash_find_existing(void) +{ + struct rte_fbk_hash_params params = { + .name = "fbk_hash_find_existing", + .entries = LOCAL_FBK_HASH_ENTRIES_MAX, + .entries_per_bucket = 4, + .socket_id = 0, + }; + struct rte_fbk_hash_table *handle = NULL, *result = NULL; + + /* Create hash table. */ + handle = rte_fbk_hash_create(¶ms); + RETURN_IF_ERROR_FBK(handle == NULL, "fbk hash creation failed"); + + /* Try to find existing fbk hash table */ + result = rte_fbk_hash_find_existing("fbk_hash_find_existing"); + RETURN_IF_ERROR_FBK(result != handle, "could not find existing fbk hash table"); + + /* Try to find non-existing fbk hash table */ + result = rte_fbk_hash_find_existing("fbk_hash_find_non_existing"); + RETURN_IF_ERROR_FBK(!(result == NULL), "found fbk table that shouldn't exist"); + + /* Cleanup. */ + rte_fbk_hash_free(handle); + + return 0; +} + +/* + * Do tests for hash creation with bad parameters. + */ +static int test_hash_creation_with_bad_parameters(void) +{ + struct rte_hash *handle; + struct rte_hash_parameters params; + + handle = rte_hash_create(NULL); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully without any parameter\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_0"; + params.entries = RTE_HASH_ENTRIES_MAX + 1; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully with entries in parameter exceeded\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_1"; + params.bucket_entries = RTE_HASH_BUCKET_ENTRIES_MAX + 1; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully with bucket_entries in parameter exceeded\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_2"; + params.entries = params.bucket_entries - 1; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully if entries less than bucket_entries in parameter\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_3"; + params.entries = params.entries - 1; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully if entries in parameter is not power of 2\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_4"; + params.bucket_entries = params.bucket_entries - 1; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully if bucket_entries in parameter is not power of 2\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_5"; + params.key_len = 0; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully if key_len in parameter is zero\n"); + return -1; + } + + memcpy(¶ms, &ut_params, sizeof(params)); + params.name = "creation_with_bad_parameters_6"; + params.key_len = RTE_HASH_KEY_LENGTH_MAX + 1; + handle = rte_hash_create(¶ms); + if (handle != NULL) { + rte_hash_free(handle); + printf("Impossible creating hash sucessfully if key_len is greater than the maximun\n"); + return -1; + } + + return 0; +} + +static uint8_t key[16] = {0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f}; +static struct rte_hash_parameters hash_params_ex = { + .name = NULL, + .entries = 64, + .bucket_entries = 4, + .key_len = 0, + .hash_func = NULL, + .hash_func_init_val = 0, + .socket_id = 0, +}; + +/* + * add/delete key with jhash2 + */ +static int +test_hash_add_delete_jhash2(void) +{ + int ret = -1; + struct rte_hash *handle; + int32_t pos1, pos2; + + hash_params_ex.name = "hash_test_jhash2"; + hash_params_ex.key_len = 4; + hash_params_ex.hash_func = (rte_hash_function)rte_jhash2; + + handle = rte_hash_create(&hash_params_ex); + if (handle == NULL) { + printf("test_hash_add_delete_jhash2 fail to create hash\n"); + goto fail_jhash2; + } + pos1 = rte_hash_add_key(handle, (void *)&key[0]); + if (pos1 < 0) { + printf("test_hash_add_delete_jhash2 fail to add hash key\n"); + goto fail_jhash2; + } + + pos2 = rte_hash_del_key(handle, (void *)&key[0]); + if (pos2 < 0 || pos1 != pos2) { + printf("test_hash_add_delete_jhash2 delete different key from being added\n"); + goto fail_jhash2; + } + ret = 0; + +fail_jhash2: + if (handle != NULL) + rte_hash_free(handle); + + return ret; +} + +/* + * add/delete (2) key with jhash2 + */ +static int +test_hash_add_delete_2_jhash2(void) +{ + int ret = -1; + struct rte_hash *handle; + int32_t pos1, pos2; + + hash_params_ex.name = "hash_test_2_jhash2"; + hash_params_ex.key_len = 8; + hash_params_ex.hash_func = (rte_hash_function)rte_jhash2; + + handle = rte_hash_create(&hash_params_ex); + if (handle == NULL) + goto fail_2_jhash2; + + pos1 = rte_hash_add_key(handle, (void *)&key[0]); + if (pos1 < 0) + goto fail_2_jhash2; + + pos2 = rte_hash_del_key(handle, (void *)&key[0]); + if (pos2 < 0 || pos1 != pos2) + goto fail_2_jhash2; + + ret = 0; + +fail_2_jhash2: + if (handle != NULL) + rte_hash_free(handle); + + return ret; +} + +static uint32_t +test_hash_jhash_1word(const void *key, uint32_t length, uint32_t initval) +{ + const uint32_t *k = key; + + length =length; + + return rte_jhash_1word(k[0], initval); +} + +static uint32_t +test_hash_jhash_2word(const void *key, uint32_t length, uint32_t initval) +{ + const uint32_t *k = key; + + length =length; + + return rte_jhash_2words(k[0], k[1], initval); +} + +static uint32_t +test_hash_jhash_3word(const void *key, uint32_t length, uint32_t initval) +{ + const uint32_t *k = key; + + length =length; + + return rte_jhash_3words(k[0], k[1], k[2], initval); +} + +/* + * add/delete key with jhash 1word + */ +static int +test_hash_add_delete_jhash_1word(void) +{ + int ret = -1; + struct rte_hash *handle; + int32_t pos1, pos2; + + hash_params_ex.name = "hash_test_jhash_1word"; + hash_params_ex.key_len = 4; + hash_params_ex.hash_func = test_hash_jhash_1word; + + handle = rte_hash_create(&hash_params_ex); + if (handle == NULL) + goto fail_jhash_1word; + + pos1 = rte_hash_add_key(handle, (void *)&key[0]); + if (pos1 < 0) + goto fail_jhash_1word; + + pos2 = rte_hash_del_key(handle, (void *)&key[0]); + if (pos2 < 0 || pos1 != pos2) + goto fail_jhash_1word; + + ret = 0; + +fail_jhash_1word: + if (handle != NULL) + rte_hash_free(handle); + + return ret; +} + +/* + * add/delete key with jhash 2word + */ +static int +test_hash_add_delete_jhash_2word(void) +{ + int ret = -1; + struct rte_hash *handle; + int32_t pos1, pos2; + + hash_params_ex.name = "hash_test_jhash_2word"; + hash_params_ex.key_len = 8; + hash_params_ex.hash_func = test_hash_jhash_2word; + + handle = rte_hash_create(&hash_params_ex); + if (handle == NULL) + goto fail_jhash_2word; + + pos1 = rte_hash_add_key(handle, (void *)&key[0]); + if (pos1 < 0) + goto fail_jhash_2word; + + pos2 = rte_hash_del_key(handle, (void *)&key[0]); + if (pos2 < 0 || pos1 != pos2) + goto fail_jhash_2word; + + ret = 0; + +fail_jhash_2word: + if (handle != NULL) + rte_hash_free(handle); + + return ret; +} + +/* + * add/delete key with jhash 3word + */ +static int +test_hash_add_delete_jhash_3word(void) +{ + int ret = -1; + struct rte_hash *handle; + int32_t pos1, pos2; + + hash_params_ex.name = "hash_test_jhash_3word"; + hash_params_ex.key_len = 12; + hash_params_ex.hash_func = test_hash_jhash_3word; + + handle = rte_hash_create(&hash_params_ex); + if (handle == NULL) + goto fail_jhash_3word; + + pos1 = rte_hash_add_key(handle, (void *)&key[0]); + if (pos1 < 0) + goto fail_jhash_3word; + + pos2 = rte_hash_del_key(handle, (void *)&key[0]); + if (pos2 < 0 || pos1 != pos2) + goto fail_jhash_3word; + + ret = 0; + +fail_jhash_3word: + if (handle != NULL) + rte_hash_free(handle); + + return ret; +} + +/* + * Do all unit and performance tests. + */ +int test_hash(void) +{ + if (test_add_delete() < 0) + return -1; + if (test_hash_add_delete_jhash2() < 0) + return -1; + if (test_hash_add_delete_2_jhash2() < 0) + return -1; + if (test_hash_add_delete_jhash_1word() < 0) + return -1; + if (test_hash_add_delete_jhash_2word() < 0) + return -1; + if (test_hash_add_delete_jhash_3word() < 0) + return -1; + if (test_hash_find_existing() < 0) + return -1; + if (test_add_update_delete() < 0) + return -1; + if (test_five_keys() < 0) + return -1; + if (test_full_bucket() < 0) + return -1; + if (run_all_tbl_perf_tests() < 0) + return -1; + run_hash_func_tests(); + + if (test_fbk_hash_find_existing() < 0) + return -1; + if (fbk_hash_unit_test() < 0) + return -1; + if (fbk_hash_perf_test() < 0) + return -1; + if (test_hash_creation_with_bad_parameters() < 0) + return -1; + return 0; +} +#else + +int +test_hash(void) +{ + printf("The Hash library is not included in this build\n"); + return 0; +} + +#endif diff --git a/app/test/test_interrupts.c b/app/test/test_interrupts.c new file mode 100644 index 0000000..c52ec71 --- /dev/null +++ b/app/test/test_interrupts.c @@ -0,0 +1,419 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include + +#include + +#include +#include +#include + +#include "test.h" + +#define TEST_INTERRUPT_CHECK_INTERVAL 1000 /* ms */ + +enum test_interrupt_handl_type { + TEST_INTERRUPT_HANDLE_INVALID, + TEST_INTERRUPT_HANDLE_VALID, + TEST_INTERRUPT_HANDLE_CASE1, + TEST_INTERRUPT_HANDLE_MAX +}; + +static volatile int flag; +static struct rte_intr_handle intr_handles[TEST_INTERRUPT_HANDLE_MAX]; + +#ifdef RTE_EXEC_ENV_LINUXAPP +union intr_pipefds{ + struct { + int pipefd[2]; + }; + struct { + int readfd; + int writefd; + }; +}; + +static union intr_pipefds pfds; + +static inline int +test_interrupt_handle_sanity_check(struct rte_intr_handle *intr_handle) +{ + if (!intr_handle || intr_handle->fd < 0) + return -1; + + return 0; +} + +static int +test_interrupt_init(void) +{ + if (pipe(pfds.pipefd) < 0) + return -1; + + intr_handles[TEST_INTERRUPT_HANDLE_INVALID].fd = -1; + intr_handles[TEST_INTERRUPT_HANDLE_INVALID].type = RTE_INTR_HANDLE_UNKNOWN; + + intr_handles[TEST_INTERRUPT_HANDLE_VALID].fd = pfds.readfd; + intr_handles[TEST_INTERRUPT_HANDLE_VALID].type = RTE_INTR_HANDLE_UNKNOWN; + + intr_handles[TEST_INTERRUPT_HANDLE_CASE1].fd = pfds.readfd; + intr_handles[TEST_INTERRUPT_HANDLE_CASE1].type = RTE_INTR_HANDLE_ALARM; + + return 0; +} + +static int +test_interrupt_deinit(void) +{ + close(pfds.pipefd[0]); + close(pfds.pipefd[1]); + + return 0; +} + +static int +test_interrupt_trigger_interrupt(void) +{ + if (write(pfds.writefd, "1", 1) < 0) + return -1; + + return 0; +} + +static int +test_interrupt_handle_compare(struct rte_intr_handle *intr_handle_l, + struct rte_intr_handle *intr_handle_r) +{ + if (!intr_handle_l || !intr_handle_r) + return -1; + + if (intr_handle_l->fd != intr_handle_r->fd || + intr_handle_l->type != intr_handle_r->type) + return -1; + + return 0; +} + +#else +/* to be implemented for baremetal later */ +static inline int +test_interrupt_handle_sanity_check(struct rte_intr_handle *intr_handle) +{ + RTE_SET_USED(intr_handle); + + return 0; +} + +static int +test_interrupt_init(void) +{ + return 0; +} + +static int +test_interrupt_deinit(void) +{ + return 0; +} + +static int +test_interrupt_trigger_interrupt(void) +{ + return 0; +} + +static int +test_interrupt_handle_compare(struct rte_intr_handle *intr_handle_l, + struct rte_intr_handle *intr_handle_r) +{ + (void)intr_handle_l; + (void)intr_handle_r; + + return 0; +} +#endif /* RTE_EXEC_ENV_LINUXAPP */ + +static void +test_interrupt_callback(struct rte_intr_handle *intr_handle, void *arg) +{ + if (test_interrupt_handle_sanity_check(intr_handle) < 0) { + printf("null or invalid intr_handle for %s\n", __FUNCTION__); + return; + } + + if (rte_intr_callback_unregister(intr_handle, + test_interrupt_callback, arg) <= 0) { + printf("fail to unregister callback\n"); + return; + } + + if (test_interrupt_handle_compare(intr_handle, + &(intr_handles[TEST_INTERRUPT_HANDLE_VALID])) == 0) { + flag = 1; + } +} + +static void +test_interrupt_callback_1(struct rte_intr_handle *intr_handle, void *arg) +{ + if (test_interrupt_handle_sanity_check(intr_handle) < 0) { + printf("null or invalid intr_handle for %s\n", __FUNCTION__); + return; + } + if (rte_intr_callback_unregister(intr_handle, + test_interrupt_callback_1, arg) <= 0) { + printf("fail to unregister callback\n"); + return; + } +} + +static int +test_interrupt_enable(void) +{ + struct rte_intr_handle test_intr_handle; + + /* check with null intr_handle */ + if (rte_intr_enable(NULL) == 0) { + printf("unexpectedly enable null intr_handle successfully\n"); + return -1; + } + + /* check with invalid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_INVALID]; + if (rte_intr_enable(&test_intr_handle) == 0) { + printf("unexpectedly enable invalid intr_handle " + "successfully\n"); + return -1; + } + + /* check with valid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_VALID]; + if (rte_intr_enable(&test_intr_handle) == 0) { + printf("unexpectedly enable a specific intr_handle " + "successfully\n"); + return -1; + } + + /* check with specific valid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_CASE1]; + if (rte_intr_enable(&test_intr_handle) == 0) { + printf("unexpectedly enable a specific intr_handle " + "successfully\n"); + return -1; + } + + return 0; +} + +static int +test_interrupt_disable(void) +{ + struct rte_intr_handle test_intr_handle; + + /* check with null intr_handle */ + if (rte_intr_disable(NULL) == 0) { + printf("unexpectedly disable null intr_handle " + "successfully\n"); + return -1; + } + + /* check with invalid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_INVALID]; + if (rte_intr_disable(&test_intr_handle) == 0) { + printf("unexpectedly disable invalid intr_handle " + "successfully\n"); + return -1; + } + + /* check with valid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_VALID]; + if (rte_intr_disable(&test_intr_handle) == 0) { + printf("unexpectedly disable a specific intr_handle " + "successfully\n"); + return -1; + } + + /* check with specific valid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_CASE1]; + if (rte_intr_disable(&test_intr_handle) == 0) { + printf("unexpectedly disable a specific intr_handle " + "successfully\n"); + return -1; + } + + return 0; +} + +int +test_interrupt(void) +{ + int count = 0, ret = -1; + struct rte_intr_handle test_intr_handle; + + if (test_interrupt_init() < 0) { + printf("fail to do test init\n"); + return -1; + } + + printf("check if callback registered can be called\n"); + + /* check if callback registered can be called */ + flag = 0; + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_VALID]; + if (rte_intr_callback_register(&test_intr_handle, + test_interrupt_callback, NULL) < 0) { + printf("fail to register callback\n"); + goto out; + } + /* trigger an interrupt and then check if the callback can be called */ + if (test_interrupt_trigger_interrupt() < 0) { + printf("fail to trigger an interrupt\n"); + goto out; + } + /* check flag in 3 seconds */ + while (flag == 0 && count++ < 3) + rte_delay_ms(TEST_INTERRUPT_CHECK_INTERVAL); + if (flag == 0) { + printf("registered callback has not been called\n"); + goto out; + } + rte_delay_ms(1000); + + printf("start register/unregister test\n"); + + /* check if it will fail to register cb with intr_handle = NULL */ + if (rte_intr_callback_register(NULL, test_interrupt_callback, + NULL) == 0) { + printf("unexpectedly register successfully with null " + "intr_handle\n"); + goto out; + } + + /* check if it will fail to register cb with invalid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_INVALID]; + if (rte_intr_callback_register(&test_intr_handle, + test_interrupt_callback, NULL) == 0) { + printf("unexpectedly register successfully with invalid " + "intr_handle\n"); + goto out; + } + + /* check if it will fail to register without callback */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_VALID]; + if (rte_intr_callback_register(&test_intr_handle, NULL, NULL) == 0) { + printf("unexpectedly register successfully with " + "null callback\n"); + goto out; + } + + /* check if it will fail to unregister cb with intr_handle = NULL */ + if (rte_intr_callback_unregister(NULL, + test_interrupt_callback, NULL) > 0) { + printf("unexpectedly unregister successfully with " + "null intr_handle\n"); + goto out; + } + + /* check if it will fail to unregister cb with invalid intr_handle */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_INVALID]; + if (rte_intr_callback_unregister(&test_intr_handle, + test_interrupt_callback, NULL) > 0) { + printf("unexpectedly unregister successfully with " + "invalid intr_handle\n"); + goto out; + } + + /* check if it is ok to register the same intr_handle twice */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_VALID]; + if (rte_intr_callback_register(&test_intr_handle, + test_interrupt_callback, NULL) < 0) { + printf("it fails to register test_interrupt_callback\n"); + goto out; + } + if (rte_intr_callback_register(&test_intr_handle, + test_interrupt_callback_1, NULL) < 0) { + printf("it fails to register test_interrupt_callback_1\n"); + goto out; + } + /* check if it will fail to unregister with invalid parameter */ + if (rte_intr_callback_unregister(&test_intr_handle, + test_interrupt_callback, (void *)0xff) != 0) { + printf("unexpectedly unregisters successfully with invalid arg\n"); + goto out; + } + if (rte_intr_callback_unregister(&test_intr_handle, + test_interrupt_callback, NULL) <= 0) { + printf("it fails to unregister test_interrupt_callback\n"); + goto out; + } + if (rte_intr_callback_unregister(&test_intr_handle, + test_interrupt_callback_1, (void *)-1) <= 0) { + printf("it fails to unregister test_interrupt_callback_1 " + "for all\n"); + goto out; + } + rte_delay_ms(1000); + + printf("start interrupt enable/disable test\n"); + + /* check interrupt enable/disable functions */ + if (test_interrupt_enable() < 0) + goto out; + rte_delay_ms(1000); + + if (test_interrupt_disable() < 0) + goto out; + rte_delay_ms(1000); + + ret = 0; + +out: + /* clear registered callbacks */ + test_intr_handle = intr_handles[TEST_INTERRUPT_HANDLE_VALID]; + rte_intr_callback_unregister(&test_intr_handle, + test_interrupt_callback, (void *)-1); + rte_intr_callback_unregister(&test_intr_handle, + test_interrupt_callback_1, (void *)-1); + + rte_delay_ms(2000); + /* deinit */ + test_interrupt_deinit(); + + return ret; +} + diff --git a/app/test/test_logs.c b/app/test/test_logs.c new file mode 100644 index 0000000..c5aac9c --- /dev/null +++ b/app/test/test_logs.c @@ -0,0 +1,96 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "test.h" + +#define RTE_LOGTYPE_TESTAPP1 RTE_LOGTYPE_USER1 +#define RTE_LOGTYPE_TESTAPP2 RTE_LOGTYPE_USER2 + +/* + * Logs + * ==== + * + * - Enable log types. + * - Set log level. + * - Send logs with different types and levels, some should not be displayed. + */ + +int +test_logs(void) +{ + /* enable these logs type */ + rte_set_log_type(RTE_LOGTYPE_TESTAPP1, 1); + rte_set_log_type(RTE_LOGTYPE_TESTAPP2, 1); + + /* log in debug level */ + rte_set_log_level(RTE_LOG_DEBUG); + RTE_LOG(DEBUG, TESTAPP1, "this is a debug level message\n"); + RTE_LOG(INFO, TESTAPP1, "this is a info level message\n"); + RTE_LOG(WARNING, TESTAPP1, "this is a warning level message\n"); + + /* log in info level */ + rte_set_log_level(RTE_LOG_INFO); + RTE_LOG(DEBUG, TESTAPP2, "debug level message (not displayed)\n"); + RTE_LOG(INFO, TESTAPP2, "this is a info level message\n"); + RTE_LOG(WARNING, TESTAPP2, "this is a warning level message\n"); + + /* disable one log type */ + rte_set_log_type(RTE_LOGTYPE_TESTAPP2, 0); + + /* log in debug level */ + rte_set_log_level(RTE_LOG_DEBUG); + RTE_LOG(DEBUG, TESTAPP1, "this is a debug level message\n"); + RTE_LOG(DEBUG, TESTAPP2, "debug level message (not displayed)\n"); + + rte_log_dump_history(); + + return 0; +} diff --git a/app/test/test_lpm.c b/app/test/test_lpm.c new file mode 100644 index 0000000..3a9400f --- /dev/null +++ b/app/test/test_lpm.c @@ -0,0 +1,1365 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef RTE_LIBRTE_LPM + +#include "rte_lpm.h" +#include "test_lpm_routes.h" + +#include "test.h" + +#define ITERATIONS (1 << 20) +#define BATCH_SIZE (1 << 13) + +#define TEST_LPM_ASSERT(cond) do { \ + if (!(cond)) { \ + printf("Error at line %d: \n", __LINE__); \ + return -1; \ + } \ +} while(0) + + + +typedef int32_t (* rte_lpm_test)(void); + +static int32_t test0(void); +static int32_t test1(void); +static int32_t test2(void); +static int32_t test3(void); +static int32_t test4(void); +static int32_t test5(void); +static int32_t test6(void); +static int32_t test7(void); +static int32_t test8(void); +static int32_t test9(void); +static int32_t test10(void); +static int32_t test11(void); +static int32_t test12(void); +static int32_t test13(void); +static int32_t test14(void); +static int32_t test15(void); +static int32_t test16(void); +static int32_t test17(void); +static int32_t test18(void); + +rte_lpm_test tests[] = { +/* Test Cases */ + test0, + test1, + test2, + test3, + test4, + test5, + test6, + test7, + test8, + test9, + test10, + test11, + test12, + test13, + test14, + test15, + test16, + test17, + test18 +}; + +#define NUM_LPM_TESTS (sizeof(tests)/sizeof(tests[0])) +#define MAX_DEPTH 32 +#define MAX_RULES 256 +#define PASS 0 + +/* + * TEST 0 + * + * Check that rte_lpm_create fails gracefully for incorrect user input + * arguments + */ +int32_t +test0(void) +{ + struct rte_lpm *lpm = NULL; + + /* rte_lpm_create: lpm name == NULL */ + lpm = rte_lpm_create(NULL, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm == NULL); + + /* rte_lpm_create: max_rules = 0 */ + /* Note: __func__ inserts the function name, in this case "test0". */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 0, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm == NULL); + + /* rte_lpm_create: mem_location is not RTE_LPM_HEAP or not MEMZONE */ + /* Note: __func__ inserts the function name, in this case "test0". */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, 2); + TEST_LPM_ASSERT(lpm == NULL); + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, -1); + TEST_LPM_ASSERT(lpm == NULL); + + /* socket_id < -1 is invalid */ + lpm = rte_lpm_create(__func__, -2, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm == NULL); + + return PASS; +} + +/* TEST 1 + * + * Create lpm table then delete lpm table 100 times + * Use a slightly different rules size each time + * */ +int32_t +test1(void) +{ + struct rte_lpm *lpm = NULL; + int32_t i; + + /* rte_lpm_free: Free NULL */ + for (i = 0; i < 100; i++) { + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES - i, + RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + rte_lpm_free(lpm); + } + + /* Can not test free so return success */ + return PASS; +} + +/* TEST 2 + * + * Call rte_lpm_free for NULL pointer user input. Note: free has no return and + * therefore it is impossible to check for failure but this test is added to + * increase function coverage metrics and to validate that freeing null does + * not crash. + */ +int32_t +test2(void) +{ + struct rte_lpm *lpm = NULL; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + rte_lpm_free(lpm); + rte_lpm_free(NULL); + return PASS; +} + +/* TEST 3 + * + * Check that rte_lpm_add fails gracefully for incorrect user input arguments + */ +int32_t +test3(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip = IPv4(0, 0, 0, 0); + uint8_t depth = 24, next_hop = 100; + int32_t status = 0; + + /* rte_lpm_add: lpm == NULL */ + status = rte_lpm_add(NULL, ip, depth, next_hop); + TEST_LPM_ASSERT(status < 0); + + /*Create vaild lpm to use in rest of test. */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + /* rte_lpm_add: depth < 1 */ + status = rte_lpm_add(lpm, ip, 0, next_hop); + TEST_LPM_ASSERT(status < 0); + + /* rte_lpm_add: depth > MAX_DEPTH */ + status = rte_lpm_add(lpm, ip, (MAX_DEPTH + 1), next_hop); + TEST_LPM_ASSERT(status < 0); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 4 + * + * Check that rte_lpm_delete fails gracefully for incorrect user input + * arguments + */ +int32_t +test4(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip = IPv4(0, 0, 0, 0); + uint8_t depth = 24; + int32_t status = 0; + + /* rte_lpm_delete: lpm == NULL */ + status = rte_lpm_delete(NULL, ip, depth); + TEST_LPM_ASSERT(status < 0); + + /*Create vaild lpm to use in rest of test. */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + /* rte_lpm_delete: depth < 1 */ + status = rte_lpm_delete(lpm, ip, 0); + TEST_LPM_ASSERT(status < 0); + + /* rte_lpm_delete: depth > MAX_DEPTH */ + status = rte_lpm_delete(lpm, ip, (MAX_DEPTH + 1)); + TEST_LPM_ASSERT(status < 0); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 5 + * + * Check that rte_lpm_lookup fails gracefully for incorrect user input + * arguments + */ +int32_t +test5(void) +{ +#if defined(RTE_LIBRTE_LPM_DEBUG) + struct rte_lpm *lpm = NULL; + uint32_t ip = IPv4(0, 0, 0, 0); + uint8_t next_hop_return = 0; + int32_t status = 0; + + /* rte_lpm_lookup: lpm == NULL */ + status = rte_lpm_lookup(NULL, ip, &next_hop_return); + TEST_LPM_ASSERT(status < 0); + + /*Create vaild lpm to use in rest of test. */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + /* rte_lpm_lookup: depth < 1 */ + status = rte_lpm_lookup(lpm, ip, NULL); + TEST_LPM_ASSERT(status < 0); + + rte_lpm_free(lpm); +#endif + return PASS; +} + + + +/* TEST 6 + * + * Call add, lookup and delete for a single rule with depth <= 24 + */ +int32_t +test6(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip = IPv4(0, 0, 0, 0); + uint8_t depth = 24, next_hop_add = 100, next_hop_return = 0; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 7 + * + * Call add, lookup and delete for a single rule with depth > 24 + */ + +int32_t +test7(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip = IPv4(0, 0, 0, 0); + uint8_t depth = 32, next_hop_add = 100, next_hop_return = 0; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 8 + * + * Use rte_lpm_add to add rules which effect only the second half of the lpm + * table. Use all possible depths ranging from 1..32. Set the next hop = to the + * depth. Check lookup hit for on every add and check for lookup miss on the + * first half of the lpm table after each add. Finally delete all rules going + * backwards (i.e. from depth = 32 ..1) and carry out a lookup after each + * delete. The lookup should return the next_hop_add value related to the + * previous depth value (i.e. depth -1). + */ +int32_t +test8(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip1 = IPv4(127, 255, 255, 255), ip2 = IPv4(128, 0, 0, 0); + uint8_t depth, next_hop_add, next_hop_return; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + /* Loop with rte_lpm_add. */ + for (depth = 1; depth <= 32; depth++) { + /* Let the next_hop_add value = depth. Just for change. */ + next_hop_add = depth; + + status = rte_lpm_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_lpm_lookup(lpm, ip1, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + status = rte_lpm_lookup(lpm, ip2, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && + (next_hop_return == next_hop_add)); + } + + /* Loop with rte_lpm_delete. */ + for (depth = 32; depth >= 1; depth--) { + next_hop_add = (uint8_t) (depth - 1); + + status = rte_lpm_delete(lpm, ip2, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip2, &next_hop_return); + + if (depth != 1) { + TEST_LPM_ASSERT((status == 0) && + (next_hop_return == next_hop_add)); + } + else { + TEST_LPM_ASSERT(status == -ENOENT); + } + + status = rte_lpm_lookup(lpm, ip1, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + } + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 9 + * + * - Add & lookup to hit invalid TBL24 entry + * - Add & lookup to hit valid TBL24 entry not extended + * - Add & lookup to hit valid extended TBL24 entry with invalid TBL8 entry + * - Add & lookup to hit valid extended TBL24 entry with valid TBL8 entry + * + */ +int32_t +test9(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip, ip_1, ip_2; + uint8_t depth, depth_1, depth_2, next_hop_add, next_hop_add_1, + next_hop_add_2, next_hop_return; + int32_t status = 0; + + /* Add & lookup to hit invalid TBL24 entry */ + ip = IPv4(128, 0, 0, 0); + depth = 24; + next_hop_add = 100; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Add & lookup to hit valid TBL24 entry not extended */ + ip = IPv4(128, 0, 0, 0); + depth = 23; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_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_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + depth = 24; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + depth = 23; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Add & lookup to hit valid extended TBL24 entry with invalid TBL8 + * entry */ + ip = IPv4(128, 0, 0, 0); + depth = 32; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + ip = IPv4(128, 0, 0, 5); + depth = 32; + next_hop_add = 101; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + ip = IPv4(128, 0, 0, 0); + depth = 32; + next_hop_add = 100; + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Add & lookup to hit valid extended TBL24 entry with valid TBL8 + * entry */ + ip_1 = IPv4(128, 0, 0, 0); + depth_1 = 25; + next_hop_add_1 = 101; + + ip_2 = IPv4(128, 0, 0, 5); + depth_2 = 32; + next_hop_add_2 = 102; + + next_hop_return = 0; + + status = rte_lpm_add(lpm, ip_1, depth_1, next_hop_add_1); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip_1, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_1)); + + status = rte_lpm_add(lpm, ip_2, depth_2, next_hop_add_2); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip_2, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_2)); + + status = rte_lpm_delete(lpm, ip_2, depth_2); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip_2, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_1)); + + status = rte_lpm_delete(lpm, ip_1, depth_1); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip_1, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_free(lpm); + + return PASS; +} + + +/* TEST 10 + * + * - Add rule that covers a TBL24 range previously invalid & lookup (& delete & + * lookup) + * - Add rule that extends a TBL24 invalid entry & lookup (& delete & lookup) + * - Add rule that extends a TBL24 valid entry & lookup for both rules (& + * delete & lookup) + * - Add rule that updates the next hop in TBL24 & lookup (& delete & lookup) + * - Add rule that updates the next hop in TBL8 & lookup (& delete & lookup) + * - Delete a rule that is not present in the TBL24 & lookup + * - Delete a rule that is not present in the TBL8 & lookup + * + */ +int32_t +test10(void) +{ + + struct rte_lpm *lpm = NULL; + uint32_t ip; + uint8_t depth, next_hop_add, next_hop_return; + int32_t status = 0; + + /* Add rule that covers a TBL24 range previously invalid & lookup + * (& delete & lookup) */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + ip = IPv4(128, 0, 0, 0); + depth = 16; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + ip = IPv4(128, 0, 0, 0); + depth = 25; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + rte_lpm_delete_all(lpm); + + /* Add rule that extends a TBL24 valid entry & lookup for both rules + * (& delete & lookup) */ + + ip = IPv4(128, 0, 0, 0); + depth = 24; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + ip = IPv4(128, 0, 0, 10); + depth = 32; + next_hop_add = 101; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + ip = IPv4(128, 0, 0, 0); + next_hop_add = 100; + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + ip = IPv4(128, 0, 0, 0); + depth = 24; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + ip = IPv4(128, 0, 0, 10); + depth = 32; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Add rule that updates the next hop in TBL24 & lookup + * (& delete & lookup) */ + + ip = IPv4(128, 0, 0, 0); + depth = 24; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + next_hop_add = 101; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Add rule that updates the next hop in TBL8 & lookup + * (& delete & lookup) */ + + ip = IPv4(128, 0, 0, 0); + depth = 32; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + next_hop_add = 101; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Delete a rule that is not present in the TBL24 & lookup */ + + ip = IPv4(128, 0, 0, 0); + depth = 24; + next_hop_add = 100; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status < 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_delete_all(lpm); + + /* Delete a rule that is not present in the TBL8 & lookup */ + + ip = IPv4(128, 0, 0, 0); + depth = 32; + next_hop_add = 100; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status < 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 11 + * + * Add two rules, lookup to hit the more specific one, lookup to hit the less + * specific one delete the less specific rule and lookup previous values again; + * add a more specific rule than the existing rule, lookup again + * + * */ +int32_t +test11(void) +{ + + struct rte_lpm *lpm = NULL; + uint32_t ip; + uint8_t depth, next_hop_add, next_hop_return; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + ip = IPv4(128, 0, 0, 0); + depth = 24; + next_hop_add = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + ip = IPv4(128, 0, 0, 10); + depth = 32; + next_hop_add = 101; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + ip = IPv4(128, 0, 0, 0); + next_hop_add = 100; + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add)); + + ip = IPv4(128, 0, 0, 0); + depth = 24; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + ip = IPv4(128, 0, 0, 10); + depth = 32; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 12 + * + * Add an extended rule (i.e. depth greater than 24, lookup (hit), delete, + * lookup (miss) in a for loop of 1000 times. This will check tbl8 extension + * and contraction. + * + * */ + +int32_t +test12(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip, i; + uint8_t depth, next_hop_add, next_hop_return; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + ip = IPv4(128, 0, 0, 0); + depth = 32; + next_hop_add = 100; + + for (i = 0; i < 1000; i++) { + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && + (next_hop_return == next_hop_add)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + } + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 13 + * + * Add a rule to tbl24, lookup (hit), then add a rule that will extend this + * tbl24 entry, lookup (hit). delete the rule that caused the tbl24 extension, + * lookup (miss) and repeat for loop of 1000 times. This will check tbl8 + * extension and contraction. + * + * */ + +int32_t +test13(void) +{ + struct rte_lpm *lpm = NULL; + uint32_t ip, i; + uint8_t depth, next_hop_add_1, next_hop_add_2, next_hop_return; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + ip = IPv4(128, 0, 0, 0); + depth = 24; + next_hop_add_1 = 100; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add_1); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && (next_hop_return == next_hop_add_1)); + + depth = 32; + next_hop_add_2 = 101; + + for (i = 0; i < 1000; i++) { + status = rte_lpm_add(lpm, ip, depth, next_hop_add_2); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && + (next_hop_return == next_hop_add_2)); + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && + (next_hop_return == next_hop_add_1)); + } + + depth = 24; + + status = rte_lpm_delete(lpm, ip, depth); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT(status == -ENOENT); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST 14 + * + * Fore TBL8 extension exhaustion. Add 256 rules that require a tbl8 extension. + * No more tbl8 extensions will be allowed. Now add one more rule that required + * a tbl8 extension and get fail. + * */ +int32_t +test14(void) +{ + + /* We only use depth = 32 in the loop below so we must make sure + * that we have enough storage for all rules at that depth*/ + + struct rte_lpm *lpm = NULL; + uint32_t ip; + uint8_t depth, next_hop_add, next_hop_return; + int32_t status = 0; + + /* Add enough space for 256 rules for every depth */ + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, 256 * 32, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + ip = IPv4(0, 0, 0, 0); + depth = 32; + next_hop_add = 100; + + /* Add 256 rules that require a tbl8 extension */ + for (ip = 0; ip <= IPv4(0, 0, 255, 0); ip += 256) { + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip, &next_hop_return); + TEST_LPM_ASSERT((status == 0) && + (next_hop_return == next_hop_add)); + } + + /* All tbl8 extensions have been used above. Try to add one more and + * we get a fail */ + ip = IPv4(1, 0, 0, 0); + depth = 32; + + status = rte_lpm_add(lpm, ip, depth, next_hop_add); + TEST_LPM_ASSERT(status < 0); + + rte_lpm_free(lpm); + + return PASS; +} + +/* TEST test15 + * + * Lookup performance test using Mae West Routing Table + */ +static inline uint32_t +depth_to_mask(uint8_t depth) { + return (int)0x80000000 >> (depth - 1); +} + +static uint32_t +rule_table_check_for_duplicates(const struct route_rule *table, uint32_t n){ + unsigned i, j, count; + + count = 0; + for (i = 0; i < (n - 1); i++) { + uint8_t depth1 = table[i].depth; + uint32_t ip1_masked = table[i].ip & depth_to_mask(depth1); + + for (j = (i + 1); j tbl24[i].valid) + lpm_used_entries++; + + if (i % 32 == 0){ + if (count < lpm_used_entries) { + cache_line_counter++; + count = lpm_used_entries; + } + } + } + + printf("Number of table 24 entries = %u\n", + (unsigned) RTE_LPM_TBL24_NUM_ENTRIES); + printf("Used table 24 entries = %u\n", + (unsigned) lpm_used_entries); + printf("Percentage of table 24 entries used = %u\n", + (unsigned) div64((lpm_used_entries * 100) , + RTE_LPM_TBL24_NUM_ENTRIES)); + printf("64 byte Cache entries used = %u \n", + (unsigned) cache_line_counter); + printf("Cache Required = %u bytes\n\n", + (unsigned) cache_line_counter * 64); + + printf("Average LPM Add: %u cycles\n", avg_ticks); + + /* Lookup */ + + /* Choose random seed. */ + rte_srand(0); + total_time = 0; + status = 0; + for (i = 0; i < (ITERATIONS / BATCH_SIZE); i ++) { + static uint32_t ip_batch[BATCH_SIZE]; + uint64_t begin_batch, end_batch; + + /* Generate a batch of random numbers */ + for (j = 0; j < BATCH_SIZE; j ++) { + ip_batch[j] = rte_rand(); + } + + /* Lookup per batch */ + begin_batch = rte_rdtsc(); + + for (j = 0; j < BATCH_SIZE; j ++) { + status += rte_lpm_lookup(lpm, ip_batch[j], + &next_hop_return); + } + + end_batch = rte_rdtsc(); + printf("status = %d\r", next_hop_return); + TEST_LPM_ASSERT(status < 1); + + /* Accumulate batch time */ + total_time += (end_batch - begin_batch); + + TEST_LPM_ASSERT((status < -ENOENT) || + (next_hop_return == next_hop_add)); + } + + avg_ticks = (uint32_t) div64(total_time, ITERATIONS); + printf("Average LPM Lookup: %u cycles\n", avg_ticks); + + /* Delete */ + status = 0; + begin = rte_rdtsc(); + + for (i = 0; i < NUM_ROUTE_ENTRIES; i++) { + /* rte_lpm_delete(lpm, ip, depth) */ + status += rte_lpm_delete(lpm, mae_west_tbl[i].ip, + mae_west_tbl[i].depth); + } + + end = rte_rdtsc(); + + TEST_LPM_ASSERT(status == 0); + + avg_ticks = (uint32_t) div64((end - begin), NUM_ROUTE_ENTRIES); + + printf("Average LPM Delete: %u cycles\n", avg_ticks); + + rte_lpm_delete_all(lpm); + rte_lpm_free(lpm); + + return PASS; +} + + + +/* + * Sequence of operations for find existing fbk hash table + * + * - create table + * - find existing table: hit + * - find non-existing table: miss + * + */ +int32_t test16(void) +{ + struct rte_lpm *lpm = NULL, *result = NULL; + + /* Create lpm */ + lpm = rte_lpm_create("lpm_find_existing", SOCKET_ID_ANY, 256 * 32, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + /* Try to find existing lpm */ + result = rte_lpm_find_existing("lpm_find_existing"); + TEST_LPM_ASSERT(result == lpm); + + /* Try to find non-existing lpm */ + result = rte_lpm_find_existing("lpm_find_non_existing"); + TEST_LPM_ASSERT(result == NULL); + + /* Cleanup. */ + rte_lpm_delete_all(lpm); + rte_lpm_free(lpm); + + return PASS; +} + +/* + * test failure condition of overloading the tbl8 so no more will fit + * Check we get an error return value in that case + */ +static int32_t +test17(void) +{ + uint32_t ip; + struct rte_lpm *lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, + 256 * 32, RTE_LPM_HEAP); + + printf("Testing filling tbl8's\n"); + + /* ip loops through all positibilities for top 24 bits of address */ + for (ip = 0; ip < 0xFFFFFF; ip++){ + /* add an entrey within a different tbl8 each time, since + * depth >24 and the top 24 bits are different */ + if (rte_lpm_add(lpm, (ip << 8) + 0xF0, 30, 0) < 0) + break; + } + + if (ip != RTE_LPM_TBL8_NUM_GROUPS) { + printf("Error, unexpected failure with filling tbl8 groups\n"); + printf("Failed after %u additions, expected after %u\n", + (unsigned)ip, (unsigned)RTE_LPM_TBL8_NUM_GROUPS); + } + + rte_lpm_free(lpm); + return 0; +} + +/* + * Test 18 + * Test for overwriting of tbl8: + * - add rule /32 and lookup + * - add new rule /24 and lookup + * - add third rule /25 and lookup + * - lookup /32 and /24 rule to ensure the table has not been overwritten. + */ +int32_t +test18(void) +{ + struct rte_lpm *lpm = NULL; + const uint32_t ip_10_32 = IPv4(10, 10, 10, 2); + const uint32_t ip_10_24 = IPv4(10, 10, 10, 0); + const uint32_t ip_20_25 = IPv4(10, 10, 20, 2); + const uint8_t d_ip_10_32 = 32, + d_ip_10_24 = 24, + d_ip_20_25 = 25; + const uint8_t next_hop_ip_10_32 = 100, + next_hop_ip_10_24 = 105, + next_hop_ip_20_25 = 111; + uint8_t next_hop_return = 0; + int32_t status = 0; + + lpm = rte_lpm_create(__func__, SOCKET_ID_ANY, MAX_RULES, RTE_LPM_HEAP); + TEST_LPM_ASSERT(lpm != NULL); + + status = rte_lpm_add(lpm, ip_10_32, d_ip_10_32, next_hop_ip_10_32); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_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_lpm_add(lpm, ip_10_24, d_ip_10_24, next_hop_ip_10_24); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip_10_24, &next_hop_return); + TEST_LPM_ASSERT(status == 0); + TEST_LPM_ASSERT(next_hop_return == next_hop_ip_10_24); + + status = rte_lpm_add(lpm, ip_20_25, d_ip_20_25, next_hop_ip_20_25); + TEST_LPM_ASSERT(status == 0); + + status = rte_lpm_lookup(lpm, ip_20_25, &next_hop_return); + TEST_LPM_ASSERT(status == 0); + TEST_LPM_ASSERT(next_hop_return == next_hop_ip_20_25); + + status = rte_lpm_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_lpm_lookup(lpm, ip_10_24, &next_hop_return); + TEST_LPM_ASSERT(status == 0); + TEST_LPM_ASSERT(next_hop_return == next_hop_ip_10_24); + + rte_lpm_free(lpm); + + printf("%s PASSED\n", __func__); + return PASS; +} + + +/* + * Do all unit and performance tests. + */ + +int +test_lpm(void) +{ + unsigned test_num; + int status, global_status; + + printf("Running LPM tests...\n" + "Total number of test = %u\n", (unsigned) NUM_LPM_TESTS); + + global_status = 0; + + for (test_num = 0; test_num < NUM_LPM_TESTS; test_num++) { + + status = tests[test_num](); + + printf("LPM Test %u: %s\n", test_num, + (status < 0) ? "FAIL" : "PASS"); + + if (status < 0) { + global_status = status; + } + } + + return global_status; +} + +#else + +int +test_lpm(void) +{ + printf("The LPM library is not included in this build\n"); + return 0; +} + +#endif diff --git a/app/test/test_lpm_routes.h b/app/test/test_lpm_routes.h new file mode 100644 index 0000000..85e885a --- /dev/null +++ b/app/test/test_lpm_routes.h @@ -0,0 +1,28947 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2012 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * version: DPDK.L.1.2.3-3 + */ + +#ifndef _TEST_LPM_ROUTES_H_ +#define _TEST_LPM_ROUTES_H_ + +#include + +struct route_rule { + uint32_t ip; + uint8_t depth; +}; + +static const struct route_rule mae_west_tbl[] = +{ + { IPv4(6,1,0,0),16 }, + { IPv4(6,2,0,0),22 }, + { IPv4(6,3,0,0),18 }, + { IPv4(6,4,0,0),16 }, + { IPv4(6,5,0,0),19 }, + { IPv4(6,8,0,0),20 }, + { IPv4(6,9,0,0),20 }, + { IPv4(6,10,0,0),15 }, + { IPv4(6,14,0,0),15 }, + { IPv4(6,133,0,0),21 }, + { IPv4(6,151,0,0),16 }, + { IPv4(6,152,0,0),16 }, + { IPv4(9,141,128,0),24 }, + { IPv4(12,0,0,0),8 }, + { IPv4(12,0,252,0),23 }, + { IPv4(12,1,83,0),24 }, + { IPv4(12,1,245,0),24 }, + { IPv4(12,1,248,0),24 }, + { IPv4(12,2,6,0),24 }, + { IPv4(12,2,7,0),24 }, + { IPv4(12,2,41,0),24 }, + { IPv4(12,2,88,0),22 }, + { IPv4(12,2,94,0),23 }, + { IPv4(12,2,97,0),24 }, + { IPv4(12,2,99,0),24 }, + { IPv4(12,2,109,0),24 }, + { IPv4(12,2,110,0),24 }, + { IPv4(12,2,142,0),24 }, + { IPv4(12,2,169,0),24 }, + { IPv4(12,2,216,0),23 }, + { IPv4(12,2,220,0),22 }, + { IPv4(12,2,246,0),24 }, + { IPv4(12,3,33,0),24 }, + { IPv4(12,3,59,0),24 }, + { IPv4(12,3,65,0),24 }, + { IPv4(12,3,80,0),22 }, + { IPv4(12,3,119,0),24 }, + { IPv4(12,3,217,0),24 }, + { IPv4(12,4,5,0),24 }, + { IPv4(12,4,114,0),24 }, + { IPv4(12,4,119,0),24 }, + { IPv4(12,4,126,0),23 }, + { IPv4(12,4,196,0),22 }, + { IPv4(12,4,228,0),24 }, + { IPv4(12,5,39,0),24 }, + { IPv4(12,5,48,0),21 }, + { IPv4(12,5,136,0),24 }, + { IPv4(12,5,144,0),24 }, + { IPv4(12,5,164,0),24 }, + { IPv4(12,5,165,0),24 }, + { IPv4(12,6,97,0),24 }, + { IPv4(12,6,102,0),24 }, + { IPv4(12,6,103,0),24 }, + { IPv4(12,6,108,0),24 }, + { IPv4(12,6,109,0),24 }, + { IPv4(12,6,110,0),24 }, + { IPv4(12,6,111,0),24 }, + { IPv4(12,6,121,0),24 }, + { IPv4(12,6,124,0),24 }, + { IPv4(12,6,125,0),24 }, + { IPv4(12,6,206,0),24 }, + { IPv4(12,6,227,0),24 }, + { IPv4(12,7,5,0),24 }, + { IPv4(12,7,133,0),24 }, + { IPv4(12,7,216,0),21 }, + { IPv4(12,8,9,0),24 }, + { IPv4(12,8,13,0),24 }, + { IPv4(12,8,184,0),24 }, + { IPv4(12,8,188,0),24 }, + { IPv4(12,8,189,0),24 }, + { IPv4(12,9,136,0),24 }, + { IPv4(12,9,138,0),24 }, + { IPv4(12,9,139,0),24 }, + { IPv4(12,10,150,0),24 }, + { IPv4(12,10,152,0),21 }, + { IPv4(12,11,130,0),24 }, + { IPv4(12,11,131,0),24 }, + { IPv4(12,11,138,0),24 }, + { IPv4(12,11,162,0),24 }, + { IPv4(12,13,56,0),24 }, + { IPv4(12,13,57,0),24 }, + { IPv4(12,13,58,0),24 }, + { IPv4(12,13,59,0),24 }, + { IPv4(12,13,74,0),24 }, + { IPv4(12,13,82,0),23 }, + { IPv4(12,13,84,0),24 }, + { IPv4(12,13,224,0),19 }, + { IPv4(12,13,224,0),21 }, + { IPv4(12,13,236,0),22 }, + { IPv4(12,13,240,0),22 }, + { IPv4(12,13,244,0),23 }, + { IPv4(12,13,246,0),23 }, + { IPv4(12,13,248,0),22 }, + { IPv4(12,14,190,0),23 }, + { IPv4(12,14,214,0),24 }, + { IPv4(12,14,215,0),24 }, + { IPv4(12,14,232,0),23 }, + { IPv4(12,14,237,0),24 }, + { IPv4(12,14,238,0),23 }, + { IPv4(12,15,28,0),24 }, + { IPv4(12,15,46,0),23 }, + { IPv4(12,16,40,0),24 }, + { IPv4(12,16,41,0),24 }, + { IPv4(12,16,76,0),23 }, + { IPv4(12,16,132,0),24 }, + { IPv4(12,16,133,0),24 }, + { IPv4(12,16,134,0),24 }, + { IPv4(12,16,135,0),24 }, + { IPv4(12,16,160,0),24 }, + { IPv4(12,16,161,0),24 }, + { IPv4(12,16,162,0),24 }, + { IPv4(12,16,163,0),24 }, + { IPv4(12,16,168,0),24 }, + { IPv4(12,16,188,0),24 }, + { IPv4(12,16,189,0),24 }, + { IPv4(12,16,190,0),24 }, + { IPv4(12,16,191,0),24 }, + { IPv4(12,17,20,0),24 }, + { IPv4(12,18,36,0),24 }, + { IPv4(12,18,36,0),22 }, + { IPv4(12,18,90,0),23 }, + { IPv4(12,18,96,0),22 }, + { IPv4(12,18,110,0),23 }, + { IPv4(12,18,120,0),24 }, + { IPv4(12,18,155,0),24 }, + { IPv4(12,18,170,0),24 }, + { IPv4(12,18,171,0),24 }, + { IPv4(12,18,177,0),24 }, + { IPv4(12,18,216,0),24 }, + { IPv4(12,18,217,0),24 }, + { IPv4(12,18,240,0),22 }, + { IPv4(12,18,244,0),22 }, + { IPv4(12,19,136,0),23 }, + { IPv4(12,19,138,0),24 }, + { IPv4(12,19,208,0),24 }, + { IPv4(12,19,211,0),24 }, + { IPv4(12,20,16,0),22 }, + { IPv4(12,20,55,0),24 }, + { IPv4(12,20,92,0),24 }, + { IPv4(12,20,200,0),22 }, + { IPv4(12,20,229,0),24 }, + { IPv4(12,21,14,0),23 }, + { IPv4(12,21,85,0),24 }, + { IPv4(12,21,202,0),24 }, + { IPv4(12,21,208,0),23 }, + { IPv4(12,21,210,0),23 }, + { IPv4(12,21,212,0),23 }, + { IPv4(12,21,216,0),24 }, + { IPv4(12,21,217,0),24 }, + { IPv4(12,21,218,0),24 }, + { IPv4(12,21,219,0),24 }, + { IPv4(12,21,222,0),24 }, + { IPv4(12,21,223,0),24 }, + { IPv4(12,22,96,0),24 }, + { IPv4(12,23,26,0),23 }, + { IPv4(12,23,66,0),23 }, + { IPv4(12,23,70,0),23 }, + { IPv4(12,23,72,0),23 }, + { IPv4(12,23,78,0),24 }, + { IPv4(12,23,108,0),23 }, + { IPv4(12,23,136,0),22 }, + { IPv4(12,23,189,0),24 }, + { IPv4(12,23,194,0),24 }, + { IPv4(12,23,251,0),24 }, + { IPv4(12,24,96,0),24 }, + { IPv4(12,24,112,0),22 }, + { IPv4(12,24,180,0),23 }, + { IPv4(12,24,252,0),22 }, + { IPv4(12,25,49,0),24 }, + { IPv4(12,25,98,0),24 }, + { IPv4(12,25,105,0),24 }, + { IPv4(12,25,136,0),21 }, + { IPv4(12,25,196,0),22 }, + { IPv4(12,25,212,0),23 }, + { IPv4(12,25,230,0),24 }, + { IPv4(12,25,232,0),21 }, + { IPv4(12,25,241,0),24 }, + { IPv4(12,26,7,0),24 }, + { IPv4(12,26,25,0),24 }, + { IPv4(12,26,53,0),24 }, + { IPv4(12,26,84,0),24 }, + { IPv4(12,26,86,0),24 }, + { IPv4(12,26,100,0),22 }, + { IPv4(12,26,128,0),22 }, + { IPv4(12,26,136,0),22 }, + { IPv4(12,26,144,0),22 }, + { IPv4(12,26,144,0),23 }, + { IPv4(12,27,38,0),24 }, + { IPv4(12,27,40,0),24 }, + { IPv4(12,27,41,0),24 }, + { IPv4(12,27,42,0),24 }, + { IPv4(12,27,43,0),24 }, + { IPv4(12,27,66,0),24 }, + { IPv4(12,27,88,0),24 }, + { IPv4(12,27,89,0),24 }, + { IPv4(12,27,90,0),24 }, + { IPv4(12,28,146,0),23 }, + { IPv4(12,28,148,0),24 }, + { IPv4(12,28,242,0),24 }, + { IPv4(12,29,100,0),24 }, + { IPv4(12,29,101,0),24 }, + { IPv4(12,29,102,0),24 }, + { IPv4(12,29,106,0),24 }, + { IPv4(12,29,190,0),24 }, + { IPv4(12,29,194,0),24 }, + { IPv4(12,30,0,0),23 }, + { IPv4(12,30,1,0),24 }, + { IPv4(12,30,105,0),24 }, + { IPv4(12,30,159,0),24 }, + { IPv4(12,30,198,0),23 }, + { IPv4(12,30,205,0),24 }, + { IPv4(12,30,208,0),21 }, + { IPv4(12,30,224,0),22 }, + { IPv4(12,30,228,0),22 }, + { IPv4(12,31,21,0),24 }, + { IPv4(12,31,24,0),24 }, + { IPv4(12,31,25,0),24 }, + { IPv4(12,31,125,0),24 }, + { IPv4(12,31,126,0),24 }, + { IPv4(12,31,143,0),24 }, + { IPv4(12,31,159,0),24 }, + { IPv4(12,31,160,0),24 }, + { IPv4(12,31,161,0),24 }, + { IPv4(12,31,202,0),24 }, + { IPv4(12,32,72,0),23 }, + { IPv4(12,32,90,0),24 }, + { IPv4(12,32,104,0),22 }, + { IPv4(12,32,231,0),24 }, + { IPv4(12,32,241,0),24 }, + { IPv4(12,33,46,0),24 }, + { IPv4(12,33,56,0),22 }, + { IPv4(12,33,114,0),24 }, + { IPv4(12,33,194,0),24 }, + { IPv4(12,33,195,0),24 }, + { IPv4(12,34,2,0),24 }, + { IPv4(12,34,8,0),21 }, + { IPv4(12,34,100,0),24 }, + { IPv4(12,34,101,0),24 }, + { IPv4(12,34,119,0),24 }, + { IPv4(12,34,154,0),24 }, + { IPv4(12,34,155,0),24 }, + { IPv4(12,34,159,0),24 }, + { IPv4(12,34,233,0),24 }, + { IPv4(12,35,37,0),24 }, + { IPv4(12,35,65,0),24 }, + { IPv4(12,35,96,0),24 }, + { IPv4(12,35,114,0),24 }, + { IPv4(12,35,145,0),24 }, + { IPv4(12,35,159,0),24 }, + { IPv4(12,36,56,0),22 }, + { IPv4(12,36,116,0),24 }, + { IPv4(12,36,118,0),24 }, + { IPv4(12,36,129,0),24 }, + { IPv4(12,36,133,0),24 }, + { IPv4(12,36,160,0),22 }, + { IPv4(12,36,203,0),24 }, + { IPv4(12,37,27,0),24 }, + { IPv4(12,37,28,0),22 }, + { IPv4(12,37,61,0),24 }, + { IPv4(12,37,113,0),24 }, + { IPv4(12,37,211,0),24 }, + { IPv4(12,37,228,0),22 }, + { IPv4(12,37,232,64),26 }, + { IPv4(12,37,238,0),23 }, + { IPv4(12,38,48,0),22 }, + { IPv4(12,38,64,0),22 }, + { IPv4(12,38,112,0),24 }, + { IPv4(12,38,144,0),24 }, + { IPv4(12,38,145,0),24 }, + { IPv4(12,38,245,0),24 }, + { IPv4(12,38,246,0),24 }, + { IPv4(12,38,247,0),24 }, + { IPv4(12,39,37,0),24 }, + { IPv4(12,39,65,0),24 }, + { IPv4(12,39,106,0),24 }, + { IPv4(12,40,114,0),24 }, + { IPv4(12,40,116,0),24 }, + { IPv4(12,40,121,0),24 }, + { IPv4(12,40,174,0),24 }, + { IPv4(12,40,179,0),24 }, + { IPv4(12,41,3,0),24 }, + { IPv4(12,41,48,0),24 }, + { IPv4(12,41,49,0),24 }, + { IPv4(12,41,50,0),24 }, + { IPv4(12,41,51,0),24 }, + { IPv4(12,41,66,0),23 }, + { IPv4(12,41,122,0),24 }, + { IPv4(12,41,162,0),23 }, + { IPv4(12,41,162,0),24 }, + { IPv4(12,41,163,0),24 }, + { IPv4(12,41,188,0),24 }, + { IPv4(12,41,193,0),24 }, + { IPv4(12,41,194,0),23 }, + { IPv4(12,41,194,0),24 }, + { IPv4(12,41,195,0),24 }, + { IPv4(12,42,26,0),24 }, + { IPv4(12,42,50,0),24 }, + { IPv4(12,42,51,0),24 }, + { IPv4(12,42,52,0),24 }, + { IPv4(12,42,58,0),24 }, + { IPv4(12,42,59,0),24 }, + { IPv4(12,42,130,0),24 }, + { IPv4(12,42,144,0),22 }, + { IPv4(12,42,152,0),24 }, + { IPv4(12,42,240,0),23 }, + { IPv4(12,43,20,0),23 }, + { IPv4(12,43,128,0),24 }, + { IPv4(12,43,128,0),20 }, + { IPv4(12,43,130,0),24 }, + { IPv4(12,43,144,0),20 }, + { IPv4(12,43,146,0),24 }, + { IPv4(12,45,103,0),24 }, + { IPv4(12,45,108,0),24 }, + { IPv4(12,45,121,0),24 }, + { IPv4(12,45,134,0),24 }, + { IPv4(12,46,144,0),21 }, + { IPv4(12,46,160,0),24 }, + { IPv4(12,46,162,0),23 }, + { IPv4(12,46,164,0),22 }, + { IPv4(12,46,168,0),21 }, + { IPv4(12,47,101,0),24 }, + { IPv4(12,47,192,0),21 }, + { IPv4(12,47,217,0),24 }, + { IPv4(12,47,220,0),22 }, + { IPv4(12,47,220,0),24 }, + { IPv4(12,47,221,0),24 }, + { IPv4(12,47,222,0),24 }, + { IPv4(12,64,96,0),19 }, + { IPv4(12,64,128,0),18 }, + { IPv4(12,64,192,0),18 }, + { IPv4(12,65,0,0),18 }, + { IPv4(12,65,64,0),19 }, + { IPv4(12,65,96,0),19 }, + { IPv4(12,65,128,0),18 }, + { IPv4(12,65,192,0),19 }, + { IPv4(12,65,224,0),20 }, + { IPv4(12,65,240,0),20 }, + { IPv4(12,66,0,0),19 }, + { IPv4(12,67,1,0),24 }, + { IPv4(12,67,4,0),24 }, + { IPv4(12,67,5,0),24 }, + { IPv4(12,67,6,0),24 }, + { IPv4(12,67,7,0),24 }, + { IPv4(12,96,40,0),22 }, + { IPv4(12,96,160,0),21 }, + { IPv4(12,96,169,0),24 }, + { IPv4(12,104,36,0),24 }, + { IPv4(12,104,78,0),23 }, + { IPv4(12,104,82,0),23 }, + { IPv4(12,104,96,0),24 }, + { IPv4(12,105,115,0),24 }, + { IPv4(12,105,138,0),24 }, + { IPv4(12,105,139,0),24 }, + { IPv4(12,105,185,0),24 }, + { IPv4(12,106,16,0),24 }, + { IPv4(12,106,96,0),24 }, + { IPv4(12,106,130,0),24 }, + { IPv4(12,107,20,0),22 }, + { IPv4(12,107,40,0),22 }, + { IPv4(12,107,44,0),22 }, + { IPv4(12,107,82,0),24 }, + { IPv4(12,107,130,0),24 }, + { IPv4(12,107,140,0),22 }, + { IPv4(12,107,160,0),22 }, + { IPv4(12,107,180,0),22 }, + { IPv4(12,107,188,0),22 }, + { IPv4(12,107,232,0),24 }, + { IPv4(12,108,132,0),22 }, + { IPv4(12,108,188,0),23 }, + { IPv4(12,108,237,0),24 }, + { IPv4(12,109,19,0),24 }, + { IPv4(12,109,107,0),24 }, + { IPv4(12,109,109,0),24 }, + { IPv4(12,109,224,0),22 }, + { IPv4(12,110,6,0),23 }, + { IPv4(12,110,23,0),24 }, + { IPv4(12,110,40,0),24 }, + { IPv4(12,110,74,0),23 }, + { IPv4(12,110,253,0),24 }, + { IPv4(12,111,50,0),24 }, + { IPv4(12,111,132,0),23 }, + { IPv4(12,129,0,0),18 }, + { IPv4(12,129,64,0),18 }, + { IPv4(12,129,192,0),18 }, + { IPv4(12,144,16,0),22 }, + { IPv4(12,144,24,0),22 }, + { IPv4(12,144,144,0),24 }, + { IPv4(12,144,148,0),22 }, + { IPv4(12,145,65,0),24 }, + { IPv4(12,145,188,0),24 }, + { IPv4(12,147,44,0),24 }, + { IPv4(12,147,52,0),24 }, + { IPv4(12,147,53,0),24 }, + { IPv4(12,147,54,0),24 }, + { IPv4(12,147,55,0),24 }, + { IPv4(12,148,204,0),23 }, + { IPv4(12,149,4,0),23 }, + { IPv4(12,150,116,0),24 }, + { IPv4(12,151,64,0),21 }, + { IPv4(12,151,96,0),24 }, + { IPv4(12,152,100,0),23 }, + { IPv4(12,152,102,0),23 }, + { IPv4(12,152,104,0),23 }, + { IPv4(12,152,164,0),23 }, + { IPv4(12,152,236,0),24 }, + { IPv4(12,152,237,0),24 }, + { IPv4(12,152,238,0),24 }, + { IPv4(12,152,239,0),24 }, + { IPv4(12,152,240,0),24 }, + { IPv4(12,153,0,0),21 }, + { IPv4(12,153,8,0),23 }, + { IPv4(12,153,192,0),20 }, + { IPv4(12,153,244,0),22 }, + { IPv4(12,154,224,0),23 }, + { IPv4(12,155,49,0),24 }, + { IPv4(12,155,226,0),24 }, + { IPv4(12,158,136,0),22 }, + { IPv4(12,158,192,0),21 }, + { IPv4(12,158,224,0),23 }, + { IPv4(12,159,64,0),21 }, + { IPv4(12,159,80,0),24 }, + { IPv4(12,161,8,0),21 }, + { IPv4(12,161,222,0),24 }, + { IPv4(12,162,160,0),19 }, + { IPv4(12,242,16,0),24 }, + { IPv4(12,242,17,0),24 }, + { IPv4(12,242,18,0),24 }, + { IPv4(13,181,8,0),21 }, + { IPv4(13,181,20,0),24 }, + { IPv4(13,181,32,0),24 }, + { IPv4(13,181,36,0),24 }, + { IPv4(13,181,40,0),24 }, + { IPv4(13,181,64,0),23 }, + { IPv4(13,181,66,0),24 }, + { IPv4(13,181,68,0),24 }, + { IPv4(13,181,76,0),23 }, + { IPv4(13,181,78,0),24 }, + { IPv4(13,181,80,0),24 }, + { IPv4(13,181,100,0),24 }, + { IPv4(13,181,108,0),24 }, + { IPv4(15,0,0,0),8 }, + { IPv4(15,211,128,0),20 }, + { IPv4(15,220,0,0),16 }, + { IPv4(15,232,0,0),13 }, + { IPv4(15,240,0,0),12 }, + { IPv4(15,248,0,0),20 }, + { IPv4(15,251,128,0),20 }, + { IPv4(15,252,0,0),18 }, + { IPv4(15,252,64,0),20 }, + { IPv4(15,252,240,0),20 }, + { IPv4(16,0,0,0),8 }, + { IPv4(17,0,0,0),8 }, + { IPv4(17,103,0,0),16 }, + { IPv4(17,104,0,0),16 }, + { IPv4(17,112,0,0),16 }, + { IPv4(17,126,0,0),15 }, + { IPv4(24,0,0,0),18 }, + { IPv4(24,0,0,0),12 }, + { IPv4(24,0,64,0),19 }, + { IPv4(24,0,96,0),20 }, + { IPv4(24,0,128,0),18 }, + { IPv4(24,0,192,0),19 }, + { IPv4(24,1,0,0),19 }, + { IPv4(24,1,32,0),19 }, + { IPv4(24,1,128,0),17 }, + { IPv4(24,2,32,0),19 }, + { IPv4(24,2,64,0),19 }, + { IPv4(24,2,96,0),19 }, + { IPv4(24,2,128,0),18 }, + { IPv4(24,2,192,0),19 }, + { IPv4(24,2,224,0),19 }, + { IPv4(24,3,0,0),18 }, + { IPv4(24,3,64,0),18 }, + { IPv4(24,3,128,0),18 }, + { IPv4(24,3,192,0),19 }, + { IPv4(24,4,0,0),18 }, + { IPv4(24,4,64,0),19 }, + { IPv4(24,4,128,0),19 }, + { IPv4(24,4,192,0),19 }, + { IPv4(24,5,32,0),19 }, + { IPv4(24,5,128,0),18 }, + { IPv4(24,6,32,0),19 }, + { IPv4(24,6,64,0),19 }, + { IPv4(24,6,96,0),19 }, + { IPv4(24,7,160,0),19 }, + { IPv4(24,8,160,0),19 }, + { IPv4(24,8,192,0),19 }, + { IPv4(24,9,0,0),22 }, + { IPv4(24,10,96,0),19 }, + { IPv4(24,10,192,0),19 }, + { IPv4(24,11,0,0),19 }, + { IPv4(24,11,32,0),19 }, + { IPv4(24,11,96,0),19 }, + { IPv4(24,11,128,0),18 }, + { IPv4(24,11,224,0),19 }, + { IPv4(24,12,0,0),19 }, + { IPv4(24,12,32,0),19 }, + { IPv4(24,12,64,0),19 }, + { IPv4(24,12,96,0),19 }, + { IPv4(24,12,128,0),19 }, + { IPv4(24,12,160,0),19 }, + { IPv4(24,12,224,0),19 }, + { IPv4(24,13,0,0),19 }, + { IPv4(24,13,32,0),19 }, + { IPv4(24,13,64,0),19 }, + { IPv4(24,13,96,0),19 }, + { IPv4(24,13,128,0),19 }, + { IPv4(24,13,160,0),19 }, + { IPv4(24,13,192,0),19 }, + { IPv4(24,14,64,0),19 }, + { IPv4(24,14,96,0),19 }, + { IPv4(24,14,160,0),19 }, + { IPv4(24,16,0,0),18 }, + { IPv4(24,16,0,0),13 }, + { IPv4(24,16,64,0),18 }, + { IPv4(24,16,160,0),19 }, + { IPv4(24,16,192,0),18 }, + { IPv4(24,17,0,0),17 }, + { IPv4(24,17,128,0),18 }, + { IPv4(24,17,192,0),19 }, + { IPv4(24,17,224,0),19 }, + { IPv4(24,18,0,0),18 }, + { IPv4(24,18,64,0),19 }, + { IPv4(24,18,96,0),19 }, + { IPv4(24,18,128,0),18 }, + { IPv4(24,18,192,0),18 }, + { IPv4(24,19,0,0),17 }, + { IPv4(24,19,128,0),19 }, + { IPv4(24,19,160,0),19 }, + { IPv4(24,20,0,0),19 }, + { IPv4(24,20,32,0),19 }, + { IPv4(24,20,128,0),18 }, + { IPv4(24,20,192,0),18 }, + { IPv4(24,21,0,0),17 }, + { IPv4(24,21,128,0),18 }, + { IPv4(24,21,192,0),18 }, + { IPv4(24,22,0,0),16 }, + { IPv4(24,23,0,0),19 }, + { IPv4(24,23,32,0),19 }, + { IPv4(24,23,64,0),18 }, + { IPv4(24,23,128,0),18 }, + { IPv4(24,23,192,0),19 }, + { IPv4(24,23,224,0),19 }, + { IPv4(24,24,0,0),19 }, + { IPv4(24,24,32,0),19 }, + { IPv4(24,24,64,0),19 }, + { IPv4(24,24,96,0),19 }, + { IPv4(24,24,128,0),18 }, + { IPv4(24,24,192,0),20 }, + { IPv4(24,24,208,0),20 }, + { IPv4(24,24,224,0),19 }, + { IPv4(24,25,0,0),19 }, + { IPv4(24,25,32,0),19 }, + { IPv4(24,25,64,0),19 }, + { IPv4(24,25,96,0),19 }, + { IPv4(24,25,128,0),19 }, + { IPv4(24,25,160,0),19 }, + { IPv4(24,25,192,0),19 }, + { IPv4(24,25,224,0),19 }, + { IPv4(24,26,0,0),19 }, + { IPv4(24,26,32,0),19 }, + { IPv4(24,26,64,0),19 }, + { IPv4(24,26,96,0),19 }, + { IPv4(24,26,128,0),19 }, + { IPv4(24,26,160,0),19 }, + { IPv4(24,26,192,0),19 }, + { IPv4(24,26,224,0),19 }, + { IPv4(24,27,0,0),18 }, + { IPv4(24,27,64,0),18 }, + { IPv4(24,27,128,0),19 }, + { IPv4(24,27,160,0),19 }, + { IPv4(24,27,192,0),19 }, + { IPv4(24,27,224,0),20 }, + { IPv4(24,27,240,0),20 }, + { IPv4(24,28,0,0),18 }, + { IPv4(24,28,64,0),19 }, + { IPv4(24,28,96,0),19 }, + { IPv4(24,28,128,0),19 }, + { IPv4(24,28,160,0),19 }, + { IPv4(24,28,192,0),19 }, + { IPv4(24,28,224,0),19 }, + { IPv4(24,29,0,0),19 }, + { IPv4(24,29,32,0),19 }, + { IPv4(24,29,64,0),19 }, + { IPv4(24,29,96,0),19 }, + { IPv4(24,29,128,0),19 }, + { IPv4(24,29,160,0),20 }, + { IPv4(24,29,176,0),20 }, + { IPv4(24,29,192,0),18 }, + { IPv4(24,30,0,0),18 }, + { IPv4(24,30,64,0),19 }, + { IPv4(24,30,96,0),19 }, + { IPv4(24,30,128,0),19 }, + { IPv4(24,30,160,0),19 }, + { IPv4(24,30,192,0),19 }, + { IPv4(24,30,224,0),19 }, + { IPv4(24,31,0,0),19 }, + { IPv4(24,31,32,0),19 }, + { IPv4(24,31,64,0),19 }, + { IPv4(24,31,96,0),19 }, + { IPv4(24,31,128,0),19 }, + { IPv4(24,31,160,0),19 }, + { IPv4(24,31,192,0),19 }, + { IPv4(24,31,224,0),19 }, + { IPv4(24,33,0,0),19 }, + { IPv4(24,34,0,0),16 }, + { IPv4(24,36,0,0),14 }, + { IPv4(24,36,0,0),16 }, + { IPv4(24,37,0,0),17 }, + { IPv4(24,37,128,0),17 }, + { IPv4(24,38,0,0),17 }, + { IPv4(24,38,128,0),18 }, + { IPv4(24,38,192,0),18 }, + { IPv4(24,39,0,0),17 }, + { IPv4(24,39,128,0),17 }, + { IPv4(24,40,0,0),18 }, + { IPv4(24,40,64,0),20 }, + { IPv4(24,41,0,0),18 }, + { IPv4(24,41,64,0),19 }, + { IPv4(24,42,0,0),15 }, + { IPv4(24,56,0,0),18 }, + { IPv4(24,60,0,0),16 }, + { IPv4(24,61,0,0),17 }, + { IPv4(24,61,128,0),19 }, + { IPv4(24,64,0,0),19 }, + { IPv4(24,64,0,0),13 }, + { IPv4(24,64,32,0),19 }, + { IPv4(24,64,64,0),19 }, + { IPv4(24,64,96,0),19 }, + { IPv4(24,64,128,0),19 }, + { IPv4(24,64,192,0),19 }, + { IPv4(24,64,224,0),19 }, + { IPv4(24,65,0,0),19 }, + { IPv4(24,65,32,0),19 }, + { IPv4(24,65,64,0),19 }, + { IPv4(24,65,96,0),19 }, + { IPv4(24,65,128,0),19 }, + { IPv4(24,65,160,0),19 }, + { IPv4(24,65,192,0),19 }, + { IPv4(24,65,224,0),19 }, + { IPv4(24,66,0,0),19 }, + { IPv4(24,66,32,0),19 }, + { IPv4(24,66,64,0),19 }, + { IPv4(24,66,96,0),19 }, + { IPv4(24,66,128,0),19 }, + { IPv4(24,66,160,0),19 }, + { IPv4(24,66,192,0),19 }, + { IPv4(24,66,224,0),19 }, + { IPv4(24,67,0,0),19 }, + { IPv4(24,67,32,0),19 }, + { IPv4(24,67,64,0),19 }, + { IPv4(24,67,96,0),19 }, + { IPv4(24,67,128,0),19 }, + { IPv4(24,67,160,0),19 }, + { IPv4(24,67,192,0),19 }, + { IPv4(24,67,224,0),19 }, + { IPv4(24,68,0,0),19 }, + { IPv4(24,68,32,0),19 }, + { IPv4(24,68,96,0),19 }, + { IPv4(24,68,128,0),19 }, + { IPv4(24,68,160,0),19 }, + { IPv4(24,68,192,0),19 }, + { IPv4(24,68,224,0),19 }, + { IPv4(24,69,0,0),19 }, + { IPv4(24,69,32,0),19 }, + { IPv4(24,69,64,0),19 }, + { IPv4(24,69,96,0),19 }, + { IPv4(24,69,192,0),19 }, + { IPv4(24,69,224,0),19 }, + { IPv4(24,70,0,0),19 }, + { IPv4(24,70,32,0),19 }, + { IPv4(24,70,64,0),19 }, + { IPv4(24,70,96,0),19 }, + { IPv4(24,70,128,0),19 }, + { IPv4(24,70,160,0),19 }, + { IPv4(24,70,192,0),19 }, + { IPv4(24,70,224,0),19 }, + { IPv4(24,71,0,0),19 }, + { IPv4(24,71,32,0),19 }, + { IPv4(24,71,64,0),19 }, + { IPv4(24,71,96,0),19 }, + { IPv4(24,71,160,0),19 }, + { IPv4(24,71,192,0),19 }, + { IPv4(24,71,224,0),19 }, + { IPv4(24,76,0,0),14 }, + { IPv4(24,76,0,0),19 }, + { IPv4(24,76,32,0),19 }, + { IPv4(24,76,64,0),19 }, + { IPv4(24,76,96,0),19 }, + { IPv4(24,76,128,0),19 }, + { IPv4(24,76,160,0),19 }, + { IPv4(24,76,192,0),19 }, + { IPv4(24,76,224,0),19 }, + { IPv4(24,77,0,0),19 }, + { IPv4(24,77,32,0),19 }, + { IPv4(24,77,64,0),19 }, + { IPv4(24,77,96,0),19 }, + { IPv4(24,77,128,0),19 }, + { IPv4(24,77,160,0),19 }, + { IPv4(24,77,192,0),19 }, + { IPv4(24,77,224,0),19 }, + { IPv4(24,78,0,0),19 }, + { IPv4(24,78,32,0),19 }, + { IPv4(24,78,64,0),19 }, + { IPv4(24,78,96,0),19 }, + { IPv4(24,78,128,0),19 }, + { IPv4(24,78,160,0),19 }, + { IPv4(24,78,192,0),19 }, + { IPv4(24,78,224,0),19 }, + { IPv4(24,79,0,0),19 }, + { IPv4(24,79,32,0),19 }, + { IPv4(24,79,64,0),19 }, + { IPv4(24,79,96,0),19 }, + { IPv4(24,79,128,0),19 }, + { IPv4(24,79,160,0),19 }, + { IPv4(24,79,192,0),19 }, + { IPv4(24,79,224,0),19 }, + { IPv4(24,80,0,0),19 }, + { IPv4(24,80,0,0),14 }, + { IPv4(24,80,32,0),19 }, + { IPv4(24,80,128,0),19 }, + { IPv4(24,80,160,0),19 }, + { IPv4(24,81,0,0),19 }, + { IPv4(24,81,32,0),19 }, + { IPv4(24,81,64,0),19 }, + { IPv4(24,81,96,0),19 }, + { IPv4(24,81,128,0),19 }, + { IPv4(24,81,160,0),19 }, + { IPv4(24,81,192,0),19 }, + { IPv4(24,81,224,0),19 }, + { IPv4(24,82,0,0),19 }, + { IPv4(24,82,32,0),19 }, + { IPv4(24,82,64,0),19 }, + { IPv4(24,82,96,0),19 }, + { IPv4(24,82,128,0),19 }, + { IPv4(24,82,160,0),19 }, + { IPv4(24,82,192,0),19 }, + { IPv4(24,82,224,0),19 }, + { IPv4(24,83,0,0),19 }, + { IPv4(24,83,32,0),19 }, + { IPv4(24,83,64,0),19 }, + { IPv4(24,83,96,0),19 }, + { IPv4(24,83,128,0),19 }, + { IPv4(24,88,0,0),18 }, + { IPv4(24,88,64,0),19 }, + { IPv4(24,88,96,0),19 }, + { IPv4(24,88,128,0),19 }, + { IPv4(24,88,160,0),19 }, + { IPv4(24,88,192,0),19 }, + { IPv4(24,88,224,0),20 }, + { IPv4(24,88,240,0),20 }, + { IPv4(24,90,0,0),19 }, + { IPv4(24,91,0,0),16 }, + { IPv4(24,91,64,0),19 }, + { IPv4(24,91,96,0),19 }, + { IPv4(24,91,128,0),17 }, + { IPv4(24,92,0,0),19 }, + { IPv4(24,92,32,0),19 }, + { IPv4(24,92,64,0),19 }, + { IPv4(24,92,96,0),19 }, + { IPv4(24,92,128,0),20 }, + { IPv4(24,92,144,0),20 }, + { IPv4(24,92,160,0),19 }, + { IPv4(24,92,192,0),19 }, + { IPv4(24,92,224,0),19 }, + { IPv4(24,93,0,0),19 }, + { IPv4(24,93,32,0),19 }, + { IPv4(24,93,64,0),19 }, + { IPv4(24,93,96,0),19 }, + { IPv4(24,93,128,0),19 }, + { IPv4(24,93,160,0),19 }, + { IPv4(24,93,192,0),19 }, + { IPv4(24,93,224,0),19 }, + { IPv4(24,94,0,0),19 }, + { IPv4(24,94,32,0),19 }, + { IPv4(24,94,64,0),24 }, + { IPv4(24,94,64,0),19 }, + { IPv4(24,94,96,0),19 }, + { IPv4(24,94,128,0),19 }, + { IPv4(24,94,160,0),19 }, + { IPv4(24,94,192,0),19 }, + { IPv4(24,94,224,0),19 }, + { IPv4(24,95,0,0),19 }, + { IPv4(24,95,32,0),19 }, + { IPv4(24,95,64,0),19 }, + { IPv4(24,95,96,0),19 }, + { IPv4(24,95,128,0),19 }, + { IPv4(24,95,160,0),19 }, + { IPv4(24,95,192,0),19 }, + { IPv4(24,95,224,0),19 }, + { IPv4(24,98,0,0),17 }, + { IPv4(24,98,128,0),18 }, + { IPv4(24,98,192,0),20 }, + { IPv4(24,100,0,0),15 }, + { IPv4(24,102,0,0),17 }, + { IPv4(24,102,128,0),18 }, + { IPv4(24,102,192,0),19 }, + { IPv4(24,102,224,0),19 }, + { IPv4(24,103,0,0),17 }, + { IPv4(24,103,128,0),19 }, + { IPv4(24,103,160,0),20 }, + { IPv4(24,104,0,0),21 }, + { IPv4(24,104,0,0),18 }, + { IPv4(24,104,8,0),21 }, + { IPv4(24,104,40,0),21 }, + { IPv4(24,104,48,0),21 }, + { IPv4(24,104,64,0),19 }, + { IPv4(24,104,72,0),21 }, + { IPv4(24,108,0,0),18 }, + { IPv4(24,108,64,0),19 }, + { IPv4(24,108,96,0),19 }, + { IPv4(24,108,128,0),19 }, + { IPv4(24,108,160,0),19 }, + { IPv4(24,108,192,0),19 }, + { IPv4(24,108,224,0),19 }, + { IPv4(24,109,0,0),19 }, + { IPv4(24,109,32,0),20 }, + { IPv4(24,109,32,0),21 }, + { IPv4(24,109,48,0),20 }, + { IPv4(24,109,64,0),19 }, + { IPv4(24,109,96,0),20 }, + { IPv4(24,112,0,0),16 }, + { IPv4(24,112,112,0),20 }, + { IPv4(24,114,0,0),16 }, + { IPv4(24,116,0,0),23 }, + { IPv4(24,116,0,0),24 }, + { IPv4(24,116,0,0),17 }, + { IPv4(24,116,2,0),24 }, + { IPv4(24,116,3,0),24 }, + { IPv4(24,116,4,0),24 }, + { IPv4(24,116,5,0),24 }, + { IPv4(24,116,6,0),24 }, + { IPv4(24,116,7,0),24 }, + { IPv4(24,116,8,0),24 }, + { IPv4(24,116,10,0),24 }, + { IPv4(24,116,11,0),24 }, + { IPv4(24,116,12,0),23 }, + { IPv4(24,116,14,0),24 }, + { IPv4(24,116,15,0),24 }, + { IPv4(24,116,16,0),23 }, + { IPv4(24,116,18,0),23 }, + { IPv4(24,116,18,0),24 }, + { IPv4(24,116,25,0),24 }, + { IPv4(24,116,26,0),23 }, + { IPv4(24,116,28,0),22 }, + { IPv4(24,116,32,0),23 }, + { IPv4(24,116,36,0),24 }, + { IPv4(24,116,37,0),24 }, + { IPv4(24,116,38,0),24 }, + { IPv4(24,116,39,0),24 }, + { IPv4(24,116,56,0),21 }, + { IPv4(24,116,64,0),21 }, + { IPv4(24,116,72,0),23 }, + { IPv4(24,116,74,0),23 }, + { IPv4(24,116,76,0),22 }, + { IPv4(24,116,80,0),23 }, + { IPv4(24,116,82,0),23 }, + { IPv4(24,116,84,0),22 }, + { IPv4(24,116,88,0),22 }, + { IPv4(24,116,92,0),22 }, + { IPv4(24,116,96,0),22 }, + { IPv4(24,116,100,0),23 }, + { IPv4(24,116,102,0),23 }, + { IPv4(24,116,104,0),23 }, + { IPv4(24,116,106,0),24 }, + { IPv4(24,116,107,0),24 }, + { IPv4(24,116,108,0),23 }, + { IPv4(24,116,110,0),23 }, + { IPv4(24,116,112,0),23 }, + { IPv4(24,116,114,0),23 }, + { IPv4(24,116,116,0),22 }, + { IPv4(24,116,116,0),23 }, + { IPv4(24,116,118,0),24 }, + { IPv4(24,116,120,0),22 }, + { IPv4(24,116,124,0),23 }, + { IPv4(24,116,126,0),23 }, + { IPv4(24,116,128,0),19 }, + { IPv4(24,116,128,0),20 }, + { IPv4(24,116,144,0),21 }, + { IPv4(24,116,152,0),21 }, + { IPv4(24,116,160,0),19 }, + { IPv4(24,116,162,0),23 }, + { IPv4(24,116,164,0),22 }, + { IPv4(24,116,170,0),23 }, + { IPv4(24,116,172,0),22 }, + { IPv4(24,116,176,0),24 }, + { IPv4(24,116,178,0),24 }, + { IPv4(24,116,180,0),24 }, + { IPv4(24,118,0,0),17 }, + { IPv4(24,118,128,0),20 }, + { IPv4(24,120,0,0),19 }, + { IPv4(24,120,32,0),19 }, + { IPv4(24,120,64,0),19 }, + { IPv4(24,120,96,0),19 }, + { IPv4(24,120,128,0),19 }, + { IPv4(24,120,160,0),19 }, + { IPv4(24,121,31,0),24 }, + { IPv4(24,125,0,0),18 }, + { IPv4(24,125,64,0),20 }, + { IPv4(24,126,0,0),16 }, + { IPv4(24,127,0,0),17 }, + { IPv4(24,127,128,0),18 }, + { IPv4(24,128,0,0),16 }, + { IPv4(24,128,6,0),24 }, + { IPv4(24,128,191,0),24 }, + { IPv4(24,129,0,0),17 }, + { IPv4(24,129,2,0),24 }, + { IPv4(24,129,4,0),24 }, + { IPv4(24,129,24,0),23 }, + { IPv4(24,129,26,0),24 }, + { IPv4(24,129,28,0),24 }, + { IPv4(24,129,32,0),24 }, + { IPv4(24,129,42,0),24 }, + { IPv4(24,129,128,0),18 }, + { IPv4(24,129,192,0),19 }, + { IPv4(24,130,0,0),18 }, + { IPv4(24,130,64,0),19 }, + { IPv4(24,130,96,0),19 }, + { IPv4(24,130,192,0),19 }, + { IPv4(24,131,0,0),18 }, + { IPv4(24,131,64,0),18 }, + { IPv4(24,131,128,0),18 }, + { IPv4(24,131,192,0),18 }, + { IPv4(24,136,0,0),19 }, + { IPv4(24,136,32,0),19 }, + { IPv4(24,136,64,0),20 }, + { IPv4(24,136,64,0),22 }, + { IPv4(24,136,68,0),23 }, + { IPv4(24,136,70,0),24 }, + { IPv4(24,136,128,0),21 }, + { IPv4(24,136,136,0),22 }, + { IPv4(24,136,140,0),22 }, + { IPv4(24,136,144,0),22 }, + { IPv4(24,136,150,0),23 }, + { IPv4(24,136,152,0),21 }, + { IPv4(24,136,160,0),21 }, + { IPv4(24,137,0,0),19 }, + { IPv4(24,139,0,0),19 }, + { IPv4(24,140,0,0),19 }, + { IPv4(24,140,32,0),19 }, + { IPv4(24,141,0,0),20 }, + { IPv4(24,141,0,0),16 }, + { IPv4(24,141,16,0),20 }, + { IPv4(24,141,32,0),20 }, + { IPv4(24,141,48,0),20 }, + { IPv4(24,141,80,0),20 }, + { IPv4(24,141,96,0),20 }, + { IPv4(24,141,112,0),20 }, + { IPv4(24,141,128,0),20 }, + { IPv4(24,141,144,0),20 }, + { IPv4(24,141,160,0),20 }, + { IPv4(24,141,192,0),20 }, + { IPv4(24,141,224,0),20 }, + { IPv4(24,141,240,0),20 }, + { IPv4(24,142,32,0),19 }, + { IPv4(24,142,40,0),22 }, + { IPv4(24,142,44,0),22 }, + { IPv4(24,142,76,0),23 }, + { IPv4(24,142,88,0),23 }, + { IPv4(24,142,92,0),22 }, + { IPv4(24,142,96,0),22 }, + { IPv4(24,142,100,0),23 }, + { IPv4(24,142,160,0),19 }, + { IPv4(24,142,178,0),24 }, + { IPv4(24,142,192,0),18 }, + { IPv4(24,142,205,0),24 }, + { IPv4(24,145,128,0),19 }, + { IPv4(24,145,128,0),21 }, + { IPv4(24,145,136,0),22 }, + { IPv4(24,145,140,0),22 }, + { IPv4(24,145,144,0),21 }, + { IPv4(24,145,152,0),22 }, + { IPv4(24,145,156,0),23 }, + { IPv4(24,145,158,0),23 }, + { IPv4(24,145,160,0),20 }, + { IPv4(24,145,168,0),21 }, + { IPv4(24,147,0,0),16 }, + { IPv4(24,148,0,0),18 }, + { IPv4(24,148,64,0),19 }, + { IPv4(24,150,0,0),20 }, + { IPv4(24,150,0,0),16 }, + { IPv4(24,150,16,0),20 }, + { IPv4(24,150,48,0),20 }, + { IPv4(24,150,64,0),20 }, + { IPv4(24,150,80,0),20 }, + { IPv4(24,150,96,0),20 }, + { IPv4(24,150,112,0),20 }, + { IPv4(24,150,128,0),20 }, + { IPv4(24,150,144,0),20 }, + { IPv4(24,150,160,0),20 }, + { IPv4(24,150,176,0),20 }, + { IPv4(24,150,224,0),20 }, + { IPv4(24,150,240,0),20 }, + { IPv4(24,151,0,0),19 }, + { IPv4(24,151,32,0),20 }, + { IPv4(24,151,32,0),19 }, + { IPv4(24,151,40,0),22 }, + { IPv4(24,151,44,0),23 }, + { IPv4(24,151,46,0),23 }, + { IPv4(24,151,48,0),24 }, + { IPv4(24,151,48,0),20 }, + { IPv4(24,151,49,0),24 }, + { IPv4(24,151,50,0),23 }, + { IPv4(24,151,52,0),22 }, + { IPv4(24,151,60,0),23 }, + { IPv4(24,151,62,0),24 }, + { IPv4(24,151,63,0),24 }, + { IPv4(24,151,64,0),20 }, + { IPv4(24,151,80,0),21 }, + { IPv4(24,151,88,0),22 }, + { IPv4(24,151,92,0),22 }, + { IPv4(24,153,0,0),18 }, + { IPv4(24,155,0,0),19 }, + { IPv4(24,155,9,0),24 }, + { IPv4(24,155,10,0),24 }, + { IPv4(24,156,0,0),19 }, + { IPv4(24,156,0,0),16 }, + { IPv4(24,157,0,0),19 }, + { IPv4(24,157,0,0),18 }, + { IPv4(24,157,0,0),17 }, + { IPv4(24,157,64,0),19 }, + { IPv4(24,157,128,0),18 }, + { IPv4(24,157,192,0),19 }, + { IPv4(24,157,224,0),19 }, + { IPv4(24,158,32,0),19 }, + { IPv4(24,158,64,0),20 }, + { IPv4(24,158,80,0),20 }, + { IPv4(24,158,96,0),19 }, + { IPv4(24,158,128,0),20 }, + { IPv4(24,158,192,0),20 }, + { IPv4(24,158,240,0),20 }, + { IPv4(24,159,0,0),20 }, + { IPv4(24,159,32,0),20 }, + { IPv4(24,159,48,0),20 }, + { IPv4(24,159,64,0),21 }, + { IPv4(24,159,64,0),20 }, + { IPv4(24,159,72,0),21 }, + { IPv4(24,159,80,0),20 }, + { IPv4(24,159,96,0),20 }, + { IPv4(24,159,112,0),20 }, + { IPv4(24,159,128,0),20 }, + { IPv4(24,159,164,0),22 }, + { IPv4(24,159,168,0),23 }, + { IPv4(24,159,170,0),23 }, + { IPv4(24,159,172,0),23 }, + { IPv4(24,159,175,0),24 }, + { IPv4(24,159,176,0),20 }, + { IPv4(24,159,208,0),20 }, + { IPv4(24,160,0,0),19 }, + { IPv4(24,160,32,0),20 }, + { IPv4(24,160,48,0),20 }, + { IPv4(24,160,64,0),18 }, + { IPv4(24,160,128,0),19 }, + { IPv4(24,160,160,0),19 }, + { IPv4(24,160,192,0),19 }, + { IPv4(24,160,224,0),19 }, + { IPv4(24,161,0,0),18 }, + { IPv4(24,161,64,0),19 }, + { IPv4(24,161,96,0),19 }, + { IPv4(24,161,128,0),19 }, + { IPv4(24,161,160,0),19 }, + { IPv4(24,161,192,0),19 }, + { IPv4(24,161,224,0),19 }, + { IPv4(24,162,0,0),18 }, + { IPv4(24,162,64,0),19 }, + { IPv4(24,162,96,0),19 }, + { IPv4(24,162,128,0),19 }, + { IPv4(24,162,160,0),19 }, + { IPv4(24,162,192,0),19 }, + { IPv4(24,162,224,0),19 }, + { IPv4(24,163,0,0),19 }, + { IPv4(24,163,32,0),20 }, + { IPv4(24,163,48,0),20 }, + { IPv4(24,163,64,0),19 }, + { IPv4(24,163,96,0),19 }, + { IPv4(24,163,128,0),20 }, + { IPv4(24,163,144,0),20 }, + { IPv4(24,163,160,0),19 }, + { IPv4(24,163,192,0),19 }, + { IPv4(24,163,224,0),20 }, + { IPv4(24,163,240,0),20 }, + { IPv4(24,164,0,0),19 }, + { IPv4(24,164,0,0),18 }, + { IPv4(24,164,32,0),19 }, + { IPv4(24,164,64,0),19 }, + { IPv4(24,164,96,0),19 }, + { IPv4(24,164,128,0),19 }, + { IPv4(24,164,160,0),20 }, + { IPv4(24,164,176,0),20 }, + { IPv4(24,164,192,0),19 }, + { IPv4(24,164,224,0),19 }, + { IPv4(24,165,0,0),19 }, + { IPv4(24,165,32,0),19 }, + { IPv4(24,165,64,0),20 }, + { IPv4(24,165,80,0),20 }, + { IPv4(24,165,96,0),20 }, + { IPv4(24,165,112,0),20 }, + { IPv4(24,165,128,0),18 }, + { IPv4(24,165,192,0),19 }, + { IPv4(24,165,224,0),19 }, + { IPv4(24,166,0,0),19 }, + { IPv4(24,166,0,0),18 }, + { IPv4(24,166,32,0),19 }, + { IPv4(24,166,64,0),18 }, + { IPv4(24,166,128,0),19 }, + { IPv4(24,166,160,0),19 }, + { IPv4(24,166,192,0),19 }, + { IPv4(24,166,224,0),20 }, + { IPv4(24,166,240,0),20 }, + { IPv4(24,167,0,0),18 }, + { IPv4(24,167,64,0),19 }, + { IPv4(24,167,96,0),19 }, + { IPv4(24,167,128,0),19 }, + { IPv4(24,167,160,0),19 }, + { IPv4(24,167,192,0),19 }, + { IPv4(24,167,224,0),19 }, + { IPv4(24,168,0,0),18 }, + { IPv4(24,168,64,0),19 }, + { IPv4(24,168,96,0),19 }, + { IPv4(24,168,128,0),19 }, + { IPv4(24,168,192,0),19 }, + { IPv4(24,168,224,0),19 }, + { IPv4(24,169,0,0),19 }, + { IPv4(24,169,32,0),19 }, + { IPv4(24,169,64,0),19 }, + { IPv4(24,169,96,0),19 }, + { IPv4(24,169,128,0),19 }, + { IPv4(24,169,160,0),20 }, + { IPv4(24,169,176,0),20 }, + { IPv4(24,169,192,0),20 }, + { IPv4(24,169,208,0),20 }, + { IPv4(24,169,224,0),20 }, + { IPv4(24,169,240,0),20 }, + { IPv4(24,170,0,0),19 }, + { IPv4(24,170,32,0),19 }, + { IPv4(24,170,64,0),19 }, + { IPv4(24,170,96,0),19 }, + { IPv4(24,170,128,0),20 }, + { IPv4(24,170,144,0),21 }, + { IPv4(24,170,152,0),22 }, + { IPv4(24,170,156,0),23 }, + { IPv4(24,170,158,0),23 }, + { IPv4(24,176,0,0),17 }, + { IPv4(24,176,0,0),13 }, + { IPv4(24,176,0,0),14 }, + { IPv4(24,176,128,0),17 }, + { IPv4(24,177,0,0),17 }, + { IPv4(24,177,128,0),17 }, + { IPv4(24,178,0,0),16 }, + { IPv4(24,179,0,0),17 }, + { IPv4(24,179,128,0),17 }, + { IPv4(24,180,0,0),15 }, + { IPv4(24,180,0,0),17 }, + { IPv4(24,180,128,0),17 }, + { IPv4(24,181,0,0),17 }, + { IPv4(24,181,128,0),17 }, + { IPv4(24,182,0,0),16 }, + { IPv4(24,183,0,0),16 }, + { IPv4(24,196,16,0),20 }, + { IPv4(24,196,32,0),20 }, + { IPv4(24,196,48,0),20 }, + { IPv4(24,196,160,0),20 }, + { IPv4(24,196,176,0),20 }, + { IPv4(24,196,200,0),21 }, + { IPv4(24,196,224,0),20 }, + { IPv4(24,196,241,0),24 }, + { IPv4(24,196,244,0),22 }, + { IPv4(24,196,252,0),22 }, + { IPv4(24,197,0,0),24 }, + { IPv4(24,197,2,0),24 }, + { IPv4(24,197,4,0),22 }, + { IPv4(24,197,8,0),22 }, + { IPv4(24,197,12,0),22 }, + { IPv4(24,197,16,0),22 }, + { IPv4(24,197,32,0),19 }, + { IPv4(24,197,64,0),19 }, + { IPv4(24,197,96,0),21 }, + { IPv4(24,197,104,0),23 }, + { IPv4(24,197,112,0),20 }, + { IPv4(24,197,128,0),20 }, + { IPv4(24,198,0,0),18 }, + { IPv4(24,198,64,0),19 }, + { IPv4(24,198,96,0),20 }, + { IPv4(24,204,0,0),17 }, + { IPv4(24,206,0,0),20 }, + { IPv4(24,206,64,0),19 }, + { IPv4(24,206,160,0),20 }, + { IPv4(24,207,0,0),18 }, + { IPv4(24,207,128,0),18 }, + { IPv4(24,208,0,0),18 }, + { IPv4(24,213,0,0),21 }, + { IPv4(24,213,8,0),22 }, + { IPv4(24,213,12,0),22 }, + { IPv4(24,213,20,0),22 }, + { IPv4(24,213,24,0),22 }, + { IPv4(24,213,28,0),22 }, + { IPv4(24,213,32,0),19 }, + { IPv4(24,213,60,0),24 }, + { IPv4(24,214,0,0),18 }, + { IPv4(24,214,1,0),24 }, + { IPv4(24,214,3,0),24 }, + { IPv4(24,214,4,0),24 }, + { IPv4(24,214,5,0),24 }, + { IPv4(24,214,6,0),24 }, + { IPv4(24,214,7,0),24 }, + { IPv4(24,214,8,0),24 }, + { IPv4(24,214,9,0),24 }, + { IPv4(24,214,10,0),24 }, + { IPv4(24,214,11,0),24 }, + { IPv4(24,214,12,0),24 }, + { IPv4(24,214,13,0),24 }, + { IPv4(24,214,14,0),24 }, + { IPv4(24,214,15,0),24 }, + { IPv4(24,214,16,0),24 }, + { IPv4(24,214,17,0),24 }, + { IPv4(24,214,18,0),24 }, + { IPv4(24,214,19,0),24 }, + { IPv4(24,214,20,0),24 }, + { IPv4(24,214,21,0),24 }, + { IPv4(24,214,22,0),24 }, + { IPv4(24,214,23,0),24 }, + { IPv4(24,214,24,0),24 }, + { IPv4(24,214,25,0),24 }, + { IPv4(24,214,26,0),24 }, + { IPv4(24,214,27,0),24 }, + { IPv4(24,214,28,0),24 }, + { IPv4(24,214,29,0),24 }, + { IPv4(24,214,30,0),24 }, + { IPv4(24,214,31,0),24 }, + { IPv4(24,214,32,0),24 }, + { IPv4(24,214,33,0),24 }, + { IPv4(24,214,34,0),24 }, + { IPv4(24,214,35,0),24 }, + { IPv4(24,214,36,0),24 }, + { IPv4(24,214,37,0),24 }, + { IPv4(24,214,38,0),24 }, + { IPv4(24,214,39,0),24 }, + { IPv4(24,214,40,0),24 }, + { IPv4(24,214,41,0),24 }, + { IPv4(24,214,42,0),24 }, + { IPv4(24,214,43,0),24 }, + { IPv4(24,214,44,0),24 }, + { IPv4(24,214,45,0),24 }, + { IPv4(24,214,46,0),24 }, + { IPv4(24,214,47,0),24 }, + { IPv4(24,214,48,0),24 }, + { IPv4(24,214,49,0),24 }, + { IPv4(24,214,50,0),24 }, + { IPv4(24,214,51,0),24 }, + { IPv4(24,214,52,0),24 }, + { IPv4(24,214,53,0),24 }, + { IPv4(24,214,54,0),24 }, + { IPv4(24,214,55,0),24 }, + { IPv4(24,214,56,0),24 }, + { IPv4(24,214,57,0),24 }, + { IPv4(24,214,58,0),24 }, + { IPv4(24,214,59,0),24 }, + { IPv4(24,214,60,0),24 }, + { IPv4(24,214,61,0),24 }, + { IPv4(24,214,62,0),24 }, + { IPv4(24,214,63,0),24 }, + { IPv4(24,214,64,0),24 }, + { IPv4(24,214,65,0),24 }, + { IPv4(24,214,66,0),24 }, + { IPv4(24,214,67,0),24 }, + { IPv4(24,214,68,0),24 }, + { IPv4(24,214,69,0),24 }, + { IPv4(24,214,70,0),24 }, + { IPv4(24,214,71,0),24 }, + { IPv4(24,214,74,0),24 }, + { IPv4(24,214,75,0),24 }, + { IPv4(24,214,78,0),24 }, + { IPv4(24,214,80,0),24 }, + { IPv4(24,214,81,0),24 }, + { IPv4(24,214,82,0),24 }, + { IPv4(24,214,86,0),24 }, + { IPv4(24,214,87,0),24 }, + { IPv4(24,214,90,0),24 }, + { IPv4(24,214,91,0),24 }, + { IPv4(24,214,93,0),24 }, + { IPv4(24,214,94,0),24 }, + { IPv4(24,214,96,0),24 }, + { IPv4(24,214,97,0),24 }, + { IPv4(24,214,98,0),24 }, + { IPv4(24,214,99,0),24 }, + { IPv4(24,214,102,0),24 }, + { IPv4(24,214,103,0),24 }, + { IPv4(24,214,105,0),24 }, + { IPv4(24,214,108,0),24 }, + { IPv4(24,214,109,0),24 }, + { IPv4(24,214,113,0),24 }, + { IPv4(24,214,114,0),24 }, + { IPv4(24,214,115,0),24 }, + { IPv4(24,214,120,0),24 }, + { IPv4(24,214,121,0),24 }, + { IPv4(24,214,122,0),24 }, + { IPv4(24,214,126,0),24 }, + { IPv4(24,214,128,0),19 }, + { IPv4(24,214,133,0),24 }, + { IPv4(24,214,134,0),24 }, + { IPv4(24,215,0,0),19 }, + { IPv4(24,215,16,0),20 }, + { IPv4(24,215,24,0),21 }, + { IPv4(24,215,32,0),20 }, + { IPv4(24,216,10,0),24 }, + { IPv4(24,216,141,0),24 }, + { IPv4(24,216,184,0),24 }, + { IPv4(24,216,241,0),24 }, + { IPv4(24,216,252,0),24 }, + { IPv4(24,216,253,0),24 }, + { IPv4(24,216,254,0),24 }, + { IPv4(24,216,255,0),24 }, + { IPv4(24,217,0,0),16 }, + { IPv4(24,218,0,0),16 }, + { IPv4(24,218,188,0),22 }, + { IPv4(24,221,208,0),20 }, + { IPv4(24,222,112,0),20 }, + { IPv4(24,223,0,0),18 }, + { IPv4(24,223,64,0),20 }, + { IPv4(24,226,0,0),17 }, + { IPv4(24,226,32,0),20 }, + { IPv4(24,226,48,0),20 }, + { IPv4(24,226,64,0),20 }, + { IPv4(24,226,80,0),20 }, + { IPv4(24,226,96,0),20 }, + { IPv4(24,226,112,0),20 }, + { IPv4(24,227,0,0),19 }, + { IPv4(24,228,0,0),18 }, + { IPv4(24,228,64,0),19 }, + { IPv4(24,229,0,0),17 }, + { IPv4(24,229,128,0),19 }, + { IPv4(24,229,160,0),20 }, + { IPv4(24,234,0,0),19 }, + { IPv4(24,234,32,0),19 }, + { IPv4(24,234,64,0),19 }, + { IPv4(24,234,96,0),19 }, + { IPv4(24,234,128,0),19 }, + { IPv4(24,234,160,0),19 }, + { IPv4(24,234,192,0),19 }, + { IPv4(24,234,224,0),19 }, + { IPv4(24,236,0,0),19 }, + { IPv4(24,240,12,0),24 }, + { IPv4(24,240,26,0),24 }, + { IPv4(24,240,97,0),24 }, + { IPv4(24,240,100,0),24 }, + { IPv4(24,240,119,0),24 }, + { IPv4(24,240,122,0),24 }, + { IPv4(24,240,144,0),24 }, + { IPv4(24,240,145,0),24 }, + { IPv4(24,240,146,0),24 }, + { IPv4(24,240,147,0),24 }, + { IPv4(24,240,148,0),24 }, + { IPv4(24,240,149,0),24 }, + { IPv4(24,240,180,0),24 }, + { IPv4(24,240,186,0),24 }, + { IPv4(24,240,194,0),24 }, + { IPv4(24,240,199,0),24 }, + { IPv4(24,240,207,0),24 }, + { IPv4(24,240,213,0),24 }, + { IPv4(24,240,229,0),24 }, + { IPv4(24,240,230,0),24 }, + { IPv4(24,240,232,0),24 }, + { IPv4(24,240,233,0),24 }, + { IPv4(24,240,234,0),24 }, + { IPv4(24,240,235,0),24 }, + { IPv4(24,240,236,0),24 }, + { IPv4(24,240,242,0),24 }, + { IPv4(24,240,243,0),24 }, + { IPv4(24,240,244,0),24 }, + { IPv4(24,241,54,0),24 }, + { IPv4(24,241,71,0),24 }, + { IPv4(24,241,88,0),24 }, + { IPv4(24,241,105,0),24 }, + { IPv4(24,241,111,0),24 }, + { IPv4(24,241,120,0),24 }, + { IPv4(24,241,128,0),24 }, + { IPv4(24,241,135,0),24 }, + { IPv4(24,241,154,0),24 }, + { IPv4(24,241,167,0),24 }, + { IPv4(24,241,185,0),24 }, + { IPv4(24,242,0,0),19 }, + { IPv4(24,242,32,0),19 }, + { IPv4(24,242,64,0),19 }, + { IPv4(24,242,96,0),19 }, + { IPv4(24,242,128,0),20 }, + { IPv4(24,242,144,0),20 }, + { IPv4(24,242,160,0),20 }, + { IPv4(24,242,176,0),20 }, + { IPv4(24,244,0,0),20 }, + { IPv4(24,244,16,0),20 }, + { IPv4(24,245,0,0),18 }, + { IPv4(24,245,64,0),20 }, + { IPv4(24,246,0,0),17 }, + { IPv4(24,246,9,0),24 }, + { IPv4(24,246,10,0),23 }, + { IPv4(24,246,12,0),22 }, + { IPv4(24,246,16,0),23 }, + { IPv4(24,246,38,0),24 }, + { IPv4(24,246,60,0),24 }, + { IPv4(24,246,122,0),24 }, + { IPv4(24,246,128,0),18 }, + { IPv4(24,247,0,0),20 }, + { IPv4(24,247,16,0),21 }, + { IPv4(24,247,32,0),20 }, + { IPv4(24,247,48,0),20 }, + { IPv4(24,247,48,0),21 }, + { IPv4(24,247,64,0),20 }, + { IPv4(24,247,96,0),20 }, + { IPv4(24,247,112,0),20 }, + { IPv4(24,247,128,0),20 }, + { IPv4(24,247,144,0),20 }, + { IPv4(24,247,152,0),22 }, + { IPv4(24,247,176,0),20 }, + { IPv4(24,248,0,0),17 }, + { IPv4(24,248,0,0),13 }, + { IPv4(24,248,128,0),17 }, + { IPv4(24,249,0,0),17 }, + { IPv4(24,249,128,0),17 }, + { IPv4(24,250,0,0),18 }, + { IPv4(24,250,64,0),18 }, + { IPv4(24,250,128,0),18 }, + { IPv4(24,250,192,0),19 }, + { IPv4(24,250,224,0),19 }, + { IPv4(24,251,0,0),17 }, + { IPv4(24,251,128,0),18 }, + { IPv4(24,251,192,0),18 }, + { IPv4(24,252,0,0),17 }, + { IPv4(24,252,128,0),17 }, + { IPv4(24,253,0,0),17 }, + { IPv4(24,253,128,0),17 }, + { IPv4(24,254,0,0),17 }, + { IPv4(24,254,128,0),17 }, + { IPv4(24,255,0,0),17 }, + { IPv4(24,255,128,0),17 }, + { IPv4(32,0,0,0),8 }, + { IPv4(32,96,0,0),13 }, + { IPv4(32,96,43,0),24 }, + { IPv4(32,96,48,0),24 }, + { IPv4(32,96,62,0),24 }, + { IPv4(32,96,83,0),24 }, + { IPv4(32,96,86,0),24 }, + { IPv4(32,96,111,0),24 }, + { IPv4(32,96,224,0),19 }, + { IPv4(32,97,17,0),24 }, + { IPv4(32,97,80,0),21 }, + { IPv4(32,97,87,0),24 }, + { IPv4(32,97,91,0),24 }, + { IPv4(32,97,100,0),24 }, + { IPv4(32,97,104,0),24 }, + { IPv4(32,97,110,0),24 }, + { IPv4(32,97,132,0),24 }, + { IPv4(32,97,135,0),24 }, + { IPv4(32,97,136,0),24 }, + { IPv4(32,97,152,0),24 }, + { IPv4(32,97,155,0),24 }, + { IPv4(32,97,159,0),24 }, + { IPv4(32,97,167,0),24 }, + { IPv4(32,97,168,0),23 }, + { IPv4(32,97,170,0),24 }, + { IPv4(32,97,182,0),24 }, + { IPv4(32,97,183,0),24 }, + { IPv4(32,97,185,0),24 }, + { IPv4(32,97,198,0),24 }, + { IPv4(32,97,212,0),24 }, + { IPv4(32,97,217,0),24 }, + { IPv4(32,97,219,0),24 }, + { IPv4(32,97,225,0),24 }, + { IPv4(32,97,240,0),23 }, + { IPv4(32,97,242,0),24 }, + { IPv4(32,97,252,0),22 }, + { IPv4(32,102,134,0),23 }, + { IPv4(32,102,136,0),22 }, + { IPv4(32,102,140,0),23 }, + { IPv4(32,102,197,0),24 }, + { IPv4(32,102,198,0),24 }, + { IPv4(32,102,199,0),24 }, + { IPv4(32,102,200,0),24 }, + { IPv4(32,102,201,0),24 }, + { IPv4(32,102,202,0),24 }, + { IPv4(32,102,203,0),24 }, + { IPv4(32,102,204,0),24 }, + { IPv4(32,102,205,0),24 }, + { IPv4(32,102,206,0),24 }, + { IPv4(32,102,207,0),24 }, + { IPv4(32,102,208,0),24 }, + { IPv4(32,102,233,0),24 }, + { IPv4(32,102,234,0),24 }, + { IPv4(32,102,235,0),24 }, + { IPv4(32,102,236,0),24 }, + { IPv4(32,102,237,0),24 }, + { IPv4(32,102,238,0),24 }, + { IPv4(32,102,239,0),24 }, + { IPv4(32,102,240,0),24 }, + { IPv4(32,102,241,0),24 }, + { IPv4(32,102,242,0),24 }, + { IPv4(32,102,243,0),24 }, + { IPv4(32,102,244,0),24 }, + { IPv4(32,104,0,0),15 }, + { IPv4(32,107,14,0),24 }, + { IPv4(32,107,31,0),24 }, + { IPv4(32,224,112,0),24 }, + { IPv4(32,224,249,0),24 }, + { IPv4(32,227,135,0),24 }, + { IPv4(32,227,215,0),24 }, + { IPv4(32,227,216,0),24 }, + { IPv4(32,227,217,0),24 }, + { IPv4(32,227,218,0),24 }, + { IPv4(32,227,219,0),24 }, + { IPv4(32,227,220,0),24 }, + { IPv4(32,227,233,0),24 }, + { IPv4(32,227,234,0),24 }, + { IPv4(32,227,235,0),24 }, + { IPv4(32,227,236,0),24 }, + { IPv4(32,227,237,0),24 }, + { IPv4(32,227,238,0),24 }, + { IPv4(32,228,128,0),19 }, + { IPv4(32,229,0,0),18 }, + { IPv4(32,229,64,0),18 }, + { IPv4(32,229,128,0),18 }, + { IPv4(32,229,192,0),18 }, + { IPv4(33,0,0,0),8 }, + { IPv4(35,35,96,0),20 }, + { IPv4(35,35,144,0),20 }, + { IPv4(35,35,176,0),20 }, + { IPv4(38,156,161,0),24 }, + { IPv4(38,195,234,0),24 }, + { IPv4(38,233,177,0),24 }, + { IPv4(38,241,180,0),24 }, + { IPv4(38,241,183,0),24 }, + { IPv4(40,0,96,0),22 }, + { IPv4(44,0,0,0),11 }, + { IPv4(44,4,129,0),24 }, + { IPv4(44,32,0,0),13 }, + { IPv4(44,40,0,0),14 }, + { IPv4(44,46,0,0),15 }, + { IPv4(44,48,0,0),12 }, + { IPv4(44,64,0,0),10 }, + { IPv4(44,128,0,0),9 }, + { IPv4(44,166,0,0),16 }, + { IPv4(47,8,0,0),14 }, + { IPv4(47,46,0,0),15 }, + { IPv4(47,46,48,0),20 }, + { IPv4(47,46,160,0),19 }, + { IPv4(47,46,192,0),20 }, + { IPv4(47,46,208,0),20 }, + { IPv4(47,46,234,0),23 }, + { IPv4(47,47,224,0),21 }, + { IPv4(47,47,240,0),21 }, + { IPv4(47,153,64,0),18 }, + { IPv4(47,153,128,0),18 }, + { IPv4(47,249,0,0),16 }, + { IPv4(47,249,128,0),17 }, + { IPv4(53,244,0,0),19 }, + { IPv4(55,0,0,0),8 }, + { IPv4(56,0,64,0),19 }, + { IPv4(56,0,128,0),18 }, + { IPv4(56,0,128,0),19 }, + { IPv4(56,0,160,0),19 }, + { IPv4(61,6,0,0),17 }, + { IPv4(61,6,128,0),18 }, + { IPv4(61,8,0,0),19 }, + { IPv4(61,8,30,0),24 }, + { IPv4(61,8,96,0),19 }, + { IPv4(61,8,242,0),24 }, + { IPv4(61,8,243,0),24 }, + { IPv4(61,8,244,0),24 }, + { IPv4(61,8,245,0),24 }, + { IPv4(61,8,246,0),24 }, + { IPv4(61,8,247,0),24 }, + { IPv4(61,8,248,0),24 }, + { IPv4(61,8,249,0),24 }, + { IPv4(61,8,250,0),24 }, + { IPv4(61,8,251,0),24 }, + { IPv4(61,9,0,0),17 }, + { IPv4(61,9,73,0),24 }, + { IPv4(61,9,74,0),24 }, + { IPv4(61,9,75,0),24 }, + { IPv4(61,9,76,0),24 }, + { IPv4(61,9,77,0),24 }, + { IPv4(61,9,78,0),24 }, + { IPv4(61,9,112,0),24 }, + { IPv4(61,9,126,0),24 }, + { IPv4(61,10,0,0),17 }, + { IPv4(61,10,128,0),17 }, + { IPv4(61,11,0,0),19 }, + { IPv4(61,11,12,0),22 }, + { IPv4(61,11,24,0),21 }, + { IPv4(61,11,32,0),20 }, + { IPv4(61,11,36,0),22 }, + { IPv4(61,11,48,0),21 }, + { IPv4(61,13,0,0),16 }, + { IPv4(61,14,32,0),22 }, + { IPv4(61,15,0,0),17 }, + { IPv4(61,16,0,0),17 }, + { IPv4(61,18,0,0),18 }, + { IPv4(61,18,0,0),17 }, + { IPv4(61,18,64,0),18 }, + { IPv4(61,18,128,0),17 }, + { IPv4(61,18,128,0),18 }, + { IPv4(61,18,192,0),18 }, + { IPv4(61,20,0,0),16 }, + { IPv4(61,30,0,0),19 }, + { IPv4(61,30,0,0),16 }, + { IPv4(61,30,64,0),19 }, + { IPv4(61,30,128,0),20 }, + { IPv4(61,30,144,0),21 }, + { IPv4(61,30,176,0),20 }, + { IPv4(61,30,192,0),21 }, + { IPv4(61,32,0,0),13 }, + { IPv4(61,33,241,0),24 }, + { IPv4(61,33,244,0),24 }, + { IPv4(61,37,254,0),24 }, + { IPv4(61,40,0,0),14 }, + { IPv4(61,48,0,0),16 }, + { IPv4(61,56,192,0),19 }, + { IPv4(61,56,224,0),19 }, + { IPv4(61,57,128,0),20 }, + { IPv4(61,58,128,0),19 }, + { IPv4(61,59,0,0),16 }, + { IPv4(61,59,0,0),19 }, + { IPv4(61,59,0,0),18 }, + { IPv4(61,59,64,0),18 }, + { IPv4(61,59,128,0),18 }, + { IPv4(61,59,192,0),18 }, + { IPv4(61,60,0,0),19 }, + { IPv4(61,61,0,0),21 }, + { IPv4(61,61,8,0),21 }, + { IPv4(61,61,16,0),21 }, + { IPv4(61,61,24,0),21 }, + { IPv4(61,61,32,0),20 }, + { IPv4(61,61,48,0),21 }, + { IPv4(61,61,48,0),20 }, + { IPv4(61,61,56,0),21 }, + { IPv4(61,68,0,0),15 }, + { IPv4(61,70,0,0),16 }, + { IPv4(61,71,0,0),17 }, + { IPv4(61,72,0,0),13 }, + { IPv4(61,72,102,0),23 }, + { IPv4(61,72,104,0),21 }, + { IPv4(61,73,64,0),24 }, + { IPv4(61,73,152,0),24 }, + { IPv4(61,78,50,0),24 }, + { IPv4(61,78,74,0),24 }, + { IPv4(61,78,126,0),24 }, + { IPv4(61,78,127,0),24 }, + { IPv4(61,78,128,0),24 }, + { IPv4(61,80,0,0),14 }, + { IPv4(61,84,0,0),15 }, + { IPv4(61,96,0,0),17 }, + { IPv4(61,96,20,0),22 }, + { IPv4(61,96,66,0),23 }, + { IPv4(61,96,68,0),22 }, + { IPv4(61,96,72,0),22 }, + { IPv4(61,96,96,0),21 }, + { IPv4(61,96,108,0),22 }, + { IPv4(61,96,116,0),22 }, + { IPv4(61,96,124,0),22 }, + { IPv4(61,114,64,0),20 }, + { IPv4(61,114,80,0),20 }, + { IPv4(61,114,128,0),19 }, + { IPv4(61,115,208,0),20 }, + { IPv4(61,115,240,0),20 }, + { IPv4(61,117,0,0),17 }, + { IPv4(61,120,0,0),17 }, + { IPv4(61,120,144,0),20 }, + { IPv4(61,120,192,0),20 }, + { IPv4(61,121,224,0),20 }, + { IPv4(61,122,48,0),20 }, + { IPv4(61,122,128,0),18 }, + { IPv4(61,122,208,0),20 }, + { IPv4(61,122,240,0),20 }, + { IPv4(61,125,160,0),20 }, + { IPv4(61,128,96,0),19 }, + { IPv4(61,128,128,0),17 }, + { IPv4(61,129,0,0),16 }, + { IPv4(61,130,0,0),17 }, + { IPv4(61,130,128,0),17 }, + { IPv4(61,131,0,0),17 }, + { IPv4(61,131,128,0),17 }, + { IPv4(61,132,0,0),17 }, + { IPv4(61,132,128,0),17 }, + { IPv4(61,133,0,0),17 }, + { IPv4(61,133,128,0),18 }, + { IPv4(61,133,192,0),19 }, + { IPv4(61,133,224,0),19 }, + { IPv4(61,134,0,0),18 }, + { IPv4(61,134,128,0),18 }, + { IPv4(61,134,192,0),18 }, + { IPv4(61,135,0,0),17 }, + { IPv4(61,135,128,0),19 }, + { IPv4(61,136,0,0),18 }, + { IPv4(61,136,64,0),18 }, + { IPv4(61,136,128,0),18 }, + { IPv4(61,137,0,0),17 }, + { IPv4(61,137,128,0),17 }, + { IPv4(61,138,0,0),18 }, + { IPv4(61,138,64,0),18 }, + { IPv4(61,138,128,0),18 }, + { IPv4(61,138,192,0),19 }, + { IPv4(61,138,224,0),19 }, + { IPv4(61,139,0,0),17 }, + { IPv4(61,139,128,0),18 }, + { IPv4(61,139,128,0),17 }, + { IPv4(61,139,192,0),18 }, + { IPv4(61,140,0,0),14 }, + { IPv4(61,144,0,0),15 }, + { IPv4(61,146,0,0),16 }, + { IPv4(61,147,0,0),16 }, + { IPv4(61,148,0,0),15 }, + { IPv4(61,150,0,0),17 }, + { IPv4(61,150,128,0),17 }, + { IPv4(61,151,0,0),16 }, + { IPv4(61,152,0,0),16 }, + { IPv4(61,153,0,0),16 }, + { IPv4(61,154,0,0),16 }, + { IPv4(61,155,0,0),16 }, + { IPv4(61,156,0,0),16 }, + { IPv4(61,157,0,0),16 }, + { IPv4(61,158,0,0),17 }, + { IPv4(61,158,128,0),17 }, + { IPv4(61,159,0,0),18 }, + { IPv4(61,159,64,0),18 }, + { IPv4(61,159,128,0),18 }, + { IPv4(61,159,192,0),18 }, + { IPv4(61,160,0,0),16 }, + { IPv4(61,161,0,0),18 }, + { IPv4(61,161,128,0),17 }, + { IPv4(61,163,0,0),16 }, + { IPv4(61,164,0,0),16 }, + { IPv4(61,165,0,0),16 }, + { IPv4(61,166,0,0),16 }, + { IPv4(61,167,0,0),17 }, + { IPv4(61,167,0,0),16 }, + { IPv4(61,167,128,0),17 }, + { IPv4(61,168,0,0),16 }, + { IPv4(61,169,0,0),16 }, + { IPv4(61,170,0,0),16 }, + { IPv4(61,171,0,0),16 }, + { IPv4(61,172,0,0),16 }, + { IPv4(61,172,0,0),15 }, + { IPv4(61,173,0,0),16 }, + { IPv4(61,174,0,0),16 }, + { IPv4(61,175,0,0),16 }, + { IPv4(61,176,0,0),16 }, + { IPv4(61,177,0,0),16 }, + { IPv4(61,178,0,0),16 }, + { IPv4(61,179,0,0),16 }, + { IPv4(61,180,0,0),17 }, + { IPv4(61,180,128,0),17 }, + { IPv4(61,181,0,0),16 }, + { IPv4(61,182,0,0),16 }, + { IPv4(61,183,0,0),16 }, + { IPv4(61,184,0,0),16 }, + { IPv4(61,185,0,0),16 }, + { IPv4(61,186,0,0),17 }, + { IPv4(61,186,64,0),18 }, + { IPv4(61,186,128,0),17 }, + { IPv4(61,187,0,0),16 }, + { IPv4(61,188,0,0),16 }, + { IPv4(61,189,0,0),17 }, + { IPv4(61,189,128,0),17 }, + { IPv4(61,190,0,0),16 }, + { IPv4(61,193,0,0),17 }, + { IPv4(61,193,144,0),20 }, + { IPv4(61,195,48,0),21 }, + { IPv4(61,195,64,0),20 }, + { IPv4(61,195,96,0),19 }, + { IPv4(61,195,128,0),20 }, + { IPv4(61,195,224,0),20 }, + { IPv4(61,198,16,0),20 }, + { IPv4(61,198,64,0),19 }, + { IPv4(61,198,128,0),17 }, + { IPv4(61,200,80,0),20 }, + { IPv4(61,200,128,0),17 }, + { IPv4(61,202,0,0),17 }, + { IPv4(61,202,128,0),18 }, + { IPv4(61,203,0,0),17 }, + { IPv4(61,203,176,0),20 }, + { IPv4(61,203,192,0),19 }, + { IPv4(61,204,0,0),17 }, + { IPv4(61,205,0,0),20 }, + { IPv4(61,205,64,0),20 }, + { IPv4(61,205,80,0),20 }, + { IPv4(61,205,96,0),20 }, + { IPv4(61,205,112,0),20 }, + { IPv4(61,206,0,0),20 }, + { IPv4(61,206,96,0),20 }, + { IPv4(61,206,112,0),20 }, + { IPv4(61,206,224,0),20 }, + { IPv4(61,211,128,0),20 }, + { IPv4(61,211,128,0),23 }, + { IPv4(61,211,130,0),24 }, + { IPv4(61,211,176,0),20 }, + { IPv4(61,213,128,0),20 }, + { IPv4(61,213,144,0),20 }, + { IPv4(61,213,160,0),19 }, + { IPv4(61,213,192,0),21 }, + { IPv4(61,213,208,0),20 }, + { IPv4(61,213,240,0),20 }, + { IPv4(61,215,176,0),20 }, + { IPv4(61,215,208,0),22 }, + { IPv4(61,215,240,0),20 }, + { IPv4(61,216,0,0),18 }, + { IPv4(61,216,64,0),18 }, + { IPv4(61,217,0,0),16 }, + { IPv4(61,220,0,0),16 }, + { IPv4(61,226,0,0),16 }, + { IPv4(61,227,0,0),16 }, + { IPv4(61,248,0,0),17 }, + { IPv4(61,248,0,0),16 }, + { IPv4(61,248,128,0),17 }, + { IPv4(61,250,0,0),18 }, + { IPv4(61,250,128,0),18 }, + { IPv4(61,251,0,0),20 }, + { IPv4(61,251,48,0),20 }, + { IPv4(61,251,128,0),20 }, + { IPv4(61,251,144,0),20 }, + { IPv4(61,251,160,0),20 }, + { IPv4(61,251,224,0),19 }, + { IPv4(61,252,0,0),21 }, + { IPv4(61,252,8,0),22 }, + { IPv4(61,252,12,0),23 }, + { IPv4(61,252,14,0),23 }, + { IPv4(61,252,32,0),19 }, + { IPv4(61,252,128,0),19 }, + { IPv4(61,252,192,0),19 }, + { IPv4(61,253,0,0),17 }, + { IPv4(61,254,0,0),15 }, + { IPv4(62,1,0,0),16 }, + { IPv4(62,2,0,0),16 }, + { IPv4(62,3,0,0),19 }, + { IPv4(62,4,64,0),19 }, + { IPv4(62,5,0,0),17 }, + { IPv4(62,6,0,0),16 }, + { IPv4(62,7,0,0),16 }, + { IPv4(62,8,0,0),19 }, + { IPv4(62,8,10,0),24 }, + { IPv4(62,8,10,0),23 }, + { IPv4(62,8,11,0),24 }, + { IPv4(62,12,0,0),19 }, + { IPv4(62,13,192,0),19 }, + { IPv4(62,14,0,0),15 }, + { IPv4(62,28,0,0),19 }, + { IPv4(62,29,0,0),17 }, + { IPv4(62,30,0,0),15 }, + { IPv4(62,38,0,0),16 }, + { IPv4(62,40,128,0),17 }, + { IPv4(62,42,0,0),16 }, + { IPv4(62,48,0,0),19 }, + { IPv4(62,48,64,0),19 }, + { IPv4(62,48,96,0),19 }, + { IPv4(62,49,0,0),16 }, + { IPv4(62,56,0,0),17 }, + { IPv4(62,58,0,0),15 }, + { IPv4(62,72,64,0),19 }, + { IPv4(62,74,0,0),21 }, + { IPv4(62,74,12,0),22 }, + { IPv4(62,74,16,0),20 }, + { IPv4(62,74,32,0),19 }, + { IPv4(62,74,64,0),18 }, + { IPv4(62,74,128,0),18 }, + { IPv4(62,74,192,0),19 }, + { IPv4(62,74,240,0),20 }, + { IPv4(62,77,0,0),19 }, + { IPv4(62,80,64,0),20 }, + { IPv4(62,80,80,0),20 }, + { IPv4(62,97,145,0),24 }, + { IPv4(62,100,0,0),18 }, + { IPv4(62,102,0,0),17 }, + { IPv4(62,103,0,0),16 }, + { IPv4(62,104,56,0),24 }, + { IPv4(62,104,174,0),24 }, + { IPv4(62,108,64,0),19 }, + { IPv4(62,108,192,0),19 }, + { IPv4(62,111,0,0),17 }, + { IPv4(62,113,0,0),19 }, + { IPv4(62,116,128,0),19 }, + { IPv4(62,128,192,0),20 }, + { IPv4(62,128,208,0),20 }, + { IPv4(62,129,128,0),19 }, + { IPv4(62,131,0,0),16 }, + { IPv4(62,134,0,0),16 }, + { IPv4(62,151,0,0),19 }, + { IPv4(62,151,32,0),19 }, + { IPv4(62,151,64,0),18 }, + { IPv4(62,152,128,0),19 }, + { IPv4(62,166,0,0),16 }, + { IPv4(62,168,128,0),19 }, + { IPv4(62,170,0,0),15 }, + { IPv4(62,172,0,0),21 }, + { IPv4(62,172,0,0),16 }, + { IPv4(62,172,4,0),22 }, + { IPv4(62,180,0,0),16 }, + { IPv4(62,185,204,0),24 }, + { IPv4(62,186,35,0),24 }, + { IPv4(62,186,236,0),24 }, + { IPv4(62,192,0,0),19 }, + { IPv4(62,200,0,0),16 }, + { IPv4(62,204,96,0),19 }, + { IPv4(62,205,0,0),19 }, + { IPv4(62,212,128,0),19 }, + { IPv4(62,215,0,0),16 }, + { IPv4(62,216,192,0),22 }, + { IPv4(62,229,128,0),20 }, + { IPv4(62,229,130,0),24 }, + { IPv4(62,229,132,0),24 }, + { IPv4(62,232,0,0),16 }, + { IPv4(62,232,20,0),24 }, + { IPv4(62,232,21,0),24 }, + { IPv4(62,232,22,0),24 }, + { IPv4(62,232,46,0),24 }, + { IPv4(62,232,72,0),24 }, + { IPv4(62,233,0,0),19 }, + { IPv4(62,238,0,0),16 }, + { IPv4(62,250,0,0),16 }, + { IPv4(62,251,0,0),17 }, + { IPv4(62,252,0,0),17 }, + { IPv4(62,252,0,0),14 }, + { IPv4(62,252,0,0),16 }, + { IPv4(62,252,128,0),17 }, + { IPv4(62,253,128,0),17 }, + { IPv4(62,254,0,0),16 }, + { IPv4(62,254,128,0),17 }, + { IPv4(62,255,128,0),17 }, + { IPv4(63,64,59,0),24 }, + { IPv4(63,64,126,0),24 }, + { IPv4(63,64,130,0),23 }, + { IPv4(63,64,228,0),23 }, + { IPv4(63,64,247,0),24 }, + { IPv4(63,64,254,0),23 }, + { IPv4(63,65,84,0),23 }, + { IPv4(63,65,127,0),24 }, + { IPv4(63,65,176,0),22 }, + { IPv4(63,65,221,0),24 }, + { IPv4(63,65,236,0),22 }, + { IPv4(63,65,248,0),22 }, + { IPv4(63,66,112,0),24 }, + { IPv4(63,66,113,0),24 }, + { IPv4(63,66,240,0),24 }, + { IPv4(63,66,246,0),24 }, + { IPv4(63,67,32,0),24 }, + { IPv4(63,67,73,0),24 }, + { IPv4(63,67,116,0),23 }, + { IPv4(63,67,188,0),24 }, + { IPv4(63,67,196,0),24 }, + { IPv4(63,67,205,0),24 }, + { IPv4(63,68,54,0),23 }, + { IPv4(63,68,112,0),24 }, + { IPv4(63,68,218,0),23 }, + { IPv4(63,69,98,0),23 }, + { IPv4(63,69,114,0),23 }, + { IPv4(63,69,228,0),22 }, + { IPv4(63,69,230,0),24 }, + { IPv4(63,69,231,0),24 }, + { IPv4(63,69,248,0),21 }, + { IPv4(63,70,161,0),24 }, + { IPv4(63,70,164,0),23 }, + { IPv4(63,70,212,0),24 }, + { IPv4(63,71,3,0),24 }, + { IPv4(63,71,94,0),23 }, + { IPv4(63,71,166,0),23 }, + { IPv4(63,72,61,0),24 }, + { IPv4(63,72,216,0),24 }, + { IPv4(63,73,1,0),24 }, + { IPv4(63,73,4,0),22 }, + { IPv4(63,73,10,0),24 }, + { IPv4(63,73,11,0),24 }, + { IPv4(63,73,12,0),24 }, + { IPv4(63,73,58,0),24 }, + { IPv4(63,73,70,0),24 }, + { IPv4(63,73,78,0),24 }, + { IPv4(63,73,123,0),24 }, + { IPv4(63,73,130,0),23 }, + { IPv4(63,73,136,0),22 }, + { IPv4(63,73,169,0),24 }, + { IPv4(63,73,182,0),24 }, + { IPv4(63,73,204,0),24 }, + { IPv4(63,73,224,0),22 }, + { IPv4(63,73,225,0),24 }, + { IPv4(63,73,227,0),24 }, + { IPv4(63,73,238,0),24 }, + { IPv4(63,73,240,0),21 }, + { IPv4(63,74,32,0),23 }, + { IPv4(63,74,89,0),24 }, + { IPv4(63,74,160,0),24 }, + { IPv4(63,74,163,0),24 }, + { IPv4(63,74,226,0),24 }, + { IPv4(63,75,68,0),23 }, + { IPv4(63,75,74,0),24 }, + { IPv4(63,75,78,0),24 }, + { IPv4(63,75,79,0),24 }, + { IPv4(63,75,91,0),24 }, + { IPv4(63,75,167,0),24 }, + { IPv4(63,75,194,0),24 }, + { IPv4(63,76,98,0),24 }, + { IPv4(63,76,137,0),24 }, + { IPv4(63,76,243,0),24 }, + { IPv4(63,76,244,0),24 }, + { IPv4(63,76,245,0),24 }, + { IPv4(63,77,90,0),24 }, + { IPv4(63,78,12,0),22 }, + { IPv4(63,78,137,0),24 }, + { IPv4(63,79,29,0),24 }, + { IPv4(63,79,104,0),24 }, + { IPv4(63,79,105,0),24 }, + { IPv4(63,79,122,0),24 }, + { IPv4(63,79,128,0),21 }, + { IPv4(63,80,13,0),24 }, + { IPv4(63,80,45,0),24 }, + { IPv4(63,81,224,0),24 }, + { IPv4(63,81,227,0),24 }, + { IPv4(63,81,228,0),24 }, + { IPv4(63,81,231,0),24 }, + { IPv4(63,81,234,0),24 }, + { IPv4(63,81,236,0),24 }, + { IPv4(63,81,238,0),24 }, + { IPv4(63,81,239,0),24 }, + { IPv4(63,82,26,0),24 }, + { IPv4(63,82,40,0),22 }, + { IPv4(63,82,43,0),24 }, + { IPv4(63,82,44,0),23 }, + { IPv4(63,82,80,0),24 }, + { IPv4(63,82,241,0),24 }, + { IPv4(63,83,36,0),23 }, + { IPv4(63,83,95,0),24 }, + { IPv4(63,83,140,0),22 }, + { IPv4(63,83,208,0),20 }, + { IPv4(63,83,240,0),22 }, + { IPv4(63,83,244,0),22 }, + { IPv4(63,84,15,0),24 }, + { IPv4(63,84,62,0),24 }, + { IPv4(63,84,63,0),24 }, + { IPv4(63,84,72,0),22 }, + { IPv4(63,84,74,0),24 }, + { IPv4(63,84,122,0),24 }, + { IPv4(63,84,135,0),24 }, + { IPv4(63,84,140,0),22 }, + { IPv4(63,84,231,0),24 }, + { IPv4(63,85,19,0),24 }, + { IPv4(63,85,72,0),24 }, + { IPv4(63,85,181,0),24 }, + { IPv4(63,85,212,0),24 }, + { IPv4(63,85,213,0),24 }, + { IPv4(63,86,126,0),24 }, + { IPv4(63,87,84,0),24 }, + { IPv4(63,87,170,0),23 }, + { IPv4(63,87,173,0),24 }, + { IPv4(63,87,220,0),23 }, + { IPv4(63,88,88,0),23 }, + { IPv4(63,88,172,0),24 }, + { IPv4(63,89,141,0),24 }, + { IPv4(63,89,167,0),24 }, + { IPv4(63,90,24,0),23 }, + { IPv4(63,90,66,0),23 }, + { IPv4(63,90,77,0),24 }, + { IPv4(63,90,79,0),24 }, + { IPv4(63,91,110,0),23 }, + { IPv4(63,91,145,0),24 }, + { IPv4(63,91,172,0),24 }, + { IPv4(63,91,173,0),24 }, + { IPv4(63,92,80,0),21 }, + { IPv4(63,92,88,0),22 }, + { IPv4(63,92,133,0),24 }, + { IPv4(63,92,172,0),24 }, + { IPv4(63,92,192,0),23 }, + { IPv4(63,92,194,0),24 }, + { IPv4(63,93,152,0),24 }, + { IPv4(63,93,196,0),24 }, + { IPv4(63,93,197,0),24 }, + { IPv4(63,93,203,0),24 }, + { IPv4(63,94,99,0),24 }, + { IPv4(63,94,105,0),24 }, + { IPv4(63,95,0,0),21 }, + { IPv4(63,95,86,0),24 }, + { IPv4(63,95,193,0),24 }, + { IPv4(63,95,216,0),24 }, + { IPv4(63,95,254,0),23 }, + { IPv4(63,96,60,0),24 }, + { IPv4(63,96,61,0),24 }, + { IPv4(63,96,62,0),24 }, + { IPv4(63,96,63,0),24 }, + { IPv4(63,97,1,0),24 }, + { IPv4(63,97,144,0),24 }, + { IPv4(63,97,145,0),24 }, + { IPv4(63,97,179,0),24 }, + { IPv4(63,97,180,0),22 }, + { IPv4(63,98,125,0),24 }, + { IPv4(63,98,127,0),24 }, + { IPv4(63,98,188,0),22 }, + { IPv4(63,99,9,0),24 }, + { IPv4(63,99,41,0),24 }, + { IPv4(63,99,120,0),22 }, + { IPv4(63,99,128,0),21 }, + { IPv4(63,99,152,0),23 }, + { IPv4(63,100,17,0),24 }, + { IPv4(63,100,108,0),24 }, + { IPv4(63,100,128,0),23 }, + { IPv4(63,100,130,0),23 }, + { IPv4(63,100,192,0),21 }, + { IPv4(63,100,195,0),24 }, + { IPv4(63,100,199,0),24 }, + { IPv4(63,100,200,0),22 }, + { IPv4(63,100,202,0),23 }, + { IPv4(63,100,204,0),24 }, + { IPv4(63,100,204,0),22 }, + { IPv4(63,100,205,0),24 }, + { IPv4(63,100,206,0),24 }, + { IPv4(63,100,207,0),24 }, + { IPv4(63,100,208,0),24 }, + { IPv4(63,100,209,0),24 }, + { IPv4(63,100,210,0),24 }, + { IPv4(63,100,211,0),24 }, + { IPv4(63,100,212,0),22 }, + { IPv4(63,100,216,0),22 }, + { IPv4(63,100,222,0),23 }, + { IPv4(63,101,54,0),23 }, + { IPv4(63,101,83,0),24 }, + { IPv4(63,101,150,0),23 }, + { IPv4(63,102,5,0),24 }, + { IPv4(63,102,48,0),23 }, + { IPv4(63,102,72,0),21 }, + { IPv4(63,102,192,0),22 }, + { IPv4(63,102,218,0),24 }, + { IPv4(63,102,224,0),22 }, + { IPv4(63,103,40,0),22 }, + { IPv4(63,103,83,0),24 }, + { IPv4(63,103,128,0),24 }, + { IPv4(63,103,129,0),24 }, + { IPv4(63,103,130,0),24 }, + { IPv4(63,103,132,0),23 }, + { IPv4(63,103,134,0),24 }, + { IPv4(63,103,135,0),24 }, + { IPv4(63,103,136,0),24 }, + { IPv4(63,103,137,0),24 }, + { IPv4(63,103,138,0),24 }, + { IPv4(63,103,139,0),24 }, + { IPv4(63,103,140,0),24 }, + { IPv4(63,103,141,0),24 }, + { IPv4(63,103,142,0),24 }, + { IPv4(63,103,143,0),24 }, + { IPv4(63,103,182,0),24 }, + { IPv4(63,103,202,0),24 }, + { IPv4(63,104,48,0),22 }, + { IPv4(63,104,84,0),22 }, + { IPv4(63,104,160,0),24 }, + { IPv4(63,104,192,0),21 }, + { IPv4(63,104,240,0),24 }, + { IPv4(63,104,243,0),24 }, + { IPv4(63,105,7,0),24 }, + { IPv4(63,105,100,0),24 }, + { IPv4(63,105,126,0),23 }, + { IPv4(63,105,192,0),20 }, + { IPv4(63,106,49,0),24 }, + { IPv4(63,106,156,0),23 }, + { IPv4(63,107,10,0),23 }, + { IPv4(63,107,112,0),24 }, + { IPv4(63,107,128,0),24 }, + { IPv4(63,107,135,0),24 }, + { IPv4(63,107,224,0),23 }, + { IPv4(63,108,88,0),21 }, + { IPv4(63,108,112,0),22 }, + { IPv4(63,108,116,0),24 }, + { IPv4(63,108,125,0),24 }, + { IPv4(63,108,133,0),24 }, + { IPv4(63,109,64,0),24 }, + { IPv4(63,109,65,0),24 }, + { IPv4(63,109,68,0),24 }, + { IPv4(63,109,71,0),24 }, + { IPv4(63,109,72,0),24 }, + { IPv4(63,109,75,0),24 }, + { IPv4(63,109,76,0),24 }, + { IPv4(63,109,77,0),24 }, + { IPv4(63,109,78,0),24 }, + { IPv4(63,109,79,0),24 }, + { IPv4(63,109,240,0),20 }, + { IPv4(63,110,83,0),24 }, + { IPv4(63,110,128,0),20 }, + { IPv4(63,110,160,0),21 }, + { IPv4(63,110,188,0),24 }, + { IPv4(63,112,144,0),24 }, + { IPv4(63,112,168,0),22 }, + { IPv4(63,113,38,0),23 }, + { IPv4(63,113,73,0),24 }, + { IPv4(63,113,80,0),20 }, + { IPv4(63,114,0,0),24 }, + { IPv4(63,114,74,0),23 }, + { IPv4(63,114,88,0),23 }, + { IPv4(63,114,195,0),24 }, + { IPv4(63,115,198,0),24 }, + { IPv4(63,117,40,0),21 }, + { IPv4(63,117,79,0),24 }, + { IPv4(63,117,116,0),24 }, + { IPv4(63,117,117,0),24 }, + { IPv4(63,117,118,0),24 }, + { IPv4(63,117,119,0),24 }, + { IPv4(63,118,66,0),24 }, + { IPv4(63,118,148,0),24 }, + { IPv4(63,118,152,0),23 }, + { IPv4(63,118,165,0),24 }, + { IPv4(63,118,246,0),24 }, + { IPv4(63,118,247,0),24 }, + { IPv4(63,120,80,0),24 }, + { IPv4(63,120,115,0),24 }, + { IPv4(63,120,127,0),24 }, + { IPv4(63,120,154,0),24 }, + { IPv4(63,121,1,0),24 }, + { IPv4(63,121,28,0),22 }, + { IPv4(63,121,58,0),24 }, + { IPv4(63,121,84,0),24 }, + { IPv4(63,121,111,0),24 }, + { IPv4(63,121,136,0),22 }, + { IPv4(63,121,144,0),23 }, + { IPv4(63,121,159,0),24 }, + { IPv4(63,122,8,0),24 }, + { IPv4(63,122,36,0),24 }, + { IPv4(63,122,152,0),24 }, + { IPv4(63,122,154,0),24 }, + { IPv4(63,122,155,0),24 }, + { IPv4(63,123,103,0),24 }, + { IPv4(63,124,17,0),24 }, + { IPv4(63,124,32,0),19 }, + { IPv4(63,124,124,0),24 }, + { IPv4(63,124,132,0),24 }, + { IPv4(63,125,6,0),23 }, + { IPv4(63,125,15,0),24 }, + { IPv4(63,125,162,0),23 }, + { IPv4(63,125,222,0),24 }, + { IPv4(63,125,226,0),24 }, + { IPv4(63,126,178,0),24 }, + { IPv4(63,126,208,0),21 }, + { IPv4(63,127,10,0),23 }, + { IPv4(63,127,192,0),21 }, + { IPv4(63,136,64,0),20 }, + { IPv4(63,136,80,0),22 }, + { IPv4(63,137,26,0),24 }, + { IPv4(63,137,252,0),22 }, + { IPv4(63,139,32,0),20 }, + { IPv4(63,140,55,0),24 }, + { IPv4(63,140,132,0),24 }, + { IPv4(63,140,134,0),24 }, + { IPv4(63,140,137,0),24 }, + { IPv4(63,144,15,0),24 }, + { IPv4(63,144,116,0),24 }, + { IPv4(63,144,220,0),24 }, + { IPv4(63,144,236,0),24 }, + { IPv4(63,145,47,0),24 }, + { IPv4(63,145,50,0),24 }, + { IPv4(63,145,61,0),24 }, + { IPv4(63,145,66,0),24 }, + { IPv4(63,145,71,0),24 }, + { IPv4(63,145,72,0),24 }, + { IPv4(63,145,73,0),24 }, + { IPv4(63,145,74,0),24 }, + { IPv4(63,145,76,0),24 }, + { IPv4(63,145,77,0),24 }, + { IPv4(63,145,79,0),24 }, + { IPv4(63,145,80,0),23 }, + { IPv4(63,145,167,0),24 }, + { IPv4(63,145,171,0),24 }, + { IPv4(63,145,192,0),24 }, + { IPv4(63,145,197,0),24 }, + { IPv4(63,145,199,0),24 }, + { IPv4(63,145,200,0),24 }, + { IPv4(63,145,203,0),24 }, + { IPv4(63,145,209,0),24 }, + { IPv4(63,145,210,0),24 }, + { IPv4(63,145,212,0),24 }, + { IPv4(63,145,215,0),24 }, + { IPv4(63,145,226,0),23 }, + { IPv4(63,146,36,0),24 }, + { IPv4(63,146,71,0),24 }, + { IPv4(63,146,93,0),24 }, + { IPv4(63,146,144,0),24 }, + { IPv4(63,146,152,0),24 }, + { IPv4(63,146,154,0),24 }, + { IPv4(63,146,237,0),24 }, + { IPv4(63,146,242,0),23 }, + { IPv4(63,146,252,0),24 }, + { IPv4(63,147,1,0),24 }, + { IPv4(63,147,4,0),24 }, + { IPv4(63,147,6,0),24 }, + { IPv4(63,147,32,0),20 }, + { IPv4(63,147,108,0),22 }, + { IPv4(63,147,128,0),21 }, + { IPv4(63,147,156,0),22 }, + { IPv4(63,147,196,0),24 }, + { IPv4(63,147,200,0),22 }, + { IPv4(63,148,39,0),24 }, + { IPv4(63,148,77,0),24 }, + { IPv4(63,148,93,0),24 }, + { IPv4(63,148,107,0),24 }, + { IPv4(63,149,26,0),24 }, + { IPv4(63,149,28,0),24 }, + { IPv4(63,149,75,0),24 }, + { IPv4(63,149,98,0),24 }, + { IPv4(63,149,100,0),24 }, + { IPv4(63,149,102,0),24 }, + { IPv4(63,149,103,0),24 }, + { IPv4(63,149,113,0),24 }, + { IPv4(63,149,118,0),24 }, + { IPv4(63,149,121,0),24 }, + { IPv4(63,149,125,0),24 }, + { IPv4(63,149,126,0),24 }, + { IPv4(63,149,199,0),24 }, + { IPv4(63,149,232,0),24 }, + { IPv4(63,150,4,0),24 }, + { IPv4(63,150,7,0),24 }, + { IPv4(63,150,44,0),24 }, + { IPv4(63,150,69,0),24 }, + { IPv4(63,150,71,0),24 }, + { IPv4(63,150,72,0),22 }, + { IPv4(63,150,158,0),23 }, + { IPv4(63,150,158,0),24 }, + { IPv4(63,150,160,0),20 }, + { IPv4(63,150,164,0),24 }, + { IPv4(63,150,166,0),24 }, + { IPv4(63,150,167,0),24 }, + { IPv4(63,150,169,0),24 }, + { IPv4(63,150,173,0),24 }, + { IPv4(63,150,174,0),24 }, + { IPv4(63,150,175,0),24 }, + { IPv4(63,150,210,0),23 }, + { IPv4(63,150,213,0),24 }, + { IPv4(63,151,12,0),24 }, + { IPv4(63,151,14,0),24 }, + { IPv4(63,151,15,0),24 }, + { IPv4(63,151,32,0),21 }, + { IPv4(63,151,86,0),23 }, + { IPv4(63,151,137,0),24 }, + { IPv4(63,151,148,0),22 }, + { IPv4(63,151,155,0),24 }, + { IPv4(63,151,191,0),24 }, + { IPv4(63,151,220,0),22 }, + { IPv4(63,151,240,0),21 }, + { IPv4(63,160,32,0),21 }, + { IPv4(63,160,36,0),24 }, + { IPv4(63,160,129,0),24 }, + { IPv4(63,161,4,0),23 }, + { IPv4(63,161,14,0),24 }, + { IPv4(63,161,51,0),24 }, + { IPv4(63,161,73,0),24 }, + { IPv4(63,161,112,0),24 }, + { IPv4(63,161,204,0),22 }, + { IPv4(63,162,36,0),24 }, + { IPv4(63,162,253,0),24 }, + { IPv4(63,163,76,0),23 }, + { IPv4(63,163,160,0),19 }, + { IPv4(63,164,221,0),24 }, + { IPv4(63,165,90,0),24 }, + { IPv4(63,165,127,0),24 }, + { IPv4(63,165,191,0),24 }, + { IPv4(63,166,28,0),23 }, + { IPv4(63,166,30,0),24 }, + { IPv4(63,166,56,0),24 }, + { IPv4(63,166,100,0),24 }, + { IPv4(63,166,114,0),24 }, + { IPv4(63,166,116,0),22 }, + { IPv4(63,166,144,0),24 }, + { IPv4(63,166,226,0),24 }, + { IPv4(63,167,8,0),23 }, + { IPv4(63,167,44,0),22 }, + { IPv4(63,167,108,0),24 }, + { IPv4(63,167,126,0),24 }, + { IPv4(63,167,126,0),23 }, + { IPv4(63,167,127,0),24 }, + { IPv4(63,167,160,0),24 }, + { IPv4(63,167,204,0),24 }, + { IPv4(63,167,205,0),24 }, + { IPv4(63,167,206,0),24 }, + { IPv4(63,167,207,0),24 }, + { IPv4(63,167,208,0),20 }, + { IPv4(63,168,117,0),24 }, + { IPv4(63,168,244,0),23 }, + { IPv4(63,169,11,0),24 }, + { IPv4(63,169,100,0),24 }, + { IPv4(63,169,120,0),21 }, + { IPv4(63,169,132,0),24 }, + { IPv4(63,169,190,0),24 }, + { IPv4(63,170,14,0),24 }, + { IPv4(63,170,78,0),24 }, + { IPv4(63,170,208,0),24 }, + { IPv4(63,170,254,0),23 }, + { IPv4(63,171,3,0),24 }, + { IPv4(63,171,66,0),24 }, + { IPv4(63,171,98,0),23 }, + { IPv4(63,171,251,0),24 }, + { IPv4(63,172,2,0),24 }, + { IPv4(63,172,189,0),24 }, + { IPv4(63,173,76,0),23 }, + { IPv4(63,173,180,0),22 }, + { IPv4(63,174,16,0),20 }, + { IPv4(63,174,82,0),23 }, + { IPv4(63,174,120,0),21 }, + { IPv4(63,174,209,0),24 }, + { IPv4(63,175,32,0),20 }, + { IPv4(63,175,68,0),22 }, + { IPv4(63,175,96,0),24 }, + { IPv4(63,192,112,0),20 }, + { IPv4(63,192,141,0),24 }, + { IPv4(63,194,96,0),19 }, + { IPv4(63,196,192,0),20 }, + { IPv4(63,198,37,0),24 }, + { IPv4(63,201,0,0),20 }, + { IPv4(63,201,7,0),24 }, + { IPv4(63,201,12,0),22 }, + { IPv4(63,201,16,0),20 }, + { IPv4(63,201,154,0),24 }, + { IPv4(63,202,128,0),20 }, + { IPv4(63,202,144,0),20 }, + { IPv4(63,202,150,0),24 }, + { IPv4(63,202,152,0),22 }, + { IPv4(63,210,101,0),24 }, + { IPv4(63,210,255,0),24 }, + { IPv4(63,211,38,0),23 }, + { IPv4(63,214,242,0),24 }, + { IPv4(63,215,70,0),24 }, + { IPv4(63,221,60,0),24 }, + { IPv4(63,224,168,0),24 }, + { IPv4(63,224,189,0),24 }, + { IPv4(63,224,244,0),24 }, + { IPv4(63,225,13,0),24 }, + { IPv4(63,225,63,0),24 }, + { IPv4(63,226,73,0),24 }, + { IPv4(63,226,74,0),24 }, + { IPv4(63,226,75,0),24 }, + { IPv4(63,226,76,0),24 }, + { IPv4(63,226,110,0),23 }, + { IPv4(63,226,158,0),24 }, + { IPv4(63,226,166,0),24 }, + { IPv4(63,227,154,0),23 }, + { IPv4(63,227,188,0),24 }, + { IPv4(63,227,192,0),24 }, + { IPv4(63,228,26,0),24 }, + { IPv4(63,228,28,0),24 }, + { IPv4(63,228,156,0),23 }, + { IPv4(63,228,214,0),23 }, + { IPv4(63,228,220,0),22 }, + { IPv4(63,229,89,0),24 }, + { IPv4(63,229,90,0),24 }, + { IPv4(63,229,91,0),24 }, + { IPv4(63,229,92,0),24 }, + { IPv4(63,229,93,0),24 }, + { IPv4(63,229,94,0),24 }, + { IPv4(63,229,95,0),24 }, + { IPv4(63,229,96,0),24 }, + { IPv4(63,229,104,0),24 }, + { IPv4(63,229,108,0),24 }, + { IPv4(63,229,144,0),20 }, + { IPv4(63,229,182,0),24 }, + { IPv4(63,229,183,0),24 }, + { IPv4(63,230,115,0),24 }, + { IPv4(63,230,116,0),23 }, + { IPv4(63,230,176,0),22 }, + { IPv4(63,230,181,0),24 }, + { IPv4(63,230,182,0),23 }, + { IPv4(63,230,184,0),22 }, + { IPv4(63,230,240,0),23 }, + { IPv4(63,230,250,0),24 }, + { IPv4(63,232,123,0),24 }, + { IPv4(63,232,160,0),22 }, + { IPv4(63,232,164,0),22 }, + { IPv4(63,232,168,0),22 }, + { IPv4(63,232,172,0),22 }, + { IPv4(63,232,176,0),22 }, + { IPv4(63,232,180,0),24 }, + { IPv4(63,232,181,0),24 }, + { IPv4(63,232,183,0),24 }, + { IPv4(63,232,186,0),24 }, + { IPv4(63,232,187,0),24 }, + { IPv4(63,232,188,0),22 }, + { IPv4(63,233,196,0),24 }, + { IPv4(63,233,224,0),22 }, + { IPv4(63,234,56,0),22 }, + { IPv4(63,234,60,0),24 }, + { IPv4(63,236,76,0),23 }, + { IPv4(63,236,112,0),21 }, + { IPv4(63,236,120,0),24 }, + { IPv4(63,236,120,0),23 }, + { IPv4(63,236,142,0),23 }, + { IPv4(63,236,176,0),22 }, + { IPv4(63,236,184,0),22 }, + { IPv4(63,236,250,0),24 }, + { IPv4(63,237,39,0),24 }, + { IPv4(63,237,60,0),24 }, + { IPv4(63,237,80,0),23 }, + { IPv4(63,237,114,0),24 }, + { IPv4(63,237,116,0),24 }, + { IPv4(63,237,125,0),24 }, + { IPv4(63,237,126,0),24 }, + { IPv4(63,237,171,0),24 }, + { IPv4(63,237,186,0),24 }, + { IPv4(63,237,201,0),24 }, + { IPv4(63,237,220,0),24 }, + { IPv4(63,237,225,0),24 }, + { IPv4(63,237,226,0),24 }, + { IPv4(63,237,230,0),23 }, + { IPv4(63,237,233,0),24 }, + { IPv4(63,237,236,0),24 }, + { IPv4(63,237,238,0),24 }, + { IPv4(63,237,239,0),24 }, + { IPv4(63,237,244,0),24 }, + { IPv4(63,237,245,0),24 }, + { IPv4(63,237,246,0),24 }, + { IPv4(63,238,48,0),22 }, + { IPv4(63,238,70,0),24 }, + { IPv4(63,238,79,0),24 }, + { IPv4(63,238,96,0),22 }, + { IPv4(63,238,121,0),24 }, + { IPv4(63,238,128,0),22 }, + { IPv4(63,238,152,0),22 }, + { IPv4(63,238,156,0),23 }, + { IPv4(63,238,160,0),19 }, + { IPv4(63,238,215,0),24 }, + { IPv4(63,238,226,0),24 }, + { IPv4(63,238,230,0),24 }, + { IPv4(63,238,231,0),24 }, + { IPv4(63,239,2,0),24 }, + { IPv4(63,239,5,0),24 }, + { IPv4(63,239,6,0),24 }, + { IPv4(63,239,48,0),21 }, + { IPv4(63,239,60,0),22 }, + { IPv4(63,239,92,0),24 }, + { IPv4(63,239,102,0),24 }, + { IPv4(63,239,116,0),24 }, + { IPv4(63,239,144,0),24 }, + { IPv4(63,239,145,0),24 }, + { IPv4(63,239,148,0),24 }, + { IPv4(63,239,149,0),24 }, + { IPv4(63,239,150,0),24 }, + { IPv4(63,239,163,0),24 }, + { IPv4(63,239,199,0),24 }, + { IPv4(63,239,204,0),23 }, + { IPv4(63,239,204,0),24 }, + { IPv4(63,239,205,0),24 }, + { IPv4(63,239,211,0),24 }, + { IPv4(63,239,240,0),20 }, + { IPv4(63,240,0,0),15 }, + { IPv4(63,240,0,0),18 }, + { IPv4(63,240,4,0),24 }, + { IPv4(63,240,55,0),24 }, + { IPv4(63,240,64,0),19 }, + { IPv4(63,240,128,0),18 }, + { IPv4(63,240,192,0),19 }, + { IPv4(63,240,224,0),19 }, + { IPv4(63,241,0,0),18 }, + { IPv4(63,241,16,0),21 }, + { IPv4(63,241,44,0),23 }, + { IPv4(63,241,48,0),21 }, + { IPv4(63,241,59,0),24 }, + { IPv4(63,241,61,0),24 }, + { IPv4(63,241,62,0),24 }, + { IPv4(63,241,63,0),24 }, + { IPv4(63,241,64,0),19 }, + { IPv4(63,241,91,0),24 }, + { IPv4(63,241,128,0),18 }, + { IPv4(63,241,192,0),18 }, + { IPv4(63,242,0,0),16 }, + { IPv4(63,249,13,0),24 }, + { IPv4(63,249,14,0),23 }, + { IPv4(63,249,16,0),21 }, + { IPv4(63,249,64,0),19 }, + { IPv4(63,250,128,0),20 }, + { IPv4(63,250,144,0),24 }, + { IPv4(63,250,144,0),20 }, + { IPv4(63,250,145,0),24 }, + { IPv4(63,250,146,0),24 }, + { IPv4(63,250,147,0),24 }, + { IPv4(63,250,148,0),24 }, + { IPv4(63,250,150,0),24 }, + { IPv4(63,250,151,0),24 }, + { IPv4(63,250,152,0),24 }, + { IPv4(63,250,153,0),24 }, + { IPv4(63,250,154,0),24 }, + { IPv4(63,250,155,0),24 }, + { IPv4(63,250,156,0),24 }, + { IPv4(63,250,157,0),24 }, + { IPv4(63,250,158,0),24 }, + { IPv4(63,250,159,0),24 }, + { IPv4(63,250,160,0),20 }, + { IPv4(63,250,192,0),19 }, + { IPv4(63,251,0,0),20 }, + { IPv4(63,251,32,0),20 }, + { IPv4(63,251,33,0),24 }, + { IPv4(63,251,35,0),24 }, + { IPv4(63,251,36,0),24 }, + { IPv4(63,251,37,0),24 }, + { IPv4(63,251,40,0),21 }, + { IPv4(63,251,42,0),24 }, + { IPv4(63,251,44,0),23 }, + { IPv4(63,251,48,0),20 }, + { IPv4(63,251,49,0),24 }, + { IPv4(63,251,52,0),24 }, + { IPv4(63,251,60,0),24 }, + { IPv4(63,251,64,0),24 }, + { IPv4(63,251,64,0),20 }, + { IPv4(63,251,65,0),24 }, + { IPv4(63,251,75,0),24 }, + { IPv4(63,251,78,0),24 }, + { IPv4(63,251,80,0),20 }, + { IPv4(63,251,86,0),23 }, + { IPv4(63,251,93,0),24 }, + { IPv4(63,251,95,0),24 }, + { IPv4(63,251,96,0),24 }, + { IPv4(63,251,96,0),20 }, + { IPv4(63,251,106,0),24 }, + { IPv4(63,251,110,0),24 }, + { IPv4(63,251,112,0),20 }, + { IPv4(63,251,118,0),24 }, + { IPv4(63,251,121,0),24 }, + { IPv4(63,251,128,0),20 }, + { IPv4(63,251,140,0),24 }, + { IPv4(63,251,144,0),20 }, + { IPv4(63,251,156,0),24 }, + { IPv4(63,251,160,0),20 }, + { IPv4(63,251,174,0),24 }, + { IPv4(63,251,176,0),20 }, + { IPv4(63,251,192,0),24 }, + { IPv4(63,251,192,0),19 }, + { IPv4(63,251,203,0),24 }, + { IPv4(63,251,208,0),20 }, + { IPv4(63,251,208,0),21 }, + { IPv4(63,251,212,0),24 }, + { IPv4(63,251,213,0),24 }, + { IPv4(63,251,224,0),24 }, + { IPv4(63,251,224,0),19 }, + { IPv4(63,251,228,0),24 }, + { IPv4(63,251,233,0),24 }, + { IPv4(63,251,234,0),24 }, + { IPv4(63,251,239,0),24 }, + { IPv4(63,251,242,0),23 }, + { IPv4(63,251,247,0),24 }, + { IPv4(63,251,251,0),24 }, + { IPv4(64,0,0,0),14 }, + { IPv4(64,0,8,0),21 }, + { IPv4(64,0,25,0),24 }, + { IPv4(64,3,138,0),24 }, + { IPv4(64,3,139,0),24 }, + { IPv4(64,4,0,0),18 }, + { IPv4(64,4,128,0),19 }, + { IPv4(64,4,147,0),24 }, + { IPv4(64,4,148,0),23 }, + { IPv4(64,4,192,0),19 }, + { IPv4(64,5,71,0),24 }, + { IPv4(64,5,224,0),24 }, + { IPv4(64,5,225,0),24 }, + { IPv4(64,5,226,0),24 }, + { IPv4(64,6,64,0),20 }, + { IPv4(64,6,128,0),20 }, + { IPv4(64,6,144,0),20 }, + { IPv4(64,6,176,0),20 }, + { IPv4(64,7,64,0),19 }, + { IPv4(64,7,128,0),20 }, + { IPv4(64,8,128,0),18 }, + { IPv4(64,8,192,0),18 }, + { IPv4(64,9,52,0),24 }, + { IPv4(64,12,0,0),16 }, + { IPv4(64,12,0,0),20 }, + { IPv4(64,13,0,0),16 }, + { IPv4(64,13,64,0),20 }, + { IPv4(64,13,80,0),20 }, + { IPv4(64,14,9,0),24 }, + { IPv4(64,14,74,0),23 }, + { IPv4(64,14,136,0),24 }, + { IPv4(64,14,136,0),23 }, + { IPv4(64,15,162,0),24 }, + { IPv4(64,15,165,0),24 }, + { IPv4(64,15,166,0),24 }, + { IPv4(64,15,194,0),23 }, + { IPv4(64,16,133,0),24 }, + { IPv4(64,16,136,0),24 }, + { IPv4(64,16,147,0),24 }, + { IPv4(64,16,160,0),24 }, + { IPv4(64,16,170,0),24 }, + { IPv4(64,16,173,0),24 }, + { IPv4(64,16,176,0),24 }, + { IPv4(64,16,180,0),24 }, + { IPv4(64,16,184,0),24 }, + { IPv4(64,16,189,0),24 }, + { IPv4(64,17,10,0),24 }, + { IPv4(64,17,19,0),24 }, + { IPv4(64,17,44,0),24 }, + { IPv4(64,17,59,0),24 }, + { IPv4(64,17,60,0),22 }, + { IPv4(64,17,208,0),20 }, + { IPv4(64,20,48,0),20 }, + { IPv4(64,21,0,0),17 }, + { IPv4(64,21,49,0),24 }, + { IPv4(64,21,56,0),23 }, + { IPv4(64,21,68,0),23 }, + { IPv4(64,21,79,0),24 }, + { IPv4(64,21,102,0),23 }, + { IPv4(64,21,128,0),18 }, + { IPv4(64,21,192,0),19 }, + { IPv4(64,22,132,0),22 }, + { IPv4(64,22,132,0),24 }, + { IPv4(64,22,136,0),24 }, + { IPv4(64,22,192,0),19 }, + { IPv4(64,23,217,0),24 }, + { IPv4(64,24,80,0),20 }, + { IPv4(64,24,112,0),21 }, + { IPv4(64,24,112,0),20 }, + { IPv4(64,24,120,0),21 }, + { IPv4(64,26,64,0),18 }, + { IPv4(64,26,128,0),18 }, + { IPv4(64,26,192,0),19 }, + { IPv4(64,26,224,0),19 }, + { IPv4(64,27,64,0),18 }, + { IPv4(64,28,0,0),19 }, + { IPv4(64,28,68,0),23 }, + { IPv4(64,28,144,0),20 }, + { IPv4(64,29,16,0),20 }, + { IPv4(64,29,32,0),20 }, + { IPv4(64,29,64,0),19 }, + { IPv4(64,29,64,0),20 }, + { IPv4(64,29,70,0),24 }, + { IPv4(64,29,71,0),24 }, + { IPv4(64,29,80,0),24 }, + { IPv4(64,29,87,0),24 }, + { IPv4(64,29,94,0),24 }, + { IPv4(64,29,96,0),20 }, + { IPv4(64,29,160,0),20 }, + { IPv4(64,29,168,0),22 }, + { IPv4(64,29,172,0),22 }, + { IPv4(64,29,224,0),20 }, + { IPv4(64,30,17,0),24 }, + { IPv4(64,30,26,0),24 }, + { IPv4(64,30,34,0),24 }, + { IPv4(64,30,128,0),19 }, + { IPv4(64,30,224,0),20 }, + { IPv4(64,31,0,0),19 }, + { IPv4(64,33,120,0),24 }, + { IPv4(64,33,128,0),18 }, + { IPv4(64,35,0,0),18 }, + { IPv4(64,35,0,0),17 }, + { IPv4(64,35,128,0),20 }, + { IPv4(64,35,172,0),24 }, + { IPv4(64,37,64,0),19 }, + { IPv4(64,37,96,0),19 }, + { IPv4(64,37,128,0),21 }, + { IPv4(64,37,144,0),20 }, + { IPv4(64,38,96,0),19 }, + { IPv4(64,38,128,0),18 }, + { IPv4(64,39,0,0),19 }, + { IPv4(64,39,96,0),20 }, + { IPv4(64,39,192,0),19 }, + { IPv4(64,40,0,0),20 }, + { IPv4(64,40,32,0),19 }, + { IPv4(64,40,96,0),20 }, + { IPv4(64,41,152,0),24 }, + { IPv4(64,41,152,0),21 }, + { IPv4(64,41,255,0),24 }, + { IPv4(64,42,0,0),17 }, + { IPv4(64,42,128,0),18 }, + { IPv4(64,43,0,0),16 }, + { IPv4(64,44,40,0),23 }, + { IPv4(64,45,128,0),19 }, + { IPv4(64,46,128,0),19 }, + { IPv4(64,46,160,0),20 }, + { IPv4(64,46,192,0),18 }, + { IPv4(64,48,0,0),16 }, + { IPv4(64,48,128,0),18 }, + { IPv4(64,48,190,0),24 }, + { IPv4(64,49,0,0),18 }, + { IPv4(64,49,128,0),18 }, + { IPv4(64,49,192,0),19 }, + { IPv4(64,50,0,0),17 }, + { IPv4(64,50,7,0),24 }, + { IPv4(64,50,8,0),22 }, + { IPv4(64,50,64,0),20 }, + { IPv4(64,50,97,0),24 }, + { IPv4(64,50,107,0),24 }, + { IPv4(64,50,124,0),24 }, + { IPv4(64,50,125,0),24 }, + { IPv4(64,50,128,0),19 }, + { IPv4(64,50,160,0),19 }, + { IPv4(64,50,192,0),19 }, + { IPv4(64,52,32,0),19 }, + { IPv4(64,52,64,0),20 }, + { IPv4(64,52,112,0),20 }, + { IPv4(64,52,192,0),19 }, + { IPv4(64,53,0,0),18 }, + { IPv4(64,53,64,0),18 }, + { IPv4(64,54,0,0),16 }, + { IPv4(64,55,0,0),16 }, + { IPv4(64,55,0,0),17 }, + { IPv4(64,55,128,0),17 }, + { IPv4(64,56,0,0),19 }, + { IPv4(64,56,96,0),20 }, + { IPv4(64,56,224,0),20 }, + { IPv4(64,57,0,0),20 }, + { IPv4(64,57,224,0),20 }, + { IPv4(64,58,128,0),19 }, + { IPv4(64,58,158,0),23 }, + { IPv4(64,58,160,0),19 }, + { IPv4(64,58,168,0),23 }, + { IPv4(64,58,185,0),24 }, + { IPv4(64,58,190,0),23 }, + { IPv4(64,59,0,0),23 }, + { IPv4(64,59,0,0),18 }, + { IPv4(64,59,10,0),23 }, + { IPv4(64,59,20,0),23 }, + { IPv4(64,59,128,0),19 }, + { IPv4(64,59,128,0),18 }, + { IPv4(64,59,224,0),19 }, + { IPv4(64,60,112,0),21 }, + { IPv4(64,60,120,0),21 }, + { IPv4(64,60,208,0),20 }, + { IPv4(64,60,224,0),20 }, + { IPv4(64,60,240,0),20 }, + { IPv4(64,61,29,0),24 }, + { IPv4(64,62,0,0),21 }, + { IPv4(64,62,0,0),17 }, + { IPv4(64,62,12,0),22 }, + { IPv4(64,62,94,0),24 }, + { IPv4(64,62,104,0),22 }, + { IPv4(64,62,112,0),24 }, + { IPv4(64,62,120,0),24 }, + { IPv4(64,62,125,0),24 }, + { IPv4(64,63,0,0),20 }, + { IPv4(64,63,32,0),19 }, + { IPv4(64,63,64,0),19 }, + { IPv4(64,63,112,0),20 }, + { IPv4(64,63,128,0),20 }, + { IPv4(64,63,176,0),20 }, + { IPv4(64,65,0,0),18 }, + { IPv4(64,66,28,0),24 }, + { IPv4(64,66,32,0),22 }, + { IPv4(64,66,32,0),20 }, + { IPv4(64,68,0,0),19 }, + { IPv4(64,68,32,0),19 }, + { IPv4(64,68,96,0),19 }, + { IPv4(64,68,102,0),23 }, + { IPv4(64,68,128,0),22 }, + { IPv4(64,68,192,0),20 }, + { IPv4(64,69,16,0),20 }, + { IPv4(64,69,64,0),19 }, + { IPv4(64,69,128,0),20 }, + { IPv4(64,69,208,0),20 }, + { IPv4(64,70,4,0),22 }, + { IPv4(64,70,68,0),22 }, + { IPv4(64,70,128,0),17 }, + { IPv4(64,71,64,0),22 }, + { IPv4(64,71,64,0),19 }, + { IPv4(64,71,128,0),18 }, + { IPv4(64,73,0,0),17 }, + { IPv4(64,73,128,0),18 }, + { IPv4(64,74,0,0),19 }, + { IPv4(64,74,5,0),24 }, + { IPv4(64,74,16,0),22 }, + { IPv4(64,74,32,0),19 }, + { IPv4(64,74,36,0),23 }, + { IPv4(64,74,38,0),24 }, + { IPv4(64,74,39,0),24 }, + { IPv4(64,74,44,0),24 }, + { IPv4(64,74,46,0),24 }, + { IPv4(64,74,46,0),23 }, + { IPv4(64,74,47,0),24 }, + { IPv4(64,74,63,0),24 }, + { IPv4(64,75,25,0),24 }, + { IPv4(64,75,26,0),24 }, + { IPv4(64,75,64,0),20 }, + { IPv4(64,75,111,0),24 }, + { IPv4(64,75,112,0),20 }, + { IPv4(64,75,128,0),18 }, + { IPv4(64,75,129,0),24 }, + { IPv4(64,75,133,0),24 }, + { IPv4(64,75,134,0),24 }, + { IPv4(64,75,144,0),22 }, + { IPv4(64,75,148,0),24 }, + { IPv4(64,75,149,0),24 }, + { IPv4(64,75,150,0),23 }, + { IPv4(64,75,152,0),23 }, + { IPv4(64,75,154,0),23 }, + { IPv4(64,75,156,0),23 }, + { IPv4(64,75,158,0),24 }, + { IPv4(64,75,168,0),24 }, + { IPv4(64,75,170,0),24 }, + { IPv4(64,75,176,0),22 }, + { IPv4(64,75,180,0),23 }, + { IPv4(64,75,182,0),23 }, + { IPv4(64,75,184,0),22 }, + { IPv4(64,75,188,0),24 }, + { IPv4(64,75,189,0),24 }, + { IPv4(64,76,68,0),22 }, + { IPv4(64,76,72,0),21 }, + { IPv4(64,76,152,0),24 }, + { IPv4(64,78,0,0),18 }, + { IPv4(64,78,64,0),19 }, + { IPv4(64,78,64,0),18 }, + { IPv4(64,79,0,0),19 }, + { IPv4(64,79,64,0),19 }, + { IPv4(64,79,96,0),20 }, + { IPv4(64,79,224,0),20 }, + { IPv4(64,80,0,0),16 }, + { IPv4(64,81,0,0),19 }, + { IPv4(64,81,32,0),20 }, + { IPv4(64,81,48,0),20 }, + { IPv4(64,81,64,0),20 }, + { IPv4(64,81,80,0),20 }, + { IPv4(64,81,96,0),20 }, + { IPv4(64,81,112,0),20 }, + { IPv4(64,81,128,0),21 }, + { IPv4(64,81,136,0),21 }, + { IPv4(64,81,144,0),20 }, + { IPv4(64,81,160,0),19 }, + { IPv4(64,81,176,0),23 }, + { IPv4(64,81,192,0),19 }, + { IPv4(64,81,224,0),21 }, + { IPv4(64,81,232,0),21 }, + { IPv4(64,81,240,0),20 }, + { IPv4(64,82,0,0),17 }, + { IPv4(64,83,160,0),20 }, + { IPv4(64,84,24,0),23 }, + { IPv4(64,84,26,0),24 }, + { IPv4(64,84,32,0),22 }, + { IPv4(64,84,41,0),24 }, + { IPv4(64,86,16,0),21 }, + { IPv4(64,86,224,0),24 }, + { IPv4(64,86,225,0),24 }, + { IPv4(64,86,253,0),24 }, + { IPv4(64,86,254,0),24 }, + { IPv4(64,87,64,0),19 }, + { IPv4(64,88,128,0),19 }, + { IPv4(64,89,96,0),19 }, + { IPv4(64,89,106,0),24 }, + { IPv4(64,89,107,0),24 }, + { IPv4(64,89,110,0),23 }, + { IPv4(64,89,160,0),20 }, + { IPv4(64,89,224,0),20 }, + { IPv4(64,90,0,0),23 }, + { IPv4(64,90,0,0),19 }, + { IPv4(64,90,2,0),24 }, + { IPv4(64,90,3,0),24 }, + { IPv4(64,90,4,0),24 }, + { IPv4(64,90,5,0),24 }, + { IPv4(64,90,6,0),24 }, + { IPv4(64,90,7,0),24 }, + { IPv4(64,90,8,0),24 }, + { IPv4(64,90,9,0),24 }, + { IPv4(64,90,10,0),24 }, + { IPv4(64,90,12,0),24 }, + { IPv4(64,90,13,0),24 }, + { IPv4(64,90,14,0),24 }, + { IPv4(64,90,15,0),24 }, + { IPv4(64,90,16,0),24 }, + { IPv4(64,90,18,0),24 }, + { IPv4(64,90,19,0),24 }, + { IPv4(64,90,20,0),23 }, + { IPv4(64,90,22,0),24 }, + { IPv4(64,90,23,0),24 }, + { IPv4(64,90,24,0),23 }, + { IPv4(64,90,26,0),24 }, + { IPv4(64,90,27,0),24 }, + { IPv4(64,90,28,0),24 }, + { IPv4(64,90,29,0),24 }, + { IPv4(64,90,30,0),24 }, + { IPv4(64,90,31,0),24 }, + { IPv4(64,90,32,0),19 }, + { IPv4(64,90,64,0),20 }, + { IPv4(64,90,240,0),20 }, + { IPv4(64,91,224,0),20 }, + { IPv4(64,92,75,0),24 }, + { IPv4(64,94,0,0),20 }, + { IPv4(64,94,6,0),24 }, + { IPv4(64,94,13,0),24 }, + { IPv4(64,94,15,0),24 }, + { IPv4(64,94,16,0),20 }, + { IPv4(64,94,30,0),24 }, + { IPv4(64,94,31,0),24 }, + { IPv4(64,94,32,0),20 }, + { IPv4(64,94,48,0),22 }, + { IPv4(64,94,48,0),20 }, + { IPv4(64,94,49,0),24 }, + { IPv4(64,94,57,0),24 }, + { IPv4(64,94,58,0),24 }, + { IPv4(64,94,62,0),24 }, + { IPv4(64,94,64,0),19 }, + { IPv4(64,94,68,0),24 }, + { IPv4(64,94,70,0),24 }, + { IPv4(64,94,78,0),24 }, + { IPv4(64,94,81,0),24 }, + { IPv4(64,94,82,0),24 }, + { IPv4(64,94,83,0),24 }, + { IPv4(64,94,88,0),24 }, + { IPv4(64,94,89,0),24 }, + { IPv4(64,94,93,0),24 }, + { IPv4(64,94,94,0),24 }, + { IPv4(64,94,95,0),24 }, + { IPv4(64,94,96,0),23 }, + { IPv4(64,94,98,0),24 }, + { IPv4(64,94,99,0),24 }, + { IPv4(64,94,108,0),24 }, + { IPv4(64,94,112,0),20 }, + { IPv4(64,94,128,0),22 }, + { IPv4(64,94,128,0),20 }, + { IPv4(64,94,144,0),22 }, + { IPv4(64,94,144,0),20 }, + { IPv4(64,94,151,0),24 }, + { IPv4(64,94,152,0),22 }, + { IPv4(64,94,162,0),24 }, + { IPv4(64,94,170,0),24 }, + { IPv4(64,94,174,0),24 }, + { IPv4(64,94,175,0),24 }, + { IPv4(64,94,180,0),23 }, + { IPv4(64,94,182,0),24 }, + { IPv4(64,94,182,0),23 }, + { IPv4(64,94,188,0),23 }, + { IPv4(64,94,189,0),24 }, + { IPv4(64,94,199,0),24 }, + { IPv4(64,94,202,0),23 }, + { IPv4(64,94,202,0),24 }, + { IPv4(64,94,208,0),20 }, + { IPv4(64,94,214,0),23 }, + { IPv4(64,94,218,0),24 }, + { IPv4(64,94,223,0),24 }, + { IPv4(64,94,224,0),20 }, + { IPv4(64,94,224,0),21 }, + { IPv4(64,94,238,0),24 }, + { IPv4(64,94,240,0),20 }, + { IPv4(64,95,0,0),19 }, + { IPv4(64,95,9,0),24 }, + { IPv4(64,95,12,0),24 }, + { IPv4(64,95,18,0),24 }, + { IPv4(64,95,20,0),24 }, + { IPv4(64,95,26,0),24 }, + { IPv4(64,95,28,0),24 }, + { IPv4(64,95,29,0),24 }, + { IPv4(64,95,48,0),20 }, + { IPv4(64,95,64,0),20 }, + { IPv4(64,95,74,0),24 }, + { IPv4(64,95,80,0),20 }, + { IPv4(64,95,94,0),24 }, + { IPv4(64,95,95,0),24 }, + { IPv4(64,95,96,0),20 }, + { IPv4(64,95,96,0),21 }, + { IPv4(64,95,100,0),22 }, + { IPv4(64,95,112,0),20 }, + { IPv4(64,95,118,0),24 }, + { IPv4(64,95,119,0),24 }, + { IPv4(64,95,128,0),20 }, + { IPv4(64,95,160,0),19 }, + { IPv4(64,95,168,0),22 }, + { IPv4(64,95,172,0),23 }, + { IPv4(64,95,180,0),22 }, + { IPv4(64,95,189,0),24 }, + { IPv4(64,95,192,0),20 }, + { IPv4(64,95,208,0),20 }, + { IPv4(64,95,221,0),24 }, + { IPv4(64,95,222,0),24 }, + { IPv4(64,95,223,0),24 }, + { IPv4(64,95,224,0),24 }, + { IPv4(64,95,224,0),20 }, + { IPv4(64,95,225,0),24 }, + { IPv4(64,95,226,0),24 }, + { IPv4(64,95,227,0),24 }, + { IPv4(64,95,238,0),24 }, + { IPv4(64,95,240,0),20 }, + { IPv4(64,100,0,0),14 }, + { IPv4(64,102,0,0),16 }, + { IPv4(64,104,0,0),16 }, + { IPv4(64,107,0,0),17 }, + { IPv4(64,107,128,0),17 }, + { IPv4(64,110,0,0),19 }, + { IPv4(64,110,15,0),24 }, + { IPv4(64,110,22,0),24 }, + { IPv4(64,110,24,0),22 }, + { IPv4(64,110,24,0),24 }, + { IPv4(64,110,27,0),24 }, + { IPv4(64,110,28,0),22 }, + { IPv4(64,110,29,0),24 }, + { IPv4(64,110,32,0),20 }, + { IPv4(64,110,36,0),23 }, + { IPv4(64,110,48,0),20 }, + { IPv4(64,110,48,0),21 }, + { IPv4(64,110,51,0),24 }, + { IPv4(64,110,54,0),23 }, + { IPv4(64,110,56,0),22 }, + { IPv4(64,110,60,0),22 }, + { IPv4(64,110,64,0),20 }, + { IPv4(64,110,75,0),24 }, + { IPv4(64,110,76,0),23 }, + { IPv4(64,110,79,0),24 }, + { IPv4(64,110,80,0),20 }, + { IPv4(64,110,96,0),20 }, + { IPv4(64,110,104,0),21 }, + { IPv4(64,110,112,0),20 }, + { IPv4(64,110,112,0),24 }, + { IPv4(64,110,113,0),24 }, + { IPv4(64,110,114,0),24 }, + { IPv4(64,110,115,0),24 }, + { IPv4(64,110,121,0),24 }, + { IPv4(64,110,122,0),24 }, + { IPv4(64,110,126,0),24 }, + { IPv4(64,110,128,0),20 }, + { IPv4(64,110,128,0),21 }, + { IPv4(64,110,133,0),24 }, + { IPv4(64,110,136,0),21 }, + { IPv4(64,110,144,0),20 }, + { IPv4(64,110,144,0),21 }, + { IPv4(64,110,148,0),23 }, + { IPv4(64,110,148,0),22 }, + { IPv4(64,110,150,0),23 }, + { IPv4(64,110,156,0),22 }, + { IPv4(64,110,160,0),20 }, + { IPv4(64,110,166,0),24 }, + { IPv4(64,110,176,0),20 }, + { IPv4(64,110,190,0),23 }, + { IPv4(64,111,48,0),20 }, + { IPv4(64,112,16,0),22 }, + { IPv4(64,112,64,0),21 }, + { IPv4(64,113,64,0),19 }, + { IPv4(64,113,192,0),19 }, + { IPv4(64,113,208,0),23 }, + { IPv4(64,115,0,0),19 }, + { IPv4(64,118,64,0),20 }, + { IPv4(64,118,96,0),21 }, + { IPv4(64,118,128,0),20 }, + { IPv4(64,118,130,0),24 }, + { IPv4(64,118,131,0),24 }, + { IPv4(64,118,140,0),24 }, + { IPv4(64,118,143,0),24 }, + { IPv4(64,119,32,0),20 }, + { IPv4(64,119,128,0),20 }, + { IPv4(64,119,160,0),20 }, + { IPv4(64,121,0,0),16 }, + { IPv4(64,122,0,0),19 }, + { IPv4(64,122,16,0),20 }, + { IPv4(64,122,64,0),20 }, + { IPv4(64,123,96,0),21 }, + { IPv4(64,123,195,0),24 }, + { IPv4(64,124,0,0),15 }, + { IPv4(64,124,6,0),24 }, + { IPv4(64,124,31,0),24 }, + { IPv4(64,124,37,0),24 }, + { IPv4(64,124,38,0),24 }, + { IPv4(64,124,41,0),24 }, + { IPv4(64,124,63,0),24 }, + { IPv4(64,124,70,0),24 }, + { IPv4(64,124,92,0),24 }, + { IPv4(64,124,106,0),23 }, + { IPv4(64,124,147,0),24 }, + { IPv4(64,124,148,0),24 }, + { IPv4(64,124,150,0),24 }, + { IPv4(64,124,152,0),24 }, + { IPv4(64,124,169,0),24 }, + { IPv4(64,124,212,0),24 }, + { IPv4(64,124,213,0),24 }, + { IPv4(64,124,236,0),23 }, + { IPv4(64,124,236,0),22 }, + { IPv4(64,124,239,0),24 }, + { IPv4(64,125,88,0),21 }, + { IPv4(64,125,132,0),22 }, + { IPv4(64,125,133,0),24 }, + { IPv4(64,125,134,0),24 }, + { IPv4(64,125,135,0),24 }, + { IPv4(64,125,140,0),24 }, + { IPv4(64,125,178,0),23 }, + { IPv4(64,125,179,0),24 }, + { IPv4(64,125,192,0),22 }, + { IPv4(64,125,248,0),22 }, + { IPv4(64,126,0,0),18 }, + { IPv4(64,127,0,0),18 }, + { IPv4(64,132,2,0),23 }, + { IPv4(64,132,14,0),24 }, + { IPv4(64,132,26,0),24 }, + { IPv4(64,132,83,0),24 }, + { IPv4(64,132,84,0),24 }, + { IPv4(64,134,12,0),24 }, + { IPv4(64,134,16,0),22 }, + { IPv4(64,134,20,0),23 }, + { IPv4(64,134,29,0),24 }, + { IPv4(64,134,126,0),24 }, + { IPv4(64,139,16,0),20 }, + { IPv4(64,139,32,0),20 }, + { IPv4(64,146,0,0),20 }, + { IPv4(64,146,9,0),24 }, + { IPv4(64,147,0,0),19 }, + { IPv4(64,147,192,0),20 }, + { IPv4(64,148,0,0),16 }, + { IPv4(64,148,224,0),20 }, + { IPv4(64,152,6,0),24 }, + { IPv4(64,152,7,0),24 }, + { IPv4(64,152,8,0),22 }, + { IPv4(64,152,12,0),24 }, + { IPv4(64,152,13,0),24 }, + { IPv4(64,152,20,0),24 }, + { IPv4(64,152,21,0),24 }, + { IPv4(64,152,108,0),24 }, + { IPv4(64,152,110,0),24 }, + { IPv4(64,152,111,0),24 }, + { IPv4(64,152,121,0),24 }, + { IPv4(64,152,176,0),21 }, + { IPv4(64,152,195,0),24 }, + { IPv4(64,154,10,0),23 }, + { IPv4(64,154,176,0),21 }, + { IPv4(64,154,194,0),23 }, + { IPv4(64,156,13,0),24 }, + { IPv4(64,156,44,0),23 }, + { IPv4(64,156,50,0),24 }, + { IPv4(64,156,180,0),23 }, + { IPv4(64,157,32,0),21 }, + { IPv4(64,157,129,0),24 }, + { IPv4(64,157,130,0),24 }, + { IPv4(64,157,131,0),24 }, + { IPv4(64,157,171,0),24 }, + { IPv4(64,157,232,0),22 }, + { IPv4(64,158,116,0),24 }, + { IPv4(64,158,118,0),24 }, + { IPv4(64,160,116,0),22 }, + { IPv4(64,161,32,0),20 }, + { IPv4(64,161,48,0),20 }, + { IPv4(64,161,121,0),24 }, + { IPv4(64,162,79,0),24 }, + { IPv4(64,162,99,0),24 }, + { IPv4(64,162,108,0),23 }, + { IPv4(64,162,222,0),24 }, + { IPv4(64,164,59,0),24 }, + { IPv4(64,164,232,0),24 }, + { IPv4(64,165,105,0),24 }, + { IPv4(64,166,160,0),20 }, + { IPv4(64,168,192,0),20 }, + { IPv4(64,169,0,0),20 }, + { IPv4(64,169,41,0),24 }, + { IPv4(64,173,192,0),20 }, + { IPv4(64,173,208,0),20 }, + { IPv4(64,178,0,0),18 }, + { IPv4(64,178,64,0),19 }, + { IPv4(64,181,1,0),24 }, + { IPv4(64,185,128,0),21 }, + { IPv4(64,185,136,0),22 }, + { IPv4(64,185,140,0),22 }, + { IPv4(64,185,140,0),23 }, + { IPv4(64,185,142,0),23 }, + { IPv4(64,185,144,0),20 }, + { IPv4(64,185,144,0),21 }, + { IPv4(64,185,152,0),21 }, + { IPv4(64,186,64,0),21 }, + { IPv4(64,186,72,0),22 }, + { IPv4(64,186,96,0),20 }, + { IPv4(64,186,128,0),20 }, + { IPv4(64,186,160,0),20 }, + { IPv4(64,186,232,0),22 }, + { IPv4(64,188,158,0),23 }, + { IPv4(64,200,0,0),22 }, + { IPv4(64,200,0,0),16 }, + { IPv4(64,200,4,0),22 }, + { IPv4(64,200,16,0),22 }, + { IPv4(64,200,32,0),21 }, + { IPv4(64,200,80,0),23 }, + { IPv4(64,200,82,0),24 }, + { IPv4(64,200,88,0),23 }, + { IPv4(64,200,90,0),23 }, + { IPv4(64,200,92,0),22 }, + { IPv4(64,200,96,0),23 }, + { IPv4(64,200,98,0),24 }, + { IPv4(64,200,99,0),24 }, + { IPv4(64,200,100,0),24 }, + { IPv4(64,200,104,0),23 }, + { IPv4(64,200,112,0),23 }, + { IPv4(64,200,136,0),23 }, + { IPv4(64,200,144,0),21 }, + { IPv4(64,200,144,0),24 }, + { IPv4(64,200,145,0),24 }, + { IPv4(64,200,170,0),23 }, + { IPv4(64,200,172,0),24 }, + { IPv4(64,200,173,0),24 }, + { IPv4(64,200,180,0),23 }, + { IPv4(64,200,184,0),23 }, + { IPv4(64,200,187,0),24 }, + { IPv4(64,200,188,0),23 }, + { IPv4(64,200,192,0),23 }, + { IPv4(64,200,212,0),24 }, + { IPv4(64,200,253,0),24 }, + { IPv4(64,208,52,0),23 }, + { IPv4(64,208,56,0),23 }, + { IPv4(64,208,186,0),23 }, + { IPv4(64,208,240,0),24 }, + { IPv4(64,209,32,0),23 }, + { IPv4(64,209,70,0),23 }, + { IPv4(64,209,92,0),24 }, + { IPv4(64,209,189,0),24 }, + { IPv4(64,209,201,0),24 }, + { IPv4(64,210,75,0),24 }, + { IPv4(64,210,178,0),24 }, + { IPv4(64,211,101,0),24 }, + { IPv4(64,211,184,0),21 }, + { IPv4(64,211,230,0),24 }, + { IPv4(64,212,8,0),21 }, + { IPv4(64,212,152,0),24 }, + { IPv4(64,212,170,0),24 }, + { IPv4(64,212,171,0),24 }, + { IPv4(64,213,66,0),23 }, + { IPv4(64,213,130,0),24 }, + { IPv4(64,214,85,0),24 }, + { IPv4(64,216,96,0),20 }, + { IPv4(64,217,32,0),20 }, + { IPv4(64,220,0,0),15 }, + { IPv4(64,220,201,0),24 }, + { IPv4(64,221,95,0),24 }, + { IPv4(64,221,168,0),21 }, + { IPv4(64,221,207,0),24 }, + { IPv4(64,221,223,0),24 }, + { IPv4(64,221,232,0),24 }, + { IPv4(64,224,0,0),17 }, + { IPv4(64,224,128,0),17 }, + { IPv4(64,225,0,0),16 }, + { IPv4(64,226,0,0),16 }, + { IPv4(64,232,0,0),16 }, + { IPv4(64,232,0,0),22 }, + { IPv4(64,232,52,0),23 }, + { IPv4(64,232,88,0),24 }, + { IPv4(64,232,95,0),24 }, + { IPv4(64,232,116,0),23 }, + { IPv4(64,232,133,0),24 }, + { IPv4(64,232,138,0),24 }, + { IPv4(64,232,152,0),21 }, + { IPv4(64,232,160,0),20 }, + { IPv4(64,232,187,0),24 }, + { IPv4(64,232,196,0),24 }, + { IPv4(64,232,200,0),24 }, + { IPv4(64,232,206,0),24 }, + { IPv4(64,232,212,0),23 }, + { IPv4(64,232,252,0),22 }, + { IPv4(64,233,0,0),17 }, + { IPv4(64,233,8,0),21 }, + { IPv4(64,233,16,0),22 }, + { IPv4(64,236,0,0),16 }, + { IPv4(64,236,12,0),24 }, + { IPv4(64,236,16,0),21 }, + { IPv4(64,238,0,0),20 }, + { IPv4(64,238,128,0),20 }, + { IPv4(64,238,224,0),20 }, + { IPv4(64,239,0,0),18 }, + { IPv4(64,239,128,0),18 }, + { IPv4(64,240,69,0),24 }, + { IPv4(64,240,93,0),24 }, + { IPv4(64,241,64,0),24 }, + { IPv4(64,242,40,0),24 }, + { IPv4(64,242,41,0),24 }, + { IPv4(64,242,42,0),24 }, + { IPv4(64,242,43,0),24 }, + { IPv4(64,242,117,0),24 }, + { IPv4(64,242,118,0),23 }, + { IPv4(64,242,216,0),22 }, + { IPv4(64,242,250,0),23 }, + { IPv4(64,243,232,0),22 }, + { IPv4(64,244,80,0),21 }, + { IPv4(64,244,115,0),24 }, + { IPv4(64,244,120,0),21 }, + { IPv4(64,244,223,0),24 }, + { IPv4(64,245,48,0),20 }, + { IPv4(64,245,96,0),21 }, + { IPv4(64,245,224,0),21 }, + { IPv4(64,247,0,0),19 }, + { IPv4(64,250,128,0),18 }, + { IPv4(64,251,32,0),20 }, + { IPv4(64,251,64,0),20 }, + { IPv4(64,251,160,0),20 }, + { IPv4(64,251,240,0),20 }, + { IPv4(64,252,0,0),16 }, + { IPv4(64,252,224,0),19 }, + { IPv4(64,253,0,0),19 }, + { IPv4(64,253,9,0),24 }, + { IPv4(64,253,10,0),24 }, + { IPv4(64,253,32,0),19 }, + { IPv4(64,253,32,0),22 }, + { IPv4(64,253,36,0),23 }, + { IPv4(64,253,96,0),20 }, + { IPv4(64,254,32,0),19 }, + { IPv4(64,254,96,0),20 }, + { IPv4(64,254,96,0),24 }, + { IPv4(64,254,97,0),24 }, + { IPv4(64,254,98,0),24 }, + { IPv4(64,254,99,0),24 }, + { IPv4(64,254,100,0),24 }, + { IPv4(64,254,102,0),24 }, + { IPv4(64,254,103,0),24 }, + { IPv4(64,254,108,0),24 }, + { IPv4(64,254,160,0),20 }, + { IPv4(64,254,161,0),24 }, + { IPv4(64,254,163,0),24 }, + { IPv4(64,254,165,0),24 }, + { IPv4(64,254,166,0),24 }, + { IPv4(64,254,170,0),24 }, + { IPv4(64,254,172,0),23 }, + { IPv4(64,254,174,0),23 }, + { IPv4(64,255,64,0),19 }, + { IPv4(65,0,0,0),14 }, + { IPv4(65,0,0,0),17 }, + { IPv4(65,0,0,0),12 }, + { IPv4(65,0,0,0),13 }, + { IPv4(65,0,128,0),17 }, + { IPv4(65,1,0,0),17 }, + { IPv4(65,1,128,0),17 }, + { IPv4(65,2,0,0),17 }, + { IPv4(65,2,128,0),18 }, + { IPv4(65,2,192,0),19 }, + { IPv4(65,2,224,0),19 }, + { IPv4(65,3,0,0),18 }, + { IPv4(65,3,64,0),19 }, + { IPv4(65,3,96,0),19 }, + { IPv4(65,3,128,0),17 }, + { IPv4(65,3,192,0),19 }, + { IPv4(65,3,224,0),19 }, + { IPv4(65,4,0,0),16 }, + { IPv4(65,5,0,0),17 }, + { IPv4(65,5,128,0),17 }, + { IPv4(65,6,0,0),15 }, + { IPv4(65,8,0,0),17 }, + { IPv4(65,8,0,0),14 }, + { IPv4(65,8,128,0),17 }, + { IPv4(65,9,0,0),16 }, + { IPv4(65,10,0,0),17 }, + { IPv4(65,10,96,0),19 }, + { IPv4(65,10,128,0),18 }, + { IPv4(65,10,192,0),19 }, + { IPv4(65,10,224,0),19 }, + { IPv4(65,11,0,0),18 }, + { IPv4(65,11,64,0),19 }, + { IPv4(65,11,96,0),19 }, + { IPv4(65,11,128,0),18 }, + { IPv4(65,11,192,0),18 }, + { IPv4(65,12,0,0),17 }, + { IPv4(65,12,128,0),17 }, + { IPv4(65,13,0,0),17 }, + { IPv4(65,13,128,0),18 }, + { IPv4(65,13,192,0),18 }, + { IPv4(65,14,0,0),17 }, + { IPv4(65,14,128,0),17 }, + { IPv4(65,15,0,0),17 }, + { IPv4(65,15,128,0),17 }, + { IPv4(65,21,128,0),18 }, + { IPv4(65,24,0,0),17 }, + { IPv4(65,24,0,0),18 }, + { IPv4(65,24,64,0),18 }, + { IPv4(65,24,128,0),18 }, + { IPv4(65,24,192,0),18 }, + { IPv4(65,24,200,0),21 }, + { IPv4(65,24,208,0),21 }, + { IPv4(65,24,216,0),22 }, + { IPv4(65,24,236,0),22 }, + { IPv4(65,24,240,0),22 }, + { IPv4(65,25,0,0),17 }, + { IPv4(65,25,128,0),19 }, + { IPv4(65,25,160,0),19 }, + { IPv4(65,25,192,0),18 }, + { IPv4(65,26,0,0),17 }, + { IPv4(65,26,128,0),20 }, + { IPv4(65,26,144,0),20 }, + { IPv4(65,26,160,0),20 }, + { IPv4(65,26,176,0),20 }, + { IPv4(65,26,192,0),18 }, + { IPv4(65,27,0,0),17 }, + { IPv4(65,27,80,0),20 }, + { IPv4(65,27,120,0),21 }, + { IPv4(65,27,128,0),17 }, + { IPv4(65,28,0,0),17 }, + { IPv4(65,28,0,0),14 }, + { IPv4(65,28,128,0),20 }, + { IPv4(65,28,144,0),20 }, + { IPv4(65,28,160,0),19 }, + { IPv4(65,28,192,0),19 }, + { IPv4(65,28,224,0),19 }, + { IPv4(65,29,0,0),18 }, + { IPv4(65,29,64,0),19 }, + { IPv4(65,29,96,0),19 }, + { IPv4(65,29,128,0),18 }, + { IPv4(65,29,192,0),19 }, + { IPv4(65,29,224,0),19 }, + { IPv4(65,30,0,0),18 }, + { IPv4(65,30,128,0),18 }, + { IPv4(65,30,192,0),19 }, + { IPv4(65,30,224,0),19 }, + { IPv4(65,31,0,0),19 }, + { IPv4(65,31,32,0),19 }, + { IPv4(65,31,64,0),20 }, + { IPv4(65,31,80,0),20 }, + { IPv4(65,31,96,0),19 }, + { IPv4(65,31,128,0),18 }, + { IPv4(65,31,192,0),20 }, + { IPv4(65,31,224,0),20 }, + { IPv4(65,31,240,0),20 }, + { IPv4(65,32,0,0),17 }, + { IPv4(65,32,128,0),18 }, + { IPv4(65,32,192,0),18 }, + { IPv4(65,33,0,0),17 }, + { IPv4(65,33,128,0),18 }, + { IPv4(65,33,192,0),18 }, + { IPv4(65,34,0,0),20 }, + { IPv4(65,34,16,0),20 }, + { IPv4(65,34,32,0),20 }, + { IPv4(65,34,48,0),20 }, + { IPv4(65,34,64,0),18 }, + { IPv4(65,34,128,0),18 }, + { IPv4(65,34,192,0),18 }, + { IPv4(65,35,0,0),18 }, + { IPv4(65,35,64,0),19 }, + { IPv4(65,35,96,0),19 }, + { IPv4(65,35,128,0),17 }, + { IPv4(65,42,208,0),22 }, + { IPv4(65,45,0,0),17 }, + { IPv4(65,45,0,0),16 }, + { IPv4(65,45,128,0),21 }, + { IPv4(65,45,128,0),18 }, + { IPv4(65,54,128,0),19 }, + { IPv4(65,54,160,0),19 }, + { IPv4(65,54,192,0),19 }, + { IPv4(65,54,224,0),19 }, + { IPv4(65,64,176,0),20 }, + { IPv4(65,65,32,0),20 }, + { IPv4(65,65,224,0),20 }, + { IPv4(65,67,64,0),20 }, + { IPv4(65,68,96,0),20 }, + { IPv4(65,68,160,0),20 }, + { IPv4(65,68,160,0),22 }, + { IPv4(65,68,252,0),24 }, + { IPv4(65,68,253,0),24 }, + { IPv4(65,69,224,0),20 }, + { IPv4(65,70,224,0),20 }, + { IPv4(65,71,160,0),20 }, + { IPv4(65,76,0,0),16 }, + { IPv4(65,88,0,0),24 }, + { IPv4(65,88,0,0),14 }, + { IPv4(65,88,9,0),24 }, + { IPv4(65,88,10,0),23 }, + { IPv4(65,88,22,0),24 }, + { IPv4(65,88,62,0),24 }, + { IPv4(65,88,80,0),22 }, + { IPv4(65,88,84,0),22 }, + { IPv4(65,88,88,0),22 }, + { IPv4(65,88,96,0),20 }, + { IPv4(65,88,112,0),22 }, + { IPv4(65,88,116,0),22 }, + { IPv4(65,88,125,0),24 }, + { IPv4(65,88,168,0),21 }, + { IPv4(65,88,176,0),20 }, + { IPv4(65,88,192,0),21 }, + { IPv4(65,88,200,0),22 }, + { IPv4(65,88,204,0),23 }, + { IPv4(65,88,206,0),24 }, + { IPv4(65,88,207,0),25 }, + { IPv4(65,88,214,0),24 }, + { IPv4(65,88,216,0),22 }, + { IPv4(65,88,240,0),20 }, + { IPv4(65,89,5,0),24 }, + { IPv4(65,89,14,0),23 }, + { IPv4(65,89,32,0),21 }, + { IPv4(65,89,40,0),22 }, + { IPv4(65,89,44,0),22 }, + { IPv4(65,89,48,0),21 }, + { IPv4(65,89,56,0),22 }, + { IPv4(65,89,60,0),22 }, + { IPv4(65,89,80,0),20 }, + { IPv4(65,89,96,0),20 }, + { IPv4(65,89,128,0),22 }, + { IPv4(65,89,150,0),24 }, + { IPv4(65,89,156,0),23 }, + { IPv4(65,89,166,192),26 }, + { IPv4(65,89,204,0),24 }, + { IPv4(65,89,220,0),22 }, + { IPv4(65,89,240,0),21 }, + { IPv4(65,89,250,0),23 }, + { IPv4(65,90,56,0),21 }, + { IPv4(65,90,64,0),21 }, + { IPv4(65,90,72,0),21 }, + { IPv4(65,90,80,0),21 }, + { IPv4(65,90,88,0),21 }, + { IPv4(65,90,144,0),20 }, + { IPv4(65,90,177,0),24 }, + { IPv4(65,90,208,0),20 }, + { IPv4(65,96,0,0),19 }, + { IPv4(65,96,32,0),19 }, + { IPv4(65,96,64,0),18 }, + { IPv4(65,96,128,0),17 }, + { IPv4(65,97,0,0),19 }, + { IPv4(65,100,53,0),24 }, + { IPv4(65,100,54,0),24 }, + { IPv4(65,104,0,0),14 }, + { IPv4(65,105,159,0),24 }, + { IPv4(65,105,191,0),24 }, + { IPv4(65,105,218,0),24 }, + { IPv4(65,105,227,0),24 }, + { IPv4(65,105,236,0),24 }, + { IPv4(65,106,136,0),24 }, + { IPv4(65,106,164,0),24 }, + { IPv4(65,106,171,0),24 }, + { IPv4(65,112,27,0),24 }, + { IPv4(65,112,28,0),23 }, + { IPv4(65,112,31,0),24 }, + { IPv4(65,112,122,0),23 }, + { IPv4(65,112,125,0),24 }, + { IPv4(65,112,126,0),24 }, + { IPv4(65,112,127,0),24 }, + { IPv4(65,112,196,0),24 }, + { IPv4(65,112,198,0),24 }, + { IPv4(65,112,199,0),24 }, + { IPv4(65,112,206,0),24 }, + { IPv4(65,112,216,0),24 }, + { IPv4(65,112,241,0),24 }, + { IPv4(65,112,246,0),23 }, + { IPv4(65,112,255,0),24 }, + { IPv4(65,113,8,0),24 }, + { IPv4(65,113,10,0),24 }, + { IPv4(65,113,11,0),24 }, + { IPv4(65,113,12,0),23 }, + { IPv4(65,113,14,0),23 }, + { IPv4(65,113,45,0),24 }, + { IPv4(65,113,124,0),22 }, + { IPv4(65,113,220,0),22 }, + { IPv4(65,113,224,0),24 }, + { IPv4(65,113,227,0),24 }, + { IPv4(65,113,229,0),24 }, + { IPv4(65,113,230,0),24 }, + { IPv4(65,113,236,0),22 }, + { IPv4(65,113,240,0),24 }, + { IPv4(65,113,242,0),24 }, + { IPv4(65,113,244,0),23 }, + { IPv4(65,114,9,0),24 }, + { IPv4(65,114,27,0),24 }, + { IPv4(65,114,50,0),24 }, + { IPv4(65,114,51,0),24 }, + { IPv4(65,114,194,0),23 }, + { IPv4(65,114,200,0),24 }, + { IPv4(65,114,201,0),24 }, + { IPv4(65,114,202,0),24 }, + { IPv4(65,114,203,0),24 }, + { IPv4(65,114,204,0),24 }, + { IPv4(65,114,205,0),24 }, + { IPv4(65,114,210,0),24 }, + { IPv4(65,114,211,0),24 }, + { IPv4(65,114,213,0),24 }, + { IPv4(65,114,214,0),24 }, + { IPv4(65,114,215,0),24 }, + { IPv4(65,114,216,0),23 }, + { IPv4(65,114,220,0),24 }, + { IPv4(65,114,221,0),24 }, + { IPv4(65,114,222,0),24 }, + { IPv4(65,114,223,0),24 }, + { IPv4(65,114,227,0),24 }, + { IPv4(65,114,228,0),24 }, + { IPv4(65,114,229,0),24 }, + { IPv4(65,114,230,0),24 }, + { IPv4(65,114,232,0),24 }, + { IPv4(65,114,234,0),24 }, + { IPv4(65,114,239,0),24 }, + { IPv4(65,114,240,0),24 }, + { IPv4(65,114,241,0),24 }, + { IPv4(65,114,244,0),23 }, + { IPv4(65,114,247,0),24 }, + { IPv4(65,114,248,0),23 }, + { IPv4(65,114,250,0),24 }, + { IPv4(65,115,54,0),24 }, + { IPv4(65,115,174,0),24 }, + { IPv4(65,115,238,0),24 }, + { IPv4(65,116,66,0),24 }, + { IPv4(65,116,67,0),24 }, + { IPv4(65,116,68,0),24 }, + { IPv4(65,116,76,0),24 }, + { IPv4(65,116,77,0),24 }, + { IPv4(65,116,78,0),24 }, + { IPv4(65,116,183,0),24 }, + { IPv4(65,116,186,0),24 }, + { IPv4(65,116,228,0),23 }, + { IPv4(65,116,240,0),24 }, + { IPv4(65,116,242,0),24 }, + { IPv4(65,116,243,0),24 }, + { IPv4(65,117,80,0),24 }, + { IPv4(65,117,81,0),24 }, + { IPv4(65,117,86,0),24 }, + { IPv4(65,117,87,0),24 }, + { IPv4(65,117,88,0),21 }, + { IPv4(65,117,102,0),24 }, + { IPv4(65,117,103,0),24 }, + { IPv4(65,117,104,0),21 }, + { IPv4(65,117,150,0),24 }, + { IPv4(65,117,242,0),23 }, + { IPv4(65,117,244,0),24 }, + { IPv4(65,117,245,0),24 }, + { IPv4(65,117,247,0),24 }, + { IPv4(65,117,249,0),24 }, + { IPv4(65,117,252,0),24 }, + { IPv4(65,117,253,0),24 }, + { IPv4(65,120,230,0),24 }, + { IPv4(65,120,231,0),24 }, + { IPv4(65,120,240,0),23 }, + { IPv4(65,120,242,0),23 }, + { IPv4(65,121,0,0),23 }, + { IPv4(65,121,4,0),24 }, + { IPv4(65,121,8,0),23 }, + { IPv4(65,121,18,0),24 }, + { IPv4(65,121,28,0),24 }, + { IPv4(65,121,33,0),24 }, + { IPv4(65,121,34,0),24 }, + { IPv4(65,121,86,0),24 }, + { IPv4(65,160,176,0),20 }, + { IPv4(65,160,224,0),20 }, + { IPv4(65,161,12,0),23 }, + { IPv4(65,161,42,0),24 }, + { IPv4(65,161,43,0),24 }, + { IPv4(65,161,122,0),23 }, + { IPv4(65,161,192,0),24 }, + { IPv4(65,163,56,0),24 }, + { IPv4(65,163,129,0),24 }, + { IPv4(65,163,182,0),24 }, + { IPv4(65,163,226,0),24 }, + { IPv4(65,163,227,0),24 }, + { IPv4(65,164,116,0),22 }, + { IPv4(65,164,118,0),24 }, + { IPv4(65,164,145,0),24 }, + { IPv4(65,164,236,0),22 }, + { IPv4(65,165,67,0),24 }, + { IPv4(65,165,127,0),24 }, + { IPv4(65,165,134,0),23 }, + { IPv4(65,166,123,0),24 }, + { IPv4(65,166,147,0),24 }, + { IPv4(65,166,233,0),24 }, + { IPv4(65,167,179,0),24 }, + { IPv4(65,168,39,0),24 }, + { IPv4(65,168,204,0),22 }, + { IPv4(65,170,140,0),22 }, + { IPv4(65,170,225,0),24 }, + { IPv4(65,171,16,0),21 }, + { IPv4(65,174,28,0),22 }, + { IPv4(65,174,51,0),24 }, + { IPv4(65,174,154,0),23 }, + { IPv4(65,192,32,0),24 }, + { IPv4(65,192,36,0),23 }, + { IPv4(65,193,3,0),24 }, + { IPv4(65,193,19,0),24 }, + { IPv4(65,193,164,0),22 }, + { IPv4(65,193,252,0),22 }, + { IPv4(65,194,128,0),21 }, + { IPv4(65,194,184,0),22 }, + { IPv4(65,195,9,0),24 }, + { IPv4(65,195,12,0),24 }, + { IPv4(65,195,32,0),21 }, + { IPv4(65,195,209,0),24 }, + { IPv4(65,195,211,0),24 }, + { IPv4(65,196,66,0),23 }, + { IPv4(65,197,21,0),24 }, + { IPv4(65,197,91,0),24 }, + { IPv4(65,197,177,0),24 }, + { IPv4(65,197,236,0),22 }, + { IPv4(65,198,132,0),23 }, + { IPv4(65,198,187,0),24 }, + { IPv4(65,198,197,0),24 }, + { IPv4(65,198,198,0),24 }, + { IPv4(65,198,219,0),24 }, + { IPv4(65,198,220,0),23 }, + { IPv4(65,199,0,0),21 }, + { IPv4(65,199,16,0),24 }, + { IPv4(65,199,17,0),24 }, + { IPv4(65,199,18,0),24 }, + { IPv4(65,199,19,0),24 }, + { IPv4(65,199,28,0),24 }, + { IPv4(65,199,44,0),24 }, + { IPv4(65,199,145,0),24 }, + { IPv4(65,199,148,0),24 }, + { IPv4(65,199,149,0),24 }, + { IPv4(65,199,213,0),24 }, + { IPv4(65,200,30,0),24 }, + { IPv4(65,200,122,0),24 }, + { IPv4(65,201,12,0),22 }, + { IPv4(65,201,209,0),24 }, + { IPv4(65,202,11,0),24 }, + { IPv4(65,202,30,0),24 }, + { IPv4(65,202,64,0),22 }, + { IPv4(65,202,115,0),24 }, + { IPv4(65,202,192,0),23 }, + { IPv4(65,203,43,0),24 }, + { IPv4(65,204,41,0),24 }, + { IPv4(65,204,80,0),24 }, + { IPv4(65,204,150,0),24 }, + { IPv4(65,204,186,0),24 }, + { IPv4(65,205,141,0),24 }, + { IPv4(65,205,160,0),22 }, + { IPv4(65,205,191,0),24 }, + { IPv4(65,205,248,0),22 }, + { IPv4(65,206,228,0),22 }, + { IPv4(65,207,56,0),21 }, + { IPv4(65,208,24,0),22 }, + { IPv4(65,208,97,0),24 }, + { IPv4(65,210,129,0),24 }, + { IPv4(65,210,176,0),20 }, + { IPv4(65,211,151,0),24 }, + { IPv4(66,1,224,0),20 }, + { IPv4(66,2,0,0),17 }, + { IPv4(66,2,128,0),18 }, + { IPv4(66,3,0,0),17 }, + { IPv4(66,3,32,0),20 }, + { IPv4(66,3,128,0),18 }, + { IPv4(66,3,192,0),18 }, + { IPv4(66,4,0,0),17 }, + { IPv4(66,4,128,0),17 }, + { IPv4(66,5,0,0),17 }, + { IPv4(66,5,128,0),17 }, + { IPv4(66,6,0,0),20 }, + { IPv4(66,6,96,0),19 }, + { IPv4(66,6,160,0),23 }, + { IPv4(66,6,160,0),20 }, + { IPv4(66,6,162,0),24 }, + { IPv4(66,6,163,0),24 }, + { IPv4(66,6,164,0),24 }, + { IPv4(66,6,165,0),24 }, + { IPv4(66,7,128,0),24 }, + { IPv4(66,7,142,0),24 }, + { IPv4(66,7,145,0),24 }, + { IPv4(66,7,160,0),24 }, + { IPv4(66,7,191,0),24 }, + { IPv4(66,7,224,0),20 }, + { IPv4(66,8,128,0),19 }, + { IPv4(66,8,160,0),20 }, + { IPv4(66,8,176,0),20 }, + { IPv4(66,8,192,0),20 }, + { IPv4(66,8,208,0),20 }, + { IPv4(66,8,224,0),20 }, + { IPv4(66,8,240,0),20 }, + { IPv4(66,9,0,0),16 }, + { IPv4(66,21,4,0),24 }, + { IPv4(66,24,0,0),18 }, + { IPv4(66,24,64,0),18 }, + { IPv4(66,24,128,0),19 }, + { IPv4(66,24,160,0),20 }, + { IPv4(66,24,176,0),20 }, + { IPv4(66,24,192,0),19 }, + { IPv4(66,24,224,0),19 }, + { IPv4(66,25,0,0),18 }, + { IPv4(66,25,64,0),19 }, + { IPv4(66,25,96,0),19 }, + { IPv4(66,25,128,0),17 }, + { IPv4(66,26,0,0),20 }, + { IPv4(66,26,16,0),20 }, + { IPv4(66,26,32,0),19 }, + { IPv4(66,26,64,0),19 }, + { IPv4(66,26,96,0),20 }, + { IPv4(66,26,112,0),20 }, + { IPv4(66,26,128,0),19 }, + { IPv4(66,26,160,0),20 }, + { IPv4(66,26,176,0),20 }, + { IPv4(66,26,192,0),19 }, + { IPv4(66,26,224,0),19 }, + { IPv4(66,27,0,0),20 }, + { IPv4(66,27,16,0),20 }, + { IPv4(66,27,32,0),20 }, + { IPv4(66,27,48,0),20 }, + { IPv4(66,27,64,0),18 }, + { IPv4(66,27,128,0),19 }, + { IPv4(66,27,160,0),19 }, + { IPv4(66,27,192,0),19 }, + { IPv4(66,27,224,0),20 }, + { IPv4(66,27,240,0),20 }, + { IPv4(66,28,0,0),17 }, + { IPv4(66,28,13,0),24 }, + { IPv4(66,28,15,0),24 }, + { IPv4(66,28,17,0),24 }, + { IPv4(66,30,0,0),19 }, + { IPv4(66,30,32,0),20 }, + { IPv4(66,30,48,0),20 }, + { IPv4(66,30,64,0),18 }, + { IPv4(66,30,128,0),18 }, + { IPv4(66,30,192,0),18 }, + { IPv4(66,31,0,0),16 }, + { IPv4(66,32,4,0),22 }, + { IPv4(66,32,32,0),21 }, + { IPv4(66,32,112,0),20 }, + { IPv4(66,32,136,0),22 }, + { IPv4(66,33,0,0),17 }, + { IPv4(66,33,128,0),19 }, + { IPv4(66,35,64,0),19 }, + { IPv4(66,35,68,0),22 }, + { IPv4(66,35,72,0),23 }, + { IPv4(66,35,78,0),24 }, + { IPv4(66,36,0,0),20 }, + { IPv4(66,37,128,0),20 }, + { IPv4(66,37,160,0),20 }, + { IPv4(66,37,172,0),24 }, + { IPv4(66,37,173,0),24 }, + { IPv4(66,37,224,0),20 }, + { IPv4(66,38,0,0),24 }, + { IPv4(66,38,0,0),20 }, + { IPv4(66,38,1,0),24 }, + { IPv4(66,38,2,0),24 }, + { IPv4(66,38,3,0),24 }, + { IPv4(66,38,4,0),22 }, + { IPv4(66,38,8,0),22 }, + { IPv4(66,38,12,0),22 }, + { IPv4(66,38,16,0),20 }, + { IPv4(66,38,16,0),22 }, + { IPv4(66,38,20,0),22 }, + { IPv4(66,38,24,0),22 }, + { IPv4(66,38,28,0),24 }, + { IPv4(66,38,28,0),22 }, + { IPv4(66,38,29,0),24 }, + { IPv4(66,38,30,0),24 }, + { IPv4(66,38,31,0),24 }, + { IPv4(66,38,32,0),20 }, + { IPv4(66,38,32,0),21 }, + { IPv4(66,38,32,0),22 }, + { IPv4(66,38,36,0),22 }, + { IPv4(66,38,40,0),22 }, + { IPv4(66,38,44,0),23 }, + { IPv4(66,38,44,0),22 }, + { IPv4(66,38,46,0),23 }, + { IPv4(66,38,48,0),24 }, + { IPv4(66,38,48,0),22 }, + { IPv4(66,38,48,0),20 }, + { IPv4(66,38,52,0),24 }, + { IPv4(66,38,54,0),23 }, + { IPv4(66,38,63,0),24 }, + { IPv4(66,38,181,0),24 }, + { IPv4(66,38,182,0),24 }, + { IPv4(66,39,0,0),17 }, + { IPv4(66,40,0,0),18 }, + { IPv4(66,40,64,0),19 }, + { IPv4(66,40,80,0),20 }, + { IPv4(66,40,96,0),21 }, + { IPv4(66,40,96,0),20 }, + { IPv4(66,40,104,0),21 }, + { IPv4(66,40,112,0),20 }, + { IPv4(66,40,128,0),17 }, + { IPv4(66,40,248,0),21 }, + { IPv4(66,41,0,0),19 }, + { IPv4(66,41,32,0),19 }, + { IPv4(66,41,80,0),20 }, + { IPv4(66,41,96,0),19 }, + { IPv4(66,41,128,0),20 }, + { IPv4(66,41,144,0),20 }, + { IPv4(66,41,160,0),19 }, + { IPv4(66,41,192,0),18 }, + { IPv4(66,42,32,0),20 }, + { IPv4(66,43,192,0),18 }, + { IPv4(66,44,0,0),17 }, + { IPv4(66,45,0,0),17 }, + { IPv4(66,45,0,0),20 }, + { IPv4(66,45,0,0),23 }, + { IPv4(66,45,0,0),18 }, + { IPv4(66,45,2,0),23 }, + { IPv4(66,45,8,0),24 }, + { IPv4(66,45,9,0),24 }, + { IPv4(66,45,10,0),23 }, + { IPv4(66,45,12,0),24 }, + { IPv4(66,45,13,0),24 }, + { IPv4(66,45,14,0),24 }, + { IPv4(66,45,15,0),24 }, + { IPv4(66,45,16,0),22 }, + { IPv4(66,45,16,0),20 }, + { IPv4(66,45,20,0),22 }, + { IPv4(66,45,24,0),24 }, + { IPv4(66,45,25,0),24 }, + { IPv4(66,45,26,0),23 }, + { IPv4(66,45,28,0),22 }, + { IPv4(66,45,32,0),22 }, + { IPv4(66,45,32,0),20 }, + { IPv4(66,45,36,0),23 }, + { IPv4(66,45,38,0),23 }, + { IPv4(66,45,41,0),24 }, + { IPv4(66,45,42,0),24 }, + { IPv4(66,45,43,0),24 }, + { IPv4(66,45,44,0),22 }, + { IPv4(66,45,48,0),24 }, + { IPv4(66,45,49,0),24 }, + { IPv4(66,45,50,0),23 }, + { IPv4(66,45,52,0),22 }, + { IPv4(66,45,56,0),23 }, + { IPv4(66,45,59,0),24 }, + { IPv4(66,45,60,0),22 }, + { IPv4(66,45,64,0),21 }, + { IPv4(66,45,64,0),19 }, + { IPv4(66,45,72,0),24 }, + { IPv4(66,45,73,0),24 }, + { IPv4(66,45,74,0),24 }, + { IPv4(66,45,75,0),24 }, + { IPv4(66,45,76,0),23 }, + { IPv4(66,45,78,0),24 }, + { IPv4(66,45,80,0),24 }, + { IPv4(66,45,81,0),24 }, + { IPv4(66,45,82,0),23 }, + { IPv4(66,45,84,0),24 }, + { IPv4(66,45,86,0),23 }, + { IPv4(66,45,88,0),21 }, + { IPv4(66,45,96,0),20 }, + { IPv4(66,45,102,0),23 }, + { IPv4(66,45,104,0),21 }, + { IPv4(66,45,112,0),22 }, + { IPv4(66,45,116,0),23 }, + { IPv4(66,45,120,0),21 }, + { IPv4(66,46,0,0),16 }, + { IPv4(66,46,144,0),21 }, + { IPv4(66,47,4,0),22 }, + { IPv4(66,47,40,0),22 }, + { IPv4(66,47,144,0),22 }, + { IPv4(66,47,148,0),22 }, + { IPv4(66,47,156,0),22 }, + { IPv4(66,47,160,0),20 }, + { IPv4(66,47,188,0),22 }, + { IPv4(66,47,224,0),20 }, + { IPv4(66,47,240,0),22 }, + { IPv4(66,51,7,0),24 }, + { IPv4(66,51,8,0),24 }, + { IPv4(66,51,9,0),24 }, + { IPv4(66,51,10,0),24 }, + { IPv4(66,51,11,0),24 }, + { IPv4(66,51,24,0),23 }, + { IPv4(66,51,26,0),23 }, + { IPv4(66,51,28,0),24 }, + { IPv4(66,51,30,0),24 }, + { IPv4(66,51,32,0),20 }, + { IPv4(66,51,64,0),20 }, + { IPv4(66,51,80,0),22 }, + { IPv4(66,52,192,0),18 }, + { IPv4(66,53,32,0),19 }, + { IPv4(66,53,64,0),19 }, + { IPv4(66,54,154,0),24 }, + { IPv4(66,54,155,0),24 }, + { IPv4(66,54,186,0),24 }, + { IPv4(66,54,193,0),24 }, + { IPv4(66,54,200,0),21 }, + { IPv4(66,54,209,0),24 }, + { IPv4(66,55,0,0),18 }, + { IPv4(66,56,0,0),18 }, + { IPv4(66,56,64,0),19 }, + { IPv4(66,56,96,0),20 }, + { IPv4(66,56,96,0),19 }, + { IPv4(66,56,112,0),20 }, + { IPv4(66,56,128,0),19 }, + { IPv4(66,56,160,0),19 }, + { IPv4(66,56,192,0),19 }, + { IPv4(66,56,224,0),19 }, + { IPv4(66,57,0,0),19 }, + { IPv4(66,57,32,0),19 }, + { IPv4(66,57,32,0),20 }, + { IPv4(66,57,48,0),20 }, + { IPv4(66,57,64,0),19 }, + { IPv4(66,57,96,0),19 }, + { IPv4(66,57,128,0),19 }, + { IPv4(66,57,160,0),19 }, + { IPv4(66,57,192,0),20 }, + { IPv4(66,61,0,0),20 }, + { IPv4(66,61,16,0),20 }, + { IPv4(66,61,32,0),19 }, + { IPv4(66,61,64,0),18 }, + { IPv4(66,61,128,0),19 }, + { IPv4(66,61,144,0),20 }, + { IPv4(66,61,152,0),21 }, + { IPv4(66,61,160,0),19 }, + { IPv4(66,62,0,0),16 }, + { IPv4(66,62,55,0),24 }, + { IPv4(66,62,61,0),24 }, + { IPv4(66,62,224,0),19 }, + { IPv4(66,62,245,0),24 }, + { IPv4(66,65,0,0),18 }, + { IPv4(66,65,64,0),19 }, + { IPv4(66,65,96,0),20 }, + { IPv4(66,65,112,0),20 }, + { IPv4(66,66,0,0),18 }, + { IPv4(66,66,64,0),18 }, + { IPv4(66,66,128,0),18 }, + { IPv4(66,66,192,0),18 }, + { IPv4(66,67,0,0),19 }, + { IPv4(66,67,32,0),20 }, + { IPv4(66,67,48,0),20 }, + { IPv4(66,67,64,0),18 }, + { IPv4(66,68,0,0),17 }, + { IPv4(66,68,128,0),18 }, + { IPv4(66,69,0,0),17 }, + { IPv4(66,69,128,0),18 }, + { IPv4(66,69,192,0),18 }, + { IPv4(66,70,0,0),18 }, + { IPv4(66,70,0,0),17 }, + { IPv4(66,70,58,0),23 }, + { IPv4(66,70,64,0),18 }, + { IPv4(66,70,120,0),22 }, + { IPv4(66,70,152,0),21 }, + { IPv4(66,70,176,0),22 }, + { IPv4(66,70,185,0),24 }, + { IPv4(66,70,188,0),22 }, + { IPv4(66,70,216,0),21 }, + { IPv4(66,71,0,0),17 }, + { IPv4(66,71,128,0),18 }, + { IPv4(66,74,0,0),18 }, + { IPv4(66,74,64,0),19 }, + { IPv4(66,74,96,0),20 }, + { IPv4(66,74,112,0),20 }, + { IPv4(66,74,128,0),18 }, + { IPv4(66,74,192,0),19 }, + { IPv4(66,74,224,0),20 }, + { IPv4(66,74,240,0),20 }, + { IPv4(66,75,0,0),19 }, + { IPv4(66,75,32,0),19 }, + { IPv4(66,75,64,0),19 }, + { IPv4(66,75,96,0),19 }, + { IPv4(66,75,128,0),19 }, + { IPv4(66,75,160,0),20 }, + { IPv4(66,75,176,0),20 }, + { IPv4(66,75,192,0),19 }, + { IPv4(66,76,0,0),18 }, + { IPv4(66,76,64,0),20 }, + { IPv4(66,76,80,0),20 }, + { IPv4(66,76,96,0),20 }, + { IPv4(66,76,112,0),20 }, + { IPv4(66,76,128,0),20 }, + { IPv4(66,76,160,0),20 }, + { IPv4(66,76,176,0),20 }, + { IPv4(66,77,32,0),21 }, + { IPv4(66,77,34,0),24 }, + { IPv4(66,77,36,0),23 }, + { IPv4(66,77,38,0),24 }, + { IPv4(66,79,128,0),19 }, + { IPv4(66,79,129,0),24 }, + { IPv4(66,79,132,0),24 }, + { IPv4(66,79,133,0),24 }, + { IPv4(66,79,135,0),24 }, + { IPv4(66,79,136,0),24 }, + { IPv4(66,81,0,0),17 }, + { IPv4(66,82,0,0),19 }, + { IPv4(66,87,32,0),20 }, + { IPv4(66,87,48,0),20 }, + { IPv4(66,87,128,0),20 }, + { IPv4(66,87,208,0),20 }, + { IPv4(66,88,0,0),15 }, + { IPv4(66,90,0,0),21 }, + { IPv4(66,91,0,0),18 }, + { IPv4(66,91,64,0),19 }, + { IPv4(66,91,96,0),20 }, + { IPv4(66,92,0,0),19 }, + { IPv4(66,92,20,0),22 }, + { IPv4(66,92,32,0),19 }, + { IPv4(66,92,64,0),19 }, + { IPv4(66,92,96,0),19 }, + { IPv4(66,92,128,0),20 }, + { IPv4(66,92,144,0),20 }, + { IPv4(66,92,160,0),20 }, + { IPv4(66,92,176,0),20 }, + { IPv4(66,92,192,0),22 }, + { IPv4(66,92,196,0),22 }, + { IPv4(66,92,200,0),22 }, + { IPv4(66,92,204,0),22 }, + { IPv4(66,92,208,0),22 }, + { IPv4(66,92,216,0),21 }, + { IPv4(66,92,240,0),21 }, + { IPv4(66,92,248,0),22 }, + { IPv4(66,92,252,0),22 }, + { IPv4(66,95,0,0),17 }, + { IPv4(66,95,128,0),19 }, + { IPv4(66,96,0,0),20 }, + { IPv4(66,96,192,0),18 }, + { IPv4(66,99,0,0),16 }, + { IPv4(66,100,104,0),22 }, + { IPv4(66,100,108,0),23 }, + { IPv4(66,101,32,0),20 }, + { IPv4(66,105,0,0),16 }, + { IPv4(66,106,0,0),15 }, + { IPv4(66,108,0,0),17 }, + { IPv4(66,108,128,0),17 }, + { IPv4(66,109,160,0),20 }, + { IPv4(66,109,192,0),20 }, + { IPv4(66,110,28,0),23 }, + { IPv4(66,111,192,0),19 }, + { IPv4(66,111,224,0),19 }, + { IPv4(66,113,0,0),19 }, + { IPv4(66,114,64,0),20 }, + { IPv4(66,114,96,0),20 }, + { IPv4(66,114,128,0),19 }, + { IPv4(66,115,128,0),18 }, + { IPv4(66,118,64,0),19 }, + { IPv4(66,118,80,0),20 }, + { IPv4(66,118,192,0),19 }, + { IPv4(66,119,192,0),19 }, + { IPv4(66,119,196,0),22 }, + { IPv4(66,119,200,0),22 }, + { IPv4(66,119,208,0),22 }, + { IPv4(66,121,192,0),20 }, + { IPv4(66,122,64,0),20 }, + { IPv4(66,122,164,0),24 }, + { IPv4(66,128,2,0),24 }, + { IPv4(66,128,96,0),20 }, + { IPv4(66,128,160,0),20 }, + { IPv4(66,129,64,0),20 }, + { IPv4(66,129,80,0),20 }, + { IPv4(66,129,192,0),19 }, + { IPv4(66,130,0,0),17 }, + { IPv4(66,133,0,0),18 }, + { IPv4(66,133,4,0),24 }, + { IPv4(66,133,21,0),24 }, + { IPv4(66,135,128,0),20 }, + { IPv4(66,135,224,0),20 }, + { IPv4(66,137,176,0),20 }, + { IPv4(66,144,0,0),15 }, + { IPv4(66,149,0,0),17 }, + { IPv4(66,149,64,0),20 }, + { IPv4(66,149,112,0),22 }, + { IPv4(66,149,120,0),22 }, + { IPv4(66,150,0,0),20 }, + { IPv4(66,150,5,0),24 }, + { IPv4(66,150,14,0),24 }, + { IPv4(66,150,16,0),20 }, + { IPv4(66,150,48,0),20 }, + { IPv4(66,150,64,0),21 }, + { IPv4(66,150,64,0),20 }, + { IPv4(66,150,96,0),20 }, + { IPv4(66,150,112,0),20 }, + { IPv4(66,150,128,0),20 }, + { IPv4(66,150,144,0),20 }, + { IPv4(66,152,128,0),19 }, + { IPv4(66,153,128,0),18 }, + { IPv4(66,153,192,0),20 }, + { IPv4(66,154,128,0),17 }, + { IPv4(66,155,0,0),17 }, + { IPv4(66,158,0,0),17 }, + { IPv4(66,161,128,0),18 }, + { IPv4(66,161,138,0),23 }, + { IPv4(66,162,33,0),24 }, + { IPv4(66,163,224,0),20 }, + { IPv4(66,164,0,0),24 }, + { IPv4(66,164,1,0),24 }, + { IPv4(66,164,2,0),24 }, + { IPv4(66,164,4,0),24 }, + { IPv4(66,164,5,0),24 }, + { IPv4(66,164,7,0),24 }, + { IPv4(66,164,200,0),21 }, + { IPv4(66,164,208,0),21 }, + { IPv4(66,164,240,0),20 }, + { IPv4(66,168,32,0),24 }, + { IPv4(66,168,38,0),23 }, + { IPv4(66,168,80,0),20 }, + { IPv4(66,170,96,0),20 }, + { IPv4(66,175,0,0),18 }, + { IPv4(66,177,0,0),17 }, + { IPv4(66,177,128,0),18 }, + { IPv4(66,177,192,0),19 }, + { IPv4(66,179,0,0),18 }, + { IPv4(66,179,0,0),23 }, + { IPv4(66,179,4,0),22 }, + { IPv4(66,179,64,0),19 }, + { IPv4(66,179,96,0),20 }, + { IPv4(66,180,32,0),20 }, + { IPv4(66,180,192,0),20 }, + { IPv4(67,0,0,0),16 }, + { IPv4(67,8,0,0),19 }, + { IPv4(67,8,32,0),20 }, + { IPv4(67,89,0,0),17 }, + { IPv4(67,89,128,0),18 }, + { IPv4(67,96,0,0),19 }, + { IPv4(67,96,0,0),14 }, + { IPv4(67,96,86,0),24 }, + { IPv4(67,96,87,0),24 }, + { IPv4(67,96,88,0),23 }, + { IPv4(67,96,96,0),21 }, + { IPv4(67,96,224,0),21 }, + { IPv4(67,97,64,0),20 }, + { IPv4(67,97,144,0),21 }, + { IPv4(67,97,152,0),21 }, + { IPv4(67,97,160,0),20 }, + { IPv4(67,97,176,0),21 }, + { IPv4(67,104,0,0),15 }, + { IPv4(67,105,4,0),23 }, + { IPv4(67,160,0,0),16 }, + { IPv4(67,160,0,0),13 }, + { IPv4(67,161,0,0),17 }, + { IPv4(67,161,128,0),17 }, + { IPv4(67,162,0,0),16 }, + { IPv4(67,163,0,0),17 }, + { IPv4(67,163,128,0),17 }, + { IPv4(67,164,0,0),15 }, + { IPv4(67,166,0,0),17 }, + { IPv4(67,166,192,0),18 }, + { IPv4(67,167,0,0),17 }, + { IPv4(67,167,128,0),17 }, + { IPv4(80,0,0,0),13 }, + { IPv4(80,60,0,0),15 }, + { IPv4(80,64,32,0),20 }, + { IPv4(80,65,96,0),20 }, + { IPv4(80,66,224,0),20 }, + { IPv4(80,67,168,0),21 }, + { IPv4(80,68,128,0),20 }, + { IPv4(80,69,64,0),20 }, + { IPv4(80,71,64,0),20 }, + { IPv4(80,72,96,0),20 }, + { IPv4(80,72,160,0),24 }, + { IPv4(80,74,128,0),20 }, + { IPv4(80,75,64,0),20 }, + { IPv4(80,76,160,0),20 }, + { IPv4(80,78,32,0),20 }, + { IPv4(80,78,160,0),20 }, + { IPv4(80,78,224,0),20 }, + { IPv4(80,79,160,0),20 }, + { IPv4(80,79,224,0),20 }, + { IPv4(80,81,96,0),20 }, + { IPv4(80,84,160,0),22 }, + { IPv4(80,86,32,0),20 }, + { IPv4(80,88,192,0),20 }, + { IPv4(80,90,128,0),20 }, + { IPv4(80,91,128,0),20 }, + { IPv4(80,94,192,0),24 }, + { IPv4(80,96,3,0),24 }, + { IPv4(80,96,8,0),24 }, + { IPv4(80,96,128,0),24 }, + { IPv4(80,96,148,0),24 }, + { IPv4(80,96,184,0),24 }, + { IPv4(80,192,0,0),14 }, + { IPv4(127,0,0,0),8 }, + { IPv4(128,2,0,0),16 }, + { IPv4(128,3,0,0),16 }, + { IPv4(128,6,0,0),16 }, + { IPv4(128,15,0,0),16 }, + { IPv4(128,19,0,0),16 }, + { IPv4(128,23,0,0),16 }, + { IPv4(128,32,0,0),16 }, + { IPv4(128,37,0,0),16 }, + { IPv4(128,38,0,0),16 }, + { IPv4(128,47,0,0),16 }, + { IPv4(128,48,0,0),16 }, + { IPv4(128,49,0,0),16 }, + { IPv4(128,54,0,0),16 }, + { IPv4(128,55,0,0),16 }, + { IPv4(128,56,0,0),16 }, + { IPv4(128,59,0,0),16 }, + { IPv4(128,60,0,0),16 }, + { IPv4(128,61,0,0),16 }, + { IPv4(128,62,0,0),16 }, + { IPv4(128,63,0,0),16 }, + { IPv4(128,64,32,0),24 }, + { IPv4(128,64,148,0),22 }, + { IPv4(128,64,164,0),23 }, + { IPv4(128,64,192,0),23 }, + { IPv4(128,64,203,0),24 }, + { IPv4(128,64,250,0),24 }, + { IPv4(128,64,251,0),24 }, + { IPv4(128,83,0,0),16 }, + { IPv4(128,84,0,0),16 }, + { IPv4(128,88,0,0),16 }, + { IPv4(128,91,0,0),16 }, + { IPv4(128,97,0,0),16 }, + { IPv4(128,101,0,0),16 }, + { IPv4(128,102,0,0),16 }, + { IPv4(128,102,18,0),24 }, + { IPv4(128,104,25,0),24 }, + { IPv4(128,107,0,0),16 }, + { IPv4(128,110,0,0),16 }, + { IPv4(128,111,0,0),16 }, + { IPv4(128,112,0,0),16 }, + { IPv4(128,113,0,0),16 }, + { IPv4(128,114,0,0),16 }, + { IPv4(128,115,0,0),16 }, + { IPv4(128,116,0,0),16 }, + { IPv4(128,117,0,0),16 }, + { IPv4(128,118,0,0),16 }, + { IPv4(128,120,0,0),16 }, + { IPv4(128,121,0,0),16 }, + { IPv4(128,122,0,0),16 }, + { IPv4(128,129,0,0),16 }, + { IPv4(128,132,0,0),16 }, + { IPv4(128,134,0,0),16 }, + { IPv4(128,134,20,0),24 }, + { IPv4(128,134,21,0),24 }, + { IPv4(128,134,37,0),24 }, + { IPv4(128,134,38,0),24 }, + { IPv4(128,134,39,0),24 }, + { IPv4(128,134,75,0),24 }, + { IPv4(128,134,76,0),24 }, + { IPv4(128,134,85,0),24 }, + { IPv4(128,134,86,0),24 }, + { IPv4(128,134,87,0),24 }, + { IPv4(128,134,88,0),24 }, + { IPv4(128,134,89,0),24 }, + { IPv4(128,134,90,0),24 }, + { IPv4(128,134,91,0),24 }, + { IPv4(128,134,92,0),24 }, + { IPv4(128,134,93,0),24 }, + { IPv4(128,134,94,0),24 }, + { IPv4(128,134,126,0),24 }, + { IPv4(128,134,127,0),24 }, + { IPv4(128,134,135,0),24 }, + { IPv4(128,134,148,0),24 }, + { IPv4(128,134,149,0),24 }, + { IPv4(128,134,150,0),24 }, + { IPv4(128,134,154,0),24 }, + { IPv4(128,134,170,0),24 }, + { IPv4(128,134,225,0),24 }, + { IPv4(128,138,0,0),16 }, + { IPv4(128,147,0,0),16 }, + { IPv4(128,149,0,0),16 }, + { IPv4(128,151,0,0),16 }, + { IPv4(128,152,0,0),16 }, + { IPv4(128,153,0,0),16 }, + { IPv4(128,154,0,0),16 }, + { IPv4(128,155,0,0),16 }, + { IPv4(128,156,0,0),16 }, + { IPv4(128,157,0,0),16 }, + { IPv4(128,158,0,0),16 }, + { IPv4(128,159,0,0),16 }, + { IPv4(128,160,0,0),16 }, + { IPv4(128,162,0,0),16 }, + { IPv4(128,163,0,0),16 }, + { IPv4(128,164,0,0),16 }, + { IPv4(128,165,0,0),16 }, + { IPv4(128,170,0,0),16 }, + { IPv4(128,174,0,0),16 }, + { IPv4(128,177,0,0),16 }, + { IPv4(128,177,208,0),20 }, + { IPv4(128,177,246,0),24 }, + { IPv4(128,177,248,0),24 }, + { IPv4(128,180,0,0),16 }, + { IPv4(128,182,0,0),16 }, + { IPv4(128,182,64,0),18 }, + { IPv4(128,183,0,0),16 }, + { IPv4(128,187,0,0),16 }, + { IPv4(128,190,0,0),16 }, + { IPv4(128,190,132,0),24 }, + { IPv4(128,190,161,0),26 }, + { IPv4(128,190,203,0),27 }, + { IPv4(128,190,250,0),24 }, + { IPv4(128,192,0,0),16 }, + { IPv4(128,195,0,0),16 }, + { IPv4(128,196,0,0),16 }, + { IPv4(128,198,0,0),16 }, + { IPv4(128,200,0,0),16 }, + { IPv4(128,202,0,0),16 }, + { IPv4(128,205,0,0),16 }, + { IPv4(128,206,0,0),16 }, + { IPv4(128,209,0,0),16 }, + { IPv4(128,213,0,0),16 }, + { IPv4(128,217,0,0),16 }, + { IPv4(128,218,0,0),16 }, + { IPv4(128,219,0,0),16 }, + { IPv4(128,220,0,0),16 }, + { IPv4(128,226,0,0),16 }, + { IPv4(128,228,0,0),16 }, + { IPv4(128,230,0,0),16 }, + { IPv4(128,236,0,0),16 }, + { IPv4(128,237,0,0),16 }, + { IPv4(128,238,0,0),16 }, + { IPv4(128,241,0,0),16 }, + { IPv4(128,242,0,0),16 }, + { IPv4(128,242,192,0),18 }, + { IPv4(128,246,0,0),16 }, + { IPv4(128,248,0,0),16 }, + { IPv4(128,252,0,0),16 }, + { IPv4(128,253,0,0),16 }, + { IPv4(128,255,0,0),16 }, + { IPv4(129,3,0,0),16 }, + { IPv4(129,8,0,0),16 }, + { IPv4(129,9,0,0),16 }, + { IPv4(129,17,0,0),16 }, + { IPv4(129,19,0,0),16 }, + { IPv4(129,21,0,0),16 }, + { IPv4(129,29,0,0),16 }, + { IPv4(129,30,0,0),16 }, + { IPv4(129,33,0,0),19 }, + { IPv4(129,33,0,0),16 }, + { IPv4(129,33,32,0),19 }, + { IPv4(129,33,64,0),19 }, + { IPv4(129,33,96,0),19 }, + { IPv4(129,33,128,0),19 }, + { IPv4(129,33,160,0),19 }, + { IPv4(129,33,224,0),20 }, + { IPv4(129,33,224,0),19 }, + { IPv4(129,35,0,0),16 }, + { IPv4(129,35,40,0),21 }, + { IPv4(129,35,64,0),22 }, + { IPv4(129,35,65,0),24 }, + { IPv4(129,35,68,0),22 }, + { IPv4(129,35,72,0),22 }, + { IPv4(129,35,76,0),22 }, + { IPv4(129,35,96,0),20 }, + { IPv4(129,35,128,0),20 }, + { IPv4(129,35,160,0),22 }, + { IPv4(129,35,160,0),20 }, + { IPv4(129,35,192,0),21 }, + { IPv4(129,35,224,0),21 }, + { IPv4(129,35,232,0),22 }, + { IPv4(129,37,0,0),16 }, + { IPv4(129,37,25,0),24 }, + { IPv4(129,37,37,0),24 }, + { IPv4(129,37,40,0),24 }, + { IPv4(129,37,70,0),24 }, + { IPv4(129,37,78,0),24 }, + { IPv4(129,37,81,0),24 }, + { IPv4(129,37,95,0),24 }, + { IPv4(129,37,97,0),24 }, + { IPv4(129,37,109,0),24 }, + { IPv4(129,37,112,0),24 }, + { IPv4(129,37,136,0),21 }, + { IPv4(129,37,144,0),20 }, + { IPv4(129,37,152,0),24 }, + { IPv4(129,37,160,0),20 }, + { IPv4(129,37,176,0),22 }, + { IPv4(129,37,180,0),23 }, + { IPv4(129,37,184,0),24 }, + { IPv4(129,37,204,0),24 }, + { IPv4(129,37,243,0),24 }, + { IPv4(129,37,254,0),24 }, + { IPv4(129,41,32,0),20 }, + { IPv4(129,41,80,0),20 }, + { IPv4(129,41,192,0),20 }, + { IPv4(129,41,208,0),20 }, + { IPv4(129,42,0,0),16 }, + { IPv4(129,42,1,0),24 }, + { IPv4(129,42,2,0),24 }, + { IPv4(129,42,3,0),24 }, + { IPv4(129,42,4,0),24 }, + { IPv4(129,42,8,0),24 }, + { IPv4(129,42,9,0),24 }, + { IPv4(129,42,10,0),24 }, + { IPv4(129,42,14,0),24 }, + { IPv4(129,42,16,0),24 }, + { IPv4(129,42,17,0),24 }, + { IPv4(129,42,18,0),24 }, + { IPv4(129,42,19,0),24 }, + { IPv4(129,42,20,0),24 }, + { IPv4(129,42,21,0),24 }, + { IPv4(129,42,24,0),24 }, + { IPv4(129,42,26,0),24 }, + { IPv4(129,42,36,0),24 }, + { IPv4(129,42,37,0),24 }, + { IPv4(129,42,38,0),24 }, + { IPv4(129,42,39,0),24 }, + { IPv4(129,42,40,0),24 }, + { IPv4(129,42,41,0),24 }, + { IPv4(129,42,42,0),24 }, + { IPv4(129,42,43,0),24 }, + { IPv4(129,42,44,0),24 }, + { IPv4(129,42,45,0),24 }, + { IPv4(129,42,46,0),24 }, + { IPv4(129,42,47,0),24 }, + { IPv4(129,42,48,0),24 }, + { IPv4(129,42,50,0),24 }, + { IPv4(129,42,52,0),24 }, + { IPv4(129,42,53,0),24 }, + { IPv4(129,42,54,0),24 }, + { IPv4(129,42,56,0),24 }, + { IPv4(129,42,57,0),24 }, + { IPv4(129,42,59,0),24 }, + { IPv4(129,42,208,0),24 }, + { IPv4(129,42,240,0),24 }, + { IPv4(129,42,241,0),24 }, + { IPv4(129,42,242,0),24 }, + { IPv4(129,42,243,0),24 }, + { IPv4(129,42,244,0),24 }, + { IPv4(129,42,246,0),24 }, + { IPv4(129,46,0,0),16 }, + { IPv4(129,48,0,0),16 }, + { IPv4(129,49,0,0),16 }, + { IPv4(129,51,0,0),16 }, + { IPv4(129,52,0,0),16 }, + { IPv4(129,53,0,0),16 }, + { IPv4(129,54,0,0),16 }, + { IPv4(129,57,0,0),16 }, + { IPv4(129,59,0,0),16 }, + { IPv4(129,61,0,0),16 }, + { IPv4(129,62,0,0),16 }, + { IPv4(129,65,0,0),16 }, + { IPv4(129,72,0,0),16 }, + { IPv4(129,73,0,0),16 }, + { IPv4(129,79,0,0),16 }, + { IPv4(129,81,0,0),16 }, + { IPv4(129,82,0,0),16 }, + { IPv4(129,85,0,0),16 }, + { IPv4(129,92,0,0),16 }, + { IPv4(129,98,0,0),16 }, + { IPv4(129,99,0,0),16 }, + { IPv4(129,100,0,0),16 }, + { IPv4(129,105,0,0),16 }, + { IPv4(129,106,0,0),16 }, + { IPv4(129,116,0,0),16 }, + { IPv4(129,123,0,0),16 }, + { IPv4(129,131,0,0),16 }, + { IPv4(129,139,0,0),16 }, + { IPv4(129,141,0,0),16 }, + { IPv4(129,164,0,0),16 }, + { IPv4(129,165,0,0),16 }, + { IPv4(129,172,0,0),16 }, + { IPv4(129,176,0,0),16 }, + { IPv4(129,179,0,0),16 }, + { IPv4(129,186,0,0),16 }, + { IPv4(129,190,0,0),16 }, + { IPv4(129,191,0,0),16 }, + { IPv4(129,196,0,0),16 }, + { IPv4(129,197,0,0),16 }, + { IPv4(129,198,0,0),16 }, + { IPv4(129,200,0,0),16 }, + { IPv4(129,210,0,0),16 }, + { IPv4(129,212,0,0),16 }, + { IPv4(129,218,0,0),16 }, + { IPv4(129,219,0,0),16 }, + { IPv4(129,223,96,0),19 }, + { IPv4(129,223,123,0),24 }, + { IPv4(129,223,136,0),21 }, + { IPv4(129,223,148,0),22 }, + { IPv4(129,223,152,0),24 }, + { IPv4(129,223,153,0),24 }, + { IPv4(129,223,155,0),24 }, + { IPv4(129,225,0,0),16 }, + { IPv4(129,227,0,0),16 }, + { IPv4(129,229,0,0),16 }, + { IPv4(129,235,0,0),16 }, + { IPv4(129,236,0,0),16 }, + { IPv4(129,238,0,0),16 }, + { IPv4(129,239,0,0),16 }, + { IPv4(129,246,0,0),16 }, + { IPv4(129,246,6,0),24 }, + { IPv4(129,250,0,0),16 }, + { IPv4(129,252,0,0),16 }, + { IPv4(129,253,0,0),16 }, + { IPv4(129,254,0,0),16 }, + { IPv4(129,255,0,0),16 }, + { IPv4(130,11,0,0),16 }, + { IPv4(130,13,0,0),16 }, + { IPv4(130,17,0,0),16 }, + { IPv4(130,20,0,0),16 }, + { IPv4(130,22,0,0),16 }, + { IPv4(130,27,0,0),16 }, + { IPv4(130,29,0,0),16 }, + { IPv4(130,30,0,0),16 }, + { IPv4(130,36,61,0),24 }, + { IPv4(130,38,0,0),16 }, + { IPv4(130,44,0,0),16 }, + { IPv4(130,46,0,0),16 }, + { IPv4(130,49,0,0),16 }, + { IPv4(130,49,0,0),17 }, + { IPv4(130,49,246,0),23 }, + { IPv4(130,50,0,0),16 }, + { IPv4(130,50,0,0),17 }, + { IPv4(130,53,0,0),16 }, + { IPv4(130,57,0,0),16 }, + { IPv4(130,64,0,0),16 }, + { IPv4(130,64,128,0),19 }, + { IPv4(130,65,0,0),16 }, + { IPv4(130,71,0,0),16 }, + { IPv4(130,86,0,0),16 }, + { IPv4(130,91,0,0),16 }, + { IPv4(130,94,0,0),16 }, + { IPv4(130,99,0,0),16 }, + { IPv4(130,102,28,0),24 }, + { IPv4(130,107,0,0),16 }, + { IPv4(130,109,0,0),16 }, + { IPv4(130,110,0,0),16 }, + { IPv4(130,114,0,0),16 }, + { IPv4(130,118,0,0),16 }, + { IPv4(130,123,0,0),16 }, + { IPv4(130,126,0,0),16 }, + { IPv4(130,127,0,0),16 }, + { IPv4(130,134,0,0),16 }, + { IPv4(130,135,0,0),16 }, + { IPv4(130,150,0,0),16 }, + { IPv4(130,154,0,0),16 }, + { IPv4(130,157,0,0),16 }, + { IPv4(130,162,0,0),16 }, + { IPv4(130,163,0,0),16 }, + { IPv4(130,164,0,0),16 }, + { IPv4(130,164,143,0),24 }, + { IPv4(130,164,166,0),24 }, + { IPv4(130,164,168,0),24 }, + { IPv4(130,164,175,0),24 }, + { IPv4(130,164,254,0),24 }, + { IPv4(130,166,0,0),16 }, + { IPv4(130,167,0,0),16 }, + { IPv4(130,182,0,0),16 }, + { IPv4(130,187,0,0),16 }, + { IPv4(130,191,0,0),16 }, + { IPv4(130,199,0,0),16 }, + { IPv4(130,202,0,0),16 }, + { IPv4(130,203,0,0),16 }, + { IPv4(130,205,0,0),16 }, + { IPv4(130,207,0,0),16 }, + { IPv4(130,212,0,0),16 }, + { IPv4(130,216,0,0),16 }, + { IPv4(130,218,0,0),16 }, + { IPv4(130,245,0,0),16 }, + { IPv4(130,253,0,0),16 }, + { IPv4(130,254,0,0),16 }, + { IPv4(131,2,0,0),15 }, + { IPv4(131,4,0,0),14 }, + { IPv4(131,8,0,0),13 }, + { IPv4(131,16,0,0),12 }, + { IPv4(131,32,0,0),11 }, + { IPv4(131,36,0,0),16 }, + { IPv4(131,38,0,0),16 }, + { IPv4(131,49,0,0),16 }, + { IPv4(131,64,0,0),12 }, + { IPv4(131,71,0,0),16 }, + { IPv4(131,80,0,0),14 }, + { IPv4(131,86,0,0),15 }, + { IPv4(131,86,1,0),24 }, + { IPv4(131,92,0,0),16 }, + { IPv4(131,96,0,0),16 }, + { IPv4(131,100,0,0),16 }, + { IPv4(131,103,0,0),16 }, + { IPv4(131,107,0,0),16 }, + { IPv4(131,110,0,0),16 }, + { IPv4(131,113,0,0),16 }, + { IPv4(131,120,0,0),16 }, + { IPv4(131,121,0,0),16 }, + { IPv4(131,122,0,0),16 }, + { IPv4(131,123,0,0),16 }, + { IPv4(131,124,96,0),19 }, + { IPv4(131,132,0,0),16 }, + { IPv4(131,135,0,0),16 }, + { IPv4(131,136,0,0),16 }, + { IPv4(131,137,0,0),16 }, + { IPv4(131,144,0,0),16 }, + { IPv4(131,148,0,0),16 }, + { IPv4(131,149,0,0),16 }, + { IPv4(131,151,0,0),16 }, + { IPv4(131,161,0,0),16 }, + { IPv4(131,161,54,0),24 }, + { IPv4(131,161,200,0),22 }, + { IPv4(131,161,200,0),21 }, + { IPv4(131,161,208,0),20 }, + { IPv4(131,161,217,0),24 }, + { IPv4(131,167,0,0),16 }, + { IPv4(131,178,0,0),16 }, + { IPv4(131,179,0,0),16 }, + { IPv4(131,182,0,0),16 }, + { IPv4(131,184,0,0),16 }, + { IPv4(131,184,146,0),24 }, + { IPv4(131,193,0,0),16 }, + { IPv4(131,197,66,0),24 }, + { IPv4(131,197,192,0),24 }, + { IPv4(131,197,196,0),24 }, + { IPv4(131,197,224,0),24 }, + { IPv4(131,197,228,0),24 }, + { IPv4(131,201,0,0),16 }, + { IPv4(131,203,0,0),16 }, + { IPv4(131,204,0,0),16 }, + { IPv4(131,212,0,0),16 }, + { IPv4(131,214,0,0),16 }, + { IPv4(131,218,0,0),16 }, + { IPv4(131,222,0,0),16 }, + { IPv4(131,225,0,0),16 }, + { IPv4(131,230,0,0),16 }, + { IPv4(131,230,224,0),20 }, + { IPv4(131,233,0,0),16 }, + { IPv4(131,239,0,0),16 }, + { IPv4(131,243,0,0),16 }, + { IPv4(131,244,0,0),15 }, + { IPv4(131,250,0,0),16 }, + { IPv4(132,0,0,0),10 }, + { IPv4(132,8,1,0),24 }, + { IPv4(132,15,0,0),16 }, + { IPv4(132,16,0,0),16 }, + { IPv4(132,20,0,0),16 }, + { IPv4(132,61,0,0),16 }, + { IPv4(132,79,0,0),16 }, + { IPv4(132,80,0,0),12 }, + { IPv4(132,96,0,0),11 }, + { IPv4(132,128,0,0),12 }, + { IPv4(132,146,0,0),16 }, + { IPv4(132,151,0,0),18 }, + { IPv4(132,151,0,0),16 }, + { IPv4(132,151,64,0),24 }, + { IPv4(132,156,0,0),16 }, + { IPv4(132,159,0,0),16 }, + { IPv4(132,161,0,0),16 }, + { IPv4(132,163,0,0),16 }, + { IPv4(132,175,0,0),16 }, + { IPv4(132,188,0,0),19 }, + { IPv4(132,189,0,0),16 }, + { IPv4(132,193,0,0),16 }, + { IPv4(132,194,0,0),16 }, + { IPv4(132,200,0,0),16 }, + { IPv4(132,221,0,0),16 }, + { IPv4(132,226,0,0),16 }, + { IPv4(132,228,0,0),16 }, + { IPv4(132,236,0,0),16 }, + { IPv4(132,237,0,0),16 }, + { IPv4(132,239,0,0),16 }, + { IPv4(132,240,0,0),16 }, + { IPv4(132,241,0,0),16 }, + { IPv4(132,247,0,0),16 }, + { IPv4(132,248,0,0),16 }, + { IPv4(132,249,0,0),16 }, + { IPv4(132,249,20,0),24 }, + { IPv4(132,249,30,0),24 }, + { IPv4(132,250,0,0),16 }, + { IPv4(132,254,0,0),16 }, + { IPv4(132,254,0,0),19 }, + { IPv4(132,254,48,0),21 }, + { IPv4(132,254,56,0),21 }, + { IPv4(132,254,72,0),21 }, + { IPv4(132,254,78,0),24 }, + { IPv4(132,254,80,0),21 }, + { IPv4(132,254,88,0),21 }, + { IPv4(132,254,96,0),21 }, + { IPv4(132,254,112,0),21 }, + { IPv4(132,254,120,0),21 }, + { IPv4(132,254,128,0),21 }, + { IPv4(132,254,144,0),21 }, + { IPv4(132,254,192,0),20 }, + { IPv4(132,254,208,0),21 }, + { IPv4(132,254,208,0),20 }, + { IPv4(132,254,216,0),21 }, + { IPv4(132,254,224,0),19 }, + { IPv4(132,254,232,0),24 }, + { IPv4(133,9,0,0),16 }, + { IPv4(133,12,0,0),16 }, + { IPv4(133,18,0,0),16 }, + { IPv4(133,27,0,0),16 }, + { IPv4(133,53,0,0),16 }, + { IPv4(133,54,0,0),16 }, + { IPv4(133,63,0,0),16 }, + { IPv4(133,69,0,0),16 }, + { IPv4(133,105,0,0),16 }, + { IPv4(133,121,0,0),16 }, + { IPv4(133,123,0,0),16 }, + { IPv4(133,126,0,0),16 }, + { IPv4(133,137,0,0),16 }, + { IPv4(133,138,0,0),16 }, + { IPv4(133,144,0,0),16 }, + { IPv4(133,145,0,0),16 }, + { IPv4(133,146,0,0),16 }, + { IPv4(133,170,0,0),16 }, + { IPv4(133,175,0,0),16 }, + { IPv4(133,186,0,0),16 }, + { IPv4(133,187,0,0),16 }, + { IPv4(133,188,0,0),16 }, + { IPv4(133,205,0,0),16 }, + { IPv4(133,217,0,0),16 }, + { IPv4(133,232,0,0),16 }, + { IPv4(133,235,0,0),16 }, + { IPv4(133,243,0,0),16 }, + { IPv4(133,250,0,0),16 }, + { IPv4(134,5,0,0),16 }, + { IPv4(134,8,5,0),24 }, + { IPv4(134,9,0,0),16 }, + { IPv4(134,10,0,0),16 }, + { IPv4(134,12,0,0),16 }, + { IPv4(134,13,0,0),16 }, + { IPv4(134,15,0,0),16 }, + { IPv4(134,17,0,0),16 }, + { IPv4(134,18,0,0),16 }, + { IPv4(134,20,0,0),16 }, + { IPv4(134,24,0,0),16 }, + { IPv4(134,24,10,0),24 }, + { IPv4(134,24,71,0),24 }, + { IPv4(134,24,92,0),24 }, + { IPv4(134,24,100,0),24 }, + { IPv4(134,24,123,0),24 }, + { IPv4(134,24,125,0),24 }, + { IPv4(134,24,153,0),24 }, + { IPv4(134,29,0,0),16 }, + { IPv4(134,43,10,0),23 }, + { IPv4(134,43,12,0),24 }, + { IPv4(134,43,61,0),24 }, + { IPv4(134,43,101,0),24 }, + { IPv4(134,49,0,0),16 }, + { IPv4(134,49,68,0),22 }, + { IPv4(134,49,72,0),22 }, + { IPv4(134,49,128,0),21 }, + { IPv4(134,49,136,0),21 }, + { IPv4(134,50,0,0),16 }, + { IPv4(134,54,0,0),16 }, + { IPv4(134,55,0,0),16 }, + { IPv4(134,57,0,0),16 }, + { IPv4(134,65,0,0),16 }, + { IPv4(134,66,0,0),16 }, + { IPv4(134,71,0,0),16 }, + { IPv4(134,74,0,0),16 }, + { IPv4(134,75,0,0),16 }, + { IPv4(134,75,7,0),24 }, + { IPv4(134,75,12,0),24 }, + { IPv4(134,75,18,0),24 }, + { IPv4(134,75,30,0),24 }, + { IPv4(134,75,50,0),24 }, + { IPv4(134,75,55,0),24 }, + { IPv4(134,75,122,0),24 }, + { IPv4(134,75,171,0),24 }, + { IPv4(134,75,172,0),24 }, + { IPv4(134,75,180,0),24 }, + { IPv4(134,75,196,0),24 }, + { IPv4(134,75,197,0),24 }, + { IPv4(134,75,217,0),24 }, + { IPv4(134,75,226,0),24 }, + { IPv4(134,78,0,0),16 }, + { IPv4(134,78,0,0),15 }, + { IPv4(134,79,0,0),16 }, + { IPv4(134,82,0,0),16 }, + { IPv4(134,84,0,0),16 }, + { IPv4(134,114,0,0),16 }, + { IPv4(134,120,0,0),16 }, + { IPv4(134,124,0,0),16 }, + { IPv4(134,125,0,0),16 }, + { IPv4(134,127,0,0),16 }, + { IPv4(134,128,160,0),22 }, + { IPv4(134,131,0,0),16 }, + { IPv4(134,136,0,0),16 }, + { IPv4(134,137,0,0),16 }, + { IPv4(134,139,0,0),16 }, + { IPv4(134,141,0,0),16 }, + { IPv4(134,141,242,0),24 }, + { IPv4(134,160,0,0),16 }, + { IPv4(134,161,0,0),16 }, + { IPv4(134,164,0,0),16 }, + { IPv4(134,167,0,0),16 }, + { IPv4(134,172,0,0),16 }, + { IPv4(134,180,0,0),16 }, + { IPv4(134,193,0,0),16 }, + { IPv4(134,194,0,0),16 }, + { IPv4(134,201,0,0),16 }, + { IPv4(134,207,0,0),16 }, + { IPv4(134,208,0,0),16 }, + { IPv4(134,217,0,0),16 }, + { IPv4(134,224,0,0),16 }, + { IPv4(134,229,0,0),16 }, + { IPv4(134,231,0,0),16 }, + { IPv4(134,233,0,0),16 }, + { IPv4(134,235,0,0),16 }, + { IPv4(134,238,0,0),16 }, + { IPv4(134,239,0,0),16 }, + { IPv4(134,240,0,0),16 }, + { IPv4(134,241,0,0),17 }, + { IPv4(134,241,0,0),16 }, + { IPv4(134,241,128,0),17 }, + { IPv4(134,247,0,0),16 }, + { IPv4(134,250,0,0),16 }, + { IPv4(134,252,0,0),16 }, + { IPv4(134,253,0,0),16 }, + { IPv4(135,53,0,0),16 }, + { IPv4(135,76,9,0),24 }, + { IPv4(135,118,6,0),24 }, + { IPv4(135,118,7,0),24 }, + { IPv4(135,118,8,0),24 }, + { IPv4(135,118,9,0),24 }, + { IPv4(135,120,254,0),24 }, + { IPv4(135,138,233,0),24 }, + { IPv4(135,145,0,0),16 }, + { IPv4(135,155,0,0),16 }, + { IPv4(135,197,0,0),16 }, + { IPv4(135,206,0,0),16 }, + { IPv4(135,209,0,0),18 }, + { IPv4(135,209,64,0),19 }, + { IPv4(135,209,96,0),19 }, + { IPv4(135,209,128,0),17 }, + { IPv4(135,214,0,0),16 }, + { IPv4(135,216,0,0),16 }, + { IPv4(135,218,0,0),16 }, + { IPv4(135,250,0,0),16 }, + { IPv4(136,1,0,0),16 }, + { IPv4(136,2,0,0),16 }, + { IPv4(136,141,0,0),16 }, + { IPv4(136,142,0,0),16 }, + { IPv4(136,149,0,0),16 }, + { IPv4(136,150,0,0),16 }, + { IPv4(136,150,2,0),24 }, + { IPv4(136,150,4,0),24 }, + { IPv4(136,150,40,0),24 }, + { IPv4(136,150,45,0),24 }, + { IPv4(136,150,46,0),24 }, + { IPv4(136,150,60,0),24 }, + { IPv4(136,150,100,0),24 }, + { IPv4(136,150,102,0),24 }, + { IPv4(136,150,103,0),24 }, + { IPv4(136,152,0,0),16 }, + { IPv4(136,154,0,0),16 }, + { IPv4(136,166,0,0),16 }, + { IPv4(136,167,0,0),16 }, + { IPv4(136,168,0,0),16 }, + { IPv4(136,175,0,0),16 }, + { IPv4(136,176,0,0),16 }, + { IPv4(136,177,0,0),16 }, + { IPv4(136,184,0,0),16 }, + { IPv4(136,204,0,0),16 }, + { IPv4(136,204,192,0),19 }, + { IPv4(136,204,224,0),22 }, + { IPv4(136,204,228,0),23 }, + { IPv4(136,205,0,0),16 }, + { IPv4(136,207,0,0),16 }, + { IPv4(136,209,0,0),16 }, + { IPv4(136,212,0,0),14 }, + { IPv4(136,216,0,0),13 }, + { IPv4(136,223,0,0),20 }, + { IPv4(136,223,16,0),24 }, + { IPv4(136,223,17,0),24 }, + { IPv4(136,223,18,0),24 }, + { IPv4(136,223,19,0),24 }, + { IPv4(136,223,32,0),24 }, + { IPv4(136,223,96,0),24 }, + { IPv4(136,223,97,0),24 }, + { IPv4(136,224,0,0),18 }, + { IPv4(136,224,0,0),16 }, + { IPv4(136,224,64,0),19 }, + { IPv4(136,224,96,0),19 }, + { IPv4(136,224,124,0),23 }, + { IPv4(136,224,128,0),20 }, + { IPv4(136,224,144,0),20 }, + { IPv4(136,224,160,0),20 }, + { IPv4(136,224,176,0),20 }, + { IPv4(136,224,192,0),19 }, + { IPv4(136,224,224,0),21 }, + { IPv4(136,224,232,0),21 }, + { IPv4(136,224,240,0),21 }, + { IPv4(136,224,248,0),21 }, + { IPv4(136,226,0,0),16 }, + { IPv4(136,229,0,0),16 }, + { IPv4(136,234,0,0),16 }, + { IPv4(136,237,0,0),16 }, + { IPv4(136,244,0,0),16 }, + { IPv4(136,244,0,0),19 }, + { IPv4(136,244,32,0),19 }, + { IPv4(136,244,64,0),19 }, + { IPv4(136,244,96,0),19 }, + { IPv4(136,244,128,0),17 }, + { IPv4(136,248,0,0),16 }, + { IPv4(137,0,0,0),13 }, + { IPv4(137,8,0,0),14 }, + { IPv4(137,14,0,0),16 }, + { IPv4(137,16,0,0),16 }, + { IPv4(137,21,0,0),16 }, + { IPv4(137,22,0,0),16 }, + { IPv4(137,24,0,0),16 }, + { IPv4(137,32,0,0),16 }, + { IPv4(137,33,0,0),16 }, + { IPv4(137,37,0,0),16 }, + { IPv4(137,38,0,0),16 }, + { IPv4(137,49,0,0),16 }, + { IPv4(137,65,0,0),16 }, + { IPv4(137,66,0,0),16 }, + { IPv4(137,67,0,0),16 }, + { IPv4(137,68,0,0),16 }, + { IPv4(137,70,0,0),16 }, + { IPv4(137,75,0,0),16 }, + { IPv4(137,77,0,0),16 }, + { IPv4(137,78,0,0),16 }, + { IPv4(137,79,0,0),16 }, + { IPv4(137,80,0,0),16 }, + { IPv4(137,95,0,0),16 }, + { IPv4(137,97,0,0),16 }, + { IPv4(137,103,0,0),16 }, + { IPv4(137,110,0,0),16 }, + { IPv4(137,118,192,0),22 }, + { IPv4(137,124,0,0),16 }, + { IPv4(137,125,0,0),16 }, + { IPv4(137,128,0,0),16 }, + { IPv4(137,131,0,0),16 }, + { IPv4(137,132,0,0),16 }, + { IPv4(137,139,0,0),16 }, + { IPv4(137,140,0,0),16 }, + { IPv4(137,141,0,0),16 }, + { IPv4(137,142,0,0),16 }, + { IPv4(137,143,0,0),16 }, + { IPv4(137,143,128,0),17 }, + { IPv4(137,145,0,0),16 }, + { IPv4(137,150,0,0),16 }, + { IPv4(137,151,0,0),16 }, + { IPv4(137,158,0,0),16 }, + { IPv4(137,159,0,0),16 }, + { IPv4(137,164,1,0),24 }, + { IPv4(137,164,2,0),24 }, + { IPv4(137,164,3,0),24 }, + { IPv4(137,164,4,0),24 }, + { IPv4(137,164,5,0),24 }, + { IPv4(137,164,6,0),24 }, + { IPv4(137,164,7,0),24 }, + { IPv4(137,164,8,0),24 }, + { IPv4(137,164,9,0),24 }, + { IPv4(137,164,10,0),24 }, + { IPv4(137,164,11,0),24 }, + { IPv4(137,164,12,0),24 }, + { IPv4(137,164,13,0),24 }, + { IPv4(137,164,14,0),24 }, + { IPv4(137,169,0,0),16 }, + { IPv4(137,169,80,0),24 }, + { IPv4(137,169,81,0),24 }, + { IPv4(137,169,144,0),20 }, + { IPv4(137,170,0,0),16 }, + { IPv4(137,190,0,0),16 }, + { IPv4(137,192,0,0),16 }, + { IPv4(137,209,0,0),16 }, + { IPv4(137,214,0,0),15 }, + { IPv4(137,227,0,0),16 }, + { IPv4(137,228,0,0),16 }, + { IPv4(137,230,0,0),16 }, + { IPv4(137,240,0,0),14 }, + { IPv4(137,244,0,0),16 }, + { IPv4(137,246,0,0),16 }, + { IPv4(137,247,0,0),16 }, + { IPv4(137,252,0,0),16 }, + { IPv4(138,5,0,0),16 }, + { IPv4(138,12,0,0),16 }, + { IPv4(138,13,0,0),16 }, + { IPv4(138,18,0,0),16 }, + { IPv4(138,18,144,0),24 }, + { IPv4(138,23,0,0),16 }, + { IPv4(138,27,0,0),16 }, + { IPv4(138,29,0,0),16 }, + { IPv4(138,32,32,0),20 }, + { IPv4(138,32,48,0),20 }, + { IPv4(138,39,0,0),16 }, + { IPv4(138,46,0,0),16 }, + { IPv4(138,50,0,0),16 }, + { IPv4(138,60,0,0),16 }, + { IPv4(138,67,0,0),16 }, + { IPv4(138,72,0,0),16 }, + { IPv4(138,84,0,0),16 }, + { IPv4(138,86,0,0),16 }, + { IPv4(138,87,0,0),16 }, + { IPv4(138,92,0,0),16 }, + { IPv4(138,101,0,0),16 }, + { IPv4(138,105,0,0),16 }, + { IPv4(138,107,0,0),16 }, + { IPv4(138,115,0,0),16 }, + { IPv4(138,116,0,0),16 }, + { IPv4(138,125,0,0),16 }, + { IPv4(138,127,0,0),16 }, + { IPv4(138,129,0,0),16 }, + { IPv4(138,132,0,0),16 }, + { IPv4(138,136,0,0),13 }, + { IPv4(138,144,0,0),12 }, + { IPv4(138,164,0,0),16 }, + { IPv4(138,164,0,0),14 }, + { IPv4(138,168,0,0),14 }, + { IPv4(138,168,0,0),16 }, + { IPv4(138,178,0,0),15 }, + { IPv4(138,180,0,0),14 }, + { IPv4(138,181,0,0),16 }, + { IPv4(138,183,0,0),17 }, + { IPv4(138,184,0,0),16 }, + { IPv4(138,189,0,0),16 }, + { IPv4(138,198,0,0),16 }, + { IPv4(138,226,0,0),16 }, + { IPv4(138,229,0,0),16 }, + { IPv4(138,230,0,0),16 }, + { IPv4(138,234,0,0),16 }, + { IPv4(139,2,0,0),16 }, + { IPv4(139,27,0,0),16 }, + { IPv4(139,47,0,0),16 }, + { IPv4(139,48,0,0),16 }, + { IPv4(139,53,0,0),16 }, + { IPv4(139,56,64,0),19 }, + { IPv4(139,62,0,0),16 }, + { IPv4(139,65,0,0),16 }, + { IPv4(139,67,0,0),16 }, + { IPv4(139,72,0,0),16 }, + { IPv4(139,87,0,0),16 }, + { IPv4(139,88,0,0),16 }, + { IPv4(139,92,0,0),16 }, + { IPv4(139,93,0,0),16 }, + { IPv4(139,131,128,0),18 }, + { IPv4(139,131,192,0),19 }, + { IPv4(139,139,0,0),16 }, + { IPv4(139,141,0,0),16 }, + { IPv4(139,144,0,0),16 }, + { IPv4(139,152,0,0),16 }, + { IPv4(139,161,0,0),16 }, + { IPv4(139,169,0,0),16 }, + { IPv4(139,171,0,0),19 }, + { IPv4(139,171,0,0),16 }, + { IPv4(139,171,24,0),21 }, + { IPv4(139,175,0,0),16 }, + { IPv4(139,175,12,0),23 }, + { IPv4(139,175,56,0),24 }, + { IPv4(139,175,57,0),24 }, + { IPv4(139,175,58,0),24 }, + { IPv4(139,175,59,0),24 }, + { IPv4(139,175,169,0),24 }, + { IPv4(139,175,192,0),18 }, + { IPv4(139,175,252,0),24 }, + { IPv4(139,180,0,0),16 }, + { IPv4(139,182,0,0),16 }, + { IPv4(139,223,0,0),17 }, + { IPv4(139,223,0,0),16 }, + { IPv4(139,223,0,0),22 }, + { IPv4(139,223,2,0),24 }, + { IPv4(139,223,4,0),22 }, + { IPv4(139,223,8,0),21 }, + { IPv4(139,223,16,0),20 }, + { IPv4(139,223,32,0),19 }, + { IPv4(139,223,64,0),18 }, + { IPv4(139,223,128,0),18 }, + { IPv4(139,223,160,0),20 }, + { IPv4(139,223,187,0),24 }, + { IPv4(139,223,188,0),24 }, + { IPv4(139,223,189,0),24 }, + { IPv4(139,223,190,0),24 }, + { IPv4(139,223,191,0),24 }, + { IPv4(139,223,192,0),19 }, + { IPv4(139,223,192,0),24 }, + { IPv4(139,223,193,0),24 }, + { IPv4(139,223,195,0),24 }, + { IPv4(139,223,196,0),24 }, + { IPv4(139,223,197,0),24 }, + { IPv4(139,223,198,0),24 }, + { IPv4(139,223,199,0),24 }, + { IPv4(139,223,200,0),24 }, + { IPv4(139,223,220,0),22 }, + { IPv4(139,223,224,0),19 }, + { IPv4(139,223,232,0),24 }, + { IPv4(139,231,17,0),24 }, + { IPv4(139,232,0,0),16 }, + { IPv4(140,31,0,0),18 }, + { IPv4(140,31,192,0),21 }, + { IPv4(140,32,0,0),16 }, + { IPv4(140,35,0,0),16 }, + { IPv4(140,45,0,0),16 }, + { IPv4(140,47,0,0),16 }, + { IPv4(140,88,0,0),16 }, + { IPv4(140,89,0,0),16 }, + { IPv4(140,92,0,0),16 }, + { IPv4(140,95,0,0),16 }, + { IPv4(140,95,9,0),24 }, + { IPv4(140,95,205,0),24 }, + { IPv4(140,95,224,0),24 }, + { IPv4(140,96,0,0),16 }, + { IPv4(140,99,0,0),16 }, + { IPv4(140,99,96,0),19 }, + { IPv4(140,100,0,0),17 }, + { IPv4(140,100,0,0),16 }, + { IPv4(140,100,4,0),24 }, + { IPv4(140,100,128,0),18 }, + { IPv4(140,100,192,0),18 }, + { IPv4(140,107,0,0),16 }, + { IPv4(140,109,0,0),16 }, + { IPv4(140,110,0,0),15 }, + { IPv4(140,112,0,0),14 }, + { IPv4(140,112,0,0),16 }, + { IPv4(140,113,0,0),16 }, + { IPv4(140,114,0,0),15 }, + { IPv4(140,116,0,0),14 }, + { IPv4(140,120,0,0),14 }, + { IPv4(140,124,0,0),15 }, + { IPv4(140,126,0,0),16 }, + { IPv4(140,127,0,0),16 }, + { IPv4(140,128,0,0),13 }, + { IPv4(140,136,0,0),15 }, + { IPv4(140,138,0,0),16 }, + { IPv4(140,139,0,0),16 }, + { IPv4(140,139,28,64),27 }, + { IPv4(140,140,0,0),16 }, + { IPv4(140,144,0,0),16 }, + { IPv4(140,145,0,0),16 }, + { IPv4(140,148,0,0),16 }, + { IPv4(140,152,0,0),14 }, + { IPv4(140,153,5,0),25 }, + { IPv4(140,153,13,0),25 }, + { IPv4(140,153,18,0),25 }, + { IPv4(140,153,21,0),25 }, + { IPv4(140,153,99,0),25 }, + { IPv4(140,153,107,0),25 }, + { IPv4(140,153,189,0),27 }, + { IPv4(140,156,0,0),16 }, + { IPv4(140,157,38,0),23 }, + { IPv4(140,157,40,0),23 }, + { IPv4(140,157,42,0),23 }, + { IPv4(140,157,44,0),23 }, + { IPv4(140,157,48,0),23 }, + { IPv4(140,157,52,0),23 }, + { IPv4(140,163,0,0),16 }, + { IPv4(140,169,0,0),16 }, + { IPv4(140,172,0,0),16 }, + { IPv4(140,174,0,0),16 }, + { IPv4(140,174,85,0),24 }, + { IPv4(140,174,105,0),24 }, + { IPv4(140,174,208,0),24 }, + { IPv4(140,175,0,0),16 }, + { IPv4(140,176,0,0),16 }, + { IPv4(140,178,0,0),16 }, + { IPv4(140,180,0,0),16 }, + { IPv4(140,182,0,0),16 }, + { IPv4(140,183,0,0),16 }, + { IPv4(140,186,0,0),16 }, + { IPv4(140,186,46,0),24 }, + { IPv4(140,186,70,0),24 }, + { IPv4(140,186,96,0),24 }, + { IPv4(140,186,112,0),24 }, + { IPv4(140,186,129,0),24 }, + { IPv4(140,186,130,0),23 }, + { IPv4(140,186,132,0),23 }, + { IPv4(140,186,144,0),23 }, + { IPv4(140,186,160,0),22 }, + { IPv4(140,187,0,0),16 }, + { IPv4(140,192,0,0),16 }, + { IPv4(140,195,0,0),16 }, + { IPv4(140,196,0,0),16 }, + { IPv4(140,198,0,0),16 }, + { IPv4(140,201,0,0),16 }, + { IPv4(140,204,240,0),21 }, + { IPv4(140,209,0,0),16 }, + { IPv4(140,212,0,0),16 }, + { IPv4(140,212,200,0),22 }, + { IPv4(140,212,204,0),24 }, + { IPv4(140,212,205,0),24 }, + { IPv4(140,212,206,0),24 }, + { IPv4(140,214,0,0),15 }, + { IPv4(140,216,0,0),14 }, + { IPv4(140,221,0,0),16 }, + { IPv4(140,225,0,0),16 }, + { IPv4(140,226,0,0),16 }, + { IPv4(140,229,0,0),16 }, + { IPv4(140,233,0,0),16 }, + { IPv4(140,237,32,0),19 }, + { IPv4(140,239,0,0),16 }, + { IPv4(140,239,177,0),24 }, + { IPv4(140,239,214,0),24 }, + { IPv4(140,241,0,0),16 }, + { IPv4(140,251,0,0),16 }, + { IPv4(140,252,0,0),16 }, + { IPv4(141,92,0,0),16 }, + { IPv4(141,93,0,0),16 }, + { IPv4(141,102,0,0),16 }, + { IPv4(141,103,0,0),16 }, + { IPv4(141,111,0,0),16 }, + { IPv4(141,121,0,0),16 }, + { IPv4(141,122,0,0),16 }, + { IPv4(141,129,0,0),16 }, + { IPv4(141,140,0,0),16 }, + { IPv4(141,141,0,0),16 }, + { IPv4(141,142,0,0),16 }, + { IPv4(141,160,0,0),16 }, + { IPv4(141,164,0,0),16 }, + { IPv4(141,165,0,0),16 }, + { IPv4(141,173,0,0),16 }, + { IPv4(141,176,0,0),16 }, + { IPv4(141,178,0,0),16 }, + { IPv4(141,179,0,0),16 }, + { IPv4(141,183,0,0),16 }, + { IPv4(141,184,0,0),16 }, + { IPv4(141,187,0,0),16 }, + { IPv4(141,188,0,0),16 }, + { IPv4(141,189,0,0),16 }, + { IPv4(141,190,0,0),16 }, + { IPv4(141,197,4,0),23 }, + { IPv4(141,197,8,0),23 }, + { IPv4(141,198,0,0),16 }, + { IPv4(141,204,0,0),16 }, + { IPv4(141,205,0,0),16 }, + { IPv4(141,221,0,0),16 }, + { IPv4(141,222,0,0),16 }, + { IPv4(141,223,0,0),18 }, + { IPv4(141,223,0,0),16 }, + { IPv4(141,223,64,0),18 }, + { IPv4(141,223,128,0),18 }, + { IPv4(141,223,192,0),18 }, + { IPv4(141,224,0,0),16 }, + { IPv4(141,234,0,0),15 }, + { IPv4(141,236,0,0),16 }, + { IPv4(141,238,0,0),16 }, + { IPv4(141,238,64,0),20 }, + { IPv4(141,238,80,0),20 }, + { IPv4(141,238,96,0),19 }, + { IPv4(141,240,0,0),16 }, + { IPv4(141,242,0,0),16 }, + { IPv4(141,246,0,0),16 }, + { IPv4(141,248,0,0),16 }, + { IPv4(141,254,0,0),16 }, + { IPv4(142,21,0,0),16 }, + { IPv4(142,42,0,0),16 }, + { IPv4(142,42,242,0),24 }, + { IPv4(142,44,0,0),16 }, + { IPv4(142,51,0,0),16 }, + { IPv4(142,66,31,0),24 }, + { IPv4(142,78,0,0),16 }, + { IPv4(142,79,0,0),16 }, + { IPv4(142,89,0,0),16 }, + { IPv4(142,130,0,0),16 }, + { IPv4(142,144,0,0),16 }, + { IPv4(142,146,0,0),16 }, + { IPv4(142,146,41,0),24 }, + { IPv4(142,146,42,0),24 }, + { IPv4(142,146,246,0),24 }, + { IPv4(142,146,247,0),24 }, + { IPv4(142,146,248,0),24 }, + { IPv4(142,146,253,0),24 }, + { IPv4(142,147,0,0),16 }, + { IPv4(142,154,0,0),16 }, + { IPv4(142,154,224,0),19 }, + { IPv4(142,158,0,0),16 }, + { IPv4(142,192,200,0),24 }, + { IPv4(142,194,0,0),16 }, + { IPv4(142,194,32,0),19 }, + { IPv4(142,194,96,0),19 }, + { IPv4(142,194,128,0),19 }, + { IPv4(142,194,160,0),19 }, + { IPv4(142,194,192,0),19 }, + { IPv4(142,194,224,0),19 }, + { IPv4(142,201,0,0),16 }, + { IPv4(142,205,0,0),16 }, + { IPv4(142,205,54,0),23 }, + { IPv4(142,205,60,0),23 }, + { IPv4(142,205,232,0),23 }, + { IPv4(142,205,240,0),23 }, + { IPv4(142,205,248,0),23 }, + { IPv4(142,206,0,0),16 }, + { IPv4(142,238,0,0),16 }, + { IPv4(142,245,0,0),16 }, + { IPv4(142,245,0,0),19 }, + { IPv4(142,245,192,0),22 }, + { IPv4(143,43,0,0),16 }, + { IPv4(143,43,112,0),20 }, + { IPv4(143,43,192,0),18 }, + { IPv4(143,45,0,0),16 }, + { IPv4(143,46,0,0),16 }, + { IPv4(143,48,0,0),16 }, + { IPv4(143,56,0,0),16 }, + { IPv4(143,58,0,0),16 }, + { IPv4(143,58,0,0),19 }, + { IPv4(143,58,32,0),22 }, + { IPv4(143,58,36,0),22 }, + { IPv4(143,58,40,0),22 }, + { IPv4(143,58,100,0),22 }, + { IPv4(143,58,104,0),22 }, + { IPv4(143,58,164,0),22 }, + { IPv4(143,58,168,0),22 }, + { IPv4(143,58,172,0),22 }, + { IPv4(143,58,176,0),22 }, + { IPv4(143,58,180,0),22 }, + { IPv4(143,58,184,0),22 }, + { IPv4(143,58,245,0),24 }, + { IPv4(143,58,246,0),24 }, + { IPv4(143,61,0,0),16 }, + { IPv4(143,61,38,0),24 }, + { IPv4(143,61,153,0),24 }, + { IPv4(143,61,154,0),24 }, + { IPv4(143,61,156,0),24 }, + { IPv4(143,61,233,0),24 }, + { IPv4(143,62,0,0),16 }, + { IPv4(143,66,0,0),16 }, + { IPv4(143,67,0,0),16 }, + { IPv4(143,68,0,0),16 }, + { IPv4(143,77,0,0),16 }, + { IPv4(143,78,0,0),16 }, + { IPv4(143,81,0,0),16 }, + { IPv4(143,83,0,0),16 }, + { IPv4(143,85,0,0),16 }, + { IPv4(143,85,107,0),25 }, + { IPv4(143,96,0,0),16 }, + { IPv4(143,100,0,0),16 }, + { IPv4(143,104,0,0),16 }, + { IPv4(143,110,0,0),16 }, + { IPv4(143,111,0,0),16 }, + { IPv4(143,113,0,0),16 }, + { IPv4(143,115,0,0),16 }, + { IPv4(143,115,160,0),19 }, + { IPv4(143,116,0,0),16 }, + { IPv4(143,119,0,0),16 }, + { IPv4(143,127,0,0),19 }, + { IPv4(143,128,0,0),16 }, + { IPv4(143,134,0,0),16 }, + { IPv4(143,138,0,0),16 }, + { IPv4(143,138,0,0),15 }, + { IPv4(143,152,0,0),14 }, + { IPv4(143,158,0,0),16 }, + { IPv4(143,160,0,0),16 }, + { IPv4(143,164,96,0),22 }, + { IPv4(143,166,0,0),16 }, + { IPv4(143,176,0,0),14 }, + { IPv4(143,187,0,0),16 }, + { IPv4(143,191,0,0),16 }, + { IPv4(143,192,0,0),16 }, + { IPv4(143,195,0,0),16 }, + { IPv4(143,197,0,0),16 }, + { IPv4(143,211,0,0),16 }, + { IPv4(143,212,0,0),15 }, + { IPv4(143,214,0,0),16 }, + { IPv4(143,217,0,0),16 }, + { IPv4(143,223,20,0),24 }, + { IPv4(143,226,0,0),16 }, + { IPv4(143,227,0,0),16 }, + { IPv4(143,227,48,0),20 }, + { IPv4(143,229,0,0),16 }, + { IPv4(143,230,0,0),16 }, + { IPv4(143,232,0,0),16 }, + { IPv4(143,243,0,0),16 }, + { IPv4(143,244,0,0),16 }, + { IPv4(143,245,0,0),16 }, + { IPv4(143,247,0,0),16 }, + { IPv4(143,248,0,0),16 }, + { IPv4(143,249,0,0),16 }, + { IPv4(143,250,0,0),16 }, + { IPv4(144,3,0,0),16 }, + { IPv4(144,11,0,0),16 }, + { IPv4(144,15,0,0),16 }, + { IPv4(144,15,249,0),24 }, + { IPv4(144,15,252,0),24 }, + { IPv4(144,17,0,0),16 }, + { IPv4(144,18,0,0),16 }, + { IPv4(144,34,0,0),16 }, + { IPv4(144,35,0,0),16 }, + { IPv4(144,37,0,0),16 }, + { IPv4(144,38,0,0),16 }, + { IPv4(144,39,0,0),16 }, + { IPv4(144,45,0,0),16 }, + { IPv4(144,47,0,0),16 }, + { IPv4(144,49,0,0),16 }, + { IPv4(144,49,1,0),24 }, + { IPv4(144,49,2,0),24 }, + { IPv4(144,49,8,0),24 }, + { IPv4(144,58,0,0),16 }, + { IPv4(144,59,0,0),16 }, + { IPv4(144,73,0,0),16 }, + { IPv4(144,74,0,0),16 }, + { IPv4(144,80,14,0),23 }, + { IPv4(144,80,60,0),22 }, + { IPv4(144,80,92,0),22 }, + { IPv4(144,81,0,0),16 }, + { IPv4(144,86,0,0),16 }, + { IPv4(144,90,0,0),16 }, + { IPv4(144,95,0,0),16 }, + { IPv4(144,99,0,0),16 }, + { IPv4(144,100,0,0),14 }, + { IPv4(144,104,0,0),14 }, + { IPv4(144,109,0,0),16 }, + { IPv4(144,119,0,0),16 }, + { IPv4(144,141,0,0),16 }, + { IPv4(144,147,0,0),16 }, + { IPv4(144,169,0,0),16 }, + { IPv4(144,170,0,0),16 }, + { IPv4(144,182,0,0),15 }, + { IPv4(144,183,200,0),21 }, + { IPv4(144,183,208,0),21 }, + { IPv4(144,183,208,0),24 }, + { IPv4(144,184,0,0),16 }, + { IPv4(144,197,0,0),16 }, + { IPv4(144,198,0,0),16 }, + { IPv4(144,198,20,0),24 }, + { IPv4(144,198,24,0),22 }, + { IPv4(144,198,32,0),19 }, + { IPv4(144,198,70,0),24 }, + { IPv4(144,198,191,0),24 }, + { IPv4(144,198,192,0),24 }, + { IPv4(144,198,200,0),24 }, + { IPv4(144,198,207,0),24 }, + { IPv4(144,198,226,0),24 }, + { IPv4(144,199,0,0),16 }, + { IPv4(144,207,0,0),16 }, + { IPv4(144,213,0,0),16 }, + { IPv4(144,244,0,0),16 }, + { IPv4(144,245,0,0),16 }, + { IPv4(144,246,0,0),16 }, + { IPv4(144,247,0,0),16 }, + { IPv4(144,247,216,0),21 }, + { IPv4(144,247,224,0),21 }, + { IPv4(144,247,240,0),20 }, + { IPv4(144,251,0,0),16 }, + { IPv4(144,252,0,0),16 }, + { IPv4(144,254,0,0),16 }, + { IPv4(145,7,0,0),16 }, + { IPv4(145,8,0,0),16 }, + { IPv4(145,10,0,0),16 }, + { IPv4(145,53,0,0),16 }, + { IPv4(145,61,0,0),16 }, + { IPv4(145,63,0,0),16 }, + { IPv4(145,66,0,0),16 }, + { IPv4(145,69,0,0),16 }, + { IPv4(145,77,103,0),24 }, + { IPv4(145,224,0,0),16 }, + { IPv4(145,224,255,0),24 }, + { IPv4(145,225,203,0),24 }, + { IPv4(145,225,204,0),24 }, + { IPv4(145,229,0,0),16 }, + { IPv4(145,232,0,0),16 }, + { IPv4(146,1,8,0),21 }, + { IPv4(146,5,0,0),16 }, + { IPv4(146,6,0,0),16 }, + { IPv4(146,7,0,0),16 }, + { IPv4(146,18,0,0),16 }, + { IPv4(146,20,18,0),23 }, + { IPv4(146,20,23,0),24 }, + { IPv4(146,20,33,0),24 }, + { IPv4(146,20,34,0),24 }, + { IPv4(146,53,0,0),16 }, + { IPv4(146,57,0,0),16 }, + { IPv4(146,58,0,0),16 }, + { IPv4(146,64,0,0),16 }, + { IPv4(146,68,0,0),16 }, + { IPv4(146,79,0,0),16 }, + { IPv4(146,83,132,0),24 }, + { IPv4(146,83,135,0),24 }, + { IPv4(146,83,149,0),24 }, + { IPv4(146,83,164,0),24 }, + { IPv4(146,84,0,0),16 }, + { IPv4(146,86,0,0),16 }, + { IPv4(146,94,0,0),16 }, + { IPv4(146,95,0,0),16 }, + { IPv4(146,96,0,0),16 }, + { IPv4(146,99,0,0),16 }, + { IPv4(146,111,0,0),16 }, + { IPv4(146,115,0,0),16 }, + { IPv4(146,122,0,0),16 }, + { IPv4(146,126,0,0),16 }, + { IPv4(146,126,2,0),24 }, + { IPv4(146,126,51,0),24 }, + { IPv4(146,126,61,0),24 }, + { IPv4(146,126,73,0),24 }, + { IPv4(146,126,86,0),24 }, + { IPv4(146,126,88,0),24 }, + { IPv4(146,132,0,0),16 }, + { IPv4(146,137,0,0),16 }, + { IPv4(146,139,0,0),16 }, + { IPv4(146,141,0,0),16 }, + { IPv4(146,145,153,0),24 }, + { IPv4(146,150,0,0),16 }, + { IPv4(146,152,0,0),16 }, + { IPv4(146,153,0,0),16 }, + { IPv4(146,154,0,0),16 }, + { IPv4(146,155,0,0),16 }, + { IPv4(146,157,0,0),16 }, + { IPv4(146,163,0,0),16 }, + { IPv4(146,165,0,0),16 }, + { IPv4(146,167,0,0),16 }, + { IPv4(146,168,14,0),24 }, + { IPv4(146,174,0,0),16 }, + { IPv4(146,181,0,0),16 }, + { IPv4(146,182,0,0),16 }, + { IPv4(146,186,0,0),16 }, + { IPv4(146,196,0,0),16 }, + { IPv4(146,197,0,0),16 }, + { IPv4(146,202,0,0),16 }, + { IPv4(146,203,0,0),16 }, + { IPv4(146,206,0,0),16 }, + { IPv4(146,208,0,0),16 }, + { IPv4(146,209,160,0),19 }, + { IPv4(146,215,64,0),24 }, + { IPv4(146,215,65,0),24 }, + { IPv4(146,215,66,0),24 }, + { IPv4(146,217,0,0),16 }, + { IPv4(146,218,0,0),16 }, + { IPv4(146,220,224,0),20 }, + { IPv4(146,222,13,0),24 }, + { IPv4(146,222,14,0),24 }, + { IPv4(146,222,30,0),24 }, + { IPv4(146,222,31,0),24 }, + { IPv4(146,222,32,0),24 }, + { IPv4(146,222,33,0),24 }, + { IPv4(146,222,34,0),24 }, + { IPv4(146,222,45,0),24 }, + { IPv4(146,222,69,0),24 }, + { IPv4(146,222,156,0),23 }, + { IPv4(146,222,158,0),24 }, + { IPv4(146,222,187,0),24 }, + { IPv4(146,222,188,0),24 }, + { IPv4(146,222,194,0),24 }, + { IPv4(146,222,196,0),24 }, + { IPv4(146,222,197,0),24 }, + { IPv4(146,223,0,0),16 }, + { IPv4(146,230,0,0),16 }, + { IPv4(146,231,0,0),16 }, + { IPv4(146,232,0,0),16 }, + { IPv4(146,235,0,0),18 }, + { IPv4(146,235,64,0),18 }, + { IPv4(146,235,128,0),18 }, + { IPv4(146,244,0,0),16 }, + { IPv4(146,245,0,0),16 }, + { IPv4(146,246,0,0),16 }, + { IPv4(147,2,0,0),16 }, + { IPv4(147,4,0,0),16 }, + { IPv4(147,4,101,0),24 }, + { IPv4(147,6,0,0),16 }, + { IPv4(147,9,0,0),16 }, + { IPv4(147,16,0,0),16 }, + { IPv4(147,17,0,0),16 }, + { IPv4(147,21,0,0),16 }, + { IPv4(147,24,0,0),16 }, + { IPv4(147,25,0,0),16 }, + { IPv4(147,28,0,0),16 }, + { IPv4(147,35,0,0),16 }, + { IPv4(147,37,0,0),16 }, + { IPv4(147,39,0,0),16 }, + { IPv4(147,40,0,0),16 }, + { IPv4(147,43,0,0),16 }, + { IPv4(147,46,0,0),16 }, + { IPv4(147,51,0,0),16 }, + { IPv4(147,58,0,0),16 }, + { IPv4(147,71,0,0),16 }, + { IPv4(147,72,0,0),16 }, + { IPv4(147,72,64,0),18 }, + { IPv4(147,74,0,0),16 }, + { IPv4(147,78,0,0),16 }, + { IPv4(147,80,0,0),16 }, + { IPv4(147,92,0,0),20 }, + { IPv4(147,92,240,0),20 }, + { IPv4(147,103,0,0),16 }, + { IPv4(147,106,0,0),16 }, + { IPv4(147,118,0,0),16 }, + { IPv4(147,120,0,0),16 }, + { IPv4(147,128,68,0),22 }, + { IPv4(147,129,0,0),16 }, + { IPv4(147,130,0,0),15 }, + { IPv4(147,135,0,0),16 }, + { IPv4(147,137,0,0),16 }, + { IPv4(147,144,0,0),16 }, + { IPv4(147,147,0,0),16 }, + { IPv4(147,148,0,0),14 }, + { IPv4(147,153,0,0),16 }, + { IPv4(147,154,0,0),16 }, + { IPv4(147,155,0,0),16 }, + { IPv4(147,164,0,0),16 }, + { IPv4(147,166,0,0),16 }, + { IPv4(147,169,0,0),16 }, + { IPv4(147,178,0,0),16 }, + { IPv4(147,179,0,0),16 }, + { IPv4(147,182,0,0),16 }, + { IPv4(147,191,0,0),16 }, + { IPv4(147,198,0,0),16 }, + { IPv4(147,202,0,0),16 }, + { IPv4(147,202,60,0),24 }, + { IPv4(147,205,0,0),16 }, + { IPv4(147,208,0,0),19 }, + { IPv4(147,208,0,0),16 }, + { IPv4(147,208,128,0),18 }, + { IPv4(147,208,224,0),19 }, + { IPv4(147,216,0,0),15 }, + { IPv4(147,221,0,0),16 }, + { IPv4(147,222,0,0),16 }, + { IPv4(147,227,100,0),24 }, + { IPv4(147,235,0,0),16 }, + { IPv4(147,235,0,0),17 }, + { IPv4(147,235,128,0),19 }, + { IPv4(147,235,192,0),19 }, + { IPv4(147,235,224,0),22 }, + { IPv4(147,235,248,0),21 }, + { IPv4(147,237,232,0),24 }, + { IPv4(147,238,0,0),16 }, + { IPv4(147,239,0,0),16 }, + { IPv4(147,240,0,0),16 }, + { IPv4(147,241,0,0),16 }, + { IPv4(147,242,0,0),16 }, + { IPv4(147,248,0,0),16 }, + { IPv4(147,249,0,0),16 }, + { IPv4(148,5,0,0),16 }, + { IPv4(148,16,0,0),12 }, + { IPv4(148,55,0,0),16 }, + { IPv4(148,56,0,0),16 }, + { IPv4(148,59,0,0),16 }, + { IPv4(148,70,0,0),16 }, + { IPv4(148,71,0,0),16 }, + { IPv4(148,74,0,0),16 }, + { IPv4(148,75,0,0),16 }, + { IPv4(148,76,0,0),16 }, + { IPv4(148,77,0,0),16 }, + { IPv4(148,78,250,0),24 }, + { IPv4(148,78,251,0),24 }, + { IPv4(148,78,252,0),24 }, + { IPv4(148,78,253,0),24 }, + { IPv4(148,78,254,0),24 }, + { IPv4(148,84,0,0),16 }, + { IPv4(148,87,0,0),19 }, + { IPv4(148,89,252,0),24 }, + { IPv4(148,89,253,0),24 }, + { IPv4(148,89,254,0),24 }, + { IPv4(148,100,0,0),16 }, + { IPv4(148,107,0,0),16 }, + { IPv4(148,107,0,0),19 }, + { IPv4(148,107,1,0),24 }, + { IPv4(148,107,3,0),24 }, + { IPv4(148,107,4,0),24 }, + { IPv4(148,107,5,0),24 }, + { IPv4(148,107,6,0),24 }, + { IPv4(148,107,7,0),24 }, + { IPv4(148,107,8,0),24 }, + { IPv4(148,107,9,0),24 }, + { IPv4(148,107,10,0),24 }, + { IPv4(148,107,11,0),24 }, + { IPv4(148,107,12,0),24 }, + { IPv4(148,107,13,0),24 }, + { IPv4(148,107,14,0),24 }, + { IPv4(148,114,0,0),16 }, + { IPv4(148,115,0,0),16 }, + { IPv4(148,116,0,0),16 }, + { IPv4(148,126,0,0),16 }, + { IPv4(148,133,0,0),16 }, + { IPv4(148,141,0,0),16 }, + { IPv4(148,142,0,0),16 }, + { IPv4(148,146,0,0),16 }, + { IPv4(148,154,0,0),16 }, + { IPv4(148,163,0,0),16 }, + { IPv4(148,163,108,0),24 }, + { IPv4(148,165,0,0),16 }, + { IPv4(148,167,0,0),16 }, + { IPv4(148,168,0,0),16 }, + { IPv4(148,168,32,0),19 }, + { IPv4(148,168,96,0),19 }, + { IPv4(148,176,0,0),16 }, + { IPv4(148,176,248,0),24 }, + { IPv4(148,177,0,0),21 }, + { IPv4(148,177,0,0),16 }, + { IPv4(148,177,8,0),21 }, + { IPv4(148,177,128,0),21 }, + { IPv4(148,183,0,0),16 }, + { IPv4(148,199,0,0),16 }, + { IPv4(148,201,0,0),16 }, + { IPv4(148,203,196,0),24 }, + { IPv4(148,205,0,0),16 }, + { IPv4(148,208,128,0),17 }, + { IPv4(148,208,130,0),24 }, + { IPv4(148,208,131,0),24 }, + { IPv4(148,208,132,0),24 }, + { IPv4(148,208,134,0),24 }, + { IPv4(148,208,135,0),24 }, + { IPv4(148,208,137,0),24 }, + { IPv4(148,208,138,0),24 }, + { IPv4(148,208,140,0),24 }, + { IPv4(148,208,141,0),24 }, + { IPv4(148,208,143,0),24 }, + { IPv4(148,208,144,0),24 }, + { IPv4(148,208,145,0),24 }, + { IPv4(148,208,146,0),24 }, + { IPv4(148,208,147,0),24 }, + { IPv4(148,208,148,0),24 }, + { IPv4(148,208,149,0),24 }, + { IPv4(148,208,150,0),24 }, + { IPv4(148,208,151,0),24 }, + { IPv4(148,208,152,0),24 }, + { IPv4(148,208,153,0),24 }, + { IPv4(148,208,154,0),24 }, + { IPv4(148,208,155,0),24 }, + { IPv4(148,208,156,0),24 }, + { IPv4(148,208,157,0),24 }, + { IPv4(148,208,159,0),24 }, + { IPv4(148,208,161,0),24 }, + { IPv4(148,208,162,0),24 }, + { IPv4(148,208,163,0),24 }, + { IPv4(148,208,164,0),24 }, + { IPv4(148,208,165,0),24 }, + { IPv4(148,208,166,0),24 }, + { IPv4(148,208,167,0),24 }, + { IPv4(148,208,168,0),24 }, + { IPv4(148,208,169,0),24 }, + { IPv4(148,208,170,0),24 }, + { IPv4(148,208,171,0),24 }, + { IPv4(148,208,172,0),24 }, + { IPv4(148,208,174,0),24 }, + { IPv4(148,208,175,0),24 }, + { IPv4(148,208,176,0),24 }, + { IPv4(148,208,177,0),24 }, + { IPv4(148,208,178,0),24 }, + { IPv4(148,208,179,0),24 }, + { IPv4(148,208,180,0),24 }, + { IPv4(148,208,181,0),24 }, + { IPv4(148,208,182,0),24 }, + { IPv4(148,208,183,0),24 }, + { IPv4(148,208,184,0),24 }, + { IPv4(148,208,185,0),24 }, + { IPv4(148,208,186,0),24 }, + { IPv4(148,208,187,0),24 }, + { IPv4(148,208,188,0),24 }, + { IPv4(148,208,189,0),24 }, + { IPv4(148,208,190,0),24 }, + { IPv4(148,208,191,0),24 }, + { IPv4(148,208,192,0),24 }, + { IPv4(148,208,194,0),24 }, + { IPv4(148,208,195,0),24 }, + { IPv4(148,208,196,0),24 }, + { IPv4(148,208,198,0),24 }, + { IPv4(148,208,199,0),24 }, + { IPv4(148,208,200,0),24 }, + { IPv4(148,208,204,0),24 }, + { IPv4(148,208,205,0),24 }, + { IPv4(148,208,206,0),24 }, + { IPv4(148,208,207,0),24 }, + { IPv4(148,208,210,0),24 }, + { IPv4(148,208,214,0),24 }, + { IPv4(148,208,215,0),24 }, + { IPv4(148,208,216,0),24 }, + { IPv4(148,208,217,0),24 }, + { IPv4(148,208,218,0),24 }, + { IPv4(148,208,219,0),24 }, + { IPv4(148,208,220,0),24 }, + { IPv4(148,208,221,0),24 }, + { IPv4(148,208,222,0),24 }, + { IPv4(148,208,223,0),24 }, + { IPv4(148,208,224,0),24 }, + { IPv4(148,208,227,0),24 }, + { IPv4(148,208,228,0),24 }, + { IPv4(148,208,229,0),24 }, + { IPv4(148,208,230,0),24 }, + { IPv4(148,208,231,0),24 }, + { IPv4(148,208,232,0),24 }, + { IPv4(148,208,234,0),24 }, + { IPv4(148,208,236,0),24 }, + { IPv4(148,208,237,0),24 }, + { IPv4(148,208,238,0),24 }, + { IPv4(148,208,239,0),24 }, + { IPv4(148,208,240,0),24 }, + { IPv4(148,208,241,0),24 }, + { IPv4(148,208,242,0),24 }, + { IPv4(148,208,243,0),24 }, + { IPv4(148,208,246,0),24 }, + { IPv4(148,208,247,0),24 }, + { IPv4(148,208,248,0),24 }, + { IPv4(148,208,250,0),24 }, + { IPv4(148,208,251,0),24 }, + { IPv4(148,208,252,0),24 }, + { IPv4(148,208,254,0),24 }, + { IPv4(148,209,0,0),16 }, + { IPv4(148,210,0,0),16 }, + { IPv4(148,211,0,0),16 }, + { IPv4(148,214,0,0),16 }, + { IPv4(148,215,0,0),16 }, + { IPv4(148,216,0,0),16 }, + { IPv4(148,218,0,0),16 }, + { IPv4(148,219,0,0),16 }, + { IPv4(148,220,0,0),16 }, + { IPv4(148,221,0,0),19 }, + { IPv4(148,221,0,0),16 }, + { IPv4(148,221,32,0),19 }, + { IPv4(148,221,64,0),19 }, + { IPv4(148,221,96,0),19 }, + { IPv4(148,221,128,0),18 }, + { IPv4(148,221,192,0),18 }, + { IPv4(148,222,0,0),16 }, + { IPv4(148,223,0,0),18 }, + { IPv4(148,223,0,0),16 }, + { IPv4(148,223,64,0),19 }, + { IPv4(148,223,96,0),20 }, + { IPv4(148,223,112,0),20 }, + { IPv4(148,223,128,0),18 }, + { IPv4(148,223,152,0),24 }, + { IPv4(148,223,154,0),24 }, + { IPv4(148,223,192,0),19 }, + { IPv4(148,223,224,0),19 }, + { IPv4(148,224,6,0),24 }, + { IPv4(148,227,0,0),16 }, + { IPv4(148,230,0,0),16 }, + { IPv4(148,233,0,0),16 }, + { IPv4(148,233,0,0),19 }, + { IPv4(148,233,32,0),19 }, + { IPv4(148,233,64,0),19 }, + { IPv4(148,233,71,0),24 }, + { IPv4(148,233,77,0),24 }, + { IPv4(148,233,96,0),19 }, + { IPv4(148,233,128,0),18 }, + { IPv4(148,233,148,0),24 }, + { IPv4(148,233,152,0),24 }, + { IPv4(148,233,192,0),18 }, + { IPv4(148,233,241,0),24 }, + { IPv4(148,234,0,0),16 }, + { IPv4(148,235,0,0),16 }, + { IPv4(148,235,0,0),19 }, + { IPv4(148,235,32,0),19 }, + { IPv4(148,235,64,0),19 }, + { IPv4(148,235,96,0),19 }, + { IPv4(148,235,128,0),18 }, + { IPv4(148,235,192,0),18 }, + { IPv4(148,236,0,0),16 }, + { IPv4(148,237,0,0),16 }, + { IPv4(148,238,0,0),16 }, + { IPv4(148,239,0,0),16 }, + { IPv4(148,241,0,0),19 }, + { IPv4(148,241,32,0),19 }, + { IPv4(148,241,64,0),19 }, + { IPv4(148,242,0,0),16 }, + { IPv4(148,243,64,0),21 }, + { IPv4(148,244,0,0),17 }, + { IPv4(148,244,0,0),16 }, + { IPv4(148,244,0,0),18 }, + { IPv4(148,244,128,0),17 }, + { IPv4(148,245,228,0),24 }, + { IPv4(148,246,0,0),16 }, + { IPv4(148,248,0,0),16 }, + { IPv4(148,248,250,0),24 }, + { IPv4(148,249,0,0),16 }, + { IPv4(149,1,0,0),16 }, + { IPv4(149,2,22,0),24 }, + { IPv4(149,2,24,0),23 }, + { IPv4(149,2,28,0),24 }, + { IPv4(149,2,32,0),21 }, + { IPv4(149,2,78,0),24 }, + { IPv4(149,2,80,0),24 }, + { IPv4(149,2,121,0),24 }, + { IPv4(149,2,122,0),24 }, + { IPv4(149,2,123,0),24 }, + { IPv4(149,2,132,0),24 }, + { IPv4(149,2,143,0),24 }, + { IPv4(149,4,0,0),16 }, + { IPv4(149,15,0,0),16 }, + { IPv4(149,28,0,0),16 }, + { IPv4(149,28,0,0),20 }, + { IPv4(149,31,0,0),16 }, + { IPv4(149,43,0,0),16 }, + { IPv4(149,46,0,0),24 }, + { IPv4(149,48,0,0),16 }, + { IPv4(149,54,0,0),16 }, + { IPv4(149,58,0,0),16 }, + { IPv4(149,61,0,0),16 }, + { IPv4(149,63,0,0),16 }, + { IPv4(149,64,0,0),16 }, + { IPv4(149,65,0,0),16 }, + { IPv4(149,68,0,0),16 }, + { IPv4(149,70,0,0),16 }, + { IPv4(149,81,0,0),16 }, + { IPv4(149,83,208,0),24 }, + { IPv4(149,84,0,0),16 }, + { IPv4(149,89,0,0),16 }, + { IPv4(149,105,0,0),16 }, + { IPv4(149,114,0,0),16 }, + { IPv4(149,119,0,0),16 }, + { IPv4(149,123,0,0),16 }, + { IPv4(149,123,254,0),24 }, + { IPv4(149,125,0,0),16 }, + { IPv4(149,134,0,0),16 }, + { IPv4(149,137,0,0),16 }, + { IPv4(149,142,0,0),16 }, + { IPv4(149,145,0,0),16 }, + { IPv4(149,158,0,0),16 }, + { IPv4(149,159,0,0),16 }, + { IPv4(149,169,0,0),16 }, + { IPv4(149,172,0,0),17 }, + { IPv4(149,172,0,0),16 }, + { IPv4(149,172,128,0),17 }, + { IPv4(149,172,150,0),24 }, + { IPv4(149,173,0,0),16 }, + { IPv4(149,174,0,0),16 }, + { IPv4(149,199,0,0),16 }, + { IPv4(149,206,0,0),16 }, + { IPv4(149,211,0,0),16 }, + { IPv4(149,214,0,0),16 }, + { IPv4(149,221,0,0),16 }, + { IPv4(149,236,0,0),16 }, + { IPv4(149,239,0,0),16 }, + { IPv4(149,242,212,0),24 }, + { IPv4(149,244,0,0),16 }, + { IPv4(150,18,0,0),16 }, + { IPv4(150,19,0,0),16 }, + { IPv4(150,26,0,0),16 }, + { IPv4(150,29,0,0),16 }, + { IPv4(150,32,0,0),16 }, + { IPv4(150,48,240,0),23 }, + { IPv4(150,52,0,0),16 }, + { IPv4(150,61,0,0),16 }, + { IPv4(150,63,0,0),16 }, + { IPv4(150,65,0,0),16 }, + { IPv4(150,70,32,0),22 }, + { IPv4(150,82,0,0),16 }, + { IPv4(150,91,0,0),16 }, + { IPv4(150,105,0,0),16 }, + { IPv4(150,105,16,0),20 }, + { IPv4(150,105,32,0),20 }, + { IPv4(150,112,0,0),16 }, + { IPv4(150,113,0,0),16 }, + { IPv4(150,114,0,0),16 }, + { IPv4(150,131,0,0),16 }, + { IPv4(150,133,0,0),16 }, + { IPv4(150,135,0,0),16 }, + { IPv4(150,137,0,0),16 }, + { IPv4(150,142,0,0),16 }, + { IPv4(150,143,0,0),16 }, + { IPv4(150,144,0,0),16 }, + { IPv4(150,149,0,0),16 }, + { IPv4(150,150,0,0),16 }, + { IPv4(150,152,0,0),16 }, + { IPv4(150,155,0,0),16 }, + { IPv4(150,156,0,0),16 }, + { IPv4(150,167,0,0),16 }, + { IPv4(150,177,0,0),16 }, + { IPv4(150,180,0,0),16 }, + { IPv4(150,183,0,0),16 }, + { IPv4(150,183,10,0),24 }, + { IPv4(150,183,92,0),24 }, + { IPv4(150,184,0,0),16 }, + { IPv4(150,185,128,0),18 }, + { IPv4(150,190,0,0),16 }, + { IPv4(150,192,0,0),15 }, + { IPv4(150,195,0,0),16 }, + { IPv4(150,197,0,0),16 }, + { IPv4(150,199,0,0),16 }, + { IPv4(150,200,0,0),16 }, + { IPv4(150,201,0,0),16 }, + { IPv4(150,202,0,0),16 }, + { IPv4(150,202,8,0),24 }, + { IPv4(150,209,0,0),16 }, + { IPv4(150,210,0,0),16 }, + { IPv4(150,220,10,0),24 }, + { IPv4(150,225,0,0),16 }, + { IPv4(150,226,0,0),16 }, + { IPv4(150,228,0,0),16 }, + { IPv4(150,231,0,0),16 }, + { IPv4(150,232,0,0),16 }, + { IPv4(150,243,0,0),16 }, + { IPv4(150,250,0,0),16 }, + { IPv4(150,253,0,0),16 }, + { IPv4(151,87,0,0),16 }, + { IPv4(151,96,0,0),16 }, + { IPv4(151,110,206,0),24 }, + { IPv4(151,111,0,0),16 }, + { IPv4(151,113,0,0),16 }, + { IPv4(151,118,0,0),16 }, + { IPv4(151,120,0,0),16 }, + { IPv4(151,124,0,0),16 }, + { IPv4(151,125,0,0),16 }, + { IPv4(151,126,0,0),16 }, + { IPv4(151,140,0,0),16 }, + { IPv4(151,142,218,0),24 }, + { IPv4(151,148,0,0),16 }, + { IPv4(151,153,0,0),16 }, + { IPv4(151,155,0,0),16 }, + { IPv4(151,163,0,0),16 }, + { IPv4(151,163,2,0),24 }, + { IPv4(151,163,56,0),24 }, + { IPv4(151,163,57,0),24 }, + { IPv4(151,164,88,0),24 }, + { IPv4(151,164,169,0),24 }, + { IPv4(151,164,170,0),23 }, + { IPv4(151,164,172,0),23 }, + { IPv4(151,164,174,0),24 }, + { IPv4(151,164,230,0),24 }, + { IPv4(151,164,231,0),24 }, + { IPv4(151,166,0,0),16 }, + { IPv4(151,186,0,0),16 }, + { IPv4(151,190,0,0),16 }, + { IPv4(151,193,0,0),16 }, + { IPv4(151,195,0,0),16 }, + { IPv4(151,210,0,0),16 }, + { IPv4(151,212,0,0),16 }, + { IPv4(152,61,0,0),16 }, + { IPv4(152,61,1,0),24 }, + { IPv4(152,67,0,0),16 }, + { IPv4(152,67,13,0),24 }, + { IPv4(152,67,109,0),24 }, + { IPv4(152,67,220,0),22 }, + { IPv4(152,67,224,0),23 }, + { IPv4(152,67,226,0),24 }, + { IPv4(152,76,0,0),16 }, + { IPv4(152,79,0,0),16 }, + { IPv4(152,80,0,0),16 }, + { IPv4(152,85,0,0),16 }, + { IPv4(152,85,2,0),24 }, + { IPv4(152,85,3,0),24 }, + { IPv4(152,86,0,0),16 }, + { IPv4(152,87,0,0),16 }, + { IPv4(152,99,0,0),16 }, + { IPv4(152,99,0,0),17 }, + { IPv4(152,99,128,0),18 }, + { IPv4(152,99,192,0),18 }, + { IPv4(152,104,224,0),19 }, + { IPv4(152,107,0,0),16 }, + { IPv4(152,110,0,0),16 }, + { IPv4(152,111,0,0),16 }, + { IPv4(152,112,0,0),16 }, + { IPv4(152,114,0,0),16 }, + { IPv4(152,131,100,0),22 }, + { IPv4(152,131,104,0),24 }, + { IPv4(152,131,110,0),23 }, + { IPv4(152,131,112,0),23 }, + { IPv4(152,131,114,0),24 }, + { IPv4(152,137,0,0),16 }, + { IPv4(152,149,0,0),16 }, + { IPv4(152,158,0,0),16 }, + { IPv4(152,158,160,0),19 }, + { IPv4(152,158,192,0),18 }, + { IPv4(152,160,0,0),16 }, + { IPv4(152,163,0,0),20 }, + { IPv4(152,163,0,0),16 }, + { IPv4(152,229,0,0),16 }, + { IPv4(153,2,0,0),16 }, + { IPv4(153,2,228,0),24 }, + { IPv4(153,2,229,0),24 }, + { IPv4(153,2,230,0),24 }, + { IPv4(153,2,231,0),24 }, + { IPv4(153,2,234,0),24 }, + { IPv4(153,2,244,0),24 }, + { IPv4(153,2,247,0),24 }, + { IPv4(153,4,0,0),16 }, + { IPv4(153,9,0,0),16 }, + { IPv4(153,10,0,0),16 }, + { IPv4(153,11,0,0),16 }, + { IPv4(153,18,0,0),16 }, + { IPv4(153,20,0,0),16 }, + { IPv4(153,24,0,0),14 }, + { IPv4(153,33,0,0),16 }, + { IPv4(153,45,0,0),16 }, + { IPv4(153,46,0,0),16 }, + { IPv4(153,69,0,0),24 }, + { IPv4(153,69,128,0),24 }, + { IPv4(153,91,0,0),16 }, + { IPv4(153,102,0,0),16 }, + { IPv4(153,103,0,0),16 }, + { IPv4(153,105,0,0),16 }, + { IPv4(154,2,0,0),16 }, + { IPv4(155,5,0,0),16 }, + { IPv4(155,6,0,0),16 }, + { IPv4(155,8,0,0),15 }, + { IPv4(155,14,0,0),16 }, + { IPv4(155,36,0,0),16 }, + { IPv4(155,41,0,0),17 }, + { IPv4(155,48,0,0),16 }, + { IPv4(155,53,0,0),16 }, + { IPv4(155,59,2,0),24 }, + { IPv4(155,60,0,0),16 }, + { IPv4(155,68,0,0),16 }, + { IPv4(155,72,0,0),16 }, + { IPv4(155,72,145,0),24 }, + { IPv4(155,72,147,0),24 }, + { IPv4(155,72,148,0),22 }, + { IPv4(155,91,0,0),16 }, + { IPv4(155,91,2,0),24 }, + { IPv4(155,91,4,0),24 }, + { IPv4(155,91,6,0),24 }, + { IPv4(155,91,8,0),24 }, + { IPv4(155,91,16,0),24 }, + { IPv4(155,91,17,0),24 }, + { IPv4(155,94,0,0),16 }, + { IPv4(155,94,104,0),21 }, + { IPv4(155,95,0,0),16 }, + { IPv4(155,99,0,0),16 }, + { IPv4(155,100,0,0),16 }, + { IPv4(155,101,0,0),16 }, + { IPv4(155,106,0,0),16 }, + { IPv4(155,131,0,0),16 }, + { IPv4(155,131,0,0),19 }, + { IPv4(155,131,96,0),19 }, + { IPv4(155,135,0,0),16 }, + { IPv4(155,136,0,0),16 }, + { IPv4(155,141,0,0),16 }, + { IPv4(155,147,0,0),16 }, + { IPv4(155,147,25,0),24 }, + { IPv4(155,148,0,0),16 }, + { IPv4(155,149,0,0),16 }, + { IPv4(155,150,0,0),15 }, + { IPv4(155,152,0,0),14 }, + { IPv4(155,152,120,0),21 }, + { IPv4(155,159,0,0),16 }, + { IPv4(155,161,0,0),16 }, + { IPv4(155,162,0,0),15 }, + { IPv4(155,164,0,0),14 }, + { IPv4(155,168,0,0),15 }, + { IPv4(155,170,0,0),16 }, + { IPv4(155,170,0,0),17 }, + { IPv4(155,173,0,0),16 }, + { IPv4(155,174,0,0),16 }, + { IPv4(155,176,0,0),16 }, + { IPv4(155,177,174,0),24 }, + { IPv4(155,182,104,0),24 }, + { IPv4(155,192,0,0),17 }, + { IPv4(155,192,0,0),16 }, + { IPv4(155,192,160,0),19 }, + { IPv4(155,201,0,0),16 }, + { IPv4(155,201,35,0),24 }, + { IPv4(155,201,36,0),24 }, + { IPv4(155,201,63,0),24 }, + { IPv4(155,201,64,0),18 }, + { IPv4(155,201,128,0),18 }, + { IPv4(155,201,139,0),24 }, + { IPv4(155,201,240,0),24 }, + { IPv4(155,201,241,0),24 }, + { IPv4(155,201,242,0),24 }, + { IPv4(155,201,243,0),24 }, + { IPv4(155,201,244,0),24 }, + { IPv4(155,201,245,0),24 }, + { IPv4(155,201,246,0),24 }, + { IPv4(155,202,0,0),16 }, + { IPv4(155,202,254,0),24 }, + { IPv4(155,208,0,0),16 }, + { IPv4(155,211,0,0),16 }, + { IPv4(155,211,112,0),24 }, + { IPv4(155,211,128,0),24 }, + { IPv4(155,211,251,0),24 }, + { IPv4(155,212,0,0),16 }, + { IPv4(155,213,0,0),16 }, + { IPv4(155,214,0,0),15 }, + { IPv4(155,216,0,0),14 }, + { IPv4(155,218,0,0),16 }, + { IPv4(155,223,0,0),16 }, + { IPv4(155,225,0,0),16 }, + { IPv4(155,226,0,0),16 }, + { IPv4(155,230,0,0),16 }, + { IPv4(155,232,0,0),16 }, + { IPv4(155,234,0,0),16 }, + { IPv4(155,235,0,0),16 }, + { IPv4(155,236,150,0),23 }, + { IPv4(155,236,152,0),24 }, + { IPv4(155,237,0,0),16 }, + { IPv4(155,238,0,0),16 }, + { IPv4(155,239,0,0),16 }, + { IPv4(155,240,0,0),16 }, + { IPv4(155,244,0,0),16 }, + { IPv4(155,250,0,0),16 }, + { IPv4(155,252,0,0),24 }, + { IPv4(155,252,0,0),16 }, + { IPv4(155,252,1,0),24 }, + { IPv4(155,252,2,0),24 }, + { IPv4(155,252,4,0),22 }, + { IPv4(155,252,16,0),20 }, + { IPv4(155,252,64,0),21 }, + { IPv4(155,252,72,0),21 }, + { IPv4(155,252,80,0),21 }, + { IPv4(155,252,88,0),21 }, + { IPv4(155,252,96,0),21 }, + { IPv4(155,252,104,0),22 }, + { IPv4(155,252,112,0),22 }, + { IPv4(155,252,116,0),22 }, + { IPv4(155,252,128,0),21 }, + { IPv4(155,252,140,0),22 }, + { IPv4(155,252,144,0),21 }, + { IPv4(155,252,152,0),22 }, + { IPv4(155,252,158,0),24 }, + { IPv4(155,252,160,0),22 }, + { IPv4(155,252,164,0),23 }, + { IPv4(155,252,192,0),21 }, + { IPv4(155,252,204,0),22 }, + { IPv4(155,252,224,0),20 }, + { IPv4(155,252,240,0),21 }, + { IPv4(155,252,248,0),22 }, + { IPv4(155,252,252,0),24 }, + { IPv4(156,6,0,0),16 }, + { IPv4(156,7,0,0),16 }, + { IPv4(156,8,0,0),16 }, + { IPv4(156,19,0,0),16 }, + { IPv4(156,29,0,0),16 }, + { IPv4(156,42,0,0),16 }, + { IPv4(156,46,25,0),24 }, + { IPv4(156,46,140,0),22 }, + { IPv4(156,55,0,0),16 }, + { IPv4(156,55,126,0),23 }, + { IPv4(156,55,128,0),22 }, + { IPv4(156,55,132,0),22 }, + { IPv4(156,56,0,0),16 }, + { IPv4(156,59,0,0),16 }, + { IPv4(156,61,0,0),16 }, + { IPv4(156,62,0,0),16 }, + { IPv4(156,63,0,0),16 }, + { IPv4(156,68,0,0),16 }, + { IPv4(156,77,0,0),16 }, + { IPv4(156,77,64,0),19 }, + { IPv4(156,79,0,0),16 }, + { IPv4(156,98,0,0),15 }, + { IPv4(156,107,168,0),23 }, + { IPv4(156,111,0,0),16 }, + { IPv4(156,114,200,0),24 }, + { IPv4(156,140,0,0),16 }, + { IPv4(156,145,0,0),16 }, + { IPv4(156,147,0,0),16 }, + { IPv4(156,152,0,0),15 }, + { IPv4(156,152,224,0),24 }, + { IPv4(156,153,37,0),24 }, + { IPv4(157,2,0,0),16 }, + { IPv4(157,22,0,0),16 }, + { IPv4(157,22,112,0),20 }, + { IPv4(157,22,208,0),23 }, + { IPv4(157,22,237,0),24 }, + { IPv4(157,28,0,0),15 }, + { IPv4(157,64,0,0),16 }, + { IPv4(157,66,0,0),16 }, + { IPv4(157,71,0,0),16 }, + { IPv4(157,72,0,0),16 }, + { IPv4(157,73,0,0),16 }, + { IPv4(157,74,0,0),16 }, + { IPv4(157,75,0,0),16 }, + { IPv4(157,77,0,0),16 }, + { IPv4(157,79,0,0),16 }, + { IPv4(157,84,0,0),16 }, + { IPv4(157,89,0,0),16 }, + { IPv4(157,92,0,0),16 }, + { IPv4(157,100,1,0),24 }, + { IPv4(157,100,2,0),24 }, + { IPv4(157,100,8,0),24 }, + { IPv4(157,100,16,0),24 }, + { IPv4(157,100,21,0),24 }, + { IPv4(157,100,24,0),24 }, + { IPv4(157,100,25,0),24 }, + { IPv4(157,100,27,0),24 }, + { IPv4(157,100,28,0),24 }, + { IPv4(157,100,29,0),24 }, + { IPv4(157,100,33,0),24 }, + { IPv4(157,100,37,0),24 }, + { IPv4(157,100,45,0),24 }, + { IPv4(157,100,46,0),24 }, + { IPv4(157,100,50,0),24 }, + { IPv4(157,100,58,0),24 }, + { IPv4(157,100,59,0),24 }, + { IPv4(157,100,61,0),24 }, + { IPv4(157,100,71,0),24 }, + { IPv4(157,100,72,0),24 }, + { IPv4(157,100,97,0),24 }, + { IPv4(157,100,98,0),24 }, + { IPv4(157,100,100,0),24 }, + { IPv4(157,100,103,0),24 }, + { IPv4(157,100,104,0),24 }, + { IPv4(157,100,111,0),24 }, + { IPv4(157,100,112,0),24 }, + { IPv4(157,100,113,0),24 }, + { IPv4(157,100,125,0),24 }, + { IPv4(157,100,136,0),24 }, + { IPv4(157,100,141,0),24 }, + { IPv4(157,100,144,0),24 }, + { IPv4(157,100,147,0),24 }, + { IPv4(157,100,158,0),24 }, + { IPv4(157,100,165,0),24 }, + { IPv4(157,100,183,0),24 }, + { IPv4(157,100,217,0),24 }, + { IPv4(157,100,251,0),24 }, + { IPv4(157,109,0,0),16 }, + { IPv4(157,111,0,0),16 }, + { IPv4(157,120,0,0),16 }, + { IPv4(157,125,0,0),16 }, + { IPv4(157,127,0,0),16 }, + { IPv4(157,128,0,0),16 }, + { IPv4(157,132,0,0),16 }, + { IPv4(157,139,0,0),16 }, + { IPv4(157,141,0,0),16 }, + { IPv4(157,151,0,0),16 }, + { IPv4(157,154,0,0),16 }, + { IPv4(157,162,0,0),16 }, + { IPv4(157,165,0,0),16 }, + { IPv4(157,176,0,0),16 }, + { IPv4(157,178,0,0),16 }, + { IPv4(157,179,0,0),20 }, + { IPv4(157,179,16,0),24 }, + { IPv4(157,187,0,0),16 }, + { IPv4(157,187,16,0),20 }, + { IPv4(157,187,32,0),20 }, + { IPv4(157,187,48,0),20 }, + { IPv4(157,198,0,0),16 }, + { IPv4(157,199,0,0),16 }, + { IPv4(157,201,0,0),16 }, + { IPv4(157,205,0,0),16 }, + { IPv4(157,205,128,0),17 }, + { IPv4(157,209,0,0),16 }, + { IPv4(157,226,0,0),16 }, + { IPv4(157,229,0,0),16 }, + { IPv4(157,231,16,0),24 }, + { IPv4(157,238,0,0),16 }, + { IPv4(157,252,0,0),16 }, + { IPv4(158,0,0,0),13 }, + { IPv4(158,2,0,0),16 }, + { IPv4(158,8,0,0),14 }, + { IPv4(158,12,0,0),16 }, + { IPv4(158,14,0,0),15 }, + { IPv4(158,16,0,0),14 }, + { IPv4(158,20,0,0),16 }, + { IPv4(158,44,20,0),22 }, + { IPv4(158,44,24,0),23 }, + { IPv4(158,44,26,0),24 }, + { IPv4(158,52,0,0),16 }, + { IPv4(158,54,0,0),16 }, + { IPv4(158,57,0,0),16 }, + { IPv4(158,73,0,0),16 }, + { IPv4(158,81,0,0),17 }, + { IPv4(158,81,128,0),17 }, + { IPv4(158,83,0,0),16 }, + { IPv4(158,91,0,0),16 }, + { IPv4(158,93,0,0),16 }, + { IPv4(158,97,0,0),16 }, + { IPv4(158,100,0,0),16 }, + { IPv4(158,102,0,0),16 }, + { IPv4(158,107,0,0),16 }, + { IPv4(158,107,48,0),22 }, + { IPv4(158,113,0,0),16 }, + { IPv4(158,114,0,0),16 }, + { IPv4(158,116,131,0),24 }, + { IPv4(158,118,10,0),24 }, + { IPv4(158,118,11,0),24 }, + { IPv4(158,122,0,0),16 }, + { IPv4(158,130,0,0),16 }, + { IPv4(158,132,0,0),16 }, + { IPv4(158,135,0,0),16 }, + { IPv4(158,142,0,0),16 }, + { IPv4(158,151,0,0),16 }, + { IPv4(158,152,0,0),16 }, + { IPv4(158,153,0,0),16 }, + { IPv4(158,154,0,0),16 }, + { IPv4(158,157,0,0),16 }, + { IPv4(158,158,0,0),16 }, + { IPv4(158,161,0,0),16 }, + { IPv4(158,171,192,0),24 }, + { IPv4(158,171,193,0),24 }, + { IPv4(158,171,194,0),24 }, + { IPv4(158,171,195,0),24 }, + { IPv4(158,171,210,0),24 }, + { IPv4(158,171,211,0),24 }, + { IPv4(158,201,0,0),16 }, + { IPv4(158,203,0,0),16 }, + { IPv4(158,210,0,0),16 }, + { IPv4(158,222,224,0),20 }, + { IPv4(158,236,0,0),14 }, + { IPv4(158,239,0,0),16 }, + { IPv4(158,240,0,0),14 }, + { IPv4(158,240,0,0),16 }, + { IPv4(158,244,0,0),16 }, + { IPv4(158,245,0,0),16 }, + { IPv4(158,247,0,0),16 }, + { IPv4(158,251,0,0),16 }, + { IPv4(159,7,135,0),24 }, + { IPv4(159,12,0,0),16 }, + { IPv4(159,16,0,0),16 }, + { IPv4(159,21,0,0),16 }, + { IPv4(159,33,0,0),16 }, + { IPv4(159,49,0,0),16 }, + { IPv4(159,53,0,0),16 }, + { IPv4(159,62,0,0),16 }, + { IPv4(159,71,0,0),16 }, + { IPv4(159,75,0,0),16 }, + { IPv4(159,77,0,0),16 }, + { IPv4(159,82,0,0),16 }, + { IPv4(159,83,0,0),16 }, + { IPv4(159,99,0,0),16 }, + { IPv4(159,104,6,0),24 }, + { IPv4(159,104,7,0),24 }, + { IPv4(159,108,0,0),16 }, + { IPv4(159,113,0,0),16 }, + { IPv4(159,115,0,0),16 }, + { IPv4(159,115,14,0),24 }, + { IPv4(159,119,0,0),16 }, + { IPv4(159,120,0,0),16 }, + { IPv4(159,124,0,0),16 }, + { IPv4(159,133,0,0),16 }, + { IPv4(159,137,0,0),16 }, + { IPv4(159,140,0,0),16 }, + { IPv4(159,140,174,0),24 }, + { IPv4(159,140,213,0),24 }, + { IPv4(159,140,214,0),24 }, + { IPv4(159,140,218,0),24 }, + { IPv4(159,140,219,0),24 }, + { IPv4(159,140,244,0),24 }, + { IPv4(159,140,254,0),24 }, + { IPv4(159,143,0,0),16 }, + { IPv4(159,153,0,0),17 }, + { IPv4(159,153,0,0),16 }, + { IPv4(159,153,128,0),19 }, + { IPv4(159,153,160,0),21 }, + { IPv4(159,153,192,0),19 }, + { IPv4(159,153,224,0),19 }, + { IPv4(159,157,16,0),24 }, + { IPv4(159,157,254,0),24 }, + { IPv4(159,182,0,0),16 }, + { IPv4(159,189,0,0),16 }, + { IPv4(159,199,0,0),16 }, + { IPv4(159,204,0,0),16 }, + { IPv4(159,212,0,0),16 }, + { IPv4(159,221,0,0),16 }, + { IPv4(159,223,0,0),16 }, + { IPv4(159,226,0,0),16 }, + { IPv4(159,240,0,0),16 }, + { IPv4(159,247,0,0),16 }, + { IPv4(159,251,0,0),16 }, + { IPv4(160,7,0,0),16 }, + { IPv4(160,10,0,0),16 }, + { IPv4(160,23,0,0),16 }, + { IPv4(160,33,0,0),19 }, + { IPv4(160,33,0,0),16 }, + { IPv4(160,39,0,0),16 }, + { IPv4(160,41,0,0),16 }, + { IPv4(160,42,0,0),16 }, + { IPv4(160,43,0,0),16 }, + { IPv4(160,54,0,0),15 }, + { IPv4(160,56,0,0),15 }, + { IPv4(160,58,0,0),16 }, + { IPv4(160,69,0,0),23 }, + { IPv4(160,79,0,0),16 }, + { IPv4(160,79,80,0),24 }, + { IPv4(160,79,190,0),23 }, + { IPv4(160,79,198,0),23 }, + { IPv4(160,79,214,0),23 }, + { IPv4(160,79,216,0),23 }, + { IPv4(160,79,224,0),22 }, + { IPv4(160,79,240,0),22 }, + { IPv4(160,79,248,0),22 }, + { IPv4(160,83,32,0),19 }, + { IPv4(160,87,0,0),16 }, + { IPv4(160,91,0,0),16 }, + { IPv4(160,93,0,0),16 }, + { IPv4(160,94,0,0),16 }, + { IPv4(160,96,0,0),16 }, + { IPv4(160,115,0,0),16 }, + { IPv4(160,118,0,0),16 }, + { IPv4(160,123,0,0),16 }, + { IPv4(160,125,0,0),16 }, + { IPv4(160,126,0,0),15 }, + { IPv4(160,128,0,0),18 }, + { IPv4(160,129,0,0),16 }, + { IPv4(160,132,0,0),15 }, + { IPv4(160,134,0,0),16 }, + { IPv4(160,135,0,0),16 }, + { IPv4(160,136,0,0),13 }, + { IPv4(160,144,0,0),13 }, + { IPv4(160,147,0,0),16 }, + { IPv4(160,189,0,0),16 }, + { IPv4(160,190,0,0),16 }, + { IPv4(160,192,0,0),16 }, + { IPv4(160,194,0,0),16 }, + { IPv4(160,199,0,0),16 }, + { IPv4(160,201,0,0),16 }, + { IPv4(160,202,0,0),16 }, + { IPv4(160,205,0,0),16 }, + { IPv4(160,206,0,0),16 }, + { IPv4(160,207,0,0),16 }, + { IPv4(160,211,0,0),16 }, + { IPv4(160,212,0,0),16 }, + { IPv4(160,219,0,0),16 }, + { IPv4(160,221,0,0),16 }, + { IPv4(160,227,0,0),16 }, + { IPv4(160,231,0,0),16 }, + { IPv4(160,231,1,0),24 }, + { IPv4(160,239,0,0),16 }, + { IPv4(160,239,1,0),24 }, + { IPv4(160,240,0,0),16 }, + { IPv4(160,243,0,0),16 }, + { IPv4(160,248,0,0),16 }, + { IPv4(160,254,0,0),16 }, + { IPv4(160,254,107,0),24 }, + { IPv4(160,254,115,0),24 }, + { IPv4(160,254,123,0),24 }, + { IPv4(161,1,0,0),17 }, + { IPv4(161,1,0,0),16 }, + { IPv4(161,2,0,0),16 }, + { IPv4(161,13,0,0),16 }, + { IPv4(161,16,0,0),16 }, + { IPv4(161,21,0,0),18 }, + { IPv4(161,21,20,0),23 }, + { IPv4(161,21,22,0),23 }, + { IPv4(161,21,24,0),23 }, + { IPv4(161,21,26,0),23 }, + { IPv4(161,21,28,0),23 }, + { IPv4(161,21,30,0),23 }, + { IPv4(161,21,32,0),23 }, + { IPv4(161,21,34,0),23 }, + { IPv4(161,21,36,0),23 }, + { IPv4(161,21,38,0),23 }, + { IPv4(161,21,40,0),23 }, + { IPv4(161,21,42,0),23 }, + { IPv4(161,21,44,0),23 }, + { IPv4(161,21,46,0),23 }, + { IPv4(161,21,48,0),23 }, + { IPv4(161,21,50,0),23 }, + { IPv4(161,21,52,0),23 }, + { IPv4(161,21,54,0),23 }, + { IPv4(161,21,56,0),23 }, + { IPv4(161,21,58,0),23 }, + { IPv4(161,21,60,0),23 }, + { IPv4(161,21,62,0),23 }, + { IPv4(161,21,64,0),19 }, + { IPv4(161,21,64,0),23 }, + { IPv4(161,21,66,0),23 }, + { IPv4(161,21,68,0),23 }, + { IPv4(161,21,70,0),23 }, + { IPv4(161,21,72,0),23 }, + { IPv4(161,21,74,0),23 }, + { IPv4(161,21,76,0),23 }, + { IPv4(161,21,78,0),23 }, + { IPv4(161,21,80,0),23 }, + { IPv4(161,21,82,0),23 }, + { IPv4(161,21,84,0),23 }, + { IPv4(161,21,86,0),23 }, + { IPv4(161,21,88,0),23 }, + { IPv4(161,28,0,0),16 }, + { IPv4(161,33,0,0),16 }, + { IPv4(161,33,3,0),24 }, + { IPv4(161,38,0,0),16 }, + { IPv4(161,40,0,0),16 }, + { IPv4(161,44,0,0),16 }, + { IPv4(161,46,0,0),16 }, + { IPv4(161,51,224,0),20 }, + { IPv4(161,58,0,0),16 }, + { IPv4(161,65,0,0),16 }, + { IPv4(161,69,0,0),16 }, + { IPv4(161,69,211,0),24 }, + { IPv4(161,69,212,0),24 }, + { IPv4(161,69,213,0),24 }, + { IPv4(161,71,171,0),24 }, + { IPv4(161,81,0,0),16 }, + { IPv4(161,97,0,0),16 }, + { IPv4(161,98,0,0),16 }, + { IPv4(161,98,128,0),17 }, + { IPv4(161,114,180,0),24 }, + { IPv4(161,114,188,0),24 }, + { IPv4(161,114,189,0),24 }, + { IPv4(161,114,192,0),20 }, + { IPv4(161,119,0,0),16 }, + { IPv4(161,122,0,0),16 }, + { IPv4(161,124,0,0),16 }, + { IPv4(161,130,0,0),16 }, + { IPv4(161,132,232,0),21 }, + { IPv4(161,132,240,0),21 }, + { IPv4(161,134,0,0),16 }, + { IPv4(161,135,0,0),16 }, + { IPv4(161,136,0,0),16 }, + { IPv4(161,137,0,0),16 }, + { IPv4(161,139,0,0),16 }, + { IPv4(161,142,0,0),17 }, + { IPv4(161,142,0,0),16 }, + { IPv4(161,142,128,0),17 }, + { IPv4(161,149,0,0),16 }, + { IPv4(161,150,0,0),17 }, + { IPv4(161,150,128,0),18 }, + { IPv4(161,150,192,0),18 }, + { IPv4(161,155,0,0),16 }, + { IPv4(161,159,0,0),16 }, + { IPv4(161,160,0,0),16 }, + { IPv4(161,161,0,0),16 }, + { IPv4(161,165,0,0),16 }, + { IPv4(161,173,0,0),16 }, + { IPv4(161,173,11,0),24 }, + { IPv4(161,180,0,0),16 }, + { IPv4(161,181,246,0),24 }, + { IPv4(161,185,0,0),16 }, + { IPv4(161,186,0,0),16 }, + { IPv4(161,195,0,0),16 }, + { IPv4(161,207,0,0),16 }, + { IPv4(161,210,0,0),16 }, + { IPv4(161,213,0,0),16 }, + { IPv4(161,217,0,0),16 }, + { IPv4(161,222,0,0),16 }, + { IPv4(161,223,0,0),16 }, + { IPv4(161,223,0,0),21 }, + { IPv4(161,223,8,0),21 }, + { IPv4(161,223,16,0),20 }, + { IPv4(161,223,32,0),19 }, + { IPv4(161,223,64,0),18 }, + { IPv4(161,223,128,0),18 }, + { IPv4(161,223,192,0),20 }, + { IPv4(161,223,208,0),21 }, + { IPv4(161,223,216,0),22 }, + { IPv4(161,223,225,0),24 }, + { IPv4(161,223,226,0),23 }, + { IPv4(161,223,228,0),22 }, + { IPv4(161,223,232,0),21 }, + { IPv4(161,223,240,0),20 }, + { IPv4(161,224,0,0),16 }, + { IPv4(161,225,0,0),16 }, + { IPv4(161,229,0,0),16 }, + { IPv4(161,230,0,0),16 }, + { IPv4(161,232,0,0),16 }, + { IPv4(161,233,0,0),16 }, + { IPv4(161,242,0,0),16 }, + { IPv4(161,242,208,0),20 }, + { IPv4(161,243,0,0),16 }, + { IPv4(161,246,0,0),16 }, + { IPv4(161,253,0,0),16 }, + { IPv4(162,5,0,0),16 }, + { IPv4(162,5,128,0),17 }, + { IPv4(162,8,0,0),16 }, + { IPv4(162,8,230,0),24 }, + { IPv4(162,8,231,0),24 }, + { IPv4(162,8,232,0),24 }, + { IPv4(162,8,233,0),24 }, + { IPv4(162,10,0,0),16 }, + { IPv4(162,13,0,0),16 }, + { IPv4(162,13,32,0),20 }, + { IPv4(162,24,0,0),16 }, + { IPv4(162,27,0,0),16 }, + { IPv4(162,33,1,0),24 }, + { IPv4(162,33,96,0),21 }, + { IPv4(162,33,96,0),19 }, + { IPv4(162,33,104,0),21 }, + { IPv4(162,33,112,0),21 }, + { IPv4(162,33,120,0),21 }, + { IPv4(162,33,163,0),24 }, + { IPv4(162,36,0,0),16 }, + { IPv4(162,40,107,0),24 }, + { IPv4(162,48,0,0),16 }, + { IPv4(162,51,0,0),16 }, + { IPv4(162,57,0,0),16 }, + { IPv4(162,69,0,0),16 }, + { IPv4(162,88,0,0),16 }, + { IPv4(162,93,0,0),16 }, + { IPv4(162,93,64,0),19 }, + { IPv4(162,93,160,0),19 }, + { IPv4(162,93,192,0),19 }, + { IPv4(162,93,224,0),19 }, + { IPv4(162,94,0,0),16 }, + { IPv4(162,96,0,0),16 }, + { IPv4(162,116,0,0),16 }, + { IPv4(162,123,0,0),16 }, + { IPv4(162,126,205,0),24 }, + { IPv4(162,126,206,0),24 }, + { IPv4(162,126,207,0),24 }, + { IPv4(162,126,208,0),24 }, + { IPv4(162,129,0,0),16 }, + { IPv4(162,130,0,0),16 }, + { IPv4(162,136,0,0),16 }, + { IPv4(162,136,40,0),22 }, + { IPv4(163,2,0,0),16 }, + { IPv4(163,6,0,0),16 }, + { IPv4(163,7,0,0),16 }, + { IPv4(163,10,0,0),16 }, + { IPv4(163,12,0,0),16 }, + { IPv4(163,13,0,0),16 }, + { IPv4(163,14,0,0),15 }, + { IPv4(163,16,0,0),15 }, + { IPv4(163,17,32,0),22 }, + { IPv4(163,17,36,0),23 }, + { IPv4(163,17,40,0),21 }, + { IPv4(163,17,48,0),20 }, + { IPv4(163,17,88,0),21 }, + { IPv4(163,17,96,0),22 }, + { IPv4(163,17,108,0),22 }, + { IPv4(163,17,112,0),20 }, + { IPv4(163,17,128,0),23 }, + { IPv4(163,17,130,0),24 }, + { IPv4(163,17,146,0),23 }, + { IPv4(163,17,148,0),22 }, + { IPv4(163,17,152,0),23 }, + { IPv4(163,17,154,0),24 }, + { IPv4(163,17,156,0),22 }, + { IPv4(163,17,160,0),21 }, + { IPv4(163,17,169,0),24 }, + { IPv4(163,17,170,0),23 }, + { IPv4(163,17,172,0),22 }, + { IPv4(163,17,176,0),22 }, + { IPv4(163,17,180,0),23 }, + { IPv4(163,17,182,0),24 }, + { IPv4(163,17,184,0),21 }, + { IPv4(163,17,192,0),20 }, + { IPv4(163,17,208,0),20 }, + { IPv4(163,17,224,0),20 }, + { IPv4(163,17,240,0),24 }, + { IPv4(163,18,0,0),16 }, + { IPv4(163,19,0,0),16 }, + { IPv4(163,20,0,0),14 }, + { IPv4(163,24,0,0),14 }, + { IPv4(163,28,0,0),16 }, + { IPv4(163,28,8,0),21 }, + { IPv4(163,29,0,0),16 }, + { IPv4(163,30,0,0),16 }, + { IPv4(163,31,0,0),16 }, + { IPv4(163,42,0,0),16 }, + { IPv4(163,49,144,0),22 }, + { IPv4(163,126,0,0),16 }, + { IPv4(163,129,0,0),16 }, + { IPv4(163,139,0,0),16 }, + { IPv4(163,142,0,0),16 }, + { IPv4(163,149,0,0),16 }, + { IPv4(163,152,0,0),16 }, + { IPv4(163,152,151,0),24 }, + { IPv4(163,152,152,0),24 }, + { IPv4(163,152,153,0),24 }, + { IPv4(163,152,154,0),24 }, + { IPv4(163,152,161,0),24 }, + { IPv4(163,152,162,0),24 }, + { IPv4(163,152,163,0),24 }, + { IPv4(163,152,164,0),24 }, + { IPv4(163,152,171,0),24 }, + { IPv4(163,152,172,0),24 }, + { IPv4(163,152,173,0),24 }, + { IPv4(163,152,174,0),24 }, + { IPv4(163,153,0,0),16 }, + { IPv4(163,153,238,0),24 }, + { IPv4(163,156,0,0),16 }, + { IPv4(163,157,0,0),16 }, + { IPv4(163,164,0,0),16 }, + { IPv4(163,166,0,0),16 }, + { IPv4(163,175,0,0),16 }, + { IPv4(163,179,0,0),16 }, + { IPv4(163,179,38,0),24 }, + { IPv4(163,179,107,0),24 }, + { IPv4(163,179,161,0),24 }, + { IPv4(163,180,0,0),18 }, + { IPv4(163,180,0,0),17 }, + { IPv4(163,180,64,0),19 }, + { IPv4(163,180,96,0),19 }, + { IPv4(163,180,128,0),18 }, + { IPv4(163,180,128,0),19 }, + { IPv4(163,180,160,0),21 }, + { IPv4(163,180,168,0),23 }, + { IPv4(163,180,170,0),24 }, + { IPv4(163,191,0,0),16 }, + { IPv4(163,191,0,0),19 }, + { IPv4(163,191,96,0),19 }, + { IPv4(163,191,128,0),19 }, + { IPv4(163,191,192,0),19 }, + { IPv4(163,191,224,0),19 }, + { IPv4(163,196,0,0),16 }, + { IPv4(163,197,0,0),16 }, + { IPv4(163,198,0,0),15 }, + { IPv4(163,199,132,0),24 }, + { IPv4(163,200,0,0),16 }, + { IPv4(163,201,0,0),16 }, + { IPv4(163,202,0,0),15 }, + { IPv4(163,205,0,0),16 }, + { IPv4(163,206,0,0),16 }, + { IPv4(163,207,0,0),16 }, + { IPv4(163,215,0,0),16 }, + { IPv4(163,220,0,0),16 }, + { IPv4(163,221,0,0),16 }, + { IPv4(163,224,0,0),16 }, + { IPv4(163,228,0,0),16 }, + { IPv4(163,230,0,0),16 }, + { IPv4(163,231,0,0),16 }, + { IPv4(163,234,0,0),16 }, + { IPv4(163,238,0,0),16 }, + { IPv4(163,239,0,0),17 }, + { IPv4(163,239,128,0),18 }, + { IPv4(163,239,251,0),24 }, + { IPv4(163,244,0,0),16 }, + { IPv4(163,247,0,0),16 }, + { IPv4(163,247,40,0),24 }, + { IPv4(163,247,41,0),24 }, + { IPv4(163,247,42,0),24 }, + { IPv4(163,247,43,0),24 }, + { IPv4(163,247,44,0),24 }, + { IPv4(163,247,46,0),24 }, + { IPv4(163,247,47,0),24 }, + { IPv4(163,247,48,0),24 }, + { IPv4(163,247,49,0),24 }, + { IPv4(163,247,50,0),24 }, + { IPv4(163,247,51,0),24 }, + { IPv4(163,247,52,0),24 }, + { IPv4(163,247,53,0),24 }, + { IPv4(163,247,54,0),24 }, + { IPv4(163,247,55,0),24 }, + { IPv4(163,247,56,0),24 }, + { IPv4(163,247,57,0),24 }, + { IPv4(163,247,58,0),24 }, + { IPv4(163,247,59,0),24 }, + { IPv4(163,247,60,0),24 }, + { IPv4(163,247,61,0),24 }, + { IPv4(163,247,62,0),24 }, + { IPv4(163,247,63,0),24 }, + { IPv4(163,247,64,0),24 }, + { IPv4(163,247,65,0),24 }, + { IPv4(163,247,69,0),24 }, + { IPv4(163,247,70,0),24 }, + { IPv4(163,247,71,0),24 }, + { IPv4(163,247,72,0),24 }, + { IPv4(163,248,0,0),16 }, + { IPv4(163,249,0,0),16 }, + { IPv4(163,249,43,0),24 }, + { IPv4(163,249,53,0),24 }, + { IPv4(163,249,54,0),24 }, + { IPv4(163,249,57,0),24 }, + { IPv4(163,249,140,0),22 }, + { IPv4(163,249,160,0),21 }, + { IPv4(163,249,168,0),23 }, + { IPv4(163,249,170,0),24 }, + { IPv4(163,251,0,0),19 }, + { IPv4(163,251,32,0),22 }, + { IPv4(163,251,36,0),22 }, + { IPv4(163,251,40,0),22 }, + { IPv4(163,251,44,0),22 }, + { IPv4(163,251,48,0),22 }, + { IPv4(163,251,52,0),22 }, + { IPv4(163,251,64,0),19 }, + { IPv4(163,251,96,0),22 }, + { IPv4(163,251,224,0),19 }, + { IPv4(163,251,226,0),24 }, + { IPv4(163,251,228,0),24 }, + { IPv4(163,251,229,0),24 }, + { IPv4(163,251,240,0),21 }, + { IPv4(163,251,250,0),24 }, + { IPv4(163,251,251,0),24 }, + { IPv4(163,251,252,0),24 }, + { IPv4(163,251,254,0),24 }, + { IPv4(164,38,0,0),16 }, + { IPv4(164,39,185,0),24 }, + { IPv4(164,43,0,0),16 }, + { IPv4(164,47,0,0),16 }, + { IPv4(164,48,199,0),24 }, + { IPv4(164,49,0,0),16 }, + { IPv4(164,50,0,0),16 }, + { IPv4(164,54,0,0),16 }, + { IPv4(164,55,0,0),16 }, + { IPv4(164,57,0,0),16 }, + { IPv4(164,65,0,0),16 }, + { IPv4(164,66,0,0),16 }, + { IPv4(164,67,0,0),16 }, + { IPv4(164,68,0,0),16 }, + { IPv4(164,78,0,0),16 }, + { IPv4(164,79,0,0),16 }, + { IPv4(164,83,0,0),16 }, + { IPv4(164,87,0,0),16 }, + { IPv4(164,88,0,0),16 }, + { IPv4(164,92,0,0),16 }, + { IPv4(164,92,24,0),24 }, + { IPv4(164,92,144,0),24 }, + { IPv4(164,92,146,0),24 }, + { IPv4(164,92,155,0),24 }, + { IPv4(164,94,0,0),16 }, + { IPv4(164,99,0,0),16 }, + { IPv4(164,103,0,0),16 }, + { IPv4(164,104,0,0),16 }, + { IPv4(164,105,168,0),24 }, + { IPv4(164,113,0,0),19 }, + { IPv4(164,113,32,0),19 }, + { IPv4(164,113,240,0),21 }, + { IPv4(164,117,0,0),16 }, + { IPv4(164,121,0,0),16 }, + { IPv4(164,122,0,0),16 }, + { IPv4(164,124,0,0),16 }, + { IPv4(164,125,0,0),16 }, + { IPv4(164,140,0,0),16 }, + { IPv4(164,143,248,0),24 }, + { IPv4(164,143,249,0),24 }, + { IPv4(164,143,250,0),24 }, + { IPv4(164,143,251,0),24 }, + { IPv4(164,145,0,0),16 }, + { IPv4(164,155,0,0),16 }, + { IPv4(164,158,0,0),16 }, + { IPv4(164,164,0,0),16 }, + { IPv4(164,164,42,0),24 }, + { IPv4(164,164,45,0),24 }, + { IPv4(164,164,46,0),24 }, + { IPv4(164,164,48,0),24 }, + { IPv4(164,164,97,0),24 }, + { IPv4(164,167,0,0),16 }, + { IPv4(164,171,0,0),16 }, + { IPv4(164,178,0,0),16 }, + { IPv4(164,190,0,0),16 }, + { IPv4(164,191,0,0),16 }, + { IPv4(164,216,0,0),16 }, + { IPv4(164,218,0,0),16 }, + { IPv4(164,220,0,0),16 }, + { IPv4(164,221,0,0),18 }, + { IPv4(164,221,0,0),16 }, + { IPv4(164,221,64,0),19 }, + { IPv4(164,221,184,0),21 }, + { IPv4(164,221,192,0),21 }, + { IPv4(164,221,200,0),21 }, + { IPv4(164,221,208,0),20 }, + { IPv4(164,221,224,0),19 }, + { IPv4(164,223,0,0),16 }, + { IPv4(164,224,0,0),16 }, + { IPv4(164,226,0,0),16 }, + { IPv4(164,227,0,0),16 }, + { IPv4(164,230,0,0),15 }, + { IPv4(164,230,0,0),16 }, + { IPv4(164,231,72,0),24 }, + { IPv4(165,1,0,0),16 }, + { IPv4(165,4,0,0),16 }, + { IPv4(165,8,0,0),16 }, + { IPv4(165,10,0,0),16 }, + { IPv4(165,11,0,0),16 }, + { IPv4(165,21,0,0),16 }, + { IPv4(165,21,24,0),21 }, + { IPv4(165,21,112,0),21 }, + { IPv4(165,21,124,0),22 }, + { IPv4(165,21,128,0),22 }, + { IPv4(165,21,132,0),24 }, + { IPv4(165,21,134,0),24 }, + { IPv4(165,24,0,0),16 }, + { IPv4(165,25,0,0),16 }, + { IPv4(165,26,0,0),16 }, + { IPv4(165,28,0,0),16 }, + { IPv4(165,30,0,0),16 }, + { IPv4(165,64,0,0),16 }, + { IPv4(165,65,0,0),16 }, + { IPv4(165,72,32,0),19 }, + { IPv4(165,76,0,0),16 }, + { IPv4(165,83,0,0),16 }, + { IPv4(165,87,0,0),16 }, + { IPv4(165,87,15,0),24 }, + { IPv4(165,87,17,0),24 }, + { IPv4(165,87,44,0),23 }, + { IPv4(165,87,49,0),24 }, + { IPv4(165,87,56,0),24 }, + { IPv4(165,87,108,0),22 }, + { IPv4(165,87,112,0),21 }, + { IPv4(165,87,113,0),24 }, + { IPv4(165,87,114,0),24 }, + { IPv4(165,87,173,0),24 }, + { IPv4(165,87,177,0),24 }, + { IPv4(165,89,0,0),16 }, + { IPv4(165,97,0,0),16 }, + { IPv4(165,98,4,0),24 }, + { IPv4(165,98,8,0),24 }, + { IPv4(165,98,11,0),24 }, + { IPv4(165,98,12,0),24 }, + { IPv4(165,98,101,0),24 }, + { IPv4(165,98,102,0),24 }, + { IPv4(165,98,103,0),24 }, + { IPv4(165,98,104,0),22 }, + { IPv4(165,113,0,0),16 }, + { IPv4(165,113,127,0),24 }, + { IPv4(165,113,128,0),24 }, + { IPv4(165,113,129,0),24 }, + { IPv4(165,113,156,0),24 }, + { IPv4(165,113,161,0),24 }, + { IPv4(165,113,176,0),24 }, + { IPv4(165,113,187,0),24 }, + { IPv4(165,113,189,0),24 }, + { IPv4(165,113,190,0),24 }, + { IPv4(165,113,191,0),24 }, + { IPv4(165,113,193,0),24 }, + { IPv4(165,113,208,0),24 }, + { IPv4(165,113,239,0),24 }, + { IPv4(165,121,0,0),16 }, + { IPv4(165,121,96,0),20 }, + { IPv4(165,123,0,0),16 }, + { IPv4(165,124,0,0),16 }, + { IPv4(165,125,32,0),20 }, + { IPv4(165,127,0,0),16 }, + { IPv4(165,130,0,0),16 }, + { IPv4(165,132,0,0),16 }, + { IPv4(165,132,224,0),22 }, + { IPv4(165,132,228,0),22 }, + { IPv4(165,132,232,0),21 }, + { IPv4(165,132,240,0),22 }, + { IPv4(165,132,244,0),23 }, + { IPv4(165,132,246,0),23 }, + { IPv4(165,133,0,0),17 }, + { IPv4(165,133,40,0),24 }, + { IPv4(165,133,128,0),17 }, + { IPv4(165,137,0,0),16 }, + { IPv4(165,141,0,0),16 }, + { IPv4(165,141,0,0),22 }, + { IPv4(165,141,4,0),23 }, + { IPv4(165,141,6,0),24 }, + { IPv4(165,141,8,0),21 }, + { IPv4(165,141,16,0),20 }, + { IPv4(165,141,96,0),20 }, + { IPv4(165,141,112,0),20 }, + { IPv4(165,141,128,0),19 }, + { IPv4(165,141,160,0),20 }, + { IPv4(165,141,184,0),22 }, + { IPv4(165,141,200,0),22 }, + { IPv4(165,141,208,0),21 }, + { IPv4(165,141,216,0),22 }, + { IPv4(165,141,220,0),22 }, + { IPv4(165,141,222,0),23 }, + { IPv4(165,141,224,0),22 }, + { IPv4(165,141,228,0),23 }, + { IPv4(165,141,238,0),23 }, + { IPv4(165,141,240,0),23 }, + { IPv4(165,141,244,0),24 }, + { IPv4(165,141,249,0),24 }, + { IPv4(165,150,0,0),16 }, + { IPv4(165,152,0,0),16 }, + { IPv4(165,155,0,0),16 }, + { IPv4(165,166,0,0),16 }, + { IPv4(165,170,24,0),21 }, + { IPv4(165,170,64,0),24 }, + { IPv4(165,170,128,0),24 }, + { IPv4(165,170,176,0),20 }, + { IPv4(165,170,208,0),24 }, + { IPv4(165,173,0,0),16 }, + { IPv4(165,186,0,0),16 }, + { IPv4(165,190,122,0),23 }, + { IPv4(165,190,124,0),22 }, + { IPv4(165,190,128,0),21 }, + { IPv4(165,193,0,0),16 }, + { IPv4(165,194,0,0),16 }, + { IPv4(165,194,128,0),17 }, + { IPv4(165,196,0,0),16 }, + { IPv4(165,201,0,0),16 }, + { IPv4(165,206,0,0),16 }, + { IPv4(165,206,238,0),24 }, + { IPv4(165,212,0,0),18 }, + { IPv4(165,212,0,0),16 }, + { IPv4(165,212,63,0),24 }, + { IPv4(165,217,0,0),16 }, + { IPv4(165,225,194,0),24 }, + { IPv4(165,229,0,0),16 }, + { IPv4(165,230,0,0),16 }, + { IPv4(165,232,0,0),16 }, + { IPv4(165,233,0,0),16 }, + { IPv4(165,236,0,0),16 }, + { IPv4(165,238,0,0),16 }, + { IPv4(165,243,0,0),16 }, + { IPv4(165,244,0,0),16 }, + { IPv4(165,246,0,0),16 }, + { IPv4(165,247,0,0),16 }, + { IPv4(165,247,120,0),21 }, + { IPv4(165,247,196,0),22 }, + { IPv4(165,247,200,0),21 }, + { IPv4(165,247,208,0),20 }, + { IPv4(165,247,224,0),22 }, + { IPv4(165,247,248,0),21 }, + { IPv4(165,251,0,0),16 }, + { IPv4(165,251,24,0),22 }, + { IPv4(165,251,28,0),22 }, + { IPv4(165,251,32,0),22 }, + { IPv4(165,251,36,0),22 }, + { IPv4(165,251,252,0),22 }, + { IPv4(165,252,93,0),24 }, + { IPv4(165,254,0,0),16 }, + { IPv4(165,254,85,0),24 }, + { IPv4(166,16,0,0),16 }, + { IPv4(166,19,0,0),16 }, + { IPv4(166,20,0,0),16 }, + { IPv4(166,21,0,0),16 }, + { IPv4(166,30,0,0),16 }, + { IPv4(166,49,128,0),17 }, + { IPv4(166,49,128,0),23 }, + { IPv4(166,49,130,0),24 }, + { IPv4(166,49,131,0),24 }, + { IPv4(166,49,132,0),24 }, + { IPv4(166,49,133,0),24 }, + { IPv4(166,49,134,0),24 }, + { IPv4(166,49,137,0),24 }, + { IPv4(166,49,138,0),24 }, + { IPv4(166,49,139,0),24 }, + { IPv4(166,49,144,0),24 }, + { IPv4(166,49,149,0),24 }, + { IPv4(166,49,156,0),24 }, + { IPv4(166,49,172,0),22 }, + { IPv4(166,49,180,0),23 }, + { IPv4(166,49,182,0),23 }, + { IPv4(166,49,184,0),23 }, + { IPv4(166,49,186,0),23 }, + { IPv4(166,49,190,0),23 }, + { IPv4(166,49,192,0),22 }, + { IPv4(166,49,224,0),19 }, + { IPv4(166,70,0,0),16 }, + { IPv4(166,72,0,0),16 }, + { IPv4(166,72,88,0),24 }, + { IPv4(166,72,96,0),24 }, + { IPv4(166,72,121,0),24 }, + { IPv4(166,72,122,0),24 }, + { IPv4(166,72,126,0),24 }, + { IPv4(166,72,149,0),24 }, + { IPv4(166,72,151,0),24 }, + { IPv4(166,72,158,0),24 }, + { IPv4(166,72,159,0),24 }, + { IPv4(166,72,162,0),24 }, + { IPv4(166,72,169,0),24 }, + { IPv4(166,72,173,0),24 }, + { IPv4(166,72,181,0),24 }, + { IPv4(166,72,202,0),24 }, + { IPv4(166,72,203,0),24 }, + { IPv4(166,72,208,0),24 }, + { IPv4(166,72,214,0),24 }, + { IPv4(166,72,220,0),24 }, + { IPv4(166,72,233,0),24 }, + { IPv4(166,72,249,0),24 }, + { IPv4(166,73,0,0),16 }, + { IPv4(166,73,20,0),24 }, + { IPv4(166,77,0,0),16 }, + { IPv4(166,80,8,0),24 }, + { IPv4(166,80,9,0),24 }, + { IPv4(166,80,10,0),24 }, + { IPv4(166,80,16,0),24 }, + { IPv4(166,80,27,0),24 }, + { IPv4(166,80,28,0),23 }, + { IPv4(166,80,30,0),24 }, + { IPv4(166,80,46,0),24 }, + { IPv4(166,80,50,0),24 }, + { IPv4(166,80,54,0),24 }, + { IPv4(166,80,62,0),24 }, + { IPv4(166,80,74,0),24 }, + { IPv4(166,80,78,0),24 }, + { IPv4(166,80,79,0),24 }, + { IPv4(166,80,82,0),24 }, + { IPv4(166,80,83,0),24 }, + { IPv4(166,80,84,0),24 }, + { IPv4(166,80,90,0),24 }, + { IPv4(166,80,106,0),24 }, + { IPv4(166,80,114,0),24 }, + { IPv4(166,80,120,0),24 }, + { IPv4(166,80,126,0),24 }, + { IPv4(166,80,127,0),24 }, + { IPv4(166,80,242,0),24 }, + { IPv4(166,84,0,0),16 }, + { IPv4(166,84,56,0),21 }, + { IPv4(166,84,56,0),22 }, + { IPv4(166,84,60,0),22 }, + { IPv4(166,84,140,0),23 }, + { IPv4(166,84,143,0),24 }, + { IPv4(166,84,144,0),20 }, + { IPv4(166,84,150,0),24 }, + { IPv4(166,84,157,0),24 }, + { IPv4(166,84,168,0),22 }, + { IPv4(166,84,172,0),24 }, + { IPv4(166,84,174,0),24 }, + { IPv4(166,84,185,0),24 }, + { IPv4(166,84,191,0),24 }, + { IPv4(166,88,0,0),16 }, + { IPv4(166,88,88,0),24 }, + { IPv4(166,89,0,0),16 }, + { IPv4(166,90,14,0),24 }, + { IPv4(166,104,0,0),17 }, + { IPv4(166,104,128,0),19 }, + { IPv4(166,104,160,0),20 }, + { IPv4(166,104,176,0),21 }, + { IPv4(166,104,184,0),21 }, + { IPv4(166,104,192,0),18 }, + { IPv4(166,113,0,0),16 }, + { IPv4(166,114,128,0),19 }, + { IPv4(166,114,248,0),21 }, + { IPv4(166,119,0,0),16 }, + { IPv4(166,121,0,0),16 }, + { IPv4(166,124,0,0),16 }, + { IPv4(166,126,0,0),16 }, + { IPv4(166,127,0,0),16 }, + { IPv4(166,128,0,0),16 }, + { IPv4(166,128,0,0),13 }, + { IPv4(166,129,0,0),16 }, + { IPv4(166,130,0,0),16 }, + { IPv4(166,131,0,0),16 }, + { IPv4(166,132,0,0),16 }, + { IPv4(166,133,0,0),16 }, + { IPv4(166,134,0,0),16 }, + { IPv4(166,137,0,0),16 }, + { IPv4(166,147,64,0),18 }, + { IPv4(166,150,0,0),18 }, + { IPv4(166,150,128,0),18 }, + { IPv4(166,164,0,0),16 }, + { IPv4(166,177,0,0),16 }, + { IPv4(166,177,111,0),24 }, + { IPv4(166,183,0,0),16 }, + { IPv4(166,184,0,0),16 }, + { IPv4(166,185,0,0),16 }, + { IPv4(166,186,0,0),16 }, + { IPv4(166,187,0,0),16 }, + { IPv4(166,188,0,0),16 }, + { IPv4(166,189,0,0),16 }, + { IPv4(166,190,0,0),16 }, + { IPv4(166,191,0,0),16 }, + { IPv4(166,192,0,0),16 }, + { IPv4(166,193,0,0),16 }, + { IPv4(166,194,0,0),16 }, + { IPv4(166,195,0,0),16 }, + { IPv4(166,196,0,0),16 }, + { IPv4(166,197,0,0),16 }, + { IPv4(166,198,0,0),16 }, + { IPv4(166,199,0,0),16 }, + { IPv4(166,200,0,0),16 }, + { IPv4(166,201,0,0),16 }, + { IPv4(166,202,0,0),16 }, + { IPv4(166,203,0,0),16 }, + { IPv4(166,204,0,0),16 }, + { IPv4(166,213,0,0),16 }, + { IPv4(167,1,0,0),16 }, + { IPv4(167,1,100,0),24 }, + { IPv4(167,1,101,0),24 }, + { IPv4(167,1,102,0),24 }, + { IPv4(167,1,103,0),24 }, + { IPv4(167,1,104,0),24 }, + { IPv4(167,1,105,0),24 }, + { IPv4(167,1,106,0),24 }, + { IPv4(167,1,107,0),24 }, + { IPv4(167,1,108,0),24 }, + { IPv4(167,1,109,0),24 }, + { IPv4(167,1,110,0),24 }, + { IPv4(167,1,112,0),24 }, + { IPv4(167,1,113,0),24 }, + { IPv4(167,1,118,0),24 }, + { IPv4(167,1,120,0),24 }, + { IPv4(167,1,122,0),24 }, + { IPv4(167,1,123,0),24 }, + { IPv4(167,1,124,0),24 }, + { IPv4(167,1,125,0),24 }, + { IPv4(167,1,127,0),24 }, + { IPv4(167,1,128,0),24 }, + { IPv4(167,1,129,0),24 }, + { IPv4(167,1,130,0),24 }, + { IPv4(167,1,131,0),24 }, + { IPv4(167,1,132,0),24 }, + { IPv4(167,1,133,0),24 }, + { IPv4(167,1,134,0),24 }, + { IPv4(167,1,135,0),24 }, + { IPv4(167,1,136,0),24 }, + { IPv4(167,1,141,0),24 }, + { IPv4(167,6,0,0),16 }, + { IPv4(167,7,0,0),16 }, + { IPv4(167,14,48,0),21 }, + { IPv4(167,23,0,0),16 }, + { IPv4(167,24,0,0),16 }, + { IPv4(167,24,101,0),24 }, + { IPv4(167,24,102,0),24 }, + { IPv4(167,24,103,0),24 }, + { IPv4(167,24,104,0),24 }, + { IPv4(167,24,105,0),24 }, + { IPv4(167,24,241,0),24 }, + { IPv4(167,24,242,0),24 }, + { IPv4(167,24,243,0),24 }, + { IPv4(167,24,244,0),24 }, + { IPv4(167,24,245,0),24 }, + { IPv4(167,25,0,0),16 }, + { IPv4(167,28,0,0),16 }, + { IPv4(167,28,10,0),24 }, + { IPv4(167,28,11,0),24 }, + { IPv4(167,28,15,0),24 }, + { IPv4(167,28,27,0),24 }, + { IPv4(167,28,28,0),24 }, + { IPv4(167,28,29,0),24 }, + { IPv4(167,28,32,0),24 }, + { IPv4(167,28,33,0),24 }, + { IPv4(167,28,37,0),24 }, + { IPv4(167,28,39,0),24 }, + { IPv4(167,28,49,0),24 }, + { IPv4(167,28,51,0),24 }, + { IPv4(167,28,52,0),24 }, + { IPv4(167,28,54,0),24 }, + { IPv4(167,28,73,0),24 }, + { IPv4(167,28,74,0),24 }, + { IPv4(167,28,92,0),24 }, + { IPv4(167,28,141,0),24 }, + { IPv4(167,28,203,0),24 }, + { IPv4(167,33,0,0),16 }, + { IPv4(167,33,21,0),24 }, + { IPv4(167,33,61,0),24 }, + { IPv4(167,33,63,0),24 }, + { IPv4(167,64,0,0),16 }, + { IPv4(167,64,43,0),24 }, + { IPv4(167,64,48,0),24 }, + { IPv4(167,64,57,0),24 }, + { IPv4(167,64,85,0),24 }, + { IPv4(167,66,0,0),16 }, + { IPv4(167,68,0,0),16 }, + { IPv4(167,77,36,0),24 }, + { IPv4(167,79,0,0),16 }, + { IPv4(167,80,246,0),24 }, + { IPv4(167,82,0,0),16 }, + { IPv4(167,83,0,0),16 }, + { IPv4(167,83,96,0),24 }, + { IPv4(167,83,98,0),24 }, + { IPv4(167,83,101,0),24 }, + { IPv4(167,86,0,0),16 }, + { IPv4(167,86,20,0),24 }, + { IPv4(167,86,34,0),24 }, + { IPv4(167,86,48,0),24 }, + { IPv4(167,86,60,0),24 }, + { IPv4(167,86,76,0),24 }, + { IPv4(167,86,98,0),24 }, + { IPv4(167,86,100,0),24 }, + { IPv4(167,89,0,0),16 }, + { IPv4(167,94,0,0),16 }, + { IPv4(167,98,0,0),16 }, + { IPv4(167,107,0,0),16 }, + { IPv4(167,115,0,0),16 }, + { IPv4(167,115,0,0),17 }, + { IPv4(167,120,0,0),16 }, + { IPv4(167,121,0,0),16 }, + { IPv4(167,127,0,0),16 }, + { IPv4(167,127,160,0),21 }, + { IPv4(167,132,0,0),16 }, + { IPv4(167,136,0,0),16 }, + { IPv4(167,136,25,0),24 }, + { IPv4(167,136,35,0),24 }, + { IPv4(167,136,225,0),24 }, + { IPv4(167,136,235,0),24 }, + { IPv4(167,140,0,0),16 }, + { IPv4(167,142,0,0),16 }, + { IPv4(167,147,0,0),16 }, + { IPv4(167,150,0,0),16 }, + { IPv4(167,151,0,0),16 }, + { IPv4(167,153,0,0),16 }, + { IPv4(167,154,0,0),16 }, + { IPv4(167,157,0,0),16 }, + { IPv4(167,160,188,0),23 }, + { IPv4(167,160,212,0),24 }, + { IPv4(167,160,246,0),24 }, + { IPv4(167,160,247,0),24 }, + { IPv4(167,165,0,0),16 }, + { IPv4(167,166,0,0),16 }, + { IPv4(167,167,0,0),16 }, + { IPv4(167,177,0,0),16 }, + { IPv4(167,185,0,0),16 }, + { IPv4(167,186,249,0),24 }, + { IPv4(167,187,0,0),16 }, + { IPv4(167,192,0,0),13 }, + { IPv4(167,200,0,0),16 }, + { IPv4(167,211,0,0),16 }, + { IPv4(167,216,0,0),17 }, + { IPv4(167,216,0,0),16 }, + { IPv4(167,216,128,0),17 }, + { IPv4(167,230,42,0),24 }, + { IPv4(167,232,0,0),16 }, + { IPv4(167,234,0,0),16 }, + { IPv4(167,236,0,0),16 }, + { IPv4(167,239,0,0),16 }, + { IPv4(167,239,176,0),24 }, + { IPv4(167,239,192,0),20 }, + { IPv4(167,239,208,0),20 }, + { IPv4(167,242,0,0),16 }, + { IPv4(167,248,0,0),16 }, + { IPv4(167,252,0,0),16 }, + { IPv4(167,253,0,0),16 }, + { IPv4(168,16,0,0),15 }, + { IPv4(168,18,0,0),15 }, + { IPv4(168,20,0,0),15 }, + { IPv4(168,22,0,0),15 }, + { IPv4(168,24,0,0),15 }, + { IPv4(168,26,0,0),15 }, + { IPv4(168,28,0,0),15 }, + { IPv4(168,30,0,0),15 }, + { IPv4(168,32,0,0),12 }, + { IPv4(168,48,0,0),13 }, + { IPv4(168,56,0,0),14 }, + { IPv4(168,60,0,0),16 }, + { IPv4(168,69,0,0),16 }, + { IPv4(168,73,128,0),17 }, + { IPv4(168,75,0,0),24 }, + { IPv4(168,75,0,0),18 }, + { IPv4(168,75,0,0),16 }, + { IPv4(168,78,0,0),16 }, + { IPv4(168,80,0,0),15 }, + { IPv4(168,84,0,0),16 }, + { IPv4(168,88,224,0),24 }, + { IPv4(168,89,0,0),16 }, + { IPv4(168,95,0,0),16 }, + { IPv4(168,97,0,0),16 }, + { IPv4(168,97,0,0),17 }, + { IPv4(168,97,128,0),17 }, + { IPv4(168,100,0,0),16 }, + { IPv4(168,111,0,0),16 }, + { IPv4(168,115,0,0),16 }, + { IPv4(168,120,0,0),16 }, + { IPv4(168,126,0,0),16 }, + { IPv4(168,126,27,0),24 }, + { IPv4(168,126,60,0),24 }, + { IPv4(168,126,61,0),24 }, + { IPv4(168,126,120,0),24 }, + { IPv4(168,126,120,0),22 }, + { IPv4(168,126,121,0),24 }, + { IPv4(168,126,122,0),24 }, + { IPv4(168,126,123,0),24 }, + { IPv4(168,126,167,0),24 }, + { IPv4(168,126,212,0),24 }, + { IPv4(168,131,0,0),16 }, + { IPv4(168,135,0,0),16 }, + { IPv4(168,142,0,0),16 }, + { IPv4(168,143,0,0),16 }, + { IPv4(168,149,0,0),16 }, + { IPv4(168,151,0,0),16 }, + { IPv4(168,154,0,0),16 }, + { IPv4(168,158,0,0),16 }, + { IPv4(168,160,0,0),16 }, + { IPv4(168,164,0,0),16 }, + { IPv4(168,165,0,0),16 }, + { IPv4(168,166,0,0),16 }, + { IPv4(168,167,0,0),16 }, + { IPv4(168,168,0,0),16 }, + { IPv4(168,170,0,0),16 }, + { IPv4(168,171,0,0),16 }, + { IPv4(168,172,0,0),16 }, + { IPv4(168,173,0,0),16 }, + { IPv4(168,174,0,0),16 }, + { IPv4(168,177,0,0),16 }, + { IPv4(168,178,0,0),16 }, + { IPv4(168,179,0,0),16 }, + { IPv4(168,180,0,0),16 }, + { IPv4(168,183,0,0),16 }, + { IPv4(168,186,0,0),16 }, + { IPv4(168,188,0,0),16 }, + { IPv4(168,200,0,0),16 }, + { IPv4(168,200,2,0),24 }, + { IPv4(168,203,0,0),16 }, + { IPv4(168,205,0,0),16 }, + { IPv4(168,208,0,0),16 }, + { IPv4(168,209,0,0),16 }, + { IPv4(168,210,0,0),16 }, + { IPv4(168,210,1,0),24 }, + { IPv4(168,210,40,0),23 }, + { IPv4(168,210,50,0),24 }, + { IPv4(168,210,68,0),22 }, + { IPv4(168,210,100,0),24 }, + { IPv4(168,210,128,0),17 }, + { IPv4(168,215,81,0),24 }, + { IPv4(168,215,104,0),24 }, + { IPv4(168,215,106,0),23 }, + { IPv4(168,215,108,0),23 }, + { IPv4(168,215,113,0),24 }, + { IPv4(168,215,167,0),24 }, + { IPv4(168,215,224,0),20 }, + { IPv4(168,215,234,0),23 }, + { IPv4(168,215,236,0),23 }, + { IPv4(168,220,0,0),16 }, + { IPv4(168,224,1,0),24 }, + { IPv4(168,226,0,0),16 }, + { IPv4(168,230,0,0),16 }, + { IPv4(168,230,128,0),19 }, + { IPv4(168,231,0,0),16 }, + { IPv4(168,234,52,0),24 }, + { IPv4(168,234,53,0),24 }, + { IPv4(168,234,54,0),24 }, + { IPv4(168,234,55,0),24 }, + { IPv4(168,234,56,0),24 }, + { IPv4(168,234,57,0),24 }, + { IPv4(168,234,58,0),24 }, + { IPv4(168,234,59,0),24 }, + { IPv4(168,234,60,0),24 }, + { IPv4(168,234,61,0),24 }, + { IPv4(168,234,62,0),24 }, + { IPv4(168,234,92,0),24 }, + { IPv4(168,241,0,0),16 }, + { IPv4(168,243,80,0),24 }, + { IPv4(168,243,81,0),24 }, + { IPv4(168,243,176,0),21 }, + { IPv4(168,243,184,0),21 }, + { IPv4(168,243,224,0),20 }, + { IPv4(168,243,231,0),24 }, + { IPv4(168,244,0,0),16 }, + { IPv4(168,248,0,0),15 }, + { IPv4(169,4,0,0),14 }, + { IPv4(169,71,20,0),24 }, + { IPv4(169,71,80,0),24 }, + { IPv4(169,71,97,0),24 }, + { IPv4(169,100,0,0),19 }, + { IPv4(169,130,0,0),16 }, + { IPv4(169,131,0,0),16 }, + { IPv4(169,132,0,0),16 }, + { IPv4(169,133,0,0),16 }, + { IPv4(169,138,0,0),16 }, + { IPv4(169,140,0,0),18 }, + { IPv4(169,140,64,0),18 }, + { IPv4(169,140,128,0),18 }, + { IPv4(169,140,192,0),18 }, + { IPv4(169,142,0,0),16 }, + { IPv4(169,144,0,0),16 }, + { IPv4(169,146,0,0),16 }, + { IPv4(169,149,0,0),16 }, + { IPv4(169,150,0,0),16 }, + { IPv4(169,152,0,0),16 }, + { IPv4(169,153,128,0),24 }, + { IPv4(169,153,130,0),24 }, + { IPv4(169,153,134,0),24 }, + { IPv4(169,154,0,0),16 }, + { IPv4(169,155,0,0),16 }, + { IPv4(169,156,0,0),16 }, + { IPv4(169,157,0,0),16 }, + { IPv4(169,197,0,0),18 }, + { IPv4(169,205,0,0),16 }, + { IPv4(169,206,0,0),16 }, + { IPv4(169,226,0,0),16 }, + { IPv4(169,228,64,0),19 }, + { IPv4(169,228,112,0),20 }, + { IPv4(169,228,128,0),19 }, + { IPv4(169,228,160,0),20 }, + { IPv4(169,229,0,0),16 }, + { IPv4(169,232,0,0),16 }, + { IPv4(169,233,0,0),16 }, + { IPv4(169,237,0,0),16 }, + { IPv4(170,2,0,0),16 }, + { IPv4(170,3,0,0),16 }, + { IPv4(170,5,0,0),16 }, + { IPv4(170,9,64,0),18 }, + { IPv4(170,9,192,0),18 }, + { IPv4(170,11,0,0),16 }, + { IPv4(170,16,0,0),17 }, + { IPv4(170,16,0,0),16 }, + { IPv4(170,16,0,0),23 }, + { IPv4(170,16,8,0),22 }, + { IPv4(170,16,14,0),23 }, + { IPv4(170,16,128,0),17 }, + { IPv4(170,17,0,0),16 }, + { IPv4(170,20,0,0),18 }, + { IPv4(170,20,64,0),19 }, + { IPv4(170,20,144,0),20 }, + { IPv4(170,20,160,0),19 }, + { IPv4(170,20,192,0),18 }, + { IPv4(170,22,0,0),16 }, + { IPv4(170,24,0,0),16 }, + { IPv4(170,25,0,0),16 }, + { IPv4(170,27,132,0),22 }, + { IPv4(170,27,201,0),24 }, + { IPv4(170,28,128,0),20 }, + { IPv4(170,31,0,0),16 }, + { IPv4(170,32,0,0),16 }, + { IPv4(170,35,0,0),16 }, + { IPv4(170,35,224,0),22 }, + { IPv4(170,35,228,0),22 }, + { IPv4(170,35,240,0),22 }, + { IPv4(170,35,244,0),22 }, + { IPv4(170,35,248,0),22 }, + { IPv4(170,35,252,0),22 }, + { IPv4(170,37,237,0),24 }, + { IPv4(170,37,238,0),24 }, + { IPv4(170,37,239,0),24 }, + { IPv4(170,38,0,0),16 }, + { IPv4(170,39,0,0),16 }, + { IPv4(170,46,0,0),16 }, + { IPv4(170,51,255,0),24 }, + { IPv4(170,54,0,0),16 }, + { IPv4(170,54,59,0),24 }, + { IPv4(170,54,240,0),24 }, + { IPv4(170,54,241,0),24 }, + { IPv4(170,55,0,0),16 }, + { IPv4(170,65,122,0),24 }, + { IPv4(170,65,123,0),24 }, + { IPv4(170,65,124,0),24 }, + { IPv4(170,65,128,0),21 }, + { IPv4(170,68,0,0),16 }, + { IPv4(170,70,0,0),16 }, + { IPv4(170,72,0,0),16 }, + { IPv4(170,85,0,0),16 }, + { IPv4(170,91,128,0),18 }, + { IPv4(170,92,0,0),16 }, + { IPv4(170,107,0,0),16 }, + { IPv4(170,108,0,0),16 }, + { IPv4(170,119,0,0),16 }, + { IPv4(170,121,0,0),16 }, + { IPv4(170,128,0,0),16 }, + { IPv4(170,128,170,0),24 }, + { IPv4(170,128,175,0),24 }, + { IPv4(170,131,0,0),19 }, + { IPv4(170,135,0,0),16 }, + { IPv4(170,138,0,0),16 }, + { IPv4(170,138,64,0),21 }, + { IPv4(170,140,0,0),16 }, + { IPv4(170,147,0,0),16 }, + { IPv4(170,152,0,0),16 }, + { IPv4(170,153,0,0),16 }, + { IPv4(170,153,0,0),17 }, + { IPv4(170,153,138,0),23 }, + { IPv4(170,153,140,0),22 }, + { IPv4(170,153,144,0),20 }, + { IPv4(170,153,160,0),19 }, + { IPv4(170,153,192,0),18 }, + { IPv4(170,159,0,0),16 }, + { IPv4(170,160,0,0),16 }, + { IPv4(170,161,0,0),16 }, + { IPv4(170,163,0,0),16 }, + { IPv4(170,165,0,0),16 }, + { IPv4(170,167,0,0),16 }, + { IPv4(170,169,46,0),24 }, + { IPv4(170,169,122,0),24 }, + { IPv4(170,178,0,0),16 }, + { IPv4(170,201,0,0),16 }, + { IPv4(170,202,0,0),16 }, + { IPv4(170,202,1,0),24 }, + { IPv4(170,202,3,0),24 }, + { IPv4(170,202,224,0),19 }, + { IPv4(170,202,224,0),24 }, + { IPv4(170,202,224,0),20 }, + { IPv4(170,202,231,0),24 }, + { IPv4(170,202,232,0),24 }, + { IPv4(170,202,233,0),24 }, + { IPv4(170,202,234,0),24 }, + { IPv4(170,202,240,0),20 }, + { IPv4(170,202,241,0),24 }, + { IPv4(170,202,242,0),24 }, + { IPv4(170,202,243,0),24 }, + { IPv4(170,202,254,0),24 }, + { IPv4(170,206,0,0),16 }, + { IPv4(170,206,0,0),19 }, + { IPv4(170,206,32,0),19 }, + { IPv4(170,206,64,0),19 }, + { IPv4(170,206,96,0),19 }, + { IPv4(170,206,128,0),19 }, + { IPv4(170,206,160,0),19 }, + { IPv4(170,206,192,0),19 }, + { IPv4(170,206,224,0),23 }, + { IPv4(170,206,226,0),23 }, + { IPv4(170,209,0,0),16 }, + { IPv4(170,210,16,0),21 }, + { IPv4(170,215,0,0),16 }, + { IPv4(170,215,0,0),18 }, + { IPv4(170,215,15,0),24 }, + { IPv4(170,215,16,0),20 }, + { IPv4(170,215,96,0),19 }, + { IPv4(170,215,128,0),20 }, + { IPv4(170,215,134,0),24 }, + { IPv4(170,215,144,0),24 }, + { IPv4(170,215,145,0),24 }, + { IPv4(170,215,147,0),24 }, + { IPv4(170,215,159,0),24 }, + { IPv4(170,215,160,0),24 }, + { IPv4(170,215,161,0),24 }, + { IPv4(170,215,162,0),24 }, + { IPv4(170,215,163,0),24 }, + { IPv4(170,215,164,0),24 }, + { IPv4(170,215,171,0),24 }, + { IPv4(170,215,175,0),24 }, + { IPv4(170,215,177,0),24 }, + { IPv4(170,215,179,0),24 }, + { IPv4(170,215,184,0),24 }, + { IPv4(170,215,185,0),24 }, + { IPv4(170,215,186,0),24 }, + { IPv4(170,215,187,0),24 }, + { IPv4(170,215,188,0),24 }, + { IPv4(170,215,192,0),18 }, + { IPv4(170,224,0,0),16 }, + { IPv4(170,224,0,0),20 }, + { IPv4(170,224,16,0),20 }, + { IPv4(170,224,240,0),20 }, + { IPv4(170,235,0,0),16 }, + { IPv4(170,236,14,0),24 }, + { IPv4(170,248,95,0),24 }, + { IPv4(170,248,97,0),24 }, + { IPv4(170,250,0,0),16 }, + { IPv4(170,252,123,0),24 }, + { IPv4(170,252,127,0),24 }, + { IPv4(170,252,188,0),24 }, + { IPv4(170,252,191,0),24 }, + { IPv4(171,27,0,0),16 }, + { IPv4(171,30,128,0),17 }, + { IPv4(171,68,0,0),14 }, + { IPv4(171,72,0,0),16 }, + { IPv4(172,128,0,0),13 }, + { IPv4(172,136,0,0),13 }, + { IPv4(172,144,0,0),13 }, + { IPv4(172,152,0,0),13 }, + { IPv4(172,160,0,0),13 }, + { IPv4(172,168,0,0),13 }, + { IPv4(172,176,0,0),14 }, + { IPv4(172,176,0,0),13 }, + { IPv4(172,180,0,0),16 }, + { IPv4(172,180,0,0),14 }, + { IPv4(172,184,0,0),13 }, + { IPv4(172,187,128,0),17 }, + { IPv4(172,188,0,0),14 }, + { IPv4(192,0,32,0),20 }, + { IPv4(192,0,34,0),24 }, + { IPv4(192,0,36,0),24 }, + { IPv4(192,5,4,0),23 }, + { IPv4(192,5,6,0),24 }, + { IPv4(192,5,7,0),24 }, + { IPv4(192,5,14,0),24 }, + { IPv4(192,5,21,0),24 }, + { IPv4(192,5,22,0),24 }, + { IPv4(192,5,23,0),24 }, + { IPv4(192,5,24,0),24 }, + { IPv4(192,5,25,0),24 }, + { IPv4(192,5,27,0),24 }, + { IPv4(192,5,38,0),24 }, + { IPv4(192,5,41,0),24 }, + { IPv4(192,5,47,0),24 }, + { IPv4(192,5,53,0),24 }, + { IPv4(192,5,54,0),23 }, + { IPv4(192,5,55,0),24 }, + { IPv4(192,5,63,0),24 }, + { IPv4(192,5,73,0),24 }, + { IPv4(192,5,100,0),24 }, + { IPv4(192,5,106,0),24 }, + { IPv4(192,5,147,0),24 }, + { IPv4(192,5,148,0),24 }, + { IPv4(192,5,156,0),24 }, + { IPv4(192,5,157,0),24 }, + { IPv4(192,5,162,0),24 }, + { IPv4(192,5,166,0),24 }, + { IPv4(192,5,170,0),23 }, + { IPv4(192,5,172,0),22 }, + { IPv4(192,5,176,0),20 }, + { IPv4(192,5,192,0),21 }, + { IPv4(192,5,200,0),23 }, + { IPv4(192,5,220,0),24 }, + { IPv4(192,5,240,0),24 }, + { IPv4(192,6,2,0),24 }, + { IPv4(192,6,3,0),24 }, + { IPv4(192,6,6,0),24 }, + { IPv4(192,6,7,0),24 }, + { IPv4(192,6,19,0),24 }, + { IPv4(192,6,21,0),24 }, + { IPv4(192,6,23,0),24 }, + { IPv4(192,6,37,0),24 }, + { IPv4(192,6,38,0),24 }, + { IPv4(192,6,39,0),24 }, + { IPv4(192,6,41,0),24 }, + { IPv4(192,6,59,0),24 }, + { IPv4(192,6,71,0),24 }, + { IPv4(192,6,77,0),24 }, + { IPv4(192,6,86,0),24 }, + { IPv4(192,6,89,0),24 }, + { IPv4(192,6,118,0),24 }, + { IPv4(192,6,120,0),24 }, + { IPv4(192,6,121,0),24 }, + { IPv4(192,6,143,0),24 }, + { IPv4(192,6,151,0),24 }, + { IPv4(192,6,202,0),24 }, + { IPv4(192,6,223,0),24 }, + { IPv4(192,8,0,0),21 }, + { IPv4(192,11,236,0),24 }, + { IPv4(192,12,3,0),24 }, + { IPv4(192,12,5,0),24 }, + { IPv4(192,12,7,0),24 }, + { IPv4(192,12,10,0),24 }, + { IPv4(192,12,15,0),24 }, + { IPv4(192,12,29,0),24 }, + { IPv4(192,12,32,0),24 }, + { IPv4(192,12,33,0),24 }, + { IPv4(192,12,65,0),24 }, + { IPv4(192,12,66,0),24 }, + { IPv4(192,12,67,0),24 }, + { IPv4(192,12,68,0),24 }, + { IPv4(192,12,69,0),24 }, + { IPv4(192,12,73,0),24 }, + { IPv4(192,12,82,0),24 }, + { IPv4(192,12,88,0),24 }, + { IPv4(192,12,89,0),24 }, + { IPv4(192,12,90,0),24 }, + { IPv4(192,12,95,0),24 }, + { IPv4(192,12,100,0),24 }, + { IPv4(192,12,123,0),24 }, + { IPv4(192,12,124,0),24 }, + { IPv4(192,12,133,0),24 }, + { IPv4(192,12,134,0),24 }, + { IPv4(192,12,135,0),24 }, + { IPv4(192,12,207,0),24 }, + { IPv4(192,12,210,0),24 }, + { IPv4(192,12,211,0),24 }, + { IPv4(192,12,237,0),24 }, + { IPv4(192,12,240,0),24 }, + { IPv4(192,16,0,0),19 }, + { IPv4(192,16,13,0),24 }, + { IPv4(192,16,167,0),24 }, + { IPv4(192,16,168,0),24 }, + { IPv4(192,16,204,0),24 }, + { IPv4(192,17,0,0),16 }, + { IPv4(192,18,16,0),22 }, + { IPv4(192,19,192,0),22 }, + { IPv4(192,19,196,0),24 }, + { IPv4(192,19,197,0),24 }, + { IPv4(192,20,2,0),24 }, + { IPv4(192,20,3,0),24 }, + { IPv4(192,20,4,0),24 }, + { IPv4(192,20,8,0),24 }, + { IPv4(192,20,11,0),24 }, + { IPv4(192,20,16,0),24 }, + { IPv4(192,20,239,0),24 }, + { IPv4(192,20,245,0),24 }, + { IPv4(192,20,246,0),24 }, + { IPv4(192,20,250,0),24 }, + { IPv4(192,20,251,0),24 }, + { IPv4(192,20,252,0),24 }, + { IPv4(192,23,144,0),24 }, + { IPv4(192,23,168,0),24 }, + { IPv4(192,24,0,0),16 }, + { IPv4(192,25,42,0),24 }, + { IPv4(192,25,46,0),24 }, + { IPv4(192,25,48,0),24 }, + { IPv4(192,25,52,0),24 }, + { IPv4(192,25,91,0),24 }, + { IPv4(192,25,96,0),23 }, + { IPv4(192,25,106,0),24 }, + { IPv4(192,25,114,0),24 }, + { IPv4(192,25,133,0),24 }, + { IPv4(192,25,139,0),24 }, + { IPv4(192,25,140,0),23 }, + { IPv4(192,25,142,0),24 }, + { IPv4(192,25,151,0),24 }, + { IPv4(192,25,155,0),24 }, + { IPv4(192,25,191,0),24 }, + { IPv4(192,25,199,0),24 }, + { IPv4(192,25,204,0),24 }, + { IPv4(192,25,206,0),24 }, + { IPv4(192,25,214,0),24 }, + { IPv4(192,25,216,0),24 }, + { IPv4(192,25,218,0),24 }, + { IPv4(192,25,240,0),24 }, + { IPv4(192,26,10,0),24 }, + { IPv4(192,26,15,0),24 }, + { IPv4(192,26,85,0),24 }, + { IPv4(192,26,89,0),24 }, + { IPv4(192,26,91,0),24 }, + { IPv4(192,26,92,0),24 }, + { IPv4(192,26,147,0),24 }, + { IPv4(192,26,200,0),24 }, + { IPv4(192,26,212,0),24 }, + { IPv4(192,26,214,0),24 }, + { IPv4(192,26,244,0),23 }, + { IPv4(192,26,245,0),24 }, + { IPv4(192,26,251,0),24 }, + { IPv4(192,27,0,0),16 }, + { IPv4(192,27,56,0),24 }, + { IPv4(192,28,0,0),18 }, + { IPv4(192,28,64,0),19 }, + { IPv4(192,28,96,0),22 }, + { IPv4(192,28,254,0),24 }, + { IPv4(192,30,115,0),24 }, + { IPv4(192,31,3,0),24 }, + { IPv4(192,31,7,0),24 }, + { IPv4(192,31,16,0),24 }, + { IPv4(192,31,17,0),24 }, + { IPv4(192,31,18,0),24 }, + { IPv4(192,31,19,0),24 }, + { IPv4(192,31,20,0),24 }, + { IPv4(192,31,21,0),24 }, + { IPv4(192,31,31,0),24 }, + { IPv4(192,31,74,0),24 }, + { IPv4(192,31,80,0),24 }, + { IPv4(192,31,90,0),24 }, + { IPv4(192,31,96,0),24 }, + { IPv4(192,31,106,0),24 }, + { IPv4(192,31,112,0),24 }, + { IPv4(192,31,146,0),24 }, + { IPv4(192,31,153,0),24 }, + { IPv4(192,31,161,0),24 }, + { IPv4(192,31,174,0),24 }, + { IPv4(192,31,177,0),24 }, + { IPv4(192,31,178,0),24 }, + { IPv4(192,31,179,0),24 }, + { IPv4(192,31,238,0),23 }, + { IPv4(192,31,239,0),24 }, + { IPv4(192,31,246,0),24 }, + { IPv4(192,33,5,0),24 }, + { IPv4(192,33,6,0),23 }, + { IPv4(192,33,8,0),23 }, + { IPv4(192,33,10,0),24 }, + { IPv4(192,33,13,0),24 }, + { IPv4(192,33,14,0),24 }, + { IPv4(192,33,19,0),24 }, + { IPv4(192,33,140,0),23 }, + { IPv4(192,33,186,0),24 }, + { IPv4(192,33,240,0),24 }, + { IPv4(192,34,239,0),24 }, + { IPv4(192,35,20,0),24 }, + { IPv4(192,35,29,0),24 }, + { IPv4(192,35,44,0),24 }, + { IPv4(192,35,51,0),24 }, + { IPv4(192,35,75,0),24 }, + { IPv4(192,35,76,0),24 }, + { IPv4(192,35,82,0),24 }, + { IPv4(192,35,83,0),24 }, + { IPv4(192,35,84,0),24 }, + { IPv4(192,35,99,0),24 }, + { IPv4(192,35,105,0),24 }, + { IPv4(192,35,133,0),24 }, + { IPv4(192,35,142,0),24 }, + { IPv4(192,35,154,0),24 }, + { IPv4(192,35,156,0),24 }, + { IPv4(192,35,171,0),24 }, + { IPv4(192,35,174,0),24 }, + { IPv4(192,35,193,0),24 }, + { IPv4(192,35,208,0),24 }, + { IPv4(192,35,209,0),24 }, + { IPv4(192,35,210,0),24 }, + { IPv4(192,35,217,0),24 }, + { IPv4(192,35,218,0),24 }, + { IPv4(192,35,221,0),24 }, + { IPv4(192,35,222,0),24 }, + { IPv4(192,35,224,0),24 }, + { IPv4(192,35,225,0),24 }, + { IPv4(192,35,226,0),24 }, + { IPv4(192,35,227,0),24 }, + { IPv4(192,35,228,0),24 }, + { IPv4(192,36,95,0),24 }, + { IPv4(192,39,0,0),16 }, + { IPv4(192,39,122,0),24 }, + { IPv4(192,39,124,0),24 }, + { IPv4(192,40,16,0),22 }, + { IPv4(192,40,29,0),24 }, + { IPv4(192,40,65,0),24 }, + { IPv4(192,40,72,0),21 }, + { IPv4(192,40,80,0),24 }, + { IPv4(192,40,254,0),24 }, + { IPv4(192,41,0,0),18 }, + { IPv4(192,41,64,0),24 }, + { IPv4(192,41,70,0),24 }, + { IPv4(192,41,80,0),24 }, + { IPv4(192,41,162,0),24 }, + { IPv4(192,41,170,0),24 }, + { IPv4(192,41,197,0),24 }, + { IPv4(192,41,204,0),24 }, + { IPv4(192,41,206,0),24 }, + { IPv4(192,41,213,0),24 }, + { IPv4(192,41,214,0),24 }, + { IPv4(192,41,249,0),24 }, + { IPv4(192,42,41,0),24 }, + { IPv4(192,42,55,0),24 }, + { IPv4(192,42,70,0),24 }, + { IPv4(192,42,75,0),24 }, + { IPv4(192,42,76,0),24 }, + { IPv4(192,42,77,0),24 }, + { IPv4(192,42,78,0),24 }, + { IPv4(192,42,79,0),24 }, + { IPv4(192,42,80,0),23 }, + { IPv4(192,42,82,0),24 }, + { IPv4(192,42,93,0),24 }, + { IPv4(192,42,98,0),24 }, + { IPv4(192,42,99,0),24 }, + { IPv4(192,42,141,0),24 }, + { IPv4(192,42,142,0),24 }, + { IPv4(192,42,179,0),24 }, + { IPv4(192,42,181,0),24 }, + { IPv4(192,42,182,0),24 }, + { IPv4(192,42,238,0),24 }, + { IPv4(192,42,248,0),24 }, + { IPv4(192,43,64,0),18 }, + { IPv4(192,43,185,0),24 }, + { IPv4(192,43,197,0),24 }, + { IPv4(192,43,217,0),24 }, + { IPv4(192,43,219,0),24 }, + { IPv4(192,43,235,0),24 }, + { IPv4(192,43,240,0),24 }, + { IPv4(192,43,244,0),24 }, + { IPv4(192,43,253,0),24 }, + { IPv4(192,44,253,0),24 }, + { IPv4(192,45,155,0),24 }, + { IPv4(192,46,2,0),24 }, + { IPv4(192,46,4,0),24 }, + { IPv4(192,46,6,0),24 }, + { IPv4(192,46,47,0),24 }, + { IPv4(192,46,54,0),24 }, + { IPv4(192,46,108,0),24 }, + { IPv4(192,47,42,0),24 }, + { IPv4(192,47,44,0),24 }, + { IPv4(192,47,117,0),24 }, + { IPv4(192,47,241,0),24 }, + { IPv4(192,47,243,0),24 }, + { IPv4(192,48,33,0),24 }, + { IPv4(192,48,80,0),24 }, + { IPv4(192,48,97,0),24 }, + { IPv4(192,48,106,0),24 }, + { IPv4(192,48,125,0),24 }, + { IPv4(192,48,212,0),22 }, + { IPv4(192,48,222,0),24 }, + { IPv4(192,48,242,0),24 }, + { IPv4(192,48,245,0),24 }, + { IPv4(192,50,17,0),24 }, + { IPv4(192,50,65,0),24 }, + { IPv4(192,50,74,0),23 }, + { IPv4(192,50,76,0),23 }, + { IPv4(192,50,105,0),24 }, + { IPv4(192,50,110,0),24 }, + { IPv4(192,50,240,0),24 }, + { IPv4(192,51,41,0),24 }, + { IPv4(192,51,144,0),21 }, + { IPv4(192,51,180,0),22 }, + { IPv4(192,52,59,0),24 }, + { IPv4(192,52,83,0),24 }, + { IPv4(192,52,85,0),24 }, + { IPv4(192,52,86,0),24 }, + { IPv4(192,52,88,0),24 }, + { IPv4(192,52,89,0),24 }, + { IPv4(192,52,90,0),24 }, + { IPv4(192,52,91,0),24 }, + { IPv4(192,52,106,0),24 }, + { IPv4(192,52,117,0),24 }, + { IPv4(192,52,183,0),24 }, + { IPv4(192,52,184,0),24 }, + { IPv4(192,52,220,0),24 }, + { IPv4(192,53,35,0),24 }, + { IPv4(192,54,36,0),24 }, + { IPv4(192,54,43,0),24 }, + { IPv4(192,54,45,0),24 }, + { IPv4(192,54,129,0),24 }, + { IPv4(192,54,250,0),24 }, + { IPv4(192,54,253,0),24 }, + { IPv4(192,55,1,0),24 }, + { IPv4(192,55,87,0),24 }, + { IPv4(192,55,90,0),23 }, + { IPv4(192,55,95,0),24 }, + { IPv4(192,55,106,0),24 }, + { IPv4(192,55,120,0),24 }, + { IPv4(192,55,122,0),24 }, + { IPv4(192,55,123,0),24 }, + { IPv4(192,55,124,0),24 }, + { IPv4(192,55,133,0),24 }, + { IPv4(192,55,137,0),24 }, + { IPv4(192,55,138,0),23 }, + { IPv4(192,55,140,0),22 }, + { IPv4(192,55,144,0),20 }, + { IPv4(192,55,160,0),20 }, + { IPv4(192,55,176,0),21 }, + { IPv4(192,55,184,0),23 }, + { IPv4(192,55,186,0),24 }, + { IPv4(192,55,199,0),24 }, + { IPv4(192,55,208,0),24 }, + { IPv4(192,55,210,0),24 }, + { IPv4(192,55,214,0),24 }, + { IPv4(192,55,229,0),24 }, + { IPv4(192,55,240,0),24 }, + { IPv4(192,56,52,0),24 }, + { IPv4(192,56,191,0),24 }, + { IPv4(192,56,231,0),24 }, + { IPv4(192,58,19,0),24 }, + { IPv4(192,58,24,0),23 }, + { IPv4(192,58,36,0),24 }, + { IPv4(192,58,107,0),24 }, + { IPv4(192,58,159,0),24 }, + { IPv4(192,58,172,0),24 }, + { IPv4(192,58,181,0),24 }, + { IPv4(192,58,183,0),24 }, + { IPv4(192,58,184,0),21 }, + { IPv4(192,58,199,0),24 }, + { IPv4(192,58,212,0),24 }, + { IPv4(192,58,220,0),24 }, + { IPv4(192,58,221,0),24 }, + { IPv4(192,58,222,0),24 }, + { IPv4(192,58,223,0),24 }, + { IPv4(192,58,244,0),24 }, + { IPv4(192,63,0,0),16 }, + { IPv4(192,64,157,0),24 }, + { IPv4(192,65,97,0),24 }, + { IPv4(192,65,141,0),24 }, + { IPv4(192,65,144,0),24 }, + { IPv4(192,65,146,0),24 }, + { IPv4(192,65,153,0),24 }, + { IPv4(192,65,171,0),24 }, + { IPv4(192,65,176,0),24 }, + { IPv4(192,65,201,0),24 }, + { IPv4(192,65,202,0),24 }, + { IPv4(192,65,224,0),24 }, + { IPv4(192,65,226,0),24 }, + { IPv4(192,65,228,0),24 }, + { IPv4(192,67,13,0),24 }, + { IPv4(192,67,14,0),24 }, + { IPv4(192,67,21,0),24 }, + { IPv4(192,67,45,0),24 }, + { IPv4(192,67,48,0),24 }, + { IPv4(192,67,53,0),24 }, + { IPv4(192,67,80,0),24 }, + { IPv4(192,67,81,0),24 }, + { IPv4(192,67,82,0),24 }, + { IPv4(192,67,83,0),24 }, + { IPv4(192,67,93,0),24 }, + { IPv4(192,67,96,0),24 }, + { IPv4(192,67,107,0),24 }, + { IPv4(192,67,108,0),24 }, + { IPv4(192,67,109,0),24 }, + { IPv4(192,67,112,0),24 }, + { IPv4(192,67,113,0),24 }, + { IPv4(192,67,157,0),24 }, + { IPv4(192,67,166,0),24 }, + { IPv4(192,67,173,0),24 }, + { IPv4(192,67,209,0),24 }, + { IPv4(192,67,236,0),22 }, + { IPv4(192,67,240,0),21 }, + { IPv4(192,67,251,0),24 }, + { IPv4(192,68,22,0),24 }, + { IPv4(192,68,52,0),24 }, + { IPv4(192,68,108,0),24 }, + { IPv4(192,68,148,0),24 }, + { IPv4(192,68,162,0),24 }, + { IPv4(192,68,171,0),24 }, + { IPv4(192,68,172,0),24 }, + { IPv4(192,68,183,0),24 }, + { IPv4(192,68,189,0),24 }, + { IPv4(192,68,202,0),24 }, + { IPv4(192,68,227,0),24 }, + { IPv4(192,69,46,0),24 }, + { IPv4(192,69,66,0),24 }, + { IPv4(192,69,190,0),24 }, + { IPv4(192,70,125,0),24 }, + { IPv4(192,70,160,0),24 }, + { IPv4(192,70,162,0),24 }, + { IPv4(192,70,175,0),24 }, + { IPv4(192,70,186,0),24 }, + { IPv4(192,70,204,0),24 }, + { IPv4(192,70,211,0),24 }, + { IPv4(192,70,231,0),24 }, + { IPv4(192,70,236,0),24 }, + { IPv4(192,70,237,0),24 }, + { IPv4(192,70,239,0),24 }, + { IPv4(192,70,244,0),24 }, + { IPv4(192,70,245,0),24 }, + { IPv4(192,70,249,0),24 }, + { IPv4(192,71,115,0),24 }, + { IPv4(192,71,129,0),24 }, + { IPv4(192,71,130,0),24 }, + { IPv4(192,71,199,0),24 }, + { IPv4(192,71,213,0),24 }, + { IPv4(192,72,0,0),16 }, + { IPv4(192,72,80,0),23 }, + { IPv4(192,73,3,0),24 }, + { IPv4(192,73,7,0),24 }, + { IPv4(192,73,25,0),24 }, + { IPv4(192,73,26,0),23 }, + { IPv4(192,73,28,0),23 }, + { IPv4(192,73,57,0),24 }, + { IPv4(192,73,60,0),24 }, + { IPv4(192,73,62,0),24 }, + { IPv4(192,73,64,0),24 }, + { IPv4(192,73,207,0),24 }, + { IPv4(192,73,208,0),22 }, + { IPv4(192,73,212,0),24 }, + { IPv4(192,73,213,0),24 }, + { IPv4(192,73,216,0),24 }, + { IPv4(192,73,220,0),24 }, + { IPv4(192,73,228,0),24 }, + { IPv4(192,74,216,0),24 }, + { IPv4(192,75,17,0),24 }, + { IPv4(192,75,48,0),24 }, + { IPv4(192,75,49,0),24 }, + { IPv4(192,75,99,0),24 }, + { IPv4(192,75,104,0),24 }, + { IPv4(192,75,120,0),22 }, + { IPv4(192,75,131,0),24 }, + { IPv4(192,75,134,0),24 }, + { IPv4(192,75,137,0),24 }, + { IPv4(192,75,178,0),24 }, + { IPv4(192,75,238,0),24 }, + { IPv4(192,76,121,0),24 }, + { IPv4(192,76,133,0),24 }, + { IPv4(192,76,151,0),24 }, + { IPv4(192,76,175,0),24 }, + { IPv4(192,76,177,0),24 }, + { IPv4(192,76,178,0),24 }, + { IPv4(192,76,184,0),24 }, + { IPv4(192,76,237,0),24 }, + { IPv4(192,76,238,0),24 }, + { IPv4(192,76,239,0),24 }, + { IPv4(192,76,249,0),24 }, + { IPv4(192,77,9,0),24 }, + { IPv4(192,77,14,0),24 }, + { IPv4(192,77,27,0),24 }, + { IPv4(192,77,30,0),24 }, + { IPv4(192,77,31,0),24 }, + { IPv4(192,77,32,0),24 }, + { IPv4(192,77,33,0),24 }, + { IPv4(192,77,36,0),24 }, + { IPv4(192,77,40,0),24 }, + { IPv4(192,77,43,0),24 }, + { IPv4(192,77,44,0),24 }, + { IPv4(192,77,45,0),24 }, + { IPv4(192,77,77,0),24 }, + { IPv4(192,77,84,0),24 }, + { IPv4(192,77,86,0),24 }, + { IPv4(192,77,87,0),24 }, + { IPv4(192,77,88,0),24 }, + { IPv4(192,77,95,0),24 }, + { IPv4(192,77,147,0),24 }, + { IPv4(192,77,161,0),24 }, + { IPv4(192,77,173,0),24 }, + { IPv4(192,77,175,0),24 }, + { IPv4(192,77,198,0),24 }, + { IPv4(192,77,205,0),24 }, + { IPv4(192,77,209,0),24 }, + { IPv4(192,77,210,0),24 }, + { IPv4(192,78,99,0),24 }, + { IPv4(192,79,238,0),24 }, + { IPv4(192,80,12,0),22 }, + { IPv4(192,80,16,0),24 }, + { IPv4(192,80,17,0),24 }, + { IPv4(192,80,29,0),24 }, + { IPv4(192,80,30,0),24 }, + { IPv4(192,80,43,0),24 }, + { IPv4(192,80,64,0),24 }, + { IPv4(192,80,68,0),24 }, + { IPv4(192,80,211,0),24 }, + { IPv4(192,81,48,0),24 }, + { IPv4(192,81,67,0),24 }, + { IPv4(192,81,68,0),24 }, + { IPv4(192,81,69,0),24 }, + { IPv4(192,82,0,0),19 }, + { IPv4(192,82,104,0),24 }, + { IPv4(192,82,113,0),24 }, + { IPv4(192,82,115,0),24 }, + { IPv4(192,82,118,0),24 }, + { IPv4(192,82,122,0),24 }, + { IPv4(192,82,142,0),24 }, + { IPv4(192,83,111,0),24 }, + { IPv4(192,83,119,0),24 }, + { IPv4(192,83,159,0),24 }, + { IPv4(192,83,166,0),23 }, + { IPv4(192,83,168,0),21 }, + { IPv4(192,83,171,0),24 }, + { IPv4(192,83,176,0),24 }, + { IPv4(192,83,176,0),20 }, + { IPv4(192,83,180,0),24 }, + { IPv4(192,83,192,0),24 }, + { IPv4(192,83,192,0),22 }, + { IPv4(192,83,196,0),24 }, + { IPv4(192,83,203,0),24 }, + { IPv4(192,83,224,0),24 }, + { IPv4(192,83,228,0),24 }, + { IPv4(192,83,232,0),24 }, + { IPv4(192,83,242,0),24 }, + { IPv4(192,83,246,0),24 }, + { IPv4(192,83,249,0),24 }, + { IPv4(192,83,253,0),24 }, + { IPv4(192,84,8,0),24 }, + { IPv4(192,84,20,0),24 }, + { IPv4(192,84,22,0),24 }, + { IPv4(192,84,88,0),24 }, + { IPv4(192,84,119,0),24 }, + { IPv4(192,84,122,0),23 }, + { IPv4(192,84,171,0),24 }, + { IPv4(192,84,218,0),24 }, + { IPv4(192,84,221,0),24 }, + { IPv4(192,84,243,0),24 }, + { IPv4(192,84,252,0),24 }, + { IPv4(192,85,16,0),23 }, + { IPv4(192,85,241,0),24 }, + { IPv4(192,85,242,0),24 }, + { IPv4(192,86,6,0),24 }, + { IPv4(192,86,7,0),24 }, + { IPv4(192,86,8,0),24 }, + { IPv4(192,86,9,0),24 }, + { IPv4(192,86,19,0),24 }, + { IPv4(192,86,20,0),24 }, + { IPv4(192,86,21,0),24 }, + { IPv4(192,86,22,0),24 }, + { IPv4(192,86,66,0),24 }, + { IPv4(192,86,70,0),24 }, + { IPv4(192,86,71,0),24 }, + { IPv4(192,86,72,0),22 }, + { IPv4(192,86,77,0),24 }, + { IPv4(192,86,78,0),24 }, + { IPv4(192,86,80,0),24 }, + { IPv4(192,86,93,0),24 }, + { IPv4(192,86,96,0),24 }, + { IPv4(192,86,110,0),24 }, + { IPv4(192,86,112,0),21 }, + { IPv4(192,86,126,0),24 }, + { IPv4(192,86,139,0),24 }, + { IPv4(192,86,226,0),24 }, + { IPv4(192,86,228,0),24 }, + { IPv4(192,86,230,0),24 }, + { IPv4(192,86,232,0),21 }, + { IPv4(192,86,253,0),24 }, + { IPv4(192,87,176,0),24 }, + { IPv4(192,88,11,0),24 }, + { IPv4(192,88,26,0),24 }, + { IPv4(192,88,42,0),24 }, + { IPv4(192,88,87,0),24 }, + { IPv4(192,88,99,0),24 }, + { IPv4(192,88,110,0),24 }, + { IPv4(192,88,111,0),24 }, + { IPv4(192,88,112,0),24 }, + { IPv4(192,88,114,0),24 }, + { IPv4(192,88,115,0),24 }, + { IPv4(192,88,201,0),24 }, + { IPv4(192,88,205,0),24 }, + { IPv4(192,88,209,0),24 }, + { IPv4(192,88,210,0),24 }, + { IPv4(192,88,212,0),24 }, + { IPv4(192,88,248,0),24 }, + { IPv4(192,91,73,0),24 }, + { IPv4(192,91,75,0),24 }, + { IPv4(192,91,137,0),24 }, + { IPv4(192,91,138,0),24 }, + { IPv4(192,91,152,0),24 }, + { IPv4(192,91,154,0),24 }, + { IPv4(192,91,159,0),24 }, + { IPv4(192,91,171,0),24 }, + { IPv4(192,91,198,0),24 }, + { IPv4(192,91,201,0),24 }, + { IPv4(192,91,205,0),24 }, + { IPv4(192,92,22,0),24 }, + { IPv4(192,92,30,0),24 }, + { IPv4(192,92,56,0),24 }, + { IPv4(192,92,62,0),24 }, + { IPv4(192,92,63,0),24 }, + { IPv4(192,92,78,0),24 }, + { IPv4(192,92,83,0),24 }, + { IPv4(192,92,90,0),24 }, + { IPv4(192,92,92,0),24 }, + { IPv4(192,92,112,0),24 }, + { IPv4(192,92,115,0),24 }, + { IPv4(192,92,159,0),24 }, + { IPv4(192,92,167,0),24 }, + { IPv4(192,92,168,0),24 }, + { IPv4(192,92,199,0),24 }, + { IPv4(192,94,9,0),24 }, + { IPv4(192,94,38,0),23 }, + { IPv4(192,94,40,0),24 }, + { IPv4(192,94,41,0),24 }, + { IPv4(192,94,47,0),24 }, + { IPv4(192,94,52,0),24 }, + { IPv4(192,94,54,0),24 }, + { IPv4(192,94,59,0),24 }, + { IPv4(192,94,60,0),24 }, + { IPv4(192,94,61,0),24 }, + { IPv4(192,94,65,0),24 }, + { IPv4(192,94,67,0),24 }, + { IPv4(192,94,75,0),24 }, + { IPv4(192,94,94,0),24 }, + { IPv4(192,94,118,0),24 }, + { IPv4(192,94,202,0),24 }, + { IPv4(192,94,210,0),24 }, + { IPv4(192,94,233,0),24 }, + { IPv4(192,94,241,0),24 }, + { IPv4(192,94,242,0),24 }, + { IPv4(192,94,249,0),24 }, + { IPv4(192,96,1,0),24 }, + { IPv4(192,96,2,0),24 }, + { IPv4(192,96,3,0),24 }, + { IPv4(192,96,5,0),24 }, + { IPv4(192,96,6,0),23 }, + { IPv4(192,96,7,0),24 }, + { IPv4(192,96,8,0),23 }, + { IPv4(192,96,8,0),24 }, + { IPv4(192,96,10,0),24 }, + { IPv4(192,96,11,0),24 }, + { IPv4(192,96,12,0),24 }, + { IPv4(192,96,13,0),24 }, + { IPv4(192,96,14,0),24 }, + { IPv4(192,96,15,0),24 }, + { IPv4(192,96,20,0),23 }, + { IPv4(192,96,34,0),24 }, + { IPv4(192,96,36,0),23 }, + { IPv4(192,96,38,0),24 }, + { IPv4(192,96,46,0),24 }, + { IPv4(192,96,57,0),24 }, + { IPv4(192,96,74,0),24 }, + { IPv4(192,96,79,0),24 }, + { IPv4(192,96,80,0),22 }, + { IPv4(192,96,84,0),23 }, + { IPv4(192,96,89,0),24 }, + { IPv4(192,96,90,0),23 }, + { IPv4(192,96,92,0),24 }, + { IPv4(192,96,94,0),23 }, + { IPv4(192,96,106,0),24 }, + { IPv4(192,96,109,0),24 }, + { IPv4(192,96,120,0),21 }, + { IPv4(192,96,128,0),22 }, + { IPv4(192,96,133,0),24 }, + { IPv4(192,96,134,0),24 }, + { IPv4(192,96,135,0),24 }, + { IPv4(192,96,136,0),23 }, + { IPv4(192,96,139,0),24 }, + { IPv4(192,96,140,0),24 }, + { IPv4(192,96,142,0),24 }, + { IPv4(192,96,143,0),24 }, + { IPv4(192,96,145,0),24 }, + { IPv4(192,96,150,0),24 }, + { IPv4(192,96,193,0),24 }, + { IPv4(192,96,194,0),24 }, + { IPv4(192,96,246,0),24 }, + { IPv4(192,96,247,0),24 }, + { IPv4(192,96,248,0),23 }, + { IPv4(192,96,251,0),24 }, + { IPv4(192,96,252,0),24 }, + { IPv4(192,97,38,0),24 }, + { IPv4(192,100,1,0),24 }, + { IPv4(192,100,2,0),24 }, + { IPv4(192,100,4,0),24 }, + { IPv4(192,100,5,0),24 }, + { IPv4(192,100,9,0),24 }, + { IPv4(192,100,12,0),24 }, + { IPv4(192,100,16,0),24 }, + { IPv4(192,100,53,0),24 }, + { IPv4(192,100,55,0),24 }, + { IPv4(192,100,59,0),24 }, + { IPv4(192,100,65,0),24 }, + { IPv4(192,100,69,0),24 }, + { IPv4(192,100,70,0),24 }, + { IPv4(192,100,91,0),24 }, + { IPv4(192,100,92,0),24 }, + { IPv4(192,100,158,0),24 }, + { IPv4(192,100,161,0),24 }, + { IPv4(192,100,162,0),24 }, + { IPv4(192,100,163,0),24 }, + { IPv4(192,100,164,0),24 }, + { IPv4(192,100,165,0),24 }, + { IPv4(192,100,170,0),24 }, + { IPv4(192,100,172,0),24 }, + { IPv4(192,100,174,0),24 }, + { IPv4(192,100,176,0),24 }, + { IPv4(192,100,179,0),24 }, + { IPv4(192,100,180,0),24 }, + { IPv4(192,100,181,0),24 }, + { IPv4(192,100,183,0),24 }, + { IPv4(192,100,189,0),24 }, + { IPv4(192,100,190,0),24 }, + { IPv4(192,100,193,0),24 }, + { IPv4(192,100,194,0),24 }, + { IPv4(192,100,195,0),24 }, + { IPv4(192,100,196,0),24 }, + { IPv4(192,100,199,0),24 }, + { IPv4(192,100,200,0),24 }, + { IPv4(192,100,201,0),24 }, + { IPv4(192,100,204,0),24 }, + { IPv4(192,100,208,0),24 }, + { IPv4(192,100,212,0),24 }, + { IPv4(192,100,213,0),24 }, + { IPv4(192,100,218,0),24 }, + { IPv4(192,100,220,0),24 }, + { IPv4(192,100,221,0),24 }, + { IPv4(192,100,230,0),24 }, + { IPv4(192,100,234,0),24 }, + { IPv4(192,101,17,0),24 }, + { IPv4(192,101,31,0),24 }, + { IPv4(192,101,34,0),24 }, + { IPv4(192,101,42,0),24 }, + { IPv4(192,101,44,0),24 }, + { IPv4(192,101,77,0),24 }, + { IPv4(192,101,98,0),24 }, + { IPv4(192,101,100,0),22 }, + { IPv4(192,101,104,0),22 }, + { IPv4(192,101,108,0),23 }, + { IPv4(192,101,120,0),21 }, + { IPv4(192,101,128,0),22 }, + { IPv4(192,101,132,0),23 }, + { IPv4(192,101,135,0),24 }, + { IPv4(192,101,136,0),24 }, + { IPv4(192,101,138,0),24 }, + { IPv4(192,101,141,0),24 }, + { IPv4(192,101,144,0),24 }, + { IPv4(192,101,148,0),24 }, + { IPv4(192,101,150,0),23 }, + { IPv4(192,101,190,0),24 }, + { IPv4(192,101,191,0),24 }, + { IPv4(192,102,9,0),24 }, + { IPv4(192,102,10,0),24 }, + { IPv4(192,102,12,0),24 }, + { IPv4(192,102,15,0),24 }, + { IPv4(192,102,44,0),24 }, + { IPv4(192,102,90,0),24 }, + { IPv4(192,102,190,0),23 }, + { IPv4(192,102,196,0),24 }, + { IPv4(192,102,197,0),24 }, + { IPv4(192,102,198,0),24 }, + { IPv4(192,102,199,0),24 }, + { IPv4(192,102,200,0),24 }, + { IPv4(192,102,201,0),24 }, + { IPv4(192,102,202,0),24 }, + { IPv4(192,102,216,0),24 }, + { IPv4(192,102,219,0),24 }, + { IPv4(192,102,226,0),24 }, + { IPv4(192,102,230,0),24 }, + { IPv4(192,102,231,0),24 }, + { IPv4(192,102,233,0),24 }, + { IPv4(192,102,234,0),24 }, + { IPv4(192,102,236,0),24 }, + { IPv4(192,102,243,0),24 }, + { IPv4(192,102,244,0),22 }, + { IPv4(192,102,249,0),24 }, + { IPv4(192,102,253,0),24 }, + { IPv4(192,103,8,0),24 }, + { IPv4(192,103,11,0),24 }, + { IPv4(192,103,13,0),24 }, + { IPv4(192,103,41,0),24 }, + { IPv4(192,103,148,0),23 }, + { IPv4(192,103,149,0),24 }, + { IPv4(192,103,151,0),24 }, + { IPv4(192,103,152,0),24 }, + { IPv4(192,103,154,0),24 }, + { IPv4(192,103,155,0),24 }, + { IPv4(192,103,156,0),22 }, + { IPv4(192,103,158,0),23 }, + { IPv4(192,103,160,0),23 }, + { IPv4(192,103,161,0),24 }, + { IPv4(192,103,162,0),24 }, + { IPv4(192,103,175,0),24 }, + { IPv4(192,103,176,0),24 }, + { IPv4(192,103,179,0),24 }, + { IPv4(192,103,180,0),22 }, + { IPv4(192,103,182,0),23 }, + { IPv4(192,103,184,0),22 }, + { IPv4(192,103,186,0),23 }, + { IPv4(192,103,188,0),24 }, + { IPv4(192,103,190,0),23 }, + { IPv4(192,103,191,0),24 }, + { IPv4(192,103,192,0),24 }, + { IPv4(192,103,194,0),23 }, + { IPv4(192,103,196,0),22 }, + { IPv4(192,103,198,0),23 }, + { IPv4(192,103,200,0),22 }, + { IPv4(192,103,202,0),23 }, + { IPv4(192,103,204,0),22 }, + { IPv4(192,103,208,0),23 }, + { IPv4(192,103,210,0),24 }, + { IPv4(192,103,229,0),24 }, + { IPv4(192,103,230,0),23 }, + { IPv4(192,103,232,0),22 }, + { IPv4(192,103,236,0),23 }, + { IPv4(192,103,237,0),24 }, + { IPv4(192,104,1,0),24 }, + { IPv4(192,104,15,0),24 }, + { IPv4(192,104,26,0),24 }, + { IPv4(192,104,65,0),24 }, + { IPv4(192,104,79,0),24 }, + { IPv4(192,104,107,0),24 }, + { IPv4(192,104,108,0),24 }, + { IPv4(192,104,109,0),24 }, + { IPv4(192,104,110,0),24 }, + { IPv4(192,104,153,0),24 }, + { IPv4(192,104,156,0),24 }, + { IPv4(192,104,166,0),24 }, + { IPv4(192,104,171,0),24 }, + { IPv4(192,104,179,0),24 }, + { IPv4(192,104,182,0),23 }, + { IPv4(192,104,186,0),24 }, + { IPv4(192,104,187,0),24 }, + { IPv4(192,104,191,0),24 }, + { IPv4(192,104,214,0),24 }, + { IPv4(192,104,244,0),24 }, + { IPv4(192,105,49,0),24 }, + { IPv4(192,105,254,0),24 }, + { IPv4(192,106,192,0),24 }, + { IPv4(192,107,3,0),24 }, + { IPv4(192,107,28,0),24 }, + { IPv4(192,107,41,0),24 }, + { IPv4(192,107,43,0),24 }, + { IPv4(192,107,44,0),24 }, + { IPv4(192,107,45,0),24 }, + { IPv4(192,107,46,0),24 }, + { IPv4(192,107,103,0),24 }, + { IPv4(192,107,108,0),24 }, + { IPv4(192,107,111,0),24 }, + { IPv4(192,107,123,0),24 }, + { IPv4(192,107,134,0),24 }, + { IPv4(192,107,165,0),24 }, + { IPv4(192,107,166,0),24 }, + { IPv4(192,107,167,0),24 }, + { IPv4(192,107,173,0),24 }, + { IPv4(192,107,175,0),24 }, + { IPv4(192,107,189,0),24 }, + { IPv4(192,107,190,0),24 }, + { IPv4(192,107,191,0),24 }, + { IPv4(192,107,193,0),24 }, + { IPv4(192,107,195,0),24 }, + { IPv4(192,107,196,0),24 }, + { IPv4(192,108,2,0),23 }, + { IPv4(192,108,4,0),22 }, + { IPv4(192,108,8,0),21 }, + { IPv4(192,108,19,0),24 }, + { IPv4(192,108,20,0),24 }, + { IPv4(192,108,21,0),24 }, + { IPv4(192,108,98,0),24 }, + { IPv4(192,108,104,0),24 }, + { IPv4(192,108,105,0),24 }, + { IPv4(192,108,106,0),24 }, + { IPv4(192,108,124,0),24 }, + { IPv4(192,108,176,0),21 }, + { IPv4(192,108,179,0),24 }, + { IPv4(192,108,184,0),24 }, + { IPv4(192,108,186,0),24 }, + { IPv4(192,108,192,0),24 }, + { IPv4(192,108,222,0),23 }, + { IPv4(192,108,225,0),24 }, + { IPv4(192,108,235,0),24 }, + { IPv4(192,108,243,0),24 }, + { IPv4(192,109,81,0),24 }, + { IPv4(192,109,142,0),24 }, + { IPv4(192,109,199,0),24 }, + { IPv4(192,109,213,0),24 }, + { IPv4(192,109,216,0),24 }, + { IPv4(192,110,64,0),20 }, + { IPv4(192,111,36,0),24 }, + { IPv4(192,111,47,0),24 }, + { IPv4(192,111,52,0),24 }, + { IPv4(192,111,53,0),24 }, + { IPv4(192,111,89,0),24 }, + { IPv4(192,111,104,0),24 }, + { IPv4(192,111,110,0),24 }, + { IPv4(192,111,116,0),23 }, + { IPv4(192,111,116,0),24 }, + { IPv4(192,111,121,0),24 }, + { IPv4(192,111,213,0),24 }, + { IPv4(192,111,219,0),24 }, + { IPv4(192,111,221,0),24 }, + { IPv4(192,111,225,0),24 }, + { IPv4(192,111,226,0),24 }, + { IPv4(192,111,227,0),24 }, + { IPv4(192,112,3,0),24 }, + { IPv4(192,112,4,0),24 }, + { IPv4(192,112,6,0),24 }, + { IPv4(192,112,10,0),24 }, + { IPv4(192,112,12,0),24 }, + { IPv4(192,112,15,0),24 }, + { IPv4(192,112,22,0),24 }, + { IPv4(192,112,36,0),24 }, + { IPv4(192,112,38,0),24 }, + { IPv4(192,112,39,0),24 }, + { IPv4(192,112,40,0),22 }, + { IPv4(192,112,49,0),24 }, + { IPv4(192,112,50,0),24 }, + { IPv4(192,112,63,0),24 }, + { IPv4(192,112,68,0),24 }, + { IPv4(192,112,84,0),24 }, + { IPv4(192,112,138,0),24 }, + { IPv4(192,112,139,0),24 }, + { IPv4(192,112,223,0),24 }, + { IPv4(192,112,224,0),24 }, + { IPv4(192,112,225,0),24 }, + { IPv4(192,112,230,0),24 }, + { IPv4(192,112,238,0),24 }, + { IPv4(192,112,239,0),24 }, + { IPv4(192,114,10,0),24 }, + { IPv4(192,114,40,0),21 }, + { IPv4(192,114,80,0),22 }, + { IPv4(192,115,4,0),22 }, + { IPv4(192,115,16,0),20 }, + { IPv4(192,115,56,0),21 }, + { IPv4(192,115,72,0),21 }, + { IPv4(192,115,128,0),21 }, + { IPv4(192,115,176,0),22 }, + { IPv4(192,115,216,0),21 }, + { IPv4(192,115,224,0),20 }, + { IPv4(192,116,64,0),18 }, + { IPv4(192,116,128,0),18 }, + { IPv4(192,117,0,0),18 }, + { IPv4(192,117,96,0),19 }, + { IPv4(192,118,20,0),22 }, + { IPv4(192,118,28,0),22 }, + { IPv4(192,118,48,0),22 }, + { IPv4(192,118,64,0),22 }, + { IPv4(192,118,128,0),22 }, + { IPv4(192,119,135,0),24 }, + { IPv4(192,120,9,0),24 }, + { IPv4(192,120,10,0),23 }, + { IPv4(192,120,12,0),22 }, + { IPv4(192,120,55,0),24 }, + { IPv4(192,120,89,0),24 }, + { IPv4(192,120,90,0),24 }, + { IPv4(192,120,91,0),24 }, + { IPv4(192,120,107,0),24 }, + { IPv4(192,120,193,0),24 }, + { IPv4(192,121,165,0),24 }, + { IPv4(192,122,171,0),24 }, + { IPv4(192,122,173,0),24 }, + { IPv4(192,122,174,0),24 }, + { IPv4(192,122,181,0),24 }, + { IPv4(192,122,212,0),24 }, + { IPv4(192,122,213,0),24 }, + { IPv4(192,122,237,0),24 }, + { IPv4(192,122,244,0),24 }, + { IPv4(192,122,250,0),24 }, + { IPv4(192,124,20,0),24 }, + { IPv4(192,124,42,0),24 }, + { IPv4(192,124,118,0),24 }, + { IPv4(192,124,153,0),24 }, + { IPv4(192,124,154,0),24 }, + { IPv4(192,124,157,0),24 }, + { IPv4(192,124,159,0),24 }, + { IPv4(192,128,3,0),24 }, + { IPv4(192,128,52,0),24 }, + { IPv4(192,128,125,0),24 }, + { IPv4(192,128,126,0),24 }, + { IPv4(192,128,133,0),24 }, + { IPv4(192,128,134,0),24 }, + { IPv4(192,128,166,0),24 }, + { IPv4(192,128,167,0),24 }, + { IPv4(192,128,252,0),24 }, + { IPv4(192,128,254,0),24 }, + { IPv4(192,129,50,0),24 }, + { IPv4(192,129,53,0),24 }, + { IPv4(192,129,55,0),24 }, + { IPv4(192,129,64,0),24 }, + { IPv4(192,129,64,0),22 }, + { IPv4(192,129,68,0),23 }, + { IPv4(192,129,85,0),24 }, + { IPv4(192,131,86,0),24 }, + { IPv4(192,131,99,0),24 }, + { IPv4(192,131,102,0),24 }, + { IPv4(192,131,121,0),24 }, + { IPv4(192,131,129,0),24 }, + { IPv4(192,131,143,0),24 }, + { IPv4(192,131,145,0),24 }, + { IPv4(192,131,155,0),24 }, + { IPv4(192,131,181,0),24 }, + { IPv4(192,131,225,0),24 }, + { IPv4(192,131,226,0),24 }, + { IPv4(192,132,16,0),22 }, + { IPv4(192,132,39,0),24 }, + { IPv4(192,132,51,0),24 }, + { IPv4(192,132,84,0),23 }, + { IPv4(192,132,100,0),24 }, + { IPv4(192,132,206,0),24 }, + { IPv4(192,132,217,0),24 }, + { IPv4(192,132,218,0),24 }, + { IPv4(192,132,222,0),24 }, + { IPv4(192,132,223,0),24 }, + { IPv4(192,132,225,0),24 }, + { IPv4(192,132,228,0),24 }, + { IPv4(192,132,245,0),24 }, + { IPv4(192,132,247,0),24 }, + { IPv4(192,133,2,0),24 }, + { IPv4(192,133,34,0),24 }, + { IPv4(192,133,43,0),24 }, + { IPv4(192,133,51,0),24 }, + { IPv4(192,133,60,0),24 }, + { IPv4(192,133,63,0),24 }, + { IPv4(192,133,84,0),24 }, + { IPv4(192,133,100,0),24 }, + { IPv4(192,133,104,0),24 }, + { IPv4(192,133,105,0),24 }, + { IPv4(192,133,124,0),24 }, + { IPv4(192,133,144,0),20 }, + { IPv4(192,133,160,0),19 }, + { IPv4(192,133,191,0),24 }, + { IPv4(192,133,192,0),19 }, + { IPv4(192,133,224,0),20 }, + { IPv4(192,133,240,0),22 }, + { IPv4(192,133,254,0),24 }, + { IPv4(192,135,43,0),24 }, + { IPv4(192,135,50,0),24 }, + { IPv4(192,135,76,0),24 }, + { IPv4(192,135,80,0),24 }, + { IPv4(192,135,112,0),24 }, + { IPv4(192,135,113,0),24 }, + { IPv4(192,135,114,0),24 }, + { IPv4(192,135,115,0),24 }, + { IPv4(192,135,116,0),24 }, + { IPv4(192,135,118,0),24 }, + { IPv4(192,135,119,0),24 }, + { IPv4(192,135,120,0),24 }, + { IPv4(192,135,121,0),24 }, + { IPv4(192,135,122,0),24 }, + { IPv4(192,135,144,0),24 }, + { IPv4(192,135,174,0),24 }, + { IPv4(192,135,176,0),24 }, + { IPv4(192,135,181,0),24 }, + { IPv4(192,135,183,0),24 }, + { IPv4(192,135,184,0),24 }, + { IPv4(192,135,188,0),24 }, + { IPv4(192,135,189,0),24 }, + { IPv4(192,135,193,0),24 }, + { IPv4(192,135,227,0),24 }, + { IPv4(192,135,237,0),24 }, + { IPv4(192,135,238,0),24 }, + { IPv4(192,135,239,0),24 }, + { IPv4(192,135,240,0),21 }, + { IPv4(192,135,248,0),23 }, + { IPv4(192,135,250,0),24 }, + { IPv4(192,136,8,0),24 }, + { IPv4(192,136,16,0),24 }, + { IPv4(192,136,22,0),24 }, + { IPv4(192,136,32,0),23 }, + { IPv4(192,136,50,0),24 }, + { IPv4(192,136,64,0),24 }, + { IPv4(192,136,70,0),24 }, + { IPv4(192,136,112,0),24 }, + { IPv4(192,136,120,0),21 }, + { IPv4(192,136,128,0),23 }, + { IPv4(192,136,130,0),24 }, + { IPv4(192,136,133,0),24 }, + { IPv4(192,136,154,0),23 }, + { IPv4(192,137,21,0),24 }, + { IPv4(192,137,225,0),24 }, + { IPv4(192,137,252,0),24 }, + { IPv4(192,138,24,0),21 }, + { IPv4(192,138,29,0),24 }, + { IPv4(192,138,32,0),19 }, + { IPv4(192,138,35,0),24 }, + { IPv4(192,138,64,0),20 }, + { IPv4(192,138,78,0),24 }, + { IPv4(192,138,80,0),22 }, + { IPv4(192,138,85,0),24 }, + { IPv4(192,138,87,0),24 }, + { IPv4(192,138,101,0),24 }, + { IPv4(192,138,131,0),24 }, + { IPv4(192,138,170,0),24 }, + { IPv4(192,138,172,0),24 }, + { IPv4(192,138,173,0),24 }, + { IPv4(192,138,174,0),24 }, + { IPv4(192,138,176,0),23 }, + { IPv4(192,138,178,0),24 }, + { IPv4(192,138,184,0),24 }, + { IPv4(192,138,189,0),24 }, + { IPv4(192,138,191,0),24 }, + { IPv4(192,138,253,0),24 }, + { IPv4(192,139,6,0),24 }, + { IPv4(192,139,7,0),24 }, + { IPv4(192,139,23,0),24 }, + { IPv4(192,139,37,0),24 }, + { IPv4(192,139,46,0),24 }, + { IPv4(192,139,80,0),24 }, + { IPv4(192,139,81,0),24 }, + { IPv4(192,139,82,0),24 }, + { IPv4(192,139,133,0),24 }, + { IPv4(192,139,134,0),24 }, + { IPv4(192,139,135,0),24 }, + { IPv4(192,139,136,0),24 }, + { IPv4(192,139,141,0),24 }, + { IPv4(192,139,194,0),24 }, + { IPv4(192,139,195,0),24 }, + { IPv4(192,139,219,0),24 }, + { IPv4(192,139,220,0),24 }, + { IPv4(192,139,233,0),24 }, + { IPv4(192,139,234,0),24 }, + { IPv4(192,139,235,0),24 }, + { IPv4(192,139,238,0),24 }, + { IPv4(192,146,1,0),24 }, + { IPv4(192,146,2,0),24 }, + { IPv4(192,146,3,0),24 }, + { IPv4(192,146,4,0),24 }, + { IPv4(192,146,5,0),24 }, + { IPv4(192,146,25,0),24 }, + { IPv4(192,146,26,0),24 }, + { IPv4(192,146,27,0),24 }, + { IPv4(192,146,28,0),24 }, + { IPv4(192,146,29,0),24 }, + { IPv4(192,146,30,0),24 }, + { IPv4(192,146,31,0),24 }, + { IPv4(192,146,32,0),19 }, + { IPv4(192,146,64,0),19 }, + { IPv4(192,146,96,0),22 }, + { IPv4(192,146,100,0),24 }, + { IPv4(192,146,112,0),24 }, + { IPv4(192,146,150,0),24 }, + { IPv4(192,146,159,0),24 }, + { IPv4(192,146,161,0),24 }, + { IPv4(192,146,162,0),24 }, + { IPv4(192,146,183,0),24 }, + { IPv4(192,146,201,0),24 }, + { IPv4(192,146,214,0),24 }, + { IPv4(192,146,226,0),24 }, + { IPv4(192,146,254,0),24 }, + { IPv4(192,147,7,0),24 }, + { IPv4(192,147,12,0),24 }, + { IPv4(192,147,13,0),24 }, + { IPv4(192,147,35,0),24 }, + { IPv4(192,147,40,0),24 }, + { IPv4(192,147,51,0),24 }, + { IPv4(192,147,73,0),24 }, + { IPv4(192,147,160,0),20 }, + { IPv4(192,147,171,0),24 }, + { IPv4(192,147,176,0),22 }, + { IPv4(192,147,223,0),24 }, + { IPv4(192,147,233,0),24 }, + { IPv4(192,147,236,0),24 }, + { IPv4(192,147,239,0),24 }, + { IPv4(192,147,240,0),24 }, + { IPv4(192,147,242,0),24 }, + { IPv4(192,147,243,0),24 }, + { IPv4(192,147,244,0),24 }, + { IPv4(192,147,249,0),24 }, + { IPv4(192,148,93,0),24 }, + { IPv4(192,148,94,0),23 }, + { IPv4(192,148,96,0),23 }, + { IPv4(192,148,174,0),24 }, + { IPv4(192,148,195,0),24 }, + { IPv4(192,148,252,0),24 }, + { IPv4(192,148,253,0),24 }, + { IPv4(192,149,2,0),24 }, + { IPv4(192,149,18,0),24 }, + { IPv4(192,149,20,0),24 }, + { IPv4(192,149,55,0),24 }, + { IPv4(192,149,81,0),24 }, + { IPv4(192,149,89,0),24 }, + { IPv4(192,149,92,0),24 }, + { IPv4(192,149,104,0),24 }, + { IPv4(192,149,107,0),24 }, + { IPv4(192,149,108,0),24 }, + { IPv4(192,149,138,0),24 }, + { IPv4(192,149,140,0),24 }, + { IPv4(192,149,141,0),24 }, + { IPv4(192,149,142,0),24 }, + { IPv4(192,149,146,0),24 }, + { IPv4(192,149,147,0),24 }, + { IPv4(192,149,148,0),24 }, + { IPv4(192,149,151,0),24 }, + { IPv4(192,149,214,0),24 }, + { IPv4(192,149,216,0),24 }, + { IPv4(192,149,217,0),24 }, + { IPv4(192,149,231,0),24 }, + { IPv4(192,149,235,0),24 }, + { IPv4(192,149,237,0),24 }, + { IPv4(192,149,240,0),24 }, + { IPv4(192,150,14,0),24 }, + { IPv4(192,150,15,0),24 }, + { IPv4(192,150,21,0),24 }, + { IPv4(192,150,27,0),24 }, + { IPv4(192,150,28,0),24 }, + { IPv4(192,150,31,0),24 }, + { IPv4(192,150,32,0),21 }, + { IPv4(192,150,87,0),24 }, + { IPv4(192,150,103,0),24 }, + { IPv4(192,150,113,0),24 }, + { IPv4(192,150,123,0),24 }, + { IPv4(192,150,175,0),24 }, + { IPv4(192,150,176,0),24 }, + { IPv4(192,150,186,0),23 }, + { IPv4(192,150,199,0),24 }, + { IPv4(192,150,210,0),24 }, + { IPv4(192,150,216,0),24 }, + { IPv4(192,150,221,0),24 }, + { IPv4(192,150,224,0),24 }, + { IPv4(192,150,242,0),24 }, + { IPv4(192,150,245,0),24 }, + { IPv4(192,150,249,0),24 }, + { IPv4(192,150,250,0),23 }, + { IPv4(192,150,253,0),24 }, + { IPv4(192,151,7,0),24 }, + { IPv4(192,151,10,0),23 }, + { IPv4(192,151,30,0),24 }, + { IPv4(192,151,34,0),24 }, + { IPv4(192,151,39,0),24 }, + { IPv4(192,151,46,0),24 }, + { IPv4(192,151,110,0),24 }, + { IPv4(192,151,112,0),24 }, + { IPv4(192,152,4,0),24 }, + { IPv4(192,152,16,0),21 }, + { IPv4(192,152,43,0),24 }, + { IPv4(192,152,54,0),24 }, + { IPv4(192,152,95,0),24 }, + { IPv4(192,152,99,0),24 }, + { IPv4(192,152,102,0),24 }, + { IPv4(192,152,106,0),24 }, + { IPv4(192,152,137,0),24 }, + { IPv4(192,152,138,0),24 }, + { IPv4(192,152,183,0),24 }, + { IPv4(192,152,212,0),24 }, + { IPv4(192,152,243,0),24 }, + { IPv4(192,152,245,0),24 }, + { IPv4(192,153,10,0),24 }, + { IPv4(192,153,11,0),24 }, + { IPv4(192,153,20,0),24 }, + { IPv4(192,153,22,0),24 }, + { IPv4(192,153,23,0),24 }, + { IPv4(192,153,24,0),24 }, + { IPv4(192,153,25,0),24 }, + { IPv4(192,153,48,0),21 }, + { IPv4(192,153,51,0),24 }, + { IPv4(192,153,92,0),24 }, + { IPv4(192,153,93,0),24 }, + { IPv4(192,153,124,0),24 }, + { IPv4(192,153,132,0),22 }, + { IPv4(192,153,136,0),21 }, + { IPv4(192,153,144,0),21 }, + { IPv4(192,153,156,0),24 }, + { IPv4(192,153,157,0),24 }, + { IPv4(192,153,159,0),24 }, + { IPv4(192,153,191,0),24 }, + { IPv4(192,153,219,0),24 }, + { IPv4(192,153,244,0),23 }, + { IPv4(192,153,245,0),24 }, + { IPv4(192,153,247,0),24 }, + { IPv4(192,154,57,0),24 }, + { IPv4(192,156,0,0),19 }, + { IPv4(192,156,13,0),24 }, + { IPv4(192,156,26,0),24 }, + { IPv4(192,156,27,0),24 }, + { IPv4(192,156,32,0),19 }, + { IPv4(192,156,33,0),24 }, + { IPv4(192,156,61,0),24 }, + { IPv4(192,156,63,0),24 }, + { IPv4(192,156,64,0),24 }, + { IPv4(192,156,64,0),20 }, + { IPv4(192,156,65,0),24 }, + { IPv4(192,156,66,0),24 }, + { IPv4(192,156,67,0),24 }, + { IPv4(192,156,80,0),23 }, + { IPv4(192,156,81,0),24 }, + { IPv4(192,156,84,0),24 }, + { IPv4(192,156,86,0),23 }, + { IPv4(192,156,86,0),24 }, + { IPv4(192,156,87,0),24 }, + { IPv4(192,156,88,0),24 }, + { IPv4(192,156,88,0),21 }, + { IPv4(192,156,89,0),24 }, + { IPv4(192,156,90,0),24 }, + { IPv4(192,156,91,0),24 }, + { IPv4(192,156,93,0),24 }, + { IPv4(192,156,95,0),24 }, + { IPv4(192,156,98,0),24 }, + { IPv4(192,156,101,0),24 }, + { IPv4(192,156,133,0),24 }, + { IPv4(192,156,134,0),24 }, + { IPv4(192,156,135,0),24 }, + { IPv4(192,156,136,0),24 }, + { IPv4(192,156,166,0),24 }, + { IPv4(192,156,191,0),24 }, + { IPv4(192,156,202,0),24 }, + { IPv4(192,156,212,0),24 }, + { IPv4(192,156,214,0),24 }, + { IPv4(192,156,220,0),24 }, + { IPv4(192,156,226,0),24 }, + { IPv4(192,156,234,0),24 }, + { IPv4(192,156,243,0),24 }, + { IPv4(192,157,130,0),24 }, + { IPv4(192,158,48,0),24 }, + { IPv4(192,158,61,0),24 }, + { IPv4(192,159,13,0),24 }, + { IPv4(192,159,32,0),22 }, + { IPv4(192,159,104,0),24 }, + { IPv4(192,159,111,0),24 }, + { IPv4(192,159,130,0),24 }, + { IPv4(192,160,15,0),24 }, + { IPv4(192,160,35,0),24 }, + { IPv4(192,160,49,0),24 }, + { IPv4(192,160,53,0),24 }, + { IPv4(192,160,55,0),24 }, + { IPv4(192,160,61,0),24 }, + { IPv4(192,160,62,0),24 }, + { IPv4(192,160,69,0),24 }, + { IPv4(192,160,73,0),24 }, + { IPv4(192,160,74,0),24 }, + { IPv4(192,160,97,0),24 }, + { IPv4(192,160,98,0),23 }, + { IPv4(192,160,100,0),24 }, + { IPv4(192,160,122,0),24 }, + { IPv4(192,160,125,0),24 }, + { IPv4(192,160,129,0),24 }, + { IPv4(192,160,130,0),24 }, + { IPv4(192,160,158,0),24 }, + { IPv4(192,160,159,0),24 }, + { IPv4(192,160,165,0),24 }, + { IPv4(192,160,186,0),24 }, + { IPv4(192,160,187,0),24 }, + { IPv4(192,160,242,0),24 }, + { IPv4(192,160,243,0),24 }, + { IPv4(192,160,244,0),24 }, + { IPv4(192,161,36,0),24 }, + { IPv4(192,162,16,0),24 }, + { IPv4(192,164,72,0),21 }, + { IPv4(192,164,128,0),19 }, + { IPv4(192,164,176,0),20 }, + { IPv4(192,164,192,0),20 }, + { IPv4(192,165,188,0),24 }, + { IPv4(192,165,207,0),24 }, + { IPv4(192,169,4,0),24 }, + { IPv4(192,169,5,0),24 }, + { IPv4(192,169,39,0),24 }, + { IPv4(192,169,40,0),23 }, + { IPv4(192,169,64,0),23 }, + { IPv4(192,170,0,0),18 }, + { IPv4(192,170,64,0),19 }, + { IPv4(192,170,66,0),24 }, + { IPv4(192,170,73,0),24 }, + { IPv4(192,170,79,0),24 }, + { IPv4(192,170,96,0),19 }, + { IPv4(192,171,8,0),22 }, + { IPv4(192,171,12,0),24 }, + { IPv4(192,171,16,0),23 }, + { IPv4(192,171,80,0),20 }, + { IPv4(192,171,101,0),24 }, + { IPv4(192,171,108,0),24 }, + { IPv4(192,171,111,0),24 }, + { IPv4(192,171,113,0),24 }, + { IPv4(192,172,0,0),19 }, + { IPv4(192,172,222,0),24 }, + { IPv4(192,172,226,0),24 }, + { IPv4(192,172,241,0),24 }, + { IPv4(192,174,32,0),19 }, + { IPv4(192,175,165,0),24 }, + { IPv4(192,175,173,0),24 }, + { IPv4(192,175,182,0),23 }, + { IPv4(192,175,185,0),24 }, + { IPv4(192,175,198,0),24 }, + { IPv4(192,175,209,0),24 }, + { IPv4(192,175,253,0),24 }, + { IPv4(192,176,253,0),24 }, + { IPv4(192,187,4,0),24 }, + { IPv4(192,187,4,0),22 }, + { IPv4(192,187,128,0),17 }, + { IPv4(192,187,156,0),24 }, + { IPv4(192,187,206,0),24 }, + { IPv4(192,188,3,0),24 }, + { IPv4(192,188,4,0),24 }, + { IPv4(192,188,16,0),24 }, + { IPv4(192,188,17,0),24 }, + { IPv4(192,188,34,0),24 }, + { IPv4(192,188,35,0),24 }, + { IPv4(192,188,53,0),24 }, + { IPv4(192,188,57,0),24 }, + { IPv4(192,188,60,0),24 }, + { IPv4(192,188,70,0),24 }, + { IPv4(192,188,72,0),24 }, + { IPv4(192,188,89,0),24 }, + { IPv4(192,188,90,0),24 }, + { IPv4(192,188,96,0),24 }, + { IPv4(192,188,106,0),24 }, + { IPv4(192,188,107,0),24 }, + { IPv4(192,188,114,0),24 }, + { IPv4(192,188,136,0),24 }, + { IPv4(192,188,148,0),24 }, + { IPv4(192,188,149,0),24 }, + { IPv4(192,188,159,0),24 }, + { IPv4(192,188,193,0),24 }, + { IPv4(192,188,199,0),24 }, + { IPv4(192,188,202,0),24 }, + { IPv4(192,188,204,0),22 }, + { IPv4(192,188,208,0),20 }, + { IPv4(192,188,230,0),24 }, + { IPv4(192,188,231,0),24 }, + { IPv4(192,188,232,0),24 }, + { IPv4(192,188,238,0),23 }, + { IPv4(192,188,240,0),24 }, + { IPv4(192,188,253,0),24 }, + { IPv4(192,189,32,0),24 }, + { IPv4(192,189,44,0),24 }, + { IPv4(192,189,45,0),24 }, + { IPv4(192,189,46,0),24 }, + { IPv4(192,189,47,0),24 }, + { IPv4(192,189,48,0),24 }, + { IPv4(192,189,54,0),24 }, + { IPv4(192,189,62,0),24 }, + { IPv4(192,189,65,0),24 }, + { IPv4(192,189,74,0),24 }, + { IPv4(192,189,172,0),24 }, + { IPv4(192,189,174,0),24 }, + { IPv4(192,189,177,0),24 }, + { IPv4(192,189,184,0),22 }, + { IPv4(192,189,197,0),24 }, + { IPv4(192,189,199,0),24 }, + { IPv4(192,189,218,0),24 }, + { IPv4(192,189,226,0),24 }, + { IPv4(192,189,227,0),24 }, + { IPv4(192,189,247,0),24 }, + { IPv4(192,189,249,0),24 }, + { IPv4(192,190,12,0),24 }, + { IPv4(192,190,37,0),24 }, + { IPv4(192,190,38,0),24 }, + { IPv4(192,190,45,0),24 }, + { IPv4(192,190,60,0),24 }, + { IPv4(192,190,66,0),24 }, + { IPv4(192,190,68,0),24 }, + { IPv4(192,190,106,0),24 }, + { IPv4(192,190,109,0),24 }, + { IPv4(192,190,111,0),24 }, + { IPv4(192,190,224,0),24 }, + { IPv4(192,192,0,0),24 }, + { IPv4(192,192,0,0),16 }, + { IPv4(192,192,1,0),24 }, + { IPv4(192,192,2,0),24 }, + { IPv4(192,192,15,0),24 }, + { IPv4(192,193,44,0),24 }, + { IPv4(192,193,45,0),24 }, + { IPv4(192,193,48,0),24 }, + { IPv4(192,193,70,0),24 }, + { IPv4(192,193,74,0),24 }, + { IPv4(192,193,75,0),24 }, + { IPv4(192,193,76,0),24 }, + { IPv4(192,193,78,0),24 }, + { IPv4(192,193,79,0),24 }, + { IPv4(192,193,85,0),24 }, + { IPv4(192,193,126,0),24 }, + { IPv4(192,193,127,0),24 }, + { IPv4(192,193,192,0),24 }, + { IPv4(192,193,193,0),24 }, + { IPv4(192,193,195,0),24 }, + { IPv4(192,193,196,0),24 }, + { IPv4(192,193,208,0),24 }, + { IPv4(192,193,210,0),24 }, + { IPv4(192,193,211,0),24 }, + { IPv4(192,195,26,0),24 }, + { IPv4(192,195,30,0),24 }, + { IPv4(192,195,38,0),24 }, + { IPv4(192,195,41,0),24 }, + { IPv4(192,195,44,0),24 }, + { IPv4(192,195,49,0),24 }, + { IPv4(192,195,50,0),24 }, + { IPv4(192,195,68,0),23 }, + { IPv4(192,195,70,0),24 }, + { IPv4(192,195,85,0),24 }, + { IPv4(192,195,153,0),24 }, + { IPv4(192,195,154,0),23 }, + { IPv4(192,195,176,0),24 }, + { IPv4(192,195,177,0),24 }, + { IPv4(192,195,190,0),24 }, + { IPv4(192,195,192,0),22 }, + { IPv4(192,195,196,0),24 }, + { IPv4(192,195,243,0),24 }, + { IPv4(192,195,245,0),24 }, + { IPv4(192,197,0,0),19 }, + { IPv4(192,197,48,0),23 }, + { IPv4(192,197,50,0),24 }, + { IPv4(192,197,67,0),24 }, + { IPv4(192,197,69,0),24 }, + { IPv4(192,197,72,0),24 }, + { IPv4(192,197,76,0),24 }, + { IPv4(192,197,77,0),24 }, + { IPv4(192,197,78,0),24 }, + { IPv4(192,197,79,0),24 }, + { IPv4(192,197,82,0),24 }, + { IPv4(192,197,83,0),24 }, + { IPv4(192,197,111,0),24 }, + { IPv4(192,197,114,0),24 }, + { IPv4(192,197,115,0),24 }, + { IPv4(192,197,166,0),24 }, + { IPv4(192,197,178,0),24 }, + { IPv4(192,197,180,0),24 }, + { IPv4(192,197,181,0),24 }, + { IPv4(192,197,182,0),24 }, + { IPv4(192,197,183,0),24 }, + { IPv4(192,197,184,0),24 }, + { IPv4(192,197,186,0),24 }, + { IPv4(192,197,191,0),24 }, + { IPv4(192,197,212,0),23 }, + { IPv4(192,197,214,0),24 }, + { IPv4(192,197,243,0),24 }, + { IPv4(192,197,244,0),24 }, + { IPv4(192,197,253,0),24 }, + { IPv4(192,198,148,0),24 }, + { IPv4(192,200,2,0),24 }, + { IPv4(192,200,3,0),24 }, + { IPv4(192,200,4,0),24 }, + { IPv4(192,200,5,0),24 }, + { IPv4(192,200,6,0),24 }, + { IPv4(192,200,7,0),24 }, + { IPv4(192,203,40,0),24 }, + { IPv4(192,203,41,0),24 }, + { IPv4(192,203,43,0),24 }, + { IPv4(192,203,48,0),24 }, + { IPv4(192,203,48,0),22 }, + { IPv4(192,203,49,0),24 }, + { IPv4(192,203,50,0),24 }, + { IPv4(192,203,51,0),24 }, + { IPv4(192,203,106,0),24 }, + { IPv4(192,203,130,0),23 }, + { IPv4(192,203,132,0),24 }, + { IPv4(192,203,136,0),23 }, + { IPv4(192,203,138,0),24 }, + { IPv4(192,203,139,0),24 }, + { IPv4(192,203,140,0),22 }, + { IPv4(192,203,144,0),24 }, + { IPv4(192,203,167,0),24 }, + { IPv4(192,203,174,0),24 }, + { IPv4(192,203,178,0),24 }, + { IPv4(192,203,180,0),24 }, + { IPv4(192,203,188,0),24 }, + { IPv4(192,203,190,0),24 }, + { IPv4(192,203,191,0),24 }, + { IPv4(192,203,196,0),24 }, + { IPv4(192,203,201,0),24 }, + { IPv4(192,203,204,0),24 }, + { IPv4(192,203,206,0),24 }, + { IPv4(192,203,212,0),24 }, + { IPv4(192,203,214,0),23 }, + { IPv4(192,203,230,0),24 }, + { IPv4(192,203,247,0),24 }, + { IPv4(192,203,249,0),24 }, + { IPv4(192,204,0,0),16 }, + { IPv4(192,204,160,0),21 }, + { IPv4(192,205,31,0),24 }, + { IPv4(192,205,32,0),22 }, + { IPv4(192,205,36,0),23 }, + { IPv4(192,206,21,0),24 }, + { IPv4(192,206,50,0),24 }, + { IPv4(192,206,101,0),24 }, + { IPv4(192,206,177,0),24 }, + { IPv4(192,206,180,0),24 }, + { IPv4(192,206,185,0),24 }, + { IPv4(192,206,217,0),24 }, + { IPv4(192,206,218,0),24 }, + { IPv4(192,206,235,0),24 }, + { IPv4(192,207,13,0),24 }, + { IPv4(192,207,20,0),24 }, + { IPv4(192,207,36,0),24 }, + { IPv4(192,207,63,0),24 }, + { IPv4(192,207,69,0),24 }, + { IPv4(192,207,72,0),24 }, + { IPv4(192,207,74,0),24 }, + { IPv4(192,207,119,0),24 }, + { IPv4(192,207,133,0),24 }, + { IPv4(192,207,159,0),24 }, + { IPv4(192,207,163,0),24 }, + { IPv4(192,207,169,0),24 }, + { IPv4(192,207,179,0),24 }, + { IPv4(192,207,181,0),24 }, + { IPv4(192,207,184,0),24 }, + { IPv4(192,207,187,0),24 }, + { IPv4(192,207,207,0),24 }, + { IPv4(192,207,208,0),22 }, + { IPv4(192,207,209,0),24 }, + { IPv4(192,207,210,0),23 }, + { IPv4(192,207,212,0),24 }, + { IPv4(192,207,223,0),24 }, + { IPv4(192,207,225,0),24 }, + { IPv4(192,207,228,0),22 }, + { IPv4(192,207,233,0),24 }, + { IPv4(192,207,235,0),24 }, + { IPv4(192,208,16,0),24 }, + { IPv4(192,208,17,0),24 }, + { IPv4(192,208,18,0),24 }, + { IPv4(192,208,19,0),24 }, + { IPv4(192,208,20,0),24 }, + { IPv4(192,208,21,0),24 }, + { IPv4(192,208,22,0),24 }, + { IPv4(192,208,23,0),24 }, + { IPv4(192,208,24,0),24 }, + { IPv4(192,208,25,0),24 }, + { IPv4(192,208,26,0),24 }, + { IPv4(192,208,27,0),24 }, + { IPv4(192,208,28,0),24 }, + { IPv4(192,208,29,0),24 }, + { IPv4(192,208,30,0),23 }, + { IPv4(192,208,35,0),24 }, + { IPv4(192,208,38,0),24 }, + { IPv4(192,208,40,0),24 }, + { IPv4(192,209,117,0),24 }, + { IPv4(192,210,98,0),24 }, + { IPv4(192,211,64,0),24 }, + { IPv4(192,211,64,0),19 }, + { IPv4(192,211,66,0),24 }, + { IPv4(192,211,67,0),24 }, + { IPv4(192,211,71,0),24 }, + { IPv4(192,211,72,0),24 }, + { IPv4(192,211,75,0),24 }, + { IPv4(192,211,76,0),22 }, + { IPv4(192,211,80,0),22 }, + { IPv4(192,211,84,0),23 }, + { IPv4(192,211,88,0),24 }, + { IPv4(192,211,94,0),23 }, + { IPv4(192,211,96,0),23 }, + { IPv4(192,211,96,0),20 }, + { IPv4(192,211,102,0),23 }, + { IPv4(192,211,103,0),24 }, + { IPv4(192,211,105,0),24 }, + { IPv4(192,211,107,0),24 }, + { IPv4(192,211,110,0),23 }, + { IPv4(192,211,112,0),21 }, + { IPv4(192,211,112,0),23 }, + { IPv4(192,211,114,0),24 }, + { IPv4(192,211,116,0),24 }, + { IPv4(192,211,117,0),24 }, + { IPv4(192,211,118,0),24 }, + { IPv4(192,211,120,0),24 }, + { IPv4(192,211,120,0),22 }, + { IPv4(192,211,121,0),24 }, + { IPv4(192,211,122,0),24 }, + { IPv4(192,215,0,0),16 }, + { IPv4(192,215,1,0),24 }, + { IPv4(192,215,3,0),24 }, + { IPv4(192,215,4,0),24 }, + { IPv4(192,215,8,0),23 }, + { IPv4(192,215,11,0),24 }, + { IPv4(192,215,14,0),24 }, + { IPv4(192,215,16,0),23 }, + { IPv4(192,215,21,0),24 }, + { IPv4(192,215,22,0),23 }, + { IPv4(192,215,26,0),24 }, + { IPv4(192,215,32,0),24 }, + { IPv4(192,215,36,0),24 }, + { IPv4(192,215,48,0),24 }, + { IPv4(192,215,50,0),23 }, + { IPv4(192,215,58,0),24 }, + { IPv4(192,215,64,0),23 }, + { IPv4(192,215,70,0),23 }, + { IPv4(192,215,72,0),22 }, + { IPv4(192,215,78,0),23 }, + { IPv4(192,215,81,0),24 }, + { IPv4(192,215,101,0),24 }, + { IPv4(192,215,102,0),24 }, + { IPv4(192,215,103,0),24 }, + { IPv4(192,215,107,0),24 }, + { IPv4(192,215,120,0),24 }, + { IPv4(192,215,122,0),24 }, + { IPv4(192,215,123,0),24 }, + { IPv4(192,215,124,0),24 }, + { IPv4(192,215,140,0),22 }, + { IPv4(192,215,145,0),24 }, + { IPv4(192,215,146,0),23 }, + { IPv4(192,215,150,0),24 }, + { IPv4(192,215,160,0),23 }, + { IPv4(192,215,162,0),24 }, + { IPv4(192,215,164,0),24 }, + { IPv4(192,215,168,0),24 }, + { IPv4(192,215,169,0),24 }, + { IPv4(192,215,170,0),24 }, + { IPv4(192,215,171,0),24 }, + { IPv4(192,215,175,0),24 }, + { IPv4(192,215,176,0),24 }, + { IPv4(192,215,180,0),23 }, + { IPv4(192,215,184,0),24 }, + { IPv4(192,215,185,0),24 }, + { IPv4(192,215,191,0),24 }, + { IPv4(192,215,194,0),24 }, + { IPv4(192,215,198,0),24 }, + { IPv4(192,215,200,0),21 }, + { IPv4(192,215,212,0),24 }, + { IPv4(192,215,213,0),24 }, + { IPv4(192,215,214,0),24 }, + { IPv4(192,215,215,0),24 }, + { IPv4(192,215,216,0),23 }, + { IPv4(192,215,220,0),24 }, + { IPv4(192,215,234,0),23 }, + { IPv4(192,215,241,0),24 }, + { IPv4(192,215,248,0),24 }, + { IPv4(192,215,249,0),24 }, + { IPv4(192,215,254,0),24 }, + { IPv4(192,216,8,0),24 }, + { IPv4(192,216,44,0),24 }, + { IPv4(192,216,45,0),24 }, + { IPv4(192,216,56,0),24 }, + { IPv4(192,216,57,0),24 }, + { IPv4(192,216,61,0),24 }, + { IPv4(192,216,72,0),24 }, + { IPv4(192,216,73,0),24 }, + { IPv4(192,216,74,0),24 }, + { IPv4(192,216,79,0),24 }, + { IPv4(192,216,89,0),24 }, + { IPv4(192,216,93,0),24 }, + { IPv4(192,216,95,0),24 }, + { IPv4(192,216,139,0),24 }, + { IPv4(192,216,144,0),21 }, + { IPv4(192,216,186,0),24 }, + { IPv4(192,216,242,0),24 }, + { IPv4(192,217,0,0),16 }, + { IPv4(192,218,8,0),23 }, + { IPv4(192,218,10,0),23 }, + { IPv4(192,218,12,0),23 }, + { IPv4(192,218,14,0),24 }, + { IPv4(192,218,15,0),24 }, + { IPv4(192,218,128,0),23 }, + { IPv4(192,218,140,0),24 }, + { IPv4(192,218,151,0),24 }, + { IPv4(192,219,150,0),24 }, + { IPv4(192,220,0,0),16 }, + { IPv4(192,222,1,0),24 }, + { IPv4(192,222,2,0),23 }, + { IPv4(192,222,4,0),22 }, + { IPv4(192,222,8,0),24 }, + { IPv4(192,222,64,0),23 }, + { IPv4(192,222,64,0),19 }, + { IPv4(192,222,66,0),24 }, + { IPv4(192,222,67,0),24 }, + { IPv4(192,222,69,0),24 }, + { IPv4(192,222,70,0),24 }, + { IPv4(192,222,71,0),24 }, + { IPv4(192,222,72,0),22 }, + { IPv4(192,222,78,0),23 }, + { IPv4(192,222,80,0),24 }, + { IPv4(192,222,82,0),23 }, + { IPv4(192,222,90,0),24 }, + { IPv4(192,222,93,0),24 }, + { IPv4(192,222,94,0),24 }, + { IPv4(192,222,96,0),22 }, + { IPv4(192,222,99,0),24 }, + { IPv4(192,223,4,0),24 }, + { IPv4(192,223,6,0),24 }, + { IPv4(192,223,7,0),24 }, + { IPv4(192,223,35,0),24 }, + { IPv4(192,223,36,0),24 }, + { IPv4(192,223,37,0),24 }, + { IPv4(192,223,57,0),24 }, + { IPv4(192,223,154,0),24 }, + { IPv4(192,223,160,0),24 }, + { IPv4(192,223,161,0),24 }, + { IPv4(192,223,163,0),24 }, + { IPv4(192,223,169,0),24 }, + { IPv4(192,223,172,0),24 }, + { IPv4(192,223,174,0),24 }, + { IPv4(192,223,176,0),21 }, + { IPv4(192,223,184,0),21 }, + { IPv4(192,223,192,0),21 }, + { IPv4(192,223,200,0),24 }, + { IPv4(192,223,203,0),24 }, + { IPv4(192,223,204,0),24 }, + { IPv4(192,223,206,0),24 }, + { IPv4(192,223,207,0),24 }, + { IPv4(192,223,208,0),21 }, + { IPv4(192,223,219,0),24 }, + { IPv4(192,223,221,0),24 }, + { IPv4(192,223,222,0),24 }, + { IPv4(192,223,223,0),24 }, + { IPv4(192,223,225,0),24 }, + { IPv4(192,223,226,0),24 }, + { IPv4(192,223,227,0),24 }, + { IPv4(192,223,228,0),24 }, + { IPv4(192,223,235,0),24 }, + { IPv4(192,223,237,0),24 }, + { IPv4(192,223,241,0),24 }, + { IPv4(192,223,242,0),24 }, + { IPv4(192,223,243,0),24 }, + { IPv4(192,223,246,0),24 }, + { IPv4(192,223,248,0),21 }, + { IPv4(192,224,11,0),24 }, + { IPv4(192,225,32,0),20 }, + { IPv4(192,225,48,0),21 }, + { IPv4(192,225,56,0),24 }, + { IPv4(192,225,64,0),19 }, + { IPv4(192,227,1,0),24 }, + { IPv4(192,227,2,0),23 }, + { IPv4(192,227,4,0),22 }, + { IPv4(192,227,8,0),21 }, + { IPv4(192,228,128,0),17 }, + { IPv4(192,228,128,0),18 }, + { IPv4(192,228,192,0),19 }, + { IPv4(192,228,224,0),19 }, + { IPv4(192,229,42,0),24 }, + { IPv4(192,231,6,0),24 }, + { IPv4(192,231,31,0),24 }, + { IPv4(192,231,43,0),24 }, + { IPv4(192,231,63,0),24 }, + { IPv4(192,231,86,0),24 }, + { IPv4(192,231,90,0),24 }, + { IPv4(192,231,110,0),24 }, + { IPv4(192,231,128,0),24 }, + { IPv4(192,231,135,0),24 }, + { IPv4(192,231,139,0),24 }, + { IPv4(192,231,156,0),22 }, + { IPv4(192,231,160,0),24 }, + { IPv4(192,231,162,0),23 }, + { IPv4(192,231,164,0),24 }, + { IPv4(192,231,172,0),24 }, + { IPv4(192,231,193,0),24 }, + { IPv4(192,231,202,0),24 }, + { IPv4(192,231,214,0),24 }, + { IPv4(192,231,221,0),24 }, + { IPv4(192,231,231,0),24 }, + { IPv4(192,232,95,0),24 }, + { IPv4(192,232,117,0),24 }, + { IPv4(192,232,118,0),24 }, + { IPv4(192,232,119,0),24 }, + { IPv4(192,232,120,0),21 }, + { IPv4(192,232,120,0),24 }, + { IPv4(192,232,121,0),24 }, + { IPv4(192,233,80,0),24 }, + { IPv4(192,233,81,0),24 }, + { IPv4(192,234,14,0),23 }, + { IPv4(192,234,16,0),24 }, + { IPv4(192,234,17,0),24 }, + { IPv4(192,234,18,0),23 }, + { IPv4(192,234,20,0),24 }, + { IPv4(192,234,65,0),24 }, + { IPv4(192,234,72,0),24 }, + { IPv4(192,234,96,0),24 }, + { IPv4(192,234,101,0),24 }, + { IPv4(192,234,135,0),24 }, + { IPv4(192,234,136,0),24 }, + { IPv4(192,234,137,0),24 }, + { IPv4(192,234,140,0),24 }, + { IPv4(192,234,153,0),24 }, + { IPv4(192,234,167,0),24 }, + { IPv4(192,234,173,0),24 }, + { IPv4(192,234,175,0),24 }, + { IPv4(192,234,176,0),24 }, + { IPv4(192,234,177,0),24 }, + { IPv4(192,234,223,0),24 }, + { IPv4(192,234,235,0),24 }, + { IPv4(192,234,237,0),24 }, + { IPv4(192,234,247,0),24 }, + { IPv4(192,234,253,0),24 }, + { IPv4(192,235,0,0),20 }, + { IPv4(192,235,16,0),20 }, + { IPv4(192,237,0,0),19 }, + { IPv4(192,237,29,0),24 }, + { IPv4(192,237,32,0),19 }, + { IPv4(192,237,114,0),24 }, + { IPv4(192,237,115,0),24 }, + { IPv4(192,237,125,0),24 }, + { IPv4(192,239,13,0),24 }, + { IPv4(192,239,39,0),24 }, + { IPv4(192,239,48,0),24 }, + { IPv4(192,240,128,0),20 }, + { IPv4(192,240,135,0),24 }, + { IPv4(192,241,47,0),24 }, + { IPv4(192,243,0,0),20 }, + { IPv4(192,243,16,0),21 }, + { IPv4(192,243,173,0),24 }, + { IPv4(192,244,4,0),24 }, + { IPv4(192,244,8,0),21 }, + { IPv4(192,244,24,0),23 }, + { IPv4(192,244,75,0),24 }, + { IPv4(192,244,231,0),24 }, + { IPv4(192,244,247,0),24 }, + { IPv4(192,244,253,0),24 }, + { IPv4(192,245,19,0),24 }, + { IPv4(192,245,20,0),22 }, + { IPv4(192,245,25,0),24 }, + { IPv4(192,245,26,0),24 }, + { IPv4(192,245,27,0),24 }, + { IPv4(192,245,28,0),24 }, + { IPv4(192,245,29,0),24 }, + { IPv4(192,245,33,0),24 }, + { IPv4(192,245,36,0),24 }, + { IPv4(192,245,42,0),23 }, + { IPv4(192,245,58,0),23 }, + { IPv4(192,245,61,0),24 }, + { IPv4(192,245,81,0),24 }, + { IPv4(192,245,82,0),23 }, + { IPv4(192,245,84,0),23 }, + { IPv4(192,245,86,0),24 }, + { IPv4(192,245,88,0),24 }, + { IPv4(192,245,89,0),24 }, + { IPv4(192,245,90,0),24 }, + { IPv4(192,245,92,0),24 }, + { IPv4(192,245,95,0),24 }, + { IPv4(192,245,98,0),24 }, + { IPv4(192,245,119,0),24 }, + { IPv4(192,245,142,0),24 }, + { IPv4(192,245,153,0),24 }, + { IPv4(192,245,163,0),24 }, + { IPv4(192,245,171,0),24 }, + { IPv4(192,245,176,0),24 }, + { IPv4(192,245,179,0),24 }, + { IPv4(192,245,187,0),24 }, + { IPv4(192,245,197,0),24 }, + { IPv4(192,245,198,0),23 }, + { IPv4(192,245,200,0),21 }, + { IPv4(192,245,218,0),24 }, + { IPv4(192,245,232,0),24 }, + { IPv4(192,245,249,0),24 }, + { IPv4(192,245,250,0),24 }, + { IPv4(192,246,9,0),24 }, + { IPv4(192,246,17,0),24 }, + { IPv4(192,246,34,0),24 }, + { IPv4(192,246,69,0),24 }, + { IPv4(192,246,76,0),24 }, + { IPv4(192,246,84,0),24 }, + { IPv4(192,246,85,0),24 }, + { IPv4(192,246,88,0),24 }, + { IPv4(192,246,103,0),24 }, + { IPv4(192,246,117,0),24 }, + { IPv4(192,246,123,0),24 }, + { IPv4(192,246,150,0),24 }, + { IPv4(192,246,155,0),24 }, + { IPv4(192,246,171,0),24 }, + { IPv4(192,246,172,0),24 }, + { IPv4(192,246,218,0),24 }, + { IPv4(192,246,224,0),22 }, + { IPv4(192,246,228,0),23 }, + { IPv4(192,246,230,0),24 }, + { IPv4(192,246,231,0),24 }, + { IPv4(192,246,232,0),22 }, + { IPv4(192,247,16,0),20 }, + { IPv4(192,248,0,0),17 }, + { IPv4(192,249,24,0),24 }, + { IPv4(192,249,46,0),24 }, + { IPv4(192,249,47,0),24 }, + { IPv4(192,249,48,0),24 }, + { IPv4(192,249,49,0),24 }, + { IPv4(192,250,0,0),20 }, + { IPv4(192,250,112,0),24 }, + { IPv4(192,251,6,0),24 }, + { IPv4(192,251,7,0),24 }, + { IPv4(192,251,14,0),24 }, + { IPv4(192,251,26,0),24 }, + { IPv4(192,251,27,0),24 }, + { IPv4(192,251,28,0),24 }, + { IPv4(192,251,29,0),24 }, + { IPv4(192,251,30,0),24 }, + { IPv4(192,251,46,0),23 }, + { IPv4(192,251,66,0),23 }, + { IPv4(192,251,68,0),23 }, + { IPv4(192,251,94,0),24 }, + { IPv4(192,251,147,0),24 }, + { IPv4(192,251,193,0),24 }, + { IPv4(192,251,195,0),24 }, + { IPv4(192,251,213,0),24 }, + { IPv4(192,251,219,0),24 }, + { IPv4(192,251,220,0),22 }, + { IPv4(192,251,224,0),24 }, + { IPv4(192,252,0,0),21 }, + { IPv4(192,252,64,0),18 }, + { IPv4(192,252,76,0),24 }, + { IPv4(193,0,14,0),24 }, + { IPv4(193,0,224,0),22 }, + { IPv4(193,3,128,0),23 }, + { IPv4(193,5,2,0),24 }, + { IPv4(193,5,24,0),24 }, + { IPv4(193,5,25,0),24 }, + { IPv4(193,5,41,0),24 }, + { IPv4(193,5,68,0),23 }, + { IPv4(193,5,160,0),21 }, + { IPv4(193,5,240,0),21 }, + { IPv4(193,5,248,0),23 }, + { IPv4(193,5,255,0),24 }, + { IPv4(193,8,35,0),24 }, + { IPv4(193,8,40,0),23 }, + { IPv4(193,8,109,0),24 }, + { IPv4(193,8,197,0),24 }, + { IPv4(193,9,120,0),24 }, + { IPv4(193,9,124,0),22 }, + { IPv4(193,9,254,0),24 }, + { IPv4(193,16,48,0),20 }, + { IPv4(193,18,249,0),24 }, + { IPv4(193,22,100,0),23 }, + { IPv4(193,22,120,0),21 }, + { IPv4(193,23,134,0),24 }, + { IPv4(193,23,148,0),22 }, + { IPv4(193,23,164,0),24 }, + { IPv4(193,23,167,0),24 }, + { IPv4(193,24,16,0),21 }, + { IPv4(193,24,48,0),20 }, + { IPv4(193,24,64,0),23 }, + { IPv4(193,24,65,0),24 }, + { IPv4(193,24,66,0),24 }, + { IPv4(193,28,5,0),24 }, + { IPv4(193,28,62,0),24 }, + { IPv4(193,28,212,0),24 }, + { IPv4(193,29,230,0),24 }, + { IPv4(193,30,20,0),24 }, + { IPv4(193,30,28,0),22 }, + { IPv4(193,30,202,0),24 }, + { IPv4(193,32,17,0),24 }, + { IPv4(193,32,23,0),24 }, + { IPv4(193,32,98,0),23 }, + { IPv4(193,32,114,0),24 }, + { IPv4(193,32,208,0),23 }, + { IPv4(193,32,254,0),24 }, + { IPv4(193,34,230,0),23 }, + { IPv4(193,34,230,0),24 }, + { IPv4(193,35,182,0),23 }, + { IPv4(193,35,184,0),21 }, + { IPv4(193,35,192,0),22 }, + { IPv4(193,35,196,0),23 }, + { IPv4(193,35,255,0),24 }, + { IPv4(193,36,232,0),24 }, + { IPv4(193,37,32,0),24 }, + { IPv4(193,37,36,0),24 }, + { IPv4(193,37,69,0),24 }, + { IPv4(193,37,160,0),24 }, + { IPv4(193,38,52,0),24 }, + { IPv4(193,38,64,0),18 }, + { IPv4(193,38,168,0),24 }, + { IPv4(193,38,169,0),24 }, + { IPv4(193,39,16,0),20 }, + { IPv4(193,39,32,0),19 }, + { IPv4(193,39,64,0),23 }, + { IPv4(193,39,122,0),24 }, + { IPv4(193,39,133,0),24 }, + { IPv4(193,39,144,0),24 }, + { IPv4(193,39,246,0),24 }, + { IPv4(193,41,2,0),23 }, + { IPv4(193,41,10,0),23 }, + { IPv4(193,41,36,0),24 }, + { IPv4(193,41,56,0),22 }, + { IPv4(193,41,90,0),24 }, + { IPv4(193,41,93,0),24 }, + { IPv4(193,41,118,0),23 }, + { IPv4(193,41,128,0),22 }, + { IPv4(193,41,148,0),23 }, + { IPv4(193,41,164,0),23 }, + { IPv4(193,41,184,0),22 }, + { IPv4(193,42,128,0),22 }, + { IPv4(193,43,15,0),24 }, + { IPv4(193,46,135,0),24 }, + { IPv4(193,47,104,0),21 }, + { IPv4(193,47,112,0),20 }, + { IPv4(193,47,128,0),21 }, + { IPv4(193,53,23,0),24 }, + { IPv4(193,53,80,0),24 }, + { IPv4(193,56,127,0),24 }, + { IPv4(193,57,105,0),24 }, + { IPv4(193,57,106,0),24 }, + { IPv4(193,57,107,0),24 }, + { IPv4(193,57,109,0),24 }, + { IPv4(193,57,110,0),24 }, + { IPv4(193,58,70,0),24 }, + { IPv4(193,58,70,0),23 }, + { IPv4(193,58,71,0),24 }, + { IPv4(193,58,204,0),22 }, + { IPv4(193,58,208,0),24 }, + { IPv4(193,58,209,0),24 }, + { IPv4(193,61,112,0),22 }, + { IPv4(193,73,62,0),24 }, + { IPv4(193,73,73,0),24 }, + { IPv4(193,73,74,0),24 }, + { IPv4(193,73,75,0),24 }, + { IPv4(193,73,76,0),24 }, + { IPv4(193,73,78,0),24 }, + { IPv4(193,73,79,0),24 }, + { IPv4(193,73,80,0),24 }, + { IPv4(193,73,81,0),24 }, + { IPv4(193,73,82,0),24 }, + { IPv4(193,73,83,0),24 }, + { IPv4(193,73,84,0),24 }, + { IPv4(193,73,85,0),24 }, + { IPv4(193,73,86,0),24 }, + { IPv4(193,73,87,0),24 }, + { IPv4(193,73,88,0),24 }, + { IPv4(193,73,89,0),24 }, + { IPv4(193,73,90,0),24 }, + { IPv4(193,73,91,0),24 }, + { IPv4(193,73,92,0),24 }, + { IPv4(193,73,93,0),24 }, + { IPv4(193,73,94,0),24 }, + { IPv4(193,73,95,0),24 }, + { IPv4(193,73,96,0),24 }, + { IPv4(193,73,97,0),24 }, + { IPv4(193,73,98,0),24 }, + { IPv4(193,73,99,0),24 }, + { IPv4(193,73,100,0),24 }, + { IPv4(193,73,101,0),24 }, + { IPv4(193,73,102,0),24 }, + { IPv4(193,73,103,0),24 }, + { IPv4(193,82,158,0),24 }, + { IPv4(193,83,209,0),24 }, + { IPv4(193,83,212,0),24 }, + { IPv4(193,92,46,0),24 }, + { IPv4(193,96,28,0),24 }, + { IPv4(193,96,112,0),21 }, + { IPv4(193,96,173,0),24 }, + { IPv4(193,96,230,0),24 }, + { IPv4(193,97,96,0),20 }, + { IPv4(193,97,120,0),22 }, + { IPv4(193,97,124,0),23 }, + { IPv4(193,97,129,0),24 }, + { IPv4(193,97,184,0),24 }, + { IPv4(193,98,1,0),24 }, + { IPv4(193,98,110,0),24 }, + { IPv4(193,99,144,0),24 }, + { IPv4(193,99,145,0),24 }, + { IPv4(193,100,32,0),19 }, + { IPv4(193,100,232,0),24 }, + { IPv4(193,101,58,0),24 }, + { IPv4(193,101,67,0),24 }, + { IPv4(193,102,208,0),24 }, + { IPv4(193,102,227,0),24 }, + { IPv4(193,103,1,0),24 }, + { IPv4(193,103,2,0),23 }, + { IPv4(193,103,4,0),22 }, + { IPv4(193,103,8,0),21 }, + { IPv4(193,103,16,0),20 }, + { IPv4(193,103,32,0),19 }, + { IPv4(193,103,64,0),18 }, + { IPv4(193,108,42,0),23 }, + { IPv4(193,108,64,0),21 }, + { IPv4(193,108,91,0),24 }, + { IPv4(193,108,92,0),24 }, + { IPv4(193,108,100,0),24 }, + { IPv4(193,108,132,0),23 }, + { IPv4(193,108,148,0),22 }, + { IPv4(193,108,165,0),24 }, + { IPv4(193,108,210,0),24 }, + { IPv4(193,108,214,0),24 }, + { IPv4(193,108,232,0),23 }, + { IPv4(193,108,238,0),23 }, + { IPv4(193,108,252,0),24 }, + { IPv4(193,108,253,0),24 }, + { IPv4(193,108,254,0),24 }, + { IPv4(193,108,255,0),24 }, + { IPv4(193,109,81,0),24 }, + { IPv4(193,109,108,0),22 }, + { IPv4(193,109,116,0),24 }, + { IPv4(193,109,122,0),24 }, + { IPv4(193,109,138,0),23 }, + { IPv4(193,109,142,0),23 }, + { IPv4(193,109,215,0),24 }, + { IPv4(193,113,0,0),16 }, + { IPv4(193,113,22,0),23 }, + { IPv4(193,114,118,0),24 }, + { IPv4(193,114,233,0),24 }, + { IPv4(193,114,248,0),24 }, + { IPv4(193,117,72,0),21 }, + { IPv4(193,117,190,0),24 }, + { IPv4(193,118,16,0),20 }, + { IPv4(193,119,176,0),20 }, + { IPv4(193,122,136,4),30 }, + { IPv4(193,123,112,0),20 }, + { IPv4(193,125,78,0),23 }, + { IPv4(193,128,184,0),22 }, + { IPv4(193,131,100,0),22 }, + { IPv4(193,131,114,0),23 }, + { IPv4(193,131,127,0),24 }, + { IPv4(193,132,4,0),22 }, + { IPv4(193,132,203,0),24 }, + { IPv4(193,134,254,0),24 }, + { IPv4(193,135,104,0),23 }, + { IPv4(193,135,106,0),24 }, + { IPv4(193,135,254,0),24 }, + { IPv4(193,138,32,0),19 }, + { IPv4(193,140,192,0),20 }, + { IPv4(193,140,208,0),21 }, + { IPv4(193,141,64,0),24 }, + { IPv4(193,141,176,0),24 }, + { IPv4(193,141,182,0),24 }, + { IPv4(193,141,183,0),24 }, + { IPv4(193,141,188,0),24 }, + { IPv4(193,148,24,0),21 }, + { IPv4(193,148,32,0),22 }, + { IPv4(193,148,36,0),23 }, + { IPv4(193,148,246,0),24 }, + { IPv4(193,149,32,0),19 }, + { IPv4(193,149,192,0),18 }, + { IPv4(193,149,217,0),24 }, + { IPv4(193,150,152,0),21 }, + { IPv4(193,150,160,0),22 }, + { IPv4(193,150,164,0),24 }, + { IPv4(193,162,104,0),23 }, + { IPv4(193,164,96,0),19 }, + { IPv4(193,164,192,0),24 }, + { IPv4(193,164,194,0),23 }, + { IPv4(193,164,242,0),23 }, + { IPv4(193,168,2,0),24 }, + { IPv4(193,171,114,0),24 }, + { IPv4(193,172,0,0),15 }, + { IPv4(193,176,64,0),24 }, + { IPv4(193,176,93,0),24 }, + { IPv4(193,176,94,0),23 }, + { IPv4(193,176,136,0),21 }, + { IPv4(193,177,224,0),21 }, + { IPv4(193,178,53,0),24 }, + { IPv4(193,178,131,0),24 }, + { IPv4(193,178,132,0),24 }, + { IPv4(193,178,148,0),23 }, + { IPv4(193,178,173,0),24 }, + { IPv4(193,178,208,0),24 }, + { IPv4(193,178,219,0),24 }, + { IPv4(193,180,62,0),24 }, + { IPv4(193,181,0,0),24 }, + { IPv4(193,183,18,0),23 }, + { IPv4(193,186,93,0),24 }, + { IPv4(193,186,94,0),24 }, + { IPv4(193,186,161,0),24 }, + { IPv4(193,186,188,0),22 }, + { IPv4(193,188,32,0),20 }, + { IPv4(193,188,32,0),24 }, + { IPv4(193,188,34,0),23 }, + { IPv4(193,188,36,0),23 }, + { IPv4(193,188,40,0),21 }, + { IPv4(193,188,135,0),24 }, + { IPv4(193,188,160,0),19 }, + { IPv4(193,192,32,0),19 }, + { IPv4(193,192,64,0),19 }, + { IPv4(193,192,224,0),19 }, + { IPv4(193,192,230,0),24 }, + { IPv4(193,192,246,0),24 }, + { IPv4(193,192,249,0),24 }, + { IPv4(193,193,97,0),24 }, + { IPv4(193,193,99,0),24 }, + { IPv4(193,193,104,0),24 }, + { IPv4(193,193,106,0),24 }, + { IPv4(193,193,108,0),24 }, + { IPv4(193,193,112,0),24 }, + { IPv4(193,193,113,0),24 }, + { IPv4(193,193,121,0),24 }, + { IPv4(193,193,122,0),24 }, + { IPv4(193,193,123,0),24 }, + { IPv4(193,193,124,0),22 }, + { IPv4(193,193,161,0),24 }, + { IPv4(193,193,171,0),24 }, + { IPv4(193,193,184,0),23 }, + { IPv4(193,194,64,0),19 }, + { IPv4(193,194,64,0),24 }, + { IPv4(193,194,68,0),24 }, + { IPv4(193,194,76,0),24 }, + { IPv4(193,194,130,0),24 }, + { IPv4(193,194,136,0),24 }, + { IPv4(193,194,158,0),24 }, + { IPv4(193,195,0,0),16 }, + { IPv4(193,195,63,0),24 }, + { IPv4(193,195,234,0),24 }, + { IPv4(193,203,30,0),23 }, + { IPv4(193,203,96,0),19 }, + { IPv4(193,203,225,0),24 }, + { IPv4(193,203,226,0),24 }, + { IPv4(193,203,240,0),20 }, + { IPv4(193,218,80,0),23 }, + { IPv4(193,218,84,0),22 }, + { IPv4(193,218,88,0),22 }, + { IPv4(193,218,92,0),23 }, + { IPv4(193,218,99,0),24 }, + { IPv4(193,218,104,0),24 }, + { IPv4(193,218,121,0),24 }, + { IPv4(193,222,60,0),24 }, + { IPv4(193,226,30,0),24 }, + { IPv4(193,226,31,0),24 }, + { IPv4(193,226,32,0),24 }, + { IPv4(193,226,33,0),24 }, + { IPv4(193,226,35,0),24 }, + { IPv4(193,226,44,0),24 }, + { IPv4(193,226,54,0),24 }, + { IPv4(193,226,57,0),24 }, + { IPv4(193,226,64,0),24 }, + { IPv4(193,226,82,0),23 }, + { IPv4(193,226,83,0),24 }, + { IPv4(193,226,84,0),24 }, + { IPv4(193,226,88,0),23 }, + { IPv4(193,226,95,0),24 }, + { IPv4(193,226,98,0),24 }, + { IPv4(193,226,99,0),24 }, + { IPv4(193,226,100,0),24 }, + { IPv4(193,226,101,0),24 }, + { IPv4(193,226,103,0),24 }, + { IPv4(193,226,111,0),24 }, + { IPv4(193,227,97,0),24 }, + { IPv4(193,227,105,0),24 }, + { IPv4(193,227,106,0),24 }, + { IPv4(193,227,107,0),24 }, + { IPv4(193,228,61,0),24 }, + { IPv4(193,228,62,0),24 }, + { IPv4(193,230,0,0),17 }, + { IPv4(193,230,134,0),23 }, + { IPv4(193,230,135,0),24 }, + { IPv4(193,230,142,0),24 }, + { IPv4(193,230,145,0),24 }, + { IPv4(193,230,146,0),24 }, + { IPv4(193,230,160,0),24 }, + { IPv4(193,230,163,0),24 }, + { IPv4(193,230,166,0),24 }, + { IPv4(193,230,167,0),24 }, + { IPv4(193,230,169,0),24 }, + { IPv4(193,230,213,0),24 }, + { IPv4(193,230,232,0),24 }, + { IPv4(193,230,234,0),23 }, + { IPv4(193,230,237,0),24 }, + { IPv4(193,230,239,0),24 }, + { IPv4(193,230,242,0),24 }, + { IPv4(193,230,243,0),24 }, + { IPv4(193,230,245,0),24 }, + { IPv4(193,230,248,0),24 }, + { IPv4(193,230,253,0),24 }, + { IPv4(193,231,79,0),24 }, + { IPv4(193,231,98,0),24 }, + { IPv4(193,231,99,0),24 }, + { IPv4(193,231,109,0),24 }, + { IPv4(193,231,116,0),22 }, + { IPv4(193,231,119,0),24 }, + { IPv4(193,231,120,0),21 }, + { IPv4(193,231,122,0),24 }, + { IPv4(193,231,123,0),24 }, + { IPv4(193,231,164,0),22 }, + { IPv4(193,231,180,0),22 }, + { IPv4(193,231,204,0),24 }, + { IPv4(193,231,206,0),23 }, + { IPv4(193,231,246,0),24 }, + { IPv4(193,231,250,0),24 }, + { IPv4(193,234,220,0),23 }, + { IPv4(193,235,130,0),23 }, + { IPv4(193,235,206,0),24 }, + { IPv4(193,237,0,0),16 }, + { IPv4(193,238,0,0),16 }, + { IPv4(193,242,96,0),24 }, + { IPv4(193,242,113,0),24 }, + { IPv4(193,242,115,0),24 }, + { IPv4(193,242,116,0),24 }, + { IPv4(193,243,162,0),23 }, + { IPv4(193,243,164,0),23 }, + { IPv4(193,243,176,0),22 }, + { IPv4(193,243,180,0),23 }, + { IPv4(193,243,192,0),19 }, + { IPv4(193,243,224,0),19 }, + { IPv4(193,246,96,0),24 }, + { IPv4(193,246,101,0),24 }, + { IPv4(193,246,108,0),23 }, + { IPv4(193,246,120,0),24 }, + { IPv4(193,246,123,0),24 }, + { IPv4(193,247,48,0),23 }, + { IPv4(193,247,51,0),24 }, + { IPv4(193,247,54,0),23 }, + { IPv4(193,247,56,0),22 }, + { IPv4(193,247,68,0),22 }, + { IPv4(193,247,74,0),23 }, + { IPv4(193,247,76,0),24 }, + { IPv4(193,247,81,0),24 }, + { IPv4(193,247,87,0),24 }, + { IPv4(193,247,88,0),24 }, + { IPv4(193,247,94,0),24 }, + { IPv4(193,247,101,0),24 }, + { IPv4(193,247,133,0),24 }, + { IPv4(193,247,134,0),23 }, + { IPv4(193,247,147,0),24 }, + { IPv4(193,247,180,0),24 }, + { IPv4(193,247,183,0),24 }, + { IPv4(193,247,189,0),24 }, + { IPv4(193,247,202,0),24 }, + { IPv4(193,247,218,0),24 }, + { IPv4(193,247,219,0),24 }, + { IPv4(193,247,220,0),22 }, + { IPv4(193,247,238,0),24 }, + { IPv4(193,254,28,0),24 }, + { IPv4(193,255,106,0),24 }, + { IPv4(194,8,64,0),19 }, + { IPv4(194,8,96,0),19 }, + { IPv4(194,8,128,0),19 }, + { IPv4(194,8,228,0),22 }, + { IPv4(194,8,231,0),24 }, + { IPv4(194,8,232,0),24 }, + { IPv4(194,8,233,0),24 }, + { IPv4(194,8,234,0),24 }, + { IPv4(194,8,235,0),24 }, + { IPv4(194,8,236,0),24 }, + { IPv4(194,9,124,0),23 }, + { IPv4(194,9,126,0),24 }, + { IPv4(194,10,201,0),24 }, + { IPv4(194,13,240,0),20 }, + { IPv4(194,14,6,0),23 }, + { IPv4(194,14,80,0),24 }, + { IPv4(194,14,81,0),24 }, + { IPv4(194,14,86,0),24 }, + { IPv4(194,15,64,0),21 }, + { IPv4(194,15,72,0),22 }, + { IPv4(194,15,175,0),24 }, + { IPv4(194,15,230,0),24 }, + { IPv4(194,15,237,0),24 }, + { IPv4(194,15,243,0),24 }, + { IPv4(194,20,8,0),21 }, + { IPv4(194,20,40,0),23 }, + { IPv4(194,20,42,0),24 }, + { IPv4(194,20,44,0),22 }, + { IPv4(194,20,49,0),24 }, + { IPv4(194,20,50,0),24 }, + { IPv4(194,20,52,0),22 }, + { IPv4(194,20,56,0),23 }, + { IPv4(194,20,60,0),22 }, + { IPv4(194,20,108,0),22 }, + { IPv4(194,20,155,0),24 }, + { IPv4(194,20,199,0),24 }, + { IPv4(194,20,200,0),21 }, + { IPv4(194,20,208,0),21 }, + { IPv4(194,20,216,0),22 }, + { IPv4(194,20,222,0),24 }, + { IPv4(194,20,226,0),24 }, + { IPv4(194,20,229,0),24 }, + { IPv4(194,20,248,0),24 }, + { IPv4(194,21,4,0),22 }, + { IPv4(194,21,8,0),22 }, + { IPv4(194,21,19,0),24 }, + { IPv4(194,21,20,0),22 }, + { IPv4(194,21,25,0),24 }, + { IPv4(194,21,28,0),22 }, + { IPv4(194,29,0,0),19 }, + { IPv4(194,29,64,0),24 }, + { IPv4(194,29,65,0),24 }, + { IPv4(194,29,68,0),23 }, + { IPv4(194,29,71,0),24 }, + { IPv4(194,29,72,0),21 }, + { IPv4(194,29,97,0),24 }, + { IPv4(194,29,98,0),24 }, + { IPv4(194,29,99,0),24 }, + { IPv4(194,29,100,0),23 }, + { IPv4(194,29,102,0),23 }, + { IPv4(194,29,216,0),21 }, + { IPv4(194,30,128,0),19 }, + { IPv4(194,30,192,0),18 }, + { IPv4(194,31,16,0),20 }, + { IPv4(194,31,77,0),24 }, + { IPv4(194,31,205,0),24 }, + { IPv4(194,31,220,0),24 }, + { IPv4(194,31,227,0),24 }, + { IPv4(194,31,240,0),23 }, + { IPv4(194,31,242,0),24 }, + { IPv4(194,32,125,0),24 }, + { IPv4(194,32,126,0),23 }, + { IPv4(194,32,174,0),23 }, + { IPv4(194,32,203,0),24 }, + { IPv4(194,32,221,0),24 }, + { IPv4(194,33,47,0),24 }, + { IPv4(194,33,48,0),23 }, + { IPv4(194,34,112,0),20 }, + { IPv4(194,35,15,0),24 }, + { IPv4(194,35,252,0),24 }, + { IPv4(194,36,120,0),24 }, + { IPv4(194,36,172,0),22 }, + { IPv4(194,36,208,0),24 }, + { IPv4(194,36,219,0),24 }, + { IPv4(194,36,220,0),24 }, + { IPv4(194,36,223,0),24 }, + { IPv4(194,38,74,0),23 }, + { IPv4(194,38,76,0),22 }, + { IPv4(194,38,80,0),21 }, + { IPv4(194,38,88,0),23 }, + { IPv4(194,38,90,0),24 }, + { IPv4(194,39,121,0),24 }, + { IPv4(194,39,148,0),24 }, + { IPv4(194,39,237,0),24 }, + { IPv4(194,40,0,0),17 }, + { IPv4(194,41,1,0),24 }, + { IPv4(194,41,60,0),23 }, + { IPv4(194,41,62,0),24 }, + { IPv4(194,42,56,0),21 }, + { IPv4(194,42,128,0),19 }, + { IPv4(194,42,160,0),19 }, + { IPv4(194,42,176,0),20 }, + { IPv4(194,42,192,0),20 }, + { IPv4(194,44,16,0),24 }, + { IPv4(194,44,26,0),24 }, + { IPv4(194,44,110,0),24 }, + { IPv4(194,44,154,0),24 }, + { IPv4(194,44,186,0),24 }, + { IPv4(194,45,45,0),24 }, + { IPv4(194,45,106,0),24 }, + { IPv4(194,45,127,0),24 }, + { IPv4(194,45,184,0),24 }, + { IPv4(194,45,227,0),24 }, + { IPv4(194,45,232,0),24 }, + { IPv4(194,48,88,0),22 }, + { IPv4(194,48,124,0),22 }, + { IPv4(194,48,128,0),22 }, + { IPv4(194,48,132,0),24 }, + { IPv4(194,48,132,0),22 }, + { IPv4(194,48,136,0),22 }, + { IPv4(194,48,204,0),22 }, + { IPv4(194,48,208,0),21 }, + { IPv4(194,48,216,0),22 }, + { IPv4(194,49,21,0),24 }, + { IPv4(194,49,22,0),24 }, + { IPv4(194,49,60,0),24 }, + { IPv4(194,53,57,0),24 }, + { IPv4(194,53,92,0),24 }, + { IPv4(194,55,84,0),23 }, + { IPv4(194,55,86,0),24 }, + { IPv4(194,55,183,0),24 }, + { IPv4(194,55,246,0),23 }, + { IPv4(194,56,97,0),24 }, + { IPv4(194,56,165,0),24 }, + { IPv4(194,56,244,0),24 }, + { IPv4(194,56,250,0),23 }, + { IPv4(194,59,16,0),23 }, + { IPv4(194,59,96,0),19 }, + { IPv4(194,59,133,0),24 }, + { IPv4(194,59,152,0),23 }, + { IPv4(194,59,154,0),24 }, + { IPv4(194,59,156,0),24 }, + { IPv4(194,59,182,0),24 }, + { IPv4(194,60,98,0),24 }, + { IPv4(194,60,99,0),24 }, + { IPv4(194,60,100,0),24 }, + { IPv4(194,60,101,0),24 }, + { IPv4(194,60,102,0),24 }, + { IPv4(194,60,103,0),24 }, + { IPv4(194,60,104,0),24 }, + { IPv4(194,60,105,0),24 }, + { IPv4(194,60,106,0),23 }, + { IPv4(194,60,108,0),22 }, + { IPv4(194,61,41,0),24 }, + { IPv4(194,61,49,0),24 }, + { IPv4(194,61,63,0),24 }, + { IPv4(194,61,173,0),24 }, + { IPv4(194,61,230,0),24 }, + { IPv4(194,62,124,0),24 }, + { IPv4(194,63,0,0),17 }, + { IPv4(194,64,125,0),24 }, + { IPv4(194,64,151,0),24 }, + { IPv4(194,68,8,0),22 }, + { IPv4(194,68,12,0),24 }, + { IPv4(194,68,56,0),24 }, + { IPv4(194,68,102,0),24 }, + { IPv4(194,68,222,0),24 }, + { IPv4(194,69,16,0),20 }, + { IPv4(194,69,32,0),19 }, + { IPv4(194,69,169,0),24 }, + { IPv4(194,69,181,0),24 }, + { IPv4(194,69,182,0),24 }, + { IPv4(194,69,253,0),24 }, + { IPv4(194,70,0,0),16 }, + { IPv4(194,71,222,0),24 }, + { IPv4(194,72,0,0),14 }, + { IPv4(194,72,154,0),24 }, + { IPv4(194,73,16,0),21 }, + { IPv4(194,73,24,0),21 }, + { IPv4(194,73,74,0),24 }, + { IPv4(194,73,84,0),24 }, + { IPv4(194,73,85,0),24 }, + { IPv4(194,73,86,0),24 }, + { IPv4(194,73,94,0),23 }, + { IPv4(194,73,144,0),24 }, + { IPv4(194,73,228,0),23 }, + { IPv4(194,74,80,0),21 }, + { IPv4(194,74,88,0),21 }, + { IPv4(194,74,96,0),21 }, + { IPv4(194,74,104,0),21 }, + { IPv4(194,74,108,0),24 }, + { IPv4(194,74,111,0),24 }, + { IPv4(194,74,112,0),21 }, + { IPv4(194,74,120,0),21 }, + { IPv4(194,74,128,0),21 }, + { IPv4(194,74,136,0),21 }, + { IPv4(194,74,152,0),21 }, + { IPv4(194,74,160,0),19 }, + { IPv4(194,75,0,0),20 }, + { IPv4(194,75,16,0),21 }, + { IPv4(194,75,24,0),21 }, + { IPv4(194,75,26,0),24 }, + { IPv4(194,75,27,0),24 }, + { IPv4(194,75,40,0),21 }, + { IPv4(194,75,44,0),23 }, + { IPv4(194,75,48,0),21 }, + { IPv4(194,75,64,0),20 }, + { IPv4(194,75,80,0),21 }, + { IPv4(194,75,88,0),21 }, + { IPv4(194,75,112,0),21 }, + { IPv4(194,75,120,0),21 }, + { IPv4(194,75,178,0),24 }, + { IPv4(194,75,192,0),21 }, + { IPv4(194,75,200,0),21 }, + { IPv4(194,75,208,0),21 }, + { IPv4(194,75,216,0),21 }, + { IPv4(194,75,220,0),23 }, + { IPv4(194,76,40,0),24 }, + { IPv4(194,76,45,0),24 }, + { IPv4(194,76,146,0),24 }, + { IPv4(194,76,240,0),24 }, + { IPv4(194,77,0,0),16 }, + { IPv4(194,77,20,0),24 }, + { IPv4(194,77,21,0),24 }, + { IPv4(194,77,24,0),23 }, + { IPv4(194,77,26,0),23 }, + { IPv4(194,77,28,0),24 }, + { IPv4(194,77,71,0),24 }, + { IPv4(194,77,76,0),24 }, + { IPv4(194,77,82,0),24 }, + { IPv4(194,77,90,0),24 }, + { IPv4(194,77,97,0),24 }, + { IPv4(194,77,139,0),24 }, + { IPv4(194,77,153,0),24 }, + { IPv4(194,77,161,0),24 }, + { IPv4(194,77,213,0),24 }, + { IPv4(194,77,253,0),24 }, + { IPv4(194,85,23,0),24 }, + { IPv4(194,85,48,0),21 }, + { IPv4(194,85,56,0),24 }, + { IPv4(194,85,57,0),24 }, + { IPv4(194,88,58,0),24 }, + { IPv4(194,88,128,0),19 }, + { IPv4(194,93,50,0),24 }, + { IPv4(194,93,192,0),18 }, + { IPv4(194,96,0,0),16 }, + { IPv4(194,97,0,0),16 }, + { IPv4(194,97,120,0),21 }, + { IPv4(194,97,128,0),19 }, + { IPv4(194,97,168,0),24 }, + { IPv4(194,99,111,0),24 }, + { IPv4(194,99,115,0),24 }, + { IPv4(194,101,64,0),21 }, + { IPv4(194,101,72,0),22 }, + { IPv4(194,101,76,0),23 }, + { IPv4(194,101,78,0),24 }, + { IPv4(194,102,0,0),19 }, + { IPv4(194,102,16,0),24 }, + { IPv4(194,102,79,0),24 }, + { IPv4(194,102,99,0),24 }, + { IPv4(194,102,114,0),24 }, + { IPv4(194,102,120,0),22 }, + { IPv4(194,102,127,0),24 }, + { IPv4(194,102,131,0),24 }, + { IPv4(194,102,144,0),22 }, + { IPv4(194,102,148,0),24 }, + { IPv4(194,102,170,0),24 }, + { IPv4(194,102,172,0),24 }, + { IPv4(194,102,173,0),24 }, + { IPv4(194,102,174,0),24 }, + { IPv4(194,102,181,0),24 }, + { IPv4(194,102,192,0),24 }, + { IPv4(194,102,224,0),24 }, + { IPv4(194,102,232,0),24 }, + { IPv4(194,102,233,0),24 }, + { IPv4(194,103,23,0),24 }, + { IPv4(194,103,152,0),24 }, + { IPv4(194,104,100,0),24 }, + { IPv4(194,104,120,0),22 }, + { IPv4(194,104,124,0),23 }, + { IPv4(194,104,138,0),23 }, + { IPv4(194,104,140,0),24 }, + { IPv4(194,104,142,0),24 }, + { IPv4(194,104,175,0),24 }, + { IPv4(194,105,8,0),24 }, + { IPv4(194,105,12,0),22 }, + { IPv4(194,105,16,0),24 }, + { IPv4(194,105,20,0),24 }, + { IPv4(194,105,64,0),19 }, + { IPv4(194,105,160,0),19 }, + { IPv4(194,106,188,0),22 }, + { IPv4(194,107,60,0),22 }, + { IPv4(194,107,64,0),22 }, + { IPv4(194,107,68,0),24 }, + { IPv4(194,107,82,0),24 }, + { IPv4(194,107,83,0),24 }, + { IPv4(194,107,96,0),20 }, + { IPv4(194,107,112,0),24 }, + { IPv4(194,107,114,0),23 }, + { IPv4(194,107,116,0),22 }, + { IPv4(194,107,120,0),21 }, + { IPv4(194,112,128,0),18 }, + { IPv4(194,112,192,0),18 }, + { IPv4(194,115,182,0),23 }, + { IPv4(194,115,224,0),20 }, + { IPv4(194,117,128,0),19 }, + { IPv4(194,118,0,0),16 }, + { IPv4(194,119,128,0),18 }, + { IPv4(194,119,224,0),19 }, + { IPv4(194,120,55,0),24 }, + { IPv4(194,120,228,0),24 }, + { IPv4(194,121,56,0),24 }, + { IPv4(194,124,112,0),22 }, + { IPv4(194,124,145,0),24 }, + { IPv4(194,124,146,0),23 }, + { IPv4(194,124,148,0),22 }, + { IPv4(194,125,228,0),24 }, + { IPv4(194,125,229,0),24 }, + { IPv4(194,125,230,0),24 }, + { IPv4(194,125,231,0),24 }, + { IPv4(194,125,252,0),23 }, + { IPv4(194,126,6,0),24 }, + { IPv4(194,126,10,0),24 }, + { IPv4(194,126,11,0),24 }, + { IPv4(194,126,12,0),24 }, + { IPv4(194,126,16,0),24 }, + { IPv4(194,126,17,0),24 }, + { IPv4(194,126,18,0),24 }, + { IPv4(194,126,20,0),24 }, + { IPv4(194,126,23,0),24 }, + { IPv4(194,126,24,0),24 }, + { IPv4(194,126,27,0),24 }, + { IPv4(194,126,46,0),24 }, + { IPv4(194,126,47,0),24 }, + { IPv4(194,126,64,0),19 }, + { IPv4(194,126,128,0),24 }, + { IPv4(194,126,136,0),24 }, + { IPv4(194,126,140,0),24 }, + { IPv4(194,126,142,0),24 }, + { IPv4(194,127,171,0),24 }, + { IPv4(194,130,152,0),21 }, + { IPv4(194,132,122,0),24 }, + { IPv4(194,132,149,0),24 }, + { IPv4(194,133,98,0),24 }, + { IPv4(194,133,160,0),20 }, + { IPv4(194,133,240,0),20 }, + { IPv4(194,133,242,0),24 }, + { IPv4(194,133,243,0),24 }, + { IPv4(194,133,244,0),24 }, + { IPv4(194,139,6,0),23 }, + { IPv4(194,139,128,0),18 }, + { IPv4(194,140,64,0),19 }, + { IPv4(194,140,80,0),24 }, + { IPv4(194,140,82,0),24 }, + { IPv4(194,140,224,0),19 }, + { IPv4(194,143,160,0),19 }, + { IPv4(194,145,122,0),23 }, + { IPv4(194,145,124,0),24 }, + { IPv4(194,145,147,0),24 }, + { IPv4(194,145,150,0),23 }, + { IPv4(194,147,112,0),23 }, + { IPv4(194,147,171,0),24 }, + { IPv4(194,147,234,0),23 }, + { IPv4(194,147,236,0),23 }, + { IPv4(194,149,24,0),23 }, + { IPv4(194,149,72,0),22 }, + { IPv4(194,149,91,0),24 }, + { IPv4(194,149,236,0),24 }, + { IPv4(194,149,243,0),24 }, + { IPv4(194,149,246,0),24 }, + { IPv4(194,149,247,0),24 }, + { IPv4(194,149,248,0),24 }, + { IPv4(194,149,249,0),24 }, + { IPv4(194,149,250,0),24 }, + { IPv4(194,149,251,0),24 }, + { IPv4(194,149,252,0),24 }, + { IPv4(194,149,253,0),24 }, + { IPv4(194,149,254,0),24 }, + { IPv4(194,149,255,0),24 }, + { IPv4(194,151,0,0),16 }, + { IPv4(194,151,2,0),23 }, + { IPv4(194,151,128,0),19 }, + { IPv4(194,152,128,0),19 }, + { IPv4(194,153,83,0),24 }, + { IPv4(194,153,86,0),23 }, + { IPv4(194,153,99,0),24 }, + { IPv4(194,153,132,0),24 }, + { IPv4(194,153,136,0),21 }, + { IPv4(194,153,144,0),24 }, + { IPv4(194,153,150,0),24 }, + { IPv4(194,153,160,0),21 }, + { IPv4(194,153,176,0),21 }, + { IPv4(194,153,227,0),24 }, + { IPv4(194,153,229,0),24 }, + { IPv4(194,153,231,0),24 }, + { IPv4(194,153,236,0),24 }, + { IPv4(194,153,241,0),24 }, + { IPv4(194,153,250,0),24 }, + { IPv4(194,153,253,0),24 }, + { IPv4(194,153,255,0),24 }, + { IPv4(194,154,0,0),19 }, + { IPv4(194,154,128,0),24 }, + { IPv4(194,154,129,0),24 }, + { IPv4(194,154,131,0),24 }, + { IPv4(194,154,132,0),24 }, + { IPv4(194,154,133,0),24 }, + { IPv4(194,154,134,0),24 }, + { IPv4(194,154,135,0),24 }, + { IPv4(194,154,136,0),22 }, + { IPv4(194,154,140,0),22 }, + { IPv4(194,154,144,0),22 }, + { IPv4(194,154,149,0),24 }, + { IPv4(194,154,152,0),24 }, + { IPv4(194,154,153,0),24 }, + { IPv4(194,154,154,0),24 }, + { IPv4(194,154,156,0),24 }, + { IPv4(194,154,157,0),24 }, + { IPv4(194,154,158,0),24 }, + { IPv4(194,154,159,0),24 }, + { IPv4(194,154,160,0),19 }, + { IPv4(194,154,192,0),19 }, + { IPv4(194,158,128,0),19 }, + { IPv4(194,158,160,0),19 }, + { IPv4(194,158,224,0),19 }, + { IPv4(194,158,250,0),23 }, + { IPv4(194,158,252,0),24 }, + { IPv4(194,159,0,0),16 }, + { IPv4(194,159,72,0),23 }, + { IPv4(194,159,224,0),21 }, + { IPv4(194,161,154,0),24 }, + { IPv4(194,161,200,0),23 }, + { IPv4(194,161,200,0),24 }, + { IPv4(194,161,201,0),24 }, + { IPv4(194,164,7,0),24 }, + { IPv4(194,165,64,0),19 }, + { IPv4(194,165,209,0),24 }, + { IPv4(194,168,0,0),16 }, + { IPv4(194,171,96,0),21 }, + { IPv4(194,174,84,0),23 }, + { IPv4(194,176,179,0),24 }, + { IPv4(194,177,96,0),19 }, + { IPv4(194,177,128,0),19 }, + { IPv4(194,180,25,0),24 }, + { IPv4(194,180,128,0),24 }, + { IPv4(194,180,160,0),21 }, + { IPv4(194,180,239,0),24 }, + { IPv4(194,183,128,0),19 }, + { IPv4(194,183,192,0),19 }, + { IPv4(194,183,211,0),24 }, + { IPv4(194,183,218,0),24 }, + { IPv4(194,183,224,0),19 }, + { IPv4(194,185,0,0),16 }, + { IPv4(194,185,25,0),24 }, + { IPv4(194,193,17,0),24 }, + { IPv4(194,194,0,0),16 }, + { IPv4(194,196,0,0),16 }, + { IPv4(194,196,47,0),24 }, + { IPv4(194,196,196,0),24 }, + { IPv4(194,196,248,0),24 }, + { IPv4(194,201,253,0),24 }, + { IPv4(194,202,0,0),22 }, + { IPv4(194,202,4,0),23 }, + { IPv4(194,203,201,0),24 }, + { IPv4(194,208,0,0),16 }, + { IPv4(194,209,108,0),24 }, + { IPv4(194,209,146,0),24 }, + { IPv4(194,209,185,0),24 }, + { IPv4(194,213,64,0),19 }, + { IPv4(194,216,59,0),24 }, + { IPv4(194,216,168,0),24 }, + { IPv4(194,217,0,0),16 }, + { IPv4(194,217,92,0),24 }, + { IPv4(194,217,220,0),23 }, + { IPv4(194,222,0,0),16 }, + { IPv4(194,230,0,0),16 }, + { IPv4(194,230,57,0),24 }, + { IPv4(194,230,99,0),24 }, + { IPv4(194,231,0,0),16 }, + { IPv4(194,231,54,0),24 }, + { IPv4(194,231,105,0),24 }, + { IPv4(194,231,164,0),23 }, + { IPv4(194,231,168,0),24 }, + { IPv4(194,231,236,0),22 }, + { IPv4(194,231,242,0),23 }, + { IPv4(194,231,246,0),24 }, + { IPv4(194,231,254,0),23 }, + { IPv4(194,232,0,0),16 }, + { IPv4(194,235,143,0),24 }, + { IPv4(194,235,243,0),24 }, + { IPv4(194,238,0,0),16 }, + { IPv4(194,242,34,0),24 }, + { IPv4(194,242,35,0),24 }, + { IPv4(194,242,41,0),24 }, + { IPv4(194,242,45,0),24 }, + { IPv4(194,242,54,0),24 }, + { IPv4(194,242,58,0),24 }, + { IPv4(194,242,61,0),24 }, + { IPv4(194,242,64,0),19 }, + { IPv4(194,242,160,0),24 }, + { IPv4(194,246,96,0),24 }, + { IPv4(194,247,64,0),19 }, + { IPv4(194,247,74,0),24 }, + { IPv4(194,247,75,0),24 }, + { IPv4(194,247,91,0),24 }, + { IPv4(194,253,130,0),24 }, + { IPv4(194,253,184,0),24 }, + { IPv4(195,2,128,0),19 }, + { IPv4(195,2,160,0),19 }, + { IPv4(195,3,108,0),23 }, + { IPv4(195,4,67,0),24 }, + { IPv4(195,4,68,0),23 }, + { IPv4(195,5,0,0),19 }, + { IPv4(195,5,32,0),19 }, + { IPv4(195,5,64,0),19 }, + { IPv4(195,5,197,0),24 }, + { IPv4(195,5,204,0),24 }, + { IPv4(195,7,224,0),19 }, + { IPv4(195,8,64,0),19 }, + { IPv4(195,10,96,0),20 }, + { IPv4(195,10,112,0),20 }, + { IPv4(195,10,224,0),19 }, + { IPv4(195,11,0,0),16 }, + { IPv4(195,11,224,0),19 }, + { IPv4(195,12,0,0),19 }, + { IPv4(195,12,192,0),19 }, + { IPv4(195,13,40,0),22 }, + { IPv4(195,13,64,0),18 }, + { IPv4(195,14,64,0),19 }, + { IPv4(195,16,0,0),19 }, + { IPv4(195,16,64,0),19 }, + { IPv4(195,16,128,0),19 }, + { IPv4(195,16,224,0),19 }, + { IPv4(195,18,64,0),18 }, + { IPv4(195,22,0,0),19 }, + { IPv4(195,24,64,0),19 }, + { IPv4(195,24,192,0),19 }, + { IPv4(195,26,64,0),19 }, + { IPv4(195,26,96,0),19 }, + { IPv4(195,26,192,0),19 }, + { IPv4(195,28,224,0),19 }, + { IPv4(195,30,0,0),16 }, + { IPv4(195,33,0,0),16 }, + { IPv4(195,33,18,0),24 }, + { IPv4(195,33,64,0),24 }, + { IPv4(195,33,96,0),19 }, + { IPv4(195,33,192,0),18 }, + { IPv4(195,34,160,0),19 }, + { IPv4(195,35,81,0),24 }, + { IPv4(195,35,105,0),24 }, + { IPv4(195,35,106,0),24 }, + { IPv4(195,35,110,0),24 }, + { IPv4(195,35,121,0),24 }, + { IPv4(195,35,126,0),24 }, + { IPv4(195,35,128,0),18 }, + { IPv4(195,38,19,0),24 }, + { IPv4(195,38,64,0),19 }, + { IPv4(195,38,192,0),18 }, + { IPv4(195,42,240,0),21 }, + { IPv4(195,46,0,0),21 }, + { IPv4(195,46,8,0),21 }, + { IPv4(195,46,16,0),20 }, + { IPv4(195,46,128,0),21 }, + { IPv4(195,46,128,0),24 }, + { IPv4(195,46,128,0),19 }, + { IPv4(195,46,132,0),24 }, + { IPv4(195,46,134,0),24 }, + { IPv4(195,46,141,0),24 }, + { IPv4(195,46,142,0),24 }, + { IPv4(195,46,224,0),19 }, + { IPv4(195,51,64,0),24 }, + { IPv4(195,51,174,0),23 }, + { IPv4(195,51,176,0),23 }, + { IPv4(195,51,180,0),24 }, + { IPv4(195,54,96,0),19 }, + { IPv4(195,54,224,0),19 }, + { IPv4(195,58,128,0),19 }, + { IPv4(195,58,192,0),19 }, + { IPv4(195,60,0,0),19 }, + { IPv4(195,61,32,0),24 }, + { IPv4(195,61,61,0),24 }, + { IPv4(195,64,0,0),19 }, + { IPv4(195,65,24,0),24 }, + { IPv4(195,65,76,0),24 }, + { IPv4(195,65,77,0),24 }, + { IPv4(195,65,78,0),24 }, + { IPv4(195,65,158,0),24 }, + { IPv4(195,66,128,0),19 }, + { IPv4(195,66,224,0),19 }, + { IPv4(195,70,64,0),19 }, + { IPv4(195,70,96,0),19 }, + { IPv4(195,72,128,0),19 }, + { IPv4(195,72,160,0),19 }, + { IPv4(195,74,96,0),19 }, + { IPv4(195,74,128,0),19 }, + { IPv4(195,74,224,0),19 }, + { IPv4(195,75,0,0),16 }, + { IPv4(195,75,46,0),24 }, + { IPv4(195,78,128,0),19 }, + { IPv4(195,79,161,0),24 }, + { IPv4(195,79,171,0),24 }, + { IPv4(195,80,0,0),19 }, + { IPv4(195,80,32,0),19 }, + { IPv4(195,80,129,0),24 }, + { IPv4(195,80,134,0),24 }, + { IPv4(195,81,40,0),23 }, + { IPv4(195,82,32,0),19 }, + { IPv4(195,82,128,0),19 }, + { IPv4(195,82,224,0),19 }, + { IPv4(195,85,128,0),18 }, + { IPv4(195,86,0,0),16 }, + { IPv4(195,87,0,0),16 }, + { IPv4(195,88,10,0),23 }, + { IPv4(195,88,17,0),24 }, + { IPv4(195,88,42,0),24 }, + { IPv4(195,88,43,0),24 }, + { IPv4(195,88,44,0),23 }, + { IPv4(195,88,46,0),24 }, + { IPv4(195,88,120,0),24 }, + { IPv4(195,88,123,0),24 }, + { IPv4(195,88,146,0),24 }, + { IPv4(195,88,160,0),22 }, + { IPv4(195,90,64,0),19 }, + { IPv4(195,90,192,0),19 }, + { IPv4(195,90,224,0),19 }, + { IPv4(195,93,0,0),17 }, + { IPv4(195,93,16,0),20 }, + { IPv4(195,93,32,0),20 }, + { IPv4(195,93,48,0),20 }, + { IPv4(195,93,64,0),20 }, + { IPv4(195,93,80,0),20 }, + { IPv4(195,94,0,0),24 }, + { IPv4(195,94,1,0),24 }, + { IPv4(195,94,2,0),24 }, + { IPv4(195,94,3,0),24 }, + { IPv4(195,94,4,0),24 }, + { IPv4(195,94,5,0),24 }, + { IPv4(195,94,6,0),24 }, + { IPv4(195,94,96,0),19 }, + { IPv4(195,95,0,0),18 }, + { IPv4(195,95,64,0),19 }, + { IPv4(195,95,96,0),19 }, + { IPv4(195,95,128,0),21 }, + { IPv4(195,95,152,0),21 }, + { IPv4(195,95,160,0),20 }, + { IPv4(195,96,32,0),19 }, + { IPv4(195,97,0,0),17 }, + { IPv4(195,97,87,0),24 }, + { IPv4(195,98,192,0),19 }, + { IPv4(195,99,0,0),16 }, + { IPv4(195,99,8,0),21 }, + { IPv4(195,99,16,0),21 }, + { IPv4(195,99,24,0),21 }, + { IPv4(195,99,32,0),21 }, + { IPv4(195,99,64,0),20 }, + { IPv4(195,99,69,0),24 }, + { IPv4(195,99,80,0),21 }, + { IPv4(195,99,88,0),21 }, + { IPv4(195,99,93,0),24 }, + { IPv4(195,99,96,0),21 }, + { IPv4(195,99,104,0),21 }, + { IPv4(195,99,112,0),21 }, + { IPv4(195,99,192,0),21 }, + { IPv4(195,99,200,0),21 }, + { IPv4(195,99,208,0),21 }, + { IPv4(195,99,224,0),21 }, + { IPv4(195,99,232,0),21 }, + { IPv4(195,99,248,0),21 }, + { IPv4(195,100,0,0),16 }, + { IPv4(195,102,0,0),16 }, + { IPv4(195,102,253,0),24 }, + { IPv4(195,106,206,0),23 }, + { IPv4(195,110,160,0),19 }, + { IPv4(195,110,192,0),19 }, + { IPv4(195,112,0,0),18 }, + { IPv4(195,112,64,0),19 }, + { IPv4(195,121,0,0),16 }, + { IPv4(195,129,2,0),24 }, + { IPv4(195,129,34,0),23 }, + { IPv4(195,130,160,0),19 }, + { IPv4(195,134,0,0),19 }, + { IPv4(195,134,128,0),19 }, + { IPv4(195,138,124,0),22 }, + { IPv4(195,138,128,0),24 }, + { IPv4(195,138,128,0),21 }, + { IPv4(195,138,131,0),24 }, + { IPv4(195,138,133,0),24 }, + { IPv4(195,138,136,0),23 }, + { IPv4(195,138,137,0),24 }, + { IPv4(195,138,140,0),24 }, + { IPv4(195,138,140,0),22 }, + { IPv4(195,138,141,0),24 }, + { IPv4(195,138,142,0),24 }, + { IPv4(195,138,144,0),24 }, + { IPv4(195,138,144,0),20 }, + { IPv4(195,138,145,0),24 }, + { IPv4(195,138,147,0),24 }, + { IPv4(195,138,148,0),24 }, + { IPv4(195,138,149,0),24 }, + { IPv4(195,138,151,0),24 }, + { IPv4(195,138,152,0),24 }, + { IPv4(195,138,153,0),24 }, + { IPv4(195,138,155,0),24 }, + { IPv4(195,138,156,0),24 }, + { IPv4(195,138,157,0),24 }, + { IPv4(195,138,158,0),24 }, + { IPv4(195,138,159,0),24 }, + { IPv4(195,138,224,0),19 }, + { IPv4(195,141,0,0),16 }, + { IPv4(195,141,7,0),24 }, + { IPv4(195,141,36,0),23 }, + { IPv4(195,141,162,0),24 }, + { IPv4(195,141,233,0),24 }, + { IPv4(195,141,250,0),23 }, + { IPv4(195,146,32,0),19 }, + { IPv4(195,147,0,0),16 }, + { IPv4(195,149,0,0),18 }, + { IPv4(195,155,161,0),24 }, + { IPv4(195,162,0,0),19 }, + { IPv4(195,162,64,0),19 }, + { IPv4(195,162,96,0),19 }, + { IPv4(195,162,160,0),19 }, + { IPv4(195,162,224,0),19 }, + { IPv4(195,163,0,0),17 }, + { IPv4(195,163,128,0),19 }, + { IPv4(195,163,160,0),20 }, + { IPv4(195,163,176,0),20 }, + { IPv4(195,163,192,0),18 }, + { IPv4(195,167,0,0),17 }, + { IPv4(195,170,0,0),19 }, + { IPv4(195,170,64,0),19 }, + { IPv4(195,171,0,0),16 }, + { IPv4(195,171,32,0),22 }, + { IPv4(195,171,36,0),22 }, + { IPv4(195,171,44,0),22 }, + { IPv4(195,171,48,0),22 }, + { IPv4(195,171,52,0),22 }, + { IPv4(195,171,56,0),22 }, + { IPv4(195,171,60,0),23 }, + { IPv4(195,171,62,0),23 }, + { IPv4(195,171,64,0),23 }, + { IPv4(195,171,84,0),24 }, + { IPv4(195,171,85,0),24 }, + { IPv4(195,171,86,0),24 }, + { IPv4(195,171,88,0),21 }, + { IPv4(195,171,100,0),22 }, + { IPv4(195,173,0,0),16 }, + { IPv4(195,173,224,0),19 }, + { IPv4(195,176,128,0),22 }, + { IPv4(195,176,139,0),24 }, + { IPv4(195,176,156,0),23 }, + { IPv4(195,182,0,0),19 }, + { IPv4(195,182,96,0),19 }, + { IPv4(195,183,0,0),16 }, + { IPv4(195,184,64,0),19 }, + { IPv4(195,184,128,0),19 }, + { IPv4(195,184,132,0),24 }, + { IPv4(195,184,137,0),24 }, + { IPv4(195,184,140,0),24 }, + { IPv4(195,184,146,0),24 }, + { IPv4(195,184,147,0),24 }, + { IPv4(195,184,158,0),24 }, + { IPv4(195,184,159,0),24 }, + { IPv4(195,184,224,0),19 }, + { IPv4(195,188,0,0),16 }, + { IPv4(195,190,32,0),19 }, + { IPv4(195,190,160,0),19 }, + { IPv4(195,200,64,0),19 }, + { IPv4(195,200,128,0),19 }, + { IPv4(195,202,65,0),24 }, + { IPv4(195,202,68,0),24 }, + { IPv4(195,202,71,0),24 }, + { IPv4(195,202,73,0),24 }, + { IPv4(195,202,74,0),24 }, + { IPv4(195,202,79,0),24 }, + { IPv4(195,202,82,0),24 }, + { IPv4(195,202,83,0),24 }, + { IPv4(195,202,128,0),19 }, + { IPv4(195,202,160,0),19 }, + { IPv4(195,202,192,0),18 }, + { IPv4(195,206,64,0),19 }, + { IPv4(195,206,160,0),19 }, + { IPv4(195,210,0,0),19 }, + { IPv4(195,211,34,0),23 }, + { IPv4(195,211,99,0),24 }, + { IPv4(195,212,0,0),16 }, + { IPv4(195,213,0,0),16 }, + { IPv4(195,213,87,0),24 }, + { IPv4(195,214,128,0),19 }, + { IPv4(195,214,160,0),20 }, + { IPv4(195,214,176,0),21 }, + { IPv4(195,214,184,0),22 }, + { IPv4(195,218,96,0),19 }, + { IPv4(195,224,0,0),16 }, + { IPv4(195,226,0,0),22 }, + { IPv4(195,226,128,0),19 }, + { IPv4(195,230,0,0),22 }, + { IPv4(195,230,4,0),23 }, + { IPv4(195,230,6,0),24 }, + { IPv4(195,230,7,0),24 }, + { IPv4(195,230,8,0),21 }, + { IPv4(195,230,16,0),20 }, + { IPv4(195,240,0,0),16 }, + { IPv4(195,241,0,0),16 }, + { IPv4(195,244,224,0),19 }, + { IPv4(195,246,0,0),19 }, + { IPv4(195,246,96,0),19 }, + { IPv4(195,246,128,0),19 }, + { IPv4(195,246,204,0),23 }, + { IPv4(195,246,206,0),23 }, + { IPv4(195,248,192,0),24 }, + { IPv4(195,248,210,0),24 }, + { IPv4(195,248,220,0),24 }, + { IPv4(195,250,96,0),19 }, + { IPv4(196,1,32,0),24 }, + { IPv4(196,1,103,0),24 }, + { IPv4(196,1,130,0),24 }, + { IPv4(196,1,131,0),24 }, + { IPv4(196,1,132,0),24 }, + { IPv4(196,1,133,0),24 }, + { IPv4(196,2,0,0),24 }, + { IPv4(196,2,1,0),24 }, + { IPv4(196,3,0,0),24 }, + { IPv4(196,3,1,0),24 }, + { IPv4(196,3,2,0),24 }, + { IPv4(196,3,3,0),24 }, + { IPv4(196,3,4,0),24 }, + { IPv4(196,3,5,0),24 }, + { IPv4(196,3,6,0),24 }, + { IPv4(196,3,7,0),24 }, + { IPv4(196,3,47,0),24 }, + { IPv4(196,3,51,0),24 }, + { IPv4(196,3,54,0),24 }, + { IPv4(196,3,95,0),24 }, + { IPv4(196,3,113,0),24 }, + { IPv4(196,3,114,0),24 }, + { IPv4(196,3,115,0),24 }, + { IPv4(196,3,124,0),22 }, + { IPv4(196,3,128,0),22 }, + { IPv4(196,3,156,0),23 }, + { IPv4(196,3,159,0),24 }, + { IPv4(196,3,164,0),22 }, + { IPv4(196,3,168,0),21 }, + { IPv4(196,3,176,0),22 }, + { IPv4(196,3,193,0),24 }, + { IPv4(196,3,198,0),24 }, + { IPv4(196,3,199,0),24 }, + { IPv4(196,3,218,0),23 }, + { IPv4(196,3,220,0),24 }, + { IPv4(196,3,221,0),24 }, + { IPv4(196,4,2,0),24 }, + { IPv4(196,4,20,0),22 }, + { IPv4(196,4,24,0),22 }, + { IPv4(196,4,28,0),23 }, + { IPv4(196,4,49,0),24 }, + { IPv4(196,4,51,0),24 }, + { IPv4(196,4,53,0),24 }, + { IPv4(196,4,58,0),24 }, + { IPv4(196,4,61,0),24 }, + { IPv4(196,4,62,0),23 }, + { IPv4(196,4,64,0),22 }, + { IPv4(196,4,70,0),24 }, + { IPv4(196,4,71,0),24 }, + { IPv4(196,4,72,0),22 }, + { IPv4(196,4,76,0),24 }, + { IPv4(196,4,79,0),24 }, + { IPv4(196,4,81,0),24 }, + { IPv4(196,4,83,0),24 }, + { IPv4(196,4,84,0),24 }, + { IPv4(196,4,87,0),24 }, + { IPv4(196,4,88,0),22 }, + { IPv4(196,4,92,0),23 }, + { IPv4(196,4,95,0),24 }, + { IPv4(196,4,96,0),24 }, + { IPv4(196,4,97,0),24 }, + { IPv4(196,4,100,0),22 }, + { IPv4(196,4,104,0),24 }, + { IPv4(196,4,105,0),24 }, + { IPv4(196,4,143,0),24 }, + { IPv4(196,4,144,0),24 }, + { IPv4(196,4,145,0),24 }, + { IPv4(196,4,146,0),24 }, + { IPv4(196,4,162,0),23 }, + { IPv4(196,4,164,0),24 }, + { IPv4(196,4,165,0),24 }, + { IPv4(196,4,168,0),24 }, + { IPv4(196,4,172,0),24 }, + { IPv4(196,4,173,0),24 }, + { IPv4(196,4,174,0),23 }, + { IPv4(196,4,176,0),21 }, + { IPv4(196,4,184,0),22 }, + { IPv4(196,4,188,0),24 }, + { IPv4(196,4,212,0),22 }, + { IPv4(196,4,216,0),21 }, + { IPv4(196,4,224,0),21 }, + { IPv4(196,4,232,0),21 }, + { IPv4(196,4,239,0),24 }, + { IPv4(196,4,240,0),24 }, + { IPv4(196,4,240,0),21 }, + { IPv4(196,4,241,0),24 }, + { IPv4(196,4,242,0),24 }, + { IPv4(196,4,243,0),24 }, + { IPv4(196,4,244,0),24 }, + { IPv4(196,4,245,0),24 }, + { IPv4(196,4,246,0),24 }, + { IPv4(196,4,247,0),24 }, + { IPv4(196,4,248,0),24 }, + { IPv4(196,4,250,0),23 }, + { IPv4(196,5,0,0),16 }, + { IPv4(196,6,1,0),24 }, + { IPv4(196,6,121,0),24 }, + { IPv4(196,6,149,0),24 }, + { IPv4(196,6,150,0),24 }, + { IPv4(196,6,151,0),24 }, + { IPv4(196,6,153,0),24 }, + { IPv4(196,6,175,0),24 }, + { IPv4(196,6,176,0),23 }, + { IPv4(196,6,178,0),24 }, + { IPv4(196,6,183,0),24 }, + { IPv4(196,6,184,0),24 }, + { IPv4(196,6,196,0),24 }, + { IPv4(196,6,198,0),24 }, + { IPv4(196,6,199,0),24 }, + { IPv4(196,6,201,0),24 }, + { IPv4(196,6,208,0),24 }, + { IPv4(196,6,211,0),24 }, + { IPv4(196,6,212,0),23 }, + { IPv4(196,6,212,0),24 }, + { IPv4(196,6,213,0),24 }, + { IPv4(196,6,214,0),24 }, + { IPv4(196,6,220,0),23 }, + { IPv4(196,6,222,0),23 }, + { IPv4(196,6,237,0),24 }, + { IPv4(196,6,241,0),24 }, + { IPv4(196,6,242,0),24 }, + { IPv4(196,6,243,0),24 }, + { IPv4(196,6,251,0),24 }, + { IPv4(196,8,115,0),24 }, + { IPv4(196,9,0,0),16 }, + { IPv4(196,10,51,0),24 }, + { IPv4(196,10,96,0),24 }, + { IPv4(196,10,101,0),24 }, + { IPv4(196,10,104,0),24 }, + { IPv4(196,10,106,0),24 }, + { IPv4(196,10,107,0),24 }, + { IPv4(196,10,108,0),24 }, + { IPv4(196,10,110,0),24 }, + { IPv4(196,10,111,0),24 }, + { IPv4(196,10,112,0),22 }, + { IPv4(196,10,118,0),24 }, + { IPv4(196,10,119,0),24 }, + { IPv4(196,10,121,0),24 }, + { IPv4(196,10,122,0),23 }, + { IPv4(196,10,124,0),22 }, + { IPv4(196,10,130,0),23 }, + { IPv4(196,10,132,0),22 }, + { IPv4(196,10,136,0),22 }, + { IPv4(196,10,140,0),22 }, + { IPv4(196,10,150,0),23 }, + { IPv4(196,10,152,0),21 }, + { IPv4(196,10,160,0),19 }, + { IPv4(196,10,192,0),21 }, + { IPv4(196,10,203,0),24 }, + { IPv4(196,10,204,0),22 }, + { IPv4(196,10,208,0),22 }, + { IPv4(196,10,212,0),23 }, + { IPv4(196,10,224,0),24 }, + { IPv4(196,10,229,0),24 }, + { IPv4(196,10,231,0),24 }, + { IPv4(196,10,248,0),23 }, + { IPv4(196,10,249,0),24 }, + { IPv4(196,10,251,0),24 }, + { IPv4(196,10,252,0),23 }, + { IPv4(196,10,254,0),24 }, + { IPv4(196,11,0,0),20 }, + { IPv4(196,11,16,0),21 }, + { IPv4(196,11,24,0),22 }, + { IPv4(196,11,28,0),23 }, + { IPv4(196,11,30,0),24 }, + { IPv4(196,11,40,0),21 }, + { IPv4(196,11,57,0),24 }, + { IPv4(196,11,58,0),24 }, + { IPv4(196,11,61,0),24 }, + { IPv4(196,11,69,0),24 }, + { IPv4(196,11,70,0),24 }, + { IPv4(196,11,72,0),24 }, + { IPv4(196,11,98,0),24 }, + { IPv4(196,11,109,0),24 }, + { IPv4(196,11,110,0),23 }, + { IPv4(196,11,112,0),23 }, + { IPv4(196,11,114,0),24 }, + { IPv4(196,11,116,0),24 }, + { IPv4(196,11,122,0),24 }, + { IPv4(196,11,124,0),24 }, + { IPv4(196,11,127,0),24 }, + { IPv4(196,11,134,0),24 }, + { IPv4(196,11,135,0),24 }, + { IPv4(196,11,136,0),21 }, + { IPv4(196,11,144,0),23 }, + { IPv4(196,11,146,0),23 }, + { IPv4(196,11,148,0),23 }, + { IPv4(196,11,170,0),23 }, + { IPv4(196,11,172,0),23 }, + { IPv4(196,11,174,0),24 }, + { IPv4(196,11,188,0),23 }, + { IPv4(196,11,188,0),24 }, + { IPv4(196,11,190,0),24 }, + { IPv4(196,11,192,0),22 }, + { IPv4(196,11,196,0),24 }, + { IPv4(196,11,197,0),24 }, + { IPv4(196,11,200,0),22 }, + { IPv4(196,11,204,0),24 }, + { IPv4(196,11,205,0),24 }, + { IPv4(196,11,209,0),24 }, + { IPv4(196,11,233,0),24 }, + { IPv4(196,11,235,0),24 }, + { IPv4(196,11,239,0),24 }, + { IPv4(196,11,240,0),23 }, + { IPv4(196,11,243,0),24 }, + { IPv4(196,11,244,0),23 }, + { IPv4(196,11,251,0),24 }, + { IPv4(196,12,16,0),24 }, + { IPv4(196,12,160,0),24 }, + { IPv4(196,12,161,0),24 }, + { IPv4(196,12,162,0),24 }, + { IPv4(196,12,163,0),24 }, + { IPv4(196,12,164,0),24 }, + { IPv4(196,12,165,0),24 }, + { IPv4(196,12,166,0),24 }, + { IPv4(196,12,167,0),24 }, + { IPv4(196,12,168,0),24 }, + { IPv4(196,12,169,0),24 }, + { IPv4(196,12,170,0),24 }, + { IPv4(196,12,171,0),24 }, + { IPv4(196,12,172,0),24 }, + { IPv4(196,12,173,0),24 }, + { IPv4(196,12,174,0),24 }, + { IPv4(196,12,175,0),24 }, + { IPv4(196,12,176,0),24 }, + { IPv4(196,12,177,0),24 }, + { IPv4(196,12,178,0),24 }, + { IPv4(196,12,179,0),24 }, + { IPv4(196,12,180,0),24 }, + { IPv4(196,12,181,0),24 }, + { IPv4(196,12,182,0),24 }, + { IPv4(196,12,183,0),24 }, + { IPv4(196,12,184,0),24 }, + { IPv4(196,12,185,0),24 }, + { IPv4(196,12,186,0),24 }, + { IPv4(196,12,187,0),24 }, + { IPv4(196,12,188,0),24 }, + { IPv4(196,12,189,0),24 }, + { IPv4(196,12,190,0),24 }, + { IPv4(196,12,191,0),24 }, + { IPv4(196,13,1,0),24 }, + { IPv4(196,13,2,0),23 }, + { IPv4(196,13,4,0),22 }, + { IPv4(196,13,8,0),21 }, + { IPv4(196,13,16,0),21 }, + { IPv4(196,13,24,0),22 }, + { IPv4(196,13,28,0),23 }, + { IPv4(196,13,30,0),24 }, + { IPv4(196,13,31,0),24 }, + { IPv4(196,13,32,0),19 }, + { IPv4(196,13,64,0),20 }, + { IPv4(196,13,80,0),24 }, + { IPv4(196,13,93,0),24 }, + { IPv4(196,13,97,0),24 }, + { IPv4(196,13,101,0),24 }, + { IPv4(196,13,102,0),23 }, + { IPv4(196,13,104,0),24 }, + { IPv4(196,13,108,0),24 }, + { IPv4(196,13,113,0),24 }, + { IPv4(196,13,115,0),24 }, + { IPv4(196,13,118,0),24 }, + { IPv4(196,13,121,0),24 }, + { IPv4(196,13,125,0),24 }, + { IPv4(196,13,126,0),24 }, + { IPv4(196,13,127,0),24 }, + { IPv4(196,13,128,0),22 }, + { IPv4(196,13,132,0),24 }, + { IPv4(196,13,138,0),24 }, + { IPv4(196,13,139,0),24 }, + { IPv4(196,13,140,0),22 }, + { IPv4(196,13,144,0),22 }, + { IPv4(196,13,150,0),24 }, + { IPv4(196,13,151,0),24 }, + { IPv4(196,13,152,0),21 }, + { IPv4(196,13,160,0),24 }, + { IPv4(196,13,163,0),24 }, + { IPv4(196,13,164,0),24 }, + { IPv4(196,13,165,0),24 }, + { IPv4(196,13,169,0),24 }, + { IPv4(196,13,174,0),23 }, + { IPv4(196,13,176,0),21 }, + { IPv4(196,13,184,0),23 }, + { IPv4(196,13,187,0),24 }, + { IPv4(196,13,188,0),22 }, + { IPv4(196,13,192,0),22 }, + { IPv4(196,13,196,0),24 }, + { IPv4(196,13,200,0),22 }, + { IPv4(196,13,204,0),24 }, + { IPv4(196,13,213,0),24 }, + { IPv4(196,13,214,0),23 }, + { IPv4(196,13,216,0),23 }, + { IPv4(196,13,225,0),24 }, + { IPv4(196,13,226,0),23 }, + { IPv4(196,13,228,0),22 }, + { IPv4(196,13,232,0),24 }, + { IPv4(196,13,252,0),22 }, + { IPv4(196,14,0,0),16 }, + { IPv4(196,15,0,0),21 }, + { IPv4(196,21,0,0),16 }, + { IPv4(196,22,0,0),22 }, + { IPv4(196,22,32,0),24 }, + { IPv4(196,22,160,0),19 }, + { IPv4(196,22,162,0),24 }, + { IPv4(196,22,166,0),24 }, + { IPv4(196,22,170,0),24 }, + { IPv4(196,22,176,0),24 }, + { IPv4(196,22,181,0),24 }, + { IPv4(196,22,182,0),24 }, + { IPv4(196,22,183,0),24 }, + { IPv4(196,22,189,0),24 }, + { IPv4(196,23,0,0),16 }, + { IPv4(196,24,0,0),16 }, + { IPv4(196,26,0,0),16 }, + { IPv4(196,27,12,0),24 }, + { IPv4(196,27,15,0),24 }, + { IPv4(196,27,19,0),24 }, + { IPv4(196,27,40,0),22 }, + { IPv4(196,27,48,0),22 }, + { IPv4(196,28,5,0),24 }, + { IPv4(196,28,8,0),24 }, + { IPv4(196,28,16,0),20 }, + { IPv4(196,28,32,0),20 }, + { IPv4(196,28,64,0),19 }, + { IPv4(196,28,96,0),19 }, + { IPv4(196,29,6,0),24 }, + { IPv4(196,29,32,0),24 }, + { IPv4(196,29,33,0),24 }, + { IPv4(196,29,34,0),24 }, + { IPv4(196,29,35,0),24 }, + { IPv4(196,29,36,0),24 }, + { IPv4(196,29,37,0),24 }, + { IPv4(196,29,38,0),24 }, + { IPv4(196,29,39,0),24 }, + { IPv4(196,32,0,0),21 }, + { IPv4(196,33,0,0),16 }, + { IPv4(196,34,0,0),15 }, + { IPv4(196,36,0,0),16 }, + { IPv4(196,37,0,0),16 }, + { IPv4(196,38,0,0),16 }, + { IPv4(196,39,0,0),17 }, + { IPv4(196,41,67,0),24 }, + { IPv4(196,41,128,0),19 }, + { IPv4(196,41,160,0),20 }, + { IPv4(196,41,171,0),24 }, + { IPv4(196,41,192,0),19 }, + { IPv4(196,43,0,0),18 }, + { IPv4(196,44,0,0),19 }, + { IPv4(198,1,32,0),20 }, + { IPv4(198,1,35,0),24 }, + { IPv4(198,1,36,0),23 }, + { IPv4(198,1,48,0),22 }, + { IPv4(198,3,16,0),20 }, + { IPv4(198,3,122,0),24 }, + { IPv4(198,3,124,0),24 }, + { IPv4(198,4,44,0),24 }, + { IPv4(198,4,64,0),20 }, + { IPv4(198,5,5,0),24 }, + { IPv4(198,5,6,0),24 }, + { IPv4(198,5,222,0),23 }, + { IPv4(198,6,80,0),24 }, + { IPv4(198,6,95,0),24 }, + { IPv4(198,6,196,0),24 }, + { IPv4(198,6,245,0),24 }, + { IPv4(198,6,255,0),24 }, + { IPv4(198,7,0,0),21 }, + { IPv4(198,7,128,0),18 }, + { IPv4(198,7,142,0),24 }, + { IPv4(198,8,16,0),20 }, + { IPv4(198,8,32,0),20 }, + { IPv4(198,8,48,0),21 }, + { IPv4(198,8,56,0),24 }, + { IPv4(198,8,64,0),22 }, + { IPv4(198,8,68,0),23 }, + { IPv4(198,9,0,0),16 }, + { IPv4(198,10,0,0),16 }, + { IPv4(198,11,16,0),20 }, + { IPv4(198,11,32,0),19 }, + { IPv4(198,11,57,0),24 }, + { IPv4(198,11,58,0),24 }, + { IPv4(198,14,32,0),19 }, + { IPv4(198,17,5,0),24 }, + { IPv4(198,17,37,0),24 }, + { IPv4(198,17,39,0),24 }, + { IPv4(198,17,40,0),24 }, + { IPv4(198,17,46,0),24 }, + { IPv4(198,17,47,0),24 }, + { IPv4(198,17,57,0),24 }, + { IPv4(198,17,59,0),24 }, + { IPv4(198,17,62,0),24 }, + { IPv4(198,17,81,0),24 }, + { IPv4(198,17,101,0),24 }, + { IPv4(198,17,107,0),24 }, + { IPv4(198,17,138,0),24 }, + { IPv4(198,17,144,0),24 }, + { IPv4(198,17,145,0),24 }, + { IPv4(198,17,150,0),23 }, + { IPv4(198,17,169,0),24 }, + { IPv4(198,17,176,0),24 }, + { IPv4(198,17,183,0),24 }, + { IPv4(198,17,184,0),24 }, + { IPv4(198,17,184,0),23 }, + { IPv4(198,17,186,0),24 }, + { IPv4(198,17,189,0),24 }, + { IPv4(198,17,191,0),24 }, + { IPv4(198,17,192,0),23 }, + { IPv4(198,17,194,0),24 }, + { IPv4(198,17,200,0),24 }, + { IPv4(198,17,205,0),24 }, + { IPv4(198,17,235,0),24 }, + { IPv4(198,17,242,0),24 }, + { IPv4(198,17,243,0),24 }, + { IPv4(198,17,247,0),24 }, + { IPv4(198,17,249,0),24 }, + { IPv4(198,20,8,0),21 }, + { IPv4(198,22,5,0),24 }, + { IPv4(198,22,6,0),23 }, + { IPv4(198,22,8,0),23 }, + { IPv4(198,22,19,0),24 }, + { IPv4(198,22,28,0),24 }, + { IPv4(198,22,41,0),24 }, + { IPv4(198,22,62,0),23 }, + { IPv4(198,22,64,0),22 }, + { IPv4(198,22,99,0),24 }, + { IPv4(198,22,109,0),24 }, + { IPv4(198,22,110,0),24 }, + { IPv4(198,22,121,0),24 }, + { IPv4(198,22,129,0),24 }, + { IPv4(198,22,133,0),24 }, + { IPv4(198,22,137,0),24 }, + { IPv4(198,22,146,0),24 }, + { IPv4(198,22,176,0),24 }, + { IPv4(198,22,229,0),24 }, + { IPv4(198,22,230,0),24 }, + { IPv4(198,22,249,0),24 }, + { IPv4(198,24,6,0),24 }, + { IPv4(198,25,0,0),16 }, + { IPv4(198,25,24,0),24 }, + { IPv4(198,25,35,0),24 }, + { IPv4(198,25,42,0),24 }, + { IPv4(198,25,48,0),24 }, + { IPv4(198,25,50,0),24 }, + { IPv4(198,25,67,0),24 }, + { IPv4(198,25,72,0),24 }, + { IPv4(198,25,102,0),24 }, + { IPv4(198,25,141,0),24 }, + { IPv4(198,25,142,0),24 }, + { IPv4(198,25,143,0),24 }, + { IPv4(198,25,150,0),24 }, + { IPv4(198,25,190,0),24 }, + { IPv4(198,25,191,0),24 }, + { IPv4(198,25,192,0),24 }, + { IPv4(198,25,195,0),24 }, + { IPv4(198,25,197,0),24 }, + { IPv4(198,25,199,0),24 }, + { IPv4(198,25,202,0),24 }, + { IPv4(198,25,212,0),24 }, + { IPv4(198,25,230,0),24 }, + { IPv4(198,25,231,0),24 }, + { IPv4(198,25,232,0),24 }, + { IPv4(198,25,236,0),24 }, + { IPv4(198,25,237,0),24 }, + { IPv4(198,25,239,0),24 }, + { IPv4(198,25,240,0),24 }, + { IPv4(198,25,242,0),24 }, + { IPv4(198,25,243,0),24 }, + { IPv4(198,26,0,0),16 }, + { IPv4(198,26,118,0),24 }, + { IPv4(198,26,171,0),24 }, + { IPv4(198,26,172,0),24 }, + { IPv4(198,26,173,0),24 }, + { IPv4(198,26,174,0),24 }, + { IPv4(198,26,175,0),24 }, + { IPv4(198,26,177,0),24 }, + { IPv4(198,26,178,0),24 }, + { IPv4(198,26,180,0),24 }, + { IPv4(198,26,181,0),24 }, + { IPv4(198,26,182,0),24 }, + { IPv4(198,26,183,0),24 }, + { IPv4(198,26,186,0),24 }, + { IPv4(198,26,187,0),24 }, + { IPv4(198,26,188,0),24 }, + { IPv4(198,26,190,0),24 }, + { IPv4(198,26,192,0),24 }, + { IPv4(198,26,199,0),24 }, + { IPv4(198,26,227,0),24 }, + { IPv4(198,27,18,0),24 }, + { IPv4(198,27,24,0),24 }, + { IPv4(198,27,38,0),24 }, + { IPv4(198,27,47,0),24 }, + { IPv4(198,27,48,0),24 }, + { IPv4(198,27,54,0),24 }, + { IPv4(198,28,128,0),24 }, + { IPv4(198,29,0,0),22 }, + { IPv4(198,31,9,0),24 }, + { IPv4(198,31,31,0),24 }, + { IPv4(198,31,158,0),23 }, + { IPv4(198,31,232,0),23 }, + { IPv4(198,31,238,0),24 }, + { IPv4(198,31,238,0),23 }, + { IPv4(198,31,239,0),24 }, + { IPv4(198,32,42,0),24 }, + { IPv4(198,32,64,0),24 }, + { IPv4(198,32,114,0),24 }, + { IPv4(198,32,128,0),24 }, + { IPv4(198,32,136,0),24 }, + { IPv4(198,32,139,0),24 }, + { IPv4(198,32,176,0),24 }, + { IPv4(198,32,177,0),24 }, + { IPv4(198,32,184,0),24 }, + { IPv4(198,32,200,0),24 }, + { IPv4(198,32,212,0),24 }, + { IPv4(198,32,216,0),24 }, + { IPv4(198,32,220,0),24 }, + { IPv4(198,32,224,0),24 }, + { IPv4(198,32,248,0),24 }, + { IPv4(198,32,249,0),24 }, + { IPv4(198,32,251,0),24 }, + { IPv4(198,34,224,0),21 }, + { IPv4(198,35,1,0),24 }, + { IPv4(198,35,2,0),24 }, + { IPv4(198,35,3,0),24 }, + { IPv4(198,35,4,0),24 }, + { IPv4(198,35,5,0),24 }, + { IPv4(198,35,6,0),24 }, + { IPv4(198,35,7,0),24 }, + { IPv4(198,35,8,0),24 }, + { IPv4(198,35,9,0),24 }, + { IPv4(198,35,10,0),24 }, + { IPv4(198,35,11,0),24 }, + { IPv4(198,35,12,0),24 }, + { IPv4(198,35,13,0),24 }, + { IPv4(198,35,14,0),24 }, + { IPv4(198,35,15,0),24 }, + { IPv4(198,35,128,0),24 }, + { IPv4(198,36,16,0),21 }, + { IPv4(198,36,24,0),22 }, + { IPv4(198,36,180,0),23 }, + { IPv4(198,36,190,0),24 }, + { IPv4(198,37,16,0),21 }, + { IPv4(198,37,24,0),22 }, + { IPv4(198,38,8,0),22 }, + { IPv4(198,38,12,0),24 }, + { IPv4(198,40,16,0),21 }, + { IPv4(198,40,24,0),22 }, + { IPv4(198,40,28,0),23 }, + { IPv4(198,40,30,0),24 }, + { IPv4(198,41,0,0),24 }, + { IPv4(198,41,1,0),24 }, + { IPv4(198,41,3,0),24 }, + { IPv4(198,41,6,0),24 }, + { IPv4(198,41,8,0),24 }, + { IPv4(198,41,9,0),24 }, + { IPv4(198,41,10,0),24 }, + { IPv4(198,41,11,0),24 }, + { IPv4(198,43,100,0),24 }, + { IPv4(198,43,237,0),24 }, + { IPv4(198,45,18,0),24 }, + { IPv4(198,45,20,0),24 }, + { IPv4(198,45,22,0),24 }, + { IPv4(198,45,23,0),24 }, + { IPv4(198,45,24,0),24 }, + { IPv4(198,46,0,0),21 }, + { IPv4(198,46,8,0),24 }, + { IPv4(198,46,9,0),24 }, + { IPv4(198,46,75,0),24 }, + { IPv4(198,48,16,0),23 }, + { IPv4(198,48,16,0),24 }, + { IPv4(198,48,17,0),24 }, + { IPv4(198,49,22,0),24 }, + { IPv4(198,49,45,0),24 }, + { IPv4(198,49,92,0),23 }, + { IPv4(198,49,103,0),24 }, + { IPv4(198,49,104,0),24 }, + { IPv4(198,49,114,0),24 }, + { IPv4(198,49,120,0),22 }, + { IPv4(198,49,143,0),24 }, + { IPv4(198,49,144,0),23 }, + { IPv4(198,49,168,0),23 }, + { IPv4(198,49,174,0),24 }, + { IPv4(198,49,182,0),24 }, + { IPv4(198,49,183,0),24 }, + { IPv4(198,49,184,0),21 }, + { IPv4(198,49,192,0),24 }, + { IPv4(198,49,205,0),24 }, + { IPv4(198,49,206,0),24 }, + { IPv4(198,49,207,0),24 }, + { IPv4(198,49,208,0),24 }, + { IPv4(198,49,224,0),21 }, + { IPv4(198,49,232,0),22 }, + { IPv4(198,49,236,0),24 }, + { IPv4(198,49,239,0),24 }, + { IPv4(198,49,240,0),24 }, + { IPv4(198,49,241,0),24 }, + { IPv4(198,50,1,0),24 }, + { IPv4(198,50,7,0),24 }, + { IPv4(198,50,9,0),24 }, + { IPv4(198,51,13,0),24 }, + { IPv4(198,51,14,0),24 }, + { IPv4(198,51,35,0),24 }, + { IPv4(198,51,72,0),24 }, + { IPv4(198,51,90,0),24 }, + { IPv4(198,51,93,0),24 }, + { IPv4(198,51,94,0),24 }, + { IPv4(198,51,109,0),24 }, + { IPv4(198,51,141,0),24 }, + { IPv4(198,51,170,0),23 }, + { IPv4(198,51,173,0),24 }, + { IPv4(198,51,177,0),24 }, + { IPv4(198,51,178,0),24 }, + { IPv4(198,51,184,0),23 }, + { IPv4(198,51,191,0),24 }, + { IPv4(198,51,192,0),24 }, + { IPv4(198,51,193,0),24 }, + { IPv4(198,51,209,0),24 }, + { IPv4(198,51,210,0),24 }, + { IPv4(198,51,214,0),24 }, + { IPv4(198,51,215,0),24 }, + { IPv4(198,51,234,0),24 }, + { IPv4(198,51,237,0),24 }, + { IPv4(198,51,238,0),24 }, + { IPv4(198,51,239,0),24 }, + { IPv4(198,51,241,0),24 }, + { IPv4(198,52,0,0),22 }, + { IPv4(198,53,26,0),23 }, + { IPv4(198,53,26,0),24 }, + { IPv4(198,54,20,0),22 }, + { IPv4(198,54,24,0),21 }, + { IPv4(198,54,32,0),21 }, + { IPv4(198,54,40,0),23 }, + { IPv4(198,54,58,0),24 }, + { IPv4(198,54,64,0),24 }, + { IPv4(198,54,65,0),24 }, + { IPv4(198,54,66,0),24 }, + { IPv4(198,54,68,0),24 }, + { IPv4(198,54,71,0),24 }, + { IPv4(198,54,72,0),22 }, + { IPv4(198,54,80,0),24 }, + { IPv4(198,54,82,0),24 }, + { IPv4(198,54,83,0),24 }, + { IPv4(198,54,84,0),24 }, + { IPv4(198,54,90,0),23 }, + { IPv4(198,54,92,0),24 }, + { IPv4(198,54,149,0),24 }, + { IPv4(198,54,154,0),23 }, + { IPv4(198,54,155,0),24 }, + { IPv4(198,54,156,0),22 }, + { IPv4(198,54,160,0),23 }, + { IPv4(198,54,162,0),24 }, + { IPv4(198,54,163,0),24 }, + { IPv4(198,54,165,0),24 }, + { IPv4(198,54,170,0),24 }, + { IPv4(198,54,173,0),24 }, + { IPv4(198,54,174,0),24 }, + { IPv4(198,54,184,0),22 }, + { IPv4(198,54,188,0),23 }, + { IPv4(198,54,192,0),22 }, + { IPv4(198,54,196,0),24 }, + { IPv4(198,54,202,0),24 }, + { IPv4(198,54,219,0),24 }, + { IPv4(198,54,222,0),23 }, + { IPv4(198,54,225,0),24 }, + { IPv4(198,54,234,0),24 }, + { IPv4(198,54,253,0),24 }, + { IPv4(198,55,4,0),24 }, + { IPv4(198,55,8,0),21 }, + { IPv4(198,55,64,0),20 }, + { IPv4(198,55,69,0),24 }, + { IPv4(198,55,80,0),21 }, + { IPv4(198,55,84,0),24 }, + { IPv4(198,55,85,0),24 }, + { IPv4(198,55,86,0),24 }, + { IPv4(198,55,87,0),24 }, + { IPv4(198,55,88,0),22 }, + { IPv4(198,55,89,0),24 }, + { IPv4(198,55,92,0),23 }, + { IPv4(198,55,93,0),24 }, + { IPv4(198,56,0,0),21 }, + { IPv4(198,57,64,0),20 }, + { IPv4(198,58,0,0),24 }, + { IPv4(198,58,1,0),24 }, + { IPv4(198,58,16,0),22 }, + { IPv4(198,58,16,0),21 }, + { IPv4(198,58,20,0),22 }, + { IPv4(198,58,24,0),22 }, + { IPv4(198,58,24,0),23 }, + { IPv4(198,58,26,0),23 }, + { IPv4(198,58,37,0),24 }, + { IPv4(198,58,38,0),24 }, + { IPv4(198,58,64,0),21 }, + { IPv4(198,58,64,0),22 }, + { IPv4(198,58,68,0),22 }, + { IPv4(198,58,70,0),24 }, + { IPv4(198,58,71,0),24 }, + { IPv4(198,59,0,0),18 }, + { IPv4(198,59,2,0),24 }, + { IPv4(198,59,7,0),24 }, + { IPv4(198,59,36,0),24 }, + { IPv4(198,59,40,0),24 }, + { IPv4(198,59,46,0),24 }, + { IPv4(198,59,47,0),24 }, + { IPv4(198,59,48,0),24 }, + { IPv4(198,59,49,0),24 }, + { IPv4(198,59,54,0),24 }, + { IPv4(198,59,55,0),24 }, + { IPv4(198,59,59,0),24 }, + { IPv4(198,59,61,0),24 }, + { IPv4(198,59,64,0),19 }, + { IPv4(198,59,69,0),24 }, + { IPv4(198,59,70,0),24 }, + { IPv4(198,59,81,0),24 }, + { IPv4(198,59,82,0),24 }, + { IPv4(198,59,83,0),24 }, + { IPv4(198,59,87,0),24 }, + { IPv4(198,59,89,0),24 }, + { IPv4(198,59,93,0),24 }, + { IPv4(198,60,0,0),18 }, + { IPv4(198,60,1,0),24 }, + { IPv4(198,60,3,0),24 }, + { IPv4(198,60,4,0),24 }, + { IPv4(198,60,5,0),24 }, + { IPv4(198,60,9,0),24 }, + { IPv4(198,60,17,0),24 }, + { IPv4(198,60,22,0),24 }, + { IPv4(198,60,64,0),19 }, + { IPv4(198,60,72,0),22 }, + { IPv4(198,60,80,0),23 }, + { IPv4(198,60,82,0),24 }, + { IPv4(198,60,84,0),24 }, + { IPv4(198,60,85,0),24 }, + { IPv4(198,60,86,0),23 }, + { IPv4(198,60,88,0),22 }, + { IPv4(198,60,92,0),24 }, + { IPv4(198,60,93,0),24 }, + { IPv4(198,60,94,0),24 }, + { IPv4(198,60,95,0),24 }, + { IPv4(198,60,96,0),20 }, + { IPv4(198,60,96,0),24 }, + { IPv4(198,60,97,0),24 }, + { IPv4(198,60,98,0),24 }, + { IPv4(198,60,99,0),24 }, + { IPv4(198,60,100,0),24 }, + { IPv4(198,60,101,0),24 }, + { IPv4(198,60,102,0),24 }, + { IPv4(198,60,103,0),24 }, + { IPv4(198,60,104,0),24 }, + { IPv4(198,60,105,0),24 }, + { IPv4(198,60,109,0),24 }, + { IPv4(198,60,110,0),24 }, + { IPv4(198,60,112,0),21 }, + { IPv4(198,60,114,0),24 }, + { IPv4(198,60,121,0),24 }, + { IPv4(198,60,122,0),23 }, + { IPv4(198,60,124,0),22 }, + { IPv4(198,60,129,0),24 }, + { IPv4(198,60,132,0),24 }, + { IPv4(198,60,143,0),24 }, + { IPv4(198,60,144,0),20 }, + { IPv4(198,60,148,0),24 }, + { IPv4(198,60,152,0),24 }, + { IPv4(198,60,159,0),24 }, + { IPv4(198,60,160,0),19 }, + { IPv4(198,60,183,0),24 }, + { IPv4(198,60,186,0),24 }, + { IPv4(198,60,195,0),24 }, + { IPv4(198,60,217,0),24 }, + { IPv4(198,60,218,0),23 }, + { IPv4(198,60,220,0),22 }, + { IPv4(198,60,224,0),22 }, + { IPv4(198,60,251,0),24 }, + { IPv4(198,61,16,0),20 }, + { IPv4(198,62,8,0),24 }, + { IPv4(198,62,9,0),24 }, + { IPv4(198,62,10,0),24 }, + { IPv4(198,62,11,0),24 }, + { IPv4(198,62,64,0),24 }, + { IPv4(198,62,65,0),24 }, + { IPv4(198,62,66,0),24 }, + { IPv4(198,62,106,0),24 }, + { IPv4(198,62,112,0),24 }, + { IPv4(198,62,120,0),23 }, + { IPv4(198,62,142,0),24 }, + { IPv4(198,62,155,0),24 }, + { IPv4(198,62,160,0),24 }, + { IPv4(198,62,186,0),24 }, + { IPv4(198,62,187,0),24 }, + { IPv4(198,62,198,0),24 }, + { IPv4(198,62,205,0),24 }, + { IPv4(198,62,209,0),24 }, + { IPv4(198,62,210,0),24 }, + { IPv4(198,62,212,0),24 }, + { IPv4(198,62,230,0),24 }, + { IPv4(198,62,231,0),24 }, + { IPv4(198,62,232,0),24 }, + { IPv4(198,62,233,0),24 }, + { IPv4(198,62,242,0),24 }, + { IPv4(198,62,246,0),23 }, + { IPv4(198,62,248,0),23 }, + { IPv4(198,62,250,0),24 }, + { IPv4(198,63,0,0),16 }, + { IPv4(198,63,24,0),24 }, + { IPv4(198,63,193,0),24 }, + { IPv4(198,63,227,0),24 }, + { IPv4(198,64,0,0),15 }, + { IPv4(198,64,127,0),24 }, + { IPv4(198,65,199,0),24 }, + { IPv4(198,66,0,0),16 }, + { IPv4(198,67,15,0),24 }, + { IPv4(198,67,33,0),24 }, + { IPv4(198,67,38,0),24 }, + { IPv4(198,68,64,0),18 }, + { IPv4(198,68,128,0),20 }, + { IPv4(198,68,144,0),20 }, + { IPv4(198,68,164,0),22 }, + { IPv4(198,68,168,0),21 }, + { IPv4(198,68,181,0),24 }, + { IPv4(198,68,193,0),24 }, + { IPv4(198,68,224,0),20 }, + { IPv4(198,69,2,0),23 }, + { IPv4(198,69,26,0),24 }, + { IPv4(198,69,80,0),23 }, + { IPv4(198,69,82,0),24 }, + { IPv4(198,69,84,0),22 }, + { IPv4(198,69,88,0),21 }, + { IPv4(198,69,90,0),24 }, + { IPv4(198,69,131,0),24 }, + { IPv4(198,69,134,0),24 }, + { IPv4(198,69,184,0),23 }, + { IPv4(198,69,186,0),23 }, + { IPv4(198,69,188,0),22 }, + { IPv4(198,69,191,0),24 }, + { IPv4(198,70,176,0),20 }, + { IPv4(198,70,195,0),24 }, + { IPv4(198,70,196,0),22 }, + { IPv4(198,70,209,0),24 }, + { IPv4(198,70,220,0),23 }, + { IPv4(198,70,222,0),23 }, + { IPv4(198,70,224,0),20 }, + { IPv4(198,70,240,0),23 }, + { IPv4(198,70,242,0),24 }, + { IPv4(198,70,243,0),24 }, + { IPv4(198,70,244,0),23 }, + { IPv4(198,72,0,0),22 }, + { IPv4(198,72,5,0),24 }, + { IPv4(198,72,8,0),22 }, + { IPv4(198,72,12,0),24 }, + { IPv4(198,72,32,0),21 }, + { IPv4(198,72,40,0),23 }, + { IPv4(198,72,64,0),21 }, + { IPv4(198,72,72,0),22 }, + { IPv4(198,73,137,0),24 }, + { IPv4(198,73,138,0),24 }, + { IPv4(198,73,139,0),24 }, + { IPv4(198,73,176,0),24 }, + { IPv4(198,73,190,0),24 }, + { IPv4(198,73,248,0),24 }, + { IPv4(198,73,249,0),24 }, + { IPv4(198,73,252,0),24 }, + { IPv4(198,73,253,0),24 }, + { IPv4(198,74,16,0),24 }, + { IPv4(198,74,18,0),24 }, + { IPv4(198,74,20,0),24 }, + { IPv4(198,74,22,0),24 }, + { IPv4(198,74,24,0),24 }, + { IPv4(198,74,25,0),24 }, + { IPv4(198,74,26,0),24 }, + { IPv4(198,74,32,0),21 }, + { IPv4(198,74,40,0),23 }, + { IPv4(198,76,23,0),24 }, + { IPv4(198,76,29,0),24 }, + { IPv4(198,76,30,0),24 }, + { IPv4(198,76,31,0),24 }, + { IPv4(198,76,126,0),23 }, + { IPv4(198,76,162,0),24 }, + { IPv4(198,76,176,0),23 }, + { IPv4(198,76,178,0),24 }, + { IPv4(198,77,0,0),18 }, + { IPv4(198,77,32,0),23 }, + { IPv4(198,77,54,0),23 }, + { IPv4(198,77,56,0),22 }, + { IPv4(198,77,66,0),24 }, + { IPv4(198,77,86,0),23 }, + { IPv4(198,77,104,0),24 }, + { IPv4(198,77,105,0),24 }, + { IPv4(198,77,106,0),24 }, + { IPv4(198,77,110,0),24 }, + { IPv4(198,77,112,0),22 }, + { IPv4(198,77,136,0),24 }, + { IPv4(198,77,248,0),23 }, + { IPv4(198,78,8,0),21 }, + { IPv4(198,78,80,0),20 }, + { IPv4(198,78,96,0),20 }, + { IPv4(198,78,137,0),24 }, + { IPv4(198,78,138,0),24 }, + { IPv4(198,78,224,0),20 }, + { IPv4(198,79,24,0),22 }, + { IPv4(198,79,88,0),21 }, + { IPv4(198,80,0,0),23 }, + { IPv4(198,80,15,0),24 }, + { IPv4(198,80,20,0),24 }, + { IPv4(198,80,56,0),24 }, + { IPv4(198,80,57,0),24 }, + { IPv4(198,80,58,0),24 }, + { IPv4(198,80,59,0),24 }, + { IPv4(198,80,68,0),22 }, + { IPv4(198,80,88,0),21 }, + { IPv4(198,80,129,0),24 }, + { IPv4(198,80,130,0),24 }, + { IPv4(198,80,132,0),24 }, + { IPv4(198,80,135,0),24 }, + { IPv4(198,80,136,0),24 }, + { IPv4(198,80,137,0),24 }, + { IPv4(198,80,138,0),24 }, + { IPv4(198,80,139,0),24 }, + { IPv4(198,80,140,0),24 }, + { IPv4(198,80,142,0),24 }, + { IPv4(198,80,143,0),24 }, + { IPv4(198,80,144,0),24 }, + { IPv4(198,80,145,0),24 }, + { IPv4(198,80,146,0),24 }, + { IPv4(198,80,151,0),24 }, + { IPv4(198,80,152,0),24 }, + { IPv4(198,80,153,0),24 }, + { IPv4(198,80,155,0),24 }, + { IPv4(198,80,156,0),24 }, + { IPv4(198,80,157,0),24 }, + { IPv4(198,80,159,0),24 }, + { IPv4(198,80,160,0),24 }, + { IPv4(198,80,162,0),24 }, + { IPv4(198,80,164,0),24 }, + { IPv4(198,80,165,0),24 }, + { IPv4(198,80,167,0),24 }, + { IPv4(198,80,169,0),24 }, + { IPv4(198,80,170,0),24 }, + { IPv4(198,80,171,0),24 }, + { IPv4(198,80,172,0),24 }, + { IPv4(198,80,173,0),24 }, + { IPv4(198,80,174,0),24 }, + { IPv4(198,80,178,0),24 }, + { IPv4(198,80,180,0),24 }, + { IPv4(198,80,182,0),24 }, + { IPv4(198,80,183,0),24 }, + { IPv4(198,80,185,0),24 }, + { IPv4(198,80,186,0),24 }, + { IPv4(198,80,187,0),24 }, + { IPv4(198,80,189,0),24 }, + { IPv4(198,80,191,0),24 }, + { IPv4(198,81,0,0),19 }, + { IPv4(198,81,4,0),22 }, + { IPv4(198,81,16,0),20 }, + { IPv4(198,81,200,0),24 }, + { IPv4(198,81,230,0),24 }, + { IPv4(198,81,240,0),24 }, + { IPv4(198,83,19,0),24 }, + { IPv4(198,83,28,0),22 }, + { IPv4(198,83,112,0),20 }, + { IPv4(198,83,130,0),24 }, + { IPv4(198,84,16,0),20 }, + { IPv4(198,84,51,0),24 }, + { IPv4(198,84,52,0),24 }, + { IPv4(198,85,74,0),23 }, + { IPv4(198,85,116,0),24 }, + { IPv4(198,87,0,0),16 }, + { IPv4(198,88,0,0),16 }, + { IPv4(198,89,35,0),24 }, + { IPv4(198,89,36,0),24 }, + { IPv4(198,89,37,0),24 }, + { IPv4(198,89,138,0),24 }, + { IPv4(198,89,159,0),24 }, + { IPv4(198,89,160,0),24 }, + { IPv4(198,91,64,0),24 }, + { IPv4(198,91,65,0),24 }, + { IPv4(198,91,66,0),24 }, + { IPv4(198,91,67,0),24 }, + { IPv4(198,91,70,0),24 }, + { IPv4(198,91,71,0),24 }, + { IPv4(198,91,73,0),24 }, + { IPv4(198,92,64,0),22 }, + { IPv4(198,92,104,0),21 }, + { IPv4(198,92,156,0),23 }, + { IPv4(198,92,208,0),22 }, + { IPv4(198,93,92,0),22 }, + { IPv4(198,93,108,0),24 }, + { IPv4(198,93,109,0),24 }, + { IPv4(198,93,110,0),24 }, + { IPv4(198,93,111,0),24 }, + { IPv4(198,93,134,0),23 }, + { IPv4(198,93,136,0),22 }, + { IPv4(198,94,128,0),21 }, + { IPv4(198,95,8,0),23 }, + { IPv4(198,95,10,0),24 }, + { IPv4(198,95,64,0),21 }, + { IPv4(198,95,248,0),22 }, + { IPv4(198,96,2,0),24 }, + { IPv4(198,96,3,0),24 }, + { IPv4(198,96,18,0),23 }, + { IPv4(198,96,46,0),23 }, + { IPv4(198,96,48,0),21 }, + { IPv4(198,96,56,0),22 }, + { IPv4(198,96,60,0),24 }, + { IPv4(198,96,62,0),24 }, + { IPv4(198,96,80,0),22 }, + { IPv4(198,96,113,0),24 }, + { IPv4(198,96,127,0),24 }, + { IPv4(198,96,131,0),24 }, + { IPv4(198,96,185,0),24 }, + { IPv4(198,96,188,0),24 }, + { IPv4(198,96,199,0),24 }, + { IPv4(198,96,223,0),24 }, + { IPv4(198,96,251,0),24 }, + { IPv4(198,97,44,0),24 }, + { IPv4(198,97,52,0),23 }, + { IPv4(198,97,67,0),24 }, + { IPv4(198,97,70,0),23 }, + { IPv4(198,97,70,0),24 }, + { IPv4(198,97,72,0),21 }, + { IPv4(198,97,72,0),24 }, + { IPv4(198,97,79,0),24 }, + { IPv4(198,97,80,0),24 }, + { IPv4(198,97,80,0),20 }, + { IPv4(198,97,81,0),24 }, + { IPv4(198,97,82,0),23 }, + { IPv4(198,97,84,0),22 }, + { IPv4(198,97,88,0),24 }, + { IPv4(198,97,93,0),24 }, + { IPv4(198,97,96,0),19 }, + { IPv4(198,97,108,0),24 }, + { IPv4(198,97,110,0),24 }, + { IPv4(198,97,128,0),18 }, + { IPv4(198,97,135,0),24 }, + { IPv4(198,97,138,0),24 }, + { IPv4(198,97,143,0),24 }, + { IPv4(198,97,144,0),24 }, + { IPv4(198,97,151,0),24 }, + { IPv4(198,97,155,0),24 }, + { IPv4(198,97,192,0),20 }, + { IPv4(198,97,208,0),24 }, + { IPv4(198,97,208,0),23 }, + { IPv4(198,97,209,0),24 }, + { IPv4(198,97,234,0),23 }, + { IPv4(198,97,236,0),24 }, + { IPv4(198,97,240,0),20 }, + { IPv4(198,98,83,0),24 }, + { IPv4(198,99,85,0),24 }, + { IPv4(198,99,88,0),24 }, + { IPv4(198,99,89,0),24 }, + { IPv4(198,99,90,0),24 }, + { IPv4(198,99,106,0),24 }, + { IPv4(198,99,107,0),24 }, + { IPv4(198,99,108,0),24 }, + { IPv4(198,99,110,0),24 }, + { IPv4(198,99,115,0),24 }, + { IPv4(198,99,146,0),24 }, + { IPv4(198,99,191,0),24 }, + { IPv4(198,99,201,0),24 }, + { IPv4(198,99,225,0),24 }, + { IPv4(198,99,239,0),24 }, + { IPv4(198,99,244,0),24 }, + { IPv4(198,101,4,0),22 }, + { IPv4(198,101,23,0),24 }, + { IPv4(198,101,24,0),24 }, + { IPv4(198,101,32,0),20 }, + { IPv4(198,102,1,0),24 }, + { IPv4(198,102,2,0),23 }, + { IPv4(198,102,66,0),24 }, + { IPv4(198,102,67,0),24 }, + { IPv4(198,102,85,0),24 }, + { IPv4(198,102,86,0),23 }, + { IPv4(198,102,88,0),24 }, + { IPv4(198,102,91,0),24 }, + { IPv4(198,102,103,0),24 }, + { IPv4(198,102,112,0),24 }, + { IPv4(198,102,117,0),24 }, + { IPv4(198,102,147,0),24 }, + { IPv4(198,102,157,0),24 }, + { IPv4(198,102,172,0),24 }, + { IPv4(198,102,186,0),23 }, + { IPv4(198,102,188,0),23 }, + { IPv4(198,102,188,0),22 }, + { IPv4(198,102,190,0),23 }, + { IPv4(198,102,192,0),23 }, + { IPv4(198,102,192,0),22 }, + { IPv4(198,102,194,0),23 }, + { IPv4(198,102,196,0),24 }, + { IPv4(198,102,196,0),23 }, + { IPv4(198,102,198,0),23 }, + { IPv4(198,102,201,0),24 }, + { IPv4(198,102,206,0),24 }, + { IPv4(198,102,211,0),24 }, + { IPv4(198,102,244,0),24 }, + { IPv4(198,102,253,0),24 }, + { IPv4(198,102,254,0),24 }, + { IPv4(198,103,0,0),16 }, + { IPv4(198,103,1,0),24 }, + { IPv4(198,103,15,0),24 }, + { IPv4(198,103,18,0),24 }, + { IPv4(198,103,22,0),24 }, + { IPv4(198,103,37,0),24 }, + { IPv4(198,103,41,0),24 }, + { IPv4(198,103,42,0),24 }, + { IPv4(198,103,45,0),24 }, + { IPv4(198,103,49,0),24 }, + { IPv4(198,103,53,0),24 }, + { IPv4(198,103,55,0),24 }, + { IPv4(198,103,56,0),24 }, + { IPv4(198,103,61,0),24 }, + { IPv4(198,103,63,0),24 }, + { IPv4(198,103,92,0),24 }, + { IPv4(198,103,93,0),24 }, + { IPv4(198,103,94,0),24 }, + { IPv4(198,103,95,0),24 }, + { IPv4(198,103,96,0),24 }, + { IPv4(198,103,97,0),24 }, + { IPv4(198,103,98,0),24 }, + { IPv4(198,103,99,0),24 }, + { IPv4(198,103,101,0),24 }, + { IPv4(198,103,103,0),24 }, + { IPv4(198,103,104,0),24 }, + { IPv4(198,103,108,0),24 }, + { IPv4(198,103,109,0),24 }, + { IPv4(198,103,111,0),24 }, + { IPv4(198,103,138,0),24 }, + { IPv4(198,103,140,0),24 }, + { IPv4(198,103,143,0),24 }, + { IPv4(198,103,145,0),24 }, + { IPv4(198,103,146,0),24 }, + { IPv4(198,103,147,0),24 }, + { IPv4(198,103,152,0),24 }, + { IPv4(198,103,153,0),24 }, + { IPv4(198,103,154,0),24 }, + { IPv4(198,103,161,0),24 }, + { IPv4(198,103,162,0),24 }, + { IPv4(198,103,164,0),24 }, + { IPv4(198,103,167,0),24 }, + { IPv4(198,103,169,0),24 }, + { IPv4(198,103,171,0),24 }, + { IPv4(198,103,172,0),24 }, + { IPv4(198,103,174,0),24 }, + { IPv4(198,103,176,0),24 }, + { IPv4(198,103,177,0),24 }, + { IPv4(198,103,180,0),24 }, + { IPv4(198,103,185,0),24 }, + { IPv4(198,103,186,0),24 }, + { IPv4(198,103,191,0),24 }, + { IPv4(198,103,193,0),24 }, + { IPv4(198,103,194,0),24 }, + { IPv4(198,103,195,0),24 }, + { IPv4(198,103,196,0),24 }, + { IPv4(198,103,198,0),24 }, + { IPv4(198,103,206,0),24 }, + { IPv4(198,103,208,0),24 }, + { IPv4(198,103,211,0),24 }, + { IPv4(198,103,213,0),24 }, + { IPv4(198,103,214,0),24 }, + { IPv4(198,103,215,0),24 }, + { IPv4(198,103,216,0),24 }, + { IPv4(198,103,217,0),24 }, + { IPv4(198,103,218,0),24 }, + { IPv4(198,103,220,0),24 }, + { IPv4(198,103,222,0),24 }, + { IPv4(198,103,234,0),24 }, + { IPv4(198,103,235,0),24 }, + { IPv4(198,103,236,0),24 }, + { IPv4(198,103,237,0),24 }, + { IPv4(198,103,238,0),24 }, + { IPv4(198,103,241,0),24 }, + { IPv4(198,103,242,0),24 }, + { IPv4(198,103,244,0),24 }, + { IPv4(198,103,245,0),24 }, + { IPv4(198,103,248,0),24 }, + { IPv4(198,103,249,0),24 }, + { IPv4(198,103,250,0),24 }, + { IPv4(198,104,0,0),16 }, + { IPv4(198,105,2,0),24 }, + { IPv4(198,105,32,0),20 }, + { IPv4(198,105,64,0),20 }, + { IPv4(198,106,0,0),15 }, + { IPv4(198,108,16,0),22 }, + { IPv4(198,111,96,0),24 }, + { IPv4(198,112,169,0),24 }, + { IPv4(198,112,200,0),23 }, + { IPv4(198,113,60,0),24 }, + { IPv4(198,113,61,0),24 }, + { IPv4(198,116,0,0),14 }, + { IPv4(198,118,206,0),24 }, + { IPv4(198,119,23,0),24 }, + { IPv4(198,119,24,0),24 }, + { IPv4(198,119,27,0),25 }, + { IPv4(198,120,0,0),14 }, + { IPv4(198,124,0,0),14 }, + { IPv4(198,128,0,0),14 }, + { IPv4(198,133,16,0),24 }, + { IPv4(198,133,16,0),20 }, + { IPv4(198,133,36,0),24 }, + { IPv4(198,133,77,0),24 }, + { IPv4(198,133,79,0),24 }, + { IPv4(198,133,120,0),24 }, + { IPv4(198,133,123,0),24 }, + { IPv4(198,133,146,0),24 }, + { IPv4(198,133,170,0),24 }, + { IPv4(198,133,178,0),23 }, + { IPv4(198,133,180,0),22 }, + { IPv4(198,133,185,0),24 }, + { IPv4(198,133,198,0),24 }, + { IPv4(198,133,199,0),24 }, + { IPv4(198,133,206,0),24 }, + { IPv4(198,133,219,0),24 }, + { IPv4(198,133,233,0),24 }, + { IPv4(198,133,237,0),24 }, + { IPv4(198,133,242,0),24 }, + { IPv4(198,133,244,0),23 }, + { IPv4(198,133,246,0),24 }, + { IPv4(198,134,143,0),24 }, + { IPv4(198,134,148,0),24 }, + { IPv4(198,134,158,0),23 }, + { IPv4(198,134,196,0),24 }, + { IPv4(198,135,0,0),22 }, + { IPv4(198,135,4,0),22 }, + { IPv4(198,135,68,0),24 }, + { IPv4(198,135,78,0),24 }, + { IPv4(198,135,110,0),24 }, + { IPv4(198,135,118,0),23 }, + { IPv4(198,135,153,0),24 }, + { IPv4(198,135,222,0),24 }, + { IPv4(198,136,8,0),21 }, + { IPv4(198,136,139,0),24 }, + { IPv4(198,136,160,0),24 }, + { IPv4(198,136,186,0),24 }, + { IPv4(198,136,201,0),24 }, + { IPv4(198,136,226,0),24 }, + { IPv4(198,136,229,0),24 }, + { IPv4(198,136,233,0),24 }, + { IPv4(198,136,243,0),24 }, + { IPv4(198,136,250,0),24 }, + { IPv4(198,137,70,0),24 }, + { IPv4(198,137,99,0),24 }, + { IPv4(198,137,140,0),24 }, + { IPv4(198,137,142,0),24 }, + { IPv4(198,137,143,0),24 }, + { IPv4(198,137,147,0),24 }, + { IPv4(198,137,151,0),24 }, + { IPv4(198,137,152,0),23 }, + { IPv4(198,137,170,0),24 }, + { IPv4(198,137,181,0),24 }, + { IPv4(198,137,182,0),23 }, + { IPv4(198,137,186,0),24 }, + { IPv4(198,137,187,0),24 }, + { IPv4(198,137,194,0),24 }, + { IPv4(198,137,199,0),24 }, + { IPv4(198,137,200,0),24 }, + { IPv4(198,137,202,0),24 }, + { IPv4(198,137,221,0),24 }, + { IPv4(198,137,249,0),24 }, + { IPv4(198,137,254,0),24 }, + { IPv4(198,138,0,0),15 }, + { IPv4(198,138,53,0),24 }, + { IPv4(198,138,54,0),23 }, + { IPv4(198,138,56,0),22 }, + { IPv4(198,138,60,0),24 }, + { IPv4(198,138,103,0),24 }, + { IPv4(198,139,122,0),24 }, + { IPv4(198,139,128,0),24 }, + { IPv4(198,139,237,0),24 }, + { IPv4(198,140,0,0),22 }, + { IPv4(198,140,58,0),23 }, + { IPv4(198,140,63,0),24 }, + { IPv4(198,140,134,0),24 }, + { IPv4(198,140,179,0),24 }, + { IPv4(198,140,180,0),24 }, + { IPv4(198,140,189,0),24 }, + { IPv4(198,140,215,0),24 }, + { IPv4(198,143,8,0),24 }, + { IPv4(198,143,13,0),24 }, + { IPv4(198,143,16,0),24 }, + { IPv4(198,143,17,0),24 }, + { IPv4(198,143,18,0),24 }, + { IPv4(198,143,19,0),24 }, + { IPv4(198,143,20,0),24 }, + { IPv4(198,143,21,0),24 }, + { IPv4(198,143,22,0),24 }, + { IPv4(198,143,24,0),24 }, + { IPv4(198,144,128,0),20 }, + { IPv4(198,144,135,0),24 }, + { IPv4(198,144,192,0),20 }, + { IPv4(198,147,0,0),20 }, + { IPv4(198,147,37,0),24 }, + { IPv4(198,147,38,0),24 }, + { IPv4(198,147,75,0),24 }, + { IPv4(198,147,81,0),24 }, + { IPv4(198,147,91,0),24 }, + { IPv4(198,147,128,0),24 }, + { IPv4(198,147,137,0),24 }, + { IPv4(198,147,142,0),23 }, + { IPv4(198,147,147,0),24 }, + { IPv4(198,147,150,0),24 }, + { IPv4(198,147,151,0),24 }, + { IPv4(198,147,157,0),24 }, + { IPv4(198,147,162,0),24 }, + { IPv4(198,147,175,0),24 }, + { IPv4(198,147,200,0),23 }, + { IPv4(198,147,219,0),24 }, + { IPv4(198,147,224,0),24 }, + { IPv4(198,147,246,0),24 }, + { IPv4(198,148,166,0),24 }, + { IPv4(198,148,175,0),24 }, + { IPv4(198,148,190,0),24 }, + { IPv4(198,148,205,0),24 }, + { IPv4(198,148,206,0),24 }, + { IPv4(198,148,209,0),24 }, + { IPv4(198,148,239,0),24 }, + { IPv4(198,148,251,0),24 }, + { IPv4(198,149,2,0),24 }, + { IPv4(198,149,172,0),22 }, + { IPv4(198,151,130,0),24 }, + { IPv4(198,151,137,0),24 }, + { IPv4(198,151,139,0),24 }, + { IPv4(198,151,149,0),24 }, + { IPv4(198,151,160,0),24 }, + { IPv4(198,151,170,0),24 }, + { IPv4(198,151,171,0),24 }, + { IPv4(198,151,172,0),24 }, + { IPv4(198,151,175,0),24 }, + { IPv4(198,151,200,0),22 }, + { IPv4(198,151,212,0),24 }, + { IPv4(198,151,230,0),23 }, + { IPv4(198,151,248,0),24 }, + { IPv4(198,152,185,0),24 }, + { IPv4(198,153,8,0),21 }, + { IPv4(198,153,20,0),22 }, + { IPv4(198,153,31,0),24 }, + { IPv4(198,153,132,0),24 }, + { IPv4(198,153,146,0),24 }, + { IPv4(198,153,152,0),24 }, + { IPv4(198,153,219,0),24 }, + { IPv4(198,153,232,0),24 }, + { IPv4(198,154,2,0),23 }, + { IPv4(198,154,8,0),21 }, + { IPv4(198,154,16,0),24 }, + { IPv4(198,154,18,0),24 }, + { IPv4(198,154,19,0),24 }, + { IPv4(198,154,20,0),24 }, + { IPv4(198,154,21,0),24 }, + { IPv4(198,154,22,0),24 }, + { IPv4(198,154,23,0),24 }, + { IPv4(198,154,24,0),23 }, + { IPv4(198,154,24,0),24 }, + { IPv4(198,154,25,0),24 }, + { IPv4(198,154,64,0),21 }, + { IPv4(198,154,72,0),22 }, + { IPv4(198,154,77,0),24 }, + { IPv4(198,154,128,0),19 }, + { IPv4(198,154,150,0),24 }, + { IPv4(198,154,160,0),20 }, + { IPv4(198,154,173,0),24 }, + { IPv4(198,154,174,0),23 }, + { IPv4(198,154,176,0),23 }, + { IPv4(198,155,0,0),16 }, + { IPv4(198,160,18,0),24 }, + { IPv4(198,160,140,0),24 }, + { IPv4(198,160,177,0),24 }, + { IPv4(198,160,178,0),24 }, + { IPv4(198,160,179,0),24 }, + { IPv4(198,160,180,0),24 }, + { IPv4(198,160,196,0),24 }, + { IPv4(198,160,197,0),24 }, + { IPv4(198,160,246,0),24 }, + { IPv4(198,160,250,0),24 }, + { IPv4(198,160,252,0),24 }, + { IPv4(198,161,2,0),24 }, + { IPv4(198,161,22,0),24 }, + { IPv4(198,161,23,0),24 }, + { IPv4(198,161,82,0),24 }, + { IPv4(198,161,83,0),24 }, + { IPv4(198,161,180,0),24 }, + { IPv4(198,161,208,0),24 }, + { IPv4(198,161,210,0),24 }, + { IPv4(198,161,211,0),24 }, + { IPv4(198,161,216,0),24 }, + { IPv4(198,161,246,0),23 }, + { IPv4(198,162,70,0),24 }, + { IPv4(198,162,158,0),23 }, + { IPv4(198,162,232,0),22 }, + { IPv4(198,163,115,0),24 }, + { IPv4(198,163,184,0),21 }, + { IPv4(198,163,192,0),21 }, + { IPv4(198,163,200,0),21 }, + { IPv4(198,164,3,0),24 }, + { IPv4(198,164,7,0),24 }, + { IPv4(198,165,18,0),24 }, + { IPv4(198,165,39,0),24 }, + { IPv4(198,165,53,0),24 }, + { IPv4(198,165,56,0),23 }, + { IPv4(198,165,59,0),24 }, + { IPv4(198,165,60,0),23 }, + { IPv4(198,165,62,0),24 }, + { IPv4(198,165,72,0),23 }, + { IPv4(198,165,162,0),23 }, + { IPv4(198,165,185,0),24 }, + { IPv4(198,167,160,0),24 }, + { IPv4(198,167,161,0),24 }, + { IPv4(198,167,162,0),24 }, + { IPv4(198,167,163,0),24 }, + { IPv4(198,169,171,0),24 }, + { IPv4(198,169,181,0),24 }, + { IPv4(198,169,182,0),24 }, + { IPv4(198,169,183,0),24 }, + { IPv4(198,169,184,0),24 }, + { IPv4(198,170,0,0),15 }, + { IPv4(198,170,186,0),24 }, + { IPv4(198,170,208,0),24 }, + { IPv4(198,172,0,0),15 }, + { IPv4(198,174,0,0),16 }, + { IPv4(198,174,1,0),24 }, + { IPv4(198,174,2,0),23 }, + { IPv4(198,174,4,0),23 }, + { IPv4(198,174,6,0),24 }, + { IPv4(198,174,8,0),24 }, + { IPv4(198,174,48,0),24 }, + { IPv4(198,174,49,0),24 }, + { IPv4(198,174,50,0),24 }, + { IPv4(198,174,51,0),24 }, + { IPv4(198,174,52,0),24 }, + { IPv4(198,174,55,0),24 }, + { IPv4(198,174,65,0),24 }, + { IPv4(198,174,66,0),23 }, + { IPv4(198,174,68,0),22 }, + { IPv4(198,174,72,0),21 }, + { IPv4(198,174,80,0),20 }, + { IPv4(198,174,120,0),24 }, + { IPv4(198,174,121,0),24 }, + { IPv4(198,174,122,0),23 }, + { IPv4(198,174,124,0),22 }, + { IPv4(198,174,127,0),24 }, + { IPv4(198,174,128,0),22 }, + { IPv4(198,174,128,0),24 }, + { IPv4(198,174,132,0),24 }, + { IPv4(198,174,169,0),24 }, + { IPv4(198,174,176,0),20 }, + { IPv4(198,174,217,0),24 }, + { IPv4(198,174,218,0),23 }, + { IPv4(198,174,220,0),22 }, + { IPv4(198,174,224,0),21 }, + { IPv4(198,174,232,0),24 }, + { IPv4(198,175,9,0),24 }, + { IPv4(198,175,11,0),24 }, + { IPv4(198,175,14,0),24 }, + { IPv4(198,175,47,0),24 }, + { IPv4(198,175,48,0),24 }, + { IPv4(198,175,49,0),24 }, + { IPv4(198,175,56,0),24 }, + { IPv4(198,175,57,0),24 }, + { IPv4(198,175,60,0),24 }, + { IPv4(198,175,62,0),23 }, + { IPv4(198,175,62,0),24 }, + { IPv4(198,175,68,0),24 }, + { IPv4(198,175,70,0),23 }, + { IPv4(198,175,72,0),24 }, + { IPv4(198,175,76,0),24 }, + { IPv4(198,175,149,0),24 }, + { IPv4(198,175,158,0),24 }, + { IPv4(198,175,187,0),24 }, + { IPv4(198,175,194,0),23 }, + { IPv4(198,175,196,0),22 }, + { IPv4(198,175,202,0),24 }, + { IPv4(198,175,203,0),24 }, + { IPv4(198,175,204,0),24 }, + { IPv4(198,175,212,0),22 }, + { IPv4(198,175,236,0),24 }, + { IPv4(198,175,240,0),24 }, + { IPv4(198,175,250,0),24 }, + { IPv4(198,176,16,0),24 }, + { IPv4(198,176,17,0),24 }, + { IPv4(198,176,20,0),24 }, + { IPv4(198,176,21,0),24 }, + { IPv4(198,176,160,0),24 }, + { IPv4(198,176,170,0),24 }, + { IPv4(198,176,174,0),24 }, + { IPv4(198,176,184,0),24 }, + { IPv4(198,176,193,0),24 }, + { IPv4(198,176,199,0),24 }, + { IPv4(198,176,204,0),24 }, + { IPv4(198,176,217,0),24 }, + { IPv4(198,176,225,0),24 }, + { IPv4(198,176,247,0),24 }, + { IPv4(198,177,11,0),24 }, + { IPv4(198,177,12,0),24 }, + { IPv4(198,177,13,0),24 }, + { IPv4(198,177,14,0),24 }, + { IPv4(198,177,15,0),24 }, + { IPv4(198,177,32,0),20 }, + { IPv4(198,177,48,0),22 }, + { IPv4(198,177,169,0),24 }, + { IPv4(198,177,170,0),24 }, + { IPv4(198,177,171,0),24 }, + { IPv4(198,177,172,0),24 }, + { IPv4(198,177,173,0),24 }, + { IPv4(198,177,174,0),24 }, + { IPv4(198,177,180,0),23 }, + { IPv4(198,177,181,0),24 }, + { IPv4(198,177,191,0),24 }, + { IPv4(198,177,192,0),22 }, + { IPv4(198,177,196,0),23 }, + { IPv4(198,177,224,0),24 }, + { IPv4(198,177,229,0),24 }, + { IPv4(198,178,8,0),24 }, + { IPv4(198,178,9,0),24 }, + { IPv4(198,178,32,0),20 }, + { IPv4(198,178,32,0),21 }, + { IPv4(198,178,40,0),21 }, + { IPv4(198,178,48,0),22 }, + { IPv4(198,178,48,0),21 }, + { IPv4(198,178,52,0),22 }, + { IPv4(198,178,129,0),24 }, + { IPv4(198,178,148,0),24 }, + { IPv4(198,178,167,0),24 }, + { IPv4(198,178,186,0),24 }, + { IPv4(198,178,215,0),24 }, + { IPv4(198,178,217,0),24 }, + { IPv4(198,178,226,0),24 }, + { IPv4(198,178,232,0),24 }, + { IPv4(198,178,234,0),23 }, + { IPv4(198,178,236,0),22 }, + { IPv4(198,178,254,0),24 }, + { IPv4(198,179,16,0),24 }, + { IPv4(198,179,128,0),24 }, + { IPv4(198,179,140,0),24 }, + { IPv4(198,179,169,0),24 }, + { IPv4(198,179,170,0),24 }, + { IPv4(198,179,171,0),24 }, + { IPv4(198,179,172,0),24 }, + { IPv4(198,179,173,0),24 }, + { IPv4(198,179,201,0),24 }, + { IPv4(198,179,208,0),24 }, + { IPv4(198,179,214,0),24 }, + { IPv4(198,179,232,0),24 }, + { IPv4(198,179,239,0),24 }, + { IPv4(198,179,246,0),24 }, + { IPv4(198,179,248,0),24 }, + { IPv4(198,180,16,0),20 }, + { IPv4(198,180,36,0),24 }, + { IPv4(198,180,49,0),24 }, + { IPv4(198,180,67,0),24 }, + { IPv4(198,180,129,0),24 }, + { IPv4(198,180,136,0),24 }, + { IPv4(198,180,141,0),24 }, + { IPv4(198,180,147,0),24 }, + { IPv4(198,180,161,0),24 }, + { IPv4(198,180,162,0),24 }, + { IPv4(198,180,182,0),24 }, + { IPv4(198,180,183,0),24 }, + { IPv4(198,180,191,0),24 }, + { IPv4(198,180,205,0),24 }, + { IPv4(198,180,215,0),24 }, + { IPv4(198,180,219,0),24 }, + { IPv4(198,180,225,0),24 }, + { IPv4(198,180,252,0),24 }, + { IPv4(198,181,4,0),22 }, + { IPv4(198,181,8,0),24 }, + { IPv4(198,181,17,0),24 }, + { IPv4(198,181,18,0),23 }, + { IPv4(198,181,156,0),24 }, + { IPv4(198,181,161,0),24 }, + { IPv4(198,181,175,0),24 }, + { IPv4(198,181,219,0),24 }, + { IPv4(198,181,242,0),24 }, + { IPv4(198,181,243,0),24 }, + { IPv4(198,181,250,0),24 }, + { IPv4(198,182,8,0),21 }, + { IPv4(198,182,16,0),24 }, + { IPv4(198,182,21,0),24 }, + { IPv4(198,182,24,0),24 }, + { IPv4(198,182,25,0),24 }, + { IPv4(198,182,26,0),24 }, + { IPv4(198,182,28,0),24 }, + { IPv4(198,182,31,0),24 }, + { IPv4(198,182,76,0),24 }, + { IPv4(198,182,88,0),24 }, + { IPv4(198,182,89,0),24 }, + { IPv4(198,182,90,0),24 }, + { IPv4(198,182,91,0),24 }, + { IPv4(198,182,96,0),24 }, + { IPv4(198,182,97,0),24 }, + { IPv4(198,182,98,0),24 }, + { IPv4(198,182,99,0),24 }, + { IPv4(198,182,106,0),24 }, + { IPv4(198,182,107,0),24 }, + { IPv4(198,182,130,0),24 }, + { IPv4(198,182,131,0),24 }, + { IPv4(198,182,132,0),24 }, + { IPv4(198,182,133,0),24 }, + { IPv4(198,182,134,0),24 }, + { IPv4(198,182,140,0),24 }, + { IPv4(198,182,176,0),22 }, + { IPv4(198,182,178,0),24 }, + { IPv4(198,182,180,0),23 }, + { IPv4(198,182,196,0),24 }, + { IPv4(198,182,200,0),24 }, + { IPv4(198,182,201,0),24 }, + { IPv4(198,182,220,0),24 }, + { IPv4(198,182,225,0),24 }, + { IPv4(198,182,239,0),24 }, + { IPv4(198,183,8,0),21 }, + { IPv4(198,183,10,0),24 }, + { IPv4(198,183,128,0),22 }, + { IPv4(198,183,139,0),24 }, + { IPv4(198,183,146,0),23 }, + { IPv4(198,183,157,0),24 }, + { IPv4(198,183,160,0),22 }, + { IPv4(198,183,164,0),24 }, + { IPv4(198,183,165,0),24 }, + { IPv4(198,183,166,0),24 }, + { IPv4(198,183,167,0),24 }, + { IPv4(198,183,217,0),24 }, + { IPv4(198,183,218,0),24 }, + { IPv4(198,183,241,0),24 }, + { IPv4(198,184,66,0),24 }, + { IPv4(198,184,69,0),24 }, + { IPv4(198,184,85,0),24 }, + { IPv4(198,184,93,0),24 }, + { IPv4(198,184,118,0),24 }, + { IPv4(198,184,121,0),24 }, + { IPv4(198,184,126,0),24 }, + { IPv4(198,184,127,0),24 }, + { IPv4(198,184,134,0),24 }, + { IPv4(198,184,147,0),24 }, + { IPv4(198,184,150,0),24 }, + { IPv4(198,184,152,0),23 }, + { IPv4(198,184,171,0),24 }, + { IPv4(198,184,210,0),24 }, + { IPv4(198,184,211,0),24 }, + { IPv4(198,184,227,0),24 }, + { IPv4(198,185,4,0),22 }, + { IPv4(198,185,10,0),24 }, + { IPv4(198,185,22,0),24 }, + { IPv4(198,185,70,0),24 }, + { IPv4(198,185,72,0),24 }, + { IPv4(198,185,73,0),24 }, + { IPv4(198,185,104,0),24 }, + { IPv4(198,185,133,0),24 }, + { IPv4(198,185,134,0),23 }, + { IPv4(198,185,136,0),23 }, + { IPv4(198,185,163,0),24 }, + { IPv4(198,185,184,0),24 }, + { IPv4(198,185,205,0),24 }, + { IPv4(198,185,207,0),24 }, + { IPv4(198,185,234,0),24 }, + { IPv4(198,185,236,0),24 }, + { IPv4(198,186,48,0),22 }, + { IPv4(198,186,52,0),24 }, + { IPv4(198,186,53,0),24 }, + { IPv4(198,186,63,0),24 }, + { IPv4(198,186,64,0),24 }, + { IPv4(198,186,145,0),24 }, + { IPv4(198,186,151,0),24 }, + { IPv4(198,186,160,0),24 }, + { IPv4(198,186,167,0),24 }, + { IPv4(198,186,184,0),24 }, + { IPv4(198,186,200,0),22 }, + { IPv4(198,186,212,0),23 }, + { IPv4(198,186,213,0),24 }, + { IPv4(198,186,214,0),24 }, + { IPv4(198,186,237,0),24 }, + { IPv4(198,187,135,0),24 }, + { IPv4(198,187,136,0),24 }, + { IPv4(198,187,156,0),24 }, + { IPv4(198,187,203,0),24 }, + { IPv4(198,187,204,0),24 }, + { IPv4(198,187,215,0),24 }, + { IPv4(198,187,216,0),24 }, + { IPv4(198,187,220,0),24 }, + { IPv4(198,187,247,0),24 }, + { IPv4(198,187,252,0),24 }, + { IPv4(198,188,0,0),16 }, + { IPv4(198,188,7,0),24 }, + { IPv4(198,188,8,0),24 }, + { IPv4(198,188,49,0),24 }, + { IPv4(198,188,50,0),24 }, + { IPv4(198,188,160,0),19 }, + { IPv4(198,188,192,0),20 }, + { IPv4(198,188,208,0),23 }, + { IPv4(198,188,211,0),24 }, + { IPv4(198,188,212,0),22 }, + { IPv4(198,188,216,0),21 }, + { IPv4(198,188,224,0),20 }, + { IPv4(198,188,240,0),21 }, + { IPv4(198,188,252,0),23 }, + { IPv4(198,189,0,0),16 }, + { IPv4(198,190,28,0),24 }, + { IPv4(198,190,147,0),24 }, + { IPv4(198,190,166,0),24 }, + { IPv4(198,190,182,0),24 }, + { IPv4(198,190,187,0),24 }, + { IPv4(198,190,195,0),24 }, + { IPv4(198,190,201,0),24 }, + { IPv4(198,190,216,0),24 }, + { IPv4(198,190,219,0),24 }, + { IPv4(198,190,247,0),24 }, + { IPv4(198,190,249,0),24 }, + { IPv4(198,190,250,0),23 }, + { IPv4(198,190,252,0),24 }, + { IPv4(198,199,9,0),24 }, + { IPv4(198,199,13,0),24 }, + { IPv4(198,199,128,0),24 }, + { IPv4(198,199,136,0),24 }, + { IPv4(198,199,168,0),24 }, + { IPv4(198,199,179,0),24 }, + { IPv4(198,199,187,0),24 }, + { IPv4(198,199,191,0),24 }, + { IPv4(198,199,199,0),24 }, + { IPv4(198,199,206,0),24 }, + { IPv4(198,199,219,0),24 }, + { IPv4(198,199,224,0),24 }, + { IPv4(198,199,237,0),24 }, + { IPv4(198,200,32,0),21 }, + { IPv4(198,200,139,0),24 }, + { IPv4(198,200,147,0),24 }, + { IPv4(198,200,171,0),24 }, + { IPv4(198,200,174,0),24 }, + { IPv4(198,200,182,0),24 }, + { IPv4(198,200,184,0),24 }, + { IPv4(198,200,195,0),24 }, + { IPv4(198,200,228,0),24 }, + { IPv4(198,201,4,0),23 }, + { IPv4(198,201,5,0),24 }, + { IPv4(198,201,6,0),24 }, + { IPv4(198,201,23,0),24 }, + { IPv4(198,202,33,0),24 }, + { IPv4(198,202,64,0),21 }, + { IPv4(198,202,64,0),18 }, + { IPv4(198,202,65,0),24 }, + { IPv4(198,202,66,0),24 }, + { IPv4(198,202,67,0),24 }, + { IPv4(198,202,68,0),24 }, + { IPv4(198,202,69,0),24 }, + { IPv4(198,202,70,0),24 }, + { IPv4(198,202,71,0),24 }, + { IPv4(198,202,72,0),21 }, + { IPv4(198,202,72,0),24 }, + { IPv4(198,202,73,0),24 }, + { IPv4(198,202,74,0),24 }, + { IPv4(198,202,75,0),24 }, + { IPv4(198,202,76,0),24 }, + { IPv4(198,202,79,0),24 }, + { IPv4(198,202,80,0),24 }, + { IPv4(198,202,80,0),20 }, + { IPv4(198,202,81,0),24 }, + { IPv4(198,202,84,0),24 }, + { IPv4(198,202,85,0),24 }, + { IPv4(198,202,86,0),24 }, + { IPv4(198,202,87,0),24 }, + { IPv4(198,202,96,0),19 }, + { IPv4(198,202,139,0),24 }, + { IPv4(198,202,144,0),24 }, + { IPv4(198,202,145,0),24 }, + { IPv4(198,202,148,0),24 }, + { IPv4(198,202,150,0),24 }, + { IPv4(198,202,162,0),24 }, + { IPv4(198,202,168,0),24 }, + { IPv4(198,202,174,0),24 }, + { IPv4(198,202,177,0),24 }, + { IPv4(198,202,182,0),24 }, + { IPv4(198,202,200,0),22 }, + { IPv4(198,202,201,0),24 }, + { IPv4(198,202,202,0),24 }, + { IPv4(198,202,204,0),24 }, + { IPv4(198,202,217,0),24 }, + { IPv4(198,202,228,0),23 }, + { IPv4(198,202,235,0),24 }, + { IPv4(198,202,243,0),24 }, + { IPv4(198,203,9,0),24 }, + { IPv4(198,203,11,0),24 }, + { IPv4(198,203,13,0),24 }, + { IPv4(198,203,16,0),21 }, + { IPv4(198,203,24,0),23 }, + { IPv4(198,203,32,0),20 }, + { IPv4(198,203,48,0),20 }, + { IPv4(198,203,145,0),24 }, + { IPv4(198,203,173,0),24 }, + { IPv4(198,203,178,0),24 }, + { IPv4(198,203,191,0),24 }, + { IPv4(198,203,192,0),24 }, + { IPv4(198,203,219,0),24 }, + { IPv4(198,203,246,0),24 }, + { IPv4(198,204,22,0),24 }, + { IPv4(198,204,92,0),24 }, + { IPv4(198,204,104,0),24 }, + { IPv4(198,204,116,0),22 }, + { IPv4(198,204,120,0),23 }, + { IPv4(198,204,122,0),24 }, + { IPv4(198,204,133,0),24 }, + { IPv4(198,204,134,0),24 }, + { IPv4(198,204,138,0),24 }, + { IPv4(198,204,141,0),24 }, + { IPv4(198,204,142,0),24 }, + { IPv4(198,205,14,0),24 }, + { IPv4(198,206,16,0),20 }, + { IPv4(198,206,47,0),24 }, + { IPv4(198,206,131,0),24 }, + { IPv4(198,206,134,0),24 }, + { IPv4(198,206,162,0),24 }, + { IPv4(198,206,175,0),24 }, + { IPv4(198,206,193,0),24 }, + { IPv4(198,206,194,0),24 }, + { IPv4(198,206,222,0),24 }, + { IPv4(198,206,223,0),24 }, + { IPv4(198,206,234,0),23 }, + { IPv4(198,206,236,0),24 }, + { IPv4(198,206,239,0),24 }, + { IPv4(198,206,240,0),23 }, + { IPv4(198,206,242,0),24 }, + { IPv4(198,206,243,0),24 }, + { IPv4(198,206,246,0),24 }, + { IPv4(198,206,247,0),24 }, + { IPv4(198,207,8,0),21 }, + { IPv4(198,207,153,0),24 }, + { IPv4(198,207,168,0),24 }, + { IPv4(198,207,169,0),24 }, + { IPv4(198,207,176,0),24 }, + { IPv4(198,207,179,0),24 }, + { IPv4(198,207,185,0),24 }, + { IPv4(198,207,193,0),24 }, + { IPv4(198,207,196,0),24 }, + { IPv4(198,207,229,0),24 }, + { IPv4(198,207,230,0),23 }, + { IPv4(198,207,232,0),24 }, + { IPv4(198,207,237,0),24 }, + { IPv4(198,207,238,0),24 }, + { IPv4(198,207,239,0),24 }, + { IPv4(198,207,240,0),24 }, + { IPv4(198,207,241,0),24 }, + { IPv4(198,208,6,0),24 }, + { IPv4(198,208,23,0),24 }, + { IPv4(198,208,28,0),24 }, + { IPv4(198,208,223,0),24 }, + { IPv4(198,209,0,0),19 }, + { IPv4(198,209,32,0),19 }, + { IPv4(198,209,64,0),19 }, + { IPv4(198,209,96,0),19 }, + { IPv4(198,209,128,0),19 }, + { IPv4(198,209,160,0),19 }, + { IPv4(198,209,192,0),19 }, + { IPv4(198,209,224,0),19 }, + { IPv4(198,211,0,0),16 }, + { IPv4(198,211,40,0),24 }, + { IPv4(198,211,54,0),24 }, + { IPv4(198,211,56,0),23 }, + { IPv4(198,211,65,0),24 }, + { IPv4(198,211,124,0),24 }, + { IPv4(198,212,166,0),24 }, + { IPv4(198,212,176,0),24 }, + { IPv4(198,212,187,0),24 }, + { IPv4(198,212,194,0),23 }, + { IPv4(198,212,196,0),23 }, + { IPv4(198,212,199,0),24 }, + { IPv4(198,212,205,0),24 }, + { IPv4(198,212,206,0),24 }, + { IPv4(198,212,207,0),24 }, + { IPv4(198,212,218,0),24 }, + { IPv4(198,212,246,0),24 }, + { IPv4(198,212,251,0),24 }, + { IPv4(198,217,216,0),21 }, + { IPv4(198,217,224,0),24 }, + { IPv4(198,218,0,0),16 }, + { IPv4(198,218,204,0),24 }, + { IPv4(198,220,0,0),16 }, + { IPv4(198,222,0,0),16 }, + { IPv4(198,223,29,0),24 }, + { IPv4(198,223,30,0),23 }, + { IPv4(198,223,97,0),24 }, + { IPv4(198,223,101,0),24 }, + { IPv4(198,223,102,0),24 }, + { IPv4(198,223,106,0),24 }, + { IPv4(198,223,128,0),21 }, + { IPv4(198,223,160,0),19 }, + { IPv4(198,228,0,0),19 }, + { IPv4(198,228,192,0),18 }, + { IPv4(198,232,32,0),19 }, + { IPv4(198,232,129,0),24 }, + { IPv4(198,232,136,0),24 }, + { IPv4(198,232,144,0),24 }, + { IPv4(198,232,168,0),23 }, + { IPv4(198,232,211,0),24 }, + { IPv4(198,232,214,0),24 }, + { IPv4(198,232,215,0),24 }, + { IPv4(198,232,216,0),24 }, + { IPv4(198,232,217,0),24 }, + { IPv4(198,232,236,0),24 }, + { IPv4(198,232,237,0),24 }, + { IPv4(198,232,238,0),24 }, + { IPv4(198,232,239,0),24 }, + { IPv4(198,233,0,0),16 }, + { IPv4(198,233,27,0),24 }, + { IPv4(198,234,0,0),16 }, + { IPv4(198,235,23,0),24 }, + { IPv4(198,235,56,0),24 }, + { IPv4(198,235,157,0),24 }, + { IPv4(198,235,177,0),24 }, + { IPv4(198,235,180,0),22 }, + { IPv4(198,235,202,0),24 }, + { IPv4(198,235,203,0),24 }, + { IPv4(198,235,204,0),24 }, + { IPv4(198,235,205,0),24 }, + { IPv4(198,236,0,0),21 }, + { IPv4(198,236,8,0),23 }, + { IPv4(198,236,21,0),24 }, + { IPv4(198,236,22,0),23 }, + { IPv4(198,236,24,0),21 }, + { IPv4(198,236,32,0),20 }, + { IPv4(198,236,48,0),21 }, + { IPv4(198,236,56,0),24 }, + { IPv4(198,236,128,0),19 }, + { IPv4(198,237,208,0),20 }, + { IPv4(198,237,224,0),19 }, + { IPv4(198,240,129,0),24 }, + { IPv4(198,240,130,0),24 }, + { IPv4(198,241,201,0),24 }, + { IPv4(198,241,202,0),24 }, + { IPv4(198,241,202,0),23 }, + { IPv4(198,241,203,0),24 }, + { IPv4(198,241,204,0),24 }, + { IPv4(198,242,23,0),24 }, + { IPv4(198,242,56,0),24 }, + { IPv4(198,242,57,0),24 }, + { IPv4(198,242,58,0),24 }, + { IPv4(198,242,109,0),24 }, + { IPv4(198,242,111,0),24 }, + { IPv4(198,242,208,0),22 }, + { IPv4(198,242,212,0),24 }, + { IPv4(198,242,213,0),24 }, + { IPv4(198,242,214,0),23 }, + { IPv4(198,242,216,0),24 }, + { IPv4(198,243,0,0),16 }, + { IPv4(198,243,69,0),24 }, + { IPv4(198,243,127,0),24 }, + { IPv4(198,243,128,0),17 }, + { IPv4(198,243,153,0),24 }, + { IPv4(198,243,180,0),24 }, + { IPv4(198,245,32,0),21 }, + { IPv4(198,245,40,0),23 }, + { IPv4(198,245,140,0),24 }, + { IPv4(198,245,183,0),24 }, + { IPv4(198,245,204,0),24 }, + { IPv4(198,245,206,0),24 }, + { IPv4(198,245,210,0),24 }, + { IPv4(198,245,211,0),24 }, + { IPv4(198,245,214,0),24 }, + { IPv4(198,246,0,0),21 }, + { IPv4(198,246,16,0),21 }, + { IPv4(198,246,24,0),23 }, + { IPv4(198,246,32,0),21 }, + { IPv4(198,246,132,0),23 }, + { IPv4(198,246,192,0),24 }, + { IPv4(198,246,200,0),24 }, + { IPv4(198,246,227,0),24 }, + { IPv4(198,246,233,0),24 }, + { IPv4(198,246,237,0),24 }, + { IPv4(198,246,246,0),24 }, + { IPv4(198,246,254,0),24 }, + { IPv4(198,247,0,0),16 }, + { IPv4(198,247,48,0),20 }, + { IPv4(198,247,96,0),19 }, + { IPv4(198,247,128,0),19 }, + { IPv4(198,247,184,0),22 }, + { IPv4(198,247,232,0),23 }, + { IPv4(198,247,234,0),24 }, + { IPv4(198,247,236,0),22 }, + { IPv4(198,248,64,0),19 }, + { IPv4(198,248,96,0),19 }, + { IPv4(198,249,61,0),24 }, + { IPv4(198,250,64,0),19 }, + { IPv4(198,250,128,0),18 }, + { IPv4(198,250,180,0),24 }, + { IPv4(198,250,192,0),19 }, + { IPv4(198,250,202,0),24 }, + { IPv4(198,250,203,0),24 }, + { IPv4(198,250,204,0),24 }, + { IPv4(198,250,224,0),20 }, + { IPv4(198,250,240,0),21 }, + { IPv4(198,250,248,0),22 }, + { IPv4(198,252,8,0),21 }, + { IPv4(198,252,32,0),19 }, + { IPv4(198,252,143,0),24 }, + { IPv4(198,252,175,0),24 }, + { IPv4(198,252,182,0),24 }, + { IPv4(198,252,186,0),24 }, + { IPv4(198,252,189,0),24 }, + { IPv4(198,252,190,0),24 }, + { IPv4(198,252,191,0),24 }, + { IPv4(198,252,192,0),24 }, + { IPv4(198,252,208,0),23 }, + { IPv4(198,252,214,0),24 }, + { IPv4(198,252,232,0),24 }, + { IPv4(198,252,237,0),24 }, + { IPv4(198,252,240,0),23 }, + { IPv4(198,252,244,0),24 }, + { IPv4(198,253,0,0),16 }, + { IPv4(198,253,0,0),20 }, + { IPv4(198,253,16,0),20 }, + { IPv4(198,253,40,0),21 }, + { IPv4(198,253,58,0),24 }, + { IPv4(198,253,60,0),24 }, + { IPv4(198,253,71,0),24 }, + { IPv4(198,253,72,0),21 }, + { IPv4(198,253,80,0),20 }, + { IPv4(198,253,99,0),24 }, + { IPv4(198,253,100,0),22 }, + { IPv4(198,253,104,0),22 }, + { IPv4(198,253,110,0),24 }, + { IPv4(198,253,111,0),24 }, + { IPv4(198,253,112,0),23 }, + { IPv4(198,253,114,0),24 }, + { IPv4(198,253,116,0),24 }, + { IPv4(198,253,117,0),24 }, + { IPv4(198,253,118,0),23 }, + { IPv4(198,253,120,0),24 }, + { IPv4(198,253,122,0),23 }, + { IPv4(198,253,124,0),22 }, + { IPv4(198,253,128,0),21 }, + { IPv4(198,253,136,0),21 }, + { IPv4(198,253,147,0),24 }, + { IPv4(198,253,148,0),23 }, + { IPv4(198,253,158,0),24 }, + { IPv4(198,253,161,0),24 }, + { IPv4(198,253,163,0),24 }, + { IPv4(198,253,166,0),23 }, + { IPv4(198,253,168,0),22 }, + { IPv4(198,253,173,0),24 }, + { IPv4(198,253,174,0),24 }, + { IPv4(198,253,175,0),24 }, + { IPv4(198,253,177,0),24 }, + { IPv4(198,253,178,0),24 }, + { IPv4(198,253,184,0),24 }, + { IPv4(198,253,185,0),24 }, + { IPv4(198,253,186,0),24 }, + { IPv4(198,253,187,0),24 }, + { IPv4(198,253,188,0),22 }, + { IPv4(198,253,192,0),22 }, + { IPv4(198,253,196,0),24 }, + { IPv4(198,253,198,0),24 }, + { IPv4(198,253,199,0),24 }, + { IPv4(198,253,200,0),24 }, + { IPv4(198,253,204,0),23 }, + { IPv4(198,253,206,0),24 }, + { IPv4(198,253,213,0),24 }, + { IPv4(198,253,225,0),24 }, + { IPv4(198,253,226,0),24 }, + { IPv4(198,253,232,0),23 }, + { IPv4(198,253,243,0),24 }, + { IPv4(198,253,246,0),23 }, + { IPv4(198,253,253,0),24 }, + { IPv4(198,253,254,0),24 }, + { IPv4(198,253,255,0),24 }, + { IPv4(198,254,0,0),20 }, + { IPv4(199,0,8,0),24 }, + { IPv4(199,1,1,0),24 }, + { IPv4(199,1,91,0),24 }, + { IPv4(199,1,156,0),24 }, + { IPv4(199,1,157,0),24 }, + { IPv4(199,1,204,0),22 }, + { IPv4(199,2,8,0),21 }, + { IPv4(199,2,16,0),20 }, + { IPv4(199,2,50,0),24 }, + { IPv4(199,2,64,0),19 }, + { IPv4(199,2,135,0),24 }, + { IPv4(199,2,137,0),24 }, + { IPv4(199,2,139,0),24 }, + { IPv4(199,3,10,0),23 }, + { IPv4(199,3,12,0),24 }, + { IPv4(199,3,109,0),24 }, + { IPv4(199,3,182,0),24 }, + { IPv4(199,3,240,0),24 }, + { IPv4(199,4,48,0),22 }, + { IPv4(199,4,56,0),22 }, + { IPv4(199,4,57,0),24 }, + { IPv4(199,4,58,0),24 }, + { IPv4(199,4,64,0),18 }, + { IPv4(199,4,140,0),22 }, + { IPv4(199,4,146,0),23 }, + { IPv4(199,4,151,0),24 }, + { IPv4(199,4,154,0),24 }, + { IPv4(199,4,164,0),22 }, + { IPv4(199,4,187,0),24 }, + { IPv4(199,4,191,0),24 }, + { IPv4(199,4,194,0),24 }, + { IPv4(199,4,220,0),24 }, + { IPv4(199,4,225,0),24 }, + { IPv4(199,4,235,0),24 }, + { IPv4(199,4,246,0),23 }, + { IPv4(199,4,249,0),24 }, + { IPv4(199,4,250,0),23 }, + { IPv4(199,4,252,0),24 }, + { IPv4(199,4,253,0),24 }, + { IPv4(199,5,8,0),21 }, + { IPv4(199,5,16,0),24 }, + { IPv4(199,5,60,0),24 }, + { IPv4(199,5,61,0),24 }, + { IPv4(199,5,133,0),24 }, + { IPv4(199,5,163,0),24 }, + { IPv4(199,5,174,0),24 }, + { IPv4(199,5,176,0),23 }, + { IPv4(199,5,178,0),24 }, + { IPv4(199,5,179,0),24 }, + { IPv4(199,5,180,0),24 }, + { IPv4(199,5,181,0),24 }, + { IPv4(199,5,182,0),24 }, + { IPv4(199,5,202,0),24 }, + { IPv4(199,5,204,0),22 }, + { IPv4(199,5,208,0),22 }, + { IPv4(199,5,225,0),24 }, + { IPv4(199,5,231,0),24 }, + { IPv4(199,5,232,0),24 }, + { IPv4(199,5,243,0),24 }, + { IPv4(199,5,254,0),24 }, + { IPv4(199,6,98,0),24 }, + { IPv4(199,6,127,0),24 }, + { IPv4(199,9,0,0),24 }, + { IPv4(199,9,1,0),24 }, + { IPv4(199,9,2,0),24 }, + { IPv4(199,9,10,0),23 }, + { IPv4(199,9,16,0),22 }, + { IPv4(199,9,64,0),18 }, + { IPv4(199,10,0,0),16 }, + { IPv4(199,10,16,0),21 }, + { IPv4(199,10,50,0),24 }, + { IPv4(199,10,62,0),24 }, + { IPv4(199,10,67,0),24 }, + { IPv4(199,10,77,0),24 }, + { IPv4(199,10,78,0),23 }, + { IPv4(199,10,80,0),24 }, + { IPv4(199,10,81,0),24 }, + { IPv4(199,10,93,0),24 }, + { IPv4(199,10,119,0),24 }, + { IPv4(199,10,127,0),24 }, + { IPv4(199,10,133,0),24 }, + { IPv4(199,10,135,0),24 }, + { IPv4(199,10,138,0),24 }, + { IPv4(199,10,139,0),24 }, + { IPv4(199,10,141,0),24 }, + { IPv4(199,10,142,0),24 }, + { IPv4(199,10,148,0),24 }, + { IPv4(199,10,200,0),24 }, + { IPv4(199,10,215,0),24 }, + { IPv4(199,10,231,0),24 }, + { IPv4(199,10,233,0),24 }, + { IPv4(199,15,0,0),21 }, + { IPv4(199,15,60,0),22 }, + { IPv4(199,16,32,0),19 }, + { IPv4(199,17,0,0),16 }, + { IPv4(199,19,8,0),24 }, + { IPv4(199,19,9,0),24 }, + { IPv4(199,20,8,0),21 }, + { IPv4(199,20,51,0),24 }, + { IPv4(199,20,56,0),24 }, + { IPv4(199,20,59,0),24 }, + { IPv4(199,20,64,0),18 }, + { IPv4(199,21,28,0),22 }, + { IPv4(199,22,0,0),16 }, + { IPv4(199,26,8,0),21 }, + { IPv4(199,26,153,0),24 }, + { IPv4(199,26,155,0),24 }, + { IPv4(199,26,165,0),24 }, + { IPv4(199,26,171,0),24 }, + { IPv4(199,26,199,0),24 }, + { IPv4(199,26,202,0),24 }, + { IPv4(199,26,225,0),24 }, + { IPv4(199,29,1,0),24 }, + { IPv4(199,29,2,0),24 }, + { IPv4(199,29,3,0),24 }, + { IPv4(199,29,6,0),24 }, + { IPv4(199,29,7,0),24 }, + { IPv4(199,29,8,0),24 }, + { IPv4(199,29,9,0),24 }, + { IPv4(199,29,31,0),24 }, + { IPv4(199,29,68,0),24 }, + { IPv4(199,29,92,0),22 }, + { IPv4(199,29,132,0),24 }, + { IPv4(199,29,141,0),24 }, + { IPv4(199,29,144,0),20 }, + { IPv4(199,29,184,0),24 }, + { IPv4(199,29,196,0),23 }, + { IPv4(199,29,201,0),24 }, + { IPv4(199,29,202,0),24 }, + { IPv4(199,29,203,0),24 }, + { IPv4(199,29,204,0),24 }, + { IPv4(199,29,205,0),24 }, + { IPv4(199,29,206,0),23 }, + { IPv4(199,29,208,0),23 }, + { IPv4(199,29,210,0),24 }, + { IPv4(199,29,211,0),24 }, + { IPv4(199,29,212,0),24 }, + { IPv4(199,29,213,0),24 }, + { IPv4(199,29,214,0),24 }, + { IPv4(199,29,215,0),24 }, + { IPv4(199,29,216,0),22 }, + { IPv4(199,29,220,0),22 }, + { IPv4(199,29,242,0),24 }, + { IPv4(199,29,245,0),24 }, + { IPv4(199,29,246,0),24 }, + { IPv4(199,29,247,0),24 }, + { IPv4(199,29,255,0),24 }, + { IPv4(199,30,4,0),24 }, + { IPv4(199,30,32,0),24 }, + { IPv4(199,31,2,0),24 }, + { IPv4(199,31,3,0),24 }, + { IPv4(199,31,8,0),22 }, + { IPv4(199,31,12,0),24 }, + { IPv4(199,31,21,0),24 }, + { IPv4(199,31,31,0),24 }, + { IPv4(199,31,107,0),24 }, + { IPv4(199,32,128,0),18 }, + { IPv4(199,32,192,0),19 }, + { IPv4(199,33,32,0),19 }, + { IPv4(199,33,64,0),24 }, + { IPv4(199,33,79,0),24 }, + { IPv4(199,33,81,0),24 }, + { IPv4(199,33,119,0),24 }, + { IPv4(199,33,128,0),24 }, + { IPv4(199,33,129,0),24 }, + { IPv4(199,33,144,0),24 }, + { IPv4(199,33,159,0),24 }, + { IPv4(199,33,164,0),23 }, + { IPv4(199,33,164,0),24 }, + { IPv4(199,33,165,0),24 }, + { IPv4(199,33,166,0),24 }, + { IPv4(199,33,167,0),24 }, + { IPv4(199,33,168,0),24 }, + { IPv4(199,33,169,0),24 }, + { IPv4(199,33,170,0),24 }, + { IPv4(199,33,171,0),24 }, + { IPv4(199,33,172,0),24 }, + { IPv4(199,33,173,0),24 }, + { IPv4(199,33,182,0),24 }, + { IPv4(199,33,203,0),24 }, + { IPv4(199,33,206,0),24 }, + { IPv4(199,33,217,0),24 }, + { IPv4(199,33,223,0),24 }, + { IPv4(199,33,224,0),23 }, + { IPv4(199,33,238,0),24 }, + { IPv4(199,33,244,0),24 }, + { IPv4(199,33,252,0),24 }, + { IPv4(199,34,16,0),20 }, + { IPv4(199,34,32,0),24 }, + { IPv4(199,34,53,0),24 }, + { IPv4(199,34,138,0),23 }, + { IPv4(199,34,167,0),24 }, + { IPv4(199,34,173,0),24 }, + { IPv4(199,34,183,0),24 }, + { IPv4(199,34,216,0),23 }, + { IPv4(199,35,0,0),16 }, + { IPv4(199,36,19,0),24 }, + { IPv4(199,36,24,0),24 }, + { IPv4(199,36,25,0),24 }, + { IPv4(199,37,0,0),17 }, + { IPv4(199,37,96,0),24 }, + { IPv4(199,37,112,0),24 }, + { IPv4(199,37,116,0),24 }, + { IPv4(199,37,128,0),24 }, + { IPv4(199,37,129,0),24 }, + { IPv4(199,37,130,0),24 }, + { IPv4(199,37,131,0),24 }, + { IPv4(199,37,132,0),24 }, + { IPv4(199,37,133,0),24 }, + { IPv4(199,37,138,0),24 }, + { IPv4(199,37,148,0),24 }, + { IPv4(199,37,158,0),24 }, + { IPv4(199,37,159,0),24 }, + { IPv4(199,37,160,0),24 }, + { IPv4(199,37,161,0),24 }, + { IPv4(199,37,162,0),24 }, + { IPv4(199,37,163,0),24 }, + { IPv4(199,37,164,0),24 }, + { IPv4(199,37,165,0),24 }, + { IPv4(199,37,170,0),24 }, + { IPv4(199,37,173,0),24 }, + { IPv4(199,37,180,0),24 }, + { IPv4(199,37,181,0),24 }, + { IPv4(199,37,192,0),18 }, + { IPv4(199,37,204,0),24 }, + { IPv4(199,37,205,0),24 }, + { IPv4(199,37,213,0),24 }, + { IPv4(199,37,214,0),24 }, + { IPv4(199,37,219,0),24 }, + { IPv4(199,38,0,0),24 }, + { IPv4(199,38,1,0),24 }, + { IPv4(199,38,2,0),24 }, + { IPv4(199,38,3,0),24 }, + { IPv4(199,38,4,0),24 }, + { IPv4(199,38,5,0),24 }, + { IPv4(199,38,6,0),24 }, + { IPv4(199,38,7,0),24 }, + { IPv4(199,38,32,0),20 }, + { IPv4(199,38,48,0),22 }, + { IPv4(199,38,133,0),24 }, + { IPv4(199,41,3,0),24 }, + { IPv4(199,41,8,0),23 }, + { IPv4(199,41,127,0),24 }, + { IPv4(199,41,196,0),24 }, + { IPv4(199,41,197,0),24 }, + { IPv4(199,41,198,0),23 }, + { IPv4(199,41,200,0),22 }, + { IPv4(199,41,248,0),24 }, + { IPv4(199,41,254,0),24 }, + { IPv4(199,42,104,0),23 }, + { IPv4(199,42,240,0),23 }, + { IPv4(199,43,32,0),24 }, + { IPv4(199,43,33,0),24 }, + { IPv4(199,43,34,0),24 }, + { IPv4(199,43,35,0),24 }, + { IPv4(199,43,48,0),24 }, + { IPv4(199,43,49,0),24 }, + { IPv4(199,43,51,0),24 }, + { IPv4(199,43,117,0),24 }, + { IPv4(199,43,172,0),24 }, + { IPv4(199,45,66,0),23 }, + { IPv4(199,45,68,0),24 }, + { IPv4(199,45,70,0),24 }, + { IPv4(199,45,84,0),24 }, + { IPv4(199,45,88,0),24 }, + { IPv4(199,45,123,0),24 }, + { IPv4(199,45,128,0),17 }, + { IPv4(199,45,150,0),24 }, + { IPv4(199,46,8,0),21 }, + { IPv4(199,46,16,0),20 }, + { IPv4(199,46,16,0),23 }, + { IPv4(199,46,18,0),23 }, + { IPv4(199,46,128,0),17 }, + { IPv4(199,46,200,0),24 }, + { IPv4(199,46,245,0),24 }, + { IPv4(199,46,255,0),24 }, + { IPv4(199,48,4,0),22 }, + { IPv4(199,48,22,0),24 }, + { IPv4(199,48,23,0),24 }, + { IPv4(199,48,24,0),24 }, + { IPv4(199,49,3,0),24 }, + { IPv4(199,49,22,0),24 }, + { IPv4(199,49,39,0),24 }, + { IPv4(199,49,70,0),24 }, + { IPv4(199,50,26,0),24 }, + { IPv4(199,50,29,0),24 }, + { IPv4(199,51,77,0),24 }, + { IPv4(199,51,99,0),24 }, + { IPv4(199,51,112,0),24 }, + { IPv4(199,53,16,0),24 }, + { IPv4(199,53,17,0),24 }, + { IPv4(199,53,19,0),24 }, + { IPv4(199,53,20,0),24 }, + { IPv4(199,53,22,0),24 }, + { IPv4(199,53,23,0),24 }, + { IPv4(199,53,74,0),24 }, + { IPv4(199,53,77,0),24 }, + { IPv4(199,53,78,0),24 }, + { IPv4(199,53,98,0),24 }, + { IPv4(199,53,100,0),24 }, + { IPv4(199,53,102,0),23 }, + { IPv4(199,53,183,0),24 }, + { IPv4(199,53,184,0),24 }, + { IPv4(199,57,0,0),16 }, + { IPv4(199,58,52,0),24 }, + { IPv4(199,59,40,0),24 }, + { IPv4(199,60,103,0),24 }, + { IPv4(199,60,237,0),24 }, + { IPv4(199,64,0,0),24 }, + { IPv4(199,64,1,0),24 }, + { IPv4(199,64,7,0),24 }, + { IPv4(199,64,8,0),24 }, + { IPv4(199,65,196,0),24 }, + { IPv4(199,66,1,0),24 }, + { IPv4(199,66,10,0),24 }, + { IPv4(199,67,0,0),24 }, + { IPv4(199,67,7,0),24 }, + { IPv4(199,67,16,0),20 }, + { IPv4(199,67,190,0),24 }, + { IPv4(199,68,35,0),24 }, + { IPv4(199,68,81,0),24 }, + { IPv4(199,69,0,0),16 }, + { IPv4(199,69,32,0),24 }, + { IPv4(199,70,5,0),24 }, + { IPv4(199,70,128,0),24 }, + { IPv4(199,70,144,0),24 }, + { IPv4(199,70,148,0),24 }, + { IPv4(199,71,27,0),24 }, + { IPv4(199,71,40,0),24 }, + { IPv4(199,71,52,0),24 }, + { IPv4(199,71,68,0),24 }, + { IPv4(199,71,115,0),24 }, + { IPv4(199,71,175,0),24 }, + { IPv4(199,71,182,0),23 }, + { IPv4(199,71,187,0),24 }, + { IPv4(199,71,188,0),24 }, + { IPv4(199,73,20,0),24 }, + { IPv4(199,73,32,0),21 }, + { IPv4(199,73,40,0),23 }, + { IPv4(199,74,8,0),21 }, + { IPv4(199,74,141,0),24 }, + { IPv4(199,74,142,0),24 }, + { IPv4(199,74,198,0),24 }, + { IPv4(199,74,206,0),24 }, + { IPv4(199,74,211,0),24 }, + { IPv4(199,74,216,0),22 }, + { IPv4(199,74,220,0),23 }, + { IPv4(199,74,242,0),24 }, + { IPv4(199,76,144,0),20 }, + { IPv4(199,76,160,0),19 }, + { IPv4(199,76,192,0),24 }, + { IPv4(199,76,198,0),24 }, + { IPv4(199,77,44,0),23 }, + { IPv4(199,77,46,0),24 }, + { IPv4(199,77,128,0),17 }, + { IPv4(199,78,60,0),23 }, + { IPv4(199,79,64,0),19 }, + { IPv4(199,79,131,0),24 }, + { IPv4(199,79,136,0),24 }, + { IPv4(199,79,142,0),24 }, + { IPv4(199,79,143,0),24 }, + { IPv4(199,79,144,0),24 }, + { IPv4(199,79,155,0),24 }, + { IPv4(199,79,168,0),22 }, + { IPv4(199,79,186,0),24 }, + { IPv4(199,79,200,0),24 }, + { IPv4(199,79,202,0),24 }, + { IPv4(199,79,215,0),24 }, + { IPv4(199,79,228,0),24 }, + { IPv4(199,79,236,0),24 }, + { IPv4(199,79,250,0),23 }, + { IPv4(199,79,252,0),23 }, + { IPv4(199,79,254,0),24 }, + { IPv4(199,80,50,0),24 }, + { IPv4(199,80,128,0),17 }, + { IPv4(199,81,0,0),16 }, + { IPv4(199,81,192,0),19 }, + { IPv4(199,82,0,0),16 }, + { IPv4(199,83,64,0),20 }, + { IPv4(199,84,1,0),24 }, + { IPv4(199,84,52,0),24 }, + { IPv4(199,84,53,0),24 }, + { IPv4(199,84,54,0),24 }, + { IPv4(199,84,135,0),24 }, + { IPv4(199,84,152,0),24 }, + { IPv4(199,84,172,0),24 }, + { IPv4(199,84,174,0),23 }, + { IPv4(199,85,7,0),24 }, + { IPv4(199,85,9,0),24 }, + { IPv4(199,85,19,0),24 }, + { IPv4(199,85,25,0),24 }, + { IPv4(199,85,107,0),24 }, + { IPv4(199,85,245,0),24 }, + { IPv4(199,86,0,0),16 }, + { IPv4(199,86,16,0),22 }, + { IPv4(199,86,27,0),24 }, + { IPv4(199,86,68,0),22 }, + { IPv4(199,86,128,0),17 }, + { IPv4(199,87,16,0),21 }, + { IPv4(199,87,24,0),23 }, + { IPv4(199,88,14,0),24 }, + { IPv4(199,88,104,0),23 }, + { IPv4(199,88,132,0),24 }, + { IPv4(199,88,134,0),23 }, + { IPv4(199,88,136,0),23 }, + { IPv4(199,88,145,0),24 }, + { IPv4(199,88,147,0),24 }, + { IPv4(199,88,158,0),24 }, + { IPv4(199,88,171,0),24 }, + { IPv4(199,88,179,0),24 }, + { IPv4(199,88,187,0),24 }, + { IPv4(199,88,205,0),24 }, + { IPv4(199,88,232,0),24 }, + { IPv4(199,88,234,0),24 }, + { IPv4(199,88,235,0),24 }, + { IPv4(199,88,249,0),24 }, + { IPv4(199,89,0,0),21 }, + { IPv4(199,89,8,0),21 }, + { IPv4(199,89,64,0),18 }, + { IPv4(199,89,128,0),24 }, + { IPv4(199,89,140,0),24 }, + { IPv4(199,89,163,0),24 }, + { IPv4(199,89,187,0),24 }, + { IPv4(199,89,192,0),23 }, + { IPv4(199,89,214,0),24 }, + { IPv4(199,89,224,0),24 }, + { IPv4(199,89,233,0),24 }, + { IPv4(199,89,234,0),24 }, + { IPv4(199,89,248,0),24 }, + { IPv4(199,89,253,0),24 }, + { IPv4(199,91,32,0),24 }, + { IPv4(199,91,33,0),24 }, + { IPv4(199,91,34,0),24 }, + { IPv4(199,91,35,0),24 }, + { IPv4(199,91,36,0),24 }, + { IPv4(199,91,37,0),24 }, + { IPv4(199,91,38,0),24 }, + { IPv4(199,91,39,0),24 }, + { IPv4(199,93,70,0),24 }, + { IPv4(199,93,71,0),24 }, + { IPv4(199,96,19,0),24 }, + { IPv4(199,96,32,0),22 }, + { IPv4(199,96,40,0),22 }, + { IPv4(199,96,44,0),23 }, + { IPv4(199,96,46,0),24 }, + { IPv4(199,97,12,0),24 }, + { IPv4(199,97,48,0),24 }, + { IPv4(199,97,98,0),24 }, + { IPv4(199,97,121,0),24 }, + { IPv4(199,97,192,0),22 }, + { IPv4(199,97,212,0),24 }, + { IPv4(199,98,7,0),24 }, + { IPv4(199,98,59,0),24 }, + { IPv4(199,98,84,0),24 }, + { IPv4(199,98,88,0),24 }, + { IPv4(199,98,112,0),23 }, + { IPv4(199,98,171,0),24 }, + { IPv4(199,98,200,0),24 }, + { IPv4(199,98,205,0),24 }, + { IPv4(199,99,2,0),24 }, + { IPv4(199,99,64,0),21 }, + { IPv4(199,99,72,0),23 }, + { IPv4(199,99,102,0),24 }, + { IPv4(199,99,156,0),22 }, + { IPv4(199,99,242,0),24 }, + { IPv4(199,99,243,0),24 }, + { IPv4(199,99,244,0),24 }, + { IPv4(199,99,248,0),21 }, + { IPv4(199,101,4,0),24 }, + { IPv4(199,101,6,0),24 }, + { IPv4(199,101,8,0),21 }, + { IPv4(199,102,9,0),24 }, + { IPv4(199,102,15,0),24 }, + { IPv4(199,102,39,0),24 }, + { IPv4(199,103,128,0),17 }, + { IPv4(199,104,0,0),18 }, + { IPv4(199,104,18,0),24 }, + { IPv4(199,104,19,0),24 }, + { IPv4(199,104,20,0),24 }, + { IPv4(199,104,22,0),24 }, + { IPv4(199,104,23,0),24 }, + { IPv4(199,104,32,0),19 }, + { IPv4(199,104,64,0),18 }, + { IPv4(199,104,76,0),24 }, + { IPv4(199,104,78,0),24 }, + { IPv4(199,104,79,0),24 }, + { IPv4(199,104,80,0),24 }, + { IPv4(199,104,81,0),24 }, + { IPv4(199,104,82,0),24 }, + { IPv4(199,104,83,0),24 }, + { IPv4(199,104,84,0),24 }, + { IPv4(199,104,107,0),24 }, + { IPv4(199,104,108,0),24 }, + { IPv4(199,104,112,0),24 }, + { IPv4(199,104,113,0),24 }, + { IPv4(199,104,114,0),24 }, + { IPv4(199,104,115,0),24 }, + { IPv4(199,104,116,0),24 }, + { IPv4(199,104,117,0),24 }, + { IPv4(199,104,118,0),24 }, + { IPv4(199,104,119,0),24 }, + { IPv4(199,104,120,0),21 }, + { IPv4(199,104,128,0),19 }, + { IPv4(199,104,128,0),24 }, + { IPv4(199,104,128,0),17 }, + { IPv4(199,104,132,0),24 }, + { IPv4(199,104,138,0),23 }, + { IPv4(199,104,140,0),22 }, + { IPv4(199,104,144,0),20 }, + { IPv4(199,104,146,0),24 }, + { IPv4(199,104,148,0),24 }, + { IPv4(199,104,149,0),24 }, + { IPv4(199,104,151,0),24 }, + { IPv4(199,104,192,0),19 }, + { IPv4(199,104,192,0),18 }, + { IPv4(199,104,231,0),24 }, + { IPv4(199,104,232,0),21 }, + { IPv4(199,104,244,0),23 }, + { IPv4(199,104,248,0),21 }, + { IPv4(199,104,248,0),22 }, + { IPv4(199,104,252,0),24 }, + { IPv4(199,105,0,0),18 }, + { IPv4(199,105,0,0),16 }, + { IPv4(199,105,64,0),23 }, + { IPv4(199,105,84,0),22 }, + { IPv4(199,105,112,0),21 }, + { IPv4(199,105,120,0),21 }, + { IPv4(199,105,138,0),24 }, + { IPv4(199,105,175,0),24 }, + { IPv4(199,105,186,0),24 }, + { IPv4(199,105,191,0),24 }, + { IPv4(199,105,192,0),20 }, + { IPv4(199,105,209,0),24 }, + { IPv4(199,106,0,0),15 }, + { IPv4(199,106,16,0),24 }, + { IPv4(199,106,17,0),24 }, + { IPv4(199,106,34,0),24 }, + { IPv4(199,106,35,0),24 }, + { IPv4(199,106,52,0),24 }, + { IPv4(199,106,56,0),24 }, + { IPv4(199,106,64,0),21 }, + { IPv4(199,106,65,0),24 }, + { IPv4(199,106,72,0),22 }, + { IPv4(199,106,78,0),24 }, + { IPv4(199,106,174,0),23 }, + { IPv4(199,106,176,0),23 }, + { IPv4(199,106,185,0),24 }, + { IPv4(199,106,186,0),24 }, + { IPv4(199,106,208,0),20 }, + { IPv4(199,106,232,0),21 }, + { IPv4(199,107,24,0),22 }, + { IPv4(199,107,26,0),23 }, + { IPv4(199,107,96,0),22 }, + { IPv4(199,107,144,0),24 }, + { IPv4(199,107,160,0),21 }, + { IPv4(199,108,0,0),16 }, + { IPv4(199,108,16,0),24 }, + { IPv4(199,108,40,0),24 }, + { IPv4(199,108,42,0),23 }, + { IPv4(199,108,44,0),22 }, + { IPv4(199,108,48,0),21 }, + { IPv4(199,108,56,0),23 }, + { IPv4(199,108,64,0),24 }, + { IPv4(199,108,66,0),24 }, + { IPv4(199,108,88,0),23 }, + { IPv4(199,108,160,0),21 }, + { IPv4(199,108,164,0),24 }, + { IPv4(199,108,167,0),24 }, + { IPv4(199,108,189,0),24 }, + { IPv4(199,108,224,0),22 }, + { IPv4(199,108,228,0),23 }, + { IPv4(199,109,32,0),22 }, + { IPv4(199,111,161,0),24 }, + { IPv4(199,112,0,0),19 }, + { IPv4(199,112,32,0),24 }, + { IPv4(199,112,36,0),24 }, + { IPv4(199,113,128,0),17 }, + { IPv4(199,114,0,0),21 }, + { IPv4(199,114,6,0),24 }, + { IPv4(199,114,8,0),22 }, + { IPv4(199,114,32,0),20 }, + { IPv4(199,114,48,0),22 }, + { IPv4(199,114,128,0),18 }, + { IPv4(199,115,8,0),21 }, + { IPv4(199,115,16,0),21 }, + { IPv4(199,115,24,0),23 }, + { IPv4(199,117,0,0),16 }, + { IPv4(199,117,144,0),22 }, + { IPv4(199,117,161,0),24 }, + { IPv4(199,119,33,0),24 }, + { IPv4(199,119,40,0),24 }, + { IPv4(199,120,16,0),20 }, + { IPv4(199,120,64,0),18 }, + { IPv4(199,120,79,0),24 }, + { IPv4(199,120,86,0),24 }, + { IPv4(199,120,153,0),24 }, + { IPv4(199,120,157,0),24 }, + { IPv4(199,120,161,0),24 }, + { IPv4(199,120,179,0),24 }, + { IPv4(199,120,183,0),24 }, + { IPv4(199,120,218,0),24 }, + { IPv4(199,120,249,0),24 }, + { IPv4(199,121,0,0),16 }, + { IPv4(199,121,31,0),24 }, + { IPv4(199,121,42,0),24 }, + { IPv4(199,121,124,0),24 }, + { IPv4(199,121,125,0),24 }, + { IPv4(199,121,131,0),24 }, + { IPv4(199,121,132,0),24 }, + { IPv4(199,121,155,0),24 }, + { IPv4(199,121,156,0),24 }, + { IPv4(199,121,157,0),24 }, + { IPv4(199,121,159,0),24 }, + { IPv4(199,121,160,0),24 }, + { IPv4(199,121,174,0),23 }, + { IPv4(199,121,185,0),24 }, + { IPv4(199,121,238,0),23 }, + { IPv4(199,121,240,0),24 }, + { IPv4(199,121,247,0),24 }, + { IPv4(199,122,4,0),23 }, + { IPv4(199,122,32,0),20 }, + { IPv4(199,122,49,0),24 }, + { IPv4(199,122,56,0),21 }, + { IPv4(199,123,16,0),20 }, + { IPv4(199,123,32,0),20 }, + { IPv4(199,123,71,0),24 }, + { IPv4(199,123,72,0),21 }, + { IPv4(199,123,80,0),21 }, + { IPv4(199,123,87,0),24 }, + { IPv4(199,123,88,0),23 }, + { IPv4(199,123,88,0),24 }, + { IPv4(199,123,89,0),24 }, + { IPv4(199,123,90,0),24 }, + { IPv4(199,123,92,0),24 }, + { IPv4(199,123,104,0),21 }, + { IPv4(199,123,112,0),21 }, + { IPv4(199,123,121,0),24 }, + { IPv4(199,123,122,0),23 }, + { IPv4(199,123,124,0),24 }, + { IPv4(199,124,8,0),21 }, + { IPv4(199,124,16,0),21 }, + { IPv4(199,125,8,0),24 }, + { IPv4(199,125,9,0),24 }, + { IPv4(199,125,10,0),24 }, + { IPv4(199,127,16,0),24 }, + { IPv4(199,127,25,0),24 }, + { IPv4(199,127,27,0),24 }, + { IPv4(199,127,32,0),21 }, + { IPv4(199,127,40,0),23 }, + { IPv4(199,131,64,0),19 }, + { IPv4(199,131,96,0),21 }, + { IPv4(199,131,104,0),22 }, + { IPv4(199,164,167,0),24 }, + { IPv4(199,164,176,0),23 }, + { IPv4(199,164,178,0),24 }, + { IPv4(199,164,180,0),23 }, + { IPv4(199,164,184,0),24 }, + { IPv4(199,164,185,0),24 }, + { IPv4(199,164,191,0),24 }, + { IPv4(199,164,192,0),24 }, + { IPv4(199,164,194,0),24 }, + { IPv4(199,164,200,0),24 }, + { IPv4(199,164,210,0),24 }, + { IPv4(199,164,214,0),24 }, + { IPv4(199,164,235,0),24 }, + { IPv4(199,164,236,0),24 }, + { IPv4(199,164,237,0),24 }, + { IPv4(199,164,250,0),24 }, + { IPv4(199,165,0,0),21 }, + { IPv4(199,165,8,0),22 }, + { IPv4(199,165,16,0),24 }, + { IPv4(199,165,16,0),20 }, + { IPv4(199,165,19,0),24 }, + { IPv4(199,165,80,0),21 }, + { IPv4(199,165,137,0),24 }, + { IPv4(199,165,138,0),24 }, + { IPv4(199,165,141,0),24 }, + { IPv4(199,165,150,0),24 }, + { IPv4(199,165,157,0),24 }, + { IPv4(199,165,165,0),24 }, + { IPv4(199,165,180,0),24 }, + { IPv4(199,165,206,0),24 }, + { IPv4(199,165,233,0),24 }, + { IPv4(199,165,247,0),24 }, + { IPv4(199,165,249,0),24 }, + { IPv4(199,165,250,0),24 }, + { IPv4(199,166,24,0),24 }, + { IPv4(199,166,25,0),24 }, + { IPv4(199,166,26,0),24 }, + { IPv4(199,166,27,0),24 }, + { IPv4(199,166,28,0),23 }, + { IPv4(199,166,30,0),24 }, + { IPv4(199,166,34,0),23 }, + { IPv4(199,166,36,0),23 }, + { IPv4(199,166,223,0),24 }, + { IPv4(199,168,32,0),24 }, + { IPv4(199,168,33,0),24 }, + { IPv4(199,168,35,0),24 }, + { IPv4(199,168,39,0),24 }, + { IPv4(199,169,208,0),20 }, + { IPv4(199,170,84,0),23 }, + { IPv4(199,170,88,0),21 }, + { IPv4(199,170,121,0),24 }, + { IPv4(199,170,132,0),24 }, + { IPv4(199,171,52,0),24 }, + { IPv4(199,171,96,0),24 }, + { IPv4(199,171,134,0),24 }, + { IPv4(199,171,200,0),24 }, + { IPv4(199,171,201,0),24 }, + { IPv4(199,172,169,0),24 }, + { IPv4(199,173,188,0),24 }, + { IPv4(199,173,232,0),22 }, + { IPv4(199,174,0,0),16 }, + { IPv4(199,174,0,0),18 }, + { IPv4(199,174,16,0),21 }, + { IPv4(199,174,136,0),24 }, + { IPv4(199,174,160,0),20 }, + { IPv4(199,174,176,0),21 }, + { IPv4(199,174,184,0),22 }, + { IPv4(199,174,196,0),22 }, + { IPv4(199,174,200,0),21 }, + { IPv4(199,174,208,0),20 }, + { IPv4(199,175,157,0),24 }, + { IPv4(199,175,219,0),24 }, + { IPv4(199,175,234,0),24 }, + { IPv4(199,177,58,0),24 }, + { IPv4(199,181,71,0),24 }, + { IPv4(199,181,92,0),22 }, + { IPv4(199,181,144,0),24 }, + { IPv4(199,181,150,0),24 }, + { IPv4(199,181,164,0),22 }, + { IPv4(199,181,168,0),24 }, + { IPv4(199,181,178,0),23 }, + { IPv4(199,181,179,0),24 }, + { IPv4(199,181,180,0),24 }, + { IPv4(199,181,193,0),24 }, + { IPv4(199,181,234,0),24 }, + { IPv4(199,181,237,0),24 }, + { IPv4(199,181,251,0),24 }, + { IPv4(199,181,252,0),24 }, + { IPv4(199,182,0,0),15 }, + { IPv4(199,182,110,0),24 }, + { IPv4(199,182,207,0),24 }, + { IPv4(199,182,227,0),24 }, + { IPv4(199,182,248,0),23 }, + { IPv4(199,182,250,0),24 }, + { IPv4(199,183,4,0),24 }, + { IPv4(199,183,32,0),24 }, + { IPv4(199,183,38,0),24 }, + { IPv4(199,183,44,0),24 }, + { IPv4(199,183,185,0),24 }, + { IPv4(199,183,186,0),24 }, + { IPv4(199,184,16,0),20 }, + { IPv4(199,184,75,0),24 }, + { IPv4(199,184,82,0),24 }, + { IPv4(199,184,120,0),22 }, + { IPv4(199,184,162,0),24 }, + { IPv4(199,184,165,0),24 }, + { IPv4(199,184,210,0),24 }, + { IPv4(199,184,226,0),24 }, + { IPv4(199,184,227,0),24 }, + { IPv4(199,184,228,0),24 }, + { IPv4(199,184,236,0),23 }, + { IPv4(199,184,238,0),24 }, + { IPv4(199,184,241,0),24 }, + { IPv4(199,184,243,0),24 }, + { IPv4(199,184,244,0),24 }, + { IPv4(199,184,252,0),24 }, + { IPv4(199,185,1,0),24 }, + { IPv4(199,185,4,0),24 }, + { IPv4(199,185,8,0),23 }, + { IPv4(199,185,104,0),24 }, + { IPv4(199,185,109,0),24 }, + { IPv4(199,185,110,0),24 }, + { IPv4(199,185,116,0),24 }, + { IPv4(199,185,117,0),24 }, + { IPv4(199,185,136,0),23 }, + { IPv4(199,185,230,0),23 }, + { IPv4(199,186,0,0),16 }, + { IPv4(199,189,0,0),24 }, + { IPv4(199,189,1,0),24 }, + { IPv4(199,189,2,0),24 }, + { IPv4(199,189,3,0),24 }, + { IPv4(199,189,4,0),24 }, + { IPv4(199,189,5,0),24 }, + { IPv4(199,189,8,0),21 }, + { IPv4(199,190,64,0),18 }, + { IPv4(199,190,65,0),24 }, + { IPv4(199,190,87,0),24 }, + { IPv4(199,190,99,0),24 }, + { IPv4(199,190,100,0),24 }, + { IPv4(199,190,104,0),24 }, + { IPv4(199,190,116,0),24 }, + { IPv4(199,190,134,0),24 }, + { IPv4(199,190,161,0),24 }, + { IPv4(199,190,174,0),24 }, + { IPv4(199,190,175,0),24 }, + { IPv4(199,190,178,0),23 }, + { IPv4(199,190,180,0),24 }, + { IPv4(199,190,182,0),24 }, + { IPv4(199,190,198,0),23 }, + { IPv4(199,190,200,0),24 }, + { IPv4(199,190,201,0),24 }, + { IPv4(199,190,209,0),24 }, + { IPv4(199,190,222,0),23 }, + { IPv4(199,190,224,0),23 }, + { IPv4(199,190,227,0),24 }, + { IPv4(199,190,244,0),24 }, + { IPv4(199,190,245,0),24 }, + { IPv4(199,190,246,0),24 }, + { IPv4(199,190,247,0),24 }, + { IPv4(199,190,248,0),24 }, + { IPv4(199,191,0,0),20 }, + { IPv4(199,191,32,0),24 }, + { IPv4(199,191,33,0),24 }, + { IPv4(199,191,34,0),24 }, + { IPv4(199,191,35,0),24 }, + { IPv4(199,191,36,0),24 }, + { IPv4(199,191,37,0),24 }, + { IPv4(199,191,128,0),21 }, + { IPv4(199,191,128,0),22 }, + { IPv4(199,191,136,0),21 }, + { IPv4(199,191,144,0),22 }, + { IPv4(199,191,144,0),21 }, + { IPv4(199,191,152,0),21 }, + { IPv4(199,191,160,0),24 }, + { IPv4(199,191,192,0),24 }, + { IPv4(199,191,200,0),24 }, + { IPv4(199,191,208,0),24 }, + { IPv4(199,192,0,0),21 }, + { IPv4(199,192,8,0),22 }, + { IPv4(199,195,64,0),19 }, + { IPv4(199,195,112,0),23 }, + { IPv4(199,196,54,0),24 }, + { IPv4(199,197,0,0),21 }, + { IPv4(199,197,8,0),22 }, + { IPv4(199,198,129,0),24 }, + { IPv4(199,199,0,0),16 }, + { IPv4(199,199,32,0),19 }, + { IPv4(199,199,70,0),24 }, + { IPv4(199,199,118,0),23 }, + { IPv4(199,199,120,0),21 }, + { IPv4(199,199,220,0),24 }, + { IPv4(199,200,9,0),24 }, + { IPv4(199,200,128,0),24 }, + { IPv4(199,201,0,0),16 }, + { IPv4(199,201,6,0),24 }, + { IPv4(199,201,16,0),22 }, + { IPv4(199,201,18,0),24 }, + { IPv4(199,201,20,0),24 }, + { IPv4(199,201,27,0),24 }, + { IPv4(199,201,128,0),24 }, + { IPv4(199,201,129,0),24 }, + { IPv4(199,201,140,0),24 }, + { IPv4(199,201,143,0),24 }, + { IPv4(199,201,145,0),24 }, + { IPv4(199,201,147,0),24 }, + { IPv4(199,201,153,0),24 }, + { IPv4(199,201,154,0),24 }, + { IPv4(199,201,156,0),24 }, + { IPv4(199,201,157,0),24 }, + { IPv4(199,201,158,0),24 }, + { IPv4(199,201,175,0),24 }, + { IPv4(199,201,181,0),24 }, + { IPv4(199,201,192,0),24 }, + { IPv4(199,201,213,0),24 }, + { IPv4(199,201,223,0),24 }, + { IPv4(199,201,231,0),24 }, + { IPv4(199,201,232,0),22 }, + { IPv4(199,201,236,0),24 }, + { IPv4(199,201,237,0),24 }, + { IPv4(199,201,248,0),24 }, + { IPv4(199,201,248,0),23 }, + { IPv4(199,201,249,0),24 }, + { IPv4(199,202,64,0),24 }, + { IPv4(199,205,1,0),24 }, + { IPv4(199,208,0,0),20 }, + { IPv4(199,208,1,0),24 }, + { IPv4(199,208,4,0),24 }, + { IPv4(199,208,5,0),24 }, + { IPv4(199,208,6,0),24 }, + { IPv4(199,208,7,0),24 }, + { IPv4(199,208,16,0),24 }, + { IPv4(199,208,19,0),24 }, + { IPv4(199,208,20,0),24 }, + { IPv4(199,208,21,0),24 }, + { IPv4(199,208,22,0),24 }, + { IPv4(199,208,23,0),24 }, + { IPv4(199,208,25,0),24 }, + { IPv4(199,208,64,0),18 }, + { IPv4(199,208,88,0),23 }, + { IPv4(199,208,91,0),24 }, + { IPv4(199,208,92,0),24 }, + { IPv4(199,208,110,0),24 }, + { IPv4(199,208,128,0),18 }, + { IPv4(199,208,157,0),24 }, + { IPv4(199,208,158,0),24 }, + { IPv4(199,208,172,0),24 }, + { IPv4(199,208,189,0),24 }, + { IPv4(199,208,193,0),24 }, + { IPv4(199,208,194,0),23 }, + { IPv4(199,208,197,0),24 }, + { IPv4(199,208,200,0),22 }, + { IPv4(199,208,213,0),24 }, + { IPv4(199,208,224,0),19 }, + { IPv4(199,208,242,0),24 }, + { IPv4(199,208,247,0),24 }, + { IPv4(199,208,248,0),24 }, + { IPv4(199,208,249,0),24 }, + { IPv4(199,209,0,0),23 }, + { IPv4(199,209,8,0),22 }, + { IPv4(199,209,12,0),24 }, + { IPv4(199,209,16,0),22 }, + { IPv4(199,209,20,0),23 }, + { IPv4(199,209,22,0),24 }, + { IPv4(199,209,32,0),19 }, + { IPv4(199,209,33,0),24 }, + { IPv4(199,209,38,0),24 }, + { IPv4(199,209,39,0),24 }, + { IPv4(199,209,64,0),19 }, + { IPv4(199,209,96,0),24 }, + { IPv4(199,209,98,0),24 }, + { IPv4(199,209,99,0),24 }, + { IPv4(199,209,128,0),17 }, + { IPv4(199,210,0,0),16 }, + { IPv4(199,211,39,0),24 }, + { IPv4(199,211,64,0),18 }, + { IPv4(199,211,65,0),24 }, + { IPv4(199,211,81,0),24 }, + { IPv4(199,211,89,0),24 }, + { IPv4(199,211,100,0),24 }, + { IPv4(199,211,117,0),24 }, + { IPv4(199,211,118,0),23 }, + { IPv4(199,211,120,0),24 }, + { IPv4(199,211,121,0),24 }, + { IPv4(199,211,122,0),24 }, + { IPv4(199,211,128,0),17 }, + { IPv4(199,211,128,0),23 }, + { IPv4(199,211,131,0),24 }, + { IPv4(199,211,134,0),24 }, + { IPv4(199,211,150,0),24 }, + { IPv4(199,211,157,0),24 }, + { IPv4(199,211,158,0),23 }, + { IPv4(199,211,160,0),24 }, + { IPv4(199,211,162,0),24 }, + { IPv4(199,211,163,0),24 }, + { IPv4(199,211,172,0),22 }, + { IPv4(199,211,180,0),24 }, + { IPv4(199,211,181,0),24 }, + { IPv4(199,211,182,0),24 }, + { IPv4(199,211,183,0),24 }, + { IPv4(199,211,192,0),23 }, + { IPv4(199,211,197,0),24 }, + { IPv4(199,211,198,0),24 }, + { IPv4(199,211,199,0),24 }, + { IPv4(199,211,211,0),24 }, + { IPv4(199,211,214,0),24 }, + { IPv4(199,211,219,0),24 }, + { IPv4(199,211,220,0),24 }, + { IPv4(199,211,225,0),24 }, + { IPv4(199,211,226,0),24 }, + { IPv4(199,211,228,0),24 }, + { IPv4(199,211,253,0),24 }, + { IPv4(199,212,18,0),24 }, + { IPv4(199,212,45,0),24 }, + { IPv4(199,212,53,0),24 }, + { IPv4(199,212,63,0),24 }, + { IPv4(199,212,120,0),22 }, + { IPv4(199,212,129,0),24 }, + { IPv4(199,212,132,0),24 }, + { IPv4(199,212,134,0),24 }, + { IPv4(199,212,135,0),24 }, + { IPv4(199,212,144,0),24 }, + { IPv4(199,212,150,0),24 }, + { IPv4(199,212,200,0),24 }, + { IPv4(199,212,215,0),24 }, + { IPv4(199,212,232,0),24 }, + { IPv4(199,216,250,0),23 }, + { IPv4(199,217,8,0),21 }, + { IPv4(199,217,128,0),17 }, + { IPv4(199,217,157,0),24 }, + { IPv4(199,217,214,0),23 }, + { IPv4(199,217,217,0),24 }, + { IPv4(199,217,220,0),24 }, + { IPv4(199,219,5,0),24 }, + { IPv4(199,219,128,0),18 }, + { IPv4(199,219,192,0),20 }, + { IPv4(199,219,208,0),21 }, + { IPv4(199,219,216,0),24 }, + { IPv4(199,221,65,0),24 }, + { IPv4(199,221,224,0),19 }, + { IPv4(199,222,4,0),24 }, + { IPv4(199,222,33,0),24 }, + { IPv4(199,222,100,0),24 }, + { IPv4(199,222,128,0),20 }, + { IPv4(199,222,141,0),24 }, + { IPv4(199,222,160,0),20 }, + { IPv4(199,223,139,0),24 }, + { IPv4(199,223,145,0),24 }, + { IPv4(199,223,148,0),24 }, + { IPv4(199,223,149,0),24 }, + { IPv4(199,223,155,0),24 }, + { IPv4(199,223,156,0),24 }, + { IPv4(199,223,178,0),24 }, + { IPv4(199,223,180,0),24 }, + { IPv4(199,224,0,0),20 }, + { IPv4(199,224,64,0),18 }, + { IPv4(199,225,0,0),20 }, + { IPv4(199,226,4,0),22 }, + { IPv4(199,226,8,0),21 }, + { IPv4(199,226,16,0),21 }, + { IPv4(199,226,64,0),19 }, + { IPv4(199,226,84,0),22 }, + { IPv4(199,226,96,0),20 }, + { IPv4(199,226,112,0),21 }, + { IPv4(199,226,120,0),22 }, + { IPv4(199,226,124,0),22 }, + { IPv4(199,226,156,0),24 }, + { IPv4(199,227,0,0),24 }, + { IPv4(199,227,0,0),16 }, + { IPv4(199,227,52,0